/[schmitzm]/trunk/src/skrueger/geotools/MapPaneToolBar.java
ViewVC logotype

Annotation of /trunk/src/skrueger/geotools/MapPaneToolBar.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 888 - (hide annotations)
Thu Jun 3 10:48:43 2010 UTC (14 years, 8 months ago) by alfonx
File size: 28702 byte(s)
* Changes some more kruegers to tzeggai
* Renamed Geopublisher_de.proaperties ResourceBundle to geopublisherTranslation_de.properties etc... 
* Moved openOSFolder(File) method to SwingUtil,allowing to open a folder with a os dependent file explorer
1 alfonx 244 /*******************************************************************************
2     * Copyright (c) 2009 Martin O. J. Schmitz.
3     *
4     * This file is part of the SCHMITZM library - a collection of utility
5 alfonx 256 * classes based on Java 1.6, focusing (not only) on Java Swing
6 alfonx 244 * and the Geotools library.
7     *
8     * The SCHMITZM project is hosted at:
9     * http://wald.intevation.org/projects/schmitzm/
10     *
11     * This program is free software; you can redistribute it and/or
12     * modify it under the terms of the GNU Lesser General Public License
13     * as published by the Free Software Foundation; either version 3
14     * of the License, or (at your option) any later version.
15     *
16     * This program is distributed in the hope that it will be useful,
17     * but WITHOUT ANY WARRANTY; without even the implied warranty of
18     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19     * GNU General Public License for more details.
20     *
21     * You should have received a copy of the GNU Lesser General Public License (license.txt)
22     * along with this program; if not, write to the Free Software
23     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24     * or try this link: http://www.gnu.org/licenses/lgpl.html
25     *
26     * Contributors:
27     * Martin O. J. Schmitz - initial API and implementation
28 alfonx 862 * Stefan A. Tzeggai - additional utility classes
29 alfonx 244 ******************************************************************************/
30     package skrueger.geotools;
31    
32     import java.awt.Color;
33     import java.awt.Graphics;
34     import java.awt.event.ActionEvent;
35 alfonx 414 import java.awt.event.ActionListener;
36 alfonx 244 import java.util.ArrayList;
37 alfonx 414 import java.util.HashSet;
38     import java.util.Set;
39 alfonx 244 import java.util.SortedMap;
40     import java.util.TreeMap;
41    
42     import javax.swing.AbstractAction;
43     import javax.swing.AbstractButton;
44     import javax.swing.Action;
45     import javax.swing.Icon;
46     import javax.swing.ImageIcon;
47     import javax.swing.JButton;
48     import javax.swing.JComponent;
49     import javax.swing.JToggleButton;
50     import javax.swing.JToolBar;
51    
52     import org.apache.log4j.Logger;
53    
54 alfonx 886 import schmitzm.geotools.gui.GeotoolsGUIUtil;
55 alfonx 509 import schmitzm.geotools.gui.SelectableXMapPane;
56 alfonx 740 import schmitzm.geotools.gui.XMapPaneEvent;
57     import schmitzm.geotools.gui.XMapPaneTool;
58 alfonx 244 import schmitzm.geotools.map.event.JMapPaneListener;
59     import schmitzm.geotools.map.event.MapAreaChangedEvent;
60     import schmitzm.swing.ButtonGroup;
61 alfonx 486 import skrueger.swing.SmallButton;
62     import skrueger.swing.SmallToggleButton;
63 alfonx 244
64     import com.vividsolutions.jts.geom.Envelope;
65    
66     /**
67 alfonx 509 * A toolbar to control an {@link SelectableXMapPane} (Atlas visualization). This contains
68 alfonx 244 * two types of buttons. A group of <i>tools</i> for the mouse actions on the
69     * map represented by {@link JToggleButton JToggleButtons}, where only one tool
70     * can be activated every time. And some (general) <i>actions</i>, represented
71     * by normal {@link JButton JButtons}.
72     *
73     * @author <a href="mailto:[email protected]">Martin Schmitz</a>
74     * (University of Bonn/Germany)
75 alfonx 862 * @version 1.2 Stefan Tzeggai
76 alfonx 244 */
77     public class MapPaneToolBar extends JToolBar {
78     private static final Logger LOGGER = Logger.getLogger(MapPaneToolBar.class
79     .getName());
80 alfonx 445
81 alfonx 244 public static String R(String key, Object... values) {
82 alfonx 886 return GeotoolsGUIUtil.R(key, values);
83 alfonx 244 }
84    
85     /** Constant for the tool "Panning" (10). */
86     public static final int TOOL_PAN = 10;
87     /** Constant for the tool "Info" (20). */
88     public static final int TOOL_INFO = 20;
89     public static final int SEPERATOR0 = 99;
90    
91     /** Constant for the tool "Zoom In" (110). */
92     public static final int TOOL_ZOOMIN = 110;
93 alfonx 680 public static final int ACTION_ZOOM_DEFAULT = 150;
94 alfonx 244 /** Constant for the tool "Zoom Out" (120). */
95     public static final int TOOL_ZOOMOUT = 120;
96     /** Constant for the action "Zoom back" (130). */
97     public static final int ACTION_ZOOM_BACK = 130;
98     /** Constant for the action "Zoom forward" (140). */
99     public static final int ACTION_ZOOM_FORWARD = 140;
100     public static final int SEPERATOR1 = 199;
101    
102     /**
103     * Constant for the tool "Selection Reset" which clears the selection (240).
104     */
105     public static final int TOOL_SELECTION_CLEAR = 240;
106    
107     /**
108     * Constant for the tool "Select" which sets the Selection to the selected
109     * features (210).
110     */
111     public static final int TOOL_SELECTION_SET = 210;
112     /**
113     * Constant for the tool "Selection add" which adds the features to the
114     * Selection (220).
115     */
116     public static final int TOOL_SELECTION_ADD = 220;
117     /**
118     * Constant for the tool "Selection subtract" which removes the selected
119     * features from the selection (230).
120     */
121     public static final int TOOL_SELECTION_REMOVE = 230;
122    
123 alfonx 297 public static final int ACTION_CHARTS = 401;
124    
125 alfonx 244 /** Tool currently selected */
126     protected int selectedTool = TOOL_ZOOMIN;
127    
128     /** Holds the tool buttons of the tool bar. */
129 alfonx 414 final protected SortedMap<Integer, JComponent> toolAndActionButtons = new TreeMap<Integer, JComponent>();
130 alfonx 244 /** Controls that only one tool button is activated. */
131     protected ButtonGroup toolButtonGroup = null;
132    
133     // SK: Musste ich ändern damit man Tools und Actions in der Reihenfolge
134     // mischen kann.
135     // /** Holds the action buttons of the bar. */
136     // protected SortedMap<Integer, JButton> actionButtons = null;
137    
138 alfonx 509 /** Holds the {@link SelectableXMapPane} this tool bar controls. */
139     protected SelectableXMapPane mapPane = null;
140 alfonx 244
141     /**
142     * A List to remember the last Envelopes that have been watched. Used for
143     * the zoomBack- and zoomForwardButtons *
144     */
145     protected ArrayList<Envelope> lastZooms = new ArrayList<Envelope>();
146     /** Holds the index to the current element in {@link #lastZooms}. */
147     protected int zoomBackIndex = 0;
148    
149     /** Listener to sniff the zoom actions on the map. */
150     protected JMapPaneListener mapPaneListener = null;
151    
152     protected boolean zoomBackForwardButtonInAction;
153    
154 alfonx 414 /** Listeners what want to be informed about a change of the selected tool **/
155     protected Set<MapPaneToolSelectedListener> toolSelectionListeners = new HashSet<MapPaneToolSelectedListener>();
156    
157 alfonx 445 /** This listener is added to all {@link JToggleButton} **/
158     private final ActionListener toolSelectedListener = new ActionListener() {
159 alfonx 414
160     @Override
161     public void actionPerformed(ActionEvent e) {
162     JToggleButton tb = (JToggleButton) e.getSource();
163 alfonx 445
164 alfonx 414 // Inform the listeners about a newly selected tool
165     for (MapPaneToolSelectedListener l : toolSelectionListeners) {
166 alfonx 445 l.toolSelected(Integer.valueOf(tb.getName()));
167 alfonx 414 }
168     }
169 alfonx 445
170 alfonx 414 };
171    
172 alfonx 244 /**
173     * Creates a new toolbar. Notice: This toolbar does nothing until
174 alfonx 509 * {@link #setMapPane(SelectableXMapPane)} is called!
175 alfonx 244 */
176     public MapPaneToolBar() {
177     this(null);
178     }
179 alfonx 445
180     public void addButtonSelectedListener(MapPaneToolSelectedListener listener) {
181 alfonx 414 toolSelectionListeners.add(listener);
182     }
183 alfonx 244
184 alfonx 445 public void removeButtonSelectedListener(
185     MapPaneToolSelectedListener listener) {
186     toolSelectionListeners.remove(listener);
187 alfonx 414 }
188    
189 alfonx 244 /**
190     * Creates a new tool bar.
191     *
192     * @param mapPane
193 alfonx 509 * {@link SelectableXMapPane} the tool bar controls
194 alfonx 244 */
195 alfonx 509 public MapPaneToolBar(SelectableXMapPane mapPane) {
196 alfonx 244 super("Control the map", JToolBar.HORIZONTAL);
197 alfonx 445
198     // I want to see nothing on the background
199 alfonx 417 setOpaque(false);
200     setBorder(null);
201 alfonx 445
202 alfonx 244 this.toolButtonGroup = new ButtonGroup();
203 alfonx 445
204 alfonx 244 // Create a Listener to listen to the zooms on the JMapPane
205     this.mapPaneListener = new JMapPaneListener() {
206 alfonx 740 public void performMapPaneEvent(XMapPaneEvent e) {
207 alfonx 244 if (!(e instanceof MapAreaChangedEvent))
208     return;
209    
210     if (zoomBackForwardButtonInAction) {
211     zoomBackForwardButtonInAction = false;
212     return;
213     }
214    
215     final MapAreaChangedEvent mapAreaChangedEvent = (MapAreaChangedEvent) e;
216     Envelope oldMapArea = mapAreaChangedEvent.getOldMapArea();
217 alfonx 445
218 alfonx 244 final Envelope mapArea = mapAreaChangedEvent.getNewMapArea();
219 alfonx 445 if (mapArea == null || mapArea.equals(oldMapArea)
220     || Double.isNaN(mapArea.getMinX())
221     || Double.isNaN(mapArea.getMaxX())
222     || Double.isNaN(mapArea.getMinY())
223     || Double.isNaN(mapArea.getMaxY())) {
224     // If the MapArea didn't change... we don't want to register
225     // it as a zoom action.
226 alfonx 244 return;
227     }
228 alfonx 445
229     if (lastZooms.size() == 0
230     && oldMapArea != null
231     && !oldMapArea.isNull()
232     && !(Double.isNaN(oldMapArea.getMinX())
233     || Double.isNaN(oldMapArea.getMaxX())
234     || Double.isNaN(oldMapArea.getMinY()) || Double
235     .isNaN(oldMapArea.getMaxY()))) {
236 alfonx 244 lastZooms.add(oldMapArea);
237     zoomBackIndex = 1;
238     }
239     if (mapArea == null)
240     return;
241    
242     if (lastZooms.size() > 0
243     && mapArea.equals(lastZooms.get(lastZooms.size() - 1))) {
244     // LOGGER.debug("MapAreaChangedEvent ausgelassen bei der Zaehlung der Zoomschritt weil identisch");
245     return;
246     }
247    
248     if (lastZooms.size() > 0)
249     while (zoomBackIndex < lastZooms.size())
250     lastZooms.remove(lastZooms.size() - 1);
251    
252     lastZooms.add(mapArea);
253     zoomBackIndex = lastZooms.size();
254     setButtonEnabled(ACTION_ZOOM_BACK, lastZooms.size() > 1);
255     setButtonEnabled(ACTION_ZOOM_FORWARD, false);
256     }
257     };
258    
259     setMapPane(mapPane);
260     setFloatable(false);
261     setRollover(true);
262    
263     init();
264     }
265    
266     /**
267 alfonx 509 * Sets the {@link SelectableXMapPane} controlled by this tool bar.
268 alfonx 244 *
269     * @param mapPane
270 alfonx 509 * {@link SelectableXMapPane} to control (if {@code null} this tool bar
271 alfonx 244 * controls NOTHING!)
272     */
273 alfonx 509 public void setMapPane(SelectableXMapPane mapPane) {
274 alfonx 244 // Remove listener from old MapPane
275     if (this.mapPane != null)
276     this.mapPane.removeMapPaneListener(mapPaneListener);
277     this.mapPane = mapPane;
278     if (this.mapPane != null && mapPaneListener != null)
279     this.mapPane.addMapPaneListener(mapPaneListener);
280     }
281    
282     /**
283     * Calls {@link #initToolsAndActions()} and {@link #initActions()} and then
284     * puts all tool buttons and all actions buttons to the tool bar.
285     */
286     protected void init() {
287 alfonx 445
288 alfonx 244 initToolsAndActions();
289    
290     addSeparator(SEPERATOR0, new JToolBar.Separator());
291     addSeparator(SEPERATOR1, new JToolBar.Separator());
292    
293     initToolBar();
294     }
295    
296     /**
297     * Creates the tool buttons and action buttons and seperators, adds them to
298     * {@link #toolAndActionButtons} and finally creates a button group for all
299     * tools. So sub-classes which override this method should FIRST add their
300     * new tool buttons to {@link #toolAndActionButtons} before calling {@code
301     * super.initTools()}.
302     */
303     protected void initToolsAndActions() {
304     // Panning
305 alfonx 653 // addTool(new MapPaneToolBarAction(TOOL_PAN, this, "", new ImageIcon(
306     // MapView.class.getResource("resource/icons/pan.png")),
307     // R("MapPaneButtons.Pan.TT")), false);
308    
309     addTool(new MapPaneToolBarAction(TOOL_PAN, this, XMapPaneTool.PAN), false);
310    
311 alfonx 244 // Info
312 alfonx 653 // addTool(new MapPaneToolBarAction(TOOL_INFO, this, "", new ImageIcon(
313     // MapView.class.getResource("resource/icons/info.png")),
314     // R("MapPaneButtons.Info.TT")), false);
315     addTool(new MapPaneToolBarAction(TOOL_INFO, this, XMapPaneTool.INFO), false);
316 alfonx 680
317 alfonx 244 // Zoom in
318 alfonx 653 addTool(new MapPaneToolBarAction(TOOL_ZOOMIN, this, XMapPaneTool.ZOOM_IN), false);
319    
320 alfonx 244 // Zoom out
321 alfonx 653 addTool(new MapPaneToolBarAction(TOOL_ZOOMOUT, this, XMapPaneTool.ZOOM_OUT), false);
322    
323    
324     // // Zoom in
325     // addTool(new MapPaneToolBarAction(TOOL_ZOOMIN, this, "", new ImageIcon(
326     // MapView.class.getResource("resource/icons/zoom_in.png")),
327     // R("MapPaneButtons.ZoomIn.TT")), false);
328     //
329     // // Zoom out
330     // addTool(new MapPaneToolBarAction(TOOL_ZOOMOUT, this, "", new ImageIcon(
331     // MapView.class.getResource("resource/icons/zoom_out.png")),
332     // R("MapPaneButtons.ZoomOut.TT")), false);
333    
334    
335 alfonx 244
336     // Action button to revert the last zoom
337     addAction(new MapPaneToolBarAction(ACTION_ZOOM_BACK, this, "",
338     new ImageIcon(MapView.class
339 alfonx 445 .getResource("resource/icons/zoom_back.png")),
340     R("MapPaneButtons.LastZoom.TT")), false);
341 alfonx 244 setButtonEnabled(ACTION_ZOOM_BACK, false);
342    
343     // Action button to redo the last zoom
344     addAction(new MapPaneToolBarAction(ACTION_ZOOM_FORWARD, this, "",
345     new ImageIcon(MapView.class
346 alfonx 445 .getResource("resource/icons/zoom_forward.png")),
347     R("MapPaneButtons.NextZoom.TT")), false);
348 alfonx 244 setButtonEnabled(ACTION_ZOOM_FORWARD, false);
349    
350     // set the selected tool enabled
351     setSelectedTool(selectedTool);
352    
353     }
354 alfonx 445
355 alfonx 417 @Override
356     public void paint(Graphics g) {
357     super.paint(g);
358     }
359 alfonx 244
360     /**
361     * Clears the GUI of all components and adds all tool and action buttons to
362     * the tool bar.
363     */
364     public void initToolBar() {
365 alfonx 445 // setOpaque(true);
366     //
367     // setAlignmentY(1f);
368     // setAlignmentX(0.5f);
369 alfonx 244 removeAll();
370 alfonx 445
371     // // Separator to the left of the tool actions to start
372     // // the tool buttons with the map (not with the coordinate grid)
373     // Dimension dimension = new Dimension(49, 10);
374     // addSeparator(dimension);
375    
376 alfonx 244 // Tool buttons
377 alfonx 414 for (Integer bKey : toolAndActionButtons.keySet()) {
378 alfonx 445
379 alfonx 414 JComponent b = toolAndActionButtons.get(bKey);
380 alfonx 445
381 alfonx 414 if (b instanceof JToggleButton) {
382     JToggleButton tb = (JToggleButton) b;
383     tb.setName(bKey.toString());
384 alfonx 445 tb.addActionListener(toolSelectedListener);
385 alfonx 414 }
386 alfonx 445
387 alfonx 244 add(b);
388 alfonx 414 }
389 alfonx 244
390     if (!toolAndActionButtons.containsKey(selectedTool)) {
391     /**
392     * This might be a bit specific, but IF selection buttons are
393     * available, select one of them.. if not, select the INFO tool.
394     */
395    
396     if (toolAndActionButtons.containsKey(TOOL_SELECTION_SET)) {
397     setSelectedTool(TOOL_SELECTION_SET);
398     } else if (toolAndActionButtons.containsKey(TOOL_INFO)) {
399     setSelectedTool(TOOL_INFO);
400     } else {
401     // TODO What to do now?!
402     setSelectedTool(null);
403     }
404    
405     }
406 alfonx 445
407 alfonx 244 revalidate();
408     repaint();
409     }
410    
411     // Space between tool buttons and action buttons
412     // SK: Seperators are now als manages like actions and tools
413     // Dimension dimension2 = new Dimension( 10,10);
414     // this.addSeparator(dimension2);
415    
416     // // Action buttons
417     // for (JButton b : actionButtons.values())
418     // add(b);
419     // }
420    
421     /**
422     * Performs the activation of a tool.
423     *
424     * @param tool
425     * the tool to activate
426     * @param e
427     * the event of the button
428     */
429     public void performToolButton(int tool, ActionEvent e) {
430     if (mapPane == null)
431     return;
432    
433     selectedTool = tool;
434    
435     switch (tool) {
436     case TOOL_PAN:
437     // Set the mouse tool to "Panning"
438 alfonx 653 // mapPane.setState(SelectableXMapPane.PAN);
439     mapPane.setTool(XMapPaneTool.PAN);
440 alfonx 509 // mapPane.setNormalCursor(SwingUtil.PAN_CURSOR);
441 alfonx 244 break;
442     case TOOL_INFO:
443     // Set the mouse tool to "Info"
444 alfonx 653 mapPane.setTool(XMapPaneTool.INFO);
445     // mapPane.setState(SelectableXMapPane.SELECT_ONE_FROM_TOP);
446 alfonx 509 // mapPane.setNormalCursor(SwingUtil.CROSSHAIR_CURSOR);
447 alfonx 244 break;
448     case TOOL_ZOOMIN:
449     // Set the mouse tool to "Zoom in"
450 alfonx 653 mapPane.setTool(XMapPaneTool.ZOOM_IN);
451 alfonx 509 // mapPane.setNormalCursor(SwingUtil.ZOOMIN_CURSOR);
452 alfonx 244 break;
453     case TOOL_ZOOMOUT:
454     // Set the mouse tool to "Zoom out"
455 alfonx 653 mapPane.setTool(XMapPaneTool.ZOOM_OUT);
456     // mapPane.setState(SelectableXMapPane.ZOOM_OUT);
457 alfonx 509 // mapPane.setNormalCursor(SwingUtil.ZOOMOUT_CURSOR);
458 alfonx 244 break;
459 alfonx 654 // default:
460 alfonx 244 // Set map actions to default
461 alfonx 654 // mapPane.setState(SelectableXMapPane.NONE);
462 alfonx 509 // mapPane.setNormalCursor(null);
463 alfonx 654 // break;
464 alfonx 244 }
465 alfonx 509 // mapPane.updateCursorAndRepaintTimer();
466 alfonx 244 }
467    
468     /**
469     * @param id
470     * The ID of the Component to remove. The change will not be
471     * visible until {@link #initToolBar()} is called.
472     * @return <code>null</code> or the component that has been removed.
473     */
474     public JComponent removeId(int id) {
475     return toolAndActionButtons.remove(id);
476     }
477    
478     /**
479     * Performs the action of an action button.
480     *
481     * @param tool
482     * the action
483     * @param e
484     * the event of the button
485     */
486     protected void performActionButton(int action, ActionEvent e) {
487     if (mapPane == null)
488     return;
489 alfonx 680
490 alfonx 244 // Perform the action "Zoom back": Revert the last zoom
491     if (action == ACTION_ZOOM_BACK) {
492     if (zoomBackIndex <= 1)
493     return;
494    
495     zoomBackForwardButtonInAction = true;
496     zoomBackIndex--;
497     getButton(ACTION_ZOOM_FORWARD).setEnabled(true);
498     getButton(ACTION_ZOOM_BACK).setEnabled(zoomBackIndex > 1);
499    
500     mapPane.setMapArea(lastZooms.get(zoomBackIndex - 1));
501     mapPane.refresh();
502     }
503    
504     // Perform the action "Zoom forward": Re-do the last zoom
505     if (action == ACTION_ZOOM_FORWARD) {
506     if (zoomBackIndex < lastZooms.size()) {
507     zoomBackForwardButtonInAction = true;
508     zoomBackIndex++;
509     getButton(ACTION_ZOOM_BACK).setEnabled(true);
510     getButton(ACTION_ZOOM_FORWARD).setEnabled(
511     zoomBackIndex < lastZooms.size());
512    
513     mapPane.setMapArea(lastZooms.get(zoomBackIndex - 1));
514     mapPane.refresh();
515     }
516     }
517     }
518    
519     /**
520     * Adds a tool to the tool bar. Does nothing if a tool or action with the
521     * specified ID already exists!
522     *
523     * @param buttonAction
524     * action for the toggle button
525     * @param resetToolBar
526     * indicates whether the toolbar GUI is reset after adding the
527     * button (if adding several actions it useful only to reset the
528     * GUI for the last added tool)
529     */
530     public void addTool(MapPaneToolBarAction buttonAction, boolean resetToolBar) {
531     if (isButtonIDUsed(buttonAction.getID())) {
532     LOGGER
533     .warn("addTool(.) ignored because ID already used for tool or action: "
534     + buttonAction.getID());
535     return;
536     }
537 alfonx 486 JToggleButton button = new SmallToggleButton(buttonAction);
538    
539     // button.setBorder(BorderFactory.createRaisedBevelBorder());
540 alfonx 244 toolButtonGroup.add(button);
541     toolAndActionButtons.put(buttonAction.getID(), button);
542     if (resetToolBar)
543     initToolBar();
544     }
545    
546     /**
547     * Adds a tool to the tool bar and resets the toolbar GUI.
548     *
549     * @param buttonAction
550     * action for the toggle button
551     */
552     public void addTool(MapPaneToolBarAction buttonAction) {
553     addTool(buttonAction, true);
554     }
555    
556     /**
557     * Adds an action to the tool bar. Does nothing if a tool or action with the
558     * specified ID already exists!
559     *
560     * @param buttonAction
561     * action for the button
562     * @param resetToolBar
563     * indicates whether the toolbar GUI is reset after adding the
564     * button (if adding several actions it useful only to reset the
565     * GUI for the last added tool)
566     */
567     public void addAction(MapPaneToolBarAction buttonAction,
568     boolean resetToolBar) {
569     if (isButtonIDUsed(buttonAction.getID())) {
570     LOGGER
571     .warn("addAction(.) ignored because ID already used for tool or action: "
572     + buttonAction.getID());
573     return;
574     }
575 alfonx 486 JButton button = new SmallButton(buttonAction);
576     // button.setBorder(BorderFactory.createRaisedBevelBorder());
577 alfonx 244 toolAndActionButtons.put(buttonAction.getID(), button);
578     if (resetToolBar)
579     initToolBar();
580     }
581 alfonx 445
582 alfonx 297 /**
583 alfonx 445 * Adds any JComponent to the tool bar. Does nothing if a tool or action
584     * with the specified ID already exists!
585 alfonx 297 *
586 alfonx 445 * @param component
587     * A {@link JComponent} that shall be added
588     * @param id
589     * The ID associaded with the {@link JComponent}
590 alfonx 297 * @param resetToolBar
591     * indicates whether the toolbar GUI is reset after adding the
592     * button (if adding several actions it useful only to reset the
593     * GUI for the last added tool)
594     */
595 alfonx 445 public void addJComponent(JComponent component, int id, boolean resetToolBar) {
596 alfonx 244
597 alfonx 297 if (isButtonIDUsed(id)) {
598     LOGGER
599 alfonx 445 .warn("addAction(.) ignored because ID already used for tool or action: "
600     + id);
601 alfonx 297 return;
602     }
603 alfonx 445
604 alfonx 297 toolAndActionButtons.put(id, component);
605     if (resetToolBar)
606     initToolBar();
607     }
608    
609 alfonx 244 public void addSeparator(int id, Separator separator) {
610     if (isButtonIDUsed(id)) {
611     LOGGER
612     .warn("addSeparator(.) ignored because ID already used for tool or action. ");
613     return;
614     }
615     toolAndActionButtons.put(id, separator);
616     }
617    
618     /**
619     * Adds an action to the tool bar and resets the toolbar GUI.
620     *
621     * @param buttonAction
622     * action for the toggle button
623     */
624     public void addAction(MapPaneToolBarAction buttonAction) {
625     addAction(buttonAction, true);
626     }
627    
628     /**
629     * Returns the button for a specific tool or action.
630     *
631     * @param id
632     * the constant for any button in the {@link MapPaneToolBar}
633     * @return a {@link JButton} if {@code id} specifies an
634     * {@linkplain #getActionButton(int) action button} or
635     * {@link JToogleButton} if {@code id} specifies a
636     * {@linkplain #getToolButton(int) tool button}
637     */
638     public AbstractButton getButton(int id) {
639 alfonx 655
640     //ACHUTNG: Das ist ein SK QUICK FIX! TODO
641     if (!(toolAndActionButtons.get(id) instanceof AbstractButton)) return null;
642    
643 alfonx 244 AbstractButton button = (AbstractButton) toolAndActionButtons.get(id);
644     if (button == null)
645     LOGGER.warn("Unknown tool or action ID: " + id);
646     return button;
647     }
648    
649     /**
650     * Returns the button for a specific tool.
651     *
652     * @param tool
653     * the constant for a tool
654     */
655     public JToggleButton getToolButton(int tool) {
656     AbstractButton button = getButton(tool);
657     if (button != null && !(button instanceof JToggleButton)) {
658     LOGGER.warn("ID specifies no tool: " + tool);
659     button = null;
660     }
661     return (JToggleButton) button;
662     }
663    
664     /**
665     * Returns the button for a specific action.
666     *
667     * @param action
668     * the constant an action
669     */
670     public JButton getActionButton(int action) {
671     AbstractButton button = getButton(action);
672     if (button != null && !(button instanceof JButton)) {
673     LOGGER.warn("ID specifies no action: " + action);
674     button = null;
675     }
676     return (JButton) button;
677    
678     }
679    
680     /**
681     * Sets the selected tool.
682     *
683     * @param tool
684     * ID of the tool
685     */
686     public void setSelectedTool(Integer tool) {
687     if (tool == null)
688     toolButtonGroup.setUnselected();
689    
690     JToggleButton button = getToolButton(tool);
691     if (button == null)
692     return;
693     button.setSelected(true);
694     button.getAction().actionPerformed(null);
695    
696     selectedTool = tool;
697     }
698    
699     /**
700     * Returns the selected tool.
701     *
702     * @return -1 if no tool is active
703     */
704     public int getSelectedTool() {
705     if (toolButtonGroup.getSelectedButton() == null)
706     return -1;
707     return selectedTool;
708     }
709 alfonx 653
710 alfonx 244 /**
711     * Sets whether a tool or action is activated or not. The visible property
712     * of the button is not affected.
713     *
714     * @param id
715     * tool or actionID
716     * @param enabled
717     * if {@code true} the tool becomes available
718     */
719     public void setButtonEnabled(int id, boolean enabled) {
720     AbstractButton button = getButton(id);
721     if (button == null)
722     return;
723     button.setEnabled(enabled);
724     }
725    
726     /**
727     * Sets whether a tool or action is activated or not.
728     *
729     * @param id
730     * tool or actionID
731     * @param enabled
732     * if {@code true} the tool becomes available
733     * @param hideOnDisable
734     * if {@code true} the button is also hidden if {@code enabled}
735     * is {@code false}
736     */
737     public void setButtonEnabled(int id, boolean enabled, boolean hideOnDisable) {
738     AbstractButton button = getButton(id);
739     if (button == null)
740     return;
741     button.setEnabled(enabled);
742     // if button is enabled, it becomes visible anyway
743     // if button is disabled and the "hide" option is set, it is also hidden
744     if (enabled)
745     button.setVisible(true);
746     else
747     button.setVisible(!hideOnDisable);
748     }
749    
750     /**
751     * Checks whether a ID is already used for a tool or action.
752     *
753     * @param tool
754     * tool ID
755     */
756     public boolean isButtonIDUsed(int id) {
757     return toolAndActionButtons.get(id) != null;
758     }
759    
760     /**
761     * Checks whether a tool is activated.
762     *
763     * @param tool
764     * tool ID
765     * @return {@code false} if an unknown ID is specified
766     */
767     public boolean isButtonEnabled(int id) {
768     AbstractButton button = getButton(id);
769     if (button != null)
770     return button.isEnabled();
771     return false;
772     }
773    
774     /**
775     * Sets the activation for all tools.
776     *
777     * @param enabled
778     * if {@code true} all tools becomes available
779     * @param hideOnDisable
780     * if {@code true} the buttons are also hidden if {@code enabled}
781     * is {@code false}
782     */
783     public void setAllToolsEnabled(boolean enabled, boolean hideOnDisable) {
784 alfonx 655 for (int id : toolAndActionButtons.keySet()) {
785     if (toolAndActionButtons.get(id) instanceof JToggleButton) {
786     setButtonEnabled(id, enabled, hideOnDisable);
787     }
788     }
789 alfonx 244 }
790 alfonx 655
791 alfonx 244 /**
792     * Sets the activation for all actions.
793     *
794     * @param enabled
795     * if {@code true} all actions becomes available
796     * @param hideOnDisable
797     * if {@code true} the buttons are also hidden if {@code enabled}
798     * is {@code false}
799     */
800     public void setAllActionsEnabled(boolean enabled, boolean hideOnDisable) {
801     for (int id : toolAndActionButtons.keySet()) {
802     if (toolAndActionButtons.get(id) instanceof JButton) {
803     setButtonEnabled(id, enabled, hideOnDisable);
804     }
805     }
806    
807     }
808    
809     /**
810     * Returns the maximum ID of tools.
811     */
812     public int getMaxToolID() {
813     return toolAndActionButtons.lastKey();
814     }
815    
816     /**
817     * Returns the minimum ID of tools.
818     */
819     public int getMinToolID() {
820     return toolAndActionButtons.firstKey();
821     }
822    
823     /**
824     * Extends the {@link AbstractAction} with maintaining an ID and the
825     * {@link MapPaneToolBar} the actions controls. Additionally this class
826     * automatically calls
827     * {@link MapPaneToolBar#performToolButton(int, ActionEvent)} or
828     * {@link MapPaneToolBar#performActionButton(int, ActionEvent)} depending on
829     * whether the action is added via
830     * {@link MapPaneToolBar#addTool(MapPaneToolBarAction)} or
831     * {@link MapPaneToolBar#addAction(MapPaneToolBarAction)}.
832     *
833     * @author <a href="mailto:[email protected]">Martin Schmitz</a>
834     * (University of Bonn/Germany)
835     */
836     public static class MapPaneToolBarAction extends AbstractAction {
837     /** The ID of the action */
838     protected int id = -1;
839     /** The tool bar, this action is made for. */
840     protected MapPaneToolBar toolBar = null;
841    
842     /**
843     * Creates a new action with a dummy description and no icon.
844     *
845     * @param id
846     * unique ID for the action
847     * @param toolBar
848     * toolbar this action is made for
849     */
850     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar) {
851     this(id, toolBar, "" + id);
852     }
853    
854     /**
855     * Creates a new action without an icon.
856     *
857     * @param id
858     * unique ID for the action
859     * @param toolBar
860     * toolbar this action is made for
861     * @param name
862     * description used for buttons or menus
863     */
864     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar, String name) {
865     this(id, toolBar, name, null);
866     }
867    
868     /**
869     * Creates a new action.
870     *
871     * @param id
872     * unique ID for the action
873     * @param toolBar
874     * toolbar this action is made for
875     * @param name
876     * description used for buttons or menus
877     * @param icon
878     * icon used for buttons or menus
879     */
880     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar,
881     String name, Icon icon) {
882 alfonx 445 this(id, toolBar, name, icon, null);
883 alfonx 244 }
884 alfonx 445
885 alfonx 244 /**
886     * Creates a new action.
887     *
888     * @param id
889     * unique ID for the action
890     * @param toolBar
891     * The {@link MapPaneToolBar} this action is made for
892     * @param name
893     * description used for buttons or menus
894     * @param icon
895     * icon used for buttons or menus
896     * @param toolTip
897     * Tooltip to use for the button or menu
898     */
899     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar,
900     String name, Icon icon, String toolTip) {
901     super(name, icon);
902 alfonx 445
903     if (toolTip != null && !toolTip.trim().isEmpty()) {
904 alfonx 244 putValue(Action.SHORT_DESCRIPTION, toolTip);
905     }
906 alfonx 445
907 alfonx 244 this.id = id;
908     this.toolBar = toolBar;
909     }
910    
911 alfonx 653 public MapPaneToolBarAction(int id, MapPaneToolBar toolBar, XMapPaneTool tool) {
912 alfonx 656 this(id, toolBar, "", tool.getIcon(), tool.getToolTip());
913 alfonx 653 }
914    
915 alfonx 244 /**
916     * Calls {@link MapPaneToolBar#performToolButton(int, ActionEvent)} or
917     * {@link MapPaneToolBar#performActionButton(int, ActionEvent)}
918     * depending on whether the action is added to the toolbar via
919     * {@link MapPaneToolBar#addTool(MapPaneToolBarAction)} or
920     * {@link MapPaneToolBar#addAction(MapPaneToolBarAction)}.
921     */
922     public void actionPerformed(ActionEvent e) {
923     if (toolBar.toolAndActionButtons.get(id) instanceof JToggleButton)
924     toolBar.performToolButton(id, e);
925     else if (toolBar.toolAndActionButtons.get(id) instanceof JButton)
926     toolBar.performActionButton(id, e);
927     }
928    
929     /**
930     * Returns the (unique) id of this action.
931     *
932     * @return
933     */
934     public int getID() {
935     return id;
936     }
937     }
938 alfonx 414
939 alfonx 445 /**
940     * Nuetzlich wenn die Componente gedruckt (z.B. wenn ein Screenshot gemacht
941     * wird) wird. Dann werden wird der Hintergrund auf WEISS gesetzt.
942     *
943     * @author <a href="mailto:[email protected]">Stefan Alfons
944 alfonx 888 * Tzeggai</a>
945 alfonx 445 */
946     @Override
947     public void print(Graphics g) {
948     Color orig = getBackground();
949     setBackground(Color.WHITE);
950     // wrap in try/finally so that we always restore the state
951     try {
952     super.print(g);
953     } finally {
954     setBackground(orig);
955     }
956     }
957    
958 alfonx 244 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26