package net.pterodactylus.jsite.gui;
import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
+import java.util.Properties;
+
+import javax.swing.JOptionPane;
import net.pterodactylus.jsite.core.Core;
import net.pterodactylus.jsite.core.CoreListener;
import net.pterodactylus.jsite.core.Node;
+import net.pterodactylus.jsite.core.Project;
import net.pterodactylus.jsite.i18n.I18n;
+import net.pterodactylus.jsite.i18n.gui.I18nAction;
+import net.pterodactylus.util.io.Closer;
/**
- * TODO
- *
+ * The Swing user interface.
+ *
* @author David ‘Bombe’ Roden <bombe@freenetproject.org>
* @version $Id$
*/
/** The application core. */
private final Core core;
+ /** The configuration directory. */
+ private final String configDirectory;
+
/** The main window. */
private MainWindow mainWindow;
+ /** The “configure” action. */
+ private I18nAction configureAction;
+
+ /** The “import config” action. */
+ private I18nAction importConfigAction;
+
+ /** The “quit” action. */
+ private I18nAction quitAction;
+
/** The “manage nodes” action. */
private I18nAction manageNodesAction;
/** All lanugage menu items. */
private List<I18nAction> languageActions = new ArrayList<I18nAction>();
+ /** The “about” action. */
+ private I18nAction helpAboutAction;
+
+ /** The “add project” action. */
+ private I18nAction addProjectAction;
+
+ /** The “clone project” action. */
+ private I18nAction cloneProjectAction;
+
+ /** The “delete project” action. */
+ private I18nAction deleteProjectAction;
+
+ /** The “about” dialog. */
+ private AboutDialog aboutDialog;
+
+ /** The configuration dialog. */
+ private ConfigurationDialog configurationDialog;
+
/** The list of all defined nodes. */
private List<Node> nodeList;
+ //
+ // CONFIGURATION
+ //
+
+ /** Whether to antialias the GUI. */
+ private boolean antialias;
+
+ /** The control font. */
+ private String controlFont;
+
+ /** The user font. */
+ private String userFont;
+
/**
* Creates a new swing interface.
- *
+ *
* @param core
* The core to operate on
+ * @param configDirectory
+ * The directory the configuration is stored in
*/
- public SwingInterface(Core core) {
+ public SwingInterface(Core core, String configDirectory) {
this.core = core;
- I18n.setLocale(Locale.ENGLISH); /* TODO - load config */
+ this.configDirectory = configDirectory;
+ I18n.setLocale(Locale.ENGLISH);
+ loadConfig();
+ if (antialias) {
+ System.setProperty("swing.aatext", "true");
+ }
+ if (controlFont != null) {
+ System.setProperty("swing.plaf.metal.controlFont", controlFont);
+ }
+ if (userFont != null) {
+ System.setProperty("swing.plaf.metal.userFont", userFont);
+ }
initActions();
initDialogs();
}
/**
* Returns the core that is controlled by the Swing interface.
- *
+ *
* @return The core
*/
Core getCore() {
/**
* Returns the main window of the Swing interface.
- *
+ *
* @return The main window
*/
MainWindow getMainWindow() {
}
/**
+ * Returns the “configure” action.
+ *
+ * @return The “configure” action
+ */
+ I18nAction getConfigureAction() {
+ return configureAction;
+ }
+
+ /**
+ * Returns the “import config” action.
+ *
+ * @return The “import config” action
+ */
+ I18nAction getImportConfigAction() {
+ return importConfigAction;
+ }
+
+ /**
+ * Returns the “quit” action.
+ *
+ * @return The “quit” action
+ */
+ I18nAction getQuitAction() {
+ return quitAction;
+ }
+
+ /**
* Returns the “manage nodes” action.
- *
+ *
* @return The “manage nodes” action
*/
I18nAction getManageNodesAction() {
/**
* Returns the “connect to node” action.
- *
+ *
* @return The “connect to node” action
*/
I18nAction getNodeConnectAction() {
/**
* Returns the “disconnect from node” action.
- *
+ *
* @return The “disconnect from node” action
*/
I18nAction getNodeDisconnectAction() {
/**
* Returns all language actions.
- *
+ *
* @return All language actions
*/
List<I18nAction> getLanguageActions() {
return languageActions;
}
+ /**
+ * Returns the “about” action.
+ *
+ * @return The “about” action
+ */
+ I18nAction getHelpAboutAction() {
+ return helpAboutAction;
+ }
+
+ /**
+ * Returns the “add project” action.
+ *
+ * @return The “add project” action
+ */
+ I18nAction getAddProjectAction() {
+ return addProjectAction;
+ }
+
+ /**
+ * Returns the “clone project” action.
+ *
+ * @return The “clone project” action
+ */
+ I18nAction getCloneProjectAction() {
+ return cloneProjectAction;
+ }
+
+ /**
+ * Returns the “delete project” action.
+ *
+ * @return The “delete project” action
+ */
+ I18nAction getDeleteProjectAction() {
+ return deleteProjectAction;
+ }
+
//
// ACTIONS
//
//
/**
+ * Loads the configuration of the interface.
+ */
+ private void loadConfig() {
+ /* initialize default stuff. */
+ antialias = false;
+ /* now read config. */
+ File configFile = new File(configDirectory, "swing-interface.properties");
+ if (!configFile.exists() || !configFile.canRead() || !configFile.isFile()) {
+ System.err.println("could not find “" + configFile.getAbsolutePath() + "”!");
+ return;
+ }
+ Properties configProperties = new Properties();
+ FileInputStream configInputStream = null;
+ try {
+ configInputStream = new FileInputStream(configFile);
+ configProperties.load(configInputStream);
+ } catch (IOException ioe1) {
+ System.err.println("could not load config, " + ioe1.getMessage());
+ } finally {
+ Closer.close(configInputStream);
+ }
+ if (configProperties.containsKey("antialias")) {
+ antialias = Boolean.valueOf(configProperties.getProperty("antialias"));
+ }
+ if (configProperties.containsKey("controlFont")) {
+ controlFont = configProperties.getProperty("controlFont");
+ }
+ if (configProperties.containsKey("userFont")) {
+ userFont = configProperties.getProperty("userFont");
+ }
+ }
+
+ /**
+ * Saves the configuration.
+ */
+ private void saveConfig() {
+ File configDirectory = new File(this.configDirectory);
+ if (!configDirectory.exists()) {
+ if (!configDirectory.mkdirs()) {
+ System.err.println("could not create “" + this.configDirectory + "”!");
+ return;
+ }
+ }
+ if (!configDirectory.exists() || !configDirectory.isDirectory() || !configDirectory.canWrite()) {
+ System.err.println("can not access “" + this.configDirectory + "”!");
+ return;
+ }
+ File configFile = new File(configDirectory, "swing-interface.properties");
+ Properties configProperties = new Properties();
+ configProperties.setProperty("antialias", String.valueOf(antialias));
+ if (controlFont != null) {
+ configProperties.setProperty("controlFont", controlFont);
+ }
+ if (userFont != null) {
+ configProperties.setProperty("userFont", userFont);
+ }
+ FileOutputStream configOutputStream = null;
+ try {
+ configOutputStream = new FileOutputStream(configFile);
+ configProperties.store(configOutputStream, "configuration of swing interface");
+ } catch (IOException ioe1) {
+ System.err.println("could not save config, " + ioe1.getMessage());
+ } finally {
+ Closer.close(configOutputStream);
+ }
+ }
+
+ /**
* Initializes all actions.
*/
private void initActions() {
+ configureAction = new I18nAction("mainWindow.menu.jSite.configure") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ configure();
+ }
+ };
+ importConfigAction = new I18nAction("mainWindow.menu.jSite.importConfig") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ importConfig();
+ }
+ };
+ quitAction = new I18nAction("mainWindow.menu.jSite.quit") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ quit();
+ }
+ };
manageNodesAction = new I18nAction("mainWindow.menu.node.item.manageNodes") {
/**
* {@inheritDoc}
*/
@SuppressWarnings("synthetic-access")
- public void actionPerformed(ActionEvent e) {
+ public void actionPerformed(ActionEvent actionEvent) {
manageNodes();
}
};
nodeConnectAction = new I18nAction("mainWindow.menu.node.item.connect", false) {
@SuppressWarnings("synthetic-access")
- public void actionPerformed(ActionEvent e) {
+ public void actionPerformed(ActionEvent actionEvent) {
nodeConnect();
}
}
languageActions.add(languageAction);
}
+ helpAboutAction = new I18nAction("mainWindow.menu.help.item.about") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ helpAbout();
+ }
+ };
+ addProjectAction = new I18nAction("mainWindow.button.addProject") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ addProject();
+ }
+ };
+ cloneProjectAction = new I18nAction("mainWindow.button.cloneProject") {
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ cloneProject();
+ }
+ };
+ deleteProjectAction = new I18nAction("mainWindow.button.deleteProject") {
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("synthetic-access")
+ public void actionPerformed(ActionEvent actionEvent) {
+ deleteProject();
+ }
+ };
}
/**
*/
private void initDialogs() {
manageNodesDialog = new ManageNodesDialog(this);
+ aboutDialog = new AboutDialog(this);
+ configurationDialog = new ConfigurationDialog(this);
}
//
//
/**
+ * Shows the configuration dialog.
+ */
+ private void configure() {
+ configurationDialog.setAntialias(antialias);
+ configurationDialog.setControlFont(controlFont);
+ configurationDialog.setUserFont(userFont);
+ configurationDialog.setVisible(true);
+ if (!configurationDialog.wasCancelled()) {
+ antialias = configurationDialog.isAntialias();
+ controlFont = configurationDialog.getControlFont();
+ userFont = configurationDialog.getUserFont();
+ saveConfig();
+ }
+ }
+
+ /**
+ * Imports old jSite configuration.
+ */
+ private void importConfig() {
+ }
+
+ /**
+ * Quits jSite.
+ */
+ private void quit() {
+ saveConfig();
+ System.exit(0);
+ }
+
+ /**
* Pops up the “manage nodes” dialog.
*/
private void manageNodes() {
/**
* Changes the language of the interface. This method also disables the
* action for the newly set language and enables all others.
- *
+ *
* @param newLocale
* The new language
* @param languageAction
I18n.setLocale(newLocale);
}
+ /**
+ * Shows the “about” dialog.
+ */
+ private void helpAbout() {
+ aboutDialog.setVisible(true);
+ }
+
+ /**
+ * Adds a project.
+ */
+ private void addProject() {
+ Project project = new Project();
+ project.setName("New Project");
+ project.setDescription("");
+ }
+
+ /**
+ * Clones a project.
+ */
+ private void cloneProject() {
+ }
+
+ /**
+ * Deletes a project.
+ */
+ private void deleteProject() {
+ }
+
//
// INTERFACE CoreListener
//
/**
* {@inheritDoc}
*/
+ public void loadingProjectsFailed(String directory) {
+ JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.projectLoadingFailed.message", directory), I18n.get("mainWindow.error.projectLoadingFailed.title"), JOptionPane.ERROR_MESSAGE);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public void coreLoaded() {
this.nodeList = core.getNodes();
manageNodesDialog.setNodeList(nodeList);