com.sshtools.common.ui.SshToolsApplicationPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.sshtools.common.ui.SshToolsApplicationPanel.java

Source

//Changes (c) STFC/CCLRC 2007
/*
 *  SSHTools - Java SSH2 API
 *
 *  Copyright (C) 2002 Lee David Painter.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public License
 *  as published by the Free Software Foundation; either version 2 of
 *  the License, or (at your option) any later version.
 *
 *  You may also distribute it and/or modify it under the terms of the
 *  Apache style J2SSH Software License. A copy of which should have
 *  been provided with the distribution.
 *
 *  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
 *  License document supplied with your distribution for more details.
 *
 */

package com.sshtools.common.ui;

import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

import java.awt.Component;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JToolBar;
import javax.swing.filechooser.FileFilter;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.sshtools.j2ssh.configuration.ConfigurationLoader;

/**
 *
 *
 * @author $author$
 * @version $Revision: 1.6 $
 */

public abstract class SshToolsApplicationPanel

        extends JPanel {

    //

    /**  */

    protected Log log = LogFactory.getLog(SshToolsApplicationPanel.class);

    /**  */

    protected SshToolsApplication application;

    /**  */

    protected JMenuBar menuBar;

    /**  */

    protected JToolBar toolBar;

    /**  */

    protected JPopupMenu contextMenu;

    /**  */

    protected SshToolsApplicationContainer container;

    /**  */

    protected Vector actions = new Vector();

    /**  */

    protected HashMap actionsVisible = new HashMap();

    /**  */

    protected boolean toolsVisible;

    /**  */

    protected Vector actionMenus = new Vector();

    /**
     * Creates a new SshToolsApplicationPanel object.
     */

    public SshToolsApplicationPanel() {

        super();

    }

    /**
     * Creates a new SshToolsApplicationPanel object.
     *
     * @param mgr
     */

    public SshToolsApplicationPanel(LayoutManager mgr) {

        super(mgr);

    }

    /**
     * Called by the application framework to test the closing state
     *
     * @return
     */

    public abstract boolean canClose();

    /**
     * Called by the application framework to close the panel
     */

    public abstract void close();

    /**
     * Called by the application framework when a change in connection state
     * has occured. The available actions should be enabled/disabled in this
     * methods implementation
     */

    public abstract void setAvailableActions();

    /**
     * Set an actions visible state
     *
     * @param name
     * @param visible
     */

    public void setActionVisible(String name, boolean visible) {

        log.debug("Setting action '" + name + "' to visibility " + visible);

        actionsVisible.put(name, new Boolean(visible));

    }

    /**
     * Gets the container for this panel.
     *
     * @return
     */

    public SshToolsApplicationContainer getContainer() {

        return container;

    }

    /**
     * Sets the container for this panel
     *
     * @param container
     */

    public void setContainer(SshToolsApplicationContainer container) {

        this.container = container;

    }

    /**
     * Register a new menu
     *
     * @param actionMenu
     */

    public void registerActionMenu(ActionMenu actionMenu) {

        ActionMenu current = getActionMenu(actionMenu.name);

        if (current == null) {

            actionMenus.addElement(actionMenu);

        }

    }

    /**
     * Gets a menu by name
     *
     * @param actionMenuName
     *
     * @return
     */

    public ActionMenu getActionMenu(String actionMenuName) {

        return getActionMenu(actionMenus.iterator(), actionMenuName);

    }

    private ActionMenu getActionMenu(Iterator actions, String actionMenuName) {

        while (actions.hasNext()) {

            ActionMenu a = (ActionMenu) actions.next();

            if (a.name.equals(actionMenuName)) {

                return a;

            }

        }

        return null;

    }

    /**
     * Get an action by name
     *
     * @param name
     *
     * @return
     */

    public StandardAction getAction(String name) {

        for (Iterator i = actions.iterator(); i.hasNext();) {

            StandardAction a = (StandardAction) i.next();

            if (a.getName().equals(name)) {

                return a;

            }

        }

        return null;

    }

    /**
     * Deregister an action
     *
     * @param action
     */

    public void deregisterAction(StandardAction action) {

        actions.removeElement(action);

    }

    /**
     * Register a new action
     *
     * @param action
     */

    public void registerAction(StandardAction action) {

        actions.addElement(action);

    }

    /**
     * Initialize the panel
     *
     * @param application
     *
     * @throws SshToolsApplicationException
     */

    public void init(SshToolsApplication application) throws

    SshToolsApplicationException {

        this.application = application;

        menuBar = new JMenuBar();

        // Creat the tool bar

        toolBar = new JToolBar();

        toolBar.setFloatable(false);

        toolBar.setBorderPainted(false);

        toolBar.putClientProperty("JToolBar.isRollover", Boolean.TRUE);

        // Create the context menu

        contextMenu = new JPopupMenu();

        registerActionMenu(new ActionMenu("Tools", "Tools", 't', 30));

        if (PreferencesStore.isStoreAvailable()) {

            log.debug("Preferences store is available, adding options action");

            registerAction(new OptionsAction() {

                public void actionPerformed(ActionEvent evt) {

                    showOptions();

                }

            });

        }

    }

    /**
     * Show the options dialog
     */

    public void showOptions() {

        OptionsTab[] tabs = getApplication().getAdditionalOptionsTabs();
        OptionsTab[] t = new OptionsTab[tabs.length + 1];
        System.arraycopy(tabs, 0, t, 0, tabs.length);
        t[tabs.length] = new GlobalOptionsTab();
        OptionsPanel.showOptionsDialog(this, tabs);

    }

    /**
     * Rebuild all the action components such as toobar, context menu
     */

    public void rebuildActionComponents() {
        //  Clear the current state of the component
        log.debug("Rebuild action components");
        toolBar.removeAll();
        //
        Vector enabledActions = new Vector();
        for (Iterator i = actions.iterator(); i.hasNext();) {
            StandardAction a = (StandardAction) i.next();
            String n = (String) a.getValue(Action.NAME);
            Boolean s = (Boolean) actionsVisible.get(n);
            if (s == null) {
                s = Boolean.TRUE;
            }
            if (Boolean.TRUE.equals(s)) {
                log.debug("Action " + n + " is enabled.");
                enabledActions.add(a);
            } else {
                log.debug("Action " + n + " not enabled.");
            }
        }
        //  Build the tool bar, grouping the actions
        Vector v = new Vector();
        for (Iterator i = enabledActions.iterator(); i.hasNext();) {
            StandardAction a = (StandardAction) i.next();
            if (Boolean.TRUE.equals((Boolean) a.getValue(StandardAction.ON_TOOLBAR))) {
                v.addElement(a);
            }
        }

        Collections.sort(v, new ToolBarActionComparator());
        Integer grp = null;
        for (Iterator i = v.iterator(); i.hasNext();) {
            StandardAction z = (StandardAction) i.next();
            if ((grp != null) && !grp.equals((Integer) z.getValue(StandardAction.TOOLBAR_GROUP))) {
                toolBar.add(new ToolBarSeparator());
            }
            if (Boolean.TRUE.equals((Boolean) z.getValue(StandardAction.IS_TOGGLE_BUTTON))) {
                ToolToggleButton tBtn = new ToolToggleButton(z);
                toolBar.add(tBtn);
            } else {
                ToolButton btn = new ToolButton(z);
                toolBar.add(btn);
            }
            grp = (Integer) z.getValue(StandardAction.TOOLBAR_GROUP);
        }
        toolBar.revalidate();
        toolBar.repaint();
        //  Build the context menu, grouping the actions
        Vector c = new Vector();
        contextMenu.removeAll();
        for (Iterator i = enabledActions.iterator(); i.hasNext();) {
            StandardAction a = (StandardAction) i.next();
            if (Boolean.TRUE.equals((Boolean) a.getValue(StandardAction.ON_CONTEXT_MENU))) {
                c.addElement(a);
            }
        }
        Collections.sort(c, new ContextActionComparator());
        grp = null;
        for (Iterator i = c.iterator(); i.hasNext();) {
            StandardAction z = (StandardAction) i.next();
            if ((grp != null) && !grp.equals((Integer) z.getValue(StandardAction.CONTEXT_MENU_GROUP))) {
                contextMenu.addSeparator();
            }
            contextMenu.add(z);
            grp = (Integer) z.getValue(StandardAction.CONTEXT_MENU_GROUP);
        }
        contextMenu.revalidate();
        //  Build the menu bar
        menuBar.removeAll();
        v.removeAllElements();
        for (Enumeration e = enabledActions.elements(); e.hasMoreElements();) {
            StandardAction a = (StandardAction) e.nextElement();

            if (Boolean.TRUE.equals((Boolean) a.getValue(StandardAction.ON_MENUBAR))) {
                v.addElement(a);
            }
        }
        Vector menus = (Vector) actionMenus.clone();
        Collections.sort(menus);
        HashMap map = new HashMap();
        for (Iterator i = v.iterator(); i.hasNext();) {
            StandardAction z = (StandardAction) i.next();
            String menuName = (String) z.getValue(StandardAction.MENU_NAME);
            if (menuName == null) {
                log.error("Action " + z.getName() + " doesnt specify a value for " + StandardAction.MENU_NAME);
            } else {
                String m = (String) z.getValue(StandardAction.MENU_NAME);
                ActionMenu menu = getActionMenu(menus.iterator(), m);
                if (menu == null) {
                    log.error("Action menu " + z.getName() + " does not exist");
                } else {
                    Vector x = (Vector) map.get(menu.name);
                    if (x == null) {
                        x = new Vector();
                        map.put(menu.name, x);
                    }
                    x.addElement(z);
                }
            }
        }

        for (Iterator i = menus.iterator(); i.hasNext();) {
            ActionMenu m = (ActionMenu) i.next();
            Vector x = (Vector) map.get(m.name);
            if (x != null) {
                Collections.sort(x, new MenuItemActionComparator());
                JMenu menu = new JMenu(m.displayName);
                menu.setMnemonic(m.mnemonic);
                grp = null;
                for (Iterator j = x.iterator(); j.hasNext();) {
                    StandardAction a = (StandardAction) j.next();
                    Integer g = (Integer) a.getValue(StandardAction.MENU_ITEM_GROUP);
                    if ((grp != null) && !g.equals(grp)) {
                        menu.addSeparator();
                    }
                    grp = g;
                    if (a instanceof MenuAction) {
                        JMenu mnu = (JMenu) a.getValue(MenuAction.MENU);
                        menu.add(mnu);
                    } else {
                        JMenuItem item = new JMenuItem(a);
                        menu.add(item);
                    }
                }
                menuBar.add(menu);
            } else {
                log.error("Can't find menu " + m.name);
            }
        }
        menuBar.validate();
        menuBar.repaint();
    }

    /**
    * Determine if the toolbar, menu and statusbar are visible
    *
     * @return
     */

    public boolean isToolsVisible() {

        return toolsVisible;

    }

    // Adds the new favorite to the appropriate favorite menu
    public void addFavorite(StandardAction action) {
        for (int i = 0; i < menuBar.getMenuCount(); i++) {
            JMenu menu = menuBar.getMenu(i);
            if (menu.getText() != null && menu.getText().equals("Favorites")) {
                menu.add(action);
            }
        }
    }

    /**
     * Set the visible state of the menu bar
     *
     * @param visible
     */

    public void setMenuBarVisible(boolean visible) {

        if ((getJMenuBar() != null) && (getJMenuBar().isVisible() != visible)) {

            getJMenuBar().setVisible(visible);

            revalidate();

        }

    }

    /**
     * Set the visible state of the toolbar
     *
     * @param visible
     */

    public void setToolBarVisible(boolean visible) {

        if ((getToolBar() != null) && (getToolBar().isVisible() != visible)) {

            getToolBar().setVisible(visible);

            revalidate();

        }

    }

    /**
     * Set the visible state of the statusbar
     *
     * @param visible
     */

    public void setStatusBarVisible(boolean visible) {

        if ((getStatusBar() != null) && (getStatusBar().isVisible() != visible)) {

            getStatusBar().setVisible(visible);

            revalidate();

        }

    }

    /**
     * Set the visible state of all tools. This will set the toolbar, menu and
     * status bar visible states to the value provided.
     *
     * @param visible
     */

    public void setToolsVisible(boolean visible) {

        synchronized (getTreeLock()) {

            if ((getToolBar() != null) && (getToolBar().isVisible() != visible)) {

                getToolBar().setVisible(visible);

            }

            if ((getJMenuBar() != null)

                    && (getJMenuBar().isVisible() != visible)) {

                getJMenuBar().setVisible(visible);

            }

            if ((getStatusBar() != null)

                    && (getStatusBar().isVisible() != visible)) {

                getStatusBar().setVisible(visible);

            }

            toolsVisible = visible;

            revalidate();

        }

    }

    /**
     * Show an exception message
     *
     * @param title
     * @param message
     */

    public void showExceptionMessage(String title, String message) {

        JOptionPane.showMessageDialog(this, message, title,

                JOptionPane.ERROR_MESSAGE);

    }

    /**
     * Show an error message with detail
     *
     * @param parent
     * @param title
     * @param exception
     */

    public static void showErrorMessage(Component parent, String title,

            Throwable exception) {

        showErrorMessage(parent, null, title, exception);

    }

    /**
     * Show an error message with toggable detail
     *
     * @param parent
     * @param mesg
     * @param title
     * @param exception
     */

    public static void showErrorMessage(Component parent, String mesg,

            String title, Throwable exception) {

        boolean details = false;

        while (true) {

            String[] opts = new String[] {

                    details ? "Hide Details" : "Details", "Ok"

            };

            StringBuffer buf = new StringBuffer();

            if (mesg != null) {

                buf.append(mesg);

            }

            appendException(exception, 0, buf, details);

            //MultilineLabel message = new MultilineLabel(buf.toString());

            javax.swing.JTextArea message = new javax.swing.JTextArea(buf.toString());
            message.setEditable(false);
            message.setBorder(javax.swing.BorderFactory.createEmptyBorder(4, 4, 4, 4));
            javax.swing.JLabel jl = new javax.swing.JLabel();
            message.setFont(jl.getFont());
            message.setBackground(jl.getBackground());

            int opt = JOptionPane.showOptionDialog(parent, message, title,

                    JOptionPane.OK_CANCEL_OPTION,

                    JOptionPane.ERROR_MESSAGE,

                    null, opts, opts[1]);

            if (opt == 0) {

                details = !details;

            }

            else {

                break;

            }

        }

    }

    private static void appendException(Throwable exception, int level,

            StringBuffer buf, boolean details) {

        try {

            if (((exception != null) && (exception.getMessage() != null))

                    && (exception.getMessage().length() > 0)) {

                if (details && (level > 0)) {

                    buf.append("\n \nCaused by ...\n");

                } else {
                    buf.append(": ");
                }
                buf.append(exception.getMessage());

            }

            if (details) {

                if (exception != null) {

                    if ((exception.getMessage() != null)

                            && (exception.getMessage().length() == 0)) {

                        buf.append("\n \nCaused by ...");

                    }

                    else {

                        buf.append("\n \n");

                    }

                }

                StringWriter sw = new StringWriter();

                if (exception != null) {

                    exception.printStackTrace(new PrintWriter(sw));

                }

                buf.append(sw.toString());

            }

            try {

                java.lang.reflect.Method method = exception.getClass()

                        .getMethod("getCause",

                                new Class[] {});

                Throwable cause = (Throwable) method.invoke(exception, (Object) null);

                if (cause != null) {

                    appendException(cause, level + 1, buf, details);

                }

            }

            catch (Exception e) {

            }

        }

        catch (Throwable ex) {

        }

    }

    /**
     * Returns the connected state of the panel
     *
     * @return
     */

    public abstract boolean isConnected();

    /**
     * Set the title of the container
     *
     * @param file
     */

    public void setContainerTitle(String host) {

        String verString = "";

        if (application != null) {

            verString = ConfigurationLoader.getVersionString(application

                    .getApplicationName(), application.getApplicationVersion());

        }

        if (container != null) {

            container.setContainerTitle((host == null) ? verString

                    : (verString + " ["

                            + host + "]"));

        }
    }

    /**
     * Gets the toolbar
     *
     * @return
     */

    public JToolBar getToolBar() {

        return toolBar;

    }

    /**
     * Get the context menu
     *
     * @return
     */

    public JPopupMenu getContextMenu() {

        return contextMenu;

    }

    /**
     * Get the main menu
     *
     * @return
     */

    public JMenuBar getJMenuBar() {

        return menuBar;

    }

    /**
     * Get the status bar
     *
     * @return
     */

    public StatusBar getStatusBar() {

        return null;

    }

    /**
     * Get the application attached to the panel
     *
     * @return
     */

    public SshToolsApplication getApplication() {

        return application;

    }

    /**
     * Get the icon for the panel
     *
     * @return
     */

    public abstract ResourceIcon getIcon();

    public static class ActionMenu

            implements Comparable {

        int weight;

        int mnemonic;

        String name;

        String displayName;

        public ActionMenu(String name, String displayName, int mnemonic,

                int weight) {

            this.name = name;

            this.displayName = displayName;

            this.mnemonic = mnemonic;

            this.weight = weight;

        }

        public int compareTo(Object o) {

            int i = new Integer(weight).compareTo(new Integer(

                    ((ActionMenu) o).weight));

            return (i == 0)

                    ? displayName.compareTo(((ActionMenu) o).displayName)
                    : i;

        }

    }

    class ToolBarActionComparator

            implements Comparator {

        public int compare(Object o1, Object o2) {

            int i = ((Integer) ((StandardAction) o1).getValue(StandardAction.

                    TOOLBAR_GROUP))

                            .compareTo((Integer) ((StandardAction) o2).getValue(

                                    StandardAction.TOOLBAR_GROUP));

            return (i == 0)

                    ?

                    ((Integer) ((StandardAction) o1).getValue(StandardAction.

                            TOOLBAR_WEIGHT))

                                    .compareTo((Integer) ((StandardAction) o2).getValue(

                                            StandardAction.TOOLBAR_WEIGHT))
                    : i;

        }

    }

    class ContextActionComparator

            implements Comparator {

        public int compare(Object o1, Object o2) {

            int i = ((Integer) ((StandardAction) o1).getValue(StandardAction.

                    CONTEXT_MENU_GROUP))

                            .compareTo((Integer) ((StandardAction) o2).getValue(

                                    StandardAction.CONTEXT_MENU_GROUP));

            return (i == 0)

                    ?

                    ((Integer) ((StandardAction) o1).getValue(StandardAction.

                            CONTEXT_MENU_WEIGHT))

                                    .compareTo((Integer) ((StandardAction) o2).getValue(

                                            StandardAction.CONTEXT_MENU_WEIGHT))
                    : i;

        }

    }

    class MenuItemActionComparator

            implements Comparator {

        public int compare(Object o1, Object o2) {

            int i = ((Integer) ((StandardAction) o1).getValue(StandardAction.

                    MENU_ITEM_GROUP))

                            .compareTo((Integer) ((StandardAction) o2).getValue(

                                    StandardAction.MENU_ITEM_GROUP));

            return (i == 0)

                    ?

                    ((Integer) ((StandardAction) o1).getValue(StandardAction.

                            MENU_ITEM_WEIGHT))

                                    .compareTo((Integer) ((StandardAction) o2).getValue(

                                            StandardAction.MENU_ITEM_WEIGHT))
                    : i;

        }

    }

    class ConnectionFileFilter

            extends javax.swing.filechooser.FileFilter {

        public boolean accept(File f) {

            return f.isDirectory()

                    || f.getName().toLowerCase().endsWith(".xml");

        }

        public String getDescription() {

            return "Connection files (*.xml)";

        }

    }

}