Gridarta Editor
PluginView.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 bsh.ConsoleInterface;
23 import java.awt.BorderLayout;
24 import java.awt.Component;
25 import java.awt.Container;
26 import java.awt.GridBagConstraints;
27 import java.awt.GridBagLayout;
28 import java.awt.Insets;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.Map;
32 import javax.swing.AbstractButton;
33 import javax.swing.Action;
34 import javax.swing.JComponent;
35 import javax.swing.JDialog;
36 import javax.swing.JFrame;
37 import javax.swing.JLabel;
38 import javax.swing.JMenu;
39 import javax.swing.JMenuItem;
40 import javax.swing.JOptionPane;
41 import javax.swing.JPanel;
48 import net.sf.gridarta.plugin.Plugin;
56 import net.sf.japi.swing.action.ActionBuilder;
57 import net.sf.japi.swing.action.ActionBuilderFactory;
58 import org.jetbrains.annotations.NotNull;
59 import org.jetbrains.annotations.Nullable;
60 
65 public class PluginView<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> {
66 
70  @NotNull
71  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
72 
73  @NotNull
75 
79  @NotNull
80  private final Iterable<Plugin<G, A, R>> pluginModel;
81 
82  @NotNull
84 
88  @NotNull
90 
94  @Nullable
95  private JMenu menuScripts;
96 
97  @Nullable
98  private JFrame console;
99 
100  @Nullable
102 
106  @NotNull
107  private final Object sync = new Object();
108 
113  @NotNull
115 
116  @Override
117  public void pluginCreated(@NotNull final Plugin<G, A, R> plugin) {
119  }
120 
121  @Override
122  public void pluginDeleted(@NotNull final Plugin<G, A, R> plugin) {
124  }
125 
126  @Override
127  public void pluginRegistered(@NotNull final Plugin<G, A, R> plugin) {
129  }
130 
131  @Override
132  public void pluginUnregistered(@NotNull final Plugin<G, A, R> plugin) {
134  }
135 
136  };
137 
147  this.pluginController = pluginController;
148  this.pluginModel = pluginModel;
149  this.pluginParameterViewFactory = pluginParameterViewFactory;
150  this.resourceIcons = resourceIcons;
151  pluginModel.addPluginModelListener(pluginModelListener);
152  }
153 
159  public void setMenu(@Nullable final JMenu menuScripts) {
160  synchronized (sync) {
161  this.menuScripts = menuScripts;
163  }
164  }
165 
169  private void updateMenuEntries() {
170  synchronized (sync) {
171  final JMenu tmpMenuScripts = menuScripts;
172  if (tmpMenuScripts == null) {
173  return;
174  }
175 
176  MenuUtils.removeAllToSeparator(tmpMenuScripts);
177 
178  int index = 0;
179  for (final Plugin<G, A, R> plugin : pluginModel) {
180  if (!plugin.isScript()) {
181  continue;
182  }
183 
184  final Action action = pluginController.createRunAction(plugin);
185  final AbstractButton item = new JMenuItem(action);
186  item.setActionCommand(plugin.getName());
187  tmpMenuScripts.add(item, index++);
188  }
189  if (index == 0) {
190  final Component def = new JMenuItem(ActionBuilderUtils.getString(ACTION_BUILDER, "pluginViewNoScripts"));
191  def.setEnabled(false);
192  tmpMenuScripts.add(def, 0);
193  }
194  }
195  }
196 
197  private void showConsoleFrame() {
198  synchronized (sync) {
199  if (console == null) {
200  console = new JFrame(ActionBuilderUtils.getString(ACTION_BUILDER, "pluginViewConsoleTitle"));
201  console.setSize(400, 200);
203  console.getContentPane().add(consolePane);
204  }
205  console.setVisible(true);
206  }
207  }
208 
209  @NotNull
210  public ConsoleInterface createConsole(@NotNull final String name) {
212  final PluginConsole pluginConsole = new PluginConsole();
213  consolePane.addTab(name, pluginConsole);
214  return pluginConsole;
215  }
216 
223  @Nullable
224  public Map<String, Object> getRunValues(@NotNull final Plugin<G, A, R> plugin, @NotNull final Component parent) {
225  if (!plugin.hasParameters()) {
226  return Collections.emptyMap();
227  }
228 
229  final JOptionPane p = new PluginViewPane();
230  p.setOptionType(JOptionPane.OK_CANCEL_OPTION);
231  p.setMessageType(JOptionPane.QUESTION_MESSAGE);
232  p.setMessage(ActionBuilderUtils.format(ACTION_BUILDER, "pluginViewProvideParameters", plugin.getName()));
233  final GridBagLayout layout = new GridBagLayout();
234  final Container panel = new JPanel(layout);
235  final JDialog dialog = p.createDialog(parent, plugin.getName());
236  dialog.setModal(true);
237  dialog.getContentPane().removeAll();
238  int i = 0;
239  for (final PluginParameter<G, A, R, ?> parameter : plugin) {
240  final Component name = new JLabel(parameter.getName());
242  final JComponent val = view.getValueComponent();
243  val.setToolTipText(parameter.getDescription());
244  final GridBagConstraints gn = new GridBagConstraints(0, i, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 5, 5);
245  final GridBagConstraints gf = new GridBagConstraints(1, i, 1, 1, 1.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 5, 5);
246  panel.add(name, gn);
247  panel.add(val, gf);
248  i++;
249  }
250 
251  dialog.getContentPane().setLayout(new BorderLayout());
252  dialog.getContentPane().add(panel, BorderLayout.CENTER);
253  dialog.getContentPane().add(p, BorderLayout.SOUTH);
254  dialog.pack();
255  dialog.setVisible(true);
256  final Object result = p.getValue();
257  if (!(result instanceof Integer) || (Integer) result != JOptionPane.YES_OPTION) {
258  return null;
259  }
260  final Map<String, Object> parameterValues = new HashMap<>();
261  for (final PluginParameter<G, A, R, ?> parameter : plugin) {
262  final String parameterName = parameter.getName();
263  final Object parameterValue;
264  try {
265  parameterValue = parameter.getValue();
266  } catch (final InvalidValueException ex) {
267  JOptionPane.showMessageDialog(parent, "Invalid value for parameter " + parameterName + ": " + ex.getMessage());
268  return null;
269  }
270  parameterValues.put(parameterName, parameterValue);
271  }
272  return parameterValues;
273  }
274 
275 }
name
name
Definition: ArchetypeTypeSetParserTest-ignoreDefaultAttribute1-result.txt:2
net.sf.gridarta.plugin
Definition: BshRunnable.java:20
net.sf.gridarta.plugin.parameter.PluginParameter
Parameter for a Plugin.
Definition: PluginParameter.java:33
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.dialog.plugin.PluginView.console
JFrame console
Definition: PluginView.java:98
net.sf.gridarta.gui.dialog.plugin.CloseableTabbedPane.addTab
void addTab(@NotNull final String title, @NotNull final Component component)
Definition: CloseableTabbedPane.java:76
net.sf.gridarta.plugin.PluginModelListener
Listener interface for scripting related events.
Definition: PluginModelListener.java:32
net.sf.gridarta.gui.dialog.plugin.PluginView.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The ActionBuilder instance.
Definition: PluginView.java:71
net.sf
net.sf.gridarta.gui.dialog.plugin.PluginView.updateMenuEntries
void updateMenuEntries()
Refresh the menu entries.
Definition: PluginView.java:169
net.sf.gridarta.gui.dialog.plugin.parameter.PluginParameterView.getValueComponent
JComponent getValueComponent()
Returns a JComponent for editing the parameter value.
net.sf.gridarta.gui.dialog.plugin.PluginView.sync
final Object sync
The object used for synchronization.
Definition: PluginView.java:107
net.sf.gridarta.gui.dialog.plugin.PluginView.pluginParameterViewFactory
final PluginParameterViewFactory< G, A, R > pluginParameterViewFactory
Definition: PluginView.java:83
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.gui.dialog.plugin.parameter.PluginParameterViewFactory.newPluginParameterView
PluginParameterView newPluginParameterView(@NotNull final Component parent, @NotNull final PluginParameter< G, A, R, ?> parameter)
Definition: PluginParameterViewFactory.java:94
net.sf.gridarta.model.gameobject.GameObject
Reflects a game object (object on a map).
Definition: GameObject.java:36
net.sf.gridarta.gui.dialog.plugin.parameter
net.sf.gridarta.gui.dialog.plugin.PluginView.pluginController
final PluginController< G, A, R > pluginController
Definition: PluginView.java:74
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.dialog.plugin.PluginView.pluginModel
final Iterable< Plugin< G, A, R > > pluginModel
The script model.
Definition: PluginView.java:80
net.sf.gridarta.gui.utils.MenuUtils.removeAllToSeparator
static void removeAllToSeparator(@NotNull final JMenu menu)
Remove all menu entries up to (but not including) the first separator.
Definition: MenuUtils.java:83
net.sf.gridarta.model.gameobject
GameObjects are the objects based on Archetypes found on maps.
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.utils.ResourceIcons.CLOSE_TAB_SMALL_ICON
static final String CLOSE_TAB_SMALL_ICON
Definition: ResourceIcons.java:124
net.sf.gridarta.gui.dialog.plugin.PluginView
View for Scripts.
Definition: PluginView.java:65
net.sf.gridarta.gui.dialog.plugin.CloseableTabbedPane
Definition: CloseableTabbedPane.java:54
net.sf.gridarta.model.maparchobject.MapArchObject
Interface for MapArchObjects.
Definition: MapArchObject.java:40
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.gui.dialog.plugin.PluginView.showConsoleFrame
void showConsoleFrame()
Definition: PluginView.java:197
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.utils.ActionBuilderUtils.format
static String format(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final Object... args)
Returns the value of a key.
Definition: ActionBuilderUtils.java:101
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.plugin.parameter.InvalidValueException
An exception that is thrown if the string representation of value in a {} cannot be converted to an o...
Definition: InvalidValueException.java:30
net.sf.gridarta.gui.dialog
net.sf.gridarta.gui.dialog.plugin.PluginView.consolePane
CloseableTabbedPane consolePane
Definition: PluginView.java:101
net.sf.gridarta.gui.dialog.plugin
Definition: CloseableTabbedPane.java:47
net.sf.gridarta.utils.ResourceIcons.getResourceIcon
ImageIcon getResourceIcon(@NotNull final String iconName)
Returns the image icon for the given icon name.
Definition: ResourceIcons.java:168
net.sf.gridarta.gui.dialog.plugin.PluginViewPane
Definition: PluginViewPane.java:29
net.sf.gridarta.gui.dialog.plugin.PluginView.pluginModelListener
final PluginModelListener< G, A, R > pluginModelListener
The script control listener to be notified about changes in {}.
Definition: PluginView.java:114
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.plugin.Plugin
Model for plugins.
Definition: Plugin.java:53
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.gui.dialog.plugin.PluginView.menuScripts
JMenu menuScripts
The menu to add script commands to.
Definition: PluginView.java:95
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.dialog.plugin.PluginView.PluginView
PluginView(@NotNull final PluginController< G, A, R > pluginController, @NotNull final PluginModel< G, A, R > pluginModel, @NotNull final PluginParameterViewFactory< G, A, R > pluginParameterViewFactory, @NotNull final ResourceIcons resourceIcons)
Creates a PluginView.
Definition: PluginView.java:146
net.sf.gridarta.utils.ResourceIcons
Creates ImageIcon instances from resources.
Definition: ResourceIcons.java:46
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.dialog.plugin.parameter.PluginParameterView
Interface for views that display plugin parameters.
Definition: PluginParameterView.java:29
net.sf.gridarta.gui.utils.MenuUtils
Utility class implementing menu related functions.
Definition: MenuUtils.java:39
net.sf.gridarta.plugin.PluginConsole
Definition: PluginConsole.java:24
net.sf.gridarta.gui.dialog.plugin.PluginView.setMenu
void setMenu(@Nullable final JMenu menuScripts)
Set the menu to add script commands to.
Definition: PluginView.java:159
net.sf.gridarta.gui.dialog.plugin.PluginController< G, A, R >
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.dialog.plugin.PluginView.createConsole
ConsoleInterface createConsole(@NotNull final String name)
Definition: PluginView.java:210
net.sf.gridarta.plugin.parameter
Definition: AbstractPathParameter.java:20
net.sf.gridarta.plugin.PluginModel
Definition: PluginModel.java:49
net.sf.gridarta.gui.dialog.plugin.PluginView.resourceIcons
final ResourceIcons resourceIcons
The ResourceIcons for creating icons.
Definition: PluginView.java:89