package ch.ethz.globis.isk.ui; import java.awt.Window; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Collection; import java.util.Vector; import javax.swing.JFrame; import javax.swing.ListModel; import javax.swing.JDialog; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerNumberModel; import javax.swing.SwingUtilities; import javax.swing.KeyStroke; import javax.swing.AbstractAction; import ch.ethz.globis.isk.DBManager; import ch.ethz.globis.isk.domain.DomainObject; public class ClassEditor extends JPanel{ Object inst; ArrayList get = new ArrayList(); ArrayList set = new ArrayList(); ArrayList editors = new ArrayList(); JButton save; public ClassEditor(Class view){ this(view, null); } public ClassEditor(Object inst){ this(inst.getClass(), inst); } public ClassEditor(Class view, Object inst){ if(inst == null){ try{ inst = view.newInstance(); }catch(Exception ex){ // FIXME: bail ex.printStackTrace(); } } this.inst = inst; ClassHelper.retrieveGetSet(view, get, set); setLayout(new GridBagLayout()); int i=0; for(Method m : get){ try{ Class rettype = m.getReturnType(); Object retvalue = m.invoke(inst); if(retvalue instanceof Integer){ addUIElement(new JLabel(m.getName().substring(3)), 0, i, 1, 0.0, 0.0); IntegerEditor edit = new IntegerEditor((Integer)retvalue); editors.add(edit); addUIElement(edit, 1, i, 1, 1.0, 0.0); }else if(String.class.isAssignableFrom(rettype)){ addUIElement(new JLabel(m.getName().substring(3)), 0, i, 1, 0.0, 0.0); StringEditor edit = new StringEditor((String)retvalue); editors.add(edit); addUIElement(edit, 1, i, 1, 1.0, 0.0); }else if(DomainObject.class.isAssignableFrom(rettype)){ addUIElement(new JLabel(m.getName().substring(3)), 0, i, 1, 0.0, 0.0); InstanceChooser edit = new InstanceChooser(rettype, (DomainObject)retvalue); editors.add(edit); addUIElement(edit, 1, i, 1, 1.0, 0.0); }else if(Collection.class.isAssignableFrom(rettype)){ addUIElement(new JLabel(m.getName().substring(3)), 0, i, 2, 0.0, 0.0); i++; rettype = (Class)((ParameterizedType)m.getGenericReturnType()).getActualTypeArguments()[0]; CollectionEditor edit = new CollectionEditor(rettype, (Collection)retvalue); editors.add(edit); addUIElement(edit, 0, i, 2, 1.0, 0.5); }else{ throw new Exception("Unhandled value type: "+rettype); } i++; }catch(Exception ex){ ex.printStackTrace(); } } save = new JButton("Save"); save.addActionListener((ev) -> save()); addUIElement(save, 0, i, 2, 1.0, 0.0); } private void addUIElement(Container item, int x, int y, int w, double ww, double hh){ GridBagConstraints c = new GridBagConstraints(); c.fill = GridBagConstraints.BOTH; c.gridx = x; c.gridy = y; c.gridwidth = w; c.gridheight = 1; c.weightx = ww; c.weighty = hh; c.insets = new Insets(1, 1, 1, 1); add(item, c); } public void save(){ try{ DBManager.instance.beginTransaction(); for(int i=0; i addNewObject(chooser.value())); bottom.add(chooser); bottom.add(button); add(list, BorderLayout.CENTER); add(bottom, BorderLayout.SOUTH); } private void removeObject(Object o){ ((DefaultListModel)list.getModel()).removeElement(o); } private void editObject(Object o){ ClassEditor.showEditor((Window)SwingUtilities.getWindowAncestor(this), o); } private void addNewObject(Object o){ ((DefaultListModel)list.getModel()).addElement(o); } public Object value(){ ListModel model = list.getModel(); try{ Collection result = (Collection) collectionClass.newInstance(); for(int i=0; i < model.getSize(); i++){ result.add(model.getElementAt(i)); } return result; }catch(Exception ex){ ex.printStackTrace(); return null; } } }