X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FMainWindow.java;h=e91a9dc178a9b7945d49e8247f9af90a7973e153;hb=f29d7d5e8028482735f51d4a93cfd0d937151051;hp=19982e9b254e9f72e19b82aa33c1be868107ea8e;hpb=d3151d3ac5ded6fefa8e1c4927d4d30893bb5346;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/MainWindow.java b/src/net/pterodactylus/jsite/gui/MainWindow.java index 19982e9..e91a9dc 100644 --- a/src/net/pterodactylus/jsite/gui/MainWindow.java +++ b/src/net/pterodactylus/jsite/gui/MainWindow.java @@ -20,27 +20,40 @@ package net.pterodactylus.jsite.gui; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; - +import java.awt.event.WindowListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Timer; +import java.util.TimerTask; +import java.util.logging.Logger; + +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.JScrollPane; import javax.swing.JTabbedPane; +import javax.swing.JTable; 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.logging.Logging; import net.pterodactylus.util.swing.StatusBar; import net.pterodactylus.util.swing.SwingUtils; @@ -50,7 +63,11 @@ import net.pterodactylus.util.swing.SwingUtils; * @author David ‘Bombe’ Roden <bombe@freenetproject.org> * @version $Id$ */ -public class MainWindow extends JFrame implements I18nable { +public class MainWindow extends JFrame implements WindowListener, I18nable, PropertyChangeListener { + + /** Logger. */ + @SuppressWarnings("unused") + private static final Logger logger = Logging.getLogger(MainWindow.class.getName()); /** The swing interface that receives all actions. */ private final SwingInterface swingInterface; @@ -58,6 +75,15 @@ public class MainWindow extends JFrame implements I18nable { /** The status bar. */ private StatusBar statusBar = new StatusBar(); + /** Timer for clearing the status bar. */ + private Timer statusBarClearTimer = new Timer("StatusBar Cleaner", true); + + /** Object for status bar clearing ticker event. */ + private TimerTask statusBarClearTimerTask; + + /** Delay (in seconds) after which to clear status bar. */ + private int statusBarClearDelay = 5000; + /** The content pane. */ private JPanel contentPane = new JPanel(new BorderLayout(12, 12)); @@ -67,11 +93,32 @@ public class MainWindow extends JFrame implements I18nable { /** 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 aboutMenu; + private I18nMenu helpMenu; + + /** The tabbed project pane. */ + private JTabbedPane projectPane; + + /** The project overview panel. */ + private Box projectOverviewPanel; + + /** The request table. */ + private JTable requestTable; /** * Creates a new main window that redirects all actions to the given swing @@ -88,7 +135,7 @@ public class MainWindow extends JFrame implements I18nable { pack(); SwingUtils.center(this); I18n.registerI18nable(this); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + addWindowListener(this); } // @@ -103,6 +150,113 @@ public class MainWindow extends JFrame implements I18nable { */ public void setStatusBarText(String text) { statusBar.setText(text); + synchronized (statusBar) { + if (statusBarClearTimerTask != null) { + statusBarClearTimerTask.cancel(); + } + statusBarClearTimerTask = new TimerTask() { + + @SuppressWarnings("synthetic-access") + @Override + public void run() { + statusBar.setText("\u00a0"); + } + + }; + statusBarClearTimer.schedule(statusBarClearTimerTask, statusBarClearDelay); + } + } + + /** + * Returns the status bar clear delay (in milliseconds). + * + * @return The status bar clear delay + */ + public int getStatusBarClearDelay() { + return statusBarClearDelay; + } + + /** + * Sets the status bar clear delay (in milliseconds). + * + * @param statusBarClearDelay + * The status bar clear delay + */ + public void setStatusBarClearDelay(int statusBarClearDelay) { + this.statusBarClearDelay = statusBarClearDelay; + } + + /** + * 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); + } + } + + /** + * Adds a project to the project pane. + * + * @param project + * The project to add + */ + void addProject(Project project) { + ProjectPanel projectPanel = new ProjectPanel(swingInterface, project); + int newTabIndex = projectPane.getTabCount(); + projectPane.add(project.getName(), projectPanel); + projectPane.setToolTipTextAt(newTabIndex, project.getDescription()); + project.addPropertyChangeListener(this); } // @@ -124,26 +278,35 @@ public class MainWindow extends JFrame implements I18nable { 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(new FixedJMenuItem(swingInterface.getNodeConnectAction())); - nodeMenu.add(new FixedJMenuItem(swingInterface.getNodeDisconnectAction())); + 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(languageAction); + languageMenu.add(new FixedJMenuItem(languageAction)); } - menuBar.add(new JPanel()); - aboutMenu = new I18nMenu("mainWindow.menu.help"); - menuBar.add(aboutMenu); + JPanel spacerPanel = new JPanel(); + spacerPanel.setOpaque(false); + menuBar.add(spacerPanel); + + helpMenu = new I18nMenu("mainWindow.menu.help"); + menuBar.add(helpMenu); - aboutMenu.add(new FixedJMenuItem(swingInterface.getHelpAboutAction())); + helpMenu.add(new FixedJMenuItem(swingInterface.getHelpAboutAction())); setJMenuBar(menuBar); @@ -187,11 +350,12 @@ public class MainWindow extends JFrame implements I18nable { getContentPane().add(upperPanel, BorderLayout.PAGE_START); contentPane.setBorder(new EmptyBorder(12, 12, 12, 12)); - JTabbedPane tabbedPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); - upperPanel.add(tabbedPane, BorderLayout.CENTER); + projectPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); + upperPanel.add(projectPane, BorderLayout.CENTER); - Box projectOverviewPanel = new Box(BoxLayout.PAGE_AXIS); - tabbedPane.add(I18n.get("mainWindow.pane.overview.title"), projectOverviewPanel); + 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()); @@ -199,16 +363,11 @@ public class MainWindow extends JFrame implements I18nable { projectOverviewPanel.add(addProjectButton); projectOverviewPanel.add(Box.createVerticalGlue()); -// JPanel lowerPanel = new JPanel(new BorderLayout(12, 12)); -// getContentPane().add(lowerPanel, BorderLayout.CENTER); - } + requestTable = new JTable(swingInterface.getRequestTableModel()); + getContentPane().add(new JScrollPane(requestTable), BorderLayout.CENTER); - /** - * {@inheritDoc} - */ - @Override - public Container getContentPane() { - return contentPane; + // JPanel lowerPanel = new JPanel(new BorderLayout(12, 12)); + // getContentPane().add(lowerPanel, BorderLayout.CENTER); } // @@ -219,13 +378,115 @@ public class MainWindow extends JFrame implements 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. */ + } + + // + // INTERFACE PropertyChangeListener + // + + /** + * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) + */ + public void propertyChange(PropertyChangeEvent propertyChangeEvent) { + Object eventSource = propertyChangeEvent.getSource(); + String propertyName = propertyChangeEvent.getPropertyName(); + if (eventSource instanceof Project) { + /* if a project was changed, update the tab title and tooltip. */ + if (Project.PROPERTY_NAME.equals(propertyName) || Project.PROPERTY_DESCRIPTION.equals(propertyName)) { + Project project = (Project) eventSource; + int tabCount = projectPane.getTabCount(); + for (int tabIndex = 0; tabIndex < tabCount; tabIndex++) { + Component tabComponent = projectPane.getComponentAt(tabIndex); + if (tabComponent instanceof ProjectPanel) { + Project tabProject = ((ProjectPanel) tabComponent).getProject(); + if (tabProject.equals(project)) { + projectPane.setTitleAt(tabIndex, project.getName()); + projectPane.setToolTipTextAt(tabIndex, project.getDescription()); + projectPane.repaint(); + } + } + } + } + } + } + }