//$HeadURL$
/*----------------------------------------------------------------------------
This file is part of deegree, http://deegree.org/
Copyright (C) 2001-2009 by:
- Department of Geography, University of Bonn -
and
- lat/lon GmbH -
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free
Software Foundation; either version 2.1 of the License, or (at your option)
any later version.
This library 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 Lesser General Public License for more
details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information:
lat/lon GmbH
Aennchenstr. 19, 53177 Bonn
Germany
http://lat-lon.de/
Department of Geography, University of Bonn
Prof. Dr. Klaus Greve
Postfach 1147, 53001 Bonn
Germany
http://www.geographie.uni-bonn.de/deegree/
e-mail: info@deegree.org
----------------------------------------------------------------------------*/
package org.deegree.igeo.desktop;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.prefs.Preferences;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDesktopPane;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.ScrollPaneConstants;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.framework.util.ImageUtils;
import org.deegree.igeo.ApplicationContainer;
import org.deegree.igeo.config.GridLayoutType;
import org.deegree.igeo.config.LayoutType;
import org.deegree.igeo.config.OnlineResourceType;
import org.deegree.igeo.config.SplittedLayoutType;
import org.deegree.igeo.config.TabLayoutType;
import org.deegree.igeo.config.ToolbarEntryType;
import org.deegree.igeo.config.Util;
import org.deegree.igeo.config._AbstractLayoutType;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.modules.DefaultMapModule;
import org.deegree.igeo.modules.IModule;
import org.deegree.igeo.views.ComponentPosition;
import org.deegree.igeo.views.swing.ButtonGroup;
import org.deegree.igeo.views.swing.ToolBar;
import org.deegree.igeo.views.swing.proxymanager.ProxyManagerPanel;
import org.deegree.igeo.views.swing.util.IconRegistry;
import org.deegree.kernel.ProcessMonitor;
import org.deegree.model.Identifier;
import com.jgoodies.looks.HeaderStyle;
import com.jgoodies.looks.Options;
/**
* TODO add class documentation here
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
public abstract class AbstractiGeoDesktop extends ApplicationContainer<Container> implements ActionListener {
private static final ILogger LOG = LoggerFactory.getLogger( AbstractiGeoDesktop.class );
/**
* @param processMonitor
*/
public AbstractiGeoDesktop( ProcessMonitor processMonitor ) {
super( processMonitor );
}
/**
* appends entries into the tool bar
*
* @param module
* the module the entries belongs to
* @param toolBarEntries
* the entries to add as new toolBar
*/
protected void appendToolBar( IModule<Container> module, List<ToolbarEntryType> toolBarEntries ) {
if ( toolBarEntries.size() > 0 ) {
ToolBar toolBar;
if ( module != null ) {
toolBar = (ToolBar) module.getToolBarController().getView();
} else {
toolBar = (ToolBar) this.toolBarController.getView();
}
toolBar.putClientProperty( Options.HEADER_STYLE_KEY, HeaderStyle.BOTH );
List<AbstractButton> btList = null;
String key = "";
if ( module != null ) {
key = module.getIdentifier().getValue();
if ( module instanceof DefaultMapModule<?> ) {
key = module.getClass().getName();
}
}
if ( module != null && !toolbarButtons.containsKey( key ) ) {
btList = new ArrayList<AbstractButton>();
toolbarButtons.put( key, btList );
} else {
btList = new ArrayList<AbstractButton>();
}
for ( ToolbarEntryType entry : toolBarEntries ) {
toolBar.setFloatable( proj.getView().getToolBar().get( 0 ).isFloatable() );
toolBar.setRollover( proj.getView().getToolBar().get( 0 ).isUseRollover() );
AbstractButton button = null;
if ( entry.getEntryType() == null || entry.getEntryType().value().equalsIgnoreCase( "ToggleButton" ) ) {
// use ToggleButton as default
if ( entry.getName() != null && entry.getName().length() > 0 ) {
String title = Messages.getMessage( Locale.getDefault(), entry.getName() );
button = new JToggleButton( title );
} else {
button = new JToggleButton();
}
} else if ( entry.getEntryType().value().equalsIgnoreCase( "PushButton" ) ) {
if ( entry.getName() != null && entry.getName().length() > 0 ) {
String title = Messages.getMessage( Locale.getDefault(), entry.getName() );
button = new JButton( title );
} else {
button = new JButton();
}
} else if ( entry.getEntryType().value().equalsIgnoreCase( "RadioButton" ) ) {
if ( entry.getName() != null && entry.getName().length() > 0 ) {
String title = Messages.getMessage( Locale.getDefault(), entry.getName() );
button = new JRadioButton( title );
} else {
button = new JRadioButton();
}
} else if ( entry.getEntryType().value().equalsIgnoreCase( "CheckBox" ) ) {
if ( entry.getName() != null && entry.getName().length() > 0 ) {
String title = Messages.getMessage( Locale.getDefault(), entry.getName() );
button = new JCheckBox( title );
} else {
button = new JCheckBox();
}
} else {
throw new RuntimeException( "not supported toolbar entry type: " + entry.getEntryType() );
}
// store button assign with an action to avoid initializing it twice
btList.add( button );
button.setBorder( BorderFactory.createEmptyBorder() );
String groupName = entry.getAssignedGroup();
// if group a button is assigned to already exists add button
// otherwise create a new group
if ( groupName != null && groupName.length() > 0 ) {
ButtonGroup assignedGroup = btGroups.get( groupName );
if ( assignedGroup == null ) {
assignedGroup = new ButtonGroup();
btGroups.put( groupName, assignedGroup );
}
assignedGroup.add( button );
}
// register component for a module and action. This will be used
// to synchronize state of different components responsible for
// the same action
if ( module == null ) {
// must be assigned to application itself
registerAction( Util.convertIdentifier( proj.getIdentifier() ), entry.getAssignedAction(), button );
// if assigned module != null it tool bar item will be assigned to main
// application
button.addActionListener( this );
} else {
registerAction( module.getIdentifier(), entry.getAssignedAction(), button );
button.addActionListener( module );
}
button.setName( entry.getAssignedAction() );
button.setVisible( true );
if ( entry.getTooltip() != null ) {
button.setToolTipText( Messages.getMessage( getLocale(), entry.getTooltip() ) );
}
addIcon( entry.getIcon(), button, 25 );
toolBar.add( button );
}
toolBar.setMargin( new Insets( 3, 3, 3, 3 ) );
if ( proj.getView().getToolBar().get( 0 ).isVertical() ) {
toolBar.setOrientation( JToolBar.VERTICAL );
}
this.toolbarPanel.add( toolBar );
}
}
/**
* register component for a module and action. This will be used to synchronize state of different components
* responsible for the same action
*
* @param identifier
* @param action
* @param button
*/
protected void registerAction( Identifier identifier, String action, AbstractButton button ) {
Map<String, List<Object>> map = actionMap.get( identifier );
if ( map == null ) {
map = new LinkedHashMap<String, List<Object>>();
actionMap.put( identifier, map );
}
List<Object> components = map.get( action );
if ( components == null ) {
components = new ArrayList<Object>();
map.put( action, components );
}
components.add( button );
}
/**
*
* @param href
* @param aButton
* @param size
*/
protected void addIcon( String href, AbstractButton aButton, int size ) {
Image img = null;
try {
img = ImageUtils.loadImage( resolve( href ) );
} catch ( MalformedURLException e ) {
LOG.logError( "Icon href is not a valied URL: " + href, e );
return;
} catch ( Exception e ) {
// LOG.logError( "Image from URL: " + href + " can not be loaded", e );
// return;
int idx = href.lastIndexOf( "/" );
try {
ImageIcon ic = (ImageIcon) IconRegistry.getIcon( href.substring( idx + 1 ) );
img = ic.getImage();
} catch ( Exception e2 ) {
LOG.logError( "Image from URL: " + href + " can not be loaded", e );
return;
}
}
BufferedImage tmp = new BufferedImage( size, size, BufferedImage.TYPE_INT_ARGB );
int x = ( size - img.getWidth( null ) ) / 2;
int y = ( size - img.getHeight( null ) ) / 2;
Graphics g = tmp.getGraphics();
g.drawImage( img, x, y, null );
g.dispose();
aButton.setIcon( new ImageIcon( tmp ) );
}
/**
*
* @param icon
* @param aButton
*/
protected void addIcon( OnlineResourceType icon, AbstractButton aButton, int size ) {
if ( icon != null ) {
String href = icon.getHref();
addIcon( href, aButton, size );
}
}
/**
* sets the layout for the target container of a module and adds the module to it (if layout is of type BorderLayot,
* SplittedLayout, TabbedLayout or GridLayout
*
* @param layout
* @param targetPane
* @return targetPane with defined layout
*/
protected Container setTargetLayout( LayoutType layout, Container targetPane, List<IModule<Container>> modList,
boolean useHorizontalScrollbar, boolean useVerticalScrollbar ) {
if ( !( targetPane.getLayout() instanceof BorderLayout ) && !( targetPane instanceof JDesktopPane ) ) {
// ensure that target pane uses border layout if it is not a container for
// internal frames
targetPane.setLayout( new BorderLayout() );
}
_AbstractLayoutType alt = layout.get_AbstractLayout().getValue();
if ( alt instanceof TabLayoutType ) {
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.setLocale( targetPane.getLocale() );
targetPane.add( tabbedPane, BorderLayout.CENTER );
targetPane = tabbedPane;
} else if ( alt instanceof SplittedLayoutType ) {
JSplitPane splitPane = new JSplitPane();
splitPane.setLocale( targetPane.getLocale() );
if ( ( (SplittedLayoutType) alt ).isVertical() ) {
splitPane.setOrientation( JSplitPane.VERTICAL_SPLIT );
} else {
splitPane.setOrientation( JSplitPane.HORIZONTAL_SPLIT );
}
targetPane.add( splitPane, BorderLayout.CENTER );
targetPane = splitPane;
} else if ( alt instanceof GridLayoutType ) {
int[] cols = determineGridSize( modList );
GridPanel gridPanel = new GridPanel( cols, 5, 10, false, false );
gridPanel.setLocale( targetPane.getLocale() );
targetPane.add( gridPanel );
targetPane = gridPanel;
}
if ( useHorizontalScrollbar || useVerticalScrollbar ) {
JScrollPane paneScrollPane = new JScrollPane( targetPane );
paneScrollPane.setLocale( targetPane.getLocale() );
if ( useHorizontalScrollbar ) {
paneScrollPane.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED );
}
if ( useVerticalScrollbar ) {
paneScrollPane.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED );
}
}
return targetPane;
}
/**
*
* @param modules
* @return width for each column of a grid
*/
protected int[] determineGridSize( List<IModule<Container>> modules ) {
int maxCol = -1;
for ( IModule<Container> module : modules ) {
ComponentPosition cpa = module.getComponentPositionAdapter();
if ( cpa.getGridColumn() > maxCol ) {
maxCol = cpa.getGridColumn();
}
}
int[] width = new int[maxCol + 1];
for ( int i = 0; i < width.length; i++ ) {
width[i] = 200;
}
return width;
}
/**
*
*/
protected static void initProxy() {
Preferences prefs = Preferences.userNodeForPackage( ProxyManagerPanel.class );
String host = prefs.get( "PROXYDEF_HTTP_HOST", null );
int port = prefs.getInt( "PROXYDEF_HTTP_PORT", -1 );
String user = prefs.get( "PROXYDEF_HTTP_USER", null );
String pw = prefs.get( "PROXYDEF_HTTP_PASSWORD", null );
String nonProxyHosts = prefs.get( "PROXYDEF_HTTP_NONPROXYHOSTS", null );
if ( host != null ) {
System.setProperty( "http.proxyHost", host );
System.setProperty( "http.proxyPort", Integer.toString( port ) );
if ( user != null && user.length() > 0 ) {
System.setProperty( "http.proxyUser", user );
}
if ( pw != null && pw.length() > 0 ) {
System.setProperty( "http.proxyPassword", pw );
}
if ( nonProxyHosts != null && nonProxyHosts.length() > 0 ) {
System.setProperty( "http.nonProxyHosts", nonProxyHosts );
}
}
}
}