// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea // Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com // Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology // Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/ package graphtea.ui; import graphtea.platform.attribute.AttributeListener; import graphtea.platform.attribute.AttributeSet; import graphtea.platform.core.exception.ExceptionHandler; import graphtea.platform.parameter.Parameter; import graphtea.platform.parameter.Parametrizable; import graphtea.ui.components.utils.GAttrFrame; import javax.swing.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * this class provides the ability to show and edit the parametr of a * parametrizable object with a property editor * * @author azin azadi */ public class ParameterShower implements AttributeListener { private Object o; /** * show all the fields of the object which have setter and getter in a property editor in runtime * so you can change them easily * * @param o The object to be shown */ public void show(Object o) { try { this.o = o; PortableNotifiableAttributeSetImpl p = new PortableNotifiableAttributeSetImpl(); p.addAttributeListener(this); for (Method m : o.getClass().getMethods()) { String name = m.getName(); if (name.startsWith("set")) { name = name.substring(3); Method getter = null; try { getter = o.getClass().getMethod("get" + name, new Class[0]); } catch (Exception e) { // ExceptionHandler.catchException(e); //To change body of catch statement use File | Settings | File Templates. } if (getter != null) { p.put(name, getter.invoke(o, (Object[]) new Class[0])); } } } GAttrFrame.showEditDialog(p, false); } catch (Exception e) { ExceptionHandler.catchException(e); //To change body of catch statement use File | Settings | File Templates. } } // public void attributeUpdated(String name, Object oldVal, Object newVal) { // if (o == null) // return; // try { // Method m = o.getClass().getMethod("set" + name, newVal.getClass()); // m.invoke(o, newVal); //// Field f = o.getClass().getField(name); //// f.set(o, newVal); // } catch (Exception e) { // System.err.println("err on " + name); //// ExceptionHandler.catchException(e); //To change body of catch statement use File | Settings | File Templates. // } // } public boolean xshow(Object o) { try { this.o = o; PortableNotifiableAttributeSetImpl p = new PortableNotifiableAttributeSetImpl(); p.addAttributeListener(this); for (Field f : o.getClass().getFields()) { Parameter anot = f.getAnnotation(Parameter.class); // System.out.println(anot); // System.out.println(f.getName()); if (anot != null) { addField(p, f, o, anot.name(), anot.description()); } } return GAttrFrame.showEditDialog(p, true).getReturnStatus(); } catch (Exception e) { ExceptionHandler.catchException(e); } return false; } public boolean show(Parametrizable p) { boolean finished = false; while (!finished) { boolean b = xshow(p); if (!b) { return false; //cancelled } String s = p.checkParameters(); if (s == null) finished = true; else JOptionPane.showMessageDialog(null, s); } while (p.checkParameters() != null) ; return true; } /** * if f is an AttributeSet adds its members to the p * * @param p The attr set * @param f The field * @param o The object * @param name The name * @param desc The description * @throws IllegalAccessException Illegal access exception */ private void addField(PortableNotifiableAttributeSetImpl p, Field f, Object o, String name, String desc) throws IllegalAccessException { if (AttributeSet.class.isAssignableFrom(f.getType())) { if (f.get(o) instanceof AttributeSet) { AttributeSet as = (AttributeSet) f.get(o); for (Map.Entry<String, Object> x : ((Set<Map.Entry>) as.getAttrs().entrySet())) { String nam = "atrset." + f.getName() + "." + x.getKey(); p.put(nam, x.getValue()); p.getView().setDisplayName(nam, x.getKey()); } } } else { p.put(f.getName(), f.get(o)); if (!name.equals("")) p.getView().setDisplayName(f.getName(), name); p.getView().setDescription(f.getName(), desc); } } HashMap<String, String> names = new HashMap<>(); public void attributeUpdated(String name, Object oldVal, Object newVal) { try { if (name.startsWith("atrset")) { name = name.substring(7); String atn = name.substring(0, name.indexOf(".")); String fn = name.substring(name.indexOf(".") + 1); Object field = o.getClass().getDeclaredField(atn).get(o); if (field instanceof AttributeSet) { AttributeSet attributeSet = (AttributeSet) field; attributeSet.put(fn, newVal); } } else { o.getClass().getDeclaredField(name).set(o, newVal); } } catch (IllegalAccessException | NoSuchFieldException e) { // ExceptionHandler.catchException(e); } } }