001/*
002 * Copyright (c) 2003-2010 The Regents of the University of California.
003 * All rights reserved.
004 *
005 * '$Author: welker $'
006 * '$Date: 2010-05-06 05:21:26 +0000 (Thu, 06 May 2010) $' 
007 * '$Revision: 24234 $'
008 * 
009 * Permission is hereby granted, without written agreement and without
010 * license or royalty fees, to use, copy, modify, and distribute this
011 * software and its documentation for any purpose, provided that the above
012 * copyright notice and the following two paragraphs appear in all copies
013 * of this software.
014 *
015 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
016 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
017 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
018 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
019 * SUCH DAMAGE.
020 *
021 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
022 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
023 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
024 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
025 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
026 * ENHANCEMENTS, OR MODIFICATIONS.
027 *
028 */
029
030package org.ecoinformatics.seek.querybuilder;
031
032import java.awt.BorderLayout;
033import java.awt.Color;
034import java.awt.Dimension;
035import java.util.Enumeration;
036import java.util.Hashtable;
037import java.util.Vector;
038
039import javax.swing.Action;
040import javax.swing.Box;
041import javax.swing.BoxLayout;
042import javax.swing.ButtonGroup;
043import javax.swing.JComboBox;
044import javax.swing.JComponent;
045import javax.swing.JLabel;
046import javax.swing.JList;
047import javax.swing.JPanel;
048import javax.swing.JRadioButton;
049import javax.swing.JScrollPane;
050import javax.swing.JSplitPane;
051import javax.swing.border.Border;
052import javax.swing.border.CompoundBorder;
053import javax.swing.border.EmptyBorder;
054import javax.swing.border.SoftBevelBorder;
055import javax.swing.event.ListSelectionEvent;
056import javax.swing.event.ListSelectionListener;
057import javax.swing.event.TableModelListener;
058
059import org.kepler.objectmanager.data.DataType;
060import org.kepler.objectmanager.data.db.DSSchemaIFace;
061import org.kepler.objectmanager.data.db.DSTableFieldIFace;
062import org.kepler.objectmanager.data.db.DSTableIFace;
063
064//import com.sun.jdi.connect.Connector.SelectedArgument;
065
066//import Formulate.DBSchemaFieldNode;
067
068/**
069 * This class shows a split view with a set of table schemas showing via tabs in
070 * the upper pane. And a two tab control in the lower pane. The Select pane
071 * enables the user to indicate which fields will be displayed and what the
072 * conditions will be for each of the fields.
073 * 
074 * The Where pane enables
075 * 
076 * @author Rod Spears
077 */
078public class QBSplitPaneStandard extends JPanel implements
079                ListSelectionListener, QBBuilderInterface {
080        private static final int NUM_TABLE_THRESOLD = 3;
081
082        protected JSplitPane mSplitPane = null;
083        protected DSSchemaIFace mSchema = null;
084
085        protected Hashtable mModelHash;
086        protected Hashtable mTablesViewHash;
087
088        protected DBSelectTableUIStd mTableView;
089        protected DBSelectTableModelStd mTableModel;
090        protected DBSelectTableOverviewModel mModel;
091        protected DBSelectTableOverviewTable mSubTableView;
092        protected JScrollPane mTableSchemaPane;
093        protected JRadioButton mAllRadio;
094        protected JRadioButton mAnyRadio;
095        protected JList mTableList;
096
097        protected JSplitPane mUpperSplitPane;
098        protected JPanel mUpperPanel;
099        protected JPanel mSimulatedListPanel;
100
101        protected JPanel mSimulatedListList;
102        protected Action mSimulatedListAction;
103        protected Vector mCheckboxes;
104
105        protected TableModelListener mTableModelListener = null;
106
107        /**
108         * QBSplitPaneBase Constructor
109         */
110        public QBSplitPaneStandard(DSSchemaIFace aSchema) {
111                mSchema = aSchema;
112
113                setLayout(new BorderLayout());
114
115                mSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
116                                createUpperPanel(aSchema), createLowerPanel(aSchema));
117                mSplitPane.setContinuousLayout(true);
118                // mSplitPane.setOneTouchExpandable(true);
119                mSplitPane.setDividerLocation(230);
120
121                add(mSplitPane, BorderLayout.CENTER);
122        }
123
124        /**
125         * Return Schema
126         */
127        public DSSchemaIFace getSchema() {
128                return mSchema;
129        }
130
131        /**
132         * Method to get selected table view
133         * 
134         *       */
135        public DBSelectTableUIBase getSelectedTableView() {
136                return mTableView;
137        }
138
139        /**
140         * Method to get selected table view's model
141         * 
142         *       */
143        public DBSelectTableOverviewModel getSelectedOverTableViewModel() {
144                return mModel;
145        }
146
147        /**
148         * Method to set selected table Views's model
149         */
150        public void setSelectedOverViewModel(DBSelectTableOverviewModel mModel) {
151                this.mModel = mModel;
152        }
153
154        /**
155         * Method to get model hash
156         */
157        public Hashtable getModelHashtable() {
158                return mModelHash;
159        }
160
161        /**
162         * Sets the Model Listener appropriately
163         * 
164         * @param aTblModelListener
165         */
166        public void setTableModelListener(TableModelListener aTblModelListener) {
167                mTableModelListener = aTblModelListener;
168                mTableModel.addTableModelListener(aTblModelListener);
169        }
170
171        /**
172         * Create the upper panel
173         * 
174         * @param aSchema
175         *            the schema
176         * @return the UI component
177         */
178        public JComponent createUpperPanel(DSSchemaIFace aSchema) {
179                mModelHash = new Hashtable();
180                mTablesViewHash = new Hashtable();
181
182                mTableView = new DBSelectTableUIStd(); // referenced in createLowerPanel
183                // and createUpperPanel
184
185                mUpperPanel = new JPanel(new BorderLayout());
186                Vector tables = aSchema.getTables();
187                Object[] tblArray = null;
188                String[] tableNameArray = null;
189                if (tables != null && tables.size() > 0) {
190                        tblArray = tables.toArray();
191                        tableNameArray = new String[tblArray.length];
192                        QuickSort.doSort(tblArray, 0, tblArray.length - 1);
193                        for (int i = 0; i < tblArray.length; i++) {
194                                DSTableIFace table = (DSTableIFace) tblArray[i];
195                                mModel = new DBSelectTableOverviewModel(table);
196                                tableNameArray[i] = table.getName();
197                                mModelHash.put(table.getName(), mModel);
198                                if (i == 0) {
199                                        mSubTableView = new DBSelectTableOverviewTable(mModel);
200                                        setOverTableView();
201
202                                }
203
204                        }
205                } else {
206                        tableNameArray = new String[1];
207                        tableNameArray[0] = "";
208                }
209
210                JPanel schemaSelectionPanel = new JPanel();
211                schemaSelectionPanel.setLayout(new BoxLayout(schemaSelectionPanel,
212                                BoxLayout.X_AXIS));
213                JLabel label = new JLabel(" Available Table Schemas: ");
214                JComboBox schemaSelection = new JComboBox(tableNameArray);
215                TableSchemaSelectionListener selectionListener = new TableSchemaSelectionListener(
216                                this);
217                schemaSelection.addActionListener(selectionListener);
218                schemaSelection.setBackground(Color.WHITE);
219                schemaSelectionPanel.add(label);
220                schemaSelectionPanel.add(schemaSelection);
221                schemaSelectionPanel.add(Box.createHorizontalGlue());
222                JPanel seperationPane = new JPanel();
223                seperationPane
224                                .setLayout(new BoxLayout(seperationPane, BoxLayout.Y_AXIS));
225                seperationPane.add(schemaSelectionPanel);
226                seperationPane.add(Box.createVerticalStrut(20));
227                mUpperPanel.add(seperationPane, BorderLayout.NORTH);
228
229                if (mSubTableView != null) {
230                        mTableSchemaPane = new JScrollPane(mSubTableView);
231                        mTableView.addFieldChangeListener(mSubTableView);
232                        mUpperPanel.add(mTableSchemaPane, BorderLayout.CENTER);
233                }
234
235                valueChanged(null); // enables/disables the add button
236
237                return mUpperPanel;
238        }
239
240        /**
241         * This method will set tableview and its model
242         * 
243         */
244        public void setOverTableView() {
245                if (mSubTableView != null) {
246                        mSubTableView.setModel(mModel);
247                        mModel.setTableView(mSubTableView);
248                        mSubTableView.setColumnSelectionAllowed(false);
249                        mSubTableView.setRowSelectionAllowed(false);
250                        mSubTableView.setCellSelectionEnabled(false);
251                        mSubTableView.getColumn("Field Name").setCellRenderer(
252                                        new DBSelectTableOverviewCellRenderer());
253                        // mModel.fireTableDataChanged();
254                }
255        }
256
257        /**
258         * Creates a horizontal panel
259         * 
260         * @param threeD
261         *            whether it should have a 3D border
262         * @return the panel
263         */
264        public static JPanel createHorizontalPanel(boolean aThreeD) {
265                Border loweredBorder = new CompoundBorder(new SoftBevelBorder(
266                                SoftBevelBorder.LOWERED), new EmptyBorder(5, 5, 5, 5));
267                JPanel p = new JPanel();
268                p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
269                p.setAlignmentY(TOP_ALIGNMENT);
270                p.setAlignmentX(LEFT_ALIGNMENT);
271                if (aThreeD) {
272                        p.setBorder(loweredBorder);
273                }
274                return p;
275        }
276
277        /**
278         * Creates the radio buttons
279         * 
280         * @return the container (panel)
281         */
282        protected JPanel createRadioButtons() {
283                ButtonGroup group = new ButtonGroup();
284
285                // Text Radio Buttons
286                JPanel p2 = createHorizontalPanel(true);
287
288                mAllRadio = (JRadioButton) p2.add(new JRadioButton(
289                                "Meets ALL included conditions listed below  "));
290                group.add(mAllRadio);
291                mAllRadio.setSelected(true);
292
293                mAnyRadio = (JRadioButton) p2.add(new JRadioButton(
294                                "Meets ANY included conditions list below"));
295                group.add(mAnyRadio);
296
297                return p2;
298        }
299
300        /**
301         * Create the lower panel
302         * 
303         * @param aSchema
304         *            the schema
305         * @return the component
306         */
307        public JComponent createLowerPanel(DSSchemaIFace aSchema) {
308                // Create table mode and view for the DB Tables
309                mTableModel = new DBSelectTableModelStd(aSchema, mModelHash);
310                mTableView.setColumnSelectionAllowed(false);
311                mTableView.setRowSelectionAllowed(true);
312                mTableView.setCellSelectionEnabled(true);
313
314                mTableView.setModel(mTableModel);
315                mTableView.installEditors();
316
317                JPanel noviceMainPanel = new JPanel(new BorderLayout());
318                noviceMainPanel.add(createRadioButtons(), BorderLayout.NORTH);
319
320                JScrollPane scrollpane = new JScrollPane(mTableView);
321                scrollpane.setPreferredSize(new Dimension(700, 300));
322                noviceMainPanel.add(scrollpane, BorderLayout.CENTER);
323
324                return noviceMainPanel;
325
326        }
327
328        /**
329         * impl of abstract method
330         * 
331         */
332        protected void refresh() {
333        }
334
335        /**
336         * Adds or removes a table tab from the Tabbed Pane
337         * 
338         * @param aTabName
339         *            name of tab to be changed
340         * @param isSelected
341         *            indicates whether it will be added or removed
342         */
343        /*
344         * public void adjustTab(String aTabName, boolean isSelected) { int inx =
345         * mTabbedpane.indexOfTab(aTabName); if (inx > -1) { if (!isSelected) {
346         * mTabbedpane.removeTabAt(inx); } } else if (isSelected) {
347         * mTabbedpane.add(aTabName, (Component) mTablesViewHash.get(aTabName)); } }
348         */
349
350        /**
351         * Reset the UI to nothing
352         * 
353         */
354        public void reset() {
355
356        }
357
358        /**
359   * 
360   */
361        /*
362         * class UpdateSimulatedListListAction extends AbstractAction { public void
363         * actionPerformed(ActionEvent e) { JCheckBox cb = (JCheckBox)
364         * e.getSource(); adjustTab(cb.getText(), cb.isSelected()); } }
365         */
366
367        // ---------------------------------------------------
368        // -- ListSelectionListener
369        // ---------------------------------------------------
370        public void valueChanged(ListSelectionEvent e) {
371                // mAddBtn.setEnabled(mTableList.getSelectedIndex() != -1);
372        }
373
374        // ---------------------------------------------------
375        // -- QBBuilderInterface
376        // ---------------------------------------------------
377
378        /**
379         * 
380         * @return returns the "type" of builder it is as defined by the constants
381         *         in this interface
382         */
383        public int getType() {
384                return QBBuilderInterface.STANDARD;
385        }
386
387        /**
388         * A textual name for this builder
389         * 
390         * @return string of the name
391         */
392        public String getName() {
393                return "Standard";
394        }
395
396        /**
397         * This checks to see if this type of builder can convert the internal SQL
398         * to a more complex or less complex form.
399         * 
400         * This is typically called when switching from a more complex builder to a
401         * less complex builder
402         * 
403         * @param aBldr
404         *            The "receiving" builder, in other words can this builder
405         *            convert the SQL to the new builder
406         * @return true if it can convert it, false if it can not
407         */
408        public boolean canConvertTo(QBBuilderInterface aBldr) {
409                return true;
410        }
411
412        /**
413         * Create SQL string
414         */
415        public String createSQL() {
416                Hashtable tableNames = new Hashtable();
417                StringBuffer strBuf = new StringBuffer("SELECT ");
418                DBSelectTableModelStd model = (DBSelectTableModelStd) mTableView
419                                .getModel();
420
421                int criteriaCnt = 0;
422                int displayCnt = 0;
423                for (int i = 0; i < model.getRowCount(); i++) {
424                        DBSelectTableModelItem item = (DBSelectTableModelItem) model
425                                        .getFieldForRow(i);
426                        if (item.isDisplayed()) {
427                                tableNames.put(item.getTableName(), item.getTableName());
428                                displayCnt++;
429                        }
430
431                        if (item.getCriteria().length() > 0) {
432                                tableNames.put(item.getTableName(), item.getTableName());
433                                criteriaCnt++;
434                        }
435                }
436                if (displayCnt == 0)
437                        return "";
438
439                /*
440                 * Hashtable displayedHash = new Hashtable(); displayCnt = 0; for (int i
441                 * = 0; i < model.getRowCount(); i++) { DBSelectTableModelItem item =
442                 * (DBSelectTableModelItem) model.getFieldForRow(i); if
443                 * (item.isDisplayed()) { String fullName =
444                 * DBUIUtils.getFullFieldName(item.getTableName(), item.getName()); if
445                 * (displayedHash.get(fullName) == null) { displayedHash.put(fullName,
446                 * "X"); if (displayCnt > 0) { strBuf.append(", "); } displayCnt++; if
447                 * (tableNames.size() > 1) { strBuf.append(fullName); } else {
448                 * strBuf.append(DBUIUtils.fixNameWithSpaces(item.getName())); }
449                 * tableNames.put(item.getTableName(), item.getTableName()); } } }
450                 */
451
452                Hashtable selectFields = proneDuplicateFieldAndWildCard(model);
453                // System.out.println("the select field hash is "+selectFields);
454                if (selectFields != null) {
455                        Enumeration em = selectFields.keys();
456                        while (em.hasMoreElements()) {
457                                String tableNameStr = (String) em.nextElement();
458                                // System.out.println("The table name is "+tableNameStr);
459                                Vector fieldVector = (Vector) selectFields.get(tableNameStr);
460                                // System.out.println("the fieldVector is "+fieldVector);
461                                if (fieldVector != null) {
462                                        // System.out.println("the fieldVector is not null");
463                                        displayCnt = 0;
464                                        for (int i = 0; i < fieldVector.size(); i++) {
465                                                String fieldNameStr = (String) fieldVector.elementAt(i);
466                                                // System.out.println("the field name is "+fieldNameStr);
467                                                String fullName = DBUIUtils.getFullFieldName(
468                                                                tableNameStr, fieldNameStr);
469                                                if (displayCnt > 0) {
470                                                        strBuf.append(", ");
471                                                }
472
473                                                if (tableNames.size() > 1) {
474                                                        strBuf.append(fullName);
475                                                } else {
476                                                        strBuf.append(DBUIUtils
477                                                                        .fixNameWithSpaces(fieldNameStr));
478                                                }
479                                                displayCnt++;
480                                        }
481                                }
482
483                        }
484                }
485
486                strBuf.append(" FROM ");
487
488                displayCnt = 0;
489                for (Enumeration et = tableNames.elements(); et.hasMoreElements();) {
490                        String tableName = (String) et.nextElement();
491                        if (displayCnt > 0) {
492                                strBuf.append(", ");
493                        }
494                        displayCnt++;
495                        strBuf.append(tableName);
496                }
497
498                if (criteriaCnt > 0) {
499                        criteriaCnt = 0;
500                        strBuf.append(" WHERE ");
501                        for (int i = 0; i < model.getRowCount(); i++) {
502                                DBSelectTableModelItem item = (DBSelectTableModelItem) model
503                                                .getFieldForRow(i);
504                                if (item.getCriteria().length() > 0) {
505                                        if (criteriaCnt > 0) {
506                                                strBuf
507                                                                .append(mAllRadio.isSelected() ? " AND "
508                                                                                : " OR ");
509                                        }
510                                        criteriaCnt++;
511                                        if (tableNames.size() > 1) {
512                                                strBuf.append(DBUIUtils.fixNameWithSpaces(item
513                                                                .getTableName())
514                                                                + ".");
515                                        }
516                                        String name = DBUIUtils.fixNameWithSpaces(item.getName());
517                                        String criteria = item.getDataType().equals(DataType.STR) ? "'"
518                                                        + item.getCriteria() + "'"
519                                                        : item.getCriteria();
520                                        strBuf.append(name
521                                                        + DBSelectTableUIStd.getBoolOperSymbol(item
522                                                                        .getOperator()) + criteria);
523                                }
524                        }
525                }
526                return strBuf.toString();
527        }
528
529        /*
530         * If selected Field has, the other field will be proned. It will return a
531         * Hashtable Key is table name and value is a vector containing fields
532         * names. The duplicate field will be prone too
533         */
534        private Hashtable proneDuplicateFieldAndWildCard(DBSelectTableModelStd model) {
535                // if set up this vairable to true, the
536                // sql command select *, day from tableX will be select * from tableX
537                boolean proneWildCard = false;
538                Hashtable tableFields = new Hashtable();
539                if (model != null) {
540                        // System.out.println("model is not null");
541                        for (int i = 0; i < model.getRowCount(); i++) {
542                                DBSelectTableModelItem item = (DBSelectTableModelItem) model
543                                                .getFieldForRow(i);
544
545                                if (item.isDisplayed()) {
546                                        String tableName = item.getTableName();
547                                        String fieldName = item.getName();
548                                        // System.out.println("The tableName from model "+tableName);
549                                        // System.out.println("The fieldName from model "+fieldName);
550                                        Vector fieldNameVector = (Vector) tableFields
551                                                        .get(tableName);
552                                        if (fieldNameVector == null) {
553                                                // System.out.println("generate new vector if the vector from hash is null");
554                                                fieldNameVector = new Vector();
555                                        }
556
557                                        if (proneWildCard) {
558                                                // System.out.println("in prone wild card branch");
559                                                if (fieldName != null
560                                                                && fieldName
561                                                                                .equals(DBQueryDefParserEmitter.WILDCARD)) {
562                                                        // removed all other fields
563                                                        // System.out.println("in handel wild card part");
564                                                        fieldNameVector = new Vector();
565                                                        fieldNameVector
566                                                                        .add(DBQueryDefParserEmitter.WILDCARD);
567                                                        // System.out.println("add wild card into vector");
568                                                        tableFields.put(tableName, fieldNameVector);
569                                                        // System.out.println("add table name and vector into hash");
570                                                } else if (fieldName != null) {
571                                                        // test if the vector's first value if is wild card
572                                                        // - * (wild card will always in first value)
573                                                        // if it is, we would add this field value
574                                                        String firstField = null;
575                                                        if (!fieldNameVector.isEmpty()) {
576                                                                firstField = (String) fieldNameVector
577                                                                                .elementAt(0);
578                                                                // System.out.println("get first element in vector "+firstField);
579                                                        }
580
581                                                        if (firstField == null
582                                                                        || !firstField
583                                                                                        .equals(DBQueryDefParserEmitter.WILDCARD)
584                                                                        && !fieldNameVector.contains(fieldName)) {
585                                                                // System.out.println("add file name "+fieldName
586                                                                // +" into vector");
587                                                                fieldNameVector.add(fieldName);
588                                                        }
589                                                }
590                                                tableFields.put(tableName, fieldNameVector);
591                                                // System.out.println("add table name and vector into hash");
592                                        } else {
593                                                if (!fieldNameVector.contains(fieldName)) {
594                                                        // System.out.println("add file name "+fieldName
595                                                        // +" into vector");
596                                                        fieldNameVector.add(fieldName);
597                                                }
598                                                tableFields.put(tableName, fieldNameVector);
599                                                // System.out.println("add table name and vector into hash");
600                                        }
601                                }
602                        }
603                }
604                return tableFields;
605                //
606        }
607
608        /**
609         * Build UI from the Query Definition Object
610         */
611        public int buildFromQueryDef(DBQueryDef aQueryDef) {
612                if (aQueryDef == null)
613                        return DBQueryDef.BUILD_ERROR;
614
615                StringBuffer operStr = new StringBuffer();
616                int status = mTableModel.buildFromQueryDef(aQueryDef, operStr, false);
617                if (operStr.toString().equals(DBWhereOperator.AND_OPER)) {
618                        mAllRadio.setSelected(true);
619                } else {
620                        mAnyRadio.setSelected(true);
621                }
622                mTableModel.fireTableModelChanged();
623                repaint();
624                return status;
625        }
626
627        /**
628         * Fills QueryDef from Model
629         */
630        public void fillQueryDef(DBQueryDef aQueryDef) {
631                if (aQueryDef == null)
632                        return;
633
634                aQueryDef.setIsAdv(false);
635
636                // Collect which items are being displayed and which ones have criteria
637                Hashtable tableNameHash = new Hashtable();
638                Hashtable itemsDisplayedHash = new Hashtable();
639                Vector itemsDisplayed = new Vector();
640                Vector itemsWithCriteria = new Vector();
641
642                for (int i = 0; i < mTableModel.getRowCount(); i++) {
643                        DBSelectTableModelItem item = mTableModel.getFieldForRow(i);
644                        if (item.getTableName().length() > 0 && item.getName().length() > 0) {
645                                DBSelectTableModelItem newItem = null;
646
647                                String fullName = DBUIUtils.getFullFieldName(item
648                                                .getTableName(), item.getName());
649                                if (itemsDisplayedHash.get(fullName) == null) {
650                                        if (item.isDisplayed()) {
651                                                newItem = new DBSelectTableModelItem(item);
652                                                itemsDisplayedHash.put(fullName, fullName);
653                                                tableNameHash.put(item.getTableName(), item
654                                                                .getTableName());
655                                                itemsDisplayed.add(newItem);
656                                        }
657                                }
658
659                                if (item.getCriteria().length() > 0) {
660                                        tableNameHash.put(item.getTableName(), item.getTableName());
661                                        itemsWithCriteria
662                                                        .add(newItem == null ? new DBSelectTableModelItem(
663                                                                        item) : newItem);
664                                }
665                        }
666                }
667
668                // Add each item in the display vector to the QueryDef selects
669                for (Enumeration et = itemsDisplayed.elements(); et.hasMoreElements();) {
670                        aQueryDef.addSelectItem((DBSelectTableModelItem) et.nextElement());
671                }
672
673                // Now create the where object from the items with criteria
674                boolean isSingle = itemsWithCriteria.size() == 1;
675
676                if (itemsWithCriteria.size() > 0) {
677                        if (mAllRadio.isSelected()) {
678                                Vector joins = new Vector();
679
680                                // loop thru all the items and see if any are joins
681                                for (Enumeration et = itemsWithCriteria.elements(); et
682                                                .hasMoreElements();) {
683                                        DBSelectTableModelItem item = (DBSelectTableModelItem) et
684                                                        .nextElement();
685                                        String oper = item.getOperator();
686                                        if (oper != null
687                                                        && oper
688                                                                        .equals(DBSelectTableUIStd.OPERS_TXT[DBSelectTableUIStd.EQUALS_INX])) {
689                                                String criteria = item.getCriteria();
690                                                StringBuffer tableName = new StringBuffer();
691                                                DSTableFieldIFace rightFld = DBUIUtils
692                                                                .isTableFieldName(mSchema, criteria, tableName);
693                                                DSTableFieldIFace leftFld = DBUIUtils.getFieldByName(
694                                                                mSchema, item.getTableName(), item.getName()); // not
695                                                                                                                                                                // really
696                                                                                                                                                                // needed
697                                                if (rightFld != null) {
698                                                        DBSelectTableModelItem leftItem = new DBSelectTableModelItem(
699                                                                        item.getTableName(), item.getName(),
700                                                                        leftFld.getDataType(), false, "", "", item
701                                                                                        .getMissingValueCode());
702                                                        DBSelectTableModelItem rightItem = new DBSelectTableModelItem(
703                                                                        tableName.toString(), rightFld.getName(),
704                                                                        rightFld.getDataType(), false, "", "",
705                                                                        rightFld.getMissingValueCode());
706                                                        joins.add(leftItem);
707                                                        joins.add(rightItem);
708                                                        item.setName(null);
709                                                        tableNameHash.put(tableName.toString(), tableName
710                                                                        .toString());
711                                                }
712                                        }
713                                }
714
715                                if (joins.size() > 0) {
716                                        aQueryDef.setJoins(joins);
717                                }
718                        }
719
720                        // Add each table name that used
721                        for (Enumeration et = tableNameHash.elements(); et
722                                        .hasMoreElements();) {
723                                aQueryDef.addTable((String) et.nextElement());
724                        }
725
726                        DBWhereOperator oper = null;
727                        if (!isSingle) {
728                                oper = new DBWhereOperator(null, false);
729                                oper
730                                                .setOperator(mAllRadio.isSelected() ? DBWhereOperator.AND_OPER
731                                                                : DBWhereOperator.OR_OPER);
732                        }
733
734                        boolean itemWasAdded = false;
735                        DBWhereCondition cond = null;
736                        DBWhereIFace after = null;
737                        for (Enumeration et = itemsWithCriteria.elements(); et
738                                        .hasMoreElements();) {
739                                DBSelectTableModelItem item = (DBSelectTableModelItem) et
740                                                .nextElement();
741                                // skip any item with a null name because it was already used
742                                if (item.getName() != null) {
743                                        cond = new DBWhereCondition(oper, item.getTableName(), item
744                                                        .getName(), item.getDataType());
745                                        cond.setOperator(item.getOperator());
746                                        cond.setCriteria(item.getCriteria());
747                                        if (oper != null) {
748                                                oper.addAfter(cond, after);
749                                                itemWasAdded = true;
750                                        }
751                                        after = cond;
752                                }
753                        }
754
755                        if (isSingle) {
756                                if (cond != null) {
757                                        aQueryDef.setWhere((DBWhereIFace) cond);
758                                }
759                        } else if (oper != null && itemWasAdded) {
760                                aQueryDef.setWhere((DBWhereIFace) oper);
761                        }
762                }
763        }
764
765}