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.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
net.sf.gridarta.gui.panel.tools.ToolSelector
Definition: ToolSelector.java:57
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.tool
final Tool< G, A, R > tool
Definition: ToolSelector.java:242
net.sf.gridarta.gui.panel.tools.Tool< G, A, R >
net.sf.gridarta.gui.panel.tools.InsertionTool
Definition: InsertionTool.java:54
net.sf.gridarta
net.sf.gridarta.model.maparchobject.MapArchObject
Definition: MapArchObject.java:40
net.sf.gridarta.model.mapviewsettings
Definition: AbstractMapViewSettings.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction
Definition: ToolSelector.java:231
net.sf
net.sf.gridarta.gui.panel.tools.ToolSelector.selectionButtonGroup
final ButtonGroup selectionButtonGroup
Definition: ToolSelector.java:86
net.sf.gridarta.gui.panel.tools.ToolSelector.EMPTY_MARGIN
static final Insets EMPTY_MARGIN
Definition: ToolSelector.java:109
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.tools
final Map< String, Tool< G, A, R > > tools
Definition: ToolSelector.java:104
net.sf.gridarta.gui.panel.tools.SelectionTool
Definition: SelectionTool.java:54
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.clone
Object clone()
Definition: ToolSelector.java:259
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.actionPerformed
void actionPerformed(@NotNull final ActionEvent e)
Definition: ToolSelector.java:254
net.sf.gridarta.gui.panel.tools.ToolSelector.selectedTool
Tool< G, A, R > selectedTool
Definition: ToolSelector.java:98
net.sf.gridarta.model.match.GameObjectMatcher
Definition: GameObjectMatcher.java:30
net.sf.gridarta.gui
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.gui.panel.tools.ToolSelector.add
void add(@NotNull final Tool< G, A, R > tool)
Definition: ToolSelector.java:153
net.sf.gridarta.gui.map.event.MouseOpListener
Definition: MouseOpListener.java:31
net.sf.gridarta.gui.panel.objectchooser
Definition: DefaultObjectChooser.java:20
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.panel.tools.ToolSelector.createUI
void createUI()
Definition: ToolSelector.java:143
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.serialVersionUID
static final long serialVersionUID
Definition: ToolSelector.java:236
net.sf.gridarta.model.match
Definition: AndGameObjectMatcher.java:20
net.sf.gridarta.gui.panel.tools.DeletionTool
Definition: DeletionTool.java:56
net.sf.gridarta.model.mapmodel.InsertionModeSet
Definition: InsertionModeSet.java:33
net.sf.gridarta.gui.map.event
Definition: MouseOpEvent.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.optionsPane
final Container optionsPane
Definition: ToolSelector.java:92
net.sf.gridarta.gui.panel.tools.ToolSelector.setSelectedTool
void setSelectedTool(@NotNull final String id)
Definition: ToolSelector.java:215
net.sf.gridarta.gui.panel.tools.ToolSelector.selectionPane
final Container selectionPane
Definition: ToolSelector.java:74
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)
Definition: ToolSelector.java:123
net.sf.gridarta.model.mapviewsettings.MapViewSettings
Definition: MapViewSettings.java:30
net.sf.gridarta.model
net.sf.gridarta.gui.panel.tools.Tool.getId
String getId()
net.sf.gridarta.gui.map
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.add
void add(@NotNull final Tool< G, A, R > tool, final boolean selected)
Definition: ToolSelector.java:163
net.sf.gridarta.model.pickmapsettings
Definition: AbstractPickmapSettings.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: ToolSelector.java:68
net.sf.gridarta.gui.panel.tools.ToolSelector.serialVersionUID
static final long serialVersionUID
Definition: ToolSelector.java:62
net.sf.gridarta.gui.panel.selectedsquare.SelectedSquareModel
Definition: SelectedSquareModel.java:35
net.sf.gridarta.model.pickmapsettings.PickmapSettings
Definition: PickmapSettings.java:28
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.panel.objectchooser.ObjectChooser
Definition: ObjectChooser.java:34
net.sf.gridarta.gui.panel.tools.ToolSelector.addTool
void addTool(@NotNull final Tool< G, A, R > tool, @NotNull final String defaultTool)
Definition: ToolSelector.java:136
net.sf.gridarta.gui.panel.tools.ToolSelector.SelectionAction.SelectionAction
SelectionAction(@NotNull final Tool< G, A, R > tool)
Definition: ToolSelector.java:248
net.sf.gridarta.gui.panel.selectedsquare
Definition: CellRenderer.java:20
net.sf.gridarta.gui.panel.tools.ToolSelector.optionCards
final CardLayout optionCards
Definition: ToolSelector.java:80
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.panel.tools.ToolSelector.getSelectedTool
MouseOpListener< G, A, R > getSelectedTool()
Definition: ToolSelector.java:224
net.sf.gridarta.gui.panel.tools.VoidTool
Definition: VoidTool.java:35
net.sf.gridarta.gui.panel.tools.ToolSelector.setSelectedTool
void setSelectedTool(@NotNull final Tool< G, A, R > tool)
Definition: ToolSelector.java:201