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-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.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.Collection;
29 import java.util.MissingResourceException;
30 import java.util.concurrent.CopyOnWriteArrayList;
31 import java.util.prefs.Preferences;
32 import javax.swing.AbstractButton;
33 import javax.swing.Action;
34 import javax.swing.JComponent;
35 import javax.swing.JMenu;
36 import javax.swing.JPopupMenu;
37 import net.sf.gridarta.MainControl;
41 import net.sf.japi.swing.action.ActionBuilder;
42 import net.sf.japi.swing.action.ActionBuilderFactory;
43 import net.sf.japi.swing.action.ToggleAction;
44 import org.jetbrains.annotations.NotNull;
45 import org.jetbrains.annotations.Nullable;
46 
54 public class Tab {
55 
59  private static final int SPACE = 6;
60 
64  @NotNull
65  private static final String TAB_OPEN_PREFIX = "MainWindow.tab_open.";
66 
70  @NotNull
71  private static final String TAB_WIDTH_PREFIX = "MainWindow.tab_width.";
72 
76  @NotNull
77  private static final String TAB_HEIGHT_PREFIX = "MainWindow.tab_height.";
78 
82  @NotNull
83  private static final String TAB_LOCATION = "MainWindow.tab_location.";
84 
88  @NotNull
89  private static final String TAB_ALT_LOCATION = "MainWindow.tab_alt_location.";
90 
94  @NotNull
95  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
96 
100  private static final Preferences PREFERENCES = Preferences.userNodeForPackage(MainControl.class);
101 
105  @NotNull
106  private final String ident;
107 
111  @NotNull
112  private final JComponent component;
113 
117  @NotNull
118  private AbstractButton button;
119 
123  @NotNull
124  private final TabButtonAction action;
125 
129  @NotNull
130  private final Collection<TabListener> listeners = new CopyOnWriteArrayList<>();
131 
135  @NotNull
136  private final JPopupMenu popupMenu = ACTION_BUILDER.createPopupMenu(false, "tabButtonMenu");
137 
141  @NotNull
142  private final JMenu moveToMenu;
143 
147  @Nullable
148  private ToggleAction splitModeAction;
149 
153  @NotNull
155 
160  private boolean alternativeLocation;
161 
165  private final int index;
166 
171  private int width;
172 
177  private int height;
178 
182  private boolean open;
183 
187  @NotNull
189 
195  @NotNull
196  private final MouseListener mouseListener = new MouseAdapter() {
197 
198  @Override
199  public void mousePressed(@NotNull final MouseEvent e) {
200  checkPopup(e);
201  }
202 
203  @Override
204  public void mouseReleased(@NotNull final MouseEvent e) {
205  checkPopup(e);
206  }
207 
212  private void checkPopup(@NotNull final MouseEvent e) {
213  if (e.isPopupTrigger()) {
214  getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
215  }
216  }
217 
218  };
219 
230  public Tab(@NotNull final String ident, @NotNull final JComponent component, @NotNull final Location defaultLocation, final boolean alternativeLocation, final int index, final boolean defaultOpen) {
231  this.ident = ident;
232  this.component = component;
233  final Dimension preferredSize = component.getPreferredSize();
234  final int defaultWidth = PREFERENCES.getInt(TAB_WIDTH_PREFIX + ident, preferredSize.width);
235  final int defaultHeight = PREFERENCES.getInt(TAB_HEIGHT_PREFIX + ident, preferredSize.height);
236  final Dimension minimumSize = component.getMinimumSize();
237  width = Math.max(defaultWidth, minimumSize.width);
238  height = Math.max(defaultHeight, minimumSize.height);
239  open = PREFERENCES.getBoolean(TAB_OPEN_PREFIX + ident, defaultOpen);
241  final String locationString = PREFERENCES.get(TAB_LOCATION + ident, defaultLocation.toString());
242  try {
243  location = Location.valueOf(locationString);
244  } catch (final IllegalArgumentException ignored) {
245  location = defaultLocation;
246  }
247  this.alternativeLocation = PREFERENCES.getBoolean(TAB_ALT_LOCATION + ident, alternativeLocation);
248  this.index = index;
249  button = createButton();
250  final JMenu tmp = MenuUtils.findMenu(popupMenu, "tabButtonMoveTo");
251  if (tmp == null) {
252  throw new MissingResourceException("missing action ", MenuUtils.class.getName(), "tabButtonMoveTo");
253  }
254  moveToMenu = tmp;
255  }
256 
261  @NotNull
262  private AbstractButton createButton() {
263  final int acceleratorIndex = index < 10 ? index : -1;
264  action.setIndex(acceleratorIndex);
265  final AbstractButton result = location.createButton((String) action.getValue(Action.NAME));
266  result.setMargin(location.isTopOrBottom() ? new Insets(0, SPACE, 0, SPACE) : new Insets(SPACE, 0, SPACE, 0));
267  if (acceleratorIndex != -1) {
268  result.setMnemonic('0' + index);
269  }
270  result.addMouseListener(mouseListener);
271  return result;
272  }
273 
278  public void addTabListener(@NotNull final TabListener listener) {
279  listeners.add(listener);
280  }
281 
286  public void removeTabListener(@NotNull final TabListener listener) {
287  listeners.remove(listener);
288  }
289 
294  @NotNull
295  public Component getComponent() {
296  return component;
297  }
298 
303  @NotNull
304  public AbstractButton getButton() {
305  return button;
306  }
307 
312  @NotNull
313  public JPopupMenu getPopupMenu() {
314  return popupMenu;
315  }
316 
321  @NotNull
322  public JMenu getMoveToMenu() {
323  return moveToMenu;
324  }
325 
331  public void setSplitModeAction(@Nullable final ToggleAction splitModeAction) {
332  this.splitModeAction = splitModeAction;
333  }
334 
339  public boolean isAlternativeLocation() {
340  return alternativeLocation;
341  }
342 
348  public void setAlternativeLocation(final boolean alternativeLocation) {
349  this.alternativeLocation = alternativeLocation;
351  if (splitModeAction != null) {
353  }
354  }
355 
360  @NotNull
362  return location;
363  }
364 
369  public void setLocation(@NotNull final Location location) {
370  if (this.location == location) {
371  return;
372  }
373 
374  this.location = location;
375  button = createButton();
376  PREFERENCES.put(TAB_LOCATION + ident, location.toString());
377  }
378 
384  public int getSize() {
385  return location.isTopOrBottom() ? height : width;
386  }
387 
393  public void setSize(final int size) {
394  if (location.isTopOrBottom()) {
395  height = size;
396  PREFERENCES.putInt(TAB_HEIGHT_PREFIX + ident, size);
397  } else {
398  width = size;
399  PREFERENCES.putInt(TAB_WIDTH_PREFIX + ident, size);
400  }
401  }
402 
407  public boolean isOpen() {
408  return open;
409  }
410 
415  public void setOpen(final boolean open) {
416  if (this.open == open) {
417  return;
418  }
419 
420  this.open = open;
421  PREFERENCES.putBoolean(TAB_OPEN_PREFIX + ident, open);
422  }
423 
428  @NotNull
430  return severity;
431  }
432 
437  protected void setSeverity(@NotNull final Severity severity) {
438  if (this.severity == severity) {
439  return;
440  }
441 
442  this.severity = severity;
443  for (final TabListener listener : listeners) {
444  listener.severityChanged(severity);
445  }
446  }
447 
448 }
net.sf.gridarta.gui.utils.tabbedpanel.Tab.severity
Severity severity
The tab's Severity.
Definition: Tab.java:188
net.sf.gridarta.gui.utils.tabbedpanel.Tab.TAB_OPEN_PREFIX
static final String TAB_OPEN_PREFIX
The key used to store the open status of a tab.
Definition: Tab.java:65
net.sf.gridarta.gui.utils.tabbedpanel.TabListener
Interface for listeners interested in Tab related events.
Definition: TabListener.java:30
net.sf.gridarta.gui.utils.tabbedpanel.Tab.alternativeLocation
boolean alternativeLocation
Whether the tab is shown in the alternative location (.
Definition: Tab.java:160
net.sf.gridarta.gui.utils.tabbedpanel.Tab.component
final JComponent component
The JComponent that is shown when this tab is active.
Definition: Tab.java:112
net.sf.gridarta.gui.utils.tabbedpanel.Tab.action
final TabButtonAction action
The button's action.
Definition: Tab.java:124
net.sf.gridarta.gui.utils.tabbedpanel.Tab.isAlternativeLocation
boolean isAlternativeLocation()
Returns whether the button is shown in the alternative location.
Definition: Tab.java:339
net.sf.gridarta
Base package of all Gridarta classes.
net.sf.gridarta.gui.utils.tabbedpanel.Tab.popupMenu
final JPopupMenu popupMenu
The button's context menu.
Definition: Tab.java:136
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getButton
AbstractButton getButton()
Returns the AbstractButton for showing or hiding the component.
Definition: Tab.java:304
net.sf
net.sf.gridarta.gui.utils.tabbedpanel.Tab.index
final int index
The tab's index for ordering.
Definition: Tab.java:165
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getComponent
Component getComponent()
Returns the Component that is shown when this tab is active.
Definition: Tab.java:295
net.sf.gridarta.gui.utils.tabbedpanel.Tab.removeTabListener
void removeTabListener(@NotNull final TabListener listener)
Removes a TabListener to be notified.
Definition: Tab.java:286
net.sf.gridarta.gui.utils.tabbedpanel.Tab
A tab in a TabbedPanel component.
Definition: Tab.java:54
net.sf.gridarta.gui.utils.tabbedpanel.Tab.TAB_ALT_LOCATION
static final String TAB_ALT_LOCATION
The key used to store the current location of a tab.
Definition: Tab.java:89
net.sf.gridarta.gui.utils.borderpanel.Location.createButton
createButton
The location on the top side.
Definition: Location.java:41
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.utils.tabbedpanel.TabButtonAction.setIndex
void setIndex(final int index)
Sets the accelerator index.
Definition: TabButtonAction.java:66
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getMoveToMenu
JMenu getMoveToMenu()
Returns the "Move To" menu within the button's context menu.
Definition: Tab.java:322
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getSeverity
Severity getSeverity()
Returns the tab's Severity.
Definition: Tab.java:429
net.sf.gridarta.gui.utils.tabbedpanel.Tab.createButton
AbstractButton createButton()
Creates a button for this tab.
Definition: Tab.java:262
net.sf.gridarta.gui.utils.Severity
Severity levels for colors of tabs.
Definition: Severity.java:29
net.sf.gridarta.gui.utils.tabbedpanel.Tab.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The ActionBuilder.
Definition: Tab.java:95
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setSize
void setSize(final int size)
Sets the tab's size.
Definition: Tab.java:393
net
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getLocation
Location getLocation()
Returns the tab's location.
Definition: Tab.java:361
net.sf.gridarta.gui.utils.tabbedpanel.Tab.ident
final String ident
The tab's identification string.
Definition: Tab.java:106
net.sf.gridarta.gui.utils.tabbedpanel.Tab.listeners
final Collection< TabListener > listeners
The registered TabListeners to notify.
Definition: Tab.java:130
net.sf.gridarta.gui.utils.tabbedpanel.Tab.width
int width
The tab's width when in locations Location#LEFT or {}.
Definition: Tab.java:171
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setAlternativeLocation
void setAlternativeLocation(final boolean alternativeLocation)
Sets whether the button is shown in the alternative location.
Definition: Tab.java:348
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getPopupMenu
JPopupMenu getPopupMenu()
Returns the button's context menu.
Definition: Tab.java:313
net.sf.gridarta.gui.utils.tabbedpanel.Tab.open
boolean open
The tab's open status.
Definition: Tab.java:182
net.sf.gridarta.gui.utils.borderpanel.Location.isTopOrBottom
abstract boolean isTopOrBottom()
Returns whether this location is TOP or BOTTOM.
net.sf.gridarta.gui.utils.tabbedpanel.Tab.height
int height
The tab's height when in locations Location#TOP or {}.
Definition: Tab.java:177
net.sf.gridarta.gui.utils.tabbedpanel.Tab.addTabListener
void addTabListener(@NotNull final TabListener listener)
Adds a TabListener to be notified.
Definition: Tab.java:278
net.sf.gridarta.gui.utils.tabbedpanel.Tab.isOpen
boolean isOpen()
Returns the tab's open status.
Definition: Tab.java:407
net.sf.gridarta.gui.utils.tabbedpanel.Tab.location
Location location
The tab's location.
Definition: Tab.java:154
net.sf.gridarta.gui.utils.borderpanel.Location
A location.
Definition: Location.java:33
net.sf.gridarta.gui.utils.tabbedpanel.Tab.TAB_HEIGHT_PREFIX
static final String TAB_HEIGHT_PREFIX
The key used to store the preferred height of a tab.
Definition: Tab.java:77
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setSplitModeAction
void setSplitModeAction(@Nullable final ToggleAction splitModeAction)
Sets the ToggleAction to update if the "split mode" state changes.
Definition: Tab.java:331
net.sf.gridarta.gui.utils.tabbedpanel.Tab.Tab
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:230
net.sf.gridarta.gui.utils.tabbedpanel.Tab.TAB_WIDTH_PREFIX
static final String TAB_WIDTH_PREFIX
The key used to store the preferred width of a tab.
Definition: Tab.java:71
net.sf.gridarta.gui.utils.tabbedpanel.TabButtonAction
An javax.swing.Action for buttons in TabbedPanels.
Definition: TabButtonAction.java:34
net.sf.gridarta.gui.utils.borderpanel
Definition: BorderPanel.java:20
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setLocation
void setLocation(@NotNull final Location location)
Sets the tab's location.
Definition: Tab.java:369
net.sf.gridarta.gui.utils.tabbedpanel.Tab.mouseListener
final MouseListener mouseListener
The MouseListener attached to button to open the context menu.
Definition: Tab.java:196
net.sf.gridarta.gui.utils.tabbedpanel.Tab.splitModeAction
ToggleAction splitModeAction
The ToggleAction to update if the "split mode" state changes.
Definition: Tab.java:148
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setSeverity
void setSeverity(@NotNull final Severity severity)
Sets the tab's Severity.
Definition: Tab.java:437
net.sf.gridarta.gui.utils.tabbedpanel.Tab.PREFERENCES
static final Preferences PREFERENCES
The Preferences.
Definition: Tab.java:100
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setOpen
void setOpen(final boolean open)
Sets the tab's open status.
Definition: Tab.java:415
net.sf.gridarta.gui.utils.tabbedpanel.Tab.button
AbstractButton button
The AbstractButton for showing or hiding the JComponent.
Definition: Tab.java:118
net.sf.gridarta.gui.utils.tabbedpanel.Tab.moveToMenu
final JMenu moveToMenu
The "Move To" menu within popupMenu.
Definition: Tab.java:142
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.utils.tabbedpanel.Tab.SPACE
static final int SPACE
Additional space before and after the buttons' text.
Definition: Tab.java:59
net.sf.gridarta.gui.utils.MenuUtils.findMenu
static JMenu findMenu(@NotNull final MenuElement menuElement, @NotNull final String key)
Returns a JMenu by action key.
Definition: MenuUtils.java:136
net.sf.gridarta.gui.utils.MenuUtils
Utility class implementing menu related functions.
Definition: MenuUtils.java:39
net.sf.gridarta.gui.utils.Severity.DEFAULT
DEFAULT
The tab contents are unchanged from defaults.
Definition: Severity.java:34
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getSize
int getSize()
Returns the tab's size.
Definition: Tab.java:384
net.sf.gridarta.gui.utils.tabbedpanel.Tab.TAB_LOCATION
static final String TAB_LOCATION
The key used to store the current location of a tab.
Definition: Tab.java:83
net.sf.gridarta.MainControl
Interface used as preferences location.
Definition: MainControl.java:27