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

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

Add new java codebase.

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