/*
* Adito
*
* Copyright (C) 2003-2006 3SP LTD. All Rights Reserved
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package com.adito.agent.client.gui.awt;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import com.maverick.http.HttpAuthenticator;
import com.sshtools.ui.awt.Toaster;
import com.sshtools.ui.awt.UIUtil;
import com.sshtools.ui.awt.options.Option;
import com.sshtools.ui.awt.options.OptionDialog;
import com.adito.agent.client.ActionCallback;
import com.adito.agent.client.Agent;
import com.adito.agent.client.AgentClientGUI;
import com.adito.agent.client.Console;
import com.adito.agent.client.PortMonitor;
import com.adito.agent.client.TaskProgress;
import com.adito.agent.client.tunneling.AbstractPortItem;
import com.adito.agent.client.util.BrowserLauncher;
/**
* Abstract implementation of a {@link AgentClientGUI} that provides a
* <i>Toaster</i> style popup component.
*/
public abstract class AbstractAWTGUI implements AgentClientGUI {
// #ifdef DEBUG
static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(AbstractAWTGUI.class);
// #endif
// Private instance variables
private Toaster popup;
private Image popupImage;
private PortMonitor portMonitor;
private Console console;
private Agent agent;
/**
* Constructor.
*/
public AbstractAWTGUI() {
OptionDialog.INFORMATION_ICON = "/images/dialog-information.gif"; //$NON-NLS-1$
OptionDialog.WARNING_ICON = "/images/dialog-warning.gif"; //$NON-NLS-1$
OptionDialog.QUESTION_ICON = "/images/dialog-question.gif"; //$NON-NLS-1$
OptionDialog.ERROR_ICON = "/images/dialog-error.gif"; //$NON-NLS-1$
popup = new Toaster(Toaster.BOTTOM_RIGHT, new Dimension(300, 100));
popup.setTextAlign(Component.LEFT_ALIGNMENT);
Font norm = new Font("Arial", Font.PLAIN, 10); //$NON-NLS-1$
Font title = new Font("Arial Bold", Font.BOLD, 11); //$NON-NLS-1$
popup.setTextFont(norm);
popup.setTitleFont(title);
popupImage = UIUtil.loadImage(AbstractAWTGUI.class, "/images/agent.gif");
}
/* (non-Javadoc)
* @see com.adito.agent.client.AgentClientGUI#init(com.adito.agent.client.Agent)
*/
public void init(Agent agent) {
this.agent = agent;
}
/**
* Get the Agent instance this GUI is being used for
*
* @return agent
*/
public Agent getAgent() {
return agent;
}
/*
* (non-Javadoc)
*
* @see com.adito.agent.client.AgentClientGUI#confirm(int, java.lang.String,
* java.lang.String, java.lang.String, java.lang.String)
*/
public boolean confirm(int dialogType, String okText, String cancelText, String title, String message) {
Option ok = new Option(okText);
Option cancel = cancelText == null ? null : new Option(cancelText);
if (OptionDialog.prompt(getGUIComponent(), dialogType, title, message, cancel == null ? new Option[] { ok }
: new Option[] { ok, cancel }) != ok) { //$NON-NLS-1$$ //$NON-NLS-2$$
return false;
}
return true;
}
/*
* (non-Javadoc)
*
* @see com.adito.agent.client.AgentClientGUI#error(java.lang.String,
* java.lang.String, java.lang.String, java.lang.String,
* java.lang.Throwable)
*/
public boolean error(String okText, String cancelText, String title, String message, Throwable ex) {
Option ok = new Option(okText);
Option cancel = cancelText == null ? null : new Option(cancelText);
if (OptionDialog.error(getGUIComponent(), title, message, ex, cancel == null ? new Option[] { ok }
: new Option[] { ok, cancel }) != ok) { //$NON-NLS-1$$ //$NON-NLS-2$$
return false;
}
return true;
}
/*
* (non-Javadoc)
*
* @see com.adito.vpn.client.VPNClientGUI#getGUIComponent()
*/
public abstract Component getGUIComponent();
/*
* (non-Javadoc)
*
* @see com.adito.vpn.client.VPNClientGUI#popup(java.awt.event.ActionListener,
* java.lang.String, java.lang.String, java.awt.Image, int)
*/
public void popup(final ActionCallback callback, String message, String title, String imageName, int timeout) {
Image image = imageName == null ? null : UIUtil.loadImage(AbstractAWTGUI.class, "/images/" + imageName + ".gif");
ActionListener l = callback == null ? null : new ActionListener() {
public void actionPerformed(ActionEvent evt) {
callback.actionPerformed();
}
};
popup.popup(l, message, title, image == null ? popupImage : image, timeout);
}
/*
* (non-Javadoc)
*
* @see com.adito.agent.client.AgentClientGUI#createTaskProgress(java.lang.String,
* java.lang.String, int, int)
*/
public TaskProgress createTaskProgress(String message, String title, long maxValue, boolean allowCancel) {
TaskProgress progress = new TaskProgressBar(getGUIComponent(), message, title, maxValue, allowCancel);
return progress;
}
/*
* (non-Javadoc)
*
* @see com.adito.agent.client.AgentClientGUI#getPortMonitor()
*/
public PortMonitor getPortMonitor() {
if (portMonitor == null) {
portMonitor = new AWTPortMonitor(agent);
}
return portMonitor;
}
/*
* (non-Javadoc)
*
* @see com.adito.agent.client.AgentClientGUI#getConsole()
*/
public synchronized Console getConsole() {
if (console == null) {
console = new AWTConsoleOutputStream("true".equals(System.getProperty("console.toSysOut", "false")) ? System.out : null); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
return console;
}
/* (non-Javadoc)
* @see com.adito.agent.client.AgentClientGUI#promptForCredentials(com.maverick.http.HttpAuthenticator)
*/
public boolean promptForCredentials(boolean proxy, HttpAuthenticator authenticator) {
return AWTAuthenticationDialog.promptForCredentials(proxy, authenticator);
}
/* (non-Javadoc)
* @see com.adito.agent.client.AgentClientGUI#openBrowser(java.lang.String)
*/
public void openBrowser(String path) {
try {
String browserPath = "https://" + agent.getAditoHost() + ":" + agent.getAditoPort() + //$NON-NLS-1$ //$NON-NLS-2$
( path == null ? "" : ( "/" + path ));
// #ifdef DEBUG
log.info("Opening browser to " + browserPath);
// #endif
BrowserLauncher.openURL(browserPath);
} catch (IOException ioe) {
// #ifdef DEBUG
log.error(ioe);
// #endif
}
}
public void dispose() {
getPortMonitor().dispose();
getConsole().dispose();
}
/**
* Adapts the AWT progress monitor to {@link TaskProgress}
*/
class TaskProgressBar extends ProgressBar implements TaskProgress {
public TaskProgressBar(Component parentComponent, String message, String title, long maxValue, boolean allowCancel) {
super(parentComponent, message, title, maxValue, allowCancel);
}
}
class AWTPortMonitor implements PortMonitor {
AWTPortMonitorWindow portMonitorWindow;
AWTPortMonitor(Agent agent) {
portMonitorWindow = new AWTPortMonitorWindow(agent);
portMonitorWindow.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
portMonitorWindow.setVisible(false);
}
});
}
public void addPortItem(AbstractPortItem portItem) {
portMonitorWindow.getModel().addPortItem(portItem);
}
public int getIndexForId(int id) {
return portMonitorWindow.getModel().getIndexForId(id);
}
public AbstractPortItem getItemAt(int idx) {
return portMonitorWindow.getModel().getItemAt(idx);
}
public boolean isVisible() {
return portMonitorWindow.isVisible();
}
public void removeItemAt(int idx) {
portMonitorWindow.getModel().removeItemAt(idx);
}
public void setVisible(boolean visible) {
boolean wasVisible = isVisible();
portMonitorWindow.setVisible(visible);
if (visible && !wasVisible) {
portMonitorWindow.toFront();
}
}
public void updateItemAt(int idx) {
portMonitorWindow.getModel().updateItemAt(idx);
}
public void dispose() {
portMonitorWindow.dispose();
}
}
}