Plaster
New
List
Login
clike
default
shinmera
2017.03.22 16:14:36
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<Method> get = new ArrayList<Method>(); ArrayList<Method> set = new ArrayList<Method>(); ArrayList<Editor> editors = new ArrayList<Editor>(); 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<editors.size(); i++){ Editor e = editors.get(i); Method m = set.get(i); try{ System.out.println("Saving: "+inst.getClass().getSimpleName()+"."+m.getName()+"("+e.value()+")"); m.invoke(inst, e.value()); }catch(Exception ex){ ex.printStackTrace(); } } DBManager.instance.registerWithDatabase(inst); DBManager.instance.commitTransaction(); }catch(Exception ex){ ex.printStackTrace(); } } public static void showCreator(Window parent, Class view){ JDialog frame = new JDialog(parent, "Add a "+view.getSimpleName()); frame.add(new ClassEditor(view), BorderLayout.CENTER); frame.setLocationRelativeTo(parent); frame.setPreferredSize(new Dimension(350, 500)); frame.pack(); frame.setVisible(true); } public static void showEditor(Window parent, Object view){ JDialog frame = new JDialog(parent, "Edit "+view.getClass().getSimpleName()); frame.add(new ClassEditor(view), BorderLayout.CENTER); frame.setLocationRelativeTo(parent); frame.setPreferredSize(new Dimension(350, 500)); frame.pack(); frame.setVisible(true); } } interface Editor{ public Object value(); } class IntegerEditor extends JPanel implements Editor{ JSpinner value; public IntegerEditor(int value){ super(new BorderLayout()); this.value = new JSpinner(new SpinnerNumberModel(0, 0, null, 1)); this.value.setValue(value); add(this.value, BorderLayout.CENTER); } public Object value(){ return (Integer)value.getValue(); } } class StringEditor extends JPanel implements Editor{ JTextField value; public StringEditor(String value){ super(new BorderLayout()); this.value = new JTextField((value == null)?"":value); add(this.value, BorderLayout.CENTER); } public Object value(){ return value.getText(); } } class InstanceChooser extends JPanel implements Editor{ JComboBox value; public InstanceChooser(Class view, DomainObject value){ super(new BorderLayout()); Collection instances = DBManager.instance.newQuery(view, ""); this.value = new JComboBox(new Vector(instances)); if(value != null) this.value.setSelectedItem(value); add(this.value, BorderLayout.CENTER); } public Object value(){ return value.getSelectedItem(); } } class CollectionEditor extends JPanel implements Editor{ Class collectionClass; JList list; InstanceChooser chooser; public CollectionEditor(Class view, Collection value){ super(new BorderLayout()); collectionClass = value.getClass(); DefaultListModel model = new DefaultListModel(); for(Object o : value) model.addElement(o); list = new JList(model); chooser = new InstanceChooser(view, null); list.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent ev){ if(ev.getClickCount() == 2) editObject(list.getSelectedValue()); } }); list.getInputMap().put(KeyStroke.getKeyStroke("DELETE"), "deleteRow"); list.getActionMap().put("deleteRow", new AbstractAction() { public void actionPerformed(ActionEvent ev){ removeObject(list.getSelectedValue()); } }); JPanel bottom = new JPanel(); bottom.setLayout(new BoxLayout(bottom, BoxLayout.LINE_AXIS)); JButton button = new JButton("+"); button.addActionListener((ev) -> 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; } } }
Raw
Annotate
Repaste
Annotations
clike
default
shinmera
2017.03.22 16:16:28
package ch.ethz.globis.isk.ui; import java.lang.reflect.Method; import java.util.ArrayList; public class ClassHelper{ public static void retrieveGetSet(Class view, ArrayList<Method> get, ArrayList<Method> set){ try{ Method[] methods = view.getDeclaredMethods(); for(Method m : methods){ if(m.getName().startsWith("get")) get.add(m); else if(m.getName().startsWith("set")) set.add(m); } get.sort((a, b) -> a.getName().compareTo(b.getName())); set.sort((a, b) -> a.getName().compareTo(b.getName())); // ID is always present and first. get.add(0, view.getMethod("getId")); set.add(0, view.getMethod("setId", String.class)); }catch(Exception ex){ ex.printStackTrace(); } } }
Raw
Repaste