0001: /*
0002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
0003: *
0004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
0005: *
0006: * The contents of this file are subject to the terms of either the GNU
0007: * General Public License Version 2 only ("GPL") or the Common
0008: * Development and Distribution License("CDDL") (collectively, the
0009: * "License"). You may not use this file except in compliance with the
0010: * License. You can obtain a copy of the License at
0011: * http://www.netbeans.org/cddl-gplv2.html
0012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
0013: * specific language governing permissions and limitations under the
0014: * License. When distributing the software, include this License Header
0015: * Notice in each file and include the License file at
0016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
0017: * particular file as subject to the "Classpath" exception as provided
0018: * by Sun in the GPL Version 2 section of the License file that
0019: * accompanied this code. If applicable, add the following below the
0020: * License Header, with the fields enclosed by brackets [] replaced by
0021: * your own identifying information:
0022: * "Portions Copyrighted [year] [name of copyright owner]"
0023: *
0024: * Contributor(s):
0025: *
0026: * The Original Software is NetBeans. The Initial Developer of the Original
0027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
0028: * Microsystems, Inc. All Rights Reserved.
0029: *
0030: * If you wish your version of this file to be governed by only the CDDL
0031: * or only the GPL Version 2, indicate your decision by adding
0032: * "[Contributor] elects to include this software in this distribution
0033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
0034: * single choice of license, a recipient has the option to distribute
0035: * your version of this file under either the CDDL, the GPL Version 2 or
0036: * to extend the choice of license to its licensees as provided above.
0037: * However, if you add GPL Version 2 code and therefore, elected the GPL
0038: * Version 2 license, then the option applies only if the new code is
0039: * made subject to such option by the copyright holder.
0040: */
0041:
0042: package org.netbeans.modules.form.editors2;
0043:
0044: import java.awt.CardLayout;
0045: import java.awt.Component;
0046: import java.beans.PropertyEditorSupport;
0047: import java.io.IOException;
0048: import java.text.MessageFormat;
0049: import java.util.*;
0050: import javax.swing.*;
0051: import org.netbeans.modules.form.*;
0052: import org.openide.explorer.propertysheet.editors.XMLPropertyEditor;
0053: import org.openide.util.NbBundle;
0054: import org.w3c.dom.Document;
0055: import org.w3c.dom.Node;
0056:
0057: /**
0058: * Property editor for <code>SpinnerModel</code>.
0059: *
0060: * @author Jan Stola
0061: */
0062: public class SpinnerModelEditor extends PropertyEditorSupport implements
0063: XMLPropertyEditor, NamedPropertyEditor, FormAwareEditor {
0064:
0065: /** Determines whether the components of custom editor have been created. */
0066: private boolean initialized;
0067: /** Determines whether custom property editor should fire value changes. */
0068: private boolean fireChanges;
0069: /** Property being edited. */
0070: private FormProperty property;
0071:
0072: /**
0073: * Determines whether this property editor supports custom editing.
0074: *
0075: * @return <code>true</code>.
0076: */
0077: @Override
0078: public boolean supportsCustomEditor() {
0079: return true;
0080: }
0081:
0082: /**
0083: * Returns custom editor.
0084: *
0085: * @return custom editor.
0086: */
0087: @Override
0088: public Component getCustomEditor() {
0089: fireChanges = false;
0090: if (!initialized) {
0091: initGUI();
0092: }
0093: Object value = getValue();
0094: if (value instanceof FormSpinnerModel) {
0095: updateUI((FormSpinnerModel) value);
0096: } else {
0097: // default
0098: modelTypeCombo.setSelectedIndex(0);
0099: }
0100: fireChanges = true;
0101: return customizerPanel;
0102: }
0103:
0104: /**
0105: * Initializes components of custom editor.
0106: */
0107: private void initGUI() {
0108: fireChanges = false;
0109: initComponents();
0110: initModelTypeCombo();
0111: initCalendarFieldCombo();
0112: initNumberTypeCombo();
0113: initListItems();
0114: initialDateSpinner.setModel(new SpinnerDateModel());
0115: initialDateSpinner.setValue(new Date());
0116: minimumDateSpinner.setModel(new SpinnerDateModel());
0117: maximumDateSpinner.setModel(new SpinnerDateModel());
0118: stepSizeSpinner.setValue(Integer.valueOf(1));
0119: initialListLabel.setVisible(false);
0120: initialListCombo.setVisible(false);
0121: fireChanges = true;
0122: initialized = true;
0123: }
0124:
0125: /**
0126: * Initializes list items text area.
0127: */
0128: private void initListItems() {
0129: String format = NbBundle.getMessage(getClass(),
0130: "SpinnerModelEditor_Item"); // NOI18N
0131: String[] items = new String[4];
0132: for (int i = 0; i < items.length; i++) {
0133: items[i] = MessageFormat.format(format, i);
0134: }
0135: StringBuilder sb = new StringBuilder();
0136: DefaultComboBoxModel comboModel = new DefaultComboBoxModel();
0137: for (Object item : items) {
0138: sb.append(item).append('\n');
0139: comboModel.addElement(item);
0140: }
0141: listItemsArea.setText(sb.toString());
0142: initialListCombo.setModel(comboModel);
0143: initialListCombo.setSelectedIndex(0);
0144: }
0145:
0146: /**
0147: * Initializes model type combo box.
0148: */
0149: private void initModelTypeCombo() {
0150: DefaultComboBoxModel model = new DefaultComboBoxModel();
0151: ResourceBundle bundle = NbBundle.getBundle(getClass());
0152: model
0153: .addElement(bundle
0154: .getString("SpinnerModelEditor_Default")); // NOI18N
0155: model.addElement(bundle.getString("SpinnerModelEditor_Date")); // NOI18N
0156: model.addElement(bundle.getString("SpinnerModelEditor_List")); // NOI18N
0157: model.addElement(bundle.getString("SpinnerModelEditor_Number")); // NOI18N
0158: modelTypeCombo.setModel(model);
0159: }
0160:
0161: /**
0162: * Initializes calendar field combo box.
0163: */
0164: private void initCalendarFieldCombo() {
0165: DefaultComboBoxModel model = new DefaultComboBoxModel();
0166: ResourceBundle bundle = NbBundle.getBundle(getClass());
0167: model.addElement(bundle.getString("SpinnerModelEditor_Era")); // NOI18N
0168: model.addElement(bundle.getString("SpinnerModelEditor_Year")); // NOI18N
0169: model.addElement(bundle.getString("SpinnerModelEditor_Month")); // NOI18N
0170: model.addElement(bundle
0171: .getString("SpinnerModelEditor_WeekOfYear")); // NOI18N
0172: model.addElement(bundle
0173: .getString("SpinnerModelEditor_WeekOfMonth")); // NOI18N
0174: model.addElement(bundle
0175: .getString("SpinnerModelEditor_DayOfMonth")); // NOI18N
0176: model.addElement(bundle
0177: .getString("SpinnerModelEditor_DayOfYear")); // NOI18N
0178: model.addElement(bundle
0179: .getString("SpinnerModelEditor_DayOfWeek")); // NOI18N
0180: model.addElement(bundle
0181: .getString("SpinnerModelEditor_DayOfWeekInMonth")); // NOI18N
0182: model.addElement(bundle.getString("SpinnerModelEditor_AMPM")); // NOI18N
0183: model.addElement(bundle.getString("SpinnerModelEditor_Hour")); // NOI18N
0184: model.addElement(bundle
0185: .getString("SpinnerModelEditor_HourOfDay")); // NOI18N
0186: model.addElement(bundle.getString("SpinnerModelEditor_Minute")); // NOI18N
0187: model.addElement(bundle.getString("SpinnerModelEditor_Second")); // NOI18N
0188: model.addElement(bundle
0189: .getString("SpinnerModelEditor_Millisecond")); // NOI18N
0190: calendarFieldCombo.setModel(model);
0191: calendarFieldCombo.setSelectedIndex(5); // DAY_OF_MONTH
0192: }
0193:
0194: /**
0195: * Initializes number type combo box.
0196: */
0197: private void initNumberTypeCombo() {
0198: DefaultComboBoxModel model = new DefaultComboBoxModel();
0199: ResourceBundle bundle = NbBundle.getBundle(getClass());
0200: model.addElement(bundle.getString("SpinnerModelEditor_Byte")); // NOI18N
0201: model.addElement(bundle.getString("SpinnerModelEditor_Double")); // NOI18N
0202: model.addElement(bundle.getString("SpinnerModelEditor_Float")); // NOI18N
0203: model
0204: .addElement(bundle
0205: .getString("SpinnerModelEditor_Integer")); // NOI18N
0206: model.addElement(bundle.getString("SpinnerModelEditor_Long")); // NOI18N
0207: model.addElement(bundle.getString("SpinnerModelEditor_Short")); // NOI18N
0208: numberTypeCombo.setModel(model);
0209: numberTypeCombo.setSelectedIndex(3); // Integer
0210: }
0211:
0212: /**
0213: * Updates UI of custom editor according to given <code>model</code>.
0214: *
0215: * @param model form wrapper of spinner model.
0216: */
0217: private void updateUI(FormSpinnerModel model) {
0218: SpinnerModel spinnerModel = model.getModel();
0219: if (spinnerModel instanceof SpinnerDateModel) {
0220: modelTypeCombo.setSelectedIndex(1);
0221: updateDateUI(model);
0222: } else if (spinnerModel instanceof SpinnerListModel) {
0223: modelTypeCombo.setSelectedIndex(2);
0224: updateListUI(model);
0225: } else if (spinnerModel instanceof SpinnerNumberModel) {
0226: modelTypeCombo.setSelectedIndex(3);
0227: updateNumberUI(model);
0228: } else {
0229: assert false;
0230: }
0231: updateVisibilityOfModelProperties();
0232: }
0233:
0234: /**
0235: * Updates date section of UI of custom editor according to given <code>model</code>.
0236: *
0237: * @param model form wrapper of spinner model.
0238: */
0239: private void updateDateUI(FormSpinnerModel model) {
0240: Date now = new Date();
0241: SpinnerDateModel dateModel = (SpinnerDateModel) model
0242: .getModel();
0243: initialNowCheckBox.setSelected(model.isInitialNow());
0244: initialDateSpinner.setValue(model.isInitialNow() ? now : model
0245: .getInitialValue());
0246: initialDateSpinner.setEnabled(!model.isInitialNow());
0247: // minimum
0248: Comparable minimum = dateModel.getStart();
0249: minimumDateCheckBox.setSelected(minimum != null);
0250: minimumNowCheckBox.setEnabled(minimum != null);
0251: minimumNowCheckBox.setSelected(model.isMinimumNow());
0252: minimumDateSpinner.setEnabled(minimum != null
0253: && !model.isMinimumNow());
0254: minimum = model.isMinimumNow() ? now : minimum;
0255: minimumDateSpinner.setValue(minimum == null ? now : minimum);
0256: // maximum
0257: Comparable maximum = dateModel.getEnd();
0258: maximumDateCheckBox.setSelected(maximum != null);
0259: maximumNowCheckBox.setEnabled(maximum != null);
0260: maximumNowCheckBox.setSelected(model.isMaximumNow());
0261: maximumDateSpinner.setEnabled(maximum != null
0262: && !model.isMaximumNow());
0263: maximum = model.isMaximumNow() ? now : maximum;
0264: maximumDateSpinner.setValue(maximum == null ? now : maximum);
0265: // calendar field
0266: int index = 0;
0267: switch (dateModel.getCalendarField()) {
0268: case Calendar.ERA:
0269: index = 0;
0270: break;
0271: case Calendar.YEAR:
0272: index = 1;
0273: break;
0274: case Calendar.MONTH:
0275: index = 2;
0276: break;
0277: case Calendar.WEEK_OF_YEAR:
0278: index = 3;
0279: break;
0280: case Calendar.WEEK_OF_MONTH:
0281: index = 4;
0282: break;
0283: case Calendar.DAY_OF_MONTH:
0284: index = 5;
0285: break;
0286: case Calendar.DAY_OF_YEAR:
0287: index = 6;
0288: break;
0289: case Calendar.DAY_OF_WEEK:
0290: index = 7;
0291: break;
0292: case Calendar.DAY_OF_WEEK_IN_MONTH:
0293: index = 8;
0294: break;
0295: case Calendar.AM_PM:
0296: index = 9;
0297: break;
0298: case Calendar.HOUR:
0299: index = 10;
0300: break;
0301: case Calendar.HOUR_OF_DAY:
0302: index = 11;
0303: break;
0304: case Calendar.MINUTE:
0305: index = 12;
0306: break;
0307: case Calendar.SECOND:
0308: index = 13;
0309: break;
0310: case Calendar.MILLISECOND:
0311: index = 14;
0312: break;
0313: }
0314: calendarFieldCombo.setSelectedIndex(index);
0315: }
0316:
0317: /**
0318: * Updates list section of UI of custom editor according to given <code>model</code>.
0319: *
0320: * @param model form wrapper of spinner model.
0321: */
0322: private void updateListUI(FormSpinnerModel model) {
0323: SpinnerListModel listModel = (SpinnerListModel) model
0324: .getModel();
0325: List items = listModel.getList();
0326: StringBuilder sb = new StringBuilder();
0327: DefaultComboBoxModel comboModel = new DefaultComboBoxModel();
0328: for (Object item : items) {
0329: sb.append(item).append('\n');
0330: comboModel.addElement(item);
0331: }
0332: listItemsArea.setText(sb.toString());
0333: initialListCombo.setModel(comboModel);
0334: initialListCombo.setSelectedItem(model.getInitialValue());
0335: }
0336:
0337: /**
0338: * Updates number section of UI of custom editor according to given <code>model</code>.
0339: *
0340: * @param model form wrapper of spinner model.
0341: */
0342: private void updateNumberUI(FormSpinnerModel model) {
0343: SpinnerNumberModel numberModel = (SpinnerNumberModel) model
0344: .getModel();
0345: Class clazz = model.getInitialValue().getClass();
0346: int typeIndex = 0;
0347: if (clazz == Byte.class) {
0348: typeIndex = 0;
0349: } else if (clazz == Double.class) {
0350: typeIndex = 1;
0351: } else if (clazz == Float.class) {
0352: typeIndex = 2;
0353: } else if (clazz == Integer.class) {
0354: typeIndex = 3;
0355: } else if (clazz == Long.class) {
0356: typeIndex = 4;
0357: } else if (clazz == Short.class) {
0358: typeIndex = 5;
0359: } else {
0360: assert false;
0361: }
0362: numberTypeCombo.setSelectedIndex(typeIndex);
0363: minimumNumberSpinner.setValue(Integer.valueOf(0));
0364: maximumNumberSpinner.setValue(Integer.valueOf(0));
0365: updateNumberEditors();
0366: initialNumberSpinner.setValue(model.getInitialValue());
0367: Comparable minimum = numberModel.getMinimum();
0368: minimumNumberCheckBox.setSelected(minimum != null);
0369: minimumNumberSpinner.setEnabled(minimum != null);
0370: if (minimum != null) {
0371: minimumNumberSpinner.setValue(minimum);
0372: }
0373: Comparable maximum = numberModel.getMaximum();
0374: maximumNumberCheckBox.setSelected(maximum != null);
0375: maximumNumberSpinner.setEnabled(maximum != null);
0376: if (maximum != null) {
0377: maximumNumberSpinner.setValue(maximum);
0378: }
0379: stepSizeSpinner.setValue(numberModel.getStepSize());
0380: }
0381:
0382: /**
0383: * Updates value of the property editor according to UI.
0384: */
0385: private void updateFromUI() {
0386: if (!fireChanges)
0387: return;
0388: Object value = valueFromUI();
0389: if (value == null) {
0390: value = property.getDefaultValue();
0391: }
0392: setValue(value);
0393: }
0394:
0395: /**
0396: * Returns spinner model represented by custom editor.
0397: *
0398: * @return spinner model represented by custom editor.
0399: */
0400: private FormSpinnerModel valueFromUI() {
0401: FormSpinnerModel value = null;
0402: int modelType = modelTypeCombo.getSelectedIndex();
0403: if (modelType == 0) {
0404: // default
0405: value = null;
0406: } else if (modelType == 1) {
0407: // date
0408: value = dateFromUI();
0409: } else if (modelType == 2) {
0410: // list
0411: value = listFromUI();
0412: } else if (modelType == 3) {
0413: // number
0414: value = numberFromUI();
0415: } else {
0416: assert false;
0417: }
0418: return value;
0419: }
0420:
0421: /**
0422: * Returns date spinner model represented by custom editor.
0423: *
0424: * @return date spinner model represented by custom editor.
0425: */
0426: private FormSpinnerModel dateFromUI() {
0427: Date now = new Date();
0428: boolean minimumNow = false;
0429: Date minimum = null;
0430: if (minimumDateCheckBox.isSelected()) {
0431: if (minimumNowCheckBox.isSelected()) {
0432: minimumNow = true;
0433: minimum = now;
0434: } else {
0435: minimum = (Date) minimumDateSpinner.getValue();
0436: }
0437: }
0438: boolean initialNow = false;
0439: Date initial;
0440: if (initialNowCheckBox.isSelected()) {
0441: initialNow = true;
0442: initial = now;
0443: } else {
0444: initial = (Date) initialDateSpinner.getValue();
0445: if (minimumNow
0446: && (initial.getTime() - minimum.getTime() < 0)) {
0447: initial = minimum;
0448: }
0449: }
0450: boolean maximumNow = false;
0451: Date maximum = null;
0452: if (maximumDateCheckBox.isSelected()) {
0453: if (maximumNowCheckBox.isSelected()) {
0454: maximumNow = true;
0455: maximum = now;
0456: } else {
0457: maximum = (Date) maximumDateSpinner.getValue();
0458: if (initialNow
0459: && (maximum.getTime() - initial.getTime() < 0)) {
0460: maximum = initial;
0461: }
0462: if (minimumNow
0463: && (maximum.getTime() - minimum.getTime() < 0)) {
0464: maximum = minimum;
0465: }
0466: }
0467: }
0468: int field = 0;
0469: switch (calendarFieldCombo.getSelectedIndex()) {
0470: case 0:
0471: field = Calendar.ERA;
0472: break;
0473: case 1:
0474: field = Calendar.YEAR;
0475: break;
0476: case 2:
0477: field = Calendar.MONTH;
0478: break;
0479: case 3:
0480: field = Calendar.WEEK_OF_YEAR;
0481: break;
0482: case 4:
0483: field = Calendar.WEEK_OF_MONTH;
0484: break;
0485: case 5:
0486: field = Calendar.DAY_OF_MONTH;
0487: break;
0488: case 6:
0489: field = Calendar.DAY_OF_YEAR;
0490: break;
0491: case 7:
0492: field = Calendar.DAY_OF_WEEK;
0493: break;
0494: case 8:
0495: field = Calendar.DAY_OF_WEEK_IN_MONTH;
0496: break;
0497: case 9:
0498: field = Calendar.AM_PM;
0499: break;
0500: case 10:
0501: field = Calendar.HOUR;
0502: break;
0503: case 11:
0504: field = Calendar.HOUR_OF_DAY;
0505: break;
0506: case 12:
0507: field = Calendar.MINUTE;
0508: break;
0509: case 13:
0510: field = Calendar.SECOND;
0511: break;
0512: case 14:
0513: field = Calendar.MILLISECOND;
0514: break;
0515: default:
0516: assert false;
0517: }
0518: SpinnerDateModel model = new SpinnerDateModel(initial, minimum,
0519: maximum, field);
0520: return new FormSpinnerModel(model, initial, initialNow,
0521: minimumNow, maximumNow);
0522: }
0523:
0524: /**
0525: * Returns list spinner model represented by custom editor.
0526: *
0527: * @return list spinner model represented by custom editor.
0528: */
0529: private FormSpinnerModel listFromUI() {
0530: String initial = (String) initialListCombo.getSelectedItem();
0531: List<String> listItems = listItemsFromUI();
0532: SpinnerListModel model = new SpinnerListModel(listItems);
0533: return new FormSpinnerModel(model, initial);
0534: }
0535:
0536: /**
0537: * Returns spinner list model items represented by custom editor.
0538: *
0539: * @return spinner list model items represented by custom editor.
0540: */
0541: private List<String> listItemsFromUI() {
0542: String itemsText = listItemsArea.getText();
0543: StringTokenizer st = new StringTokenizer(itemsText, "\n"); // NOI18N
0544: List<String> items = new LinkedList<String>();
0545: while (st.hasMoreTokens()) {
0546: items.add(st.nextToken());
0547: }
0548: if (items.size() == 0) {
0549: items.add(""); // NOI18N
0550: }
0551: return items;
0552: }
0553:
0554: /**
0555: * Returns selected number type.
0556: *
0557: * @return selected number type.
0558: */
0559: private Class selectedNumberType() {
0560: Class clazz = null;
0561: switch (numberTypeCombo.getSelectedIndex()) {
0562: case 0:
0563: clazz = Byte.class;
0564: break;
0565: case 1:
0566: clazz = Double.class;
0567: break;
0568: case 2:
0569: clazz = Float.class;
0570: break;
0571: case 3:
0572: clazz = Integer.class;
0573: break;
0574: case 4:
0575: clazz = Long.class;
0576: break;
0577: case 5:
0578: clazz = Short.class;
0579: break;
0580: default:
0581: assert false;
0582: }
0583: return clazz;
0584: }
0585:
0586: /**
0587: * Returns number spinner model represented by custom editor.
0588: *
0589: * @return number spinner model represented by custom editor.
0590: */
0591: private FormSpinnerModel numberFromUI() {
0592: Number initial = (Number) initialNumberSpinner.getValue();
0593: Number minimum = null;
0594: if (minimumNumberCheckBox.isSelected()) {
0595: minimum = (Number) minimumNumberSpinner.getValue();
0596: }
0597: Number maximum = null;
0598: if (maximumNumberCheckBox.isSelected()) {
0599: maximum = (Number) maximumNumberSpinner.getValue();
0600: }
0601: Number stepSize = (Number) stepSizeSpinner.getValue();
0602: Number[] n = cast(selectedNumberType(), initial, minimum,
0603: maximum, stepSize);
0604: SpinnerNumberModel model = new SpinnerNumberModel(n[0],
0605: (Comparable) n[1], (Comparable) n[2], n[3]);
0606: return new FormSpinnerModel(model, n[0]);
0607: }
0608:
0609: /**
0610: * Casts given numbers to the specified type.
0611: *
0612: * @param clazz class to cast to.
0613: * @param number numbers to cast.
0614: * @return numbers casted to the specified type.
0615: */
0616: private static Number[] cast(Class clazz, Number... number) {
0617: Number[] result = new Number[number.length];
0618: for (int i = 0; i < number.length; i++) {
0619: Number n = number[i];
0620: if (n == null) {
0621: result[i] = null;
0622: } else {
0623: if (Integer.class == clazz) {
0624: result[i] = Integer.valueOf(n.intValue());
0625: } else if (Long.class == clazz) {
0626: result[i] = Long.valueOf(n.longValue());
0627: } else if (Float.class == clazz) {
0628: result[i] = Float.valueOf(n.floatValue());
0629: } else if (Double.class == clazz) {
0630: result[i] = Double.valueOf(n.doubleValue());
0631: } else if (Byte.class == clazz) {
0632: result[i] = Byte.valueOf(n.byteValue());
0633: } else if (Short.class == clazz) {
0634: result[i] = Short.valueOf(n.shortValue());
0635: } else {
0636: assert false;
0637: }
0638: }
0639: }
0640: return result;
0641: }
0642:
0643: /** This method is called from within the constructor to
0644: * initialize the form.
0645: * WARNING: Do NOT modify this code. The content of this method is
0646: * always regenerated by the Form Editor.
0647: */
0648: // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
0649: private void initComponents() {
0650:
0651: customizerPanel = new javax.swing.JPanel();
0652: modelTypeLabel = new javax.swing.JLabel();
0653: modelTypeCombo = new javax.swing.JComboBox();
0654: modelPropertiesLabel = new javax.swing.JLabel();
0655: separator = new javax.swing.JSeparator();
0656: modelTypePanel = new javax.swing.JPanel();
0657: datePanel = new javax.swing.JPanel();
0658: initialDateLabel = new javax.swing.JLabel();
0659: initialDateSpinner = new javax.swing.JSpinner();
0660: initialNowCheckBox = new javax.swing.JCheckBox();
0661: minimumDateCheckBox = new javax.swing.JCheckBox();
0662: minimumDateSpinner = new javax.swing.JSpinner();
0663: minimumNowCheckBox = new javax.swing.JCheckBox();
0664: maximumDateCheckBox = new javax.swing.JCheckBox();
0665: maximumDateSpinner = new javax.swing.JSpinner();
0666: maximumNowCheckBox = new javax.swing.JCheckBox();
0667: calendarFieldLabel = new javax.swing.JLabel();
0668: calendarFieldCombo = new javax.swing.JComboBox();
0669: listPanel = new javax.swing.JPanel();
0670: listItemsLabel = new javax.swing.JLabel();
0671: scrollPane = new javax.swing.JScrollPane();
0672: listItemsArea = new javax.swing.JTextArea();
0673: initialListLabel = new javax.swing.JLabel();
0674: initialListCombo = new javax.swing.JComboBox();
0675: numberPanel = new javax.swing.JPanel();
0676: numberTypeLabel = new javax.swing.JLabel();
0677: numberTypeCombo = new javax.swing.JComboBox();
0678: initialNumberLabel = new javax.swing.JLabel();
0679: initialNumberSpinner = new javax.swing.JSpinner();
0680: minimumNumberCheckBox = new javax.swing.JCheckBox();
0681: minimumNumberSpinner = new javax.swing.JSpinner();
0682: maximumNumberCheckBox = new javax.swing.JCheckBox();
0683: maximumNumberSpinner = new javax.swing.JSpinner();
0684: stepSizeLabel = new javax.swing.JLabel();
0685: stepSizeSpinner = new javax.swing.JSpinner();
0686: defaultPanel = new javax.swing.JPanel();
0687:
0688: FormListener formListener = new FormListener();
0689:
0690: modelTypeLabel.setLabelFor(modelTypeCombo);
0691: org.openide.awt.Mnemonics.setLocalizedText(modelTypeLabel,
0692: org.openide.util.NbBundle.getMessage(
0693: SpinnerModelEditor.class,
0694: "SpinnerModelEditor_ModelType")); // NOI18N
0695:
0696: modelTypeCombo.addActionListener(formListener);
0697:
0698: modelPropertiesLabel.setText(org.openide.util.NbBundle
0699: .getMessage(SpinnerModelEditor.class,
0700: "SpinnerModelEditor_ModelProperties")); // NOI18N
0701:
0702: modelTypePanel.setLayout(new java.awt.CardLayout());
0703:
0704: initialDateLabel.setLabelFor(initialDateSpinner);
0705: org.openide.awt.Mnemonics.setLocalizedText(initialDateLabel,
0706: org.openide.util.NbBundle.getMessage(
0707: SpinnerModelEditor.class,
0708: "SpinnerModelEditor_InitialDate")); // NOI18N
0709:
0710: initialDateSpinner.setEnabled(false);
0711: initialDateSpinner.addChangeListener(formListener);
0712:
0713: initialNowCheckBox.setSelected(true);
0714: initialNowCheckBox.setText(org.openide.util.NbBundle
0715: .getMessage(SpinnerModelEditor.class,
0716: "SpinnerModelEditor_InitialNow")); // NOI18N
0717: initialNowCheckBox.setBorder(javax.swing.BorderFactory
0718: .createEmptyBorder(0, 0, 0, 0));
0719: initialNowCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
0720: initialNowCheckBox.addActionListener(formListener);
0721:
0722: org.openide.awt.Mnemonics.setLocalizedText(minimumDateCheckBox,
0723: org.openide.util.NbBundle.getMessage(
0724: SpinnerModelEditor.class,
0725: "SpinnerModelEditor_MinimumDate")); // NOI18N
0726: minimumDateCheckBox.setBorder(javax.swing.BorderFactory
0727: .createEmptyBorder(0, 0, 0, 0));
0728: minimumDateCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
0729: minimumDateCheckBox.addActionListener(formListener);
0730:
0731: minimumDateSpinner.setEnabled(false);
0732: minimumDateSpinner.addChangeListener(formListener);
0733:
0734: minimumNowCheckBox.setText(org.openide.util.NbBundle
0735: .getMessage(SpinnerModelEditor.class,
0736: "SpinnerModelEditor_MinimumNow")); // NOI18N
0737: minimumNowCheckBox.setBorder(javax.swing.BorderFactory
0738: .createEmptyBorder(0, 0, 0, 0));
0739: minimumNowCheckBox.setEnabled(false);
0740: minimumNowCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
0741: minimumNowCheckBox.addActionListener(formListener);
0742:
0743: org.openide.awt.Mnemonics.setLocalizedText(maximumDateCheckBox,
0744: org.openide.util.NbBundle.getMessage(
0745: SpinnerModelEditor.class,
0746: "SpinnerModelEditor_MaximumDate")); // NOI18N
0747: maximumDateCheckBox.setBorder(javax.swing.BorderFactory
0748: .createEmptyBorder(0, 0, 0, 0));
0749: maximumDateCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
0750: maximumDateCheckBox.addActionListener(formListener);
0751:
0752: maximumDateSpinner.setEnabled(false);
0753: maximumDateSpinner.addChangeListener(formListener);
0754:
0755: maximumNowCheckBox.setText(org.openide.util.NbBundle
0756: .getMessage(SpinnerModelEditor.class,
0757: "SpinnerModelEditor_MaximumNow")); // NOI18N
0758: maximumNowCheckBox.setBorder(javax.swing.BorderFactory
0759: .createEmptyBorder(0, 0, 0, 0));
0760: maximumNowCheckBox.setEnabled(false);
0761: maximumNowCheckBox.setMargin(new java.awt.Insets(0, 0, 0, 0));
0762: maximumNowCheckBox.addActionListener(formListener);
0763:
0764: calendarFieldLabel.setLabelFor(calendarFieldCombo);
0765: org.openide.awt.Mnemonics.setLocalizedText(calendarFieldLabel,
0766: org.openide.util.NbBundle.getMessage(
0767: SpinnerModelEditor.class,
0768: "SpinnerModelEditor_CalendarField")); // NOI18N
0769:
0770: calendarFieldCombo.addActionListener(formListener);
0771:
0772: org.jdesktop.layout.GroupLayout datePanelLayout = new org.jdesktop.layout.GroupLayout(
0773: datePanel);
0774: datePanel.setLayout(datePanelLayout);
0775: datePanelLayout
0776: .setHorizontalGroup(datePanelLayout
0777: .createParallelGroup(
0778: org.jdesktop.layout.GroupLayout.LEADING)
0779: .add(
0780: datePanelLayout
0781: .createSequentialGroup()
0782: .addContainerGap()
0783: .add(
0784: datePanelLayout
0785: .createParallelGroup(
0786: org.jdesktop.layout.GroupLayout.LEADING)
0787: .add(
0788: initialDateLabel)
0789: .add(
0790: minimumDateCheckBox)
0791: .add(
0792: maximumDateCheckBox)
0793: .add(
0794: calendarFieldLabel))
0795: .addPreferredGap(
0796: org.jdesktop.layout.LayoutStyle.RELATED)
0797: .add(
0798: datePanelLayout
0799: .createParallelGroup(
0800: org.jdesktop.layout.GroupLayout.LEADING,
0801: false)
0802: .add(
0803: org.jdesktop.layout.GroupLayout.TRAILING,
0804: initialDateSpinner)
0805: .add(
0806: org.jdesktop.layout.GroupLayout.TRAILING,
0807: minimumDateSpinner)
0808: .add(
0809: org.jdesktop.layout.GroupLayout.TRAILING,
0810: maximumDateSpinner)
0811: .add(
0812: org.jdesktop.layout.GroupLayout.TRAILING,
0813: calendarFieldCombo,
0814: 0,
0815: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
0816: Short.MAX_VALUE))
0817: .add(
0818: datePanelLayout
0819: .createParallelGroup(
0820: org.jdesktop.layout.GroupLayout.LEADING)
0821: .add(
0822: datePanelLayout
0823: .createParallelGroup(
0824: org.jdesktop.layout.GroupLayout.LEADING)
0825: .add(
0826: datePanelLayout
0827: .createSequentialGroup()
0828: .addPreferredGap(
0829: org.jdesktop.layout.LayoutStyle.RELATED)
0830: .add(
0831: maximumNowCheckBox))
0832: .add(
0833: org.jdesktop.layout.GroupLayout.TRAILING,
0834: datePanelLayout
0835: .createSequentialGroup()
0836: .addPreferredGap(
0837: org.jdesktop.layout.LayoutStyle.RELATED)
0838: .add(
0839: minimumNowCheckBox)))
0840: .add(
0841: org.jdesktop.layout.GroupLayout.TRAILING,
0842: datePanelLayout
0843: .createSequentialGroup()
0844: .addPreferredGap(
0845: org.jdesktop.layout.LayoutStyle.RELATED)
0846: .add(
0847: initialNowCheckBox)))
0848: .addContainerGap(14,
0849: Short.MAX_VALUE)));
0850: datePanelLayout
0851: .setVerticalGroup(datePanelLayout
0852: .createParallelGroup(
0853: org.jdesktop.layout.GroupLayout.LEADING)
0854: .add(
0855: datePanelLayout
0856: .createSequentialGroup()
0857: .addContainerGap()
0858: .add(
0859: datePanelLayout
0860: .createParallelGroup(
0861: org.jdesktop.layout.GroupLayout.BASELINE)
0862: .add(
0863: initialDateLabel)
0864: .add(
0865: initialNowCheckBox)
0866: .add(
0867: initialDateSpinner,
0868: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
0869: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
0870: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
0871: .addPreferredGap(
0872: org.jdesktop.layout.LayoutStyle.RELATED)
0873: .add(
0874: datePanelLayout
0875: .createParallelGroup(
0876: org.jdesktop.layout.GroupLayout.BASELINE)
0877: .add(
0878: minimumDateCheckBox)
0879: .add(
0880: minimumNowCheckBox)
0881: .add(
0882: minimumDateSpinner,
0883: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
0884: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
0885: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
0886: .addPreferredGap(
0887: org.jdesktop.layout.LayoutStyle.RELATED)
0888: .add(
0889: datePanelLayout
0890: .createParallelGroup(
0891: org.jdesktop.layout.GroupLayout.BASELINE)
0892: .add(
0893: maximumDateCheckBox)
0894: .add(
0895: maximumNowCheckBox)
0896: .add(
0897: maximumDateSpinner,
0898: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
0899: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
0900: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
0901: .addPreferredGap(
0902: org.jdesktop.layout.LayoutStyle.RELATED)
0903: .add(
0904: datePanelLayout
0905: .createParallelGroup(
0906: org.jdesktop.layout.GroupLayout.BASELINE)
0907: .add(
0908: calendarFieldLabel)
0909: .add(
0910: calendarFieldCombo,
0911: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
0912: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
0913: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
0914: .addContainerGap(45,
0915: Short.MAX_VALUE)));
0916:
0917: initialDateSpinner.getAccessibleContext()
0918: .setAccessibleDescription(
0919: org.openide.util.NbBundle.getMessage(
0920: SpinnerModelEditor.class,
0921: "SpinnerModelEditor_InitialDate_ACSD")); // NOI18N
0922: initialNowCheckBox.getAccessibleContext()
0923: .setAccessibleDescription(
0924: org.openide.util.NbBundle.getMessage(
0925: SpinnerModelEditor.class,
0926: "SpinnerModelEditor_InitialNow_ACSD")); // NOI18N
0927: minimumDateCheckBox.getAccessibleContext()
0928: .setAccessibleDescription(
0929: org.openide.util.NbBundle.getMessage(
0930: SpinnerModelEditor.class,
0931: "SpinnerModelEditor_MinimumDate_ACSD")); // NOI18N
0932: minimumDateSpinner.getAccessibleContext().setAccessibleName(
0933: org.openide.util.NbBundle.getMessage(
0934: SpinnerModelEditor.class,
0935: "SpinnerModelEditor_MinimumDate_ACSN")); // NOI18N
0936: minimumDateSpinner.getAccessibleContext()
0937: .setAccessibleDescription(
0938: org.openide.util.NbBundle.getMessage(
0939: SpinnerModelEditor.class,
0940: "SpinnerModelEditor_MinimumDate_ACSD")); // NOI18N
0941: minimumNowCheckBox.getAccessibleContext()
0942: .setAccessibleDescription(
0943: org.openide.util.NbBundle.getMessage(
0944: SpinnerModelEditor.class,
0945: "SpinnerModelEditor_MinimumNow_ACSD")); // NOI18N
0946: maximumDateCheckBox.getAccessibleContext()
0947: .setAccessibleDescription(
0948: org.openide.util.NbBundle.getMessage(
0949: SpinnerModelEditor.class,
0950: "SpinnerModelEditor_MaximumDate_ACSD")); // NOI18N
0951: maximumDateSpinner.getAccessibleContext().setAccessibleName(
0952: org.openide.util.NbBundle.getMessage(
0953: SpinnerModelEditor.class,
0954: "SpinnerModelEditor_MaximumDate_ACSN")); // NOI18N
0955: maximumDateSpinner.getAccessibleContext()
0956: .setAccessibleDescription(
0957: org.openide.util.NbBundle.getMessage(
0958: SpinnerModelEditor.class,
0959: "SpinnerModelEditor_MaximumDate_ACSD")); // NOI18N
0960: maximumNowCheckBox.getAccessibleContext()
0961: .setAccessibleDescription(
0962: org.openide.util.NbBundle.getMessage(
0963: SpinnerModelEditor.class,
0964: "SpinnerModelEditor_MaximumNow_ACSD")); // NOI18N
0965: calendarFieldCombo.getAccessibleContext()
0966: .setAccessibleDescription(
0967: org.openide.util.NbBundle.getMessage(
0968: SpinnerModelEditor.class,
0969: "SpinnerModelEditor_StepSize_ACSD")); // NOI18N
0970:
0971: modelTypePanel.add(datePanel, "date");
0972:
0973: listItemsLabel.setLabelFor(listItemsArea);
0974: org.openide.awt.Mnemonics.setLocalizedText(listItemsLabel,
0975: org.openide.util.NbBundle.getMessage(
0976: SpinnerModelEditor.class,
0977: "SpinnerModelEditor_ListItems")); // NOI18N
0978:
0979: listItemsArea.setRows(4);
0980: listItemsArea.addFocusListener(formListener);
0981: scrollPane.setViewportView(listItemsArea);
0982: listItemsArea.getAccessibleContext().setAccessibleDescription(
0983: org.openide.util.NbBundle.getMessage(
0984: SpinnerModelEditor.class,
0985: "SpinnerModelEditor_ListItems")); // NOI18N
0986:
0987: initialListLabel.setLabelFor(initialListCombo);
0988: org.openide.awt.Mnemonics.setLocalizedText(initialListLabel,
0989: org.openide.util.NbBundle.getMessage(
0990: SpinnerModelEditor.class,
0991: "SpinnerModelEditor_InitialList")); // NOI18N
0992:
0993: initialListCombo.addActionListener(formListener);
0994:
0995: org.jdesktop.layout.GroupLayout listPanelLayout = new org.jdesktop.layout.GroupLayout(
0996: listPanel);
0997: listPanel.setLayout(listPanelLayout);
0998: listPanelLayout
0999: .setHorizontalGroup(listPanelLayout
1000: .createParallelGroup(
1001: org.jdesktop.layout.GroupLayout.LEADING)
1002: .add(
1003: listPanelLayout
1004: .createSequentialGroup()
1005: .addContainerGap()
1006: .add(
1007: listPanelLayout
1008: .createParallelGroup(
1009: org.jdesktop.layout.GroupLayout.LEADING)
1010: .add(
1011: scrollPane,
1012: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1013: 147,
1014: Short.MAX_VALUE)
1015: .add(
1016: listItemsLabel)
1017: .add(
1018: listPanelLayout
1019: .createSequentialGroup()
1020: .add(
1021: initialListLabel)
1022: .addPreferredGap(
1023: org.jdesktop.layout.LayoutStyle.RELATED)
1024: .add(
1025: initialListCombo,
1026: 0,
1027: 84,
1028: Short.MAX_VALUE)))
1029: .addContainerGap()));
1030: listPanelLayout
1031: .setVerticalGroup(listPanelLayout
1032: .createParallelGroup(
1033: org.jdesktop.layout.GroupLayout.LEADING)
1034: .add(
1035: listPanelLayout
1036: .createSequentialGroup()
1037: .addContainerGap()
1038: .add(listItemsLabel)
1039: .addPreferredGap(
1040: org.jdesktop.layout.LayoutStyle.RELATED)
1041: .add(
1042: scrollPane,
1043: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1044: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1045: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
1046: .addPreferredGap(
1047: org.jdesktop.layout.LayoutStyle.RELATED)
1048: .add(
1049: listPanelLayout
1050: .createParallelGroup(
1051: org.jdesktop.layout.GroupLayout.BASELINE)
1052: .add(
1053: initialListLabel)
1054: .add(
1055: initialListCombo,
1056: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1057: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1058: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1059: .addContainerGap(13,
1060: Short.MAX_VALUE)));
1061:
1062: initialListCombo.getAccessibleContext()
1063: .setAccessibleDescription(
1064: org.openide.util.NbBundle.getMessage(
1065: SpinnerModelEditor.class,
1066: "SpinnerModelEditor_InitialList_ACSD")); // NOI18N
1067:
1068: modelTypePanel.add(listPanel, "list");
1069:
1070: numberTypeLabel.setLabelFor(numberTypeCombo);
1071: org.openide.awt.Mnemonics.setLocalizedText(numberTypeLabel,
1072: org.openide.util.NbBundle.getMessage(
1073: SpinnerModelEditor.class,
1074: "SpinnerModelEditor_NumberType")); // NOI18N
1075:
1076: numberTypeCombo.addActionListener(formListener);
1077:
1078: initialNumberLabel.setLabelFor(initialNumberSpinner);
1079: org.openide.awt.Mnemonics.setLocalizedText(initialNumberLabel,
1080: org.openide.util.NbBundle.getMessage(
1081: SpinnerModelEditor.class,
1082: "SpinnerModelEditor_InitialNumber")); // NOI18N
1083:
1084: initialNumberSpinner.addChangeListener(formListener);
1085:
1086: org.openide.awt.Mnemonics.setLocalizedText(
1087: minimumNumberCheckBox, org.openide.util.NbBundle
1088: .getMessage(SpinnerModelEditor.class,
1089: "SpinnerModelEditor_MinimumNumber")); // NOI18N
1090: minimumNumberCheckBox.setBorder(javax.swing.BorderFactory
1091: .createEmptyBorder(0, 0, 0, 0));
1092: minimumNumberCheckBox
1093: .setMargin(new java.awt.Insets(0, 0, 0, 0));
1094: minimumNumberCheckBox.addActionListener(formListener);
1095:
1096: minimumNumberSpinner.setEnabled(false);
1097: minimumNumberSpinner.addChangeListener(formListener);
1098:
1099: org.openide.awt.Mnemonics.setLocalizedText(
1100: maximumNumberCheckBox, org.openide.util.NbBundle
1101: .getMessage(SpinnerModelEditor.class,
1102: "SpinnerModelEditor_MaximumNumber")); // NOI18N
1103: maximumNumberCheckBox.setBorder(javax.swing.BorderFactory
1104: .createEmptyBorder(0, 0, 0, 0));
1105: maximumNumberCheckBox
1106: .setMargin(new java.awt.Insets(0, 0, 0, 0));
1107: maximumNumberCheckBox.addActionListener(formListener);
1108:
1109: maximumNumberSpinner.setEnabled(false);
1110: maximumNumberSpinner.addChangeListener(formListener);
1111:
1112: stepSizeLabel.setLabelFor(stepSizeSpinner);
1113: org.openide.awt.Mnemonics.setLocalizedText(stepSizeLabel,
1114: org.openide.util.NbBundle.getMessage(
1115: SpinnerModelEditor.class,
1116: "SpinnerModelEditor_StepSize")); // NOI18N
1117:
1118: stepSizeSpinner.addChangeListener(formListener);
1119:
1120: org.jdesktop.layout.GroupLayout numberPanelLayout = new org.jdesktop.layout.GroupLayout(
1121: numberPanel);
1122: numberPanel.setLayout(numberPanelLayout);
1123: numberPanelLayout
1124: .setHorizontalGroup(numberPanelLayout
1125: .createParallelGroup(
1126: org.jdesktop.layout.GroupLayout.LEADING)
1127: .add(
1128: numberPanelLayout
1129: .createSequentialGroup()
1130: .addContainerGap()
1131: .add(
1132: numberPanelLayout
1133: .createParallelGroup(
1134: org.jdesktop.layout.GroupLayout.LEADING)
1135: .add(
1136: numberTypeLabel)
1137: .add(
1138: initialNumberLabel)
1139: .add(
1140: minimumNumberCheckBox)
1141: .add(
1142: maximumNumberCheckBox)
1143: .add(
1144: stepSizeLabel))
1145: .addPreferredGap(
1146: org.jdesktop.layout.LayoutStyle.RELATED)
1147: .add(
1148: numberPanelLayout
1149: .createParallelGroup(
1150: org.jdesktop.layout.GroupLayout.LEADING,
1151: false)
1152: .add(
1153: numberTypeCombo,
1154: 0,
1155: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1156: Short.MAX_VALUE)
1157: .add(
1158: initialNumberSpinner)
1159: .add(
1160: minimumNumberSpinner)
1161: .add(
1162: maximumNumberSpinner)
1163: .add(
1164: stepSizeSpinner))
1165: .addContainerGap(56,
1166: Short.MAX_VALUE)));
1167: numberPanelLayout
1168: .setVerticalGroup(numberPanelLayout
1169: .createParallelGroup(
1170: org.jdesktop.layout.GroupLayout.LEADING)
1171: .add(
1172: numberPanelLayout
1173: .createSequentialGroup()
1174: .addContainerGap()
1175: .add(
1176: numberPanelLayout
1177: .createParallelGroup(
1178: org.jdesktop.layout.GroupLayout.BASELINE)
1179: .add(
1180: numberTypeLabel)
1181: .add(
1182: numberTypeCombo,
1183: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1184: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1185: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1186: .addPreferredGap(
1187: org.jdesktop.layout.LayoutStyle.RELATED)
1188: .add(
1189: numberPanelLayout
1190: .createParallelGroup(
1191: org.jdesktop.layout.GroupLayout.BASELINE)
1192: .add(
1193: initialNumberLabel)
1194: .add(
1195: initialNumberSpinner,
1196: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1197: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1198: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1199: .addPreferredGap(
1200: org.jdesktop.layout.LayoutStyle.RELATED)
1201: .add(
1202: numberPanelLayout
1203: .createParallelGroup(
1204: org.jdesktop.layout.GroupLayout.BASELINE)
1205: .add(
1206: minimumNumberCheckBox)
1207: .add(
1208: minimumNumberSpinner,
1209: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1210: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1211: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1212: .addPreferredGap(
1213: org.jdesktop.layout.LayoutStyle.RELATED)
1214: .add(
1215: numberPanelLayout
1216: .createParallelGroup(
1217: org.jdesktop.layout.GroupLayout.BASELINE)
1218: .add(
1219: maximumNumberCheckBox)
1220: .add(
1221: maximumNumberSpinner,
1222: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1223: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1224: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1225: .addPreferredGap(
1226: org.jdesktop.layout.LayoutStyle.RELATED)
1227: .add(
1228: numberPanelLayout
1229: .createParallelGroup(
1230: org.jdesktop.layout.GroupLayout.BASELINE)
1231: .add(
1232: stepSizeLabel)
1233: .add(
1234: stepSizeSpinner,
1235: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1236: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1237: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1238: .addContainerGap(21,
1239: Short.MAX_VALUE)));
1240:
1241: numberTypeCombo.getAccessibleContext()
1242: .setAccessibleDescription(
1243: org.openide.util.NbBundle.getMessage(
1244: SpinnerModelEditor.class,
1245: "SpinnerModelEditor_NumberType_ACSD")); // NOI18N
1246: initialNumberSpinner
1247: .getAccessibleContext()
1248: .setAccessibleDescription(
1249: org.openide.util.NbBundle
1250: .getMessage(SpinnerModelEditor.class,
1251: "SpinnerModelEditor_InitialNumber_ACSD")); // NOI18N
1252: minimumNumberCheckBox
1253: .getAccessibleContext()
1254: .setAccessibleDescription(
1255: org.openide.util.NbBundle
1256: .getMessage(SpinnerModelEditor.class,
1257: "SpinnerModelEditor_MinimumNumber_ACSD")); // NOI18N
1258: minimumNumberSpinner.getAccessibleContext().setAccessibleName(
1259: org.openide.util.NbBundle.getMessage(
1260: SpinnerModelEditor.class,
1261: "SpinnerModelEditor_MinimumNumber_ACSN")); // NOI18N
1262: minimumNumberSpinner
1263: .getAccessibleContext()
1264: .setAccessibleDescription(
1265: org.openide.util.NbBundle
1266: .getMessage(SpinnerModelEditor.class,
1267: "SpinnerModelEditor_MinimumNumber_ACSD")); // NOI18N
1268: maximumNumberCheckBox
1269: .getAccessibleContext()
1270: .setAccessibleDescription(
1271: org.openide.util.NbBundle
1272: .getMessage(SpinnerModelEditor.class,
1273: "SpinnerModelEditor_MaximumNumber_ACSD")); // NOI18N
1274: maximumNumberSpinner.getAccessibleContext().setAccessibleName(
1275: org.openide.util.NbBundle.getMessage(
1276: SpinnerModelEditor.class,
1277: "SpinnerModelEditor_MaximumNumber_ACSN")); // NOI18N
1278: maximumNumberSpinner
1279: .getAccessibleContext()
1280: .setAccessibleDescription(
1281: org.openide.util.NbBundle
1282: .getMessage(SpinnerModelEditor.class,
1283: "SpinnerModelEditor_MaximumNumber_ACSD")); // NOI18N
1284: stepSizeSpinner.getAccessibleContext()
1285: .setAccessibleDescription(
1286: org.openide.util.NbBundle.getMessage(
1287: SpinnerModelEditor.class,
1288: "SpinnerModelEditor_StepSize_ACSD")); // NOI18N
1289:
1290: modelTypePanel.add(numberPanel, "number");
1291:
1292: org.jdesktop.layout.GroupLayout defaultPanelLayout = new org.jdesktop.layout.GroupLayout(
1293: defaultPanel);
1294: defaultPanel.setLayout(defaultPanelLayout);
1295: defaultPanelLayout.setHorizontalGroup(defaultPanelLayout
1296: .createParallelGroup(
1297: org.jdesktop.layout.GroupLayout.LEADING).add(0,
1298: 167, Short.MAX_VALUE));
1299: defaultPanelLayout.setVerticalGroup(defaultPanelLayout
1300: .createParallelGroup(
1301: org.jdesktop.layout.GroupLayout.LEADING).add(0,
1302: 150, Short.MAX_VALUE));
1303:
1304: modelTypePanel.add(defaultPanel, "default");
1305:
1306: org.jdesktop.layout.GroupLayout customizerPanelLayout = new org.jdesktop.layout.GroupLayout(
1307: customizerPanel);
1308: customizerPanel.setLayout(customizerPanelLayout);
1309: customizerPanelLayout
1310: .setHorizontalGroup(customizerPanelLayout
1311: .createParallelGroup(
1312: org.jdesktop.layout.GroupLayout.LEADING)
1313: .add(
1314: org.jdesktop.layout.GroupLayout.TRAILING,
1315: customizerPanelLayout
1316: .createSequentialGroup()
1317: .addContainerGap()
1318: .add(
1319: customizerPanelLayout
1320: .createParallelGroup(
1321: org.jdesktop.layout.GroupLayout.TRAILING)
1322: .add(
1323: org.jdesktop.layout.GroupLayout.LEADING,
1324: modelTypePanel,
1325: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1326: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1327: Short.MAX_VALUE)
1328: .add(
1329: org.jdesktop.layout.GroupLayout.LEADING,
1330: customizerPanelLayout
1331: .createSequentialGroup()
1332: .add(
1333: modelTypeLabel)
1334: .addPreferredGap(
1335: org.jdesktop.layout.LayoutStyle.RELATED)
1336: .add(
1337: modelTypeCombo,
1338: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1339: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1340: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1341: .add(
1342: org.jdesktop.layout.GroupLayout.LEADING,
1343: customizerPanelLayout
1344: .createSequentialGroup()
1345: .add(
1346: modelPropertiesLabel)
1347: .addPreferredGap(
1348: org.jdesktop.layout.LayoutStyle.RELATED)
1349: .add(
1350: separator,
1351: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1352: 83,
1353: Short.MAX_VALUE)))
1354: .addContainerGap()));
1355: customizerPanelLayout
1356: .setVerticalGroup(customizerPanelLayout
1357: .createParallelGroup(
1358: org.jdesktop.layout.GroupLayout.LEADING)
1359: .add(
1360: customizerPanelLayout
1361: .createSequentialGroup()
1362: .addContainerGap()
1363: .add(
1364: customizerPanelLayout
1365: .createParallelGroup(
1366: org.jdesktop.layout.GroupLayout.BASELINE)
1367: .add(
1368: modelTypeLabel)
1369: .add(
1370: modelTypeCombo,
1371: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1372: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1373: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1374: .add(11, 11, 11)
1375: .add(
1376: customizerPanelLayout
1377: .createParallelGroup(
1378: org.jdesktop.layout.GroupLayout.TRAILING)
1379: .add(
1380: modelPropertiesLabel)
1381: .add(
1382: separator,
1383: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
1384: 10,
1385: org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
1386: .addPreferredGap(
1387: org.jdesktop.layout.LayoutStyle.RELATED)
1388: .add(
1389: modelTypePanel,
1390: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1391: org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
1392: Short.MAX_VALUE)
1393: .addContainerGap()));
1394:
1395: modelTypeCombo.getAccessibleContext().setAccessibleDescription(
1396: org.openide.util.NbBundle.getMessage(
1397: SpinnerModelEditor.class,
1398: "SpinnerModelEditor_ModelType_ACSD")); // NOI18N
1399: }
1400:
1401: // Code for dispatching events from components to event handlers.
1402:
1403: private class FormListener implements
1404: java.awt.event.ActionListener,
1405: java.awt.event.FocusListener,
1406: javax.swing.event.ChangeListener {
1407: FormListener() {
1408: }
1409:
1410: public void actionPerformed(java.awt.event.ActionEvent evt) {
1411: if (evt.getSource() == modelTypeCombo) {
1412: SpinnerModelEditor.this
1413: .modelTypeComboActionPerformed(evt);
1414: } else if (evt.getSource() == initialNowCheckBox) {
1415: SpinnerModelEditor.this
1416: .initialNowCheckBoxActionPerformed(evt);
1417: } else if (evt.getSource() == minimumDateCheckBox) {
1418: SpinnerModelEditor.this
1419: .minimumDateCheckBoxActionPerformed(evt);
1420: } else if (evt.getSource() == minimumNowCheckBox) {
1421: SpinnerModelEditor.this
1422: .minimumNowCheckBoxActionPerformed(evt);
1423: } else if (evt.getSource() == maximumDateCheckBox) {
1424: SpinnerModelEditor.this
1425: .maximumDateCheckBoxActionPerformed(evt);
1426: } else if (evt.getSource() == maximumNowCheckBox) {
1427: SpinnerModelEditor.this
1428: .maximumNowCheckBoxActionPerformed(evt);
1429: } else if (evt.getSource() == calendarFieldCombo) {
1430: SpinnerModelEditor.this
1431: .calendarFieldComboActionPerformed(evt);
1432: } else if (evt.getSource() == initialListCombo) {
1433: SpinnerModelEditor.this
1434: .initialListComboActionPerformed(evt);
1435: } else if (evt.getSource() == numberTypeCombo) {
1436: SpinnerModelEditor.this
1437: .numberTypeComboActionPerformed(evt);
1438: } else if (evt.getSource() == minimumNumberCheckBox) {
1439: SpinnerModelEditor.this
1440: .minimumNumberCheckBoxActionPerformed(evt);
1441: } else if (evt.getSource() == maximumNumberCheckBox) {
1442: SpinnerModelEditor.this
1443: .maximumNumberCheckBoxActionPerformed(evt);
1444: }
1445: }
1446:
1447: public void focusGained(java.awt.event.FocusEvent evt) {
1448: }
1449:
1450: public void focusLost(java.awt.event.FocusEvent evt) {
1451: if (evt.getSource() == listItemsArea) {
1452: SpinnerModelEditor.this .listItemsAreaFocusLost(evt);
1453: }
1454: }
1455:
1456: public void stateChanged(javax.swing.event.ChangeEvent evt) {
1457: if (evt.getSource() == initialDateSpinner) {
1458: SpinnerModelEditor.this
1459: .initialDateSpinnerStateChanged(evt);
1460: } else if (evt.getSource() == minimumDateSpinner) {
1461: SpinnerModelEditor.this
1462: .minimumDateSpinnerStateChanged(evt);
1463: } else if (evt.getSource() == maximumDateSpinner) {
1464: SpinnerModelEditor.this
1465: .maximumDateSpinnerStateChanged(evt);
1466: } else if (evt.getSource() == initialNumberSpinner) {
1467: SpinnerModelEditor.this
1468: .initialNumberSpinnerStateChanged(evt);
1469: } else if (evt.getSource() == minimumNumberSpinner) {
1470: SpinnerModelEditor.this
1471: .minimumNumberSpinnerStateChanged(evt);
1472: } else if (evt.getSource() == maximumNumberSpinner) {
1473: SpinnerModelEditor.this
1474: .maximumNumberSpinnerStateChanged(evt);
1475: } else if (evt.getSource() == stepSizeSpinner) {
1476: SpinnerModelEditor.this
1477: .stepSizeSpinnerStateChanged(evt);
1478: }
1479: }
1480: }// </editor-fold>//GEN-END:initComponents
1481:
1482: private void listItemsAreaFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_listItemsAreaFocusLost
1483: if (!fireChanges)
1484: return;
1485: fireChanges = false;
1486: int selectedIndex = initialListCombo.getSelectedIndex();
1487: Object selected = initialListCombo.getSelectedItem();
1488: DefaultComboBoxModel comboModel = new DefaultComboBoxModel();
1489: for (String item : listItemsFromUI()) {
1490: comboModel.addElement(item);
1491: }
1492: initialListCombo.setModel(comboModel);
1493: // Try to keep the selection
1494: if (selected != null) {
1495: initialListCombo.setSelectedItem(selected);
1496: if (!selected.equals(initialListCombo.getSelectedItem())) {
1497: if (initialListCombo.getModel().getSize() > selectedIndex) {
1498: initialListCombo.setSelectedIndex(selectedIndex);
1499: }
1500: }
1501: }
1502: fireChanges = true;
1503: updateFromUI();
1504: }//GEN-LAST:event_listItemsAreaFocusLost
1505:
1506: private void initialListComboActionPerformed(
1507: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_initialListComboActionPerformed
1508: updateFromUI();
1509: }//GEN-LAST:event_initialListComboActionPerformed
1510:
1511: private void maximumNumberCheckBoxActionPerformed(
1512: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_maximumNumberCheckBoxActionPerformed
1513: if (!fireChanges)
1514: return;
1515: maximumNumberSpinner.setEnabled(maximumNumberCheckBox
1516: .isSelected());
1517: if (maximumNumberCheckBox.isSelected()) {
1518: Comparable maximum = (Comparable) maximumNumberSpinner
1519: .getValue();
1520: Comparable initial = (Comparable) initialNumberSpinner
1521: .getValue();
1522: if (maximum.compareTo(initial) < 0) {
1523: fireChanges = false;
1524: maximumNumberSpinner.setValue(initial);
1525: fireChanges = true;
1526: }
1527: }
1528: updateFromUI();
1529: }//GEN-LAST:event_maximumNumberCheckBoxActionPerformed
1530:
1531: private void minimumNumberCheckBoxActionPerformed(
1532: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_minimumNumberCheckBoxActionPerformed
1533: if (!fireChanges)
1534: return;
1535: minimumNumberSpinner.setEnabled(minimumNumberCheckBox
1536: .isSelected());
1537: if (minimumNumberCheckBox.isSelected()) {
1538: Comparable minimum = (Comparable) minimumNumberSpinner
1539: .getValue();
1540: Comparable initial = (Comparable) initialNumberSpinner
1541: .getValue();
1542: if (minimum.compareTo(initial) > 0) {
1543: fireChanges = false;
1544: minimumNumberSpinner.setValue(initial);
1545: fireChanges = true;
1546: }
1547: }
1548: updateFromUI();
1549: }//GEN-LAST:event_minimumNumberCheckBoxActionPerformed
1550:
1551: private void maximumNumberSpinnerStateChanged(
1552: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_maximumNumberSpinnerStateChanged
1553: maximumNumberUpdated();
1554: updateFromUI();
1555: }//GEN-LAST:event_maximumNumberSpinnerStateChanged
1556:
1557: private void minimumNumberSpinnerStateChanged(
1558: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_minimumNumberSpinnerStateChanged
1559: minimumNumberUpdated();
1560: updateFromUI();
1561: }//GEN-LAST:event_minimumNumberSpinnerStateChanged
1562:
1563: private void initialNumberSpinnerStateChanged(
1564: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_initialNumberSpinnerStateChanged
1565: if (!fireChanges)
1566: return;
1567: fireChanges = false;
1568: Comparable initial = (Comparable) initialNumberSpinner
1569: .getValue();
1570: if (minimumNumberCheckBox.isSelected()) {
1571: Comparable minimum = (Comparable) minimumNumberSpinner
1572: .getValue();
1573: if (initial.compareTo(minimum) < 0) {
1574: minimumNumberSpinner.setValue(initial);
1575: }
1576: }
1577: if (maximumNumberCheckBox.isSelected()) {
1578: Comparable maximum = (Comparable) maximumNumberSpinner
1579: .getValue();
1580: if (initial.compareTo(maximum) > 0) {
1581: maximumNumberSpinner.setValue(initial);
1582: }
1583: }
1584: fireChanges = true;
1585: updateFromUI();
1586: }//GEN-LAST:event_initialNumberSpinnerStateChanged
1587:
1588: private void stepSizeSpinnerStateChanged(
1589: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_stepSizeSpinnerStateChanged
1590: updateFromUI();
1591: }//GEN-LAST:event_stepSizeSpinnerStateChanged
1592:
1593: private void numberTypeComboActionPerformed(
1594: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numberTypeComboActionPerformed
1595: if (!fireChanges)
1596: return;
1597: fireChanges = false;
1598: updateNumberEditors();
1599: fireChanges = true;
1600: updateFromUI();
1601: }//GEN-LAST:event_numberTypeComboActionPerformed
1602:
1603: /**
1604: * Updates spinners in the number section of the custom editor to reflect
1605: * selected number type.
1606: */
1607: private void updateNumberEditors() {
1608: Number[] n = cast(selectedNumberType(),
1609: (Number) initialNumberSpinner.getValue(),
1610: (Number) minimumNumberSpinner.getValue(),
1611: (Number) maximumNumberSpinner.getValue(),
1612: (Number) stepSizeSpinner.getValue());
1613: initialNumberSpinner.setValue(n[0]);
1614: initialNumberSpinner.setEditor(new JSpinner.NumberEditor(
1615: initialNumberSpinner));
1616: minimumNumberSpinner.setValue(n[1]);
1617: minimumNumberSpinner.setEditor(new JSpinner.NumberEditor(
1618: minimumNumberSpinner));
1619: maximumNumberSpinner.setValue(n[2]);
1620: maximumNumberSpinner.setEditor(new JSpinner.NumberEditor(
1621: maximumNumberSpinner));
1622: stepSizeSpinner.setValue(n[3]);
1623: stepSizeSpinner.setEditor(new JSpinner.NumberEditor(
1624: stepSizeSpinner));
1625: }
1626:
1627: private void calendarFieldComboActionPerformed(
1628: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_calendarFieldComboActionPerformed
1629: updateFromUI();
1630: }//GEN-LAST:event_calendarFieldComboActionPerformed
1631:
1632: private void maximumDateSpinnerStateChanged(
1633: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_maximumDateSpinnerStateChanged
1634: if (!fireChanges)
1635: return;
1636: maximumDateUpdated();
1637: updateFromUI();
1638: }//GEN-LAST:event_maximumDateSpinnerStateChanged
1639:
1640: private void minimumDateSpinnerStateChanged(
1641: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_minimumDateSpinnerStateChanged
1642: if (!fireChanges)
1643: return;
1644: minimumDateUpdated();
1645: updateFromUI();
1646: }//GEN-LAST:event_minimumDateSpinnerStateChanged
1647:
1648: private void initialDateSpinnerStateChanged(
1649: javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_initialDateSpinnerStateChanged
1650: if (!fireChanges)
1651: return;
1652: initialDateUpdated();
1653: updateFromUI();
1654: }//GEN-LAST:event_initialDateSpinnerStateChanged
1655:
1656: private void maximumDateCheckBoxActionPerformed(
1657: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_maximumDateCheckBoxActionPerformed
1658: if (!fireChanges)
1659: return;
1660: fireChanges = false;
1661: boolean enabled = maximumDateCheckBox.isSelected();
1662: maximumNowCheckBox.setEnabled(enabled);
1663: if (enabled) {
1664: Date maximum = (Date) maximumDateSpinner.getValue();
1665: Date initial = (Date) initialDateSpinner.getValue();
1666: if (maximum.getTime() - initial.getTime() < 0) {
1667: if (maximumNowCheckBox.isSelected()) {
1668: if (!initialNowCheckBox.isSelected()) {
1669: maximumNowCheckBox.setSelected(false);
1670: maximumDateSpinner.setValue(initial);
1671: }
1672: } else {
1673: maximumDateSpinner.setValue(initial);
1674: }
1675: }
1676: }
1677: maximumDateSpinner.setEnabled(enabled
1678: && !maximumNowCheckBox.isSelected());
1679: fireChanges = true;
1680: updateFromUI();
1681: }//GEN-LAST:event_maximumDateCheckBoxActionPerformed
1682:
1683: private void minimumDateCheckBoxActionPerformed(
1684: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_minimumDateCheckBoxActionPerformed
1685: if (!fireChanges)
1686: return;
1687: fireChanges = false;
1688: boolean enabled = minimumDateCheckBox.isSelected();
1689: minimumNowCheckBox.setEnabled(enabled);
1690: if (enabled) {
1691: Date minimum = (Date) minimumDateSpinner.getValue();
1692: Date initial = (Date) initialDateSpinner.getValue();
1693: if (initial.getTime() - minimum.getTime() < 0) {
1694: if (minimumNowCheckBox.isSelected()) {
1695: if (!initialNowCheckBox.isSelected()) {
1696: minimumNowCheckBox.setSelected(false);
1697: minimumDateSpinner.setValue(initial);
1698: }
1699: } else {
1700: minimumDateSpinner.setValue(initial);
1701: }
1702: }
1703: }
1704: minimumDateSpinner.setEnabled(enabled
1705: && !minimumNowCheckBox.isSelected());
1706: fireChanges = true;
1707: updateFromUI();
1708: }//GEN-LAST:event_minimumDateCheckBoxActionPerformed
1709:
1710: private void maximumNowCheckBoxActionPerformed(
1711: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_maximumNowCheckBoxActionPerformed
1712: if (!fireChanges)
1713: return;
1714: fireChanges = false;
1715: boolean enabled = !maximumNowCheckBox.isSelected();
1716: maximumDateSpinner.setEnabled(enabled);
1717: if (!enabled) {
1718: maximumDateSpinner.setValue(new Date());
1719: }
1720: maximumDateUpdated();
1721: fireChanges = true;
1722: updateFromUI();
1723: }//GEN-LAST:event_maximumNowCheckBoxActionPerformed
1724:
1725: private void minimumNowCheckBoxActionPerformed(
1726: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_minimumNowCheckBoxActionPerformed
1727: if (!fireChanges)
1728: return;
1729: fireChanges = false;
1730: boolean enabled = !minimumNowCheckBox.isSelected();
1731: minimumDateSpinner.setEnabled(enabled);
1732: if (!enabled) {
1733: minimumDateSpinner.setValue(new Date());
1734: }
1735: minimumDateUpdated();
1736: fireChanges = true;
1737: updateFromUI();
1738: }//GEN-LAST:event_minimumNowCheckBoxActionPerformed
1739:
1740: private void initialNowCheckBoxActionPerformed(
1741: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_initialNowCheckBoxActionPerformed
1742: if (!fireChanges)
1743: return;
1744: fireChanges = false;
1745: boolean enabled = !initialNowCheckBox.isSelected();
1746: initialDateSpinner.setEnabled(enabled);
1747: if (!enabled) {
1748: initialDateSpinner.setValue(new Date());
1749: }
1750: initialDateUpdated();
1751: fireChanges = true;
1752: updateFromUI();
1753: }//GEN-LAST:event_initialNowCheckBoxActionPerformed
1754:
1755: private void modelTypeComboActionPerformed(
1756: java.awt.event.ActionEvent evt) {//GEN-FIRST:event_modelTypeComboActionPerformed
1757: CardLayout layout = (CardLayout) modelTypePanel.getLayout();
1758: String name = null;
1759: switch (modelTypeCombo.getSelectedIndex()) {
1760: case 0:
1761: name = "default";
1762: break; // NOI18N
1763: case 1:
1764: name = "date";
1765: break; // NOI18N
1766: case 2:
1767: name = "list";
1768: break; // NOI18N
1769: case 3:
1770: name = "number";
1771: break; // NOI18N
1772: default:
1773: assert false;
1774: }
1775: updateVisibilityOfModelProperties();
1776: layout.show(modelTypePanel, name);
1777: updateFromUI();
1778: }//GEN-LAST:event_modelTypeComboActionPerformed
1779:
1780: /**
1781: * Hides or shows "Model Properties" label and separator.
1782: */
1783: private void updateVisibilityOfModelProperties() {
1784: boolean visible = (modelTypeCombo.getSelectedIndex() != 0);
1785: modelPropertiesLabel.setVisible(visible);
1786: separator.setVisible(visible);
1787: }
1788:
1789: /**
1790: * Makes the model consistent after change of the minimum number.
1791: */
1792: private void minimumNumberUpdated() {
1793: if (!fireChanges)
1794: return;
1795: fireChanges = false;
1796: if (minimumNumberCheckBox.isSelected()) {
1797: Comparable minimum = (Comparable) minimumNumberSpinner
1798: .getValue();
1799: Comparable initial = (Comparable) initialNumberSpinner
1800: .getValue();
1801: if (initial.compareTo(minimum) < 0) {
1802: initialNumberSpinner.setValue(minimum);
1803: }
1804: if (maximumNumberCheckBox.isSelected()) {
1805: Comparable maximum = (Comparable) maximumNumberSpinner
1806: .getValue();
1807: if (maximum.compareTo(minimum) < 0) {
1808: maximumNumberSpinner.setValue(minimum);
1809: }
1810: }
1811: }
1812: fireChanges = true;
1813: }
1814:
1815: /**
1816: * Makes the model consistent after change of the maximum number.
1817: */
1818: private void maximumNumberUpdated() {
1819: if (!fireChanges)
1820: return;
1821: fireChanges = false;
1822: if (maximumNumberCheckBox.isSelected()) {
1823: Comparable maximum = (Comparable) maximumNumberSpinner
1824: .getValue();
1825: Comparable initial = (Comparable) initialNumberSpinner
1826: .getValue();
1827: if (initial.compareTo(maximum) > 0) {
1828: initialNumberSpinner.setValue(maximum);
1829: }
1830: if (minimumNumberCheckBox.isSelected()) {
1831: Comparable minimum = (Comparable) minimumNumberSpinner
1832: .getValue();
1833: if (maximum.compareTo(minimum) < 0) {
1834: minimumNumberSpinner.setValue(maximum);
1835: }
1836: }
1837: }
1838: fireChanges = true;
1839: }
1840:
1841: /**
1842: * Makes the model consistent after change of the initial date.
1843: */
1844: private void initialDateUpdated() {
1845: fireChanges = false;
1846: Date initial = (Date) initialDateSpinner.getValue();
1847: if (minimumDateCheckBox.isSelected()) {
1848: // make sure minimum <= initial
1849: Date minimum = (Date) minimumDateSpinner.getValue();
1850: if (initial.getTime() - minimum.getTime() < 0) {
1851: if (minimumNowCheckBox.isSelected()) {
1852: if (!initialNowCheckBox.isSelected()) {
1853: minimumNowCheckBox.setSelected(false);
1854: minimumDateSpinner.setEnabled(true);
1855: minimumDateSpinner.setValue(initial);
1856: }
1857: } else {
1858: minimumDateSpinner.setValue(initial);
1859: }
1860: }
1861: }
1862: if (maximumDateCheckBox.isSelected()) {
1863: // make sure initial <= maximum
1864: Date maximum = (Date) maximumDateSpinner.getValue();
1865: if (maximum.getTime() - initial.getTime() < 0) {
1866: if (maximumNowCheckBox.isSelected()) {
1867: if (!initialNowCheckBox.isSelected()) {
1868: maximumNowCheckBox.setSelected(false);
1869: maximumDateSpinner.setEnabled(true);
1870: maximumDateSpinner.setValue(initial);
1871: }
1872: } else {
1873: maximumDateSpinner.setValue(initial);
1874: }
1875: }
1876: }
1877: fireChanges = true;
1878: }
1879:
1880: /**
1881: * Makes the model consistent after change of the minimum date.
1882: */
1883: private void minimumDateUpdated() {
1884: fireChanges = false;
1885: if (!minimumDateCheckBox.isSelected())
1886: return;
1887: Date minimum = (Date) minimumDateSpinner.getValue();
1888: // make sure minimum <= initial
1889: Date initial = (Date) initialDateSpinner.getValue();
1890: if (initial.getTime() - minimum.getTime() < 0) {
1891: if (initialNowCheckBox.isSelected()) {
1892: if (!minimumNowCheckBox.isSelected()) {
1893: initialNowCheckBox.setSelected(false);
1894: initialDateSpinner.setEnabled(true);
1895: initialDateSpinner.setValue(minimum);
1896: }
1897: } else {
1898: initialDateSpinner.setValue(minimum);
1899: }
1900: }
1901: if (maximumDateCheckBox.isSelected()) {
1902: // make sure minimum <= maximum
1903: Date maximum = (Date) maximumDateSpinner.getValue();
1904: if (maximum.getTime() - minimum.getTime() < 0) {
1905: if (maximumNowCheckBox.isSelected()) {
1906: if (!minimumNowCheckBox.isSelected()) {
1907: maximumNowCheckBox.setSelected(false);
1908: maximumDateSpinner.setEnabled(true);
1909: maximumDateSpinner.setValue(minimum);
1910: }
1911: } else {
1912: maximumDateSpinner.setValue(minimum);
1913: }
1914: }
1915: }
1916: fireChanges = true;
1917: }
1918:
1919: /**
1920: * Makes the model consistent after change of the maximum date.
1921: */
1922: private void maximumDateUpdated() {
1923: if (!maximumDateCheckBox.isSelected())
1924: return;
1925: fireChanges = false;
1926: Date maximum = (Date) maximumDateSpinner.getValue();
1927: // make sure initial <= maximum
1928: Date initial = (Date) initialDateSpinner.getValue();
1929: if (maximum.getTime() - initial.getTime() < 0) {
1930: if (initialNowCheckBox.isSelected()) {
1931: if (!maximumNowCheckBox.isSelected()) {
1932: initialNowCheckBox.setSelected(false);
1933: initialDateSpinner.setEnabled(true);
1934: initialDateSpinner.setValue(maximum);
1935: }
1936: } else {
1937: initialDateSpinner.setValue(maximum);
1938: }
1939: }
1940: if (minimumDateCheckBox.isSelected()) {
1941: // make sure minimum <= maximum
1942: Date minimum = (Date) minimumDateSpinner.getValue();
1943: if (maximum.getTime() - minimum.getTime() < 0) {
1944: if (minimumNowCheckBox.isSelected()) {
1945: if (!maximumNowCheckBox.isSelected()) {
1946: minimumNowCheckBox.setSelected(false);
1947: minimumDateSpinner.setEnabled(true);
1948: minimumDateSpinner.setValue(maximum);
1949: }
1950: } else {
1951: minimumDateSpinner.setValue(maximum);
1952: }
1953: }
1954: }
1955: fireChanges = true;
1956: }
1957:
1958: // Variables declaration - do not modify//GEN-BEGIN:variables
1959: private javax.swing.JComboBox calendarFieldCombo;
1960: private javax.swing.JLabel calendarFieldLabel;
1961: private javax.swing.JPanel customizerPanel;
1962: private javax.swing.JPanel datePanel;
1963: private javax.swing.JPanel defaultPanel;
1964: private javax.swing.JLabel initialDateLabel;
1965: private javax.swing.JSpinner initialDateSpinner;
1966: private javax.swing.JComboBox initialListCombo;
1967: private javax.swing.JLabel initialListLabel;
1968: private javax.swing.JCheckBox initialNowCheckBox;
1969: private javax.swing.JLabel initialNumberLabel;
1970: private javax.swing.JSpinner initialNumberSpinner;
1971: private javax.swing.JTextArea listItemsArea;
1972: private javax.swing.JLabel listItemsLabel;
1973: private javax.swing.JPanel listPanel;
1974: private javax.swing.JCheckBox maximumDateCheckBox;
1975: private javax.swing.JSpinner maximumDateSpinner;
1976: private javax.swing.JCheckBox maximumNowCheckBox;
1977: private javax.swing.JCheckBox maximumNumberCheckBox;
1978: private javax.swing.JSpinner maximumNumberSpinner;
1979: private javax.swing.JCheckBox minimumDateCheckBox;
1980: private javax.swing.JSpinner minimumDateSpinner;
1981: private javax.swing.JCheckBox minimumNowCheckBox;
1982: private javax.swing.JCheckBox minimumNumberCheckBox;
1983: private javax.swing.JSpinner minimumNumberSpinner;
1984: private javax.swing.JLabel modelPropertiesLabel;
1985: private javax.swing.JComboBox modelTypeCombo;
1986: private javax.swing.JLabel modelTypeLabel;
1987: private javax.swing.JPanel modelTypePanel;
1988: private javax.swing.JPanel numberPanel;
1989: private javax.swing.JComboBox numberTypeCombo;
1990: private javax.swing.JLabel numberTypeLabel;
1991: private javax.swing.JScrollPane scrollPane;
1992: private javax.swing.JSeparator separator;
1993: private javax.swing.JLabel stepSizeLabel;
1994: private javax.swing.JSpinner stepSizeSpinner;
1995:
1996: // End of variables declaration//GEN-END:variables
1997:
1998: /**
1999: * Returns initialization string for the value represented by this property editor.
2000: *
2001: * @return initialization string.
2002: */
2003: @Override
2004: public String getJavaInitializationString() {
2005: Object value = getValue();
2006: if (!(value instanceof FormSpinnerModel)) {
2007: // should not happen
2008: return super .getJavaInitializationString();
2009: }
2010: FormSpinnerModel model = (FormSpinnerModel) value;
2011: SpinnerModel spinnerModel = model.getModel();
2012: String code = null;
2013: if (spinnerModel instanceof SpinnerDateModel) {
2014: code = dateInitializationString(model);
2015: } else if (spinnerModel instanceof SpinnerNumberModel) {
2016: code = numberInitializationString(model);
2017: } else if (spinnerModel instanceof SpinnerListModel) {
2018: code = listInitializationString(model);
2019: } else {
2020: assert false;
2021: }
2022: return code;
2023: }
2024:
2025: /**
2026: * Returns initialization string for list spinner model.
2027: *
2028: * @return initializtaion string for list spinner model.
2029: */
2030: private static String listInitializationString(
2031: FormSpinnerModel model) {
2032: StringBuilder code = new StringBuilder(
2033: "new javax.swing.SpinnerListModel(new String[] {"); // NOI18N
2034: SpinnerListModel listModel = (SpinnerListModel) model
2035: .getModel();
2036: List items = listModel.getList();
2037: for (Object item : items) {
2038: String text = item.toString();
2039: text = text.replace("\"", "\\\""); // NOI18N
2040: code.append('"').append(text).append("\", "); // NOI18N
2041: }
2042: code.delete(code.length() - 2, code.length());
2043: code.append("})"); // NOI18N
2044: return code.toString();
2045: }
2046:
2047: /**
2048: * Returns initialization string for number spinner model.
2049: *
2050: * @return initializtaion string for number spinner model.
2051: */
2052: private String numberInitializationString(FormSpinnerModel model) {
2053: StringBuilder code = new StringBuilder();
2054: SpinnerNumberModel numberModel = (SpinnerNumberModel) model
2055: .getModel();
2056: code.append("new javax.swing.SpinnerNumberModel("); // NOI18N
2057: Object initial = model.getInitialValue();
2058: Object minimum = numberModel.getMinimum();
2059: Object maximum = numberModel.getMaximum();
2060: Object stepSize = numberModel.getStepSize();
2061: Class clazz = initial.getClass();
2062: boolean generated = false;
2063: if (clazz == Integer.class) {
2064: if (Integer.valueOf(0).equals(initial) && (minimum == null)
2065: && (maximum == null)
2066: && (Integer.valueOf(1).equals(stepSize))) {
2067: // default constructor
2068: code.append(')');
2069: generated = true;
2070: } else if ((minimum != null) && (maximum != null)) {
2071: // int constructor
2072: code.append(initial).append(", "); // NOI18N
2073: code.append(minimum).append(", "); // NOI18N
2074: code.append(maximum).append(", "); // NOI18N
2075: code.append(stepSize).append(')');
2076: generated = true;
2077: }
2078: } else if ((clazz == Double.class) && (minimum != null)
2079: && (maximum != null)) {
2080: // double constructor
2081: code.append(initial).append("d, "); // NOI18N
2082: code.append(minimum).append("d, "); // NOI18N
2083: code.append(maximum).append("d, "); // NOI18N
2084: code.append(stepSize).append("d)"); // NOI18N
2085: generated = true;
2086: }
2087: if (!generated) {
2088: // general constructor
2089: String prefix = clazz.getName();
2090: prefix = prefix.substring(prefix.lastIndexOf('.') + 1);
2091: prefix = prefix + ".valueOf("; // NOI18N
2092: String suffix = ""; // NOI18N
2093: if (clazz == Long.class) {
2094: suffix = "L"; // NOI18N
2095: } else if (clazz == Float.class) {
2096: suffix = "f"; // NOI18N
2097: } else if (clazz == Double.class) {
2098: suffix = "d"; // NOI18N
2099: } else if (clazz == Byte.class) {
2100: prefix += "(byte)"; // NOI18N
2101: } else if (clazz == Short.class) {
2102: prefix += "(short)"; // NOI18N
2103: }
2104: code.append(prefix).append(initial).append(suffix).append(
2105: "), "); // NOI18N
2106: if (minimum == null) {
2107: code.append("null, "); // NOI18N
2108: } else {
2109: code.append(prefix).append(minimum).append(suffix)
2110: .append("), "); // NOI18N
2111: }
2112: if (maximum == null) {
2113: code.append("null, "); // NOI18N
2114: } else {
2115: code.append(prefix).append(maximum).append(suffix)
2116: .append("), "); // NOI18N
2117: }
2118: code.append(prefix).append(stepSize).append(suffix).append(
2119: "))"); // NOI18N
2120: }
2121: return code.toString();
2122: }
2123:
2124: /**
2125: * Returns initialization string for date spinner model.
2126: *
2127: * @return initializtaion string for date spinner model.
2128: */
2129: private String dateInitializationString(FormSpinnerModel model) {
2130: StringBuilder code = new StringBuilder();
2131: SpinnerDateModel dateModel = (SpinnerDateModel) model
2132: .getModel();
2133: code.append("new javax.swing.SpinnerDateModel("); // NOI18N
2134: if (model.isInitialNow()
2135: && (dateModel.getCalendarField() == Calendar.DAY_OF_MONTH)
2136: && (dateModel.getStart() == null)
2137: && (dateModel.getEnd() == null)) {
2138: // default constructor
2139: code.append(')');
2140: } else {
2141: // initial
2142: code.append("new java.util.Date("); // NOI18N
2143: if (!model.isInitialNow()) {
2144: code.append(((Date) model.getInitialValue()).getTime());
2145: code.append('L');
2146: }
2147: code.append("), "); // NOI18N
2148: // minimum
2149: Date minimum = (Date) dateModel.getStart();
2150: if (minimum == null) {
2151: code.append("null"); // NOI18N
2152: } else {
2153: code.append("new java.util.Date("); // NOI18N
2154: if (!model.isMinimumNow()) {
2155: code.append(minimum.getTime());
2156: code.append('L');
2157: }
2158: code.append(')');
2159: }
2160: code.append(", "); // NOI18N
2161: // maximum
2162: Date maximum = (Date) dateModel.getEnd();
2163: if (maximum == null) {
2164: code.append("null"); // NOI18N
2165: } else {
2166: code.append("new java.util.Date("); // NOI18N
2167: if (!model.isMaximumNow()) {
2168: code.append(maximum.getTime());
2169: code.append('L');
2170: }
2171: code.append(')');
2172: }
2173: code.append(", "); // NOI18N
2174: // calendar field
2175: int field = dateModel.getCalendarField();
2176: String fieldText = null;
2177: switch (field) {
2178: case Calendar.ERA:
2179: fieldText = "ERA";
2180: break; // NOI18N
2181: case Calendar.YEAR:
2182: fieldText = "YEAR";
2183: break; // NOI18N
2184: case Calendar.MONTH:
2185: fieldText = "MONTH";
2186: break; // NOI18N
2187: case Calendar.WEEK_OF_YEAR:
2188: fieldText = "WEEK_OF_YEAR";
2189: break; // NOI18N
2190: case Calendar.WEEK_OF_MONTH:
2191: fieldText = "WEEK_OF_MONTH";
2192: break; // NOI18N
2193: case Calendar.DAY_OF_MONTH:
2194: fieldText = "DAY_OF_MONTH";
2195: break; // NOI18N
2196: case Calendar.DAY_OF_YEAR:
2197: fieldText = "DAY_OF_YEAR";
2198: break; // NOI18N
2199: case Calendar.DAY_OF_WEEK:
2200: fieldText = "DAY_OF_WEEK";
2201: break; // NOI18N
2202: case Calendar.DAY_OF_WEEK_IN_MONTH:
2203: fieldText = "DAY_OF_WEEK_IN_MONTH";
2204: break; // NOI18N
2205: case Calendar.AM_PM:
2206: fieldText = "AM_PM";
2207: break; // NOI18N
2208: case Calendar.HOUR:
2209: fieldText = "HOUR";
2210: break; // NOI18N
2211: case Calendar.HOUR_OF_DAY:
2212: fieldText = "HOUR_OF_DAY";
2213: break; // NOI18N
2214: case Calendar.MINUTE:
2215: fieldText = "MINUTE";
2216: break; // NOI18N
2217: case Calendar.SECOND:
2218: fieldText = "SECOND";
2219: break; // NOI18N
2220: case Calendar.MILLISECOND:
2221: fieldText = "MILLISECOND";
2222: break; // NOI18N
2223: default:
2224: assert false;
2225: }
2226: code.append("java.util.Calendar.").append(fieldText)
2227: .append(')'); // NOI18N
2228: }
2229: return code.toString();
2230: }
2231:
2232: /** Name of the root tag of the spinner model XML property editor. */
2233: private static final String XML_SPINNER_MODEL = "SpinnerModel"; // NOI18N
2234: /** Name of the tag where items of spinner list model are stored. */
2235: private static final String XML_LIST_ITEM = "ListItem"; // NOI18N
2236: /** Name of the initial attribute. */
2237: private static final String ATTR_INITIAL = "initial"; // NOI18N
2238: /** Name of the minimum attribute. */
2239: private static final String ATTR_MINIMUM = "minimum"; // NOI18N
2240: /** Name of the maximum attribute. */
2241: private static final String ATTR_MAXIMUM = "maximum"; // NOI18N
2242: /** Name of the step size attribute. */
2243: private static final String ATTR_STEP_SIZE = "stepSize"; // NOI18N
2244: /** Name of the type attribute. */
2245: private static final String ATTR_TYPE = "type"; // NOI18N
2246: /** Name of the number type attribute. */
2247: private static final String ATTR_NUMBER_TYPE = "numberType"; // NOI18N
2248: /** Name of the value attribute (on list item tag). */
2249: private static final String ATTR_VALUE = "value"; // NOI18N
2250: /** Value denoting default type. */
2251: private static final String VALUE_TYPE_DEFAULT = "default"; // NOI18N
2252: /** Value denoting number type. */
2253: private static final String VALUE_TYPE_NUMBER = "number"; // NOI18N
2254: /** Value denoting date type. */
2255: private static final String VALUE_TYPE_DATE = "date"; // NOI18N
2256: /** Value denoting list type. */
2257: private static final String VALUE_TYPE_LIST = "list"; // NOI18N
2258: /** Value denoting now (date value). */
2259: private static final String VALUE_NOW = "now"; // NOI18N
2260:
2261: public void readFromXML(Node element) throws IOException {
2262: org.w3c.dom.NamedNodeMap attributes = element.getAttributes();
2263: String type = attributes.getNamedItem(ATTR_TYPE).getNodeValue();
2264: Object value = null;
2265: if (VALUE_TYPE_DEFAULT.equals(type)) {
2266: value = property.getDefaultValue();
2267: } else if (VALUE_TYPE_DATE.equals(type)) {
2268: value = readDateFromXML(element);
2269: } else if (VALUE_TYPE_NUMBER.equals(type)) {
2270: value = readNumberFromXML(element);
2271: } else if (VALUE_TYPE_LIST.equals(type)) {
2272: value = readListFromXML(element);
2273: }
2274: setValue(value);
2275: }
2276:
2277: public Node storeToXML(Document doc) {
2278: org.w3c.dom.Element el = doc.createElement(XML_SPINNER_MODEL);
2279: Object value = getValue();
2280: if (!(value instanceof FormSpinnerModel)) {
2281: el.setAttribute(ATTR_TYPE, VALUE_TYPE_DEFAULT);
2282: } else {
2283: FormSpinnerModel model = (FormSpinnerModel) value;
2284: SpinnerModel spinnerModel = model.getModel();
2285: if (spinnerModel instanceof SpinnerNumberModel) {
2286: storeNumberToXML(el, model);
2287: } else if (spinnerModel instanceof SpinnerDateModel) {
2288: storeDateToXML(el, model);
2289: } else if (spinnerModel instanceof SpinnerListModel) {
2290: storeListToXML(doc, el, model);
2291: }
2292: }
2293: return el;
2294: }
2295:
2296: private static void storeNumberToXML(org.w3c.dom.Element el,
2297: FormSpinnerModel model) {
2298: el.setAttribute(ATTR_TYPE, VALUE_TYPE_NUMBER);
2299: SpinnerNumberModel numberModel = (SpinnerNumberModel) model
2300: .getModel();
2301: el.setAttribute(ATTR_NUMBER_TYPE, model.getInitialValue()
2302: .getClass().getName());
2303: el.setAttribute(ATTR_INITIAL, model.getInitialValue()
2304: .toString());
2305: Object minimum = numberModel.getMinimum();
2306: if (minimum != null) {
2307: el.setAttribute(ATTR_MINIMUM, minimum.toString());
2308: }
2309: Object maximum = numberModel.getMaximum();
2310: if (maximum != null) {
2311: el.setAttribute(ATTR_MAXIMUM, maximum.toString());
2312: }
2313: el.setAttribute(ATTR_STEP_SIZE, numberModel.getStepSize()
2314: .toString());
2315: }
2316:
2317: private static Object readNumberFromXML(org.w3c.dom.Node el) {
2318: org.w3c.dom.NamedNodeMap attributes = el.getAttributes();
2319: String numberType = attributes.getNamedItem(ATTR_NUMBER_TYPE)
2320: .getNodeValue();
2321: String initialTxt = attributes.getNamedItem(ATTR_INITIAL)
2322: .getNodeValue();
2323: org.w3c.dom.Node node = attributes.getNamedItem(ATTR_MINIMUM);
2324: String minimumTxt = null;
2325: if (node != null) {
2326: minimumTxt = node.getNodeValue();
2327: }
2328: node = attributes.getNamedItem(ATTR_MAXIMUM);
2329: String maximumTxt = null;
2330: if (node != null) {
2331: maximumTxt = node.getNodeValue();
2332: }
2333: String stepSizeTxt = attributes.getNamedItem(ATTR_STEP_SIZE)
2334: .getNodeValue();
2335: Number stepSize = null;
2336: Comparable minimum = null;
2337: Comparable maximum = null;
2338: Number initial = null;
2339: if (numberType.equals("java.lang.Integer")) { // NOI18N
2340: initial = Integer.parseInt(initialTxt);
2341: minimum = (minimumTxt == null) ? null : Integer
2342: .parseInt(minimumTxt);
2343: maximum = (maximumTxt == null) ? null : Integer
2344: .parseInt(maximumTxt);
2345: stepSize = Integer.parseInt(stepSizeTxt);
2346: } else if (numberType.equals("java.lang.Long")) { // NOI18N
2347: initial = Long.parseLong(initialTxt);
2348: minimum = (minimumTxt == null) ? null : Long
2349: .parseLong(minimumTxt);
2350: maximum = (maximumTxt == null) ? null : Long
2351: .parseLong(maximumTxt);
2352: stepSize = Long.parseLong(stepSizeTxt);
2353: } else if (numberType.equals("java.lang.Float")) { // NOI18N
2354: initial = Float.parseFloat(initialTxt);
2355: minimum = (minimumTxt == null) ? null : Float
2356: .parseFloat(minimumTxt);
2357: maximum = (maximumTxt == null) ? null : Float
2358: .parseFloat(maximumTxt);
2359: stepSize = Float.parseFloat(stepSizeTxt);
2360: } else if (numberType.equals("java.lang.Double")) { // NOI18N
2361: initial = Double.parseDouble(initialTxt);
2362: minimum = (minimumTxt == null) ? null : Double
2363: .parseDouble(minimumTxt);
2364: maximum = (maximumTxt == null) ? null : Double
2365: .parseDouble(maximumTxt);
2366: stepSize = Double.parseDouble(stepSizeTxt);
2367: } else if (numberType.equals("java.lang.Short")) { // NOI18N
2368: initial = Short.parseShort(initialTxt);
2369: minimum = (minimumTxt == null) ? null : Short
2370: .parseShort(minimumTxt);
2371: maximum = (maximumTxt == null) ? null : Short
2372: .parseShort(maximumTxt);
2373: stepSize = Short.parseShort(stepSizeTxt);
2374: } else if (numberType.equals("java.lang.Byte")) { // NOI18N
2375: initial = Byte.parseByte(initialTxt);
2376: minimum = (minimumTxt == null) ? null : Byte
2377: .parseByte(minimumTxt);
2378: maximum = (maximumTxt == null) ? null : Byte
2379: .parseByte(maximumTxt);
2380: stepSize = Byte.parseByte(stepSizeTxt);
2381: }
2382: SpinnerNumberModel spinnerModel = new SpinnerNumberModel(
2383: initial, minimum, maximum, stepSize);
2384: return new FormSpinnerModel(spinnerModel, initial);
2385: }
2386:
2387: private static void storeDateToXML(org.w3c.dom.Element el,
2388: FormSpinnerModel model) {
2389: el.setAttribute(ATTR_TYPE, VALUE_TYPE_DATE);
2390: SpinnerDateModel dateModel = (SpinnerDateModel) model
2391: .getModel();
2392: String initialText;
2393: if (model.isInitialNow()) {
2394: initialText = VALUE_NOW;
2395: } else {
2396: Date initial = (Date) model.getInitialValue();
2397: initialText = "" + initial.getTime(); // NOI18N
2398: }
2399: el.setAttribute(ATTR_INITIAL, initialText);
2400: Date minimum = (Date) dateModel.getStart();
2401: if (minimum != null) {
2402: String minimumText;
2403: if (model.isMinimumNow()) {
2404: minimumText = VALUE_NOW;
2405: } else {
2406: minimumText = "" + minimum.getTime(); // NOI18N
2407: }
2408: el.setAttribute(ATTR_MINIMUM, minimumText);
2409: }
2410: Date maximum = (Date) dateModel.getEnd();
2411: if (maximum != null) {
2412: String maximumText;
2413: if (model.isMaximumNow()) {
2414: maximumText = VALUE_NOW;
2415: } else {
2416: maximumText = "" + maximum.getTime(); // NOI18N
2417: }
2418: el.setAttribute(ATTR_MAXIMUM, maximumText);
2419: }
2420: el.setAttribute(ATTR_STEP_SIZE, ""
2421: + dateModel.getCalendarField()); // NOI18N
2422: }
2423:
2424: private static Object readDateFromXML(org.w3c.dom.Node el) {
2425: org.w3c.dom.NamedNodeMap attributes = el.getAttributes();
2426: String initialTxt = attributes.getNamedItem(ATTR_INITIAL)
2427: .getNodeValue();
2428: Date now = new Date();
2429: boolean initialNow = false;
2430: Date initial;
2431: if (VALUE_NOW.equals(initialTxt)) {
2432: initialNow = true;
2433: initial = now;
2434: } else {
2435: initial = new Date(Long.parseLong(initialTxt));
2436: }
2437: Node node = attributes.getNamedItem(ATTR_MINIMUM);
2438: String minimumTxt = (node == null) ? null : node.getNodeValue();
2439: boolean minimumNow = false;
2440: Date minimum = null;
2441: if (minimumTxt != null) {
2442: if (VALUE_NOW.equals(minimumTxt)) {
2443: minimumNow = true;
2444: minimum = now;
2445: } else {
2446: minimum = new Date(Long.parseLong(minimumTxt));
2447: }
2448: }
2449: node = attributes.getNamedItem(ATTR_MAXIMUM);
2450: String maximumTxt = (node == null) ? null : node.getNodeValue();
2451: boolean maximumNow = false;
2452: Date maximum = null;
2453: if (maximumTxt != null) {
2454: if (VALUE_NOW.equals(maximumTxt)) {
2455: maximumNow = true;
2456: maximum = now;
2457: } else {
2458: maximum = new Date(Long.parseLong(maximumTxt));
2459: }
2460: }
2461: String stepSizeTxt = attributes.getNamedItem(ATTR_STEP_SIZE)
2462: .getNodeValue();
2463: int calendarField = Integer.parseInt(stepSizeTxt);
2464: SpinnerDateModel spinnerModel = new SpinnerDateModel(initial,
2465: minimum, maximum, calendarField);
2466: return new FormSpinnerModel(spinnerModel, initial, initialNow,
2467: minimumNow, maximumNow);
2468: }
2469:
2470: private static void storeListToXML(Document doc,
2471: org.w3c.dom.Element el, FormSpinnerModel model) {
2472: el.setAttribute(ATTR_TYPE, VALUE_TYPE_LIST);
2473: SpinnerListModel listModel = (SpinnerListModel) model
2474: .getModel();
2475: List items = listModel.getList();
2476: for (Object item : items) {
2477: org.w3c.dom.Element elItem = doc
2478: .createElement(XML_LIST_ITEM);
2479: elItem.setAttribute(ATTR_VALUE, item.toString());
2480: el.appendChild(elItem);
2481: }
2482: }
2483:
2484: private static Object readListFromXML(org.w3c.dom.Node el) {
2485: org.w3c.dom.NodeList nodes = el.getChildNodes();
2486: List<String> list = new LinkedList<String>();
2487: for (int i = 0; i < nodes.getLength(); i++) {
2488: org.w3c.dom.Node node = nodes.item(i);
2489: if (XML_LIST_ITEM.equals(node.getNodeName())) {
2490: list.add(node.getAttributes().getNamedItem(ATTR_VALUE)
2491: .getNodeValue());
2492: }
2493: }
2494: SpinnerListModel spinnerModel = new SpinnerListModel(list);
2495: return new FormSpinnerModel(spinnerModel, list.get(0));
2496: }
2497:
2498: /**
2499: * Retruns display name of this property editor.
2500: *
2501: * @return diaplay name of this property editor.
2502: */
2503: public String getDisplayName() {
2504: return NbBundle.getMessage(getClass(), "SpinnerModelEditor"); // NOI18N
2505: }
2506:
2507: /**
2508: * Sets context of the property editor.
2509: *
2510: * @param formModel form model.
2511: * @param property property being edited.
2512: */
2513: public void setContext(FormModel formModel, FormProperty property) {
2514: this .property = property;
2515: }
2516:
2517: /**
2518: * Raise form version to 6.0 - this editor is available since NB 6.0.
2519: */
2520: public void updateFormVersionLevel() {
2521: property.getPropertyContext().getFormModel().raiseVersionLevel(
2522: FormModel.FormVersion.NB60, FormModel.FormVersion.NB60);
2523: }
2524:
2525: /**
2526: * Form wrapper for <code>SpinnerModel</code>. It allows us to keep
2527: * some meta-information about the <code>SpinnerModel</code>.
2528: */
2529: public static class FormSpinnerModel extends FormDesignValueAdapter {
2530: /** Spinner model. */
2531: private SpinnerModel model;
2532: /** Initial value of the spinner model. */
2533: private Object initialValue;
2534: /** Determines whether the initial value represents "now". */
2535: private boolean initialNow;
2536: /** Determines whether the minimum value represents "now". */
2537: private boolean minimumNow;
2538: /** Determines whether the maximum value represents "now". */
2539: private boolean maximumNow;
2540:
2541: /**
2542: * Creates new <code>FormSpinnerModel</code>.
2543: *
2544: * @param model spinner list model.
2545: * @param initialValue initial value of the model.
2546: */
2547: public FormSpinnerModel(SpinnerListModel model,
2548: Object initialValue) {
2549: this .model = model;
2550: this .initialValue = initialValue;
2551: }
2552:
2553: /**
2554: * Creates new <code>FormSpinnerModel</code>.
2555: *
2556: * @param model spinner number model.
2557: * @param initialValue initial value of the model.
2558: */
2559: public FormSpinnerModel(SpinnerNumberModel model,
2560: Object initialValue) {
2561: this .model = model;
2562: this .initialValue = initialValue;
2563: }
2564:
2565: /**
2566: * Creates new <code>FormSpinnerModel</code>.
2567: *
2568: * @param model spinner date model.
2569: * @param initialValue initial value of the model.
2570: * @param initialNow determines whether the initial value represents "now".
2571: * @param minimumNow determines whether the minimum value represents "now".
2572: * @param maximumNow determines whether the maximum value represents "now".
2573: */
2574: public FormSpinnerModel(SpinnerDateModel model,
2575: Object initialValue, boolean initialNow,
2576: boolean minimumNow, boolean maximumNow) {
2577: this .model = model;
2578: this .initialValue = initialValue;
2579: this .initialNow = initialNow;
2580: this .minimumNow = minimumNow;
2581: this .maximumNow = maximumNow;
2582: }
2583:
2584: /**
2585: * Returns the wrapped spinner model.
2586: *
2587: * @return the wrapped spinner model.
2588: */
2589: public SpinnerModel getModel() {
2590: return model;
2591: }
2592:
2593: /**
2594: * Returns initial value of the model.
2595: *
2596: * @return initial value of the model.
2597: */
2598: public Object getInitialValue() {
2599: return initialValue;
2600: }
2601:
2602: /**
2603: * Determines whether the initial value represents "now".
2604: *
2605: * @return <code>true</code> if the initial value represents "now",
2606: * returns <code>false</code> otherwise.
2607: */
2608: public boolean isInitialNow() {
2609: return initialNow;
2610: }
2611:
2612: /**
2613: * Determines whether the minimum value represents "now".
2614: *
2615: * @return <code>true</code> if the minimum value represents "now",
2616: * returns <code>false</code> otherwise.
2617: */
2618: public boolean isMinimumNow() {
2619: return minimumNow;
2620: }
2621:
2622: /**
2623: * Determines whether the maximum value represents "now".
2624: *
2625: * @return <code>true</code> if the maximum value represents "now",
2626: * returns <code>false</code> otherwise.
2627: */
2628: public boolean isMaximumNow() {
2629: return maximumNow;
2630: }
2631:
2632: /**
2633: * Returns design value.
2634: *
2635: * @return design value.
2636: */
2637: public SpinnerModel getDesignValue() {
2638: return model;
2639: }
2640:
2641: }
2642:
2643: }
|