/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package tufts.vue; import tufts.vue.gui.GUI; import java.awt.Color; import java.awt.Font; import java.awt.Dimension; import java.awt.event.ActionEvent; import javax.swing.*; import javax.swing.border.*; import java.util.Iterator; /** * MapViewer tool functionality plus pathway contextual toolbar tool. * The contextual toolbar maintains a JComboBox that stays synchronized * with whatever is in the LWPathwayList of the current map, as well * as the currently selected/active pathway in the list. * * @see LWPathwayList * @see LWPathway * * @version $Revision: 1.37 $ / $Date: 2010-02-03 19:17:40 $ / $Author: mike $ * @author Scott Fraize */ public class PathwayTool extends VueSimpleTool { private static JPanel sControlPanel; public PathwayTool() { super(); } @Override public boolean handleKeyPressed(java.awt.event.KeyEvent e) { return false; } @Override public boolean handleMousePressed(MapMouseEvent e) { if (!e.isAltDown()) return false; final LWComponent hit = e.getPicked(); final LWPathway activePathway = VUE.getActivePathway(); out(this + " handleMousePressed " + e + " hit on " + hit + " activePathway=" + activePathway); if (hit == null || activePathway == null) return false; if (hit.inPathway(activePathway)) activePathway.removeFirst(hit); else activePathway.add(hit); return true; } @Override public void actionPerformed(ActionEvent e) { super.actionPerformed(e); if (DEBUG.TOOL) System.out.println("PATHWAYTOOL " + e); GUI.makeVisibleOnScreen(this, PathwayPanel.class); VUE.getPresentationDock().raise(); //if (VUE.MapInspector != null) // VUE.MapInspector.showTab("Pathway"); } @Override public boolean supportsSelection() { return true; } // todo: need selection, but no drag, and click-to-deselect still working @Override public boolean supportsDraggedSelector(MapMouseEvent e) { return true; } // public JPanel getContextualPanel() { // if (sControlPanel == null) // sControlPanel = new PathwayToolPanel(); // return sControlPanel; // } private static class PathwayComboBoxModel extends DefaultComboBoxModel implements ActiveListener<LWMap>, LWComponent.Listener //implements VUE.ActiveMapListener, LWComponent.Listener { LWPathwayList mPathwayList; PathwayComboBoxModel() { VUE.addActiveListener(LWMap.class, this); setPathwayList(VUE.getActiveMap()); LWPathway current = VUE.getActivePathway(); if (DEBUG.TOOL) System.out.println(this + ": CURRENT PATHWAY AT INIT: " + current); if (current != null) setSelectedItem(current.getDisplayLabel()); } // TODO FIX: Active map not changing on tab select if the active mapviewer // doesn't have focus, cause then it's not knowing it's LOSING focus -- // the tab switch is going to have to change the active map itself. //public void activeMapChanged(LWMap map) { public void activeChanged(ActiveEvent<LWMap> e) { setPathwayList(e.active); } public void LWCChanged(LWCEvent e) { if (DEBUG.PATHWAY) System.out.println(this + ": " + e); if (e.getComponent() instanceof LWPathway) { final String keyName = e.getName(); if (e.key == LWKey.Label || "pathway.deleted".equals(keyName) || "pathway.created".equals(keyName)) { rebuildModel(); } else if ("pathway.list.active".equals(keyName)) { setSelectedItem(e.getComponent().getDisplayLabel()); } } } private void setPathwayList(LWMap map) { LWPathwayList pathwayList; if (map == null) pathwayList = null; else pathwayList = map.getPathwayList(); if (mPathwayList != pathwayList) { if (mPathwayList != null) mPathwayList.removeListener(this); mPathwayList = pathwayList; if (mPathwayList != null) mPathwayList.addListener(this); } rebuildModel(); } private boolean rebuilding = false; /** override */ public void setSelectedItem(Object o) { if (rebuilding) { if (DEBUG.PATHWAY) System.out.println(this + " setSelectedItem IGNORED " + o); return; } else { if (DEBUG.PATHWAY) System.out.println(this + " setSelectedItem " + o); } super.setSelectedItem(o); if (mPathwayList != null) mPathwayList.setCurrentIndex(getIndexOf(o)); } private void rebuildModel() { removeAllElements(); rebuilding = true; try { if (mPathwayList != null) { Iterator i = mPathwayList.iterator(); while (i.hasNext()) { addElement(((LWPathway)i.next()).getDisplayLabel()); } } } finally { rebuilding = false; } } } // private static class PathwayToolPanel extends JPanel // { // public PathwayToolPanel() { // setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); // setOpaque(false); // if (false) { // JLabel label = new JLabel("Pathway playback: "); // label.setBorder(new EmptyBorder(3,0,0,0)); // add(label); // } // JComboBox combo = new JComboBox(new PathwayComboBoxModel()); // Font f = combo.getFont(); // Font menuFont = new Font(f.getFontName(), f.getStyle(), f.getSize() - 2); // combo.setFont(menuFont); // GUI.applyToolbarColor(combo); // combo.setFocusable(false); // // A total hack so the visible height of the combo-box is squeezed down a bit // // Setting the size only appears to work for the width, not the height. // if (GUI.isMacAqua()) // combo.setBorder(new EmptyBorder(2,0,2,0)); // else // combo.setBorder(new MatteBorder(2,0,2,0, GUI.getToolbarColor())); // //combo.setBorder(new EmptyBorder(2,0,2,0)); // so height get's squeezed // //combo.setPreferredSize(new Dimension(150, 18)); // //combo.setSize(new Dimension(150, 18)); // add(combo); // add(Box.createHorizontalStrut(5)); // JPanel controls = new PathwayPanel.PlaybackToolPanel(); // //controls.setBackground(Color.red); // controls.setOpaque(false); // so we use parents background fill color // add(controls); // //add(Box.createHorizontalGlue()); // add(Box.createHorizontalStrut(22)); // } // }; }