Gridarta Editor
DefaultExiter.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.mainactions;
21 
22 import java.awt.Window;
23 import java.lang.reflect.InvocationTargetException;
24 import java.util.Collection;
25 import java.util.concurrent.CopyOnWriteArrayList;
26 import java.util.prefs.Preferences;
27 import javax.swing.SwingUtilities;
28 import net.sf.gridarta.MainControl;
31 import net.sf.gridarta.utils.Exiter;
33 import net.sf.japi.swing.action.ActionBuilder;
34 import net.sf.japi.swing.action.ActionBuilderFactory;
35 import org.apache.log4j.Category;
36 import org.apache.log4j.Logger;
37 import org.jetbrains.annotations.NotNull;
38 
43 public class DefaultExiter implements Exiter {
44 
48  @NotNull
49  private static final ActionBuilder ACTION_BUILDER = ActionBuilderFactory.getInstance().getActionBuilder("net.sf.gridarta");
50 
54  @NotNull
55  private static final Category LOG = Logger.getLogger(DefaultExiter.class);
56 
60  @NotNull
61  private static final Preferences PREFERENCES = Preferences.userNodeForPackage(MainControl.class);
62 
66  @NotNull
67  private final Window mainViewFrame;
68 
72  @NotNull
73  private final Collection<ExiterListener> exiterListeners = new CopyOnWriteArrayList<>();
74 
79  public DefaultExiter(@NotNull final Window mainViewFrame) {
80  this.mainViewFrame = mainViewFrame;
81  }
82 
83  @Override
84  public void addExiterListener(@NotNull final ExiterListener listener) {
85  exiterListeners.add(listener);
86  }
87 
88  @Override
89  public void removeExiterListener(@NotNull final ExiterListener listener) {
90  exiterListeners.remove(listener);
91  }
92 
93  @Override
94  public void doExit(final int returnCode) {
95  mainViewFrame.setEnabled(false);
96  for (final ExiterListener listener : exiterListeners) {
97  listener.preExitNotify();
98  }
99  for (final ExiterListener listener : exiterListeners) {
100  listener.appExitNotify();
101  }
102  final Thread thread = new Thread(() -> {
103  for (final ExiterListener listener : exiterListeners) {
104  listener.waitExitNotify();
105  }
106  try {
107  SwingUtilities.invokeAndWait(mainViewFrame::dispose);
108  } catch (final InterruptedException ex) {
109  Thread.currentThread().interrupt();
110  LOG.warn("Cannot destroy main view: " + ex.getMessage());
111  } catch (final InvocationTargetException ex) {
112  LOG.warn("Cannot destroy main view: " + ex.getMessage());
113  }
114  callExit(returnCode);
115  });
116  thread.start();
117  }
118 
124  public static void callExit(final int returnCode) {
126  if (LOG.isDebugEnabled()) {
127  LOG.debug(ActionBuilderUtils.getString(ACTION_BUILDER, "logExitWithExit"));
128  }
129  System.exit(returnCode);
130  }
131  if (LOG.isDebugEnabled()) {
132  LOG.debug(ActionBuilderUtils.getString(ACTION_BUILDER, "logExitWithoutExit"));
133  }
134  }
135 
136 }
net.sf.gridarta.gui.dialog.prefs.DevPreferences
Preferences Module for developer preferences.
Definition: DevPreferences.java:46
net.sf.gridarta
Base package of all Gridarta classes.
net.sf
net.sf.gridarta.mainactions.DefaultExiter.ACTION_BUILDER
static final ActionBuilder ACTION_BUILDER
The ActionBuilder.
Definition: DefaultExiter.java:49
net.sf.gridarta.gui
Graphical User Interface of Gridarta.
net.sf.gridarta.mainactions.DefaultExiter.callExit
static void callExit(final int returnCode)
Calls System#exit(int) or does nothing depending on the user's settings.
Definition: DefaultExiter.java:124
net.sf.gridarta.gui.dialog.prefs
The preferences ui modules.
Definition: AppPreferences.java:20
net
net.sf.gridarta.mainactions.DefaultExiter
Exits the application.
Definition: DefaultExiter.java:43
net.sf.gridarta.mainactions.DefaultExiter.doExit
void doExit(final int returnCode)
Exits the application.
Definition: DefaultExiter.java:94
net.sf.gridarta.mainactions.DefaultExiter.PREFERENCES
static final Preferences PREFERENCES
The Preferences.
Definition: DefaultExiter.java:61
net.sf.gridarta.mainactions.DefaultExiter.DefaultExiter
DefaultExiter(@NotNull final Window mainViewFrame)
Creates a new instance.
Definition: DefaultExiter.java:79
net.sf.gridarta.mainactions.DefaultExiter.addExiterListener
void addExiterListener(@NotNull final ExiterListener listener)
Adds an ExiterListener to be notified.
Definition: DefaultExiter.java:84
net.sf.gridarta.utils.ActionBuilderUtils.getString
static String getString(@NotNull final ActionBuilder actionBuilder, @NotNull final String key, @NotNull final String defaultValue)
Returns the value of a key.
Definition: ActionBuilderUtils.java:71
net.sf.gridarta.gui.dialog
net.sf.gridarta.mainactions.DefaultExiter.removeExiterListener
void removeExiterListener(@NotNull final ExiterListener listener)
Removes an ExiterListener to be notified.
Definition: DefaultExiter.java:89
net.sf.gridarta.gui.dialog.prefs.DevPreferences.PREFERENCES_SYSTEM_EXIT
static final String PREFERENCES_SYSTEM_EXIT
Preferences key for using System.exit().
Definition: DevPreferences.java:52
net.sf.gridarta.mainactions.DefaultExiter.mainViewFrame
final Window mainViewFrame
The main window's frame.
Definition: DefaultExiter.java:67
net.sf.gridarta.gui.dialog.prefs.DevPreferences.PREFERENCES_SYSTEM_EXIT_DEFAULT
static final boolean PREFERENCES_SYSTEM_EXIT_DEFAULT
Preferences default value for using System.exit().
Definition: DevPreferences.java:57
net.sf.gridarta.mainactions.DefaultExiter.LOG
static final Category LOG
The logger for printing log messages.
Definition: DefaultExiter.java:55
net.sf.gridarta.mainactions.DefaultExiter.exiterListeners
final Collection< ExiterListener > exiterListeners
The ExiterListeners to notify.
Definition: DefaultExiter.java:73
net.sf.gridarta.utils.ActionBuilderUtils
Utility class for ActionBuilder related functions.
Definition: ActionBuilderUtils.java:31
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.utils.Exiter
Exits the application.
Definition: Exiter.java:28
net.sf.gridarta.MainControl
Interface used as preferences location.
Definition: MainControl.java:27