/* * Jajuk * Copyright (C) The Jajuk Team * http://jajuk.info * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ package org.jajuk.ui.wizard; import java.awt.event.ActionEvent; import java.awt.event.ItemEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Date; import java.util.Properties; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import org.jajuk.base.ItemManager; import org.jajuk.base.PropertyMetaInformation; import org.jajuk.events.JajukEvent; import org.jajuk.events.JajukEvents; import org.jajuk.events.ObservationManager; import org.jajuk.util.Const; import org.jajuk.util.Messages; import org.jajuk.util.UtilString; import org.jdesktop.swingx.JXDatePicker; /** * New property wizard. */ public class NewPropertyWizard extends CustomPropertyWizard implements KeyListener { /** Generated serialVersionUID. */ private static final long serialVersionUID = 1L; private final JTextField jtfName; private final JComboBox jcbClass; private final JTextField jtfDefault; private final JCheckBox jcbDefault; private final JXDatePicker jdpDefault; // Types /** The Constant STRING. */ private static final int STRING = 0; /** The Constant LONG. */ private static final int LONG = 1; /** The Constant DOUBLE. */ private static final int DOUBLE = 2; /** The Constant BOOLEAN. */ private static final int BOOLEAN = 3; /** The Constant DATE. */ private static final int DATE = 4; /** * Constructor. */ public NewPropertyWizard() { super(Messages.getString("NewPropertyWizard.0")); populate();// create default UI // Name jtfName = new JTextField(); jtfName.addKeyListener(this); // Type, class JLabel jlClass = new JLabel(Messages.getString("NewPropertyWizard.3")); jcbClass = new JComboBox(); jcbClass.addItem(Messages.getString(Const.FORMAT_STRING)); jcbClass.addItem(Messages.getString(Const.FORMAT_NUMBER)); jcbClass.addItem(Messages.getString(Const.FORMAT_FLOAT)); jcbClass.addItem(Messages.getString(Const.FORMAT_BOOLEAN)); jcbClass.addItem(Messages.getString(Const.FORMAT_DATE)); jcbClass.addItemListener(this); // Default JLabel jlDefault = new JLabel(Messages.getString("NewPropertyWizard.5")); jtfDefault = new JTextField(20); jcbDefault = new JCheckBox(); jcbDefault.setEnabled(false); jdpDefault = new JXDatePicker(); jdpDefault.setEnabled(false); // Add items setLayout(new MigLayout("insets 15,gapx 10,gapy 15", "[][grow]")); add(jlItemChoice); add(jcbItemChoice, "grow,wrap"); add(jlName); add(jtfName, "grow,wrap"); add(jlClass); add(jcbClass, "grow,wrap"); add(jlDefault); add(jtfDefault, "split 3,grow"); add(jcbDefault, "grow"); add(jdpDefault, "grow,wrap"); add(okp, "cell 1 4, span,right"); addWindowListener(new WindowAdapter() { @Override public void windowActivated(WindowEvent e) { jtfName.requestFocusInWindow(); } }); getRootPane().setDefaultButton(okp.getOKButton()); } /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent ae) { if (ae.getSource().equals(this.okp.getOKButton())) { // check the property is not already used internally for (String element : Const.XML_RESERVED_ATTRIBUTE_NAMES) { /* * check user can't create a property that is the localized name of an * existing standard attribute. Note that a potential bug can occur if * user change language */ if (element.equalsIgnoreCase(jtfName.getText()) || jtfName.getText().matches(",")) { Messages.showErrorMessage(110); return; } } ItemManager im = getItemManager(); // check if this property is not already used for (PropertyMetaInformation meta : im.getCustomProperties()) { if (meta.getName().equals(jtfName.getText())) { Messages.showErrorMessage(162); return; } } // check format if (!UtilString.isXMLValid(jtfName.getText())) { Messages.showErrorMessage(140); return; } // OK, store it // get selected format Class<?> cType = null; switch (jcbClass.getSelectedIndex()) { case STRING: cType = String.class; break; case LONG: cType = Long.class; break; case DOUBLE: cType = Double.class; break; case BOOLEAN: cType = Boolean.class; break; case DATE: cType = Date.class; break; default: return; } String sProperty = jtfName.getText(); Object oDefault = jtfDefault.getText(); // Check number and float formats (others are safe) try { if (cType.equals(Long.class)) { Long.parseLong(jtfDefault.getText()); } else if (cType.equals(Double.class)) { Double.parseDouble(jtfDefault.getText()); } } catch (Exception e) { Messages.showErrorMessage(137); return; } // set default if (cType.equals(Boolean.class)) { oDefault = jcbDefault.isSelected(); } else if (cType.equals(Date.class)) { oDefault = jdpDefault.getDate(); } PropertyMetaInformation meta = new PropertyMetaInformation(sProperty, true, false, true, true, true, cType, oDefault); im.registerProperty(meta); im.applyNewProperty(meta); Properties properties = new Properties(); properties.put(Const.DETAIL_CONTENT, sProperty); JajukEvent event = new JajukEvent(JajukEvents.CUSTOM_PROPERTIES_ADD, properties); ObservationManager.notify(event); dispose(); } else if (ae.getSource().equals(this.okp.getCancelButton())) { dispose(); } } /* * (non-Javadoc) * * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent) */ @Override public void itemStateChanged(ItemEvent e) { // Date format if (jcbClass.getSelectedIndex() == DATE) { jdpDefault.setEnabled(true); } else { jdpDefault.setEnabled(false); } // Boolean format if (jcbClass.getSelectedIndex() == BOOLEAN) { jcbDefault.setEnabled(true); } else { jcbDefault.setEnabled(false); } // Others formats if (jcbClass.getSelectedIndex() != BOOLEAN && jcbClass.getSelectedIndex() != DATE) { jtfDefault.setEnabled(true); } else { jtfDefault.setEnabled(false); } // Ok button if (jcbItemChoice.getSelectedIndex() != -1 && jcbClass.getSelectedIndex() != -1 && jtfName.getText().length() > 0) { okp.getOKButton().setEnabled(true); } else { okp.getOKButton().setEnabled(false); } } /* * (non-Javadoc) * * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent) */ @Override public void keyTyped(KeyEvent e) { // required by interface, but nothing to do here... } /* * (non-Javadoc) * * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent) */ @Override public void keyPressed(KeyEvent e) { // required by interface, but nothing to do here... } /* * (non-Javadoc) * * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent) */ @Override public void keyReleased(KeyEvent e) { if (jcbItemChoice.getSelectedIndex() != -1 && jcbClass.getSelectedIndex() != -1 && jtfName.getText().length() > 0) { okp.getOKButton().setEnabled(true); } else { okp.getOKButton().setEnabled(false); } } }