001: /*
002: * SQLeonardo :: java database frontend
003: * Copyright (C) 2004 nickyb@users.sourceforge.net
004: *
005: * This program is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU General Public License
007: * as published by the Free Software Foundation; either version 2
008: * of the License, or (at your option) any later version.
009: *
010: * This program is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU General Public License for more details.
014: *
015: * You should have received a copy of the GNU General Public License
016: * along with this program; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
018: *
019: */
020:
021: package nickyb.sqleonardo.environment.ctrl.content;
022:
023: import java.awt.Component;
024: import java.awt.Dimension;
025: import java.awt.event.ItemEvent;
026: import java.awt.event.ItemListener;
027: import java.util.Vector;
028:
029: import javax.swing.AbstractCellEditor;
030: import javax.swing.DefaultComboBoxModel;
031: import javax.swing.JCheckBox;
032: import javax.swing.JComboBox;
033: import javax.swing.JScrollPane;
034: import javax.swing.JTable;
035: import javax.swing.UIManager;
036: import javax.swing.border.Border;
037: import javax.swing.border.EmptyBorder;
038: import javax.swing.table.DefaultTableModel;
039: import javax.swing.table.TableCellEditor;
040: import javax.swing.table.TableCellRenderer;
041: import javax.swing.table.TableColumn;
042:
043: import nickyb.sqleonardo.common.gui.AbstractDialogConfirm;
044: import nickyb.sqleonardo.common.gui.BorderLayoutPanel;
045: import nickyb.sqleonardo.environment.Application;
046: import nickyb.sqleonardo.environment.ctrl.ContentPane;
047: import nickyb.sqleonardo.querybuilder.syntax.QueryTokens;
048:
049: public class DialogUpdateCriteria extends AbstractDialogConfirm
050: implements ItemListener {
051: private ContentPane content;
052: private JComboBox tables;
053: private JTable columns;
054:
055: public DialogUpdateCriteria(ContentPane content) {
056: super (Application.window, "define update criteria", 350, 275);
057: this .content = content;
058:
059: DefaultTableModel model = new DefaultTableModel(0, 2) {
060: public boolean isCellEditable(int row, int column) {
061: return column == 0;
062: }
063: };
064:
065: JScrollPane scroll = new JScrollPane(
066: columns = new JTable(model));
067: scroll.getViewport().setBackground(
068: UIManager.getDefaults().getColor("Table.background"));
069:
070: BorderLayoutPanel mask = new BorderLayoutPanel();
071: mask.setComponentNorth(tables = new JComboBox());
072: mask.setComponentCenter(scroll);
073:
074: TableColumn tableColumn = columns.getColumn(columns
075: .getColumnName(0));
076: tableColumn.setCellEditor(new CheckBoxCellRenderer());
077: tableColumn.setCellRenderer(new CheckBoxCellRenderer());
078: tableColumn.setPreferredWidth(15);
079: tableColumn.setMaxWidth(15);
080: tableColumn.setResizable(false);
081:
082: columns.setIntercellSpacing(new Dimension(0, 0));
083: columns.setShowGrid(false);
084: columns.setColumnSelectionAllowed(false);
085: columns.setDefaultRenderer(Boolean.class,
086: new CheckBoxCellRenderer());
087: columns.getTableHeader().setPreferredSize(new Dimension(0, 0));
088: columns.getTableHeader().setVisible(false);
089:
090: getContentPane().add(mask);
091: }
092:
093: protected boolean onConfirm() {
094: if (tables.getSelectedItem() == null)
095: return false;
096:
097: UpdateModel um = new UpdateModel();
098:
099: QueryTokens._TableReference[] r = content.getQueryModel()
100: .getQueryExpression().getQuerySpecification()
101: .getFromClause();
102: for (int i = 0; i < r.length; i++) {
103: if (r[i] instanceof QueryTokens.Table) {
104: if (((QueryTokens.Table) r[i]).getReference()
105: .equalsIgnoreCase(
106: tables.getSelectedItem().toString())) {
107: um.setTable((QueryTokens.Table) r[i]);
108: break;
109: }
110: } else {
111: if (((QueryTokens.Join) r[i]).getPrimary().getTable()
112: .getReference().equalsIgnoreCase(
113: tables.getSelectedItem().toString())) {
114: um.setTable(((QueryTokens.Join) r[i]).getPrimary()
115: .getTable());
116: break;
117: }
118:
119: if (((QueryTokens.Join) r[i]).getForeign().getTable()
120: .getReference().equalsIgnoreCase(
121: tables.getSelectedItem().toString())) {
122: um.setTable(((QueryTokens.Join) r[i]).getForeign()
123: .getTable());
124: break;
125: }
126: }
127: }
128:
129: Vector rowid = new Vector();
130: for (int i = 0; i < columns.getRowCount(); i++) {
131: if (((Boolean) columns.getValueAt(i, 0)).booleanValue()) {
132: QueryTokens._Expression[] e = content.getQueryModel()
133: .getQueryExpression().getQuerySpecification()
134: .getSelectList();
135: for (int j = 0; j < e.length; j++) {
136: if (e[j] instanceof QueryTokens.Column) {
137: QueryTokens.Column c = (QueryTokens.Column) e[j];
138: if (c.getReference().equalsIgnoreCase(
139: columns.getValueAt(i, 1).toString()))
140: rowid.addElement(c);
141: }
142: }
143: }
144: }
145:
146: if (rowid.size() == 0)
147: return false;
148:
149: QueryTokens.Column[] c = new QueryTokens.Column[rowid.size()];
150: um.setRowIdentifier((QueryTokens.Column[]) rowid.toArray(c));
151:
152: content.setUpdateModel(um);
153: return true;
154: }
155:
156: protected void onOpen() {
157: QueryTokens._TableReference[] r = content.getQueryModel()
158: .getQueryExpression().getQuerySpecification()
159: .getFromClause();
160: for (int i = 0; i < r.length; i++) {
161: if (r[i] instanceof QueryTokens.Table) {
162: ((DefaultComboBoxModel) tables.getModel())
163: .addElement(((QueryTokens.Table) r[i])
164: .getReference());
165: } else {
166: ((DefaultComboBoxModel) tables.getModel())
167: .addElement(((QueryTokens.Join) r[i])
168: .getPrimary().getTable().getReference());
169: ((DefaultComboBoxModel) tables.getModel())
170: .addElement(((QueryTokens.Join) r[i])
171: .getForeign().getTable().getReference());
172: }
173: }
174:
175: tables.setSelectedItem(null);
176: tables.addItemListener(this );
177:
178: if (!content.isReadOnly()
179: && content.getUpdateModel().getTable() != null) {
180: String reference = content.getUpdateModel().getTable()
181: .getReference();
182: tables.setSelectedItem(reference);
183:
184: for (int i = 0; i < content.getUpdateModel()
185: .getRowIdentifierCount(); i++) {
186: QueryTokens.Column c = content.getUpdateModel()
187: .getRowIdentifier(i);
188: for (int j = 0; j < columns.getRowCount(); j++) {
189: if (columns.getValueAt(j, 1).toString()
190: .equalsIgnoreCase(c.getReference())) {
191: columns.setValueAt(new Boolean(true), j, 0);
192: }
193: }
194: }
195: }
196: }
197:
198: public void itemStateChanged(ItemEvent ie) {
199: if (ie.getSource() instanceof JComboBox) {
200: ((DefaultTableModel) columns.getModel()).setRowCount(0);
201:
202: String reference = tables.getSelectedItem().toString();
203: QueryTokens._Expression[] e = content.getQueryModel()
204: .getQueryExpression().getQuerySpecification()
205: .getSelectList();
206: for (int i = 0; i < e.length; i++) {
207: if (e[i] instanceof QueryTokens.Column) {
208: QueryTokens.Column c = (QueryTokens.Column) e[i];
209: if (c.getTable().getReference().equalsIgnoreCase(
210: reference))
211: ((DefaultTableModel) columns.getModel())
212: .addRow(new Object[] {
213: new Boolean(false),
214: c.getReference() });
215: }
216: }
217: }
218: }
219:
220: private class CheckBoxCellRenderer extends AbstractCellEditor
221: implements TableCellRenderer, TableCellEditor, ItemListener {
222: protected Border noFocusBorder;
223: private JCheckBox checkBox;
224:
225: public CheckBoxCellRenderer() {
226: super ();
227:
228: if (noFocusBorder == null) {
229: noFocusBorder = new EmptyBorder(1, 1, 1, 1);
230: }
231:
232: checkBox = new JCheckBox();
233: checkBox.addItemListener(this );
234: checkBox.setOpaque(true);
235: checkBox.setBorder(noFocusBorder);
236: }
237:
238: public void itemStateChanged(ItemEvent ie) {
239: fireEditingStopped();
240: }
241:
242: private Component getCell(JTable table, Object value,
243: boolean isSelected, boolean hasFocus) {
244: checkBox.setSelected(((Boolean) value).booleanValue());
245: checkBox.setFont(table.getFont());
246:
247: if (isSelected) {
248: checkBox.setBackground(table.getSelectionBackground());
249: checkBox.setForeground(table.getSelectionForeground());
250: } else {
251: checkBox.setBackground(table.getBackground());
252: checkBox.setForeground(table.getForeground());
253: }
254:
255: checkBox.setBorder((hasFocus) ? UIManager
256: .getBorder("Table.focusCellHighlightBorder")
257: : noFocusBorder);
258:
259: return checkBox;
260: }
261:
262: public Component getTableCellEditorComponent(JTable table,
263: Object value, boolean isSelected, int row, int column) {
264: return getCell(table, value, isSelected, true);
265: }
266:
267: public Component getTableCellRendererComponent(JTable table,
268: Object value, boolean isSelected, boolean hasFocus,
269: int row, int column) {
270: return getCell(table, value, isSelected, true);
271: }
272:
273: public Object getCellEditorValue() {
274: return new Boolean(checkBox.isSelected());
275: }
276: }
277: }
|