Gridarta Editor
PluginManager.java
Go to the documentation of this file.
1 /*
2  * Gridarta MMORPG map editor for Crossfire, Daimonin and similar games.
3  * Copyright (C) 2000-2015 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.BorderLayout;
23 import java.awt.CardLayout;
24 import java.awt.Color;
25 import java.awt.Component;
26 import java.awt.Container;
27 import java.awt.GridLayout;
28 import java.util.HashMap;
29 import java.util.Map;
30 import javax.swing.AbstractListModel;
31 import javax.swing.JButton;
32 import javax.swing.JFrame;
33 import javax.swing.JList;
34 import javax.swing.JOptionPane;
35 import javax.swing.JPanel;
36 import javax.swing.ListModel;
37 import javax.swing.ListSelectionModel;
38 import javax.swing.border.LineBorder;
39 import javax.swing.event.ListSelectionEvent;
40 import javax.swing.event.ListSelectionListener;
45 import net.sf.gridarta.plugin.Plugin;
50 import net.sf.japi.swing.action.ActionBuilder;
51 import net.sf.japi.swing.action.ActionBuilderFactory;
52 import net.sf.japi.swing.action.ActionMethod;
53 import org.jetbrains.annotations.NotNull;
54 import org.jetbrains.annotations.Nullable;
55 
56 public class PluginManager<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> {
57 
61  @NotNull
62  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
63 
64  @NotNull
65  private final JFrame frame = new JFrame(ActionBuilderUtils.getString(ACTION_BUILDER, "pluginManagerTitle"));
66 
67  @NotNull
68  private final JList<Plugin<G, A, R>> scripts;
69 
70  @NotNull
71  private final CardLayout scriptLayout = new CardLayout();
72 
73  @NotNull
74  private final Container scriptPanel = new JPanel(scriptLayout);
75 
76  @NotNull
78 
79  @NotNull
81 
82  @NotNull
84 
88  @NotNull
90 
91  //TODO fix a memory leak. If a script is remove, it stays in hash map along with it's visual component
92 
93  @NotNull
94  private final Map<Plugin<G, A, R>, PluginEditor<G, A, R>> components = new HashMap<>();
95 
104  this.pluginController = pluginController;
105  this.pluginModel = pluginModel;
106  this.pluginParameterViewFactory = pluginParameterViewFactory;
107  this.resourceIcons = resourceIcons;
108  frame.getContentPane().setLayout(new BorderLayout());
109  final ListModel<Plugin<G, A, R>> listModel = new AbstractListModel<Plugin<G, A, R>>() {
110 
114  private static final long serialVersionUID = 1L;
115 
120  private final PluginModelListener<G, A, R> scriptModelListener = new PluginModelListener<G, A, R>() {
121 
122  @Override
123  public void pluginCreated(@NotNull final Plugin<G, A, R> plugin) {
124  fireContentsChanged(scripts, 0, PluginManager.this.pluginModel.getPluginCount() + 1);
125  }
126 
127  @Override
128  public void pluginDeleted(@NotNull final Plugin<G, A, R> plugin) {
129  fireContentsChanged(scripts, 0, PluginManager.this.pluginModel.getPluginCount() + 1);
130  }
131 
132  @Override
133  public void pluginRegistered(@NotNull final Plugin<G, A, R> plugin) {
134  fireContentsChanged(scripts, 0, PluginManager.this.pluginModel.getPluginCount() + 1);
135  }
136 
137  @Override
138  public void pluginUnregistered(@NotNull final Plugin<G, A, R> plugin) {
139  fireContentsChanged(scripts, 0, PluginManager.this.pluginModel.getPluginCount() + 1);
140  }
141 
142  };
143 
144  {
145  PluginManager.this.pluginModel.addPluginModelListener(scriptModelListener);
146  }
147 
148  @Nullable
149  @Override
150  public Plugin<G, A, R> getElementAt(final int index) {
151  return PluginManager.this.pluginModel.getPlugin(index);
152  }
153 
154  @Override
155  public int getSize() {
157  }
158  };
159 
160  scripts = new JList<>(listModel);
161  scripts.addListSelectionListener(new ListSelectionListener() {
162 
163  @Override
164  public void valueChanged(final ListSelectionEvent e) {
165  if (!e.getValueIsAdjusting()) {
166  showScript(scripts.getSelectedValue());
167  }
168  }
169  });
170  scripts.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
171  scripts.setBorder(new LineBorder(Color.black, 1));
172  scripts.setSelectedIndex(0);
173 
174  final Container bottomLeft = new JPanel(new GridLayout(2, 1));
175  bottomLeft.add(new JButton(ACTION_BUILDER.createAction(false, "pluginManagerNewScript", this)));
176  bottomLeft.add(new JButton(ACTION_BUILDER.createAction(false, "pluginManagerRemoveScript", this)));
177 
178  final Container left = new JPanel(new BorderLayout());
179  left.add(scripts, BorderLayout.CENTER);
180  left.add(bottomLeft, BorderLayout.SOUTH);
181 
182  frame.getContentPane().add(left, BorderLayout.WEST);
183  frame.getContentPane().add(scriptPanel, BorderLayout.CENTER);
184  frame.pack();
185  frame.setLocationRelativeTo(parent);
186  }
187 
188  private void showScript(@Nullable final Plugin<G, A, R> plugin) {
189  /* using a card layout is a necessary trick as
190  * simply removing previous component and putting
191  * the new one in the JPanel lead to problem unless
192  * we recreate the component each time
193  * (the validate process goes strangely and only portions
194  * of component are redrawn until window resize :s)
195  */
196  if (plugin == null) {
197  return;
198  }
199 
200  PluginEditor<G, A, R> pluginEditor = components.get(plugin);
201  if (pluginEditor == null) {
203  components.put(plugin, pluginEditor);
204  scriptPanel.add(pluginEditor.getComponent(), Integer.toString(pluginEditor.hashCode()));
205  }
206  scriptLayout.show(scriptPanel, Integer.toString(pluginEditor.hashCode()));
207  }
208 
209  private void removeScript(@NotNull final Plugin<G, A, R> plugin) {
210  final PluginEditor<?, ?, ?> scriptEditor = components.get(plugin);
211  if (scriptEditor != null) {
212  components.remove(plugin);
213  scriptPanel.remove(scriptEditor.getComponent());
214  }
215  }
216 
220  public void show() {
221  frame.setVisible(true);
222  }
223 
227  @ActionMethod
228  public void pluginManagerNewScript() {
229  final String name = JOptionPane.showInputDialog(scripts, ActionBuilderUtils.getString(ACTION_BUILDER, "pluginManagerNewScriptTitle"));
230  if (name == null) {
231  return;
232  }
233 
234  final Plugin<G, A, R> plugin = pluginModel.newPlugin(name, "//input your beanshell Code");
235  if (plugin == null) {
236  final String title = ActionBuilderUtils.getString(ACTION_BUILDER, "pluginManagerNewScriptExists.title");
237  final String message = ActionBuilderUtils.format(ACTION_BUILDER, "pluginManagerNewScriptExists.message", name);
238  JOptionPane.showMessageDialog(scripts, message, title, JOptionPane.WARNING_MESSAGE);
239  return;
240  }
241 
242  showScript(plugin);
243  }
244 
248  @ActionMethod
250  final Plugin<G, A, R> plugin = scripts.getSelectedValue();
251  if (plugin == null) {
252  return;
253  }
254 
255  final String title = ActionBuilderUtils.getString(ACTION_BUILDER, "pluginManagerRemoveScriptConfirm.title");
256  final String message = ActionBuilderUtils.format(ACTION_BUILDER, "pluginManagerRemoveScriptConfirm.message", plugin.getName());
257  if (JOptionPane.showConfirmDialog(scripts, message, title, JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) {
258  return;
259  }
260 
261  pluginModel.removePlugin(plugin);
262  scripts.setSelectedIndex(0);
263  removeScript(plugin);
264  }
265 
266 }
net.sf.gridarta.gui.dialog.plugin.PluginManager.pluginController
final PluginController< G, A, R > pluginController
Definition: PluginManager.java:77
net.sf.gridarta.plugin
Definition: BshRunnable.java:20
net.sf.gridarta.plugin.PluginModel.newPlugin
Plugin< G, A, R > newPlugin(@NotNull final String name, @NotNull final String code)
Definition: PluginModel.java:219
net.sf.gridarta
net.sf.gridarta.plugin.PluginModel.addPluginModelListener
void addPluginModelListener(@NotNull final PluginModelListener< G, A, R > listener)
Definition: PluginModel.java:155
net.sf.gridarta.plugin.PluginModel.removePlugin
void removePlugin(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginModel.java:125
net.sf.gridarta.plugin.PluginModelListener
Definition: PluginModelListener.java:32
net.sf.gridarta.plugin.Plugin.getName
String getName()
Definition: Plugin.java:148
net.sf.gridarta.gui.dialog.plugin.PluginEditor.getComponent
Component getComponent()
Definition: PluginEditor.java:352
net.sf
net.sf.gridarta.gui.dialog.plugin.PluginManager.pluginModel
final PluginModel< G, A, R > pluginModel
Definition: PluginManager.java:80
net.sf.gridarta.gui.dialog.plugin.PluginManager.scripts
final JList< Plugin< G, A, R > > scripts
Definition: PluginManager.java:68
net.sf.gridarta.model.archetype
Definition: AbstractArchetype.java:20
net.sf.gridarta.model.gameobject.GameObject
Definition: GameObject.java:36
net.sf.gridarta.gui.dialog.plugin.PluginManager.pluginManagerNewScript
void pluginManagerNewScript()
Definition: PluginManager.java:228
net.sf.gridarta.gui.dialog.plugin.parameter
net.sf.gridarta.gui.dialog.plugin.PluginManager.scriptLayout
final CardLayout scriptLayout
Definition: PluginManager.java:71
net.sf.gridarta.gui
net.sf.gridarta.model.gameobject
Definition: AbstractGameObject.java:20
net
net.sf.gridarta.gui.dialog.plugin.PluginManager.resourceIcons
final ResourceIcons resourceIcons
Definition: PluginManager.java:89
net.sf.gridarta.model.maparchobject.MapArchObject
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.gui.dialog.plugin.PluginManager.showScript
void showScript(@Nullable final Plugin< G, A, R > plugin)
Definition: PluginManager.java:188
net.sf.gridarta.utils.ActionBuilderUtils.format
static String format(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final Object... args)
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)
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.dialog
net.sf.gridarta.gui.dialog.plugin.PluginManager.pluginManagerRemoveScript
void pluginManagerRemoveScript()
Definition: PluginManager.java:249
net.sf.gridarta.gui.dialog.plugin
Definition: CloseableTabbedPane.java:47
net.sf.gridarta.gui.dialog.plugin.PluginManager.components
final Map< Plugin< G, A, R >, PluginEditor< G, A, R > > components
Definition: PluginManager.java:94
net.sf.gridarta.gui.dialog.plugin.parameter.PluginParameterViewFactory
Definition: PluginParameterViewFactory.java:49
net.sf.gridarta.gui.dialog.plugin.PluginManager.show
void show()
Definition: PluginManager.java:220
net.sf.gridarta.model
net.sf.gridarta.model.archetype.Archetype
Definition: Archetype.java:41
net.sf.gridarta.gui.dialog.plugin.PluginEditor
Definition: PluginEditor.java:64
net.sf.gridarta.plugin.Plugin
Definition: Plugin.java:53
net.sf.gridarta.gui.dialog.plugin.PluginManager.removeScript
void removeScript(@NotNull final Plugin< G, A, R > plugin)
Definition: PluginManager.java:209
net.sf.gridarta.utils.ActionBuilderUtils
Definition: ActionBuilderUtils.java:31
net.sf.gridarta.gui.dialog.plugin.PluginManager.pluginParameterViewFactory
final PluginParameterViewFactory< G, A, R > pluginParameterViewFactory
Definition: PluginManager.java:83
net.sf.gridarta.model.maparchobject
Definition: AbstractMapArchObject.java:20
net.sf.gridarta.gui.dialog.plugin.PluginManager
Definition: PluginManager.java:56
net.sf.gridarta.utils.ResourceIcons
Definition: ResourceIcons.java:46
net.sf.gridarta.gui.dialog.plugin.PluginManager.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: PluginManager.java:62
net.sf.gridarta.gui.dialog.plugin.PluginController< G, A, R >
net.sf.gridarta.gui.dialog.plugin.PluginManager.frame
final JFrame frame
Definition: PluginManager.java:65
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.dialog.plugin.PluginManager.PluginManager
PluginManager(@NotNull final Component parent, @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)
Definition: PluginManager.java:103
net.sf.gridarta.plugin.PluginModel.getPluginCount
int getPluginCount()
Definition: PluginModel.java:83
net.sf.gridarta.gui.dialog.plugin.PluginManager.scriptPanel
final Container scriptPanel
Definition: PluginManager.java:74
net.sf.gridarta.plugin.PluginModel
Definition: PluginModel.java:49