Gridarta Editor
MaskChangeAL.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.dialog.gameobjectattributes;
21 
22 import java.awt.Container;
23 import java.awt.GridLayout;
24 import java.awt.event.ActionEvent;
25 import javax.swing.AbstractAction;
26 import javax.swing.JCheckBox;
27 import javax.swing.JOptionPane;
28 import javax.swing.JPanel;
29 import javax.swing.event.ChangeEvent;
30 import javax.swing.event.ChangeListener;
38 import org.jetbrains.annotations.NotNull;
39 import org.jetbrains.annotations.Nullable;
40 
45 public class MaskChangeAL<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractAction {
46 
50  private static final long serialVersionUID = 1L;
51 
55  @NotNull
57 
61  @NotNull
63 
67  @NotNull
68  private final JCheckBox @NotNull [] checkbox;
69 
73  @NotNull
74  private final Container gridPanel;
75 
79  @NotNull
80  private final ChangeListener singleChangeListener = new ChangeListener() {
81 
82  @Override
83  public void stateChanged(final ChangeEvent e) {
85  }
86  };
87 
91  @NotNull
92  private final ChangeListener allChangeListener = new ChangeListener() {
93 
94  @Override
95  public void stateChanged(final ChangeEvent e) {
97  case DESELECTED:
98  setAllBits(false);
99  break;
100 
101  case INDETERMINATE:
102  // ignore
103  break;
104 
105  case SELECTED:
106  setAllBits(true);
107  break;
108  }
109  }
110  };
111 
118  public MaskChangeAL(@NotNull final String label, @NotNull final DialogAttributeBitmask<G, A, R> dialogAttributeBitmask) {
119  super(label);
120  this.dialogAttributeBitmask = dialogAttributeBitmask;
121 
122  gridPanel = new JPanel(new GridLayout(0, 2, 3, 3));
123  final AttributeBitmask attributeBitmask = dialogAttributeBitmask.getBitmask();
124  final int number = attributeBitmask.getNumber();
125  final int value = dialogAttributeBitmask.getValue();
126  checkbox = new JCheckBox[number];
127  for (int i = 0; i < number; i++) {
128  final String name = attributeBitmask.getBitName(i);
129  if (name != null) {
130  checkbox[i] = new JCheckBox(name);
131  checkbox[i].addChangeListener(singleChangeListener);
132  checkbox[i].setSelected(isActive(i + 1, value));
133  gridPanel.add(checkbox[i]);
134  }
135  }
136  if (gridPanel.getComponentCount() % 2 != 0) {
137  gridPanel.add(new JPanel());
138  }
139  allCheckbox = new ToggleTristateCheckBox("All"); // TODO: I18N/L10N
140  allCheckbox.addChangeListener(allChangeListener);
141  gridPanel.add(allCheckbox);
142  }
143 
144  @Override
145  public void actionPerformed(@NotNull final ActionEvent e) {
146  final Integer newValue = showBitmaskDialog();
147  if (newValue != null) {
149  }
150  }
151 
152  @NotNull
153  @Override
155  try {
156  //noinspection unchecked
157  return (MaskChangeAL<G, A, R>) super.clone();
158  } catch (final CloneNotSupportedException ex) {
159  throw new AssertionError(ex);
160  }
161  }
162 
168  @Nullable
169  private Integer showBitmaskDialog() {
170  setValue();
171  final String attributeName = dialogAttributeBitmask.getRef().getAttributeName();
172  final String title = "Choose " + attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1);
173  if (JOptionPane.showConfirmDialog(dialogAttributeBitmask.getInput(), gridPanel, title, JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION) {
174  return getValue();
175  }
176  return null;
177  }
178 
183  private int getValue() {
184  final AttributeBitmask attributeBitmask = dialogAttributeBitmask.getBitmask();
185  final int number = attributeBitmask.getNumber();
186  int newValue = 0;
187  for (int i = 0; i < number; i++) {
188  if (checkbox[i] != null && checkbox[i].isSelected()) {
189  newValue |= 1 << i;
190  }
191  }
192  return newValue;
193  }
194 
198  private void setValue() {
199  final int value = dialogAttributeBitmask.getValue();
200  final int number = dialogAttributeBitmask.getBitmask().getNumber();
201  for (int i = 0; i < number; i++) {
202  if (checkbox[i] != null) {
203  checkbox[i].setSelected(isActive(i + 1, value));
204  }
205  }
206  }
207 
212  private void setAllBits(final boolean state) {
213  final AttributeBitmask attributeBitmask = dialogAttributeBitmask.getBitmask();
214  final int number = attributeBitmask.getNumber();
215  for (int i = 0; i < number; i++) {
216  if (checkbox[i] != null) {
217  checkbox[i].setSelected(state);
218  }
219  }
220  }
221 
227  @NotNull
229  final AttributeBitmask attributeBitmask = dialogAttributeBitmask.getBitmask();
230  final int number = attributeBitmask.getNumber();
231  int i;
232  for (i = 0; i < number; i++) {
233  if (checkbox[i] != null) {
234  break;
235  }
236  }
237  if (i >= number) {
238  return TristateState.DESELECTED;
239  }
240  final boolean state = checkbox[i++].isSelected();
241  while (i < number) {
242  if (checkbox[i] != null && checkbox[i].isSelected() != state) {
243  return TristateState.INDETERMINATE;
244  }
245  i++;
246  }
247  return TristateState.getTristateState(state);
248  }
249 
257  private static boolean isActive(final int index, final int mask) {
258  final int bit = 1 << (index - 1);
259  return (mask & bit) == bit;
260  }
261 
262 }
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.model.archetypetype
Defines types of GameObjects with corresponding attributes.
Definition: AbstractArchetypeAttributeInvSpell.java:20
net.sf.gridarta.model.archetypetype.AttributeBitmask.getNumber
int getNumber()
Returns the number of bitmask entries (not counting zero).
Definition: AttributeBitmask.java:249
net.sf.gridarta.gui.utils.tristate
Implements TristateCheckBox, a JCheckBox variant that supports three states: deselected,...
Definition: package-info.java:28
net.sf.gridarta.gui.dialog.gameobjectattributes.DialogAttributeBitmask.getBitmask
AttributeBitmask getBitmask()
Definition: DialogAttributeBitmask.java:145
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.getValue
int getValue()
Returns the currently selected values.
Definition: MaskChangeAL.java:183
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.utils.tristate.TristateButtonModel.getTristateState
TristateState getTristateState()
Returns the internal state.
Definition: TristateButtonModel.java:96
net.sf.gridarta.gui.utils.tristate.TristateCheckBox
A JCheckBox that supports three states: deselected, indeterminate, selected.
Definition: TristateCheckBox.java:43
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.allCheckbox
final TristateCheckBox allCheckbox
The all-bits check box.
Definition: MaskChangeAL.java:62
net.sf
net.sf.gridarta.gui.dialog.gameobjectattributes.DialogAttributeBitmask.setValue
void setValue(final int value)
Set the active bitmask value.
Definition: DialogAttributeBitmask.java:125
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.gridPanel
final Container gridPanel
The top-level container of the dialog.
Definition: MaskChangeAL.java:74
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.setValue
void setValue()
Sets the currently selected values to the default values.
Definition: MaskChangeAL.java:198
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.allChangeListener
final ChangeListener allChangeListener
The ChangeListener attached to the "All" check box.
Definition: MaskChangeAL.java:92
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.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.model.archetypetype.AttributeBitmask.getBitName
String getBitName(final int index)
Returns the name of a bitmask value.
Definition: AttributeBitmask.java:259
net.sf.gridarta.gui.utils.ToggleTristateCheckBox
A TristateCheckBox that skips the indeterminate state when activated.
Definition: ToggleTristateCheckBox.java:31
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.setAllBits
void setAllBits(final boolean state)
Sets all bit-value check boxes to the given state.
Definition: MaskChangeAL.java:212
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.showBitmaskDialog
Integer showBitmaskDialog()
Open a popup frame to select bitmask-entries via choose boxes.
Definition: MaskChangeAL.java:169
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.clone
MaskChangeAL< G, A, R > clone()
Definition: MaskChangeAL.java:154
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL
ActionListener for the change buttons of bitmasks.
Definition: MaskChangeAL.java:45
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.dialogAttributeBitmask
final DialogAttributeBitmask< G, A, R > dialogAttributeBitmask
The DialogAttributeBitmask where this change button belongs to.
Definition: MaskChangeAL.java:56
net.sf.gridarta.model.archetypetype.AttributeBitmask
This class manages bitmask values which appear in Gridarta archetype attributes.
Definition: AttributeBitmask.java:42
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.serialVersionUID
static final long serialVersionUID
The serial version UID.
Definition: MaskChangeAL.java:50
net.sf.gridarta.gui.dialog.gameobjectattributes.DialogAttributeBitmask.getValue
int getValue()
Get the active bitmask value.
Definition: DialogAttributeBitmask.java:108
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.isActive
static boolean isActive(final int index, final int mask)
Check whether the given bit-index is an active bit in the bitmask.
Definition: MaskChangeAL.java:257
net.sf.gridarta.gui.utils.tristate.TristateButtonModel.setTristateState
final void setTristateState(@NotNull final TristateState state)
Sets the state.
Definition: TristateButtonModel.java:104
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.getBitState
TristateState getBitState()
Returns the TristateState that reflects the current state of all bit-value check boxes.
Definition: MaskChangeAL.java:228
net.sf.gridarta.gui.utils.tristate.TristateState
Possible states for TristateButtonModels.
Definition: TristateState.java:28
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.singleChangeListener
final ChangeListener singleChangeListener
The ChangeListener attached to all single-bit check boxes.
Definition: MaskChangeAL.java:80
net.sf.gridarta.gui.utils.tristate.TristateState.getTristateState
static TristateState getTristateState(final boolean state)
Returns the tristate state for a boolean state.
Definition: TristateState.java:79
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.checkbox
final JCheckBox[] checkbox
The single-bit check boxes.
Definition: MaskChangeAL.java:68
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.utils.tristate.TristateCheckBox.getTristateModel
TristateButtonModel getTristateModel()
Returns the model as a TristateButtonModel.
Definition: TristateCheckBox.java:171
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.MaskChangeAL
MaskChangeAL(@NotNull final String label, @NotNull final DialogAttributeBitmask< G, A, R > dialogAttributeBitmask)
Constructor.
Definition: MaskChangeAL.java:118
net.sf.gridarta.gui.dialog.gameobjectattributes.MaskChangeAL.actionPerformed
void actionPerformed(@NotNull final ActionEvent e)
Definition: MaskChangeAL.java:145
net.sf.gridarta.gui.dialog.gameobjectattributes.DialogAttributeBitmask.getInput
Component getInput()
Returns the input ui component for editing the value.
Definition: DialogAttributeBitmask.java:158
net.sf.gridarta.gui.dialog.gameobjectattributes.DialogAttributeBitmask< G, A, R >