Gridarta Editor
TabbedPanel.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.BorderLayout;
23 import java.awt.Component;
24 import java.awt.Container;
25 import java.util.IdentityHashMap;
26 import java.util.Map;
27 import java.util.prefs.Preferences;
28 import javax.swing.JMenu;
29 import javax.swing.JPopupMenu;
30 import net.sf.gridarta.MainControl;
35 import net.sf.japi.swing.action.ActionBuilder;
36 import net.sf.japi.swing.action.ActionBuilderFactory;
37 import net.sf.japi.swing.action.ToggleAction;
38 import org.jetbrains.annotations.NotNull;
39 import org.jetbrains.annotations.Nullable;
40 
47 public class TabbedPanel extends Container {
48 
52  @NotNull
53  private static final String TAB_PREFIX = "MainWindow.tab";
54 
58  private static final long serialVersionUID = 1L;
59 
63  @NotNull
64  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
65 
69  @NotNull
70  private static final Preferences PREFERENCES = Preferences.userNodeForPackage(MainControl.class);
71 
76  @NotNull
77  private final BorderPanel borderPanel;
78 
82  @NotNull
83  private final Map<Component, Tab> openTabs = new IdentityHashMap<>();
84 
88  @NotNull
90 
91  @Override
92  public void tabChanged(@Nullable final Tab prevTab, @Nullable final Tab tab) {
93  if (prevTab != null) {
94  close(prevTab);
95  }
96  if (tab != null) {
97  open(tab);
98  }
99  }
100 
101  };
102 
106  @NotNull
108 
113  public TabbedPanel(@NotNull final Component centerComponent) {
114  final BorderPanelListener borderPanelListener = new BorderPanelListener() {
115 
116  @Override
117  public void sizeChanged(@NotNull final Component component, final int size) {
118  final Tab tab = openTabs.get(component);
119  if (tab != null) {
120  tab.setSize(size);
121  }
122  }
123 
124  @Override
125  public void size2Changed(@NotNull final Location location, final int size2) {
126  PREFERENCES.putInt(TAB_PREFIX + location.getName() + ".position", size2);
127  }
128 
129  @Override
130  public int getSize2(final Location location) {
131  return PREFERENCES.getInt(TAB_PREFIX + location.getName() + ".position", -1);
132  }
133 
134  };
135  borderPanel = new BorderPanel(centerComponent, borderPanelListener);
136  setLayout(new BorderLayout());
137  add(borderPanel, BorderLayout.CENTER);
138  }
139 
144  public void addTab(@NotNull final Tab tab) {
145  final DoubleButtonList buttonList = buttonLists.addTab(tab);
146  fillContextMenu(tab, true);
147  tabAdded(tab, buttonList, tab.isOpen());
148  }
149 
158  @Nullable
159  public Tab getActiveTab(@NotNull final Location location, final boolean alternativeLocation) {
160  return buttonLists.getActiveTab(location, alternativeLocation);
161  }
162 
168  public void moveTab(@NotNull final Tab tab, @NotNull final Location location) {
169  if (tab.getLocation() == location) {
170  return;
171  }
172 
173  final boolean open = tab.isOpen();
174  final DoubleButtonList[] result = buttonLists.moveTab(tab, location);
175  final DoubleButtonList oldButtonList = result[0];
176  final DoubleButtonList newButtonList = result[1];
177 
178  fillContextMenu(tab, false);
179  tabRemoved(oldButtonList);
180  tabAdded(tab, newButtonList, open);
181  }
182 
188  public void setTabSplitMode(@NotNull final Tab tab, final boolean splitMode) {
189  if (tab.isAlternativeLocation() == splitMode) {
190  return;
191  }
192 
193  final boolean open = tab.isOpen();
194  final DoubleButtonList buttonList = buttonLists.toggleTabSplitMode(tab);
195  if (open) {
196  buttonList.selectButton(tab.getButton(), tab.isAlternativeLocation());
197  }
198  }
199 
207  private void tabAdded(@NotNull final Tab tab, @NotNull final DoubleButtonList buttonList, final boolean open) {
208  if (buttonList.getButtonCount() == 1) {
209  add(buttonList.getButtons(), tab.getLocation().getBorderLocation());
210  validate();
211  }
212 
213  if (open) {
214  buttonList.selectButton(tab.getButton(), tab.isAlternativeLocation());
215  }
216  }
217 
223  private void tabRemoved(@NotNull final DoubleButtonList buttonList) {
224  if (buttonList.getButtonCount() == 0) {
225  remove(buttonList.getButtons());
226  validate();
227  }
228  }
229 
235  private void fillContextMenu(@NotNull final Tab tab, final boolean initialize) {
236  final MoveToActions moveToActions = new MoveToActions(tab, this);
237  if (initialize) {
238  final JPopupMenu popupMenu = tab.getPopupMenu();
239  final ToggleAction splitModeAction = (ToggleAction) ACTION_BUILDER.createToggle(false, "tabSplitMode", moveToActions);
240  splitModeAction.setSelected(tab.isAlternativeLocation());
241  popupMenu.insert(splitModeAction.createCheckBoxMenuItem(), 0);
242  tab.setSplitModeAction(splitModeAction);
243  }
244 
245  final JMenu moveToMenu = tab.getMoveToMenu();
246  MenuUtils.removeAll(moveToMenu);
247  final Location location = tab.getLocation();
248  for (final Location thisLocation : Location.values()) {
249  if (thisLocation != location) {
250  moveToMenu.add(ACTION_BUILDER.createAction(true, "tabButtonMoveTo" + thisLocation.getName(), moveToActions));
251  }
252  }
253  }
254 
259  private void open(@NotNull final Tab tab) {
260  openTabs.put(tab.getComponent(), tab);
261  borderPanel.setComponent(tab.getLocation(), tab.getComponent(), tab.isAlternativeLocation(), tab.getSize());
262  tab.setOpen(true);
263  }
264 
269  private void close(@NotNull final Tab tab) {
270  closeInt(tab);
271  tab.setOpen(false);
272  }
273 
278  private void closeInt(final Tab tab) {
280  openTabs.remove(tab.getComponent());
281  }
282 
283 }
net.sf.gridarta.gui.utils.borderpanel.BorderPanel.setComponent
void setComponent(@NotNull final Location location, @NotNull final Component component, final boolean alternativeLocation, final int size)
Definition: BorderPanel.java:86
net.sf.gridarta.gui.utils.tabbedpanel.Tab.isAlternativeLocation
boolean isAlternativeLocation()
Definition: Tab.java:339
net.sf.gridarta
net.sf.gridarta.gui.utils.tabbedpanel.DoubleButtonList
Definition: DoubleButtonList.java:36
net.sf.gridarta.gui.utils.tabbedpanel.ButtonListsListener
Definition: ButtonListsListener.java:28
net.sf.gridarta.gui.utils.borderpanel.BorderPanel.unsetComponent
void unsetComponent(@NotNull final Location location, final boolean alternativeLocation)
Definition: BorderPanel.java:96
net.sf.gridarta.gui.utils.MenuUtils.removeAll
static void removeAll(@NotNull final JMenu menu)
Definition: MenuUtils.java:72
net.sf.gridarta.gui.utils.tabbedpanel.ButtonLists.getActiveTab
Tab getActiveTab(@NotNull final Location location, final boolean alternativeLocation)
Definition: ButtonLists.java:140
net.sf
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.open
void open(@NotNull final Tab tab)
Definition: TabbedPanel.java:259
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.tabAdded
void tabAdded(@NotNull final Tab tab, @NotNull final DoubleButtonList buttonList, final boolean open)
Definition: TabbedPanel.java:207
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getComponent
Component getComponent()
Definition: Tab.java:295
net.sf.gridarta.gui.utils.tabbedpanel.Tab
Definition: Tab.java:54
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.closeInt
void closeInt(final Tab tab)
Definition: TabbedPanel.java:278
net.sf.gridarta.gui
net.sf.gridarta.gui.utils.tabbedpanel.ButtonLists.moveTab
DoubleButtonList[] moveTab(@NotNull final Tab tab, @NotNull final Location location)
Definition: ButtonLists.java:98
net.sf.gridarta.gui.utils.tabbedpanel.Tab.setSize
void setSize(final int size)
Definition: Tab.java:393
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.borderPanel
final BorderPanel borderPanel
Definition: TabbedPanel.java:77
net
net.sf.gridarta.gui.utils.tabbedpanel.DoubleButtonList.selectButton
void selectButton(@NotNull final AbstractButton button, final boolean alternativeLocation)
Definition: DoubleButtonList.java:110
net.sf.gridarta.gui.utils.tabbedpanel.Tab.getLocation
Location getLocation()
Definition: Tab.java:361
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel
Definition: TabbedPanel.java:47
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.TabbedPanel
TabbedPanel(@NotNull final Component centerComponent)
Definition: TabbedPanel.java:113
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.serialVersionUID
static final long serialVersionUID
Definition: TabbedPanel.java:58
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.fillContextMenu
void fillContextMenu(@NotNull final Tab tab, final boolean initialize)
Definition: TabbedPanel.java:235
net.sf.gridarta.gui.utils.borderpanel.BorderPanelListener
Definition: BorderPanelListener.java:29
net.sf.gridarta.gui.utils.tabbedpanel.ButtonLists.addTab
DoubleButtonList addTab(@NotNull final Tab tab)
Definition: ButtonLists.java:81
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.openTabs
final Map< Component, Tab > openTabs
Definition: TabbedPanel.java:83
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.getActiveTab
Tab getActiveTab(@NotNull final Location location, final boolean alternativeLocation)
Definition: TabbedPanel.java:159
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.buttonLists
final ButtonLists buttonLists
Definition: TabbedPanel.java:107
net.sf.gridarta.gui.utils.borderpanel.Location.getName
abstract String getName()
net.sf.gridarta.gui.utils.borderpanel.BorderPanel
Definition: BorderPanel.java:34
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.tabRemoved
void tabRemoved(@NotNull final DoubleButtonList buttonList)
Definition: TabbedPanel.java:223
net.sf.gridarta.gui.utils.borderpanel.Location
Definition: Location.java:33
net.sf.gridarta.gui.utils.tabbedpanel.ButtonLists.toggleTabSplitMode
DoubleButtonList toggleTabSplitMode(@NotNull final Tab tab)
Definition: ButtonLists.java:117
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.TAB_PREFIX
static final String TAB_PREFIX
Definition: TabbedPanel.java:53
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.setTabSplitMode
void setTabSplitMode(@NotNull final Tab tab, final boolean splitMode)
Definition: TabbedPanel.java:188
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
Definition: TabbedPanel.java:64
net.sf.gridarta.gui.utils.borderpanel
Definition: BorderPanel.java:20
net.sf.gridarta.gui.utils.tabbedpanel.ButtonLists
Definition: ButtonLists.java:34
net.sf.gridarta.gui.utils.tabbedpanel.MoveToActions
Definition: MoveToActions.java:30
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.addTab
void addTab(@NotNull final Tab tab)
Definition: TabbedPanel.java:144
net.sf.gridarta.gui.utils.MenuUtils
Definition: MenuUtils.java:39
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.close
void close(@NotNull final Tab tab)
Definition: TabbedPanel.java:269
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.buttonListsListener
final ButtonListsListener buttonListsListener
Definition: TabbedPanel.java:89
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.PREFERENCES
static final Preferences PREFERENCES
Definition: TabbedPanel.java:70
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.moveTab
void moveTab(@NotNull final Tab tab, @NotNull final Location location)
Definition: TabbedPanel.java:168
net.sf.gridarta.MainControl
Definition: MainControl.java:27