X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fgui%2FMainWindow.java;h=f582bb2fb35492c8b873b20697d0939fcdd05373;hb=99ef3764897825a3154cb662b2b81f51c16fdbd2;hp=fc9986a45b32b9d84a5158e2dcc7a8689c86463d;hpb=3147745190bab479d89840ff706d3e346692fd49;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/gui/MainWindow.java b/src/net/pterodactylus/jsite/gui/MainWindow.java index fc9986a..f582bb2 100644 --- a/src/net/pterodactylus/jsite/gui/MainWindow.java +++ b/src/net/pterodactylus/jsite/gui/MainWindow.java @@ -20,10 +20,17 @@ 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; @@ -38,22 +45,27 @@ 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.jsite.project.Project; +import net.pterodactylus.util.logging.Logging; 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 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; @@ -61,6 +73,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)); @@ -97,7 +118,7 @@ public class MainWindow extends JFrame implements I18nable { /** * Creates a new main window that redirects all actions to the given swing * interface. - * + * * @param swingInterface * The swing interface to receive all actions */ @@ -109,7 +130,7 @@ public class MainWindow extends JFrame implements I18nable { pack(); SwingUtils.center(this); I18n.registerI18nable(this); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + addWindowListener(this); } // @@ -118,17 +139,51 @@ public class MainWindow extends JFrame implements I18nable { /** * Sets the text of the status bar. - * + * * @param text * The text of the status bar */ 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 @@ -150,7 +205,7 @@ public class MainWindow extends JFrame implements I18nable { /** * Returns the currently selected project. - * + * * @return The currently selected project */ public Project getSelectedProject() { @@ -185,11 +240,99 @@ public class MainWindow extends JFrame implements I18nable { } } + /** + * Adds a project to the project pane. + * + * @param project + * The project to add + * @param switchToProject + * true to switch to the new panel, + * false to not change the current panel + */ + void addProject(Project project, boolean switchToProject) { + ProjectPanel projectPanel = new ProjectPanel(swingInterface, project); + int newTabIndex = projectPane.getTabCount(); + projectPane.add(project.getName(), projectPanel); + projectPane.setToolTipTextAt(newTabIndex, project.getDescription()); + project.addPropertyChangeListener(this); + if (switchToProject) { + projectPane.setSelectedIndex(newTabIndex); + } + } + + /** + * @param project + */ + void projectInsertStarted(Project project) { + int projectIndex = getProjectIndex(project); + if (projectIndex == -1) { + return; + } + projectPane.setTitleAt(projectIndex, I18n.get("projectPanel.title.starting", project.getName())); + } + + /** + * @param project + * @param totalBlocks + * @param requiredBlocks + * @param successfulBlocks + * @param failedBlocks + * @param fatallyFailedBlocks + * @param finalizedTotal + */ + void projectInsertProgressed(Project project, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) { + int projectIndex = getProjectIndex(project); + if (projectIndex == -1) { + return; + } + projectPane.setTitleAt(projectIndex, I18n.get("projectPanel.title.progress", project.getName(), requiredBlocks / (double) successfulBlocks)); + } + + /** + * @param project + */ + void projectInsertGeneratedURI(Project project) { + /* TODO - update panel. */ + } + + /** + * @param project + * @param success + */ + void projectInsertFinished(Project project, boolean success) { + int projectIndex = getProjectIndex(project); + if (projectIndex == -1) { + return; + } + projectPane.setTitleAt(projectIndex, project.getName()); + } + // // PRIVATE METHODS // /** + * Returns the index of the project panel that contains the given project. + * + * @param project + * The wanted project + * @return The index of {@link #projectPane}’s tab that contains the given + * project, or -1 if the project can not be found + */ + private int getProjectIndex(Project project) { + int tabCount = projectPane.getTabCount(); + for (int tabIndex = 1; tabIndex < tabCount; tabIndex++) { + Component tabComponent = projectPane.getComponentAt(tabIndex); + if (tabComponent instanceof ProjectPanel) { + if (((ProjectPanel) tabComponent).getProject() == project) { + return tabIndex; + } + } + } + return -1; + } + + /** * Initializes the window by creating all its components. */ private void initWindow() { @@ -266,14 +409,9 @@ public class MainWindow extends JFrame implements I18nable { 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. - */ - + /* TODO - remove upper panel */ JPanel upperPanel = new JPanel(new BorderLayout(12, 12)); - getContentPane().add(upperPanel, BorderLayout.PAGE_START); + getContentPane().add(upperPanel, BorderLayout.CENTER); contentPane.setBorder(new EmptyBorder(12, 12, 12, 12)); projectPane = new JTabbedPane(SwingConstants.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); @@ -289,8 +427,8 @@ 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); + // JPanel lowerPanel = new JPanel(new BorderLayout(12, 12)); + // getContentPane().add(lowerPanel, BorderLayout.CENTER); } // @@ -321,12 +459,98 @@ public class MainWindow extends JFrame implements I18nable { } helpMenu.updateI18n(); getJMenuBar().revalidate(); - projectOverviewPanel.setName(I18n.get("mainWindow.pane.overview.title")); + projectPane.setTitleAt(0, I18n.get("mainWindow.pane.overview.title")); for (int componentIndex = 0; componentIndex < projectPane.getTabCount(); componentIndex++) { - projectPane.setTitleAt(componentIndex, projectPane.getComponentAt(componentIndex).getName()); + Component tabComponent = projectPane.getComponentAt(componentIndex); + if (tabComponent instanceof ProjectPanel) { + ((ProjectPanel) tabComponent).updateI18n(); + } } 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(); + } + } + } + } + } + } + }