X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FMainWindow.java;h=4eb7ab71d319e11b0b3914d2b7a5e7f0213105de;hb=ebd531bc775036dd66a7e20abebbcb480af35491;hp=3e8e96583f48a0292a77e20bd11520e8630a9d21;hpb=c785ca4d7b634f79e1f30202915633aa92e4152c;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/MainWindow.java b/src/net/pterodactylus/jsite/gui/MainWindow.java index 3e8e965..4eb7ab7 100644 --- a/src/net/pterodactylus/jsite/gui/MainWindow.java +++ b/src/net/pterodactylus/jsite/gui/MainWindow.java @@ -19,14 +19,368 @@ package net.pterodactylus.jsite.gui; +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; + +import javax.swing.Action; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; import javax.swing.JFrame; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JTabbedPane; +import javax.swing.JToolBar; +import javax.swing.SwingConstants; +import javax.swing.border.EmptyBorder; + +import net.pterodactylus.jsite.core.Project; +import net.pterodactylus.jsite.i18n.I18n; +import net.pterodactylus.jsite.i18n.I18nable; +import net.pterodactylus.jsite.i18n.gui.I18nAction; +import net.pterodactylus.jsite.i18n.gui.I18nMenu; +import net.pterodactylus.jsite.main.Version; +import net.pterodactylus.util.swing.StatusBar; +import net.pterodactylus.util.swing.SwingUtils; /** * Defines the main window of the application. - * + * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> * @version $Id$ */ -public class MainWindow extends JFrame { +public class MainWindow extends JFrame implements WindowListener, I18nable { + + /** The swing interface that receives all actions. */ + private final SwingInterface swingInterface; + + /** The status bar. */ + private StatusBar statusBar = new StatusBar(); + + /** The content pane. */ + private JPanel contentPane = new JPanel(new BorderLayout(12, 12)); + + /** The jSite menu. */ + private I18nMenu jSiteMenu; + + /** The node menu. */ + private I18nMenu nodeMenu; + + /** The “connect” (advanced mode) menu. */ + private I18nMenu connectMenu; + + /** The “connect” (simple mode) menu. */ + private JMenuItem connectMenuItem; + + /** The “disconnect” (advanced mode) menu. */ + private I18nMenu disconnectMenu; + + /** The “diconnect” (simple mode) menu item. */ + private JMenuItem disconnectMenuItem; + + /** The language menu. */ + private I18nMenu languageMenu; + + /** The about menu. */ + private I18nMenu helpMenu; + + /** The tabbed project pane. */ + private JTabbedPane projectPane; + + /** The project overview panel. */ + private Box projectOverviewPanel; + + /** + * Creates a new main window that redirects all actions to the given swing + * interface. + * + * @param swingInterface + * The swing interface to receive all actions + */ + public MainWindow(SwingInterface swingInterface) { + super("jSite " + Version.getVersion()); + this.swingInterface = swingInterface; + initWindow(); + setPreferredSize(new Dimension(480, 280)); + pack(); + SwingUtils.center(this); + I18n.registerI18nable(this); + addWindowListener(this); + } + + // + // ACCESSORS + // + + /** + * Sets the text of the status bar. + * + * @param text + * The text of the status bar + */ + public void setStatusBarText(String text) { + statusBar.setText(text); + } + + /** + * Sets whether the advanced mode is activated. + * + * @param advancedMode + * true if the advanced mode is activated, + * false if the simple mode is activated + */ + public void setAdvancedMode(boolean advancedMode) { + connectMenu.setVisible(advancedMode); + connectMenuItem.setVisible(!advancedMode); + disconnectMenu.setVisible(advancedMode); + disconnectMenuItem.setVisible(!advancedMode); + } + + /** + * {@inheritDoc} + */ + @Override + public Container getContentPane() { + return contentPane; + } + + /** + * Returns the currently selected project. + * + * @return The currently selected project + */ + public Project getSelectedProject() { + return null; + } + + // + // ACTIONS + // + + /** + * Refreshes the menu items in the “connect” and “disconnect” menus. + */ + void refreshNodeMenuItems() { + connectMenu.removeAll(); + for (Action nodeConnectAction: swingInterface.getNodeConnectActions()) { + connectMenu.add(nodeConnectAction); + } + if (connectMenu.getMenuComponentCount() == 0) { + JMenuItem noNodeAvailableItem = new JMenuItem(I18n.get("mainWindow.menu.connectNoNodeAvailable.name")); + noNodeAvailableItem.setEnabled(false); + connectMenu.add(noNodeAvailableItem); + } + disconnectMenu.removeAll(); + for (Action nodeDisconnectAction: swingInterface.getNodeDisconnectActions()) { + disconnectMenu.add(nodeDisconnectAction); + } + if (disconnectMenu.getMenuComponentCount() == 0) { + JMenuItem noNodeAvailableItem = new JMenuItem(I18n.get("mainWindow.menu.disconnectNoNodeAvailable.name")); + noNodeAvailableItem.setEnabled(false); + disconnectMenu.add(noNodeAvailableItem); + } + } + + // + // PRIVATE METHODS + // + + /** + * Initializes the window by creating all its components. + */ + private void initWindow() { + JMenuBar menuBar = new JMenuBar(); + + jSiteMenu = new I18nMenu("mainWindow.menu.jSite"); + menuBar.add(jSiteMenu); + + jSiteMenu.add(new FixedJMenuItem(swingInterface.getConfigureAction())); + jSiteMenu.addSeparator(); + jSiteMenu.add(new FixedJMenuItem(swingInterface.getImportConfigAction())); + jSiteMenu.addSeparator(); + jSiteMenu.add(new FixedJMenuItem(swingInterface.getQuitAction())); + + connectMenu = new I18nMenu("mainWindow.menu.connect"); + disconnectMenu = new I18nMenu("mainWindow.menu.disconnect"); + + nodeMenu = new I18nMenu("mainWindow.menu.node"); + menuBar.add(nodeMenu); + + nodeMenu.add(new FixedJMenuItem(swingInterface.getManageNodesAction())); + nodeMenu.addSeparator(); + nodeMenu.add(connectMenuItem = new FixedJMenuItem(swingInterface.getNodeConnectAction())); + nodeMenu.add(connectMenu); + nodeMenu.add(disconnectMenuItem = new FixedJMenuItem(swingInterface.getNodeDisconnectAction())); + nodeMenu.add(disconnectMenu); + refreshNodeMenuItems(); + + languageMenu = new I18nMenu("mainWindow.menu.language"); + menuBar.add(languageMenu); + + for (I18nAction languageAction: swingInterface.getLanguageActions()) { + languageMenu.add(new FixedJMenuItem(languageAction)); + } + + JPanel spacerPanel = new JPanel(); + spacerPanel.setOpaque(false); + menuBar.add(spacerPanel); + + helpMenu = new I18nMenu("mainWindow.menu.help"); + menuBar.add(helpMenu); + + helpMenu.add(new FixedJMenuItem(swingInterface.getHelpAboutAction())); + + setJMenuBar(menuBar); + + JToolBar toolBar = new JToolBar(I18n.get("mainWindow.toolbar.name")); + toolBar.add(swingInterface.getManageNodesAction()); + toolBar.addSeparator(); + toolBar.add(swingInterface.getNodeConnectAction()); + toolBar.add(swingInterface.getNodeDisconnectAction()); + super.getContentPane().add(toolBar, BorderLayout.PAGE_START); + + super.getContentPane().add(contentPane, BorderLayout.CENTER); + + addWindowListener(new WindowAdapter() { + + /** + * {@inheritDoc} + */ + @SuppressWarnings("synthetic-access") + @Override + public void windowClosing(WindowEvent windowEvent) { + swingInterface.getQuitAction().actionPerformed(null); + } + }); + + initComponents(); + } + + /** + * Initializes all components of this window. + */ + private void initComponents() { + super.getContentPane().add(statusBar, BorderLayout.PAGE_END); + + /* + * the main window consists of two panels which are vertically oriented. + * the upper panel contains of a tabbed pane, the lower panel consists + * of a table that lists the running requests. + */ + + JPanel upperPanel = new JPanel(new BorderLayout(12, 12)); + getContentPane().add(upperPanel, BorderLayout.PAGE_START); + contentPane.setBorder(new EmptyBorder(12, 12, 12, 12)); + + projectPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); + upperPanel.add(projectPane, BorderLayout.CENTER); + + projectOverviewPanel = new Box(BoxLayout.PAGE_AXIS); + projectOverviewPanel.setName(I18n.get("mainWindow.pane.overview.title")); + projectPane.add(projectOverviewPanel); + projectOverviewPanel.setBorder(new EmptyBorder(12, 12, 12, 12)); + projectOverviewPanel.add(Box.createVerticalGlue()); + JButton addProjectButton = new JButton(swingInterface.getAddProjectAction()); + addProjectButton.setAlignmentX(0.5f); + projectOverviewPanel.add(addProjectButton); + projectOverviewPanel.add(Box.createVerticalGlue()); + +// JPanel lowerPanel = new JPanel(new BorderLayout(12, 12)); +// getContentPane().add(lowerPanel, BorderLayout.CENTER); + } + + // + // INTERFACE I18nable + // + + /** + * {@inheritDoc} + */ + public void updateI18n() { + swingInterface.getConfigureAction().updateI18n(); + swingInterface.getImportConfigAction().updateI18n(); + swingInterface.getQuitAction().updateI18n(); + swingInterface.getManageNodesAction().updateI18n(); + swingInterface.getNodeConnectAction().updateI18n(); + connectMenu.updateI18n(); + swingInterface.getNodeDisconnectAction().updateI18n(); + disconnectMenu.updateI18n(); + swingInterface.getAddProjectAction().updateI18n(); + swingInterface.getCloneProjectAction().updateI18n(); + swingInterface.getDeleteProjectAction().updateI18n(); + swingInterface.getHelpAboutAction().updateI18n(); + jSiteMenu.updateI18n(); + nodeMenu.updateI18n(); + languageMenu.updateI18n(); + for (I18nAction languageAction: swingInterface.getLanguageActions()) { + languageAction.updateI18n(); + } + helpMenu.updateI18n(); + getJMenuBar().revalidate(); + projectOverviewPanel.setName(I18n.get("mainWindow.pane.overview.title")); + for (int componentIndex = 0; componentIndex < projectPane.getTabCount(); componentIndex++) { + projectPane.setTitleAt(componentIndex, projectPane.getComponentAt(componentIndex).getName()); + } + refreshNodeMenuItems(); + SwingUtils.repackCentered(this); + } + + // + // INTERFACE WindowListener + // + + /** + * {@inheritDoc} + */ + public void windowActivated(WindowEvent e) { + /* do nothing. */ + } + + /** + * {@inheritDoc} + */ + public void windowClosed(WindowEvent e) { + /* do nothing. */ + } + + /** + * {@inheritDoc} + */ + public void windowClosing(WindowEvent e) { + swingInterface.getQuitAction().actionPerformed(null); + } + + /** + * {@inheritDoc} + */ + public void windowDeactivated(WindowEvent e) { + /* do nothing. */ + } + + /** + * {@inheritDoc} + */ + public void windowDeiconified(WindowEvent e) { + /* do nothing. */ + } + + /** + * {@inheritDoc} + */ + public void windowIconified(WindowEvent e) { + /* do nothing. */ + } + + /** + * {@inheritDoc} + */ + public void windowOpened(WindowEvent e) { + /* do nothing. */ + } }