001: /*
002: * Copyright 2006-2007 Pentaho Corporation. All rights reserved.
003: * This software was developed by Pentaho Corporation and is provided under the terms
004: * of the Mozilla Public License, Version 1.1, or any later version. You may not use
005: * this file except in compliance with the license. If you need a copy of the license,
006: * please go to http://www.mozilla.org/MPL/MPL-1.1.txt.
007: *
008: * Software distributed under the Mozilla Public License is distributed on an "AS IS"
009: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
010: * the license for the specific language governing your rights and limitations.
011: *
012: * Additional Contributor(s): Martin Schmid gridvision engineering GmbH
013: */
014: package org.pentaho.reportdesigner.crm.report.datasetplugin.staticfactory;
015:
016: import org.jetbrains.annotations.NonNls;
017: import org.jetbrains.annotations.NotNull;
018: import org.jetbrains.annotations.Nullable;
019: import org.pentaho.reportdesigner.crm.report.datasetplugin.properties.PropertyInfo;
020: import org.pentaho.reportdesigner.crm.report.properties.editors.CellEditorCheckBox;
021: import org.pentaho.reportdesigner.crm.report.properties.editors.CellEditorJTextFieldAreaWithEllipsis;
022: import org.pentaho.reportdesigner.crm.report.properties.editors.CellEditorJTextFieldWithEllipsisDate;
023: import org.pentaho.reportdesigner.crm.report.properties.editors.CommonCellEditor;
024: import org.pentaho.reportdesigner.crm.report.properties.editors.StringChooser;
025: import org.pentaho.reportdesigner.crm.report.properties.renderers.BooleanTableCellRenderer;
026: import org.pentaho.reportdesigner.crm.report.properties.renderers.ClassTableCellRenderer;
027: import org.pentaho.reportdesigner.crm.report.properties.renderers.DateTableCellRenderer;
028: import org.pentaho.reportdesigner.crm.report.properties.renderers.DoubleTableCellRenderer;
029: import org.pentaho.reportdesigner.crm.report.properties.renderers.IntegerTableCellRenderer;
030: import org.pentaho.reportdesigner.crm.report.properties.renderers.StringTableCellRenderer;
031: import org.pentaho.reportdesigner.lib.client.components.TextComponentHelper;
032: import org.pentaho.reportdesigner.lib.client.i18n.TranslationManager;
033: import org.pentaho.reportdesigner.lib.client.util.UndoHelper;
034:
035: import javax.swing.*;
036: import javax.swing.event.ChangeEvent;
037: import javax.swing.table.TableCellEditor;
038: import javax.swing.table.TableCellRenderer;
039: import javax.swing.table.TableModel;
040: import java.awt.*;
041: import java.awt.event.ActionEvent;
042: import java.awt.event.ActionListener;
043: import java.util.Date;
044: import java.util.logging.Level;
045: import java.util.logging.Logger;
046:
047: /**
048: * User: Martin
049: * Date: 16.02.2006
050: * Time: 16:16:11
051: */
052: public class ParametersTable extends JTable {
053: @NonNls
054: @NotNull
055: private static final Logger LOG = Logger
056: .getLogger(ParametersTable.class.getName());
057:
058: @NotNull
059: private ParametersTableModel tableModel;
060: private boolean editable;
061:
062: @NotNull
063: private BooleanTableCellRenderer booleanTableCellRenderer;
064: @NotNull
065: private ClassTableCellRenderer classTableCellRenderer;
066: @NotNull
067: private StringTableCellRenderer stringTableCellRenderer;
068: @NotNull
069: private IntegerTableCellRenderer integerTableCellRenderer;
070: @NotNull
071: private DoubleTableCellRenderer doubleTableCellRenderer;
072: @NotNull
073: private DateTableCellRenderer dateTableCellRenderer;
074:
075: @NotNull
076: private CommonCellEditor booleanCellEditor;
077: @NotNull
078: private CommonCellEditor onelineStringCellEditor;
079: @NotNull
080: private CommonCellEditor stringCellEditor;
081: @NotNull
082: private CommonCellEditor integerCellEditor;
083: @NotNull
084: private CommonCellEditor doubleCellEditor;
085: @NotNull
086: private CommonCellEditor dateCellEditor;
087: @NotNull
088: private CommonCellEditor classCellEditor;
089:
090: public ParametersTable(@NotNull
091: ParametersTableModel tableModel, boolean editable) {
092: super (tableModel);
093:
094: putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);//NON-NLS
095:
096: this .tableModel = tableModel;
097: this .editable = editable;
098:
099: booleanTableCellRenderer = new BooleanTableCellRenderer();
100: stringTableCellRenderer = new StringTableCellRenderer();
101: classTableCellRenderer = new ClassTableCellRenderer();
102: integerTableCellRenderer = new IntegerTableCellRenderer();
103: doubleTableCellRenderer = new DoubleTableCellRenderer();
104: dateTableCellRenderer = new DateTableCellRenderer();
105:
106: booleanCellEditor = new CommonCellEditor(
107: new CellEditorCheckBox());
108: onelineStringCellEditor = new CommonCellEditor(
109: new JTextField(), CommonCellEditor.TextFieldType.TEXT);
110: onelineStringCellEditor.setClickCountToStart(1);
111:
112: final CellEditorJTextFieldAreaWithEllipsis textFieldWithEllipsis = new CellEditorJTextFieldAreaWithEllipsis();
113: stringCellEditor = new CommonCellEditor(textFieldWithEllipsis);
114: textFieldWithEllipsis.getEllipsisButton().addActionListener(
115: new ActionListener() {
116: public void actionPerformed(@NotNull
117: ActionEvent e) {
118: String value = textFieldWithEllipsis.getValue();
119: String val = StringChooser
120: .showStringArrayChooser(
121: ParametersTable.this ,
122: TranslationManager
123: .getInstance()
124: .getTranslation("R",
125: "PropertyEditor.Text.Title"),
126: value);
127: if (val != null) {
128: textFieldWithEllipsis.setValue(val, true);
129: }
130: }
131: });
132:
133: JTextField integerTextField = new JTextField();
134: UndoHelper.installUndoSupport(integerTextField);
135: TextComponentHelper.installDefaultPopupMenu(integerTextField);
136: integerCellEditor = new CommonCellEditor(integerTextField,
137: CommonCellEditor.TextFieldType.INTEGER);
138: integerCellEditor.setClickCountToStart(1);
139:
140: JTextField doubleTextField = new JTextField();
141: UndoHelper.installUndoSupport(doubleTextField);
142: TextComponentHelper.installDefaultPopupMenu(doubleTextField);
143: doubleCellEditor = new CommonCellEditor(doubleTextField,
144: CommonCellEditor.TextFieldType.DOUBLE);
145: doubleCellEditor.setClickCountToStart(1);
146:
147: final CellEditorJTextFieldWithEllipsisDate textFieldWithEllipsisDate = new CellEditorJTextFieldWithEllipsisDate();
148: dateCellEditor = new CommonCellEditor(textFieldWithEllipsisDate);
149: textFieldWithEllipsisDate.getEllipsisButton()
150: .addActionListener(new ActionListener() {
151: public void actionPerformed(@NotNull
152: ActionEvent e) {
153: //MARKED perhaps add a full fletched date editor
154: textFieldWithEllipsisDate.setValue(new Date(),
155: true);
156: }
157: });
158:
159: JComboBox classComboBox = new JComboBox(new Class[] {
160: String.class, Boolean.class, Integer.class,
161: Double.class, Date.class });
162: classComboBox.setRenderer(new DefaultListCellRenderer() {
163: @NotNull
164: public Component getListCellRendererComponent(@NotNull
165: JList list, @Nullable
166: Object value, int index, boolean isSelected,
167: boolean cellHasFocus) {
168: JLabel label = (JLabel) super
169: .getListCellRendererComponent(list, value,
170: index, isSelected, cellHasFocus);
171: if (value != null) {
172: label.setText(((Class<?>) value).getSimpleName());
173: } else {
174: if (ParametersTable.LOG.isLoggable(Level.FINE))
175: ParametersTable.LOG.log(Level.FINE,
176: "PropertiesTable.getListCellRendererComponent label = "
177: + label);
178: }
179: return label;
180: }
181: });
182: classCellEditor = new CommonCellEditor(classComboBox);
183: }
184:
185: public void setModel(@NotNull
186: TableModel dataModel) {
187: tableModel = (ParametersTableModel) dataModel;
188: super .setModel(dataModel);
189: }
190:
191: @NotNull
192: public TableCellRenderer getCellRenderer(int row, int column) {
193: if (getTableHeader().getColumnModel().getColumn(column)
194: .getModelIndex() == 0) {
195: return classTableCellRenderer;
196: } else if (getTableHeader().getColumnModel().getColumn(column)
197: .getModelIndex() == 1) {
198: PropertyInfo info = tableModel.getProperty(row);
199: if (info != null) {
200: Class<?> clazz = info.getClazz();
201: if (Boolean.class.isAssignableFrom(clazz)) {
202: return booleanTableCellRenderer;
203: } else if (Boolean.TYPE.isAssignableFrom(clazz)) {
204: return booleanTableCellRenderer;
205: } else if (String.class.isAssignableFrom(clazz)) {
206: return stringTableCellRenderer;
207: } else if (Integer.class.isAssignableFrom(clazz)) {
208: return integerTableCellRenderer;
209: } else if (Integer.TYPE.isAssignableFrom(clazz)) {
210: return integerTableCellRenderer;
211: } else if (Double.class.isAssignableFrom(clazz)) {
212: return doubleTableCellRenderer;
213: } else if (Double.TYPE.isAssignableFrom(clazz)) {
214: return doubleTableCellRenderer;
215: } else if (Date.class.isAssignableFrom(clazz)) {
216: return dateTableCellRenderer;
217: }
218: }
219: }
220:
221: return super .getCellRenderer(row, column);
222: }
223:
224: public void editingStopped(@NotNull
225: ChangeEvent e) {
226: int row = editingRow;
227: super .editingStopped(e);
228: requestFocusInWindow();
229: getSelectionModel().setSelectionInterval(row, row);
230: revalidate();
231: repaint();
232: }
233:
234: public boolean getSurrendersFocusOnKeystroke() {
235: return true;
236: }
237:
238: @Nullable
239: public TableCellEditor getCellEditor(int row, int column) {
240: if (getTableHeader().getColumnModel().getColumn(column)
241: .getModelIndex() == 0) {
242: return classCellEditor;
243: } else if (getTableHeader().getColumnModel().getColumn(column)
244: .getModelIndex() == 1) {
245: PropertyInfo propertyInfo = tableModel.getProperty(row);
246: if (propertyInfo != null) {
247: Class<?> aClass = propertyInfo.getClazz();
248: if (Boolean.class.isAssignableFrom(aClass)) {
249: return booleanCellEditor;
250: } else if (Boolean.TYPE.isAssignableFrom(aClass)) {
251: return booleanCellEditor;
252: } else if (String.class.isAssignableFrom(aClass)) {
253: return stringCellEditor;
254: } else if (Integer.TYPE.isAssignableFrom(aClass)) {
255: return integerCellEditor;
256: } else if (Integer.class.isAssignableFrom(aClass)) {
257: return integerCellEditor;
258: } else if (Double.TYPE.isAssignableFrom(aClass)) {
259: return doubleCellEditor;
260: } else if (Double.class.isAssignableFrom(aClass)) {
261: return doubleCellEditor;
262: } else if (Date.class.isAssignableFrom(aClass)) {
263: return dateCellEditor;
264: }
265: }
266: }
267:
268: return null;
269: }
270:
271: public boolean isCellEditable(int row, int column) {
272: return editable && column == 1;
273: }
274: }
|