Gridarta Editor
EventsTab.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.gameobjectattributes;
21 
22 import java.awt.BorderLayout;
23 import java.awt.Container;
24 import java.awt.Dimension;
25 import java.awt.Frame;
26 import java.awt.GridLayout;
27 import javax.swing.Action;
28 import javax.swing.DefaultListModel;
29 import javax.swing.JButton;
30 import javax.swing.JList;
31 import javax.swing.JPanel;
32 import javax.swing.JScrollPane;
33 import javax.swing.ListModel;
34 import javax.swing.ListSelectionModel;
35 import javax.swing.ScrollPaneConstants;
36 import javax.swing.border.EtchedBorder;
37 import javax.swing.event.ListSelectionListener;
49 import net.sf.japi.swing.action.ActionBuilder;
50 import net.sf.japi.swing.action.ActionBuilderFactory;
51 import net.sf.japi.swing.action.ActionMethod;
52 import org.jetbrains.annotations.NotNull;
53 import org.jetbrains.annotations.Nullable;
54 
60 public class EventsTab<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends AbstractGameObjectAttributesTab<G, A, R> {
61 
65  @NotNull
66  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
67 
71  @NotNull
72  private final Frame parent;
73 
77  @NotNull
79 
83  @NotNull
85 
89  @NotNull
91 
95  @NotNull
97 
101  @NotNull
103 
107  @NotNull
108  private final JPanel panel = new JPanel();
109 
113  @NotNull
114  private final JScrollPane scrollPane;
115 
119  @NotNull
120  private final Action aEventAddNew = ACTION_BUILDER.createAction(false, "eventAddNew", this);
121 
125  @NotNull
126  private final Action aEventEditData = ACTION_BUILDER.createAction(false, "eventEditData", this);
127 
131  @NotNull
132  private final Action aEventEdit = ACTION_BUILDER.createAction(false, "eventEdit", this);
133 
137  @NotNull
138  private final Action aEventRemove = ACTION_BUILDER.createAction(false, "eventRemove", this);
139 
143  @NotNull
144  private final JList<String> eventList = new JList<>();
145 
150  @Nullable
152 
163  public EventsTab(@NotNull final Frame parent, @NotNull final MapManager<G, A, R> mapManager, @NotNull final GameObjectAttributesModel<G, A, R> gameObjectAttributesModel, @NotNull final ScriptArchEditor<G, A, R> scriptArchEditor, @NotNull final ScriptArchData<G, A, R> scriptArchData, @NotNull final ScriptArchDataUtils<G, A, R> scriptArchDataUtils, @NotNull final ScriptArchUtils scriptArchUtils) {
164  super(gameObjectAttributesModel);
165  this.parent = parent;
166  this.mapManager = mapManager;
167  this.scriptArchEditor = scriptArchEditor;
168  this.scriptArchData = scriptArchData;
169  this.scriptArchDataUtils = scriptArchDataUtils;
170  this.scriptArchUtils = scriptArchUtils;
171 
172  scrollPane = new JScrollPane(eventList);
173  scrollPane.setBorder(new EtchedBorder());
174  scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
175  scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
176  scrollPane.setPreferredSize(new Dimension(80, 40));
177 
178  final Container buttons = new JPanel(new GridLayout(4, 1));
179  buttons.add(new JButton(aEventAddNew));
180  buttons.add(new JButton(aEventEditData));
181  buttons.add(new JButton(aEventEdit));
182  buttons.add(new JButton(aEventRemove));
183 
184  panel.setLayout(new BorderLayout());
185  panel.add(scrollPane, BorderLayout.CENTER);
186  panel.add(buttons, BorderLayout.EAST);
187  panel.setPreferredSize(new Dimension(100, 40));
188 
189  eventList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
190  final ListSelectionListener listSelectionListener = e -> updateActions();
191  eventList.addListSelectionListener(listSelectionListener);
192  refresh(gameObjectAttributesModel.getSelectedGameObject());
193  }
194 
195  @NotNull
196  @Override
197  public JPanel getPanel() {
198  return panel;
199  }
200 
201  @Override
202  public boolean canApply() {
203  return false;
204  }
205 
206  @Override
207  public void activate() {
208  scrollPane.requestFocusInWindow();
209  }
210 
211  @Override
212  protected final void refresh(@Nullable final G gameObject) {
213  selectedGameObject = gameObject;
214  if (gameObject == null || !gameObject.isScripted()) {
216  final ListModel<?> listModel = eventList.getModel();
217  if (listModel != null && listModel.getSize() > 0) {
218  eventList.setModel(new DefaultListModel<>());
219  }
220  } else {
222  eventList.removeAll();
224  }
225  updateActions();
226  }
227 
231  private void updateActions() {
232  aEventAddNew.setEnabled(doAddNewEvent(false));
234  aEventEdit.setEnabled(doEditEvent(ScriptTask.EVENT_OPEN, false));
235  aEventRemove.setEnabled(doEditEvent(ScriptTask.EVENT_REMOVE, false));
236  }
237 
238  @Override
239  protected void apply(@NotNull final G gameObject) {
240  }
241 
245  @ActionMethod
246  public void eventAddNew() {
247  doAddNewEvent(true);
248  }
249 
253  @ActionMethod
254  public void eventEditData() {
256  }
257 
261  @ActionMethod
262  public void eventEdit() {
264  }
265 
269  @ActionMethod
270  public void eventRemove() {
272  }
273 
279  private boolean doAddNewEvent(final boolean performAction) {
280  final GameObject<G, A, R> gameObject = selectedGameObject;
281  if (gameObject == null) {
282  return false;
283  }
284 
285  if (performAction) {
286  final G selectedHead = gameObject.getHead();
287  final MapModel<G, A, R> mapModel = selectedHead.getMapSquare().getMapModel();
288  mapModel.beginTransaction("Add event");
289  try {
291 
292  if (scriptArchData.isEmpty(selectedHead)) {
293  setEventPanelButtonState(true, false, false, false);
294  } else {
295  setEventPanelButtonState(true, true, true, true);
297  }
298  } finally {
299  mapModel.endTransaction();
300  }
301  }
302 
303  return true;
304  }
305 
315  private boolean doEditEvent(@NotNull final ScriptTask task, final boolean performAction) {
316  final GameObject<G, A, R> gameObject = selectedGameObject;
317  if (gameObject == null) {
318  return false;
319  }
320 
321  final ListModel<?> listModel = eventList.getModel();
322  if (listModel == null || listModel.getSize() <= 0) {
323  return false;
324  }
325 
326  final int index = eventList.getSelectedIndex();
327  if (index < 0) {
328  return false;
329  }
330 
331  if (performAction) {
332  final G selectedHead = gameObject.getHead();
333  final MapModel<G, A, R> mapModel = selectedHead.getMapSquare().getMapModel();
334  mapModel.beginTransaction("Modify event");
335  try {
336  scriptArchDataUtils.modifyEventScript(index, task, eventList, mapManager, parent, selectedHead);
337  if (scriptArchData.isEmpty(selectedHead)) {
338  setEventPanelButtonState(true, false, false, false);
339  }
340  } finally {
341  mapModel.endTransaction();
342  }
343  }
344 
345  return true;
346  }
347 
355  private void setEventPanelButtonState(final boolean newButton, final boolean modifyButton, final boolean pathButton, final boolean removeButton) {
356  aEventAddNew.setEnabled(newButton);
357  aEventEditData.setEnabled(pathButton);
358  aEventEdit.setEnabled(modifyButton);
359  aEventRemove.setEnabled(removeButton);
360  }
361 
362 }
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.getPanel
JPanel getPanel()
Definition: EventsTab.java:197
net.sf.gridarta.model.mapmanager
Definition: AbstractMapManager.java:20
net.sf.gridarta.model.mapmodel.MapModel
A MapModel reflects the data of a map.
Definition: MapModel.java:75
net.sf.gridarta.gui.scripts.ScriptTask.EVENT_EDIT_PATH
EVENT_EDIT_PATH
Opens a dialog to edit the script parameters.
Definition: ScriptTask.java:38
net.sf.gridarta.model.mapmanager.MapManager
A MapManager manages all opened maps.
Definition: MapManager.java:37
net.sf.gridarta.gui.utils.Severity.MODIFIED
MODIFIED
The tab contents are modified from defaults.
Definition: Severity.java:39
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.canApply
boolean canApply()
Definition: EventsTab.java:202
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.apply
void apply(@NotNull final G gameObject)
Definition: EventsTab.java:239
net.sf.gridarta.model.mapmodel.MapModel.endTransaction
void endTransaction()
End a transaction.
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.scriptArchEditor
final ScriptArchEditor< G, A, R > scriptArchEditor
The ScriptArchEditor to use.
Definition: EventsTab.java:84
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.eventEdit
void eventEdit()
Action method for editing an existing event.
Definition: EventsTab.java:262
net.sf
net.sf.gridarta.model.mapmodel.MapModel.beginTransaction
void beginTransaction(@NotNull String name)
Starts a new transaction.
net.sf.gridarta.model.scripts
Common types for event archetypes.
Definition: AbstractScriptedEvent.java:20
net.sf.gridarta.model.mapmodel
Definition: AboveFloorInsertionMode.java:20
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.scripts.ScriptTask.EVENT_OPEN
EVENT_OPEN
Opens an editor for the script code.
Definition: ScriptTask.java:33
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.aEventAddNew
final Action aEventAddNew
The action for "add new event".
Definition: EventsTab.java:120
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.scriptArchUtils
final ScriptArchUtils scriptArchUtils
The ScriptArchUtils to use.
Definition: EventsTab.java:96
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.setEventPanelButtonState
void setEventPanelButtonState(final boolean newButton, final boolean modifyButton, final boolean pathButton, final boolean removeButton)
Sets the enable/disable states for the four buttons in the event panel.
Definition: EventsTab.java:355
net.sf.gridarta.gui.panel.gameobjectattributes.AbstractGameObjectAttributesTab
Base class for GameObjectAttributesTab implementations.
Definition: AbstractGameObjectAttributesTab.java:38
net.sf.gridarta.model.scripts.ScriptArchUtils
Definition: ScriptArchUtils.java:26
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.eventList
final JList< String > eventList
The JList that shows all events.
Definition: EventsTab.java:144
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.utils.Severity
Severity levels for colors of tabs.
Definition: Severity.java:29
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.updateActions
void updateActions()
Updates the enabled state of all actions.
Definition: EventsTab.java:231
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.scriptArchData
final ScriptArchData< G, A, R > scriptArchData
The ScriptArchData instance to use.
Definition: EventsTab.java:90
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.scripts.ScriptTask.EVENT_REMOVE
EVENT_REMOVE
Removes the event object.
Definition: ScriptTask.java:43
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.scrollPane
final JScrollPane scrollPane
The JScrollPane displaying all event.s.
Definition: EventsTab.java:114
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.parent
final Frame parent
The parent frame for dialog boxes.
Definition: EventsTab.java:72
net.sf.gridarta.gui.scripts.ScriptArchEditor.addEventScript
void addEventScript(@NotNull final G gameObject, @NotNull final ScriptArchData< G, A, R > scriptArchData, @NotNull final Frame parent)
A popup is opened and the user can create a new scripting event which gets attached to this gameObjec...
Definition: ScriptArchEditor.java:177
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.eventRemove
void eventRemove()
Action method for removing an existing event.
Definition: EventsTab.java:270
net.sf.gridarta.gui.panel.gameobjectattributes.GameObjectAttributesModel< G, A, R >
net.sf.gridarta.gui.scripts.ScriptArchEditor
Dialog to create events linked to item scripting.
Definition: ScriptArchEditor.java:69
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.EventsTab
EventsTab(@NotNull final Frame parent, @NotNull final MapManager< G, A, R > mapManager, @NotNull final GameObjectAttributesModel< G, A, R > gameObjectAttributesModel, @NotNull final ScriptArchEditor< G, A, R > scriptArchEditor, @NotNull final ScriptArchData< G, A, R > scriptArchData, @NotNull final ScriptArchDataUtils< G, A, R > scriptArchDataUtils, @NotNull final ScriptArchUtils scriptArchUtils)
Creates a new instance.
Definition: EventsTab.java:163
net.sf.gridarta.gui.scripts.ScriptTask
Parameter for operation to perform in ScriptTask, javax.swing.JList, net.sf.gridarta....
Definition: ScriptTask.java:28
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.eventAddNew
void eventAddNew()
Action method for creating a new event.
Definition: EventsTab.java:246
net.sf.gridarta.gui.scripts
Definition: AbstractScriptArchUtils.java:20
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.aEventEdit
final Action aEventEdit
The action for "edit event code".
Definition: EventsTab.java:132
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The ActionBuilder.
Definition: EventsTab.java:66
net.sf.gridarta.model.mapmodel.MapSquare.getMapModel
MapModel< G, A, R > getMapModel()
Returns the MapModel this map square is part of.
Definition: MapSquare.java:99
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.eventEditData
void eventEditData()
Action method for editing the data of an existing event.
Definition: EventsTab.java:254
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.doAddNewEvent
boolean doAddNewEvent(final boolean performAction)
This method is invoked when the user pressed the "new event" button.
Definition: EventsTab.java:279
net.sf.gridarta.model.baseobject.BaseObject.getHead
T getHead()
Return the head part of a multi-part object.
net.sf.gridarta.model.mapmodel.MapModel.getMapSquare
MapSquare< G, A, R > getMapSquare(@NotNull Point pos)
Get the square at a specified location.
net.sf.gridarta.model.scripts.ScriptArchData.isEmpty
boolean isEmpty(@NotNull G gameObject)
Returns whether this ScriptArchData is empty (contains no events).
net.sf.gridarta.gui.panel.gameobjectattributes.AbstractGameObjectAttributesTab< G, A, R >::setTabSeverity
void setTabSeverity( @NotNull final Severity tabSeverity)
Sets the tab severity.
Definition: AbstractGameObjectAttributesTab.java:102
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.doEditEvent
boolean doEditEvent(@NotNull final ScriptTask task, final boolean performAction)
This method is invoked when the user pressed the "edit event"/"path"/"remove" button from the event p...
Definition: EventsTab.java:315
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.mapManager
final MapManager< G, A, R > mapManager
The MapManager.
Definition: EventsTab.java:78
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.gui.scripts.ScriptArchDataUtils.modifyEventScript
void modifyEventScript(final int eventIndex, final ScriptTask task, @NotNull final JList< String > panelList, @NotNull final MapManager<?, ?, ?> mapManager, @NotNull final Frame parent, @NotNull final Iterable< G > gameObject)
If there is a scripted event of the specified type, the script pad is opened and the appropriate scri...
Definition: ScriptArchDataUtils.java:98
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.activate
void activate()
Definition: EventsTab.java:207
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab
The "Events" tab in the game object attributes panel.
Definition: EventsTab.java:60
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.refresh
final void refresh(@Nullable final G gameObject)
Definition: EventsTab.java:212
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.scriptArchDataUtils
final ScriptArchDataUtils< G, A, R > scriptArchDataUtils
The ScriptArchDataUtils to use.
Definition: EventsTab.java:102
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.aEventRemove
final Action aEventRemove
The action for "remove event".
Definition: EventsTab.java:138
net.sf.gridarta.model.scripts.ScriptArchUtils.addEventsToJList
void addEventsToJList(@NotNull JList< String > list, @NotNull Iterable<? extends GameObject<?, ?, ?>> gameObject)
Set all ScriptedEvents to appear in the given JList This method should be fast because it may be exec...
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.panel
final JPanel panel
The content panel.
Definition: EventsTab.java:108
net.sf.gridarta.gui.utils.Severity.DEFAULT
DEFAULT
The tab contents are unchanged from defaults.
Definition: Severity.java:34
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.aEventEditData
final Action aEventEditData
The action for "edit event parameters".
Definition: EventsTab.java:126
net.sf.gridarta.gui.panel.gameobjectattributes.EventsTab.selectedGameObject
GameObject< G, A, R > selectedGameObject
The currently selected game object.
Definition: EventsTab.java:151
net.sf.gridarta.gui.scripts.ScriptArchDataUtils
net.sf.gridarta.model.scripts.ScriptArchData related functions.
Definition: ScriptArchDataUtils.java:41
net.sf.gridarta.model.scripts.ScriptArchData
Stores and manages information about scripted events.
Definition: ScriptArchData.java:35