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 javax.swing.tree.TreePath; import java.util.Collection; import java.util.IdentityHashMap; import java.util.Map; import static com.framsticks.util.lang.Containers.filterInstanceof; import com.framsticks.util.FramsticksException; @SuppressWarnings("serial") public class ObjectPanel extends ModifiablePanel implements ControlOwner { private static final Logger log = Logger.getLogger(ObjectPanel.class); final protected Map components = new IdentityHashMap(); final protected Map valueControls = new IdentityHashMap(); 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.setUserEnabled(true); c.setListener(new ValueControlListener() { @Override public boolean onChange(Object newValue) { if (currentTreePath == null) { return true; } boolean result = treeAtFrame.changeValue(currentTreePath, c, newValue); refreshControlButtons(); return result; } }); } contentPanel.add(Box.createVerticalGlue()); this.revalidate(); } @Override protected void applyChanges() { assert frame.isActive(); assert currentTreePath != null; treeAtFrame.pushLocalChanges(currentTreePath); } protected void refreshControlButtons() { assert frame.isActive(); applyButton.setEnabled(treeAtFrame.hasLocalChanges(currentTreePath)); } protected static void fillControlsWithValues(Map map) { } @Override public void pullValuesFromLocalToUser(AccessInterface access) { assert currentTreePath != null; log.debug("refreshing components"); final Map values = new IdentityHashMap(); for (Map.Entry e : valueControls.entrySet()) { values.put(e.getValue(), access.get(e.getKey().getId(), Object.class)); } NodeAtFrame nodeAtFrame = treeAtFrame.getLocalInfo(currentTreePath); if (nodeAtFrame != null) { for (Map.Entry e : nodeAtFrame.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 void handle(FramsticksException exception) { frame.handle(exception); } @Override public TreePath getCurrentTreePath() { return super.getCurrentTreePath(); } }