phex.gui.common.MainFrame.java Source code

Java tutorial

Introduction

Here is the source code for phex.gui.common.MainFrame.java

Source

/*
 *  PHEX - The pure-java Gnutella-servent.
 *  Copyright (C) 2001 - 2009 Phex Development Group
 *
 *  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
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 *  --- SVN Information ---
 *  $Id$
 */
package phex.gui.common;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JToolBar;
import javax.swing.event.ChangeListener;

import org.bushe.swing.event.annotation.EventTopicSubscriber;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import phex.common.Environment;
import phex.common.Phex;
import phex.event.ChangeEvent;
import phex.event.PhexEventTopics;
import phex.gui.actions.ExitPhexAction;
import phex.gui.actions.FWToggleAction;
import phex.gui.common.menubar.MainMenuBar;
import phex.gui.common.statusbar.MainStatusBar;
import phex.gui.dialogs.RespectCopyrightDialog;
import phex.gui.dialogs.configwizard.ConfigurationWizardDialog;
import phex.gui.prefs.UpdatePrefs;
import phex.gui.tabs.FWTab;
import phex.gui.tabs.StatisticsTab;
import phex.gui.tabs.download.SWDownloadTab;
import phex.gui.tabs.library.LibraryTab;
import phex.gui.tabs.network.NetworkTab;
import phex.gui.tabs.search.SearchTab;
import phex.gui.tabs.search.monitor.ResultMonitorTab;
import phex.gui.tabs.search.monitor.SearchMonitorTab;
import phex.gui.tabs.security.SecurityTab;
import phex.gui.tabs.upload.UploadTab;
import phex.msg.QueryMsg;
import phex.prefs.core.ProxyPrefs;
import phex.query.QueryHistoryMonitor;
import phex.query.QueryManager;
import phex.servent.Servent;
import phex.xml.sax.gui.DGuiSettings;
import phex.xml.sax.gui.DTab;

import com.jgoodies.looks.HeaderStyle;
import com.jgoodies.looks.Options;

public class MainFrame extends JFrame {
    public static final int NETWORK_TAB_ID = 1000;
    public static final int SEARCH_TAB_ID = 1101;
    public static final int DOWNLOAD_TAB_ID = 1003;
    public static final int UPLOAD_TAB_ID = 1004;
    public static final int SECURITY_TAB_ID = 1005;
    public static final int STATISTICS_TAB_ID = 1006;
    public static final int LIBRARY_TAB_ID = 1007;
    public static final int SEARCH_MONITOR_TAB_ID = 1008;
    public static final int RESULT_MONITOR_TAB_ID = 1009;

    public static final int NETWORK_TAB_INDEX = 0;
    public static final int SEARCH_TAB_INDEX = 1;
    public static final int DOWNLOAD_TAB_INDEX = 2;
    public static final int UPLOAD_TAB_INDEX = 3;
    public static final int LIBRARY_TAB_INDEX = 4;
    public static final int SECURITY_TAB_INDEX = 5;
    public static final int STATISTICS_TAB_INDEX = 6;
    public static final int SEARCH_MONITOR_TAB_INDEX = 7;
    public static final int RESULT_MONITOR_TAB_INDEX = 8;

    private static final Logger logger = LoggerFactory.getLogger(MainFrame.class);

    private JTabbedPane tabbedPane;
    private JPanel logoPanel;

    private FWToolBar toolbar;
    private NetworkTab networkTab;
    private SearchTab searchTab;
    private UploadTab uploadTab;
    private LibraryTab libraryTab;
    private SWDownloadTab swDownloadTab;
    private SecurityTab securityTab;
    private StatisticsTab statisticsTab;
    private SearchMonitorTab searchMonitorTab;
    private ResultMonitorTab resultMonitorTab;
    private MainStatusBar statusBar;

