Gridarta Editor
SelectionTool.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.Component;
23 import java.awt.Container;
24 import java.awt.GridBagConstraints;
25 import java.awt.GridBagLayout;
26 import java.awt.Point;
27 import java.awt.event.InputEvent;
28 import javax.swing.JComboBox;
29 import javax.swing.JPanel;
43 import net.sf.japi.swing.action.ActionBuilder;
44 import net.sf.japi.swing.action.ActionBuilderFactory;
45 import net.sf.japi.swing.action.ActionMethod;
46 import net.sf.japi.swing.action.ToggleAction;
47 import org.jetbrains.annotations.NotNull;
48 import org.jetbrains.annotations.Nullable;
49 
54 public class SelectionTool<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends BasicAbstractTool<G, A, R> {
55 
59  private static final int MODE_AUTO = 0;
60 
64  private static final int MODE_TOPMOST = 1;
65 
69  private static final int MODE_ABOVE_FLOOR = 2;
70 
74  private static final int MODE_BELOW_FLOOR = 3;
75 
79  private static final int MODE_BOTTOMMOST = 4;
80 
84  @NotNull
85  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta.gui.panel.tools");
86 
90  @NotNull
91  private final ToggleAction autoFillAction = (ToggleAction) ACTION_BUILDER.createToggle(true, "selectionToolAutoFill", this);
92 
96  @NotNull
97  private final JComboBox<?> modeComboBox = createModeComboBox();
98 
102  @NotNull
104 
108  @NotNull
110 
114  private boolean selectionToolAutoFill;
115 
122  super("selection");
123  this.objectChooser = objectChooser;
124  this.insertionModeSet = insertionModeSet;
126  }
127 
128  @Override
129  public void pressed(@NotNull final MouseOpEvent<G, A, R> e) {
130  final Point mapLoc = e.getMapLocation();
131  if (mapLoc == null) {
132  return;
133  }
134  final int mod = e.getModifiers();
135  final MapCursor<G, A, R> mapCursor = e.getMapCursor();
136  mapCursor.beginTransaction();
137  try {
138  // left mouse button: select squares
139  // Throw away old selection if neither SHIFT nor CTRL is not pressed
140  if ((mod & (InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)) == 0) {
141  mapCursor.deactivate();
142  }
143  mapCursor.setLocation(mapLoc);
144  mapCursor.dragStart();
145  } finally {
146  mapCursor.endTransaction();
147  }
148  }
149 
150  @Override
151  public void clicked(@NotNull final MouseOpEvent<G, A, R> e) {
152  }
153 
154  @Override
155  public void dragged(@NotNull final MouseOpEvent<G, A, R> e) {
156  e.getMapCursor().dragTo(e.getMapLocation());
157  }
158 
159  @Override
160  public void moved(@NotNull final MouseOpEvent<G, A, R> e) {
161  }
162 
163  @Override
164  public void released(@NotNull final MouseOpEvent<G, A, R> e) {
165  final MapCursor<G, A, R> mapCursor = e.getMapCursor();
166  final int modifiers = e.getModifiers();
167  if (mapCursor.isOnGrid(e.getMapLocation())) {
168  if ((modifiers & InputEvent.SHIFT_DOWN_MASK) != 0) {
169  mapCursor.dragSelect((modifiers & InputEvent.CTRL_DOWN_MASK) == 0 ? SelectionMode.ADD : SelectionMode.FLIP, true);
170  } else if ((modifiers & InputEvent.CTRL_DOWN_MASK) != 0) {
171  mapCursor.dragSelect(SelectionMode.SUB, true);
172  } else {
173  mapCursor.dragSelect(SelectionMode.ADD, false);
174  }
175  } else {
176  mapCursor.dragRelease();
177  }
178 
179  if (selectionToolAutoFill) {
180  final int modeIndex = modeComboBox.getSelectedIndex();
181  final InsertionMode insertionMode;
182  switch (modeIndex) {
183  case MODE_AUTO:
184  insertionMode = insertionModeSet.getAutoInsertionMode();
185  break;
186 
187  case MODE_TOPMOST:
188  insertionMode = insertionModeSet.getTopmostInsertionMode();
189  break;
190 
191  case MODE_ABOVE_FLOOR:
193  break;
194 
195  case MODE_BELOW_FLOOR:
197  break;
198 
199  case MODE_BOTTOMMOST:
201  break;
202 
203  default:
204  throw new AssertionError();
205  }
206  final MapView<G, A, R> mapView = e.getMapView();
207  FillUtils.fill(mapView.getMapControl().getMapModel(), mapView.getSelectedSquares(), insertionMode, objectChooser.getSelections(), -1, false);
208  }
209  }
210 
211  @Nullable
212  @Override
213  public Component createOptionsView() {
214  final Container panel = new JPanel();
215  panel.setLayout(new GridBagLayout());
216 
217  final GridBagConstraints gbcLabel = new GridBagConstraints();
218  gbcLabel.anchor = GridBagConstraints.EAST;
219 
220  final GridBagConstraints gbcComboBox = new GridBagConstraints();
221  gbcComboBox.fill = GridBagConstraints.HORIZONTAL;
222  gbcComboBox.weightx = 1.0;
223  gbcComboBox.gridwidth = GridBagConstraints.REMAINDER;
224 
225  final GridBagConstraints gbcCheckBox = new GridBagConstraints();
226  gbcCheckBox.fill = GridBagConstraints.HORIZONTAL;
227  gbcCheckBox.gridwidth = GridBagConstraints.REMAINDER;
228 
229  panel.add(autoFillAction.createCheckBox(), gbcCheckBox);
230  panel.add(SwingUtils.createLabel("selectionTool.mode", modeComboBox), gbcLabel);
231  panel.add(modeComboBox, gbcComboBox);
232  return panel;
233  }
234 
239  @NotNull
240  private static JComboBox<?> createModeComboBox() {
241  final String[] options = { ActionBuilderUtils.getString(ACTION_BUILDER, "selectionTool.mode.auto"), ActionBuilderUtils.getString(ACTION_BUILDER, "selectionTool.mode.topmost"), ActionBuilderUtils.getString(ACTION_BUILDER, "selectionTool.mode.aboveFloor"), ActionBuilderUtils.getString(ACTION_BUILDER, "selectionTool.mode.belowFloor"), ActionBuilderUtils.getString(ACTION_BUILDER, "selectionTool.mode.bottommost"), };
242  final JComboBox<?> comboBox = new JComboBox<>(options);
243  comboBox.setToolTipText(ActionBuilderUtils.getString(ACTION_BUILDER, "selectionTool.mode.shortdescription"));
244  return comboBox;
245  }
246 
251  @ActionMethod
252  public boolean isSelectionToolAutoFill() {
253  return selectionToolAutoFill;
254  }
255 
260  @ActionMethod
261  public void setSelectionToolAutoFill(final boolean selectionToolAutoFill) {
262  if (this.selectionToolAutoFill == selectionToolAutoFill) {
263  return;
264  }
265  this.selectionToolAutoFill = selectionToolAutoFill;
267  }
268 
275  }
276 
277 }
net.sf.gridarta.model.mapmodel.InsertionModeSet.getTopmostInsertionMode
InsertionMode getTopmostInsertionMode()
Returns the "topmost" insertion mode.
Definition: InsertionModeSet.java:98
net.sf.gridarta.gui.map.event.MouseOpEvent
A MouseOpEvent is an event triggered for a MouseOpListener.
Definition: MouseOpEvent.java:37
net.sf.gridarta.gui.panel
net.sf.gridarta.gui.panel.tools.SelectionTool.pressed
void pressed(@NotNull final MouseOpEvent< G, A, R > e)
Definition: SelectionTool.java:129
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.SelectionTool.SelectionTool
SelectionTool(@NotNull final ObjectChooser< G, A, R > objectChooser, @NotNull final InsertionModeSet< G, A, R > insertionModeSet)
Creates a new instance.
Definition: SelectionTool.java:121
net.sf.gridarta.gui.map.mapview.MapView.getMapControl
MapControl< G, A, R > getMapControl()
Return the controller of this view.
net.sf.gridarta.gui.panel.tools.SelectionTool.selectionToolAutoFill
boolean selectionToolAutoFill
Whether auto-fill is enabled.
Definition: SelectionTool.java:114
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.model.mapcursor.MapCursor.deactivate
final void deactivate()
Cursor gets deactivated.
Definition: MapCursor.java:355
net.sf.gridarta.gui.panel.tools.SelectionTool.setSelectionToolAutoFill
void setSelectionToolAutoFill(final boolean selectionToolAutoFill)
Sets whether auto-fill is enabled.
Definition: SelectionTool.java:261
net.sf.gridarta.model.mapcursor.MapCursor.dragSelect
void dragSelect(@NotNull final SelectionMode selectionMode, final boolean forceSelect)
Leave drag mode and select pre-selection using selectionMode.
Definition: MapCursor.java:338
net.sf.gridarta.model.mapcursor.MapCursor.dragStart
final Point dragStart
Position where dragging has started.
Definition: MapCursor.java:71
net.sf
net.sf.gridarta.gui.panel.tools.SelectionTool.objectChooser
final ObjectChooser< G, A, R > objectChooser
The object chooser to update.
Definition: SelectionTool.java:103
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
net.sf.gridarta.gui.panel.tools.SelectionTool.released
void released(@NotNull final MouseOpEvent< G, A, R > e)
Definition: SelectionTool.java:164
net.sf.gridarta.model.mapgrid.SelectionMode.SUB
SUB
All squares that are preselected get unselected.
Definition: SelectionMode.java:36
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.mapgrid.SelectionMode.FLIP
FLIP
All squares that are preselected change state of selection.
Definition: SelectionMode.java:41
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.gui.panel.tools.SelectionTool.MODE_BELOW_FLOOR
static final int MODE_BELOW_FLOOR
Index into modeComboBox: insert below floor.
Definition: SelectionTool.java:74
net.sf.gridarta.model.mapmodel.InsertionModeSet.getBelowFloorInsertionMode
InsertionMode getBelowFloorInsertionMode()
Returns the "below floor" insertion mode.
Definition: InsertionModeSet.java:116
net.sf.gridarta.gui.panel.tools.SelectionTool.modeComboBox
final JComboBox<?> modeComboBox
The JComboBox for selecting the insertion mode.
Definition: SelectionTool.java:97
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.model.mapmodel.InsertionModeSet.getAutoInsertionMode
InsertionMode getAutoInsertionMode()
Returns the "auto" insertion mode.
Definition: InsertionModeSet.java:89
net.sf.gridarta.gui.panel.tools.SelectionTool.MODE_AUTO
static final int MODE_AUTO
Index into modeComboBox: guess insertion location.
Definition: SelectionTool.java:59
net.sf.gridarta.gui.panel.tools.SelectionTool.createModeComboBox
static JComboBox<?> createModeComboBox()
Creates a JComboBox for selecting the scope to delete.
Definition: SelectionTool.java:240
net.sf.gridarta.gui.panel.tools.SelectionTool.selectionToolAutoFillChanged
void selectionToolAutoFillChanged()
Updates the GUI state to reflect the current {} state.
Definition: SelectionTool.java:273
net.sf.gridarta.gui.panel.tools.SelectionTool.dragged
void dragged(@NotNull final MouseOpEvent< G, A, R > e)
Definition: SelectionTool.java:155
net.sf.gridarta.gui.panel.objectchooser
Definition: DefaultObjectChooser.java:20
net.sf.gridarta.model.floodfill
Definition: FillUtils.java:20
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net.sf.gridarta.gui.panel.tools.SelectionTool.MODE_BOTTOMMOST
static final int MODE_BOTTOMMOST
Index into modeComboBox: insert bottommost.
Definition: SelectionTool.java:79
net
net.sf.gridarta.gui.panel.objectchooser.ObjectChooser.getSelections
List<? extends BaseObject< G, A, R, ?> > getSelections()
Returns the selected arches in the left-side panel.
net.sf.gridarta.gui.utils.SwingUtils
Utility class for Swing related functions.
Definition: SwingUtils.java:37
net.sf.gridarta.gui.panel.tools.SelectionTool.autoFillAction
final ToggleAction autoFillAction
The action for "ignore walls".
Definition: SelectionTool.java:91
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.map.mapview
Definition: AbstractMapView.java:20
net.sf.gridarta.gui.map.event
Definition: MouseOpEvent.java:20
net.sf.gridarta.gui.map.mapview.MapView
A map view consists of a map grid and a map cursor, and is attached to a map control.
Definition: MapView.java:43
net.sf.gridarta.model.mapgrid.SelectionMode
Modes that describe how squares get selected.
Definition: SelectionMode.java:26
net.sf.gridarta.model.mapcursor.MapCursor
MapCursor provides methods to move and drag on map.
Definition: MapCursor.java:58
net.sf.gridarta.model.mapmodel.InsertionModeSet.getBottommostInsertionMode
InsertionMode getBottommostInsertionMode()
Returns the "bottommost" insertion mode.
Definition: InsertionModeSet.java:125
net.sf.gridarta.model.mapcursor.MapCursor.setLocation
void setLocation(@NotNull final Point p)
Move cursor to a new location.
Definition: MapCursor.java:236
net.sf.gridarta.model.mapcursor.MapCursor.isOnGrid
boolean isOnGrid(@Nullable final Point p)
Check if point is on grid.
Definition: MapCursor.java:379
net.sf.gridarta.model.mapmodel.InsertionMode
Insertion modes.
Definition: InsertionMode.java:33
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Returns the value of a key.
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.panel.tools.SelectionTool.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: SelectionTool.java:85
net.sf.gridarta.gui.panel.tools.SelectionTool.insertionModeSet
final InsertionModeSet< G, A, R > insertionModeSet
The InsertionModeSet to use.
Definition: SelectionTool.java:109
net.sf.gridarta.gui.panel.objectchooser.ObjectChooser
Common base interface for ObjectChoosers.
Definition: ObjectChooser.java:34
net.sf.gridarta.model.mapcursor.MapCursor.beginTransaction
final void beginTransaction()
Start a new transaction.
Definition: MapCursor.java:488
net.sf.gridarta.gui.panel.tools.SelectionTool.MODE_TOPMOST
static final int MODE_TOPMOST
Index into modeComboBox: insert topmost.
Definition: SelectionTool.java:64
net.sf.gridarta.model.mapgrid.SelectionMode.ADD
ADD
All squares that are preselected get selected.
Definition: SelectionMode.java:31
net.sf.gridarta.model.mapgrid
Definition: MapGrid.java:20
net.sf.gridarta.gui.panel.tools.SelectionTool.createOptionsView
Component createOptionsView()
Definition: SelectionTool.java:213
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.model.floodfill.FillUtils
Utility class implementing fill operations on map instances.
Definition: FillUtils.java:43
net.sf.gridarta.gui.map
Base classes for rendering maps.
Definition: AbstractPerMapDialogManager.java:20
net.sf.gridarta.gui.utils.SwingUtils.createLabel
static Component createLabel(@NotNull final String key, @Nullable final Component component)
Creates a javax.swing.JLabel instance.
Definition: SwingUtils.java:58
net.sf.gridarta.model.mapmodel.InsertionModeSet.getAboveFloorInsertionMode
InsertionMode getAboveFloorInsertionMode()
Returns the "above floor" insertion mode.
Definition: InsertionModeSet.java:107
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.model.mapcontrol.MapControl.getMapModel
MapModel< G, A, R > getMapModel()
Returns the map model.
net.sf.gridarta.gui.panel.tools.SelectionTool.moved
void moved(@NotNull final MouseOpEvent< G, A, R > e)
Definition: SelectionTool.java:160
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.panel.tools.SelectionTool.MODE_ABOVE_FLOOR
static final int MODE_ABOVE_FLOOR
Index into modeComboBox: insert above floor.
Definition: SelectionTool.java:69
net.sf.gridarta.gui.panel.tools.SelectionTool.isSelectionToolAutoFill
boolean isSelectionToolAutoFill()
Returns whether auto-fill is enabled.
Definition: SelectionTool.java:252
net.sf.gridarta.gui.map.mapview.MapView.getSelectedSquares
List< MapSquare< G, A, R > > getSelectedSquares()
Returns the selected squares.
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.panel.tools.BasicAbstractTool
Base class for the default provided tools.
Definition: BasicAbstractTool.java:32
net.sf.gridarta.model.mapcursor
Definition: MapCursor.java:20
net.sf.gridarta.gui.panel.tools.SelectionTool.clicked
void clicked(@NotNull final MouseOpEvent< G, A, R > e)
Definition: SelectionTool.java:151
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.model.mapcursor.MapCursor.dragRelease
void dragRelease()
Leave drag mode and undo pre-selection.
Definition: MapCursor.java:319
net.sf.gridarta.model.floodfill.FillUtils.fill
static< G extends GameObject< G, A, R > A extends R extends Archetype< G, A, R > void fill(@NotNull final MapModel< G, A, R > mapModel, @NotNull final Collection< MapSquare< G, A, R >> selection, @NotNull final InsertionMode insertionMode, @NotNull final List<? extends BaseObject< G, A, R, ?>> gameObjects, final int density, final boolean noAdjacent)
Definition: FillUtils.java:61
net.sf.gridarta.model.mapcursor.MapCursor.endTransaction
final void endTransaction()
End a transaction.
Definition: MapCursor.java:506