Gridarta Editor
MainView.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.misc;
21 
22 import java.awt.BorderLayout;
23 import java.awt.Component;
24 import java.awt.Rectangle;
25 import java.awt.Toolkit;
26 import java.awt.event.ActionEvent;
27 import java.awt.event.ActionListener;
28 import java.awt.event.WindowAdapter;
29 import java.awt.event.WindowEvent;
30 import java.awt.geom.RectangularShape;
31 import java.util.prefs.Preferences;
32 import javax.swing.ImageIcon;
33 import javax.swing.JFrame;
34 import javax.swing.JOptionPane;
35 import javax.swing.WindowConstants;
36 import net.sf.gridarta.MainControl;
42 import net.sf.gridarta.utils.Exiter;
44 import org.jetbrains.annotations.NotNull;
45 import org.jetbrains.annotations.Nullable;
46 
53 public class MainView {
54 
58  private static final Preferences PREFERENCES = Preferences.userNodeForPackage(MainControl.class);
59 
63  private static final String WINDOW_STATE = "WindowState";
64 
68  private static final String WINDOW_X = "MainWindow.x";
69 
73  private static final String WINDOW_Y = "MainWindow.y";
74 
78  private static final String WINDOW_WIDTH = "MainWindow.width";
79 
83  private static final String WINDOW_HEIGHT = "MainWindow.height";
84 
88  @NotNull
89  private final Component frame;
90 
94  @NotNull
95  private final TabbedPanel tabbedPanel;
96 
105  public MainView(@NotNull final JFrame frame, @NotNull final ActionListener exitAction, @NotNull final Component mapDesktop, @Nullable final ImageIcon icon, @NotNull final Exiter exiter) {
106  this.frame = frame;
107  frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
108  frame.addWindowListener(new WindowAdapter() {
109 
110  @Override
111  public void windowClosing(final WindowEvent e) {
112  exitAction.actionPerformed(new ActionEvent(e.getSource(), 0, null));
113  }
114  });
115  if (icon != null) {
116  frame.setIconImage(icon.getImage());
117  }
118 
119  final ExiterListener exiterListener = new ExiterListener() {
120 
121  @Override
122  public void preExitNotify() {
123  // ignore
124  }
125 
126  @Override
127  public void appExitNotify() {
128  final Rectangle bounds = frame.getBounds();
129  PREFERENCES.putInt(WINDOW_X, bounds.x);
130  PREFERENCES.putInt(WINDOW_Y, bounds.y);
131  PREFERENCES.putInt(WINDOW_WIDTH, bounds.width);
132  PREFERENCES.putInt(WINDOW_HEIGHT, bounds.height);
133  PREFERENCES.putInt(WINDOW_STATE, frame.getExtendedState());
134  }
135 
136  @Override
137  public void waitExitNotify() {
138  // ignore
139  }
140 
141  };
142  exiter.addExiterListener(exiterListener);
143 
144  // calculate some default values in case there is no settings file
145  final RectangularShape screen = frame.getGraphicsConfiguration().getBounds();
146  final int defaultWidth = (int) (0.9 * screen.getWidth());
147  final int defaultHeight = (int) (0.9 * screen.getHeight());
148 
149  tabbedPanel = new TabbedPanel(mapDesktop);
150  frame.add(tabbedPanel, BorderLayout.CENTER);
151 
152  // set bounds (location and size) of the main frame
153  frame.setBounds(PREFERENCES.getInt(WINDOW_X, (int) (screen.getX() + (screen.getWidth() - defaultWidth) / 2.0)), PREFERENCES.getInt(WINDOW_Y, (int) (screen.getY() + (screen.getHeight() - defaultHeight) / 2.0)), PREFERENCES.getInt(WINDOW_WIDTH, defaultWidth), PREFERENCES.getInt(WINDOW_HEIGHT, defaultHeight));
154  frame.setExtendedState(PREFERENCES.getInt(WINDOW_STATE, frame.getExtendedState()));
155  }
156 
161  public void addTab(@NotNull final Tab tab) {
162  tabbedPanel.addTab(tab);
163  final TabListener tabListener = severity -> setSeverity(tab, severity);
164  tab.addTabListener(tabListener);
165  setSeverity(tab, tab.getSeverity());
166  }
167 
176  @Nullable
177  public Tab getActiveTab(@NotNull final Location location, final boolean alternativeLocation) {
178  return tabbedPanel.getActiveTab(location, alternativeLocation);
179  }
180 
187  private static void setSeverity(@NotNull final Tab tab, @NotNull final Severity severity) {
188  tab.getButton().setForeground(severity.getColor());
189  }
190 
194  public void handleThrowable(final Throwable t) {
195  Toolkit.getDefaultToolkit().beep();
196  JOptionPane.showMessageDialog(frame, t.getMessage(), "Error", JOptionPane.WARNING_MESSAGE);
197  }
198 
199 }
net.sf.gridarta.gui.utils.tabbedpanel.TabListener
Interface for listeners interested in Tab related events.
Definition: TabListener.java:30
net.sf.gridarta.gui.misc.MainView.PREFERENCES
static final Preferences PREFERENCES
Preferences.
Definition: MainView.java:58
net.sf.gridarta.gui.misc.MainView.frame
final Component frame
The main window of the editor.
Definition: MainView.java:89
net.sf.gridarta
Base package of all Gridarta classes.
net.sf
net.sf.gridarta.gui.misc.MainView.tabbedPanel
final TabbedPanel tabbedPanel
The TabbedPanel that displays frame and all open tabs.
Definition: MainView.java:95
net.sf.gridarta.gui.utils.tabbedpanel.Tab
A tab in a TabbedPanel component.
Definition: Tab.java:54
net.sf.gridarta.gui.misc.MainView.WINDOW_X
static final String WINDOW_X
The key used to store the main windows x-coordinate to INI file.
Definition: MainView.java:68
net.sf.gridarta.gui.misc.MainView.getActiveTab
Tab getActiveTab(@NotNull final Location location, final boolean alternativeLocation)
Returns the active Tab on a given Location of the main view.
Definition: MainView.java:177
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.gui.misc.MainView.MainView
MainView(@NotNull final JFrame frame, @NotNull final ActionListener exitAction, @NotNull final Component mapDesktop, @Nullable final ImageIcon icon, @NotNull final Exiter exiter)
Constructs the main view and registers the given main controller.
Definition: MainView.java:105
net.sf.gridarta.gui.misc.MainView
Main window of the level editor.
Definition: MainView.java:53
net.sf.gridarta.gui.utils.Severity
Severity levels for colors of tabs.
Definition: Severity.java:29
net
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel
A Component that always displays another component and optionally a number of tabs around it.
Definition: TabbedPanel.java:47
net.sf.gridarta.gui.misc.MainView.handleThrowable
void handleThrowable(final Throwable t)
This implementation displays the exception in a modal message dialog.
Definition: MainView.java:194
net.sf.gridarta.gui.utils.tabbedpanel
Definition: ButtonList.java:20
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.getActiveTab
Tab getActiveTab(@NotNull final Location location, final boolean alternativeLocation)
Returns the active Tab on a given Location of the main view.
Definition: TabbedPanel.java:154
net.sf.gridarta.gui.misc.MainView.WINDOW_WIDTH
static final String WINDOW_WIDTH
The key used to store the main windows width to INI file.
Definition: MainView.java:78
net.sf.gridarta.gui.utils.borderpanel.Location
A location.
Definition: Location.java:33
net.sf.gridarta.gui.misc.MainView.WINDOW_Y
static final String WINDOW_Y
The key used to store the main windows y-coordinate to INI file.
Definition: MainView.java:73
net.sf.gridarta.gui.misc.MainView.WINDOW_HEIGHT
static final String WINDOW_HEIGHT
The key used to store the main windows height to INI file.
Definition: MainView.java:83
net.sf.gridarta.gui.utils.borderpanel
Definition: BorderPanel.java:20
net.sf.gridarta.gui.misc.MainView.addTab
void addTab(@NotNull final Tab tab)
Adds a tab.
Definition: MainView.java:161
net.sf.gridarta.gui.misc.MainView.setSeverity
static void setSeverity(@NotNull final Tab tab, @NotNull final Severity severity)
Sets a Tab's Severity.
Definition: MainView.java:187
net.sf.gridarta.gui.utils
Definition: AnimationComponent.java:20
net.sf.gridarta.gui.utils.tabbedpanel.TabbedPanel.addTab
void addTab(@NotNull final Tab tab)
Adds a tab.
Definition: TabbedPanel.java:139
net.sf.gridarta.utils.ExiterListener
Interface for listeners interested in Exiter related events.
Definition: ExiterListener.java:28
net.sf.gridarta.utils
Definition: ActionBuilderUtils.java:20
net.sf.gridarta.gui.misc.MainView.WINDOW_STATE
static final String WINDOW_STATE
The key used to store the main window state in the preferences.
Definition: MainView.java:63
net.sf.gridarta.utils.Exiter
Exits the application.
Definition: Exiter.java:28
net.sf.gridarta.MainControl
Interface used as preferences location.
Definition: MainControl.java:27