    public MainFrame(DGuiSettings guiSettings) {
        super();

        Icon frameIcon = GUIRegistry.getInstance().getSystemIconPack().getIcon("Frame.IconImage");
        if (frameIcon != null) {
            setIconImage(((ImageIcon) frameIcon).getImage());
        }

        //SkinLookAndFeelLoader.tryLoadingSkinLookAndFeel();
        //GUIUtils.setLookAndFeel( "com.jgoodies.looks.windows.ExtWindowsLookAndFeel" );
        //GUIUtils.setLookAndFeel( "com.jgoodies.looks.plastic.PlasticLookAndFeel" );
        //GUIUtils.setLookAndFeel( "com.jgoodies.looks.plastic.Plastic3DLookAndFeel" );
        //GUIUtils.setLookAndFeel( "com.jgoodies.looks.plastic.PlasticXPLookAndFeel" );

        setupComponents(guiSettings);
        /*
                Hashtable ht = UIManager.getDefaults();
                Enumeration enumr = ht.keys();
                while (enumr.hasMoreElements())
                {
        Object   key = enumr.nextElement();
        //System.out.println(key + "=" + ht.get(key));
                }
        */
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowHandler());

        DesktopIndicator indicator = GUIRegistry.getInstance().getDesktopIndicator();
        // if sys tray supported
        if (indicator != null) {
            indicator.addDesktopIndicatorListener(new DesktopIndicatorHandler());
        }

        pack();
        initFrameSize(guiSettings);

        setTitle();

