Gridarta Editor
Tab.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.utils.tabbedpanel;
21 
22 import java.awt.Component;
23 import java.awt.Dimension;
24 import java.awt.Insets;
25 import java.awt.event.MouseAdapter;
26 import java.awt.event.MouseEvent;
27 import java.awt.event.MouseListener;
28 import java.util.MissingResourceException;
29 import java.util.prefs.Preferences;
30 import javax.swing.AbstractButton;
31 import javax.swing.Action;
32 import javax.swing.JComponent;
33 import javax.swing.JMenu;
34 import javax.swing.JPopupMenu;
35 import net.sf.gridarta.MainControl;
40 import net.sf.japi.swing.action.ActionBuilder;
41 import net.sf.japi.swing.action.ActionBuilderFactory;
42 import net.sf.japi.swing.action.ToggleAction;
43 import org.jetbrains.annotations.NotNull;
44 import org.jetbrains.annotations.Nullable;
45 
53 public class Tab {
54 
58  private static final int SPACE = 6;
59 
63  @NotNull
64  private static final String TAB_OPEN_PREFIX = "MainWindow.tab_open.";
65 
69  @NotNull
70  private static final String TAB_WIDTH_PREFIX = "MainWindow.tab_width.";
71 
75  @NotNull
76  private static final String TAB_HEIGHT_PREFIX = "MainWindow.tab_height.";
77 
81  @NotNull
82  private static final String TAB_LOCATION = "MainWindow.tab_location.";
83 
87  @NotNull
88  private static final String TAB_ALT_LOCATION = "MainWindow.tab_alt_location.";
89 
93  @NotNull
94  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
95 
99  private static final Preferences PREFERENCES = Preferences.userNodeForPackage(MainControl.class);
100 
104  @NotNull
105  private final String ident;
106 
110  @NotNull
111  private final JComponent component;
112 
116  @NotNull
117  private AbstractButton button;
118 
122  @NotNull
123  private final TabButtonAction action;
124 
128  @NotNull
130 
134  @NotNull
135  private final JPopupMenu popupMenu = ACTION_BUILDER.createPopupMenu(false, "tabButtonMenu");
136 
140  @NotNull
141  private final JMenu moveToMenu;
142 
146  @Nullable
147  private ToggleAction splitModeAction;
148 
152  @NotNull
154 
159  private boolean alternativeLocation;
160 
164  private final int index;
165 
170  private int width;
171 
176  private int height;
177 
181  private boolean open;
182 
186  @NotNull
188 
194  @NotNull
195  private final MouseListener mouseListener = new MouseAdapter() {
196 
197  @Override
198  public void mousePressed(@NotNull final MouseEvent e) {
199  checkPopup(e);
200  }
201 
202  @Override
203  public void mouseReleased(@NotNull final MouseEvent e) {
204  checkPopup(e);
205  }
206 
211  private void checkPopup(@NotNull final MouseEvent e) {
212  if (e.isPopupTrigger()) {
213  getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
214  }
215  }
216 
217  };
218 
229  public Tab(@NotNull final String ident, @NotNull final JComponent component, @NotNull final Location defaultLocation, final boolean alternativeLocation, final int index, final boolean defaultOpen) {
230  this.ident = ident;
231  this.component = component;
232  final Dimension preferredSize = component.getPreferredSize();
233  final int defaultWidth = PREFERENCES.getInt(TAB_WIDTH_PREFIX + ident, preferredSize.width);
234  final int defaultHeight = PREFERENCES.getInt(TAB_HEIGHT_PREFIX + ident, preferredSize.height);
235  final Dimension minimumSize = component.getMinimumSize();
236  width = Math.max(defaultWidth, minimumSize.width);
237  height = Math.max(defaultHeight, minimumSize.height);
238  open = PREFERENCES.getBoolean(TAB_OPEN_PREFIX + ident, defaultOpen);
239  action = new TabButtonAction(ident);
240  final String locationString = PREFERENCES.get(TAB_LOCATION + ident, defaultLocation.toString());
241  try {
242  location = Location.valueOf(locationString);
243  } catch (final IllegalArgumentException ignored) {
244  location = defaultLocation;
245  }
246  this.alternativeLocation = PREFERENCES.getBoolean(TAB_ALT_LOCATION + ident, alternativeLocation);
247  this.index = index;
248  button = createButton();
249  final JMenu tmp = MenuUtils.findMenu(popupMenu, "tabButtonMoveTo");
250  if (tmp == null) {
251  throw new MissingResourceException("missing action ", MenuUtils.class.getName(), "tabButtonMoveTo");
252  }
253  moveToMenu = tmp;
254  }
255 
260  @NotNull
261  private AbstractButton createButton() {
262  final int acceleratorIndex = index < 10 ? index : -1;
263  action.setIndex(acceleratorIndex);
264  final AbstractButton result = location.createButton((String) action.getValue(Action.NAME));
265  result.setMargin(location.isTopOrBottom() ? new Insets(0, SPACE, 0, SPACE) : new Insets(SPACE, 0, SPACE, 0));
266  if (acceleratorIndex != -1) {
267  result.setMnemonic((int) '0' + index);
268  }
269  result.addMouseListener(mouseListener);
270  return result;
271  }
272 
277  public void addTabListener(@NotNull final TabListener listener) {
278  listeners.add(listener);
279  }
280 
285  public void removeTabListener(@NotNull final TabListener listener) {
286  listeners.remove(listener);
287  }
288 
293  @NotNull
294  public Component getComponent() {
295  return component;
296  }
297 
302  @NotNull
303  public AbstractButton getButton() {
304  return button;
305  }
306 
311  @NotNull
312  public JPopupMenu getPopupMenu() {
313  return popupMenu;
314  }
315 
320  @NotNull
321  public JMenu getMoveToMenu() {
322  return moveToMenu;
323  }
324 
330  public void setSplitModeAction(@Nullable final ToggleAction splitModeAction) {
331  this.splitModeAction = splitModeAction;
332  }
333 
338  public boolean isAlternativeLocation() {
339  return alternativeLocation;
340  }
341 
347  public void setAlternativeLocation(final boolean alternativeLocation) {
348  this.alternativeLocation = alternativeLocation;
349  PREFERENCES.putBoolean(TAB_ALT_LOCATION + ident, alternativeLocation);
350  if (splitModeAction != null) {
351  splitModeAction.setSelected(alternativeLocation);
352  }
353  }
354 
359  @NotNull
361  return location;
362  }
363 
368  public void setLocation(@NotNull final Location location) {
369  if (this.location == location) {
370  return;
371  }
372 
373  this.location = location;
374  button = createButton();
375  PREFERENCES.put(TAB_LOCATION + ident, location.toString());
376  }
377 
383  public int getSize() {
384  return location.isTopOrBottom() ? height : width;
385  }
386 
392  public void setSize(final int size) {
393  if (location.isTopOrBottom()) {
394  height = size;
395  PREFERENCES.putInt(TAB_HEIGHT_PREFIX + ident, size);
396  } else {
397  width = size;
398  PREFERENCES.putInt(TAB_WIDTH_PREFIX + ident, size);
399  }
400  }
401 
406  public boolean isOpen() {
407  return open;
408  }
409 
414  public void setOpen(final boolean open) {
415  if (this.open == open) {
416  return;
417  }
418 
419  this.open = open;
420  PREFERENCES.putBoolean(TAB_OPEN_PREFIX + ident, open);
421  }
422 
427  @NotNull
429  return severity;
430  }
431 
436  protected void setSeverity(@NotNull final Severity severity) {
437  if (this.severity == severity) {
438  return;
439  }
440 
441  this.severity = severity;
442  for (final TabListener listener : listeners.getListeners()) {
443  listener.severityChanged(severity);
444  }
445  }
446 
447 }
static final String TAB_OPEN_PREFIX
The key used to store the open status of a tab.
Definition: Tab.java:64
JMenu getMoveToMenu()
Returns the "Move To" menu within the button&#39;s context menu.
Definition: Tab.java:321
static final String TAB_WIDTH_PREFIX
The key used to store the preferred width of a tab.
Definition: Tab.java:70
Graphical User Interface of Gridarta.
T [] getListeners()
Returns an array of all the listeners.
final JPopupMenu popupMenu
The button&#39;s context menu.
Definition: Tab.java:135
createButton
The location on the top side.
Definition: Location.java:41
Interface for listeners interested in Tab related events.
final JMenu moveToMenu
The "Move To" menu within popupMenu.
Definition: Tab.java:141
A tab in a TabbedPanel component.
Definition: Tab.java:53
final TabButtonAction action
The button&#39;s action.
Definition: Tab.java:123
Location location
The tab&#39;s location.
Definition: Tab.java:153
Base package of all Gridarta classes.
static final Preferences PREFERENCES
The Preferences.
Definition: Tab.java:99
Location getLocation()
Returns the tab&#39;s location.
Definition: Tab.java:360
void addTabListener(@NotNull final TabListener listener)
Adds a TabListener to be notified.
Definition: Tab.java:277
void setSplitModeAction(@Nullable final ToggleAction splitModeAction)
Sets the ToggleAction to update if the "split mode" state changes.
Definition: Tab.java:330
boolean open
The tab&#39;s open status.
Definition: Tab.java:181
static final int SPACE
Additional space before and after the buttons&#39; text.
Definition: Tab.java:58
void removeTabListener(@NotNull final TabListener listener)
Removes a TabListener to be notified.
Definition: Tab.java:285
Utility class implementing menu related functions.
Definition: MenuUtils.java:39
Component getComponent()
Returns the Component that is shown when this tab is active.
Definition: Tab.java:294
void setLocation(@NotNull final Location location)
Sets the tab&#39;s location.
Definition: Tab.java:368
abstract boolean isTopOrBottom()
Returns whether this location is TOP or BOTTOM.
void remove(@NotNull final T listener)
Removes a listener.
static final String TAB_HEIGHT_PREFIX
The key used to store the preferred height of a tab.
Definition: Tab.java:76
final String ident
The tab&#39;s identification string.
Definition: Tab.java:105
void setSize(final int size)
Sets the tab&#39;s size.
Definition: Tab.java:392
int width
The tab&#39;s width when in locations Location#LEFT or Location#RIGHT.
Definition: Tab.java:170
Interface used as preferences location.
int height
The tab&#39;s height when in locations Location#TOP or Location#BOTTOM.
Definition: Tab.java:176
void add(@NotNull final T listener)
Adds a listener.
final MouseListener mouseListener
The MouseListener attached to button to open the context menu.
Definition: Tab.java:195
An javax.swing.Action for buttons in TabbedPanels.
static final ActionBuilder ACTION_BUILDER
The ActionBuilder.
Definition: Tab.java:94
boolean alternativeLocation
Whether the tab is shown in the alternative location (.
Definition: Tab.java:159
static final String TAB_LOCATION
The key used to store the current location of a tab.
Definition: Tab.java:82
int getSize()
Returns the tab&#39;s size.
Definition: Tab.java:383
AbstractButton button
The AbstractButton for showing or hiding the JComponent.
Definition: Tab.java:117
Severity levels for colors of tabs.
Definition: Severity.java:29
static JMenu findMenu(@NotNull final MenuElement menuElement, @NotNull final String key)
Returns a JMenu by action key.
Definition: MenuUtils.java:136
void setAlternativeLocation(final boolean alternativeLocation)
Sets whether the button is shown in the alternative location.
Definition: Tab.java:347
Severity severity
The tab&#39;s Severity.
Definition: Tab.java:187
Type-safe version of EventListenerList.
JPopupMenu getPopupMenu()
Returns the button&#39;s context menu.
Definition: Tab.java:312
final EventListenerList2< TabListener > listeners
The registered TabListeners to notify.
Definition: Tab.java:129
AbstractButton getButton()
Returns the AbstractButton for showing or hiding the component.
Definition: Tab.java:303
AbstractButton createButton()
Creates a button for this tab.
Definition: Tab.java:261
boolean isOpen()
Returns the tab&#39;s open status.
Definition: Tab.java:406
DEFAULT
The tab contents are unchanged from defaults.
Definition: Severity.java:34
boolean isAlternativeLocation()
Returns whether the button is shown in the alternative location.
Definition: Tab.java:338
Tab(@NotNull final String ident, @NotNull final JComponent component, @NotNull final Location defaultLocation, final boolean alternativeLocation, final int index, final boolean defaultOpen)
Creates a new instance.
Definition: Tab.java:229
void setIndex(final int index)
Sets the accelerator index.
void setSeverity(@NotNull final Severity severity)
Sets the tab&#39;s Severity.
Definition: Tab.java:436
ToggleAction splitModeAction
The ToggleAction to update if the "split mode" state changes.
Definition: Tab.java:147
final int index
The tab&#39;s index for ordering.
Definition: Tab.java:164
static final String TAB_ALT_LOCATION
The key used to store the current location of a tab.
Definition: Tab.java:88
final JComponent component
The JComponent that is shown when this tab is active.
Definition: Tab.java:111
void setOpen(final boolean open)
Sets the tab&#39;s open status.
Definition: Tab.java:414
Severity getSeverity()
Returns the tab&#39;s Severity.
Definition: Tab.java:428