X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FSwingInterface.java;h=2f6f96538b456b358ad2fb2b0a485c7b1f93da81;hb=c7561c631f4bbb94ee0ac9047e953ce56f1df8bb;hp=4a0c97fa0a95e63ef2ae5606f16893312f02a830;hpb=b71f4f4aeb7440b88dd82a252cd296506427c440;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/SwingInterface.java b/src/net/pterodactylus/jsite/gui/SwingInterface.java index 4a0c97f..2f6f965 100644 --- a/src/net/pterodactylus/jsite/gui/SwingInterface.java +++ b/src/net/pterodactylus/jsite/gui/SwingInterface.java @@ -20,15 +20,28 @@ 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$ */ @@ -37,9 +50,21 @@ public class SwingInterface implements CoreListener { /** 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; @@ -52,17 +77,65 @@ public class SwingInterface implements CoreListener { /** The node manager dialog. */ private ManageNodesDialog manageNodesDialog; + /** All lanugage menu items. */ + private List languageActions = new ArrayList(); + + /** 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 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; + 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(); } @@ -73,7 +146,7 @@ public class SwingInterface implements CoreListener { /** * Returns the core that is controlled by the Swing interface. - * + * * @return The core */ Core getCore() { @@ -82,7 +155,7 @@ public class SwingInterface implements CoreListener { /** * Returns the main window of the Swing interface. - * + * * @return The main window */ MainWindow getMainWindow() { @@ -90,8 +163,35 @@ public class SwingInterface implements CoreListener { } /** + * 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() { @@ -100,7 +200,7 @@ public class SwingInterface implements CoreListener { /** * Returns the “connect to node” action. - * + * * @return The “connect to node” action */ I18nAction getNodeConnectAction() { @@ -109,13 +209,58 @@ public class SwingInterface implements CoreListener { /** * Returns the “disconnect from node” action. - * + * * @return The “disconnect from node” action */ I18nAction getNodeDisconnectAction() { return nodeDisconnectAction; } + /** + * Returns all language actions. + * + * @return All language actions + */ + List 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 // @@ -136,23 +281,125 @@ public class SwingInterface implements CoreListener { // /** + * 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"); + } + if (configProperties.containsKey("language")) { + I18n.setLocale(new Locale(configProperties.getProperty("language"))); + } + } + + /** + * 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); + } + configProperties.setProperty("language", I18n.getLocale().getLanguage()); + 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(); } @@ -167,6 +414,61 @@ public class SwingInterface implements CoreListener { nodeDisconnect(); } }; + List availableLanguages = I18n.findAvailableLanguages(); + for (final Locale locale: availableLanguages) { + I18nAction languageAction = new I18nAction("general.language." + locale.getLanguage()) { + + @SuppressWarnings("synthetic-access") + public void actionPerformed(ActionEvent e) { + changeLanguage(locale, this); + } + + }; + if (I18n.getLocale().getLanguage().equals(locale.getLanguage())) { + languageAction.setEnabled(false); + } + 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(); + } + }; } /** @@ -174,6 +476,43 @@ public class SwingInterface implements CoreListener { */ private void initDialogs() { manageNodesDialog = new ManageNodesDialog(this); + aboutDialog = new AboutDialog(this); + configurationDialog = new ConfigurationDialog(this); + } + + // + // PRIVATE ACTIONS + // + + /** + * 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() { + /* TODO */ + } + + /** + * Quits jSite. + */ + private void quit() { + saveConfig(); + System.exit(0); } /** @@ -189,12 +528,60 @@ public class SwingInterface implements CoreListener { * Connects to the node. */ private void nodeConnect() { + /* TODO */ } /** * Disconnects from the node. */ private void nodeDisconnect() { + /* TODO */ + } + + /** + * 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 + * The action that triggered the change + */ + private void changeLanguage(Locale newLocale, I18nAction languageAction) { + for (I18nAction i18nAction: languageActions) { + i18nAction.setEnabled(i18nAction != 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() { + /* TODO */ + } + + /** + * Deletes a project. + */ + private void deleteProject() { + /* TODO */ } // @@ -204,29 +591,60 @@ public class SwingInterface implements CoreListener { /** * {@inheritDoc} */ + public void loadingProjectsFailed(String directory, Throwable throwable) { + JOptionPane.showMessageDialog(mainWindow, I18n.get("mainWindow.error.projectLoadingFailed.message", directory), I18n.get("mainWindow.error.projectLoadingFailed.title"), JOptionPane.ERROR_MESSAGE); + } + + /** + * {@inheritDoc} + */ + public void savingProjectsDone(String directory) { + mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.projectSavingDone")); + } + + /** + * {@inheritDoc} + */ + public void savingProjectsFailed(String directory, Throwable throwabled) { + /* TODO */ + } + + /** + * {@inheritDoc} + */ public void coreLoaded() { this.nodeList = core.getNodes(); manageNodesDialog.setNodeList(nodeList); mainWindow.setVisible(true); - mainWindow.setStatusBarText("Core loaded."); + mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.coreLoaded")); + } + + /** + * {@inheritDoc} + */ + public void coreStopped() { + mainWindow.setStatusBarText(I18n.get("mainWindow.statusBar.coreStopped")); } /** * {@inheritDoc} */ public void nodeConnected(Node node) { + /* TODO */ } /** * {@inheritDoc} */ public void nodeConnecting(Node node) { + /* TODO */ } /** * {@inheritDoc} */ public void nodeDisconnected(Node node) { + /* TODO */ } }