/[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 180 - (hide annotations)
Thu Jul 2 14:44:57 2009 UTC (15 years, 8 months ago) by alfonx
File size: 25155 byte(s)
* Added a special @Override paint() method to some of the GeoMapPane's components, so that when we create a screenshot in the Atlas, the backgrounds (of the GridPanel for example) will be white and not gray - that is much better for printing.
* Some more i8n n French
1 mojays 2 package skrueger.geotools;
2    
3 alfonx 180 import java.awt.Color;
4 mojays 2 import java.awt.Dimension;
5 alfonx 180 import java.awt.Graphics;
6 mojays 2 import java.awt.event.ActionEvent;
7     import java.util.ArrayList;
8 alfonx 152 import java.util.Locale;
9 mojays 2 import java.util.SortedMap;
10     import java.util.TreeMap;
11    
12     import javax.swing.AbstractAction;
13     import javax.swing.AbstractButton;
14 alfonx 151 import javax.swing.Action;
15 mojays 2 import javax.swing.BorderFactory;
16     import javax.swing.Icon;
17     import javax.swing.ImageIcon;
18     import javax.swing.JButton;
19 alfonx 111 import javax.swing.JComponent;
20 mojays 2 import javax.swing.JToggleButton;
21     import javax.swing.JToolBar;
22    
23     import org.apache.log4j.Logger;
24    
25     import schmitzm.geotools.gui.JMapPane;
26     import schmitzm.geotools.map.event.JMapPaneEvent;
27     import schmitzm.geotools.map.event.JMapPaneListener;
28     import schmitzm.geotools.map.event.MapAreaChangedEvent;
29 alfonx 152 import schmitzm.lang.LangUtil;
30     import schmitzm.lang.ResourceProvider;
31 mojays 2 import schmitzm.swing.ButtonGroup;
32     import schmitzm.swing.SwingUtil;
33    
34     import com.vividsolutions.jts.geom.Envelope;
35    
36     /**
37 alfonx 140 * A toolbar to control an {@link JMapPane} (Atlas visualization). This contains
38     * two types of buttons. A group of <i>tools</i> for the mouse actions on the
39     * map represented by {@link JToggleButton JToggleButtons}, where only one tool
40     * can be activated every time. And some (general) <i>actions</i>, represented
41     * by normal {@link JButton JButtons}.
42     *
43     * @author <a href="mailto:[email protected]">Martin Schmitz</a>
44     * (University of Bonn/Germany)
45 alfonx 111 * @version 1.2 Stefan Krüger
46 mojays 2 */
47     public class MapPaneToolBar extends JToolBar {
48 alfonx 140 private static final Logger LOGGER = Logger.getLogger(MapPaneToolBar.class
49     .getName());
50 alfonx 152
51     public static ResourceProvider RESOURCE = new ResourceProvider(LangUtil
52     .extendPackagePath(MapPaneToolBar.class,
53     "resource.locales.mapPaneToolbar"), Locale.ENGLISH);
54    
55     public static String R(String key, Object... values) {
56     return RESOURCE.getString(key, values);
57     }
58    
59 mojays 2 /** Constant for the tool "Panning" (10). */
60     public static final int TOOL_PAN = 10;
61     /** Constant for the tool "Info" (20). */
62     public static final int TOOL_INFO = 20;
63 alfonx 111 public static final int SEPERATOR0 = 99;
64 alfonx 140
65 alfonx 111 /** Constant for the tool "Zoom In" (110). */
66     public static final int TOOL_ZOOMIN = 110;
67     /** Constant for the tool "Zoom Out" (120). */
68     public static final int TOOL_ZOOMOUT = 120;
69     /** Constant for the action "Zoom back" (130). */
70     public static final int ACTION_ZOOM_BACK = 130;
71     /** Constant for the action "Zoom forward" (140). */
72     public static final int ACTION_ZOOM_FORWARD = 140;
73     public static final int SEPERATOR1 = 199;
74 alfonx 140
75     /**
76     * Constant for the tool "Selection Reset" which clears the selection (240).
77     */
78     public static final int TOOL_SELECTION_CLEAR = 240;
79    
80     /**
81     * Constant for the tool "Select" which sets the Selection to the selected
82     * features (210).
83     */
84 alfonx 111 public static final int TOOL_SELECTION_SET = 210;
85 alfonx 140 /**
86     * Constant for the tool "Selection add" which adds the features to the
87     * Selection (220).
88     */
89 alfonx 111 public static final int TOOL_SELECTION_ADD = 220;
90 alfonx 140 /**
91     * Constant for the tool "Selection subtract" which removes the selected
92     * features from the selection (230).
93     */
94 alfonx 111 public static final int TOOL_SELECTION_REMOVE = 230;
95 mojays 2
96     /** Tool currently selected */
97 alfonx 140 protected int selectedTool = TOOL_ZOOMIN;
98 mojays 2
99 alfonx 140 /** Holds the tool buttons of the tool bar. */
100     protected SortedMap<Integer, JComponent> toolAndActionButtons = null;
101     /** Controls that only one tool button is activated. */
102     protected ButtonGroup toolButtonGroup = null;
103 mojays 2
104 alfonx 140 // SK: Musste ich ändern damit man Tools und Actions in der Reihenfolge
105     // mischen kann.
106     // /** Holds the action buttons of the bar. */
107     // protected SortedMap<Integer, JButton> actionButtons = null;
108    
109 mojays 2 /** Holds the {@link JMapPane} this tool bar controls. */
110     protected JMapPane mapPane = null;
111    
112     /**
113     * A List to remember the last Envelopes that have been watched. Used for
114     * the zoomBack- and zoomForwardButtons *
115     */
116     protected ArrayList<Envelope> lastZooms = new ArrayList<Envelope>();
117     /** Holds the index to the current element in {@link #lastZooms}. */
118     protected int zoomBackIndex = 0;
119    
120     /** Listener to sniff the zoom actions on the map. */
121     protected JMapPaneListener mapPaneListener = null;
122 alfonx 140
123 mojays 2 protected boolean zoomBackForwardButtonInAction;
124    
125 alfonx 140 /**
126     * Creates a new toolbar. Notice: This toolbar does nothing until
127     * {@link #setMapPane(JMapPane)} is called!
128     */
129     public MapPaneToolBar() {
130     this(null);
131     }
132    
133     /**
134 mojays 2 * Creates a new tool bar.
135 alfonx 140 *
136     * @param mapPane
137     * {@link JMapPane} the tool bar controls
138 mojays 2 */
139     public MapPaneToolBar(JMapPane mapPane) {
140 alfonx 140 super("Control the map", JToolBar.HORIZONTAL);
141     this.toolAndActionButtons = new TreeMap<Integer, JComponent>();
142     this.toolButtonGroup = new ButtonGroup();
143 alfonx 152
144     // Create a Listener to listen to the zooms on the JMapPane
145 alfonx 140 this.mapPaneListener = new JMapPaneListener() {
146     public void performMapPaneEvent(JMapPaneEvent e) {
147     if (!(e instanceof MapAreaChangedEvent))
148     return;
149 mojays 2
150 alfonx 140 if (zoomBackForwardButtonInAction) {
151     zoomBackForwardButtonInAction = false;
152     return;
153     }
154 mojays 2
155 alfonx 152 final MapAreaChangedEvent mapAreaChangedEvent = (MapAreaChangedEvent) e;
156     Envelope oldMapArea = mapAreaChangedEvent.getOldMapArea();
157    
158     final Envelope mapArea = mapAreaChangedEvent.getNewMapArea();
159     if (mapArea == null || mapArea.equals(oldMapArea) ) {
160     // If the MapArea didn't change... we don't want to register it as a zoom action.
161     return;
162     }
163    
164 alfonx 140 if (lastZooms.size() == 0 && oldMapArea != null) {
165     lastZooms.add(oldMapArea);
166     zoomBackIndex = 1;
167     }
168     if (mapArea == null)
169     return;
170    
171     if (lastZooms.size() > 0
172     && mapArea.equals(lastZooms.get(lastZooms.size() - 1))) {
173     // LOGGER.debug("MapAreaChangedEvent ausgelassen bei der Zaehlung der Zoomschritt weil identisch");
174     return;
175     }
176    
177     if (lastZooms.size() > 0)
178     while (zoomBackIndex < lastZooms.size())
179     lastZooms.remove(lastZooms.size() - 1);
180    
181     lastZooms.add(mapArea);
182     zoomBackIndex = lastZooms.size();
183     setButtonEnabled(ACTION_ZOOM_BACK, lastZooms.size() > 1);
184     setButtonEnabled(ACTION_ZOOM_FORWARD, false);
185     }
186     };
187    
188     setMapPane(mapPane);
189     setFloatable(false);
190     setRollover(true);
191    
192     init();
193 mojays 2 }
194 alfonx 140
195 mojays 2 /**
196     * Sets the {@link JMapPane} controlled by this tool bar.
197 alfonx 140 *
198     * @param mapPane
199     * {@link JMapPane} to control (if {@code null} this tool bar
200     * controls NOTHING!)
201 mojays 2 */
202     public void setMapPane(JMapPane mapPane) {
203 alfonx 140 // Remove listener from old MapPane
204     if (this.mapPane != null)
205     this.mapPane.removeMapPaneListener(mapPaneListener);
206     this.mapPane = mapPane;
207     if (this.mapPane != null && mapPaneListener != null)
208     this.mapPane.addMapPaneListener(mapPaneListener);
209 mojays 2 }
210 alfonx 140
211 mojays 2 /**
212 alfonx 140 * Calls {@link #initToolsAndActions()} and {@link #initActions()} and then
213     * puts all tool buttons and all actions buttons to the tool bar.
214 mojays 2 */
215     protected void init() {
216 alfonx 140 initToolsAndActions();
217    
218     addSeparator(SEPERATOR0, new JToolBar.Separator());
219     addSeparator(SEPERATOR1, new JToolBar.Separator());
220    
221     initToolBar();
222 mojays 2 }
223    
224     /**
225 alfonx 140 * Creates the tool buttons and action buttons and seperators, adds them to
226     * {@link #toolAndActionButtons} and finally creates a button group for all
227     * tools. So sub-classes which override this method should FIRST add their
228     * new tool buttons to {@link #toolAndActionButtons} before calling {@code
229     * super.initTools()}.
230 mojays 2 */
231 alfonx 111 protected void initToolsAndActions() {
232 alfonx 140 // Panning
233     addTool(new MapPaneToolBarAction(TOOL_PAN, this, "", new ImageIcon(
234 alfonx 152 MapView.class.getResource("resource/icons/pan.png")), R("MapPaneButtons.Pan.TT")), false);
235 alfonx 140 // Info
236     addTool(new MapPaneToolBarAction(TOOL_INFO, this, "", new ImageIcon(
237 alfonx 152 MapView.class.getResource("resource/icons/info.png")),R("MapPaneButtons.Info.TT")), false);
238 alfonx 128
239 alfonx 140 // Zoom in
240     addTool(new MapPaneToolBarAction(TOOL_ZOOMIN, this, "", new ImageIcon(
241 alfonx 152 MapView.class.getResource("resource/icons/zoom_in.png")), R("MapPaneButtons.ZoomIn.TT")),
242 alfonx 140 false);
243     // Zoom out
244     addTool(new MapPaneToolBarAction(TOOL_ZOOMOUT, this, "", new ImageIcon(
245 alfonx 152 MapView.class.getResource("resource/icons/zoom_out.png")), R("MapPaneButtons.ZoomOut.TT")),
246 alfonx 140 false);
247 alfonx 128
248 alfonx 140 // Action button to revert the last zoom
249     addAction(new MapPaneToolBarAction(ACTION_ZOOM_BACK, this, "",
250     new ImageIcon(MapView.class
251 alfonx 152 .getResource("resource/icons/zoom_back.png")), R("MapPaneButtons.LastZoom.TT")), false);
252 alfonx 140 setButtonEnabled(ACTION_ZOOM_BACK, false);
253 mojays 2
254 alfonx 140 // Action button to redo the last zoom
255     addAction(new MapPaneToolBarAction(ACTION_ZOOM_FORWARD, this, "",
256     new ImageIcon(MapView.class
257 alfonx 152 .getResource("resource/icons/zoom_forward.png")), R("MapPaneButtons.NextZoom.TT")),
258 alfonx 140 false);
259     setButtonEnabled(ACTION_ZOOM_FORWARD, false);
260    
261     // set the selected tool enabled
262     setSelectedTool(selectedTool);
263    
264 alfonx 111 }
265 alfonx 48
266 alfonx 140 /**
267     * Clears the GUI of all components and adds all tool and action buttons to
268     * the tool bar.
269     */
270 alfonx 141 public void initToolBar() {
271 alfonx 140 setAlignmentY(1f);
272     removeAll();
273     // Separator to the left of the tool actions to start
274     // the tool buttons with the map (not with the coordinate grid)
275     Dimension dimension = new Dimension(49, 10);
276     addSeparator(dimension);
277     // Tool buttons
278     for (JComponent b : toolAndActionButtons.values())
279     add(b);
280 alfonx 141
281     if (!toolAndActionButtons.containsKey(selectedTool)) {
282     /**
283     * This might be a bit specific, but IF selection buttons are
284     * available, select one of them.. if not, select the INFO tool.
285     */
286    
287     if (toolAndActionButtons.containsKey(TOOL_SELECTION_SET)) {
288     setSelectedTool(TOOL_SELECTION_SET);
289     } else if (toolAndActionButtons.containsKey(TOOL_INFO)) {
290     setSelectedTool(TOOL_INFO);
291     } else {
292     // TODO What to do now?!
293     setSelectedTool(null);
294     }
295    
296     }
297 alfonx 160
298     revalidate();
299 alfonx 177 repaint();
300 alfonx 140 }
301 alfonx 111
302 alfonx 140 // Space between tool buttons and action buttons
303     // SK: Seperators are now als manages like actions and tools
304     // Dimension dimension2 = new Dimension( 10,10);
305     // this.addSeparator(dimension2);
306    
307     // // Action buttons
308     // for (JButton b : actionButtons.values())
309     // add(b);
310     // }
311    
312 alfonx 111 /**
313 mojays 2 * Performs the activation of a tool.
314 alfonx 140 *
315     * @param tool
316     * the tool to activate
317     * @param e
318     * the event of the button
319 mojays 2 */
320     public void performToolButton(int tool, ActionEvent e) {
321 alfonx 140 if (mapPane == null)
322     return;
323    
324     selectedTool = tool;
325    
326     switch (tool) {
327     case TOOL_PAN:
328     // Set the mouse tool to "Panning"
329     mapPane.setWindowSelectionState(JMapPane.NONE);
330     mapPane.setState(JMapPane.PAN);
331     mapPane.setHighlight(false);
332     mapPane.setNormalCursor(SwingUtil.PAN_CURSOR);
333     break;
334     case TOOL_INFO:
335     // Set the mouse tool to "Info"
336     mapPane.setWindowSelectionState(JMapPane.NONE);
337     mapPane.setState(JMapPane.SELECT_TOP); // Why not:
338 alfonx 141 // JMapPane.SELECT_TOP_ONEONLY
339 alfonx 140 mapPane.setHighlight(false);// SK: Was true, but since it not works
340 alfonx 141 // properly removed it to save
341     // performance
342 alfonx 140 mapPane.setNormalCursor(SwingUtil.CROSSHAIR_CURSOR);
343     break;
344     case TOOL_ZOOMIN:
345     // Set the mouse tool to "Zoom in"
346     mapPane.setWindowSelectionState(JMapPane.ZOOM_IN);
347     mapPane.setState(JMapPane.ZOOM_IN);
348     mapPane.setHighlight(false);
349     mapPane.setNormalCursor(SwingUtil.ZOOMIN_CURSOR);
350     break;
351     case TOOL_ZOOMOUT:
352     // Set the mouse tool to "Zoom out"
353     mapPane.setWindowSelectionState(JMapPane.NONE);
354     mapPane.setState(JMapPane.ZOOM_OUT);
355     mapPane.setHighlight(false);
356     mapPane.setNormalCursor(SwingUtil.ZOOMOUT_CURSOR);
357     break;
358 alfonx 141 default:
359     // Set map actions to default
360     mapPane.setWindowSelectionState(JMapPane.NONE);
361     mapPane.setState(JMapPane.NONE);
362     mapPane.setHighlight(false);
363     mapPane.setNormalCursor(null);
364     break;
365 alfonx 140 }
366     mapPane.updateCursor();
367 mojays 2 }
368 alfonx 141
369 alfonx 140 /**
370 alfonx 141 * @param id
371     * The ID of the Component to remove. The change will not be
372     * visible until {@link #initToolBar()} is called.
373 alfonx 140 * @return <code>null</code> or the component that has been removed.
374     */
375 alfonx 141 public JComponent removeId(int id) {
376 alfonx 140 return toolAndActionButtons.remove(id);
377     }
378    
379     /**
380     * Performs the action of an action button.
381     *
382     * @param tool
383     * the action
384     * @param e
385     * the event of the button
386     */
387 mojays 2 protected void performActionButton(int action, ActionEvent e) {
388 alfonx 140 if (mapPane == null)
389     return;
390 mojays 2
391 alfonx 140 // Perform the action "Zoom back": Revert the last zoom
392     if (action == ACTION_ZOOM_BACK) {
393     if (zoomBackIndex <= 1)
394     return;
395 mojays 2
396 alfonx 140 zoomBackForwardButtonInAction = true;
397     zoomBackIndex--;
398     getButton(ACTION_ZOOM_FORWARD).setEnabled(true);
399     getButton(ACTION_ZOOM_BACK).setEnabled(zoomBackIndex > 1);
400 mojays 2
401 alfonx 140 mapPane.setMapArea(lastZooms.get(zoomBackIndex - 1));
402     mapPane.refresh();
403     }
404    
405     // Perform the action "Zoom forward": Re-do the last zoom
406     if (action == ACTION_ZOOM_FORWARD) {
407     if (zoomBackIndex < lastZooms.size()) {
408     zoomBackForwardButtonInAction = true;
409     zoomBackIndex++;
410     getButton(ACTION_ZOOM_BACK).setEnabled(true);
411     getButton(ACTION_ZOOM_FORWARD).setEnabled(
412     zoomBackIndex < lastZooms.size());
413    
414     mapPane.setMapArea(lastZooms.get(zoomBackIndex - 1));
415     mapPane.refresh();
416     }
417     }
418 mojays 2 }
419 alfonx 140
420 mojays 2 /**
421     * Adds a tool to the tool bar. Does nothing if a tool or action with the
422     * specified ID already exists!
423 alfonx 140 *
424     * @param buttonAction
425     * action for the toggle button
426     * @param resetToolBar
427     * indicates whether the toolbar GUI is reset after adding the
428     * button (if adding several actions it useful only to reset the
429     * GUI for the last added tool)
430 mojays 2 */
431     public void addTool(MapPaneToolBarAction buttonAction, boolean resetToolBar) {
432 alfonx 140 if (isButtonIDUsed(buttonAction.getID())) {
433     LOGGER
434     .warn("addTool(.) ignored because ID already used for tool or action: "
435     + buttonAction.getID());
436     return;
437     }
438     JToggleButton button = new JToggleButton(buttonAction);
439     button.setBorder(BorderFactory.createRaisedBevelBorder());
440     toolButtonGroup.add(button);
441     toolAndActionButtons.put(buttonAction.getID(), button);
442     if (resetToolBar)
443     initToolBar();
444 mojays 2 }
445    
446 alfonx 140 /**
447     * Adds a tool to the tool bar and resets the toolbar GUI.
448     *
449     * @param buttonAction
450     * action for the toggle button
451     */
452     public void addTool(MapPaneToolBarAction buttonAction) {
453     addTool(buttonAction, true);
454     }
455 mojays 2
456 alfonx 140 /**
457     * Adds an action to the tool bar. Does nothing if a tool or action with the
458     * specified ID already exists!
459     *
460     * @param buttonAction
461     * action for the button
462     * @param resetToolBar
463     * indicates whether the toolbar GUI is reset after adding the
464     * button (if adding several actions it useful only to reset the
465     * GUI for the last added tool)
466     */
467     public void addAction(MapPaneToolBarAction buttonAction,
468     boolean resetToolBar) {
469     if (isButtonIDUsed(buttonAction.getID())) {
470     LOGGER
471     .warn("addAction(.) ignored because ID already used for tool or action: "
472     + buttonAction.getID());
473     return;
474     }
475     JButton button = new JButton(buttonAction);
476     button.setBorder(BorderFactory.createRaisedBevelBorder());
477     toolAndActionButtons.put(buttonAction.getID(), button);
478     if (resetToolBar)
479     initToolBar();
480     }
481 mojays 2
482 alfonx 140 public void addSeparator(int id, Separator separator) {
483     if (isButtonIDUsed(id)) {
484     LOGGER
485     .warn("addSeparator(.) ignored because ID already used for tool or action. ");
486     return;
487     }
488     toolAndActionButtons.put(id, separator);
489 alfonx 111 }
490    
491 alfonx 140 /**
492     * Adds an action to the tool bar and resets the toolbar GUI.
493     *
494     * @param buttonAction
495     * action for the toggle button
496     */
497     public void addAction(MapPaneToolBarAction buttonAction) {
498     addAction(buttonAction, true);
499     }
500 mojays 2
501 alfonx 140 /**
502     * Returns the button for a specific tool or action.
503     *
504     * @param id
505     * the constant for any button in the {@link MapPaneToolBar}
506     * @return a {@link JButton} if {@code id} specifies an
507     * {@linkplain #getActionButton(int) action button} or
508     * {@link JToogleButton} if {@code id} specifies a
509     * {@linkplain #getToolButton(int) tool button}
510     */
511     public AbstractButton getButton(int id) {
512     AbstractButton button = (AbstractButton) toolAndActionButtons.get(id);
513     if (button == null)
514     LOGGER.warn("Unknown tool or action ID: " + id);
515     return button;
516     }
517    
518     /**
519     * Returns the button for a specific tool.
520     *
521     * @param tool
522     * the constant for a tool
523     */
524 mojays 2 public JToggleButton getToolButton(int tool) {
525 alfonx 140 AbstractButton button = getButton(tool);
526     if (button != null && !(button instanceof JToggleButton)) {
527     LOGGER.warn("ID specifies no tool: " + tool);
528     button = null;
529     }
530     return (JToggleButton) button;
531     }
532 mojays 2
533 alfonx 140 /**
534     * Returns the button for a specific action.
535     *
536     * @param action
537     * the constant an action
538     */
539     public JButton getActionButton(int action) {
540     AbstractButton button = getButton(action);
541     if (button != null && !(button instanceof JButton)) {
542     LOGGER.warn("ID specifies no action: " + action);
543     button = null;
544     }
545     return (JButton) button;
546 mojays 2
547 alfonx 140 }
548 mojays 2
549     /**
550     * Sets the selected tool.
551 alfonx 140 *
552     * @param tool
553     * ID of the tool
554 mojays 2 */
555     public void setSelectedTool(Integer tool) {
556 alfonx 140 if (tool == null)
557     toolButtonGroup.setUnselected();
558    
559     JToggleButton button = getToolButton(tool);
560     if (button == null)
561     return;
562     button.setSelected(true);
563     button.getAction().actionPerformed(null);
564 alfonx 141
565     selectedTool = tool;
566 mojays 2 }
567 alfonx 140
568 mojays 2 /**
569     * Returns the selected tool.
570 alfonx 140 *
571 mojays 2 * @return -1 if no tool is active
572     */
573     public int getSelectedTool() {
574 alfonx 140 if (toolButtonGroup.getSelectedButton() == null)
575     return -1;
576     return selectedTool;
577 mojays 2 }
578    
579 alfonx 140 /**
580     * Sets whether a tool or action is activated or not. The visible property
581     * of the button is not affected.
582     *
583     * @param id
584     * tool or actionID
585     * @param enabled
586     * if {@code true} the tool becomes available
587     */
588     public void setButtonEnabled(int id, boolean enabled) {
589     AbstractButton button = getButton(id);
590     if (button == null)
591     return;
592     button.setEnabled(enabled);
593     }
594    
595     /**
596     * Sets whether a tool or action is activated or not.
597     *
598     * @param id
599     * tool or actionID
600     * @param enabled
601     * if {@code true} the tool becomes available
602     * @param hideOnDisable
603     * if {@code true} the button is also hidden if {@code enabled}
604     * is {@code false}
605     */
606 mojays 2 public void setButtonEnabled(int id, boolean enabled, boolean hideOnDisable) {
607 alfonx 140 AbstractButton button = getButton(id);
608     if (button == null)
609     return;
610     button.setEnabled(enabled);
611     // if button is enabled, it becomes visible anyway
612     // if button is disabled and the "hide" option is set, it is also hidden
613     if (enabled)
614     button.setVisible(true);
615     else
616     button.setVisible(!hideOnDisable);
617 mojays 2 }
618    
619 alfonx 140 /**
620     * Checks whether a ID is already used for a tool or action.
621     *
622     * @param tool
623     * tool ID
624     */
625     public boolean isButtonIDUsed(int id) {
626     return toolAndActionButtons.get(id) != null;
627     }
628 mojays 2
629 alfonx 140 /**
630     * Checks whether a tool is activated.
631     *
632     * @param tool
633     * tool ID
634     * @return {@code false} if an unknown ID is specified
635     */
636     public boolean isButtonEnabled(int id) {
637     AbstractButton button = getButton(id);
638     if (button != null)
639     return button.isEnabled();
640     return false;
641     }
642 mojays 2
643 alfonx 140 /**
644     * Sets the activation for all tools.
645     *
646     * @param enabled
647     * if {@code true} all tools becomes available
648     * @param hideOnDisable
649     * if {@code true} the buttons are also hidden if {@code enabled}
650     * is {@code false}
651     */
652     public void setAllToolsEnabled(boolean enabled, boolean hideOnDisable) {
653     for (int tool : toolAndActionButtons.keySet())
654     setButtonEnabled(tool, enabled, hideOnDisable);
655     }
656 mojays 2
657 alfonx 140 /**
658     * Sets the activation for all actions.
659     *
660     * @param enabled
661     * if {@code true} all actions becomes available
662     * @param hideOnDisable
663     * if {@code true} the buttons are also hidden if {@code enabled}
664     * is {@code false}
665     */
666     public void setAllActionsEnabled(boolean enabled, boolean hideOnDisable) {
667     for (int id : toolAndActionButtons.keySet()) {
668     if (toolAndActionButtons.get(id) instanceof JButton) {
669     setButtonEnabled(id, enabled, hideOnDisable);
670     }
671     }
672 mojays 2
673 alfonx 140 }
674 alfonx 139
675 alfonx 140 /**
676     * Returns the maximum ID of tools.
677     */
678     public int getMaxToolID() {
679     return toolAndActionButtons.lastKey();
680     }
681 mojays 2
682 alfonx 140 /**
683     * Returns the minimum ID of tools.
684     */
685     public int getMinToolID() {
686     return toolAndActionButtons.firstKey();
687     }
688 mojays 2
689 alfonx 140 /**
690     * Extends the {@link AbstractAction} with maintaining an ID and the
691     * {@link MapPaneToolBar} the actions controls. Additionally this class
692     * automatically calls
693     * {@link MapPaneToolBar#performToolButton(int, ActionEvent)} or
694     * {@link MapPaneToolBar#performActionButton(int, ActionEvent)} depending on
695     * whether the action is added via
696     * {@link MapPaneToolBar#addTool(MapPaneToolBarAction)} or
697     * {@link MapPaneToolBar#addAction(MapPaneToolBarAction)}.
698     *
699     * @author <a href="mailto:[email protected]">Martin Schmitz</a>
700     * (University of Bonn/Germany)
701     */
702     public static class MapPaneToolBarAction extends AbstractAction {
703     /** The ID of the action */
704     protected int id = -1;
705     /** The tool bar, this action is made for. */
706     protected MapPaneToolBar toolBar = null;
707 mojays 2
708 alfonx 140 /**
709     * Creates a new action with a dummy description and no icon.
710     *
711     * @param id
712     * unique ID for the action
713     * @param toolBar
714     * toolbar this action is made for
715     */
716     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar) {
717     this(id, toolBar, "" + id);
718     }
719    
720     /**
721     * Creates a new action without an icon.
722     *
723     * @param id
724     * unique ID for the action
725     * @param toolBar
726     * toolbar this action is made for
727     * @param name
728     * description used for buttons or menus
729     */
730     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar, String name) {
731     this(id, toolBar, name, null);
732     }
733    
734     /**
735     * Creates a new action.
736     *
737     * @param id
738     * unique ID for the action
739     * @param toolBar
740     * toolbar this action is made for
741     * @param name
742     * description used for buttons or menus
743     * @param icon
744     * icon used for buttons or menus
745     */
746     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar,
747     String name, Icon icon) {
748 alfonx 151 this (id, toolBar, name, icon, null);
749     }
750    
751     /**
752     * Creates a new action.
753     *
754     * @param id
755     * unique ID for the action
756     * @param toolBar
757     * The {@link MapPaneToolBar} this action is made for
758     * @param name
759     * description used for buttons or menus
760     * @param icon
761     * icon used for buttons or menus
762     * @param toolTip
763     * Tooltip to use for the button or menu
764     */
765     public MapPaneToolBarAction(int id, MapPaneToolBar toolBar,
766     String name, Icon icon, String toolTip) {
767 alfonx 140 super(name, icon);
768 alfonx 151
769     if (toolTip != null && !toolTip.trim().isEmpty()){
770     putValue(Action.SHORT_DESCRIPTION, toolTip);
771     }
772    
773 alfonx 140 this.id = id;
774     this.toolBar = toolBar;
775     }
776    
777     /**
778     * Calls {@link MapPaneToolBar#performToolButton(int, ActionEvent)} or
779     * {@link MapPaneToolBar#performActionButton(int, ActionEvent)}
780     * depending on whether the action is added to the toolbar via
781     * {@link MapPaneToolBar#addTool(MapPaneToolBarAction)} or
782     * {@link MapPaneToolBar#addAction(MapPaneToolBarAction)}.
783     */
784     public void actionPerformed(ActionEvent e) {
785     if (toolBar.toolAndActionButtons.get(id) instanceof JToggleButton)
786     toolBar.performToolButton(id, e);
787     else if (toolBar.toolAndActionButtons.get(id) instanceof JButton)
788     toolBar.performActionButton(id, e);
789     }
790    
791     /**
792     * Returns the (unique) id of this action.
793     *
794     * @return
795     */
796     public int getID() {
797     return id;
798     }
799     }
800 alfonx 180
801     /**
802     * Nuetzlich wenn die Componente gedruckt (z.B. wenn ein Screenshot gemacht wird) wird. Dann werden wird der
803     * Hintergrund auf WEISS gesetzt.
804     *
805     * @author <a href="mailto:[email protected]">Stefan Alfons
806     * Kr&uuml;ger</a>
807     */
808     @Override
809     public void print(Graphics g) {
810     Color orig = getBackground();
811     setBackground(Color.WHITE);
812     // wrap in try/finally so that we always restore the state
813     try {
814     super.print(g);
815     } finally {
816     setBackground(orig);
817     }
818     }
819 mojays 2 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26