source: java/main/src/main/java/com/framsticks/gui/Frame.java @ 78

Last change on this file since 78 was 78, checked in by psniegowski, 11 years ago

Add f0 parsing and f0->Model transformation.

File size: 9.7 KB
Line 
1package com.framsticks.gui;
2
3import com.framsticks.core.Node;
4import com.framsticks.core.Path;
5import com.framsticks.gui.view.*;
6import com.framsticks.gui.view.TreeCellRenderer;
7import com.framsticks.util.Dispatcher;
8import org.apache.log4j.Logger;
9
10import javax.swing.*;
11import javax.swing.event.TreeSelectionEvent;
12import javax.swing.event.TreeSelectionListener;
13import javax.swing.tree.*;
14import java.awt.*;
15import java.awt.datatransfer.StringSelection;
16import java.awt.event.ActionEvent;
17import java.awt.event.MouseAdapter;
18import java.awt.event.MouseEvent;
19import java.util.HashMap;
20import java.util.Map;
21
22/**
23 * @author Piotr Sniegowski
24 */
25public class Frame extends JFrame implements Dispatcher {
26
27    private static final Logger LOGGER = Logger.getLogger(Frame.class.getName());
28
29    protected final Browser browser;
30
31    protected final Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
32
33
34    final protected CardLayout cardPanelLayout = new CardLayout();
35    protected final JPanel cardPanel = new JPanel();
36
37    protected JScrollPane treeScrollPane;
38    protected JTree tree;
39    protected DefaultTreeModel treeModel;
40    protected javax.swing.tree.MutableTreeNode rootNode;
41    //final Instance instance;
42    protected JPanel treePanel;
43    protected  JPopupMenu treePopupMenu;
44    protected JMenuItem treePopupMenuHeader;
45
46    TreeNode currentlyPoppedTreeNode;
47    protected JLabel statusBar;
48    protected JPanel mainPanel;
49    protected JPanel leftPanel;
50    protected JPanel normalWorkPanel;
51    protected CardLayout mainPanelLayout;
52
53    protected final Map<BrowserEndpoint, EndpointAtFrame> endpoints = new HashMap<BrowserEndpoint, EndpointAtFrame>();
54
55    public Frame(String title, Browser browser) {
56                super(title);
57        this.browser = browser;
58    }
59
60    public void configure() {
61
62        Container contentPane = this.getContentPane();
63        contentPane.setLayout(new BorderLayout());
64
65        treePopupMenu = new JPopupMenu("title");
66        treePopupMenu.setName("popup");
67        treePopupMenuHeader = new JMenuItem();
68        treePopupMenuHeader.setForeground(Color.BLUE);
69        treePopupMenu.add(treePopupMenuHeader);
70        treePopupMenu.addSeparator();
71        //TODO: add to favourites
72        //TODO: remove from favourites
73        //TODO: open in new window as root
74        //TODO: refresh
75        //TODO: open in console
76
77        treePopupMenu.add(new JMenuItem("Refresh"));
78        treePopupMenu.add(new JMenuItem("Open in new frame as root"));
79                addNodeActionToTreePopupMenu("Copy path to clipboard", new NodeAction() {
80                        @Override
81                        public void actionPerformed(TreeNode treeNode) {
82                                Path path = treeNode.getInstancePath();
83                                StringSelection selection = new StringSelection(path.toString());
84                                getToolkit().getSystemClipboard().setContents(selection, selection);
85                        }
86                });
87        //this.add(createMenuItem("Add to favourites", null));
88        //this.add(createMenuItem("Remove from favourites", null));
89
90        treePanel = new JPanel();
91        treePanel.setLayout(new BorderLayout());
92
93        treeModel = new DefaultTreeModel(null);
94
95        tree = new JTree(treeModel);
96        tree.setRootVisible(false);
97        ToolTipManager.sharedInstance().registerComponent(tree);
98
99        tree.addTreeSelectionListener(new TreeSelectionListener() {
100            @Override
101            public void valueChanged(TreeSelectionEvent e) {
102                chooseTreeNode(e.getNewLeadSelectionPath());
103            }
104        });
105
106        tree.setExpandsSelectedPaths(true);
107        tree.setEditable(false);
108        tree.setDoubleBuffered(true);
109        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
110        tree.setShowsRootHandles(true);
111        tree.setRowHeight(26);
112        tree.setDoubleBuffered(true);
113        tree.addMouseListener(new MouseAdapter() {
114            @Override
115            public void mousePressed(MouseEvent e) {
116                assert isActive();
117                showPopup(e);
118            }
119
120            @Override
121            public void mouseReleased(MouseEvent e) {
122                assert isActive();
123                showPopup(e);
124            }
125        });
126        tree.setCellRenderer(new TreeCellRenderer());
127
128        treeScrollPane = new JScrollPane(tree);
129        treeScrollPane.setBorder(BorderFactory.createEmptyBorder());
130
131        treePanel.add(treeScrollPane);
132
133        rootNode = new DefaultMutableTreeNode();
134        treeModel.setRoot(rootNode);
135
136        normalWorkPanel = new JPanel();
137        normalWorkPanel.setLayout(new BorderLayout());
138
139        mainPanel = new JPanel();
140        mainPanelLayout = new CardLayout();
141        mainPanel.setLayout(mainPanelLayout);
142        mainPanel.add(normalWorkPanel, "browser");
143
144        contentPane.add(createMenu(), BorderLayout.NORTH);
145        contentPane.add(mainPanel, BorderLayout.CENTER);
146        contentPane.add(statusBar, BorderLayout.SOUTH);
147
148        leftPanel = new JPanel();
149        leftPanel.setLayout(new BorderLayout());
150        JPanel leftTopPanel = createLeftTopPanel();
151        if (leftTopPanel != null) {
152            leftPanel.add(leftTopPanel, BorderLayout.PAGE_START);
153        }
154        leftPanel.add(treePanel, BorderLayout.CENTER);
155        leftPanel.setBackground(Color.WHITE);
156        leftPanel.setForeground(Color.WHITE);
157
158        JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, cardPanel);
159        split.setPreferredSize(new Dimension(this.browser.getConfig().getInteger("size.width", 1000), this.browser.getConfig().getInteger("size.height", 500)));
160        split.setMaximumSize(screenDimension);
161        split.setOneTouchExpandable(true);
162        split.setDividerLocation(250);
163        split.setDividerSize(5);
164
165        normalWorkPanel.add(split);
166
167        //this.setVisible(true);
168        mainPanelLayout.show(mainPanel, "browser");
169
170        cardPanel.setLayout(cardPanelLayout);
171
172                this.pack();
173                tree.requestFocusInWindow();
174
175    }
176
177    protected JMenuBar createMenu() {
178        return new JMenuBar();
179    }
180
181    protected JPanel createLeftTopPanel() {
182        return null;
183    }
184
185    public void repaintTree() {
186        //LOGGER.debug("repainting");
187        //tree.repaint();
188    }
189
190    public EndpointAtFrame getOrCreateEndpointAtFrame(BrowserEndpoint endpoint) {
191        assert isActive();
192        if (endpoints.containsKey(endpoint)) {
193            return endpoints.get(endpoint);
194        }
195        EndpointAtFrame e = new EndpointAtFrame(endpoint, this);
196        endpoints.put(endpoint, e);
197        return e;
198    }
199
200    public void addRootPath(BrowserEndpoint endpoint, Path path) {
201        assert isActive();
202        TreeNode node = new TreeNode(this, getOrCreateEndpointAtFrame(endpoint), path);
203        treeModel.insertNodeInto(node, rootNode, rootNode.getChildCount());
204        tree.expandPath(new TreePath(rootNode));
205    }
206
207    @Override
208    public boolean isActive() {
209        return SwingDispatcher.instance.isActive();
210    }
211
212    @Override
213    public void invokeLater(Runnable runnable) {
214        SwingDispatcher.instance.invokeLater(runnable);
215    }
216
217    public Action addActionToTreePopupMenu(Action action) {
218        assert isActive();
219        treePopupMenu.add(action);
220        return action;
221    }
222
223    public Action addNodeActionToTreePopupMenu(String title, final NodeAction nodeAction) {
224        assert isActive();
225        return addActionToTreePopupMenu(new AbstractAction(title) {
226            @Override
227            public void actionPerformed(ActionEvent e) {
228                TreeNode treeNode = getCurrentlyPoppedTreeNode();
229                if (treeNode == null) {
230                    return;
231                }
232                nodeAction.actionPerformed(treeNode);
233            }
234        });
235    }
236
237
238    public void showPanel(Panel panel) {
239        assert isActive();
240        assert panel != null;
241        cardPanelLayout.show(cardPanel, panel.getFullName());
242    }
243
244    private void showPopup(MouseEvent e) {
245        assert isActive();
246        if (!e.isPopupTrigger()) {
247            return;
248        }
249        currentlyPoppedTreeNode = findTreeNodeByTreePath(tree.getPathForLocation(e.getX(), e.getY()));
250        if (currentlyPoppedTreeNode == null) {
251            return;
252        }
253        treePopupMenu.show(e.getComponent(), e.getX(), e.getY());
254        //currentlyPoppedPanel.getNode().getFramsClass().getName()
255        //treePopupMenuHeader.setText(currentlyPoppedTreeNode.getNode().getPath());
256    }
257
258    public TreeNode getCurrentlyPoppedTreeNode() {
259        assert isActive();
260        return currentlyPoppedTreeNode;
261    }
262
263
264    public void clear() {
265        treeModel.setRoot(null);
266        cardPanel.removeAll();
267        cardPanel.updateUI();
268        tree.setEnabled(false);
269    }
270
271
272    public void markNodeChanged(MutableTreeNode treeNode, TreePath path) {
273        assert isActive();
274        treeModel.nodeStructureChanged(treeNode);
275        tree.setSelectionPath(path);
276        tree.repaint();
277    }
278
279    public TreePath startChange() {
280        return tree.getSelectionPath();
281    }
282
283
284    public void selectTreeNode(final TreeNode treeNode) {
285        assert isActive();
286/*              final Panel panel = treeNode.getOrCreatePanel();
287                if (panel == null) {
288                        return;
289                }
290                panel.setCurrentTreeNode(treeNode);
291                treeNode.updateData();
292                showPanel(panel);*/
293    }
294
295    public TreeNode findTreeNodeByTreePath(TreePath treePath) {
296        assert isActive();
297        if (treePath == null) {
298            return null;
299        }
300        if (!(treePath.getLastPathComponent() instanceof TreeNode)) {
301            return null;
302        }
303        return (TreeNode)treePath.getLastPathComponent();
304    }
305
306
307
308    public void chooseTreeNode(TreePath treePath) {
309        assert isActive();
310        final TreeNode treeNode = findTreeNodeByTreePath(treePath);
311        if (treeNode == null) {
312            return;
313        }
314        treeNode.select();
315    }
316
317
318}
Note: See TracBrowser for help on using the repository browser.