package com.framsticks.gui; import com.framsticks.gui.controls.Control; import com.framsticks.gui.controls.ControlOwner; import com.framsticks.gui.controls.ValueControl; import com.framsticks.gui.controls.ValueControlListener; import com.framsticks.params.AccessInterface; import com.framsticks.params.Param; import com.framsticks.params.ValueParam; import org.apache.log4j.Logger; import javax.swing.*; import java.util.Collection; import java.util.HashMap; import java.util.Map; import static com.framsticks.util.lang.Containers.filterInstanceof; import com.framsticks.util.dispatching.RunAt; @SuppressWarnings("serial") public class ObjectPanel extends ModifiablePanel implements ControlOwner { private static final Logger log = Logger.getLogger(ObjectPanel.class.getName()); final protected Map components = new HashMap(); final protected Map valueControls = new HashMap(); public ObjectPanel(Panel.Parameters parameters, Collection params) { super(parameters); Gui.fillWithControls(this, params, components, Control.class); setName(framsClass.getId()); for (final ValueControl c : filterInstanceof(components.values(), ValueControl.class)) { valueControls.put(c.getParam(), c); c.setListener(new ValueControlListener() { @Override public boolean onChange(Object newValue) { if (currentTreeNode == null) { return true; } boolean result = currentTreeNode.changeValue(c, newValue); refreshControlButtons(); return result; } }); } contentPanel.add(Box.createVerticalGlue()); this.revalidate(); } @Override protected void applyChanges() { assert frame.isActive(); assert currentTreeNode != null; currentTreeNode.pushLocalChanges(); } protected void refreshControlButtons() { assert frame.isActive(); applyButton.setEnabled(currentTreeNode.localChanges != null); } protected static void fillControlsWithValues(Map map) { } @Override public void pullValuesFromLocalToUser(AccessInterface access) { assert currentTreeNode != null; assert currentTreeNode.path.getInstance().isActive(); log.debug("refreshing components"); final Map values = new HashMap(); for (Map.Entry e : valueControls.entrySet()) { values.put(e.getValue(), access.get(e.getKey().getId(), Object.class)); } frame.dispatch(new RunAt() { @Override public void run() { if (currentTreeNode.localChanges != null) { for (Map.Entry e : currentTreeNode.localChanges.entrySet()) { values.put(e.getKey(), e.getValue()); } } for (Map.Entry e : values.entrySet()) { e.getKey().pushValueToUserInterface(e.getValue()); } refreshControlButtons(); ObjectPanel.this.revalidate(); } }); } @Override public String getTitle() { return "Properties"; } @Override public JPanel getPanel() { return contentPanel; } @Override public TreeNode getCurrentTreeNode() { return super.getCurrentTreeNode(); } // public void updateValue() { // //assert panel.getFrame().isActive(); // final Node n = panel.getCurrentNode(); // panel.getBrowser().getManager().invokeLater(new Runnable() { // @Override // public void run() { // Object v = n.getAccess().get(param, Object.class); // if (v == null) { // v = param.getDef(Object.class); // } // final Object fv = v; // panel.getBrowser().invokeLater(new Runnable() { // @Override // public void run() { // setValueImpl(fv); // } // }); // } // }); // } }