Gridarta Editor
CFTreasureListTree.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.treasurelist;
21 
22 import java.awt.BorderLayout;
23 import java.awt.Component;
24 import java.awt.Container;
25 import java.awt.Frame;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import javax.swing.AbstractButton;
29 import javax.swing.BorderFactory;
30 import javax.swing.JButton;
31 import javax.swing.JDialog;
32 import javax.swing.JPanel;
33 import javax.swing.JScrollPane;
34 import javax.swing.JSplitPane;
35 import javax.swing.JTree;
36 import javax.swing.JViewport;
37 import javax.swing.ScrollPaneConstants;
38 import javax.swing.WindowConstants;
39 import javax.swing.text.JTextComponent;
40 import javax.swing.tree.DefaultMutableTreeNode;
41 import javax.swing.tree.TreeNode;
42 import javax.swing.tree.TreePath;
51 import net.sf.japi.swing.action.ActionBuilder;
52 import net.sf.japi.swing.action.ActionBuilderFactory;
53 import org.jetbrains.annotations.NotNull;
54 import org.jetbrains.annotations.Nullable;
55 
63 public class CFTreasureListTree extends JTree {
64 
68  @NotNull
69  public static final String NONE_SYM = "<none>";
70 
74  @NotNull
75  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
76 
80  private static final long serialVersionUID = 1L;
81 
85  @NotNull
86  private final TreasureTree treasureTree;
87 
92  @NotNull
93  private final Frame parent;
94 
99  @Nullable
100  private JDialog frame;
101 
106  @NotNull
107  private final AbstractButton okButton = new JButton("Select");
108 
113  @NotNull
114  private final AbstractButton noneButton = new JButton("None");
115 
120  @Nullable
121  private JTextComponent input;
122 
132  public CFTreasureListTree(@NotNull final TreasureTree treasureTree, @NotNull final Frame parent, @NotNull final ArchetypeSet<?, ?, ?> archetypeSet, @NotNull final FaceObjectProviders faceObjectProviders, @NotNull final ResourceIcons resourceIcons) {
133  super(treasureTree.getRoot());
134  this.treasureTree = treasureTree;
135  this.parent = parent;
136 
137  final FaceObjectProvidersListener faceObjectProvidersListener = this::repaint;
138  faceObjectProviders.addFaceObjectProvidersListener(faceObjectProvidersListener);
139 
140  putClientProperty("JTree.lineStyle", "Angled");
141  setCellRenderer(new TreasureCellRenderer(archetypeSet, treasureTree.getRoot(), faceObjectProviders, resourceIcons));
142  }
143 
153  public synchronized void showDialog(@Nullable final JTextComponent input, @NotNull final Component parent) {
154  this.input = input;
155 
156  final boolean hasBeenDisplayed = frame != null;
157  if (frame == null) {
158  // open a popup dialog which temporarily disables all other frames
159  frame = new JDialog(this.parent, "Treasurelists", false);
160  frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
161 
162  setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 5));
163  final JScrollPane scrollPane = new JScrollPane(this);
164  scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
165  scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
166  scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
167 
168  final JPanel buttonPanel = buildButtonPanel();
169  final JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, scrollPane, buttonPanel);
170  splitPane.setOneTouchExpandable(false);
171  assert frame != null;
172  splitPane.setDividerLocation(frame.getHeight() - buttonPanel.getMinimumSize().height - 4);
173 
174  splitPane.setDividerSize(4);
175  splitPane.setResizeWeight(1.0);
176 
177  assert frame != null;
178  frame.getContentPane().add(splitPane);
179 
180  expandPath(new TreePath(treasureTree.getRoot()));
181  } else {
182  if (frame.isShowing()) {
183  assert frame != null;
184  frame.setVisible(false);
185  }
186 
187  // collapse everything except root
188  expandPath(new TreePath(treasureTree.getRoot()));
189  for (int i = getRowCount() - 1; i > 0; i--) {
190  collapseRow(i);
191  }
192  }
193 
194  okButton.setVisible(input != null);
195  noneButton.setVisible(input != null);
196 
197  assert frame != null;
198  frame.setSize(470, 550);
199  assert frame != null;
200  frame.setLocationRelativeTo(parent);
201 
202  if (input == null) {
203  scrollRowToVisible(0);
204  setSelectionPath(null);
205  } else {
206  final String listName = input.getText().trim(); // name of pre-selected list
207  final DefaultMutableTreeNode treasureNode = treasureTree.get(listName);
208  if (treasureNode == null) {
209  scrollRowToVisible(0);
210  setSelectionPath(null);
211  } else {
212  final DefaultMutableTreeNode[] node = new DefaultMutableTreeNode[2];
213  node[0] = treasureTree.getRoot();
214  node[1] = treasureNode;
215  final TreePath treePath = new TreePath(node);
216  expandPath(treePath);
217  setSelectionPath(treePath);
218 
219  if (!hasBeenDisplayed) {
220  // If this is the first time, the frame has to be packed,
221  // otherwise no scrolling would be possible (see below).
222  assert frame != null;
223  frame.pack();
224  assert frame != null;
225  frame.setSize(470, 550);
226  setSelectionPath(treePath);
227  }
228 
229  scrollRowToVisible(getRowCount() - 1);
230  scrollPathToVisible(treePath);
231  }
232  }
233  assert frame != null;
234  frame.setVisible(true);
235  }
236 
241  @NotNull
242  private JPanel buildButtonPanel() {
243  final JPanel buttonPanel = new JPanel(new BorderLayout());
244 
245  final Container leftSide = new JPanel();
246  final Container rightSide = new JPanel();
247 
248  okButton.addActionListener(new ActionListener() {
249 
250  @Override
251  public void actionPerformed(@NotNull final ActionEvent e) {
252  final String result = getSelectedTreasureList();
253  if (result != null) {
254  selectValue(result);
255  }
256  }
257 
258  });
259  rightSide.add(okButton);
260 
261  noneButton.addActionListener(new ActionListener() {
262 
263  @Override
264  public void actionPerformed(@NotNull final ActionEvent e) {
265  // print "none" into the attribute dialog
267  }
268 
269  });
270  rightSide.add(noneButton);
271 
272  final AbstractButton cancelButton = new JButton("Cancel");
273  cancelButton.addActionListener(new ActionListener() {
274 
275  @Override
276  public void actionPerformed(@NotNull final ActionEvent e) {
277  assert frame != null;
278  frame.setVisible(false);
279  }
280 
281  });
282  rightSide.add(cancelButton);
283 
284  final AbstractButton helpButton = new JButton("Help");
285  helpButton.addActionListener(new ActionListener() {
286 
287  @Override
288  public void actionPerformed(@NotNull final ActionEvent e) {
289  new Help(parent, "treasurelists.html").setVisible(true);
290  }
291 
292  });
293  leftSide.add(helpButton);
294  final Component testButton = new JButton("Test");
295  leftSide.add(testButton);
296  testButton.setEnabled(false); // disable test button until implemented
297 
298  buttonPanel.add(leftSide, BorderLayout.WEST);
299  buttonPanel.add(rightSide, BorderLayout.EAST);
300  return buttonPanel;
301  }
302 
307  private void selectValue(@NotNull final String result) {
308  if (input != null) {
309  input.setText(" " + result);
310  }
311  assert frame != null;
312  frame.setVisible(false);
313  }
314 
321  @Nullable
322  private String getSelectedTreasureList() {
323  if (isSelectionEmpty()) {
324  return null;
325  }
326 
327  TreeNode node = (TreeNode) getSelectionPath().getLastPathComponent();
328 
329  if (node == treasureTree.getRoot()) {
330  return null;
331  }
332 
333  while (true) {
334  final TreeNode parentNode = node.getParent();
335  if (parentNode == treasureTree.getRoot()) {
336  break;
337  }
338  node = parentNode;
339  }
340 
341  // When a treasurelist inside a special sub folder (like
342  // "God Intervention") is selected, also return null because those must
343  // not be used on maps.
344  final TreasureTreeNode treasureTreeNode = (TreasureTreeNode) node;
345  if (treasureTreeNode.getTreasureObj() instanceof FolderTreasureObj) {
346  ACTION_BUILDER.showMessageDialog(frame, "treasurelistForbidden", treasureTreeNode.getTreasureObj().getName());
347  return null;
348  }
349 
350  return treasureTreeNode.getTreasureObj().getName();
351  }
352 
353 }
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.serialVersionUID
static final long serialVersionUID
Definition: CFTreasureListTree.java:80
net.sf.gridarta.model.treasurelist.TreasureTreeNode
Definition: TreasureTreeNode.java:33
net.sf.gridarta
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.selectValue
void selectValue(@NotNull final String result)
Definition: CFTreasureListTree.java:307
net.sf.gridarta.model.treasurelist.TreasureObj.getName
String getName()
Definition: TreasureObj.java:225
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: CFTreasureListTree.java:75
net.sf.gridarta.model.treasurelist.TreasureTree.get
TreasureTreeNode get(@NotNull final String name)
Definition: TreasureTree.java:60
net.sf
net.sf.gridarta.model.face.FaceObjectProviders
Definition: FaceObjectProviders.java:46
net.sf.gridarta.gui.treasurelist.TreasureCellRenderer
Definition: TreasureCellRenderer.java:49
net.sf.gridarta.gui.dialog.help.Help
Definition: Help.java:42
net.sf.gridarta.gui
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.treasureTree
final TreasureTree treasureTree
Definition: CFTreasureListTree.java:86
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.noneButton
final AbstractButton noneButton
Definition: CFTreasureListTree.java:114
net
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.okButton
final AbstractButton okButton
Definition: CFTreasureListTree.java:107
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.parent
final Frame parent
Definition: CFTreasureListTree.java:93
net.sf.gridarta.model.treasurelist.TreasureTree
Definition: TreasureTree.java:32
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.getSelectedTreasureList
String getSelectedTreasureList()
Definition: CFTreasureListTree.java:322
net.sf.gridarta.model.treasurelist.TreasureTree.getRoot
DefaultMutableTreeNode getRoot()
Definition: TreasureTree.java:87
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.input
JTextComponent input
Definition: CFTreasureListTree.java:121
net.sf.gridarta.gui.dialog.help
Definition: Help.java:20
net.sf.gridarta.model.archetypeset.ArchetypeSet
Definition: ArchetypeSet.java:37
net.sf.gridarta.gui.dialog
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.NONE_SYM
static final String NONE_SYM
Definition: CFTreasureListTree.java:69
net.sf.gridarta.model
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.buildButtonPanel
JPanel buildButtonPanel()
Definition: CFTreasureListTree.java:242
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.CFTreasureListTree
CFTreasureListTree(@NotNull final TreasureTree treasureTree, @NotNull final Frame parent, @NotNull final ArchetypeSet<?, ?, ?> archetypeSet, @NotNull final FaceObjectProviders faceObjectProviders, @NotNull final ResourceIcons resourceIcons)
Definition: CFTreasureListTree.java:132
net.sf.gridarta.model.face.FaceObjectProvidersListener
Definition: FaceObjectProvidersListener.java:29
net.sf.gridarta.model.face
Definition: AbstractFaceObjects.java:20
net.sf.gridarta.model.treasurelist.TreasureTreeNode.getTreasureObj
TreasureObj getTreasureObj()
Definition: TreasureTreeNode.java:100
net.sf.gridarta.model.treasurelist.FolderTreasureObj
Definition: FolderTreasureObj.java:28
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.frame
JDialog frame
Definition: CFTreasureListTree.java:100
net.sf.gridarta.utils.ResourceIcons
Definition: ResourceIcons.java:46
net.sf.gridarta.model.treasurelist
Definition: ArchTreasureObj.java:20
net.sf.gridarta.model.archetypeset
Definition: ArchetypeSet.java:20
net.sf.gridarta.gui.treasurelist.CFTreasureListTree.showDialog
synchronized void showDialog(@Nullable final JTextComponent input, @NotNull final Component parent)
Definition: CFTreasureListTree.java:153
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.treasurelist.CFTreasureListTree
Definition: CFTreasureListTree.java:63