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

Java tutorial

Introduction

Here is the source code for com.sshtools.common.ui.SshToolsApplicationApplet.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.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.StringTokenizer;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JSeparator;

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

/**
 *
 *
 * @author $author$
 * @version $Revision: 1.5 $
 */
public abstract class SshToolsApplicationApplet extends JApplet {
    //     eurgghh!

    /**  */
    public final static String[][] PARAMETER_INFO = {
            { "sshapps.log.file", "string", "Logging output destination. Defaults to @console@" },

            { "sshapps.log.level", "string",
                    "Logging level. DEBUG,FATAL,ERROR,WARN,INFO,DEBUG or OFF. Defaults to OFF" },

            { "sshapps.ui.informationPanel.background", "hex color",
                    "Set the background color of the 'information panel'" },

            { "sshapps.ui.informationPanel.foreground", "boolean",
                    "Set the foreground color of the 'information panel'" },

            { "sshapps.ui.informationPanel.borderColor", "boolean",
                    "Set the border color of the 'information panel'" },

            { "sshapps.ui.informationPanel.borderThickness", "integer",
                    "Set the border thickness of the 'information panel'" },

            { "sshapps.ui.toolBar", "boolean", "Enable / Disable the tool bar" },

            { "sshapps.ui.menuBar", "boolean", "Enable / Disable the menu bar" },

            { "sshapps.ui.disabledActions", "string", "Comma (,) separated list of disable actions" },

            { "sshapps.ui.statusBar", "boolean", "Enable / Disable the menu bar" } };

    /**  */
    protected Log log = LogFactory.getLog(SshToolsApplicationApplet.class);

    //  Private instance variables

    /**  */
    protected LoadingPanel loadingPanel;

    /**  */
    protected JSeparator toolSeparator;

    /**  */
    protected SshToolsApplicationPanel applicationPanel;

    /**  */
    protected Color infoForeground;

    /**  */
    protected int infoBorderThickness;

    /**  */
    protected boolean toolBar;

    /**  */
    protected boolean menuBar;

    /**  */
    protected boolean statusBar;

    /**  */
    protected Color infoBackground;

    /**  */
    protected Color infoBorderColor;

    /**  */
    protected String disabledActions;

    /**
     *
     *
     * @param key
     * @param def
     *
     * @return
     */
    public String getParameter(String key, String def) {
        String v = getParameter(key);

        return (v != null) ? v : def;
    }

    /**
     *
     */
    public void init() {
        try {
            Runnable r = new Runnable() {
                public void run() {
                    try {
                        getContentPane().setLayout(new BorderLayout());
                        setAppletComponent(loadingPanel = new LoadingPanel());
                        initApplet();

                        JComponent p = buildAppletComponent();
                        startApplet();
                        setAppletComponent(p);
                    } catch (Throwable t) {
                        seriousAppletError(t);
                    }
                }
            };

            Thread t = new Thread(r);
            t.start();
        } catch (Throwable t) {
            seriousAppletError(t);
        }
    }

    /**
     *
     *
     * @throws IOException
     */
    public void initApplet() throws IOException {
        /*ConfigurationLoader.setLogfile(getParameter("sshapps.log.file",
        "@console@"));
         log.getRootLogger().setLevel(org.apache.log4j.Level.toLevel(
        getParameter("sshapps.log.level", "DEBUG")));*/
        ConfigurationLoader.initialize(false);
        infoBackground = PropertyUtil.stringToColor(getParameter("sshapps.ui.informationPanel.background",
                PropertyUtil.colorToString(new Color(255, 255, 204))));
        infoForeground = PropertyUtil.stringToColor(
                getParameter("sshapps.ui.informationPanel.foreground", PropertyUtil.colorToString(Color.black)));
        infoBorderColor = PropertyUtil.stringToColor(
                getParameter("sshapps.ui.informationPanel.borderColor", PropertyUtil.colorToString(Color.black)));
        infoBorderThickness = PropertyUtil
                .stringToInt(getParameter("sshapps.ui.informationPanel.borderThickness", "1"), 1);
        toolBar = getParameter("sshapps.ui.toolBar", "true").equalsIgnoreCase("true");
        menuBar = getParameter("sshapps.ui.menuBar", "true").equalsIgnoreCase("true");
        statusBar = getParameter("sshapps.ui.statusBar", "true").equalsIgnoreCase("true");
        disabledActions = getParameter("sshapps.ui.disabledActions", "");
    }

    /**
     *
     */
    public void startApplet() {
    }

    /**
     *
     *
     * @return
     *
     * @throws IOException
     * @throws SshToolsApplicationException
     */
    public JComponent buildAppletComponent() throws IOException, SshToolsApplicationException {
        loadingPanel.setStatus("Creating application");
        applicationPanel = createApplicationPanel();
        loadingPanel.setStatus("Building action components");
        applicationPanel.rebuildActionComponents();
        log.debug("Disabled actions list = " + disabledActions);

        StringTokenizer tk = new StringTokenizer((disabledActions == null) ? "" : disabledActions, ",");

        while (tk.hasMoreTokens()) {
            String n = tk.nextToken();
            log.debug("Disable " + n);
            applicationPanel.setActionVisible(n, false);
        }

        JPanel p = new JPanel(new BorderLayout());
        JPanel n = new JPanel(new BorderLayout());

        if (applicationPanel.getJMenuBar() != null) {
            n.add(applicationPanel.getJMenuBar(), BorderLayout.NORTH);
            log.debug("Setting menu bar visibility to " + menuBar);
            applicationPanel.setMenuBarVisible(menuBar);
        }

        if (applicationPanel.getToolBar() != null) {
            JPanel t = new JPanel(new BorderLayout());
            t.add(applicationPanel.getToolBar(), BorderLayout.NORTH);
            applicationPanel.setToolBarVisible(toolBar);
            t.add(toolSeparator = new JSeparator(JSeparator.HORIZONTAL), BorderLayout.SOUTH);
            toolSeparator.setVisible(applicationPanel.getToolBar().isVisible());

            final SshToolsApplicationPanel pnl = applicationPanel;
            applicationPanel.getToolBar().addComponentListener(new ComponentAdapter() {
                public void componentHidden(ComponentEvent evt) {
                    toolSeparator.setVisible(pnl.getToolBar().isVisible());
                }
            });
            n.add(t, BorderLayout.SOUTH);
        }

        p.add(n, BorderLayout.NORTH);
        p.add(applicationPanel, BorderLayout.CENTER);

        if (applicationPanel.getStatusBar() != null) {
            p.add(applicationPanel.getStatusBar(), BorderLayout.SOUTH);
            applicationPanel.setStatusBarVisible(statusBar);
        }

        return p;
    }

