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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 607 - (show annotations)
Wed Dec 9 15:13:42 2009 UTC (15 years, 2 months ago) by alfonx
Original Path: branches/2.0-RC1/src/skrueger/geotools/MapPaneToolBar.java
File size: 27954 byte(s)
Keine Ahnung was er da gebrancht hat.. der stand der dateien war weder trunk, noch der 1.0-gt26 branch... ich hab die dateien jetzt händisch auf den richtigen stand gebracht und comitte

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26