        Phex.getEventService().processAnnotations(this);
    }

    private void initFrameSize(DGuiSettings guiSettings) {
        GUIUtils.centerAndSizeWindow(this, 7, 8);
        if (guiSettings == null) {
            return;
        }
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Rectangle bounds = getBounds();
        if (guiSettings.isSetWindowWidth()) {
            bounds.width = Math.min(screenSize.width, guiSettings.getWindowWidth());
        }
        if (guiSettings.isSetWindowHeight()) {
            bounds.height = Math.min(screenSize.height, guiSettings.getWindowHeight());
        }
        if (guiSettings.isSetWindowPosX()) {
            int posX = guiSettings.getWindowPosX();
            bounds.x = Math.max(0, Math.min(posX + bounds.width, (int) screenSize.getWidth()) - bounds.width);
        }
        if (guiSettings.isSetWindowPosY()) {
            int posY = guiSettings.getWindowPosY();
            bounds.y = Math.max(0, Math.min(posY + bounds.height, (int) screenSize.getHeight()) - bounds.height);
        }
        logger.debug("Frame position: {}", bounds);
        setBounds(bounds);
    }

    private void setupComponents(DGuiSettings guiSettings) {
        tabbedPane = new JTabbedPane();
        tabbedPane.setMinimumSize(new Dimension(50, 50));
        tabbedPane.addChangeListener(new ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent e) {
                Component comp = tabbedPane.getSelectedComponent();
                if (comp instanceof FWTab) {
                    ((FWTab) comp).tabSelectedNotify();
                }
            }
        });

        Servent servent = GUIRegistry.getInstance().getServent();

        // Net Tab
        networkTab = new NetworkTab();
        networkTab.initComponent(guiSettings);
        initializeTab(networkTab, NETWORK_TAB_ID, guiSettings);

        // Search Tab
        QueryManager queryService = servent.getQueryService();
        searchTab = new SearchTab(queryService.getSearchContainer(), queryService.getSearchFilterRules(),
                servent.getDownloadService());
        searchTab.initComponent(guiSettings);
        initializeTab(searchTab, SEARCH_TAB_ID, guiSettings);

        //  SWDownload Tab
        swDownloadTab = new SWDownloadTab(servent.getDownloadService());
        swDownloadTab.initComponent(guiSettings);
        initializeTab(swDownloadTab, DOWNLOAD_TAB_ID, guiSettings);

        //  Upload Tab
        uploadTab = new UploadTab();
        uploadTab.initComponent(guiSettings);
        initializeTab(uploadTab, UPLOAD_TAB_ID, guiSettings);

        //  Library Tab
        libraryTab = new LibraryTab();
        libraryTab.initComponent(guiSettings);
        initializeTab(libraryTab, LIBRARY_TAB_ID, guiSettings);

        //  Security Tab
        securityTab = new SecurityTab();
        securityTab.initComponent(guiSettings);
        initializeTab(securityTab, SECURITY_TAB_ID, guiSettings);

        //  Statistics Tab
        statisticsTab = new StatisticsTab();
        statisticsTab.initComponent(guiSettings);
        initializeTab(statisticsTab, STATISTICS_TAB_ID, guiSettings);

        //  Search Monitor Tab
        QueryHistoryMonitor queryHistoryMonitor = new QueryHistoryMonitor();
        servent.getMessageService().addMessageSubscriber(QueryMsg.class, queryHistoryMonitor);
        searchMonitorTab = new SearchMonitorTab(queryHistoryMonitor);
        searchMonitorTab.initComponent(guiSettings);
        initializeTab(searchMonitorTab, SEARCH_MONITOR_TAB_ID, guiSettings);

        //  Result Monitor Tab
        resultMonitorTab = new ResultMonitorTab(servent.getDownloadService());
        resultMonitorTab.initComponent(guiSettings);
        initializeTab(resultMonitorTab, RESULT_MONITOR_TAB_ID, guiSettings);

        if (tabbedPane.getTabCount() == 0) {
            getContentPane().add(BorderLayout.CENTER, getLogoPanel());
        } else {
            tabbedPane.setSelectedIndex(0);
            getContentPane().add(BorderLayout.CENTER, tabbedPane);
        }

        // menu bar
        JMenuBar menubar = new MainMenuBar(this, guiSettings);
        setJMenuBar(menubar);
        // property changed to HeaderStyle.BOTH in case a toolbar is activated.
        menubar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.SINGLE);

        // toolbar
        boolean isToolbarVisible = true;
        if (guiSettings != null && guiSettings.isSetToolbarVisible()) {
            isToolbarVisible = guiSettings.isToolbarVisible();
        }
        if (isToolbarVisible) {
            setToolbarVisible(true);
        }

        // Status Bar
        boolean isStatusbarVisible = true;
        if (guiSettings != null && guiSettings.isSetStatusbarVisible()) {
            isStatusbarVisible = guiSettings.isStatusbarVisible();
        }
        if (isStatusbarVisible) {
            setStatusbarVisible(true);
        }
    }

    public void setTitle() {
        StringBuilder builder = new StringBuilder(Phex.getFullPhexVendor());
        builder.append(" - ");
        builder.append(GUIRegistry.getInstance().getServent().getGnutellaNetwork().getName());

        if (ProxyPrefs.UseSocks5.get().booleanValue()) {
            builder.append("  (via Proxy Server)");
        }
        super.setTitle(builder.toString());
    }

    public void setTabVisible(final FWTab tab, boolean state) {
        if (state) {
            int tabCount = tabbedPane.getTabCount();
            int modelPos = tab.getIndex();
            int pos;
            if (tabCount == 0) {
                pos = 0;
            } else {
                pos = tabCount;
                // check prev tab to find right position to show
                FWTab tmpTab = (FWTab) tabbedPane.getComponentAt(pos - 1);
                int tmpIdx = tmpTab.getIndex();
                while (tmpIdx > modelPos) {
                    pos--;
                    if (pos == 0) {//we are at the first position.
                        break;
                    }
                    tmpTab = (FWTab) tabbedPane.getComponentAt(pos - 1);
                    tmpIdx = tmpTab.getIndex();
                }
            }

            int orgTabCount = tabbedPane.getTabCount();

            if (orgTabCount == 0) {
                getContentPane().remove(getLogoPanel());
                getContentPane().add(BorderLayout.CENTER, tabbedPane);
                tabbedPane.setVisible(true);
                getContentPane().invalidate();
                getContentPane().repaint();
            }
            tabbedPane.insertTab(tab.getName(), tab.getIcon(), tab, tab.getToolTip(), pos);
            tabbedPane.setSelectedIndex(pos);
            if (orgTabCount == 0) {
                tab.setVisible(true);
            }
        } else {
            tabbedPane.remove(tab);

            if (tabbedPane.getTabCount() == 0) {
                getContentPane().remove(tabbedPane);
                getContentPane().add(BorderLayout.CENTER, getLogoPanel());
                getContentPane().invalidate();
                getContentPane().repaint();
                tabbedPane.setVisible(false);
            }
        }
    }

    public void setSelectedTab(int tabID) {
        FWTab tab = getTab(tabID);
        setSelectedTab(tab);
    }

    public FWTab getSelectedTab() {
        if (tabbedPane.getTabCount() == 0) {
            return null;
        }
        return (FWTab) tabbedPane.getSelectedComponent();
    }

    public void setSelectedTab(FWTab tab) {
        // Sanity check
        if (tab == null) {
            return;
        }

        // If the tab is not visible, then first make it visible.
        FWToggleAction action = tab.getToggleTabViewAction();
        // hope the action selected state is always matching the tab visible state...
        if (!action.isSelected()) {
            action.actionPerformed(new ActionEvent(this, 0, null));
        }

        // Select the tab.
        tabbedPane.setSelectedComponent(tab);
    }

    public FWTab getTab(int tabID) {
        switch (tabID) {
        case NETWORK_TAB_ID:
            return networkTab;
        case SEARCH_TAB_ID:
            return searchTab;
        case DOWNLOAD_TAB_ID:
            return swDownloadTab;
        case SECURITY_TAB_ID:
            return securityTab;
        case STATISTICS_TAB_ID:
            return statisticsTab;
        case UPLOAD_TAB_ID:
            return uploadTab;
        case LIBRARY_TAB_ID:
            return libraryTab;
        case SEARCH_MONITOR_TAB_ID:
            return searchMonitorTab;
        case RESULT_MONITOR_TAB_ID:
            return resultMonitorTab;
        default:
            logger.warn("Unknown tab id: {}", tabID);
            return null;
        }
    }

    public void saveGUISettings(DGuiSettings dSettings) {
        Rectangle bounds = getBounds();
        dSettings.setWindowHeight(bounds.height);
        dSettings.setWindowWidth(bounds.width);
        dSettings.setWindowPosX(bounds.x);
        dSettings.setWindowPosY(bounds.y);
        dSettings.setToolbarVisible(toolbar != null);
        networkTab.appendDGuiSettings(dSettings);
        searchTab.appendDGuiSettings(dSettings);
        swDownloadTab.appendDGuiSettings(dSettings);
        uploadTab.appendDGuiSettings(dSettings);
        libraryTab.appendDGuiSettings(dSettings);
        securityTab.appendDGuiSettings(dSettings);
        statisticsTab.appendDGuiSettings(dSettings);
        searchMonitorTab.appendDGuiSettings(dSettings);
        resultMonitorTab.appendDGuiSettings(dSettings);
    }

    private void initializeTab(FWTab tab, int tabID, DGuiSettings guiSettings) {
        //long start = System.currentTimeMillis();
        DTab dTab = GUIUtils.getDGuiTabById(guiSettings, tabID);
        boolean state = tab.isVisibleByDefault();
        if (dTab != null && dTab.isSetVisible()) {
            state = dTab.isVisible();
        }
        setTabVisible(tab, state);
        //long stop = System.currentTimeMillis();
        //System.out.println( tabID + " - " + (stop - start) + "" );
    }

    public void showLibraryTabByStatusBar() {
        setTabVisible(libraryTab, false);
        setTabVisible(libraryTab, true);
    }

    private JPanel getLogoPanel() {
        if (logoPanel == null) {
            ImageIcon icon = new ImageIcon(MainFrame.class.getResource(SplashScreen.SPLASH_IMAGE_NAME));
            Image image = icon.getImage();
            logoPanel = new FWLogoPanel(image);
            logoPanel.setBorder(BorderFactory.createLoweredBevelBorder());
        }
        return logoPanel;
    }

    public boolean isToolbarVisible() {
        return toolbar != null;
    }

    public void setToolbarVisible(boolean state) {
        if (state) {
            if (toolbar != null) {
                //already visible
                return;
            }
            toolbar = new FWToolBar(JToolBar.HORIZONTAL);
            toolbar.setShowText(false);

            toolbar.addAction(GUIRegistry.getInstance().getGlobalAction(GUIRegistry.EXIT_PHEX_ACTION));
            toolbar.addSeparator();
            toolbar.addAction(GUIRegistry.getInstance().getGlobalAction(GUIRegistry.CONNECT_NETWORK_ACTION));
            toolbar.addAction(GUIRegistry.getInstance().getGlobalAction(GUIRegistry.DISCONNECT_NETWORK_ACTION));
            toolbar.addSeparator();

            toolbar.addAction(networkTab.getToggleTabViewAction());
            //toolbar.addAction( searchTab.getToggleTabViewAction() );
            toolbar.addAction(searchTab.getToggleTabViewAction());
            toolbar.addAction(swDownloadTab.getToggleTabViewAction());
            toolbar.addAction(uploadTab.getToggleTabViewAction());
            toolbar.addAction(libraryTab.getToggleTabViewAction());
            toolbar.addAction(securityTab.getToggleTabViewAction());
            toolbar.addAction(statisticsTab.getToggleTabViewAction());
            toolbar.addAction(searchMonitorTab.getToggleTabViewAction());
            toolbar.addAction(resultMonitorTab.getToggleTabViewAction());

            toolbar.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
            getJMenuBar().putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);

            getContentPane().add(BorderLayout.NORTH, toolbar);
            getContentPane().validate();
        } else {
            getContentPane().remove(toolbar);
            getContentPane().validate();
            toolbar = null;
        }
    }

    public void setStatusbarVisible(boolean state) {
        if (state) {
            if (statusBar != null) {
                //already visible
                return;
            }
            statusBar = new MainStatusBar();
            getContentPane().add(BorderLayout.SOUTH, statusBar);
            getContentPane().validate();
        } else {
            getContentPane().remove(statusBar);
            getContentPane().validate();
            statusBar = null;
        }
    }

    /**
     * Reacts on online status changes.
     */
    @EventTopicSubscriber(topic = PhexEventTopics.Servent_OnlineStatus)
    public void onOnlineStatusEvent(String topic, ChangeEvent event) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                setTitle();
            }
        });
    }

    /**
     * Class to handle the WindowClosing event on the main frame.
     * 
     */
    private class WindowHandler extends WindowAdapter {
        /**
         * Just delegate to the ExitPhexAction acion.
         */
        @Override
        public void windowClosing(WindowEvent e) {
            ExitPhexAction.performCloseGUIAction();
        }

        @Override
        public void windowOpened(WindowEvent e) {
            if (GUIRegistry.getInstance().isRespectCopyrightNoticeShown()) {
                RespectCopyrightDialog dialog = new RespectCopyrightDialog();
                dialog.setVisible(true);
            }
            if (UpdatePrefs.ShowConfigWizard.get().booleanValue()) {
                ConfigurationWizardDialog dialog = new ConfigurationWizardDialog();
                dialog.setVisible(true);
            }
        }
    }

    private class DesktopIndicatorHandler implements DesktopIndicatorListener {
        public void onDesktopIndicatorClicked(DesktopIndicator source) {
            setVisible(true);
            source.hideIndicator();
            if (MainFrame.this.getState() != JFrame.NORMAL) {
                MainFrame.this.setState(Frame.NORMAL);
            }
            MainFrame.this.requestFocus();
        }
    }
}