Changeset 97 for java/main/src/main/java/com/framsticks/gui/Frame.java
- Timestamp:
- 07/06/13 03:51:11 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
java/main/src/main/java/com/framsticks/gui/Frame.java
r96 r97 1 1 package com.framsticks.gui; 2 2 3 import com.framsticks.core.Instance; 4 import com.framsticks.core.Path; 5 import com.framsticks.gui.view.*; 6 import com.framsticks.gui.view.TreeCellRenderer; 7 import com.framsticks.util.dispatching.Dispatcher; 8 import com.framsticks.util.dispatching.JoinableCollection; 9 import com.framsticks.util.lang.ScopeEnd; 10 import com.framsticks.util.swing.KeyboardModifier; 11 import com.framsticks.util.swing.MenuConstructor; 12 13 import org.apache.log4j.Logger; 14 15 import javax.swing.*; 3 import java.awt.BorderLayout; 4 import java.awt.CardLayout; 5 import java.awt.Color; 6 import java.awt.Container; 7 import java.awt.Dimension; 8 import java.awt.Toolkit; 9 import java.awt.event.ActionEvent; 10 import java.awt.event.KeyEvent; 11 import java.awt.event.MouseAdapter; 12 import java.awt.event.MouseEvent; 13 import java.util.HashMap; 14 import java.util.Map; 15 16 import javax.swing.AbstractAction; 17 import javax.swing.BorderFactory; 18 import javax.swing.JComponent; 19 import javax.swing.JMenu; 20 import javax.swing.JMenuBar; 21 import javax.swing.JMenuItem; 22 import javax.swing.JPanel; 23 import javax.swing.JPopupMenu; 24 import javax.swing.JScrollPane; 25 import javax.swing.JSplitPane; 26 import javax.swing.JTree; 27 import javax.swing.KeyStroke; 28 import javax.swing.ToolTipManager; 29 import javax.swing.UIManager; 16 30 import javax.swing.event.TreeModelEvent; 17 31 import javax.swing.event.TreeModelListener; 18 32 import javax.swing.event.TreeSelectionEvent; 19 33 import javax.swing.event.TreeSelectionListener; 20 import javax.swing.tree.*; 21 22 import java.awt.*; 23 import java.awt.datatransfer.StringSelection; 24 import java.awt.event.*; 25 import java.util.HashMap; 26 import java.util.Map; 34 import javax.swing.tree.DefaultMutableTreeNode; 35 import javax.swing.tree.DefaultTreeModel; 36 import javax.swing.tree.DefaultTreeSelectionModel; 37 import javax.swing.tree.TreePath; 38 import javax.swing.tree.TreeSelectionModel; 39 40 import org.apache.log4j.Logger; 41 42 import com.framsticks.core.Path; 43 import com.framsticks.core.Tree; 44 import com.framsticks.gui.view.TreeCellRenderer; 45 import com.framsticks.util.FramsticksException; 46 import com.framsticks.util.dispatching.Dispatching; 47 import com.framsticks.util.dispatching.ExceptionResultHandler; 48 import com.framsticks.util.dispatching.Joinable; 49 import com.framsticks.util.dispatching.JoinableCollection; 50 import com.framsticks.util.dispatching.JoinableParent; 51 import com.framsticks.util.dispatching.JoinableState; 27 52 import com.framsticks.util.dispatching.RunAt; 53 import com.framsticks.util.lang.ScopeEnd; 54 import com.framsticks.util.swing.KeyboardModifier; 55 import com.framsticks.util.swing.MenuConstructor; 28 56 29 57 /** … … 31 59 */ 32 60 @SuppressWarnings("serial") 33 public class Frame extends JoinableCollection<Instance> implements Dispatcher<Frame>{61 public class Frame extends FrameJoinable implements JoinableParent { 34 62 35 63 private static final Logger log = Logger.getLogger(Frame.class.getName()); … … 42 70 protected JPanel cardPanel; 43 71 44 protected final String title;45 protected JFrame swing;46 72 protected JScrollPane treeScrollPane; 47 protected JTree tree;73 protected JTree jtree; 48 74 protected DefaultTreeModel treeModel; 49 75 protected javax.swing.tree.MutableTreeNode rootNode; 50 //final Instance instance;51 76 protected JPanel treePanel; 52 77 protected JPopupMenu treePopupMenu; … … 54 79 55 80 TreeNode currentlyPoppedTreeNode; 56 protected JLabel statusBar;57 81 protected JPanel mainPanel; 58 82 protected JPanel leftPanel; … … 67 91 protected JMenu helpMenu; 68 92 69 protected final Map< Instance, InstanceAtFrame> instancesAtFrames = new HashMap<Instance, InstanceAtFrame>();70 71 public Frame(String title, Browser browser) { 72 this.title = title;93 protected final Map<Tree, TreeAtFrame> treeAtFrames = new HashMap<Tree, TreeAtFrame>(); 94 protected JoinableCollection<Tree> trees = new JoinableCollection<Tree>(); 95 96 public Frame(Browser browser) { 73 97 this.browser = browser; 74 98 } 75 99 76 public void configure() { 77 swing = new JFrame(title); 78 swing.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 79 swing.addWindowListener(new WindowAdapter() { 80 @Override 81 public void windowClosing(WindowEvent e) { 82 log.info("received closing"); 83 interrupt(); 84 } 85 }); 100 protected void initializeGui() { 101 super.initializeGui(); 86 102 /** this is done to remove the current value label from above the slider, 87 103 * because it cannot put to work properly with floating-point value sliders, … … 90 106 log.debug("creating " + this); 91 107 92 statusBar = new JLabel("not connected"); 93 94 Container contentPane = swing.getContentPane(); 95 contentPane.setLayout(new BorderLayout()); 96 108 109 Container contentPane = getSwing().getContentPane(); 97 110 treePopupMenu = new JPopupMenu("title"); 98 111 treePopupMenu.setName("popup"); 99 treePopupMenuHeader = new JMenuItem();100 treePopupMenuHeader.setForeground(Color.BLUE);101 treePopupMenu.add(treePopupMenuHeader);102 treePopupMenu.addSeparator();103 //TODO: add to favourites104 //TODO: remove from favourites105 //TODO: open in new window as root106 //TODO: refresh107 //TODO: open in console108 109 treePopupMenu.add(new JMenuItem("Refresh"));110 treePopupMenu.add(new JMenuItem("Open in new frame as root"));111 addNodeActionToTreePopupMenu("Copy path to clipboard", new NodeAction() {112 @Override113 public void actionPerformed(TreeNode treeNode) {114 Path path = treeNode.getInstancePath();115 StringSelection selection = new StringSelection(path.toString());116 swing.getToolkit().getSystemClipboard().setContents(selection, selection);117 }118 });119 //this.add(createMenuItem("Add to favourites", null));120 //this.add(createMenuItem("Remove from favourites", null));121 112 122 113 treePanel = new JPanel(); … … 147 138 }); 148 139 149 tree = new JTree(treeModel);150 tree.setName("tree");151 tree.setRootVisible(false);152 tree.setExpandsSelectedPaths(true);153 tree.setSelectionModel(new DefaultTreeSelectionModel());154 ToolTipManager.sharedInstance().registerComponent( tree);155 156 tree.addTreeSelectionListener(new TreeSelectionListener() {140 jtree = new JTree(treeModel); 141 jtree.setName("tree"); 142 jtree.setRootVisible(false); 143 jtree.setExpandsSelectedPaths(true); 144 jtree.setSelectionModel(new DefaultTreeSelectionModel()); 145 ToolTipManager.sharedInstance().registerComponent(jtree); 146 147 jtree.addTreeSelectionListener(new TreeSelectionListener() { 157 148 @Override 158 149 public void valueChanged(TreeSelectionEvent e) { … … 161 152 }); 162 153 163 tree.setExpandsSelectedPaths(true);164 tree.setEditable(false);165 tree.setDoubleBuffered(true);166 tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);167 tree.setShowsRootHandles(true);168 tree.setRowHeight(26);169 tree.setDoubleBuffered(true);170 tree.addMouseListener(new MouseAdapter() {154 jtree.setExpandsSelectedPaths(true); 155 jtree.setEditable(false); 156 jtree.setDoubleBuffered(true); 157 jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 158 jtree.setShowsRootHandles(true); 159 jtree.setRowHeight(26); 160 jtree.setDoubleBuffered(true); 161 jtree.addMouseListener(new MouseAdapter() { 171 162 @Override 172 163 public void mousePressed(MouseEvent e) { … … 182 173 }); 183 174 184 new KeyboardModifier( tree, JComponent.WHEN_FOCUSED).join(KeyStroke.getKeyStroke('h'), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)).join(KeyStroke.getKeyStroke('j'), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)).join(KeyStroke.getKeyStroke('k'), KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)).join(KeyStroke.getKeyStroke('l'), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0));185 186 tree.setCellRenderer(new TreeCellRenderer());187 188 treeScrollPane = new JScrollPane( tree);175 new KeyboardModifier(jtree, JComponent.WHEN_FOCUSED).join(KeyStroke.getKeyStroke('h'), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)).join(KeyStroke.getKeyStroke('j'), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)).join(KeyStroke.getKeyStroke('k'), KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)).join(KeyStroke.getKeyStroke('l'), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)); 176 177 jtree.setCellRenderer(new TreeCellRenderer()); 178 179 treeScrollPane = new JScrollPane(jtree); 189 180 treeScrollPane.setBorder(BorderFactory.createEmptyBorder()); 190 181 … … 215 206 contentPane.add(menuBar, BorderLayout.NORTH); 216 207 contentPane.add(mainPanel, BorderLayout.CENTER); 217 contentPane.add(statusBar, BorderLayout.SOUTH);218 208 219 209 leftPanel = new JPanel(); … … 246 236 cardPanel.setLayout(cardPanelLayout); 247 237 248 swing.pack();249 tree.requestFocusInWindow();238 getSwing().pack(); 239 jtree.requestFocusInWindow(); 250 240 251 241 log.debug("frame configured: " + this); … … 266 256 public void addRootPath(Path path) { 267 257 assert isActive(); 268 Instance instance = path.getInstance();269 assert browser.get Instances().contains(instance);270 271 InstanceAtFrame e = new InstanceAtFrame(instance, this);272 instance.addListener(e);273 instancesAtFrames.put(instance, e);258 Tree tree = path.getTree(); 259 assert browser.getTrees().contains(tree); 260 261 TreeAtFrame e = new TreeAtFrame(tree, this); 262 tree.addListener(e); 263 treeAtFrames.put(tree, e); 274 264 TreeNode node = new TreeNode(e, path); 275 265 e.rootTreeNode = node; 276 266 treeModel.insertNodeInto(node, rootNode, rootNode.getChildCount()); 277 tree.expandPath(new TreePath(rootNode)); 278 } 279 280 @Override 281 public boolean isActive() { 282 return SwingDispatcher.instance.isActive(); 283 } 284 285 @Override 286 public void dispatch(RunAt<? extends Frame> runnable) { 287 SwingDispatcher.getInstance().dispatch(runnable); 288 } 289 290 public Action addActionToTreePopupMenu(Action action) { 291 assert isActive(); 292 treePopupMenu.add(action); 293 return action; 294 } 295 296 public Action addNodeActionToTreePopupMenu(String title, final NodeAction nodeAction) { 297 assert isActive(); 298 return addActionToTreePopupMenu(new AbstractAction(title) { 299 @Override 300 public void actionPerformed(ActionEvent e) { 301 TreeNode treeNode = getCurrentlyPoppedTreeNode(); 302 if (treeNode == null) { 303 return; 304 } 305 nodeAction.actionPerformed(treeNode); 306 } 307 }); 308 } 267 jtree.expandPath(new TreePath(rootNode)); 268 } 269 309 270 310 271 public void showPanel(Panel panel) { … … 319 280 return; 320 281 } 321 currentlyPoppedTreeNode = findTreeNodeByTreePath( tree.getPathForLocation(e.getX(), e.getY()));282 currentlyPoppedTreeNode = findTreeNodeByTreePath(jtree.getPathForLocation(e.getX(), e.getY())); 322 283 if (currentlyPoppedTreeNode == null) { 323 284 return; 324 285 } 286 287 Path path = currentlyPoppedTreeNode.getTreePath(); 288 treePopupMenu.removeAll(); 289 290 for (PopupMenuEntryProvider provider : browser.popupMenuEntryProviders) { 291 provider.provide(treePopupMenu, path); 292 } 293 // treePopupMenuHeader.setText(path.getTree().getName() + path.getTextual()); 325 294 treePopupMenu.show(e.getComponent(), e.getX(), e.getY()); 326 295 //currentlyPoppedPanel.getNode().getFramsClass().getName() 327 //treePopupMenuHeader.setText(currentlyPoppedTreeNode.getNode().getPath());328 }329 330 /**331 * @return the swing332 */333 public JFrame getSwing() {334 return swing;335 296 } 336 297 … … 344 305 cardPanel.removeAll(); 345 306 cardPanel.updateUI(); 346 tree.setEnabled(false);307 jtree.setEnabled(false); 347 308 } 348 309 349 310 public ScopeEnd startChange(final DefaultMutableTreeNode node) { 350 311 assert isActive(); 351 final TreePath selection = tree.getSelectionPath();312 final TreePath selection = jtree.getSelectionPath(); 352 313 return new ScopeEnd() { 353 314 @Override … … 355 316 assert isActive(); 356 317 treeModel.nodeChanged(node); 357 tree.setSelectionPath(selection);318 jtree.setSelectionPath(selection); 358 319 } 359 320 }; … … 391 352 } 392 353 354 protected final ExceptionResultHandler dialogHandler = new ExceptionResultHandler() { 355 356 @Override 357 public void handle(FramsticksException exception) { 358 //TODO TEH 359 throw exception; 360 361 } 362 }; 363 393 364 public void goTo(Path path) { 394 365 assert isActive(); 395 final TreePath treePath = instancesAtFrames.get(path.getInstance()).getTreePath(path, false);366 final TreePath treePath = treeAtFrames.get(path.getTree()).getTreePath(path, false); 396 367 log.info("go to path: " + path + "(" + treePath + ")"); 397 368 398 new RunAt<Frame>(this) {399 @Override 400 p ublic void run() {369 this.dispatch(new RunAt<Frame>(dialogHandler) { 370 @Override 371 protected void runAt() { 401 372 log.info("executed"); 402 tree.setSelectionPath(treePath);403 tree.makeVisible(treePath);404 assert tree.isVisible(treePath);405 } 406 } ;373 jtree.setSelectionPath(treePath); 374 jtree.makeVisible(treePath); 375 assert jtree.isVisible(treePath); 376 } 377 }); 407 378 408 379 } … … 422 393 423 394 @Override 395 protected void joinableStart() { 396 super.joinableStart(); 397 Dispatching.use(trees, this); 398 } 399 400 @Override 424 401 protected void joinableInterrupt() { 425 assert isActive();402 Dispatching.drop(trees, this); 426 403 super.joinableInterrupt(); 427 428 dispatch(new RunAt<Frame>() {429 @Override430 public void run() {431 finish();432 }433 });434 404 } 435 405 436 406 @Override 437 407 protected void joinableFinish() { 438 assert isActive(); 439 log.debug("disposing frame " + this); 440 swing.dispose(); 441 } 442 443 // @Override 444 // public boolean isDone() { 445 // return super.isDone() && !swing.isDisplayable(); 446 // } 447 448 449 @Override 450 public String getName() { 451 return title; 452 } 453 408 super.joinableFinish(); 409 } 410 411 @Override 412 protected void joinableJoin() throws InterruptedException { 413 Dispatching.join(trees); 414 super.joinableJoin(); 415 } 416 417 @Override 418 public void childChangedState(Joinable joinable, JoinableState state) { 419 if (joinable == trees) { 420 proceedToState(state); 421 } 422 } 454 423 455 424 }
Note: See TracChangeset
for help on using the changeset viewer.