Gridarta Editor
PluginController.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.plugin;
21 
22 import java.awt.Component;
23 import java.io.File;
24 import java.io.IOException;
25 import java.util.Map;
26 import javax.swing.Action;
27 import javax.swing.JFileChooser;
28 import javax.swing.JOptionPane;
35 import net.sf.gridarta.plugin.Plugin;
44 import net.sf.japi.swing.action.ActionBuilder;
45 import net.sf.japi.swing.action.ActionBuilderFactory;
46 import net.sf.japi.swing.action.ActionMethod;
47 import net.sf.japi.swing.action.ReflectionAction;
48 import org.jetbrains.annotations.NotNull;
49 
55 public class PluginController<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> implements EditorAction {
56 
60  @NotNull
61  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
62 
63  @NotNull
65 
66  @NotNull
68 
69  @NotNull
70  private final PluginView<G, A, R> view;
71 
75  @NotNull
76  private final Component parent;
77 
78  @NotNull
80 
84  @NotNull
85  private File pluginsDir;
86 
90  @NotNull
92 
93  @Override
94  public void pluginCreated(@NotNull final Plugin<G, A, R> plugin) {
95  // ignore
96  }
97 
98  @Override
99  public void pluginDeleted(@NotNull final Plugin<G, A, R> plugin) {
100  // ignore
101  }
102 
103  @Override
104  public void pluginRegistered(@NotNull final Plugin<G, A, R> plugin) {
105  final String filterName = "(s)" + plugin.getName();
106 
107  if (plugin.isFilter()) {
108  final Filter<?, ?> filter = plugin.getPluginAsFilter(pluginParameters);
109  if (filter != null) {
110  filterControl.addFilter(filterName, filter);
111  }
112  }
113 
114  if (plugin.isAutoBoot()) {
115  plugin.runPlugin(pluginParameters);
116  }
117  }
118 
119  @Override
120  public void pluginUnregistered(@NotNull final Plugin<G, A, R> plugin) {
121  final String filterName = "(s)" + plugin.getName();
122  filterControl.removeFilter(filterName);
123  }
124 
125  };
126 
130  public PluginController(@NotNull final FilterControl<G, A, R> filterControl, @NotNull final PluginModel<G, A, R> pluginModel, @NotNull final PluginParameters pluginParameters, @NotNull final Component parent, @NotNull final PluginParameterViewFactory<G, A, R> pluginParameterViewFactory, @NotNull final File pluginsDir, @NotNull final ResourceIcons resourceIcons) {
131  this.parent = parent;
132  this.filterControl = filterControl;
133  this.pluginModel = pluginModel;
134  this.pluginParameters = pluginParameters;
135  this.pluginsDir = pluginsDir;
136  view = new PluginView<>(this, pluginModel, pluginParameterViewFactory, resourceIcons);
138  }
139 
144  public boolean canExit() {
145  for (final Plugin<G, A, R> plugin : pluginModel) {
146  if (plugin.isModified()) {
147  final int result = ACTION_BUILDER.showConfirmDialog(parent, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, "pluginConfirmSaveChanges", plugin.getName());
148  if (result == JOptionPane.YES_OPTION) {
149  if (!savePlugin(plugin)) {
150  return false;
151  }
152  } else if (result == JOptionPane.CANCEL_OPTION || result == JOptionPane.CLOSED_OPTION) {
153  return false;
154  }
155  }
156  }
157 
158  return true;
159  }
160 
164  public void saveAllPlugins() {
165  for (final Plugin<G, A, R> plugin : pluginModel) {
166  if (!savePlugin(plugin)) {
167  return;
168  }
169  }
170  }
171 
178  private boolean savePlugin(@NotNull final Plugin<G, A, R> plugin) {
179  if (!plugin.isModified()) {
180  return true;
181  }
182 
183  try {
184  final File file = plugin.getFile();
185  if (file == null) {
186  if (!savePluginAs(plugin, true)) {
187  return false;
188  }
189  } else {
190  pluginModel.savePlugin(plugin, file);
191  }
192  } catch (final IOException ex) {
193  // XXX: notify user
194  return false;
195  }
196 
197  plugin.resetModified();
198  return true;
199  }
200 
209  public boolean savePluginAs(@NotNull final Plugin<G, A, R> plugin, final boolean updatePluginFile) {
210  final JFileChooser chooser = new JFileChooser();
211  final File pluginFile = plugin.getFile();
212  FileChooserUtils.setCurrentDirectory(chooser, pluginFile == null ? pluginsDir : pluginFile);
213  chooser.setDialogTitle("save plugin " + plugin.getName());
214  final int result = chooser.showSaveDialog(null);
215  if (result != JFileChooser.APPROVE_OPTION) {
216  return false;
217  }
218 
219  final File file = chooser.getSelectedFile();
220  if (updatePluginFile) {
221  plugin.setFile(file);
222  }
223  pluginsDir = file.getParentFile();
224 
225  try {
226  pluginModel.savePlugin(plugin, file);
227  } catch (final IOException ex) {
228  return false;
229  }
230 
231  return true;
232  }
233 
234  public void runPlugin(@NotNull final Plugin<G, A, R> plugin) {
235  final Plugin<G, A, R> clonedPlugin = plugin.clonePlugin();
236 
237  final Map<String, Object> runValues = view.getRunValues(clonedPlugin, parent);
238  if (runValues == null) {
239  return;
240  }
241 
242  final Runnable pluginRunnable = new PluginExecutor<>(pluginModel, pluginParameters).doRunPlugin(clonedPlugin, view.createConsole(clonedPlugin.getName()), runValues);
243  if (pluginRunnable == null) {
244  return;
245  }
246 
247  final Thread pluginThread = new Thread(pluginRunnable, clonedPlugin.getName());
248  pluginThread.start();
249  // XXX: drops thread
250  }
251 
252  @ActionMethod
253  public void runPlugin(@NotNull final String name) {
254  final Plugin<G, A, R> plugin = pluginModel.getPlugin(name);
255  if (plugin != null) {
256  runPlugin(plugin);
257  }
258  }
259 
260  @NotNull
262  return view;
263  }
264 
270  @NotNull
271  public Action createRunAction(@NotNull final Plugin<G, A, R> plugin) {
272  final Action action = ActionUtils.newAction(ACTION_BUILDER, "Plugin", this, "runPlugin");
273  action.putValue(ReflectionAction.REFLECTION_ARGUMENTS, new Object[] { plugin.getName(), });
274  action.putValue(Action.NAME, ACTION_BUILDER.format("runPlugin.text", plugin.getName()));
275  return action;
276  }
277 
278  @Override
279  public void setAction(@NotNull final Action action, @NotNull final String name) {
280  }
281 
282 }
net.sf.gridarta.gui.dialog.plugin.PluginController.saveAllPlugins
void saveAllPlugins()
Saves all modified plugins.
Definition: PluginController.java:164
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.gui.dialog.plugin.PluginController.PluginController
PluginController(@NotNull final FilterControl< G, A, R > filterControl, @NotNull final PluginModel< G, A, R > pluginModel, @NotNull final PluginParameters pluginParameters, @NotNull final Component parent, @NotNull final PluginParameterViewFactory< G, A, R > pluginParameterViewFactory, @NotNull final File pluginsDir, @NotNull final ResourceIcons resourceIcons)
Creates a new instance.
Definition: PluginController.java:130
net.sf.gridarta.gui.dialog.plugin.PluginController.filterControl
final FilterControl< G, A, R > filterControl
Definition: PluginController.java:79
net.sf.gridarta.plugin
Definition: BshRunnable.java:20
net.sf.gridarta.model.filter.Filter
Interface for Filters.
Definition: Filter.java:33
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.utils.FileChooserUtils.setCurrentDirectory
static void setCurrentDirectory(@NotNull final JFileChooser fileChooser, @Nullable final File dir)
Calls JFileChooser#setCurrentDirectory(File).
Definition: FileChooserUtils.java:48
net.sf.gridarta.plugin.PluginModel.addPluginModelListener
void addPluginModelListener(@NotNull final PluginModelListener< G, A, R > listener)
Adds a listener to be informed of changes.
Definition: PluginModel.java:155
net.sf.gridarta.gui.dialog.plugin.PluginController.runPlugin
void runPlugin(@NotNull final String name)
Definition: PluginController.java:253
net.sf.gridarta.plugin.PluginExecutor.doRunPlugin
BshRunnable< G, A, R > doRunPlugin(@NotNull final Plugin< G, A, R > plugin, @NotNull final ConsoleInterface console, @NotNull final Map< String, Object > parameters)
Runs a plugin model.
Definition: PluginExecutor.java:196
net.sf.gridarta.plugin.PluginModelListener
Listener interface for scripting related events.
Definition: PluginModelListener.java:32
net.sf.gridarta.plugin.Plugin.getName
String getName()
Returns the name of this plugin.
Definition: Plugin.java:148
net.sf
net.sf.gridarta.plugin.Plugin.clonePlugin
Plugin< G, A, R > clonePlugin()
Returns a clone copy of this plugin.
Definition: Plugin.java:264
net.sf.gridarta.gui.dialog.plugin.PluginController.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Action Builder.
Definition: PluginController.java:61
net.sf.gridarta.plugin.PluginExecutor
Allows execution of Plugins.
Definition: PluginExecutor.java:48
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.plugin.PluginParameters
Makes basic Gridarta classes available to scripts.
Definition: PluginParameters.java:34
net.sf.gridarta.gui.dialog.plugin.parameter
net.sf.gridarta.utils.ActionUtils
Utility class implementing Action related functions.
Definition: ActionUtils.java:33
net.sf.gridarta.gui.filter.FilterControl.removeFilter
void removeFilter(@NotNull String name)
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.filter
Classes for Filters.
Definition: BtnPopup.java:20
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.plugin.PluginView< G, A, R >
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
net.sf.gridarta.plugin.PluginModel.getPlugin
Plugin< G, A, R > getPlugin(@NotNull final String name)
Definition: PluginModel.java:79
net.sf.gridarta.model.filter
Definition: AbstractFilterConfig.java:20
net.sf.gridarta.gui.dialog.plugin.PluginView.getRunValues
Map< String, Object > getRunValues(@NotNull final Plugin< G, A, R > plugin, @NotNull final Component parent)
Asks the user for input parameter to run a plugin.
Definition: PluginView.java:224
net.sf.gridarta.plugin.PluginModel.savePlugin
void savePlugin(@NotNull final Plugin< G, A, R > plugin, @NotNull final File file)
Saves a plugin to a given file.
Definition: PluginModel.java:141
net.sf.gridarta.gui.dialog.plugin.PluginController.createRunAction
Action createRunAction(@NotNull final Plugin< G, A, R > plugin)
Creates an action to run a plugin plugin.
Definition: PluginController.java:271
net.sf.gridarta.gui.dialog.plugin.PluginController.pluginModelListener
final PluginModelListener< G, A, R > pluginModelListener
The PluginModelListener attached to pluginModel.
Definition: PluginController.java:91
net.sf.gridarta.gui.dialog.plugin.PluginController.getView
PluginView< G, A, R > getView()
Definition: PluginController.java:261
net.sf.gridarta.gui.dialog
net.sf.gridarta.gui.filter.FilterControl.addFilter
void addFilter(@NotNull String name, @NotNull Filter<?, ?> filter)
net.sf.gridarta.gui.dialog.plugin
Definition: CloseableTabbedPane.java:47
net.sf.gridarta.gui.dialog.plugin.PluginController.setAction
void setAction(@NotNull final Action action, @NotNull final String name)
Sets the Action instance for this editor action.
Definition: PluginController.java:279
net.sf.gridarta.gui.filter.FilterControl
Definition: FilterControl.java:33
net.sf.gridarta.gui.dialog.plugin.parameter.PluginParameterViewFactory
Factory for creating PluginParameterView instances.
Definition: PluginParameterViewFactory.java:49
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Reflects an Archetype.
Definition: Archetype.java:41
net.sf.gridarta.utils.ActionUtils.newAction
static Action newAction(@NotNull final ActionBuilder actionBuilder, @NotNull final String category, @NotNull final EditorAction editorAction, @NotNull final String key)
Creates a new Action instance.
Definition: ActionUtils.java:204
net.sf.gridarta.plugin.Plugin
Model for plugins.
Definition: Plugin.java:53
net.sf.gridarta.utils.FileChooserUtils
Utility class for JFileChooser related functions.
Definition: FileChooserUtils.java:31
net.sf.gridarta.gui.dialog.plugin.PluginController.savePlugin
boolean savePlugin(@NotNull final Plugin< G, A, R > plugin)
Saves one plugin.
Definition: PluginController.java:178
net.sf.gridarta.gui.dialog.plugin.PluginController.pluginsDir
File pluginsDir
The default directory for saving plugins.
Definition: PluginController.java:85
net.sf.gridarta.gui.dialog.plugin.PluginController.savePluginAs
boolean savePluginAs(@NotNull final Plugin< G, A, R > plugin, final boolean updatePluginFile)
Prompts the user for a file name to save a plugin.
Definition: PluginController.java:209
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.utils.ResourceIcons
Creates ImageIcon instances from resources.
Definition: ResourceIcons.java:46
net.sf.gridarta.utils.EditorAction
A global editor action.
Definition: EditorAction.java:29
net.sf.gridarta.gui.dialog.plugin.PluginController.view
final PluginView< G, A, R > view
Definition: PluginController.java:70
net.sf.gridarta.gui.dialog.plugin.PluginController.canExit
boolean canExit()
Prompts the user for all unsaved plugins.
Definition: PluginController.java:144
net.sf.gridarta.gui.dialog.plugin.PluginController
Controller for plugins.
Definition: PluginController.java:55
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.dialog.plugin.PluginController.parent
final Component parent
The parent component for dialog boxes.
Definition: PluginController.java:76
net.sf.gridarta.gui.dialog.plugin.PluginView.createConsole
ConsoleInterface createConsole(@NotNull final String name)
Definition: PluginView.java:210
net.sf.gridarta.gui.dialog.plugin.PluginController.pluginParameters
final PluginParameters pluginParameters
Definition: PluginController.java:67
net.sf.gridarta.gui.dialog.plugin.PluginController.runPlugin
void runPlugin(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginController.java:234
net.sf.gridarta.plugin.PluginModel
Definition: PluginModel.java:49
net.sf.gridarta.gui.dialog.plugin.PluginController.pluginModel
final PluginModel< G, A, R > pluginModel
Definition: PluginController.java:64