source: java/main/src/main/java/com/framsticks/gui/TreeAtFrame.java @ 193

Last change on this file since 193 was 193, checked in by Maciej Komosinski, 10 years ago

Set svn:eol-style native for all textual files

  • Property svn:eol-style set to native
File size: 3.1 KB
Line 
1package com.framsticks.gui;
2
3import org.apache.logging.log4j.Logger;
4import org.apache.logging.log4j.LogManager;
5
6import com.framsticks.gui.controls.ValueControl;
7import com.framsticks.params.CompositeParam;
8import com.framsticks.params.FramsClass;
9import com.framsticks.params.PrimitiveParam;
10
11import java.util.*;
12import static com.framsticks.params.ParamsUtil.getParam;
13import static com.framsticks.structure.TreeOperations.*;
14
15import com.framsticks.structure.Node;
16import com.framsticks.structure.Path;
17import com.framsticks.structure.SideNoteKey;
18import com.framsticks.structure.Tree;
19import com.framsticks.util.dispatching.Future;
20
21/**
22 * @author Piotr Sniegowski
23 */
24public class TreeAtFrame {
25
26        private static final Logger log = LogManager.getLogger(TreeAtFrame.class);
27
28        protected final Frame frame;
29        protected final Tree tree;
30        protected final Map<String, TreePanel> knownPanels = new HashMap<>();
31        protected Node rootNode;
32
33        protected final SideNoteKey<UserChanges> userChangesKey = SideNoteKey.make(UserChanges.class);
34
35        public TreeAtFrame(Tree tree, Frame frame) {
36                this.frame = frame;
37                this.tree = tree;
38        }
39
40        public Frame getFrame() {
41                return frame;
42        }
43
44        /**
45         * @return the tree
46         */
47        public Tree getTree() {
48                return tree;
49        }
50
51        /**
52         * @return the userChangesKey
53         */
54        public SideNoteKey<UserChanges> getUserChangesKey() {
55                return userChangesKey;
56        }
57
58        public final String getName() {
59                return tree.getName();
60        }
61
62        public TreePanel preparePanel(final CompositeParam param) {
63                assert frame.isActive();
64
65                TreePanel panel = knownPanels.get(param.getFramsTypeName());
66                if (panel != null) {
67                        return panel;
68                }
69
70                final FramsClass framsClass = tree.getInfoFromCache(param.getContainedTypeName());
71                final List<TreePanel> panels = new ArrayList<TreePanel>();
72
73                final TreePanel.Parameters parameters = new TreePanel.Parameters(this, param, framsClass);
74                for (PanelProvider pp : frame.browser.panelProviders) {
75                        TreePanel p = pp.providePanel(parameters);
76                        if (p != null) {
77                                panels.add(p);
78                        }
79                }
80
81                if (panels.isEmpty()) {
82                        panel = new EmptyTreePanel(parameters);
83                } else  if (panels.size() == 1) {
84                        panel = panels.get(0);
85                } else {
86                        panel = new MultiPanel(parameters, panels);
87                }
88
89                knownPanels.put(param.getFramsTypeName(), panel);
90
91                log.debug("prepared panel for {}", panel);
92                return panel;
93        }
94
95        public boolean changeValue(Object object, ValueControl component, Object newValue) {
96                log.debug("changing value of {} to '{}'", component, newValue);
97
98                getOrCreateSideNote(tree, object, userChangesKey).changes.put(component.getParam().getId(), newValue);
99
100                return true;
101        }
102
103
104        public void pushUserChangesToTree(final Path path) {
105                assert frame.isActive();
106                path.assureResolved();
107
108                final UserChanges userChanges = getSideNote(path, userChangesKey);
109                if (userChanges == null) {
110                        return;
111                }
112                removeSideNote(path, userChangesKey);
113
114                for (final Map.Entry<String, Object> e : userChanges.changes.entrySet()) {
115                        set(path, getParam(path, e.getKey(), PrimitiveParam.class), e.getValue(), new Future<Integer>(frame) {
116                                @Override
117                                protected void result(Integer flag) {
118                                        assert frame.isActive();
119                                        userChanges.changes.remove(e.getKey());
120                                }
121                        });
122                }
123        }
124
125}
Note: See TracBrowser for help on using the repository browser.