    /**
     *
     *
     * @param name
     */
    public void doAction(String name) {
        StandardAction a = applicationPanel.getAction(name);

        if (a != null) {
            if (a.isEnabled()) {
                log.debug("Performing action " + a.getName());
                a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, a.getActionCommand()));
            } else {
                log.warn("No performing action '" + a.getName() + "' because it is disabled.");
            }
        } else {
            log.error("No action named " + name);
        }
    }

    /**
     *
     *
     * @return
     *
     * @throws SshToolsApplicationException
     */
    public abstract SshToolsApplicationPanel createApplicationPanel() throws SshToolsApplicationException;

    /**
     *
     *
     * @param component
     */
    protected void setAppletComponent(JComponent component) {
        if (getContentPane().getComponentCount() > 0) {
            getContentPane().invalidate();
            getContentPane().removeAll();
        }

        getContentPane().add(component, BorderLayout.CENTER);
        getContentPane().validate();
        getContentPane().repaint();
    }

    /**
     *
     *
     * @param t
     */
    protected void seriousAppletError(Throwable t) {
        StringBuffer buf = new StringBuffer();
        buf.append("<html><p>A serious error has occured ...</p><br>");
        buf.append("<p><font size=\"-1\" color=\"#ff0000\"><b>");

        StringWriter writer = new StringWriter();
        t.printStackTrace(new PrintWriter(writer, true));

        StringTokenizer tk = new StringTokenizer(writer.toString(), "\n");

        while (tk.hasMoreTokens()) {
            String msg = tk.nextToken();
            buf.append(msg);

            if (tk.hasMoreTokens()) {
                buf.append("<br>");
            }
        }

        buf.append("</b></font></p><html>");

        SshToolsApplicationAppletPanel p = new SshToolsApplicationAppletPanel();
        p.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.insets = new Insets(0, 0, 8, 0);
        gbc.fill = GridBagConstraints.NONE;
        UIUtil.jGridBagAdd(p, new JLabel(buf.toString()), gbc, GridBagConstraints.REMAINDER);
        setAppletComponent(p);
    }

    /**
     *
     */
    public void start() {
    }

    /**
     *
     */
    public void stop() {
    }

    /**
     *
     */
    public void destroy() {
    }

    /**
     *
     *
     * @return
     */
    public String[][] getParameterInfo() {
        return PARAMETER_INFO;
    }

    public class SshToolsApplicationAppletContainer extends JPanel implements SshToolsApplicationContainer {
        //  Private instance variables
        private SshToolsApplicationPanel panel;
        private SshToolsApplication application;

        //Construct the applet
        public SshToolsApplicationAppletContainer() {
        }

        public void init(SshToolsApplication application, SshToolsApplicationPanel panel)
                throws SshToolsApplicationException {
            this.application = application;
            this.panel = panel;
            panel.registerActionMenu(new SshToolsApplicationPanel.ActionMenu("Help", "Help", 'h', 99));
            panel.registerAction(new AboutAction(this, application));
            panel.registerAction(new ChangelogAction(this, application));
            panel.registerAction(new FAQAction());
            panel.registerAction(new AdvancedAction());
            panel.registerAction(new BeginnerAction());
            getApplicationPanel().rebuildActionComponents();
        }

        public void setContainerTitle(String title) {
            getAppletContext().showStatus(title);
        }

        public SshToolsApplicationPanel getApplicationPanel() {
            return panel;
        }

        public void closeContainer() {
            //  We dont do anything here
        }

        public void setContainerVisible(boolean visible) {
            setVisible(visible);
        }

        public boolean isContainerVisible() {
            return isVisible();
        }

        public java.awt.Component getWindow() {
            return SshToolsApplicationApplet.this;
        }
    }

    class SshToolsApplicationAppletPanel extends JPanel {
        SshToolsApplicationAppletPanel() {
            super();
            setOpaque(true);
            setBackground(infoBackground);
            setForeground(infoForeground);
            setBorder(BorderFactory.createLineBorder(infoBorderColor, infoBorderThickness));
        }
    }

    class LoadingPanel extends SshToolsApplicationAppletPanel {
        private JProgressBar bar;

        LoadingPanel() {
            super();
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.insets = new Insets(0, 0, 8, 0);
            gbc.fill = GridBagConstraints.NONE;
            UIUtil.jGridBagAdd(this, new JLabel("Loading " + getAppletInfo()), gbc, GridBagConstraints.REMAINDER);
            bar = new JProgressBar(0, 100);

            //bar.setIndeterminate(true);
            bar.setStringPainted(true);
            UIUtil.jGridBagAdd(this, bar, gbc, GridBagConstraints.REMAINDER);
        }

        public void setStatus(String status) {
            bar.setString(status);
        }
    }
}