X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fde%2Ftodesbaum%2Fjsite%2Fmain%2FMain.java;h=3c9c3fabb1777fb13c3f8767f03390b350002dd3;hb=8bc7a8f2372639a9fbeea34f9cbee9697f34ba3f;hp=e654c914d13b671a764e5c379689380e958f50ea;hpb=a03efa6ebf81fc25c9b3e4effdd1529e956ad24b;p=jSite.git diff --git a/src/de/todesbaum/jsite/main/Main.java b/src/de/todesbaum/jsite/main/Main.java index e654c91..3c9c3fa 100644 --- a/src/de/todesbaum/jsite/main/Main.java +++ b/src/de/todesbaum/jsite/main/Main.java @@ -1,6 +1,5 @@ /* - * jSite - a tool for uploading websites into Freenet - * Copyright (C) 2006-2009 David Roden + * jSite - Main.java - Copyright © 2006–2012 David Roden * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,7 +21,6 @@ package de.todesbaum.jsite.main; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.File; import java.io.IOException; import java.text.MessageFormat; import java.util.Date; @@ -52,10 +50,10 @@ import de.todesbaum.jsite.application.Freenet7Interface; import de.todesbaum.jsite.application.Node; import de.todesbaum.jsite.application.Project; import de.todesbaum.jsite.application.ProjectInserter; -import de.todesbaum.jsite.application.UpdateChecker; -import de.todesbaum.jsite.application.UpdateListener; import de.todesbaum.jsite.application.ProjectInserter.CheckReport; import de.todesbaum.jsite.application.ProjectInserter.Issue; +import de.todesbaum.jsite.application.UpdateChecker; +import de.todesbaum.jsite.application.UpdateListener; import de.todesbaum.jsite.gui.NodeManagerListener; import de.todesbaum.jsite.gui.NodeManagerPage; import de.todesbaum.jsite.gui.PreferencesPage; @@ -64,7 +62,7 @@ import de.todesbaum.jsite.gui.ProjectInsertPage; import de.todesbaum.jsite.gui.ProjectPage; import de.todesbaum.jsite.i18n.I18n; import de.todesbaum.jsite.i18n.I18nContainer; -import de.todesbaum.jsite.main.Configuration.ConfigurationDirectory; +import de.todesbaum.jsite.main.ConfigurationLocator.ConfigurationLocation; import de.todesbaum.util.image.IconLoader; import de.todesbaum.util.swing.TWizard; import de.todesbaum.util.swing.TWizardPage; @@ -81,7 +79,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen private static final Logger logger = Logger.getLogger(Main.class.getName()); /** The version. */ - private static final Version VERSION = new Version(0, 9, 2); + private static final Version VERSION = new Version(0, 10); /** The configuration. */ private Configuration configuration; @@ -149,6 +147,9 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** Mapping from page type to page. */ private final Map pages = new HashMap(); + /** The original location of the configuration file. */ + private ConfigurationLocation originalLocation; + /** * Creates a new core with the default configuration file. */ @@ -163,33 +164,18 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen * The name of the configuration file */ private Main(String configFilename) { + /* collect all possible configuration file locations. */ + ConfigurationLocator configurationLocator = new ConfigurationLocator(); if (configFilename != null) { - configuration = new Configuration(configFilename); - } else { - /* are we executed from a JAR file? */ - String resource = getClass().getResource("/de/todesbaum/jsite/i18n/jSite.properties").toString(); - if (resource.startsWith("jar:")) { - String jarFileLocation = resource.substring(9, resource.indexOf(".jar!") + 4); - String jarFileDirectory = new File(jarFileLocation).getParent(); - File configurationFile = new File(jarFileDirectory, "jSite.conf"); - if (configurationFile.exists()) { - configuration = new Configuration(configurationFile.getAbsolutePath()); - configuration.setConfigurationDirectory(ConfigurationDirectory.NEXT_TO_JAR_FILE); - } - } - if (configuration == null) { - configuration = new Configuration(); - } + configurationLocator.setCustomLocation(configFilename); } + + originalLocation = configurationLocator.findPreferredLocation(); + logger.log(Level.CONFIG, "Using configuration from " + originalLocation + "."); + configuration = new Configuration(configurationLocator, originalLocation); + Locale.setDefault(configuration.getLocale()); I18n.setLocale(configuration.getLocale()); - if (!configuration.createLockFile()) { - int option = JOptionPane.showOptionDialog(null, I18n.getMessage("jsite.main.already-running"), "", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] { I18n.getMessage("jsite.main.already-running.override"), I18n.getMessage("jsite.wizard.quit") }, I18n.getMessage("jsite.wizard.quit")); - if (option != 0) { - throw new IllegalStateException("Lockfile override not active, refusing start."); - } - configuration.removeLockfileOnExit(); - } wizard = new TWizard(); createActions(); wizard.setJMenuBar(createMenuBar()); @@ -215,6 +201,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen for (final Locale locale : SUPPORTED_LOCALES) { languageActions.put(locale, new AbstractAction(I18n.getMessage("jsite.menu.language." + locale.getLanguage()), IconLoader.loadIcon("/flag-" + locale.getLanguage() + ".png")) { + @Override @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent actionEvent) { switchLanguage(locale); @@ -223,6 +210,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen } manageNodeAction = new AbstractAction(I18n.getMessage("jsite.menu.nodes.manage-nodes")) { + @Override @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent actionEvent) { showPage(PageType.PAGE_NODE_MANAGER); @@ -236,6 +224,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent actionEvent) { optionsPreferences(); @@ -246,6 +235,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent actionEvent) { showLatestUpdate(); @@ -253,6 +243,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen }; aboutAction = new AbstractAction(I18n.getMessage("jsite.menu.help.about")) { + @Override @SuppressWarnings("synthetic-access") public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(wizard, MessageFormat.format(I18n.getMessage("jsite.about.message"), getVersion().toString()), null, JOptionPane.INFORMATION_MESSAGE, jSiteIcon); @@ -261,6 +252,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen I18nContainer.getInstance().registerRunnable(new Runnable() { + @Override @SuppressWarnings("synthetic-access") public void run() { manageNodeAction.putValue(Action.NAME, I18n.getMessage("jsite.menu.nodes.manage-nodes")); @@ -312,6 +304,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen I18nContainer.getInstance().registerRunnable(new Runnable() { + @Override @SuppressWarnings("synthetic-access") public void run() { languageMenu.setText(I18n.getMessage("jsite.menu.languages")); @@ -353,7 +346,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen projectInsertPage.setFreenetInterface(freenetInterface); pages.put(PageType.PAGE_INSERT_PROJECT, projectInsertPage); - PreferencesPage preferencesPage = new PreferencesPage(wizard, configuration); + PreferencesPage preferencesPage = new PreferencesPage(wizard); preferencesPage.setName("page.preferences"); preferencesPage.setTempDirectory(configuration.getTempDirectory()); pages.put(PageType.PAGE_PREFERENCES, preferencesPage); @@ -373,6 +366,17 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen } /** + * Returns whether a configuration file would be overwritten when calling + * {@link #saveConfiguration()}. + * + * @return {@code true} if {@link #saveConfiguration()} would overwrite an + * existing file, {@code false} otherwise + */ + private boolean isOverwritingConfiguration() { + return configuration.getConfigurationLocator().hasFile(configuration.getConfigurationDirectory()); + } + + /** * Saves the configuration. * * @return true if the configuration could be saved, @@ -402,7 +406,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen * @return The supported locale that was found, or the default locale if no * supported locale could be found */ - private Locale findSupportedLocale(Locale forLocale) { + private static Locale findSupportedLocale(Locale forLocale) { for (Locale locale : SUPPORTED_LOCALES) { if (locale.equals(forLocale)) { return locale; @@ -461,7 +465,12 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen * Shows a dialog with general preferences. */ private void optionsPreferences() { - ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setConfigurationDirectory(configuration.getConfigurationDirectory()); + ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setConfigurationLocation(configuration.getConfigurationDirectory()); + ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setHasNextToJarConfiguration(configuration.getConfigurationLocator().isValidLocation(ConfigurationLocation.NEXT_TO_JAR_FILE)); + ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setHasCustomConfiguration(configuration.getConfigurationLocator().isValidLocation(ConfigurationLocation.CUSTOM)); + ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setUseEarlyEncode(configuration.useEarlyEncode()); + ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setPriority(configuration.getPriority()); + ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).setManifestPutter(configuration.getManifestPutter()); showPage(PageType.PAGE_PREFERENCES); optionsPreferencesAction.setEnabled(false); wizard.setNextEnabled(true); @@ -491,6 +500,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void valueChanged(ListSelectionEvent e) { JList list = (JList) e.getSource(); int selectedRow = list.getSelectedIndex(); @@ -504,6 +514,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void wizardNextPressed(TWizard wizard) { String pageName = wizard.getPage().getName(); if ("page.node-manager".equals(pageName)) { @@ -554,6 +565,9 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen ProjectInsertPage projectInsertPage = (ProjectInsertPage) pages.get(PageType.PAGE_INSERT_PROJECT); String tempDirectory = ((PreferencesPage) pages.get(PageType.PAGE_PREFERENCES)).getTempDirectory(); projectInsertPage.setTempDirectory(tempDirectory); + projectInsertPage.setUseEarlyEncode(configuration.useEarlyEncode()); + projectInsertPage.setPriority(configuration.getPriority()); + projectInsertPage.setManifestPutter(configuration.getManifestPutter()); projectInsertPage.startInsert(); nodeMenu.setEnabled(false); optionsPreferencesAction.setEnabled(false); @@ -567,14 +581,20 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen optionsPreferencesAction.setEnabled(true); } } else if ("page.preferences".equals(pageName)) { + PreferencesPage preferencesPage = (PreferencesPage) pages.get(PageType.PAGE_PREFERENCES); showPage(PageType.PAGE_PROJECTS); optionsPreferencesAction.setEnabled(true); + configuration.setUseEarlyEncode(preferencesPage.useEarlyEncode()); + configuration.setPriority(preferencesPage.getPriority()); + configuration.setManifestPutter(preferencesPage.getManifestPutter()); + configuration.setConfigurationLocation(preferencesPage.getConfigurationLocation()); } } /** * {@inheritDoc} */ + @Override public void wizardPreviousPressed(TWizard wizard) { String pageName = wizard.getPage().getName(); if ("page.project".equals(pageName) || "page.preferences".equals(pageName)) { @@ -590,13 +610,28 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void wizardQuitPressed(TWizard wizard) { if (((ProjectPage) pages.get(PageType.PAGE_PROJECTS)).wasUriCopied() || ((ProjectInsertPage) pages.get(PageType.PAGE_INSERT_PROJECT)).wasUriCopied()) { JOptionPane.showMessageDialog(wizard, I18n.getMessage("jsite.project.warning.use-clipboard-now")); } - if (JOptionPane.showConfirmDialog(wizard, I18n.getMessage("jsite.quit.question"), null, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) { - if (saveConfiguration()) { - System.exit(0); + if (JOptionPane.showConfirmDialog(wizard, I18n.getMessage("jsite.quit.question"), I18n.getMessage("jsite.quit.question.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) { + if (isOverwritingConfiguration() && !originalLocation.equals(configuration.getConfigurationDirectory())) { + int overwriteConfigurationAnswer = JOptionPane.showConfirmDialog(wizard, MessageFormat.format(I18n.getMessage("jsite.quit.overwrite-configuration"), configuration.getConfigurationLocator().getFile(configuration.getConfigurationDirectory())), I18n.getMessage("jsite.quit.overwrite-configuration.title"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); + if (overwriteConfigurationAnswer == JOptionPane.YES_OPTION) { + if (saveConfiguration()) { + System.exit(0); + } + } else if (overwriteConfigurationAnswer == JOptionPane.CANCEL_OPTION) { + return; + } + if (overwriteConfigurationAnswer == JOptionPane.NO_OPTION) { + System.exit(0); + } + } else { + if (saveConfiguration()) { + System.exit(0); + } } if (JOptionPane.showConfirmDialog(wizard, I18n.getMessage("jsite.quit.config-not-saved"), null, JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION) { System.exit(0); @@ -611,6 +646,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void nodesUpdated(Node[] nodes) { nodeMenu.removeAll(); ButtonGroup nodeButtonGroup = new ButtonGroup(); @@ -635,6 +671,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void nodeSelected(Node node) { for (Component menuItem : nodeMenu.getMenuComponents()) { if (menuItem instanceof JMenuItem) { @@ -654,6 +691,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source instanceof JRadioButtonMenuItem) { @@ -671,6 +709,7 @@ public class Main implements ActionListener, ListSelectionListener, WizardListen /** * {@inheritDoc} */ + @Override public void foundUpdateData(Version foundVersion, long versionTimestamp) { logger.log(Level.FINEST, "Found version {0} from {1,date}.", new Object[] { foundVersion, versionTimestamp }); if (foundVersion.compareTo(VERSION) > 0) {