Gridarta Editor
ToolSelector.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2023 The Gridarta Developers.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 
20 package net.sf.gridarta.gui.panel.tools;
21 
22 import java.awt.BorderLayout;
23 import java.awt.CardLayout;
24 import java.awt.Component;
25 import java.awt.Container;
26 import java.awt.FlowLayout;
27 import java.awt.Insets;
28 import java.awt.event.ActionEvent;
29 import java.util.HashMap;
30 import java.util.Map;
31 import javax.swing.AbstractAction;
32 import javax.swing.AbstractButton;
33 import javax.swing.Action;
34 import javax.swing.ButtonGroup;
35 import javax.swing.JPanel;
36 import javax.swing.JToggleButton;
47 import net.sf.japi.swing.action.ActionBuilder;
48 import net.sf.japi.swing.action.ActionBuilderFactory;
49 import org.jetbrains.annotations.NotNull;
50 import org.jetbrains.annotations.Nullable;
51 
57 public class ToolSelector<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends JPanel {
58 
62  private static final long serialVersionUID = 1L;
63 
67  @NotNull
68  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta.gui.panel.tools");
69 
73  @NotNull
74  private final Container selectionPane = new JPanel(new FlowLayout());
75 
79  @NotNull
80  private final CardLayout optionCards = new CardLayout();
81 
85  @NotNull
86  private final ButtonGroup selectionButtonGroup = new ButtonGroup();
87 
91  @NotNull
92  private final Container optionsPane = new JPanel(optionCards);
93 
97  @NotNull
99 
103  @NotNull
104  private final Map<String, Tool<G, A, R>> tools = new HashMap<>();
105 
109  private static final Insets EMPTY_MARGIN = new Insets(0, 0, 0, 0);
110 
123  public ToolSelector(@NotNull final String defaultTool, @NotNull final MapViewSettings mapViewSettings, @NotNull final SelectedSquareModel<G, A, R> selectedSquareModel, @NotNull final ObjectChooser<G, A, R> objectChooser, @NotNull final PickmapSettings pickmapSettings, @Nullable final GameObjectMatcher floorGameObjectMatcher, @Nullable final GameObjectMatcher wallGameObjectMatcher, @Nullable final GameObjectMatcher monsterGameObjectMatcher, @NotNull final InsertionModeSet<G, A, R> insertionModeSet) {
124  createUI();
125  addTool(new VoidTool<>(), defaultTool);
126  addTool(new SelectionTool<>(objectChooser, insertionModeSet), defaultTool);
127  addTool(new DeletionTool<>(mapViewSettings, objectChooser, pickmapSettings, floorGameObjectMatcher, wallGameObjectMatcher, monsterGameObjectMatcher), defaultTool);
128  addTool(new InsertionTool<>(selectedSquareModel, objectChooser, pickmapSettings, insertionModeSet, mapViewSettings), defaultTool);
129  }
130 
136  private void addTool(@NotNull final Tool<G, A, R> tool, @NotNull final String defaultTool) {
137  add(tool, tool.getId().equals(defaultTool));
138  }
139 
143  private void createUI() {
144  setLayout(new BorderLayout());
145  add(selectionPane, BorderLayout.NORTH);
146  add(optionsPane, BorderLayout.CENTER);
147  }
148 
153  public void add(@NotNull final Tool<G, A, R> tool) {
154  add(tool, false);
155  }
156 
163  private void add(@NotNull final Tool<G, A, R> tool, final boolean selected) {
164  @NotNull final Action selectionAction = new SelectionAction(tool);
165  @NotNull final AbstractButton toggleButton = new JToggleButton(selectionAction);
166  toggleButton.setMargin(EMPTY_MARGIN);
167  @NotNull final Component optionsView = createOptionsView(tool);
168  selectionButtonGroup.add(toggleButton);
169  selectionPane.add(toggleButton);
170  final Container panel = new JPanel(new BorderLayout());
171  panel.add(optionsView, BorderLayout.NORTH);
172  optionsPane.add(panel, tool.getId());
173  toggleButton.setSelected(selected);
174  tools.put(tool.getId(), tool);
175  if (selected) {
176  selectedTool = tool;
177  optionCards.show(optionsPane, tool.getId());
178  }
179  }
180 
189  @NotNull
190  private static <G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> Component createOptionsView(@NotNull final Tool<G, A, R> tool) {
191  @Nullable final Component optionsView = tool.createOptionsView();
192  return optionsView == null ? new JPanel() : optionsView;
193  }
194 
201  private void setSelectedTool(@NotNull final Tool<G, A, R> tool) {
202  selectedTool = tool;
203  optionCards.show(optionsPane, tool.getId());
204  }
205 
215  public void setSelectedTool(@NotNull final String id) {
216  setSelectedTool(tools.get(id));
217  }
218 
223  @NotNull
225  return selectedTool;
226  }
227 
231  private class SelectionAction extends AbstractAction {
232 
236  private static final long serialVersionUID = 1L;
237 
241  @NotNull
242  private final Tool<G, A, R> tool;
243 
248  private SelectionAction(@NotNull final Tool<G, A, R> tool) {
249  this.tool = tool;
250  ACTION_BUILDER.initAction(false, this, tool.getId());
251  }
252 
253  @Override
254  public void actionPerformed(@NotNull final ActionEvent e) {
256  }
257 
258  @Override
259  public Object clone() throws CloneNotSupportedException {
260  return super.clone();
261  }
262 
263  }
264 
265 }
net.sf.gridarta.gui.panel.tools.Tool< G, A, R >
net.sf.gridarta.gui.panel.tools.ToolSelector.setSelectedTool
void setSelectedTool(@NotNull final Tool< G, A, R > tool)
Makes a tool the currently selected tool to edit its options.
Definition: ToolSelector.java:201
net.sf.gridarta.gui.panel
net.sf.gridarta.gui.panel.tools.SelectionTool
Tool for Selection.
Definition: SelectionTool.java:54
net.sf.gridarta.model.mapmodel.InsertionModeSet
A set of InsertionModes.
Definition: InsertionModeSet.java:33
net.sf.gridarta.gui.panel.tools.ToolSelector.ToolSelector
ToolSelector(@NotNull final String defaultTool, @NotNull final MapViewSettings mapViewSettings, @NotNull final SelectedSquareModel< G, A, R > selectedSquareModel, @NotNull final ObjectChooser< G, A, R > objectChooser, @NotNull final PickmapSettings pickmapSettings, @Nullable final GameObjectMatcher floorGameObjectMatcher, @Nullable final GameObjectMatcher wallGameObjectMatcher, @Nullable final GameObjectMatcher monsterGameObjectMatcher, @NotNull final InsertionModeSet< G, A, R > insertionModeSet)
Creates a new instance.
Definition: ToolSelector.java:123
net.sf.gridarta.gui.panel.tools.ToolSelector.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The Action Builder.
Definition: ToolSelector.java:68
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.map.event.MouseOpListener
Interface for Mouse Operations.
Definition: MouseOpListener.java:31
net.sf.gridarta.model.mapviewsettings
Definition: AbstractMapViewSettings.java:20
net.sf
net.sf.gridarta.gui.panel.tools.ToolSelector.EMPTY_MARGIN
static final Insets EMPTY_MARGIN
Empty margin.
Definition: ToolSelector.java:109
net.sf.gridarta.gui.panel.tools.ToolSelector.selectionButtonGroup
final ButtonGroup selectionButtonGroup
The ButtonGroup for the toggle buttons.
Definition: ToolSelector.java:86
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.optionCards
final CardLayout optionCards
The CardLayout for the pane that shows a tool's options.
Definition: ToolSelector.java:80
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.actionPerformed
void actionPerformed(@NotNull final ActionEvent e)
Definition: ToolSelector.java:254
net.sf.gridarta.model.match.GameObjectMatcher
Interface for classes that match GameObjects.
Definition: GameObjectMatcher.java:30
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.model.mapviewsettings.MapViewSettings
Container for settings that affect the rendering of maps.
Definition: MapViewSettings.java:30
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.tool
final Tool< G, A, R > tool
The tool to select with this action.
Definition: ToolSelector.java:242
net.sf.gridarta.gui.panel.tools.ToolSelector.getSelectedTool
MouseOpListener< G, A, R > getSelectedTool()
Returns the tool that is currently selected.
Definition: ToolSelector.java:224
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.panel.objectchooser
Definition: DefaultObjectChooser.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.addTool
void addTool(@NotNull final Tool< G, A, R > tool, @NotNull final String defaultTool)
Adds a tool to this tool selector.
Definition: ToolSelector.java:136
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.panel.tools.VoidTool
The VoidTool is a tool that does nothing.
Definition: VoidTool.java:35
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction
Action for selecting a tool.
Definition: ToolSelector.java:231
net.sf.gridarta.model.match
Classes related to matching {GameObjects}, so called { net.sf.gridarta.model.match....
Definition: AndGameObjectMatcher.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.clone
Object clone()
Definition: ToolSelector.java:259
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.panel.selectedsquare.SelectedSquareModel
The model component of the selected square control.
Definition: SelectedSquareModel.java:35
net.sf.gridarta.gui.map.event
Definition: MouseOpEvent.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.add
void add(@NotNull final Tool< G, A, R > tool, final boolean selected)
Adds a tool to this tool selector.
Definition: ToolSelector.java:163
net.sf.gridarta.gui.panel.tools.ToolSelector.optionsPane
final Container optionsPane
The pane with the options of a tool.
Definition: ToolSelector.java:92
net.sf.gridarta.gui.panel.tools.ToolSelector.createOptionsView
static< G extends GameObject< G, A, R > A extends R extends Archetype< G, A, R > Component createOptionsView(@NotNull final Tool< G, A, R > tool)
Definition: ToolSelector.java:190
net.sf.gridarta.gui.panel.objectchooser.ObjectChooser
Common base interface for ObjectChoosers.
Definition: ObjectChooser.java:34
net.sf.gridarta.gui.panel.tools.ToolSelector
User interface for selecting a tool and displaying its options.
Definition: ToolSelector.java:57
net.sf.gridarta.gui.panel.tools.ToolSelector.createUI
void createUI()
Creates the user interface elements of the ToolSelector.
Definition: ToolSelector.java:143
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.model.pickmapsettings
Definition: AbstractPickmapSettings.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: ToolSelector.java:62
net.sf.gridarta.gui.panel.tools.ToolSelector.tools
final Map< String, Tool< G, A, R > > tools
The tools.
Definition: ToolSelector.java:104
net.sf.gridarta.gui.panel.tools.InsertionTool
MouseOpListener for insertion.
Definition: InsertionTool.java:54
net.sf.gridarta.gui.panel.tools.ToolSelector.setSelectedTool
void setSelectedTool(@NotNull final String id)
Makes a tool the currently selected tool to edit its options.
Definition: ToolSelector.java:215
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.panel.tools.Tool.getId
String getId()
Returns the id of this tool.
net.sf.gridarta.gui.panel.selectedsquare
Displays the contents of the currently selected map square.
Definition: CellRenderer.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.add
void add(@NotNull final Tool< G, A, R > tool)
Adds a tool to this tool selector.
Definition: ToolSelector.java:153
net.sf.gridarta.gui.panel.tools.DeletionTool
Tool for Deletion.
Definition: DeletionTool.java:56
net.sf.gridarta.model.pickmapsettings.PickmapSettings
Container for settings that affect pickmaps.
Definition: PickmapSettings.java:28
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.SelectionAction
SelectionAction(@NotNull final Tool< G, A, R > tool)
Creates a SelectionAction.
Definition: ToolSelector.java:248
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: ToolSelector.java:236
net.sf.gridarta.gui.panel.tools.ToolSelector.selectedTool
Tool< G, A, R > selectedTool
The currently selected tool.
Definition: ToolSelector.java:98
net.sf.gridarta.gui.panel.tools.ToolSelector.selectionPane
final Container selectionPane
The pane with the selections.
Definition: ToolSelector.java:74