//$HeadURL$
/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2012 by:
Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
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:
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: info@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.igeo.desktop;
import static java.util.Locale.getDefault;
import static org.deegree.igeo.config.Util.convertIdentifier;
import static org.deegree.igeo.i18n.Messages.getMessage;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.swing.AbstractButton;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.deegree.framework.keyboard.Key2Code;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.framework.util.Pair;
import org.deegree.igeo.config.AcceleratorType;
import org.deegree.igeo.config.EntryValueType;
import org.deegree.igeo.config.FrameViewFormType;
import org.deegree.igeo.config.IdentifierType;
import org.deegree.igeo.config.LayoutType;
import org.deegree.igeo.config.MenuItemType;
import org.deegree.igeo.config.MenuType;
import org.deegree.igeo.config.Util;
import org.deegree.igeo.config.WindowType;
import org.deegree.igeo.config._AbstractViewFormType;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.modules.DefaultMapModule;
import org.deegree.igeo.modules.DefaultModuleGroup;
import org.deegree.igeo.modules.IModule;
import org.deegree.igeo.modules.IModuleGroup;
import org.deegree.igeo.modules.ModuleException;
import org.deegree.igeo.views.ComponentPosition;
import org.deegree.igeo.views.ComponentPosition.BorderPosition;
import org.deegree.igeo.views.ComponentPosition.SplitterPosition;
import org.deegree.igeo.views.DialogFactory;
import org.deegree.igeo.views.IFooterEntry;
import org.deegree.igeo.views.swing.ButtonGroup;
import org.deegree.igeo.views.swing.ControlElement;
import org.deegree.igeo.views.swing.Footer;
import org.deegree.igeo.views.swing.FooterEntry;
import org.deegree.igeo.views.swing.MenuBar;
import org.deegree.igeo.views.swing.SplashWindow;
import org.deegree.igeo.views.swing.actionlisteners.KeyListenerRegister;
import org.deegree.igeo.views.swing.util.PopUpRegister;
import org.deegree.kernel.Command;
import org.deegree.kernel.ProcessMonitor;
import org.deegree.model.Identifier;
import com.jgoodies.looks.HeaderStyle;
import com.jgoodies.looks.Options;
import com.jgoodies.looks.plastic.Plastic3DLookAndFeel;
import com.jgoodies.looks.plastic.PlasticLookAndFeel;
import com.jgoodies.looks.plastic.theme.ExperienceBlue;
/**
* Main class for running deegree desktop as a swing application
*
* @author <a href="mailto:wanhoff@lat-lon.de">Jeronimo Wanhoff</a>
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version. $Revision$, $Date$
*/
public class IGeoDesktop extends AbstractiGeoDesktop {
private static final ILogger LOG = LoggerFactory.getLogger( IGeoDesktop.class );
private static final String CONTEXT = "Application";
// main window/container
JFrame frame;
/**
* @param processMonitor
*
*
*/
public IGeoDesktop( ProcessMonitor processMonitor ) {
super( processMonitor );
try {
String manager = System.getProperty( "UIManager" );
if ( manager != null ) {
UIManager.setLookAndFeel( manager );
} else {
// UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
UIManager.setLookAndFeel( "com.jgoodies.looks.plastic.Plastic3DLookAndFeel" );
Plastic3DLookAndFeel laf = new Plastic3DLookAndFeel();
ExperienceBlue eb = new ExperienceBlue();
PlasticLookAndFeel.setPlasticTheme( eb );
UIManager.setLookAndFeel( laf );
}
} catch ( Exception e ) {
LOG.logError( "Could not load LookAndFeel: " + System.getProperty( "UIManager" ), e );
}
}
/**
*
*/
@Override
public void init() {
toolBarController = new ControlElement( "ToolBar" );
menuBarController = new ControlElement( "MenuBar" );
footer = new Footer();
}
/*
* (non-Javadoc)
*
* @see org.deegree.client.application.ApplicationContainer#getViewPlatform()
*/
@Override
public String getViewPlatform() {
return IGeoDesktop.CONTEXT;
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.AbstractApplicationContainer#getLocale()
*/
@Override
public Locale getLocale() {
return Locale.getDefault();
}
/**
*
*
*/
@Override
public void paint() {
if ( this.proj != null ) {
processMonitor.updateStatus( "initializing frame ..." );
initFrame();
_AbstractViewFormType vfc = this.proj.getView().getViewForm().get_AbstractViewForm().getValue();
this.frame.setResizable( ( (FrameViewFormType) vfc ).isResizeable() );
String name = ( (FrameViewFormType) vfc ).getFrameTitle();
this.frame.setTitle( getFrameTitle( name ) );
if ( modules.size() > 0 && modules.get( 0 ).getViewForm() instanceof JInternalFrame ) {
// if at least one child module is an JInternalFrame the current content
// pane must be replaced by a JDesktopPane
this.frame.getContentPane().setLayout( new BorderLayout() );
rootTargetPane = new JDesktopPane();
// rootTargetPane.setBackground( new Color( 145,129,98) );
rootTargetPane.setBackground( new Color( 138, 127, 106 ) );
this.frame.getContentPane().add( rootTargetPane, BorderLayout.CENTER );
} else {
rootTargetPane = new JPanel( new BorderLayout() );
this.frame.setContentPane( rootTargetPane );
}
boolean hscb = vfc.isUseHorizontalScrollBar();
boolean vscb = vfc.isUseVerticalScrollBar();
addFooter( this.frame.getContentPane() );
LayoutType layout = this.proj.getView().getViewForm().getLayout();
rootTargetPane = setTargetLayout( layout, rootTargetPane, this.modules, hscb, vscb );
addMenuBarEntries();
addToolBarEntries();
addPopupEntries();
try {
processMonitor.cancel();
} catch ( Exception e ) {
LOG.logError( e.getMessage(), e );
}
appendModules( this.modules, rootTargetPane );
SwingUtilities.updateComponentTreeUI( frame );
// frame.pack();
WindowType w = this.proj.getView().getWindow();
if ( w.getWidth() > 0 ) {
this.frame.setSize( w.getWidth(), w.getHeight() );
this.frame.setLocation( w.getLeft(), w.getTop() );
this.frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
this.frame.addWindowListener( new WindowAdapter() {
@Override
public void windowClosing( WindowEvent e ) {
if ( e.getWindow().equals( frame ) ) {
cleanUp();
}
}
} );
this.frame.setVisible( true );
} else {
LOG.logInfo( "Application Container defined to be invisible" );
}
this.frame.repaint();
}
}
private String getFrameTitle( String name ) {
String file = this.projectURL.toExternalForm();
int index = file.lastIndexOf( File.separator );
if ( index > 0 )
file = file.substring( index + 1, file.length() );
return getMessage( getDefault(), name, file );
}
@Override
public void cleanUp() {
// TODO
// cleanup all resources
try {
// if something has been changed use will be asked if changes shall be safed
// before quitting the program
if ( getCommandProcessor().availableUndos().size() > 0
&& DialogFactory.openConfirmDialogYESNO( "application", frame,
Messages.getMessage( frame.getLocale(), "$DI10063" ),
Messages.getMessage( frame.getLocale(), "$DI10064" ) ) ) {
if ( isNew ) {
IGeoDesktopEventHandler.saveProject( this );
} else {
IGeoDesktopEventHandler.saveProject( this, null );
}
}
} catch ( Exception e ) {
LOG.logWarning( "", e );
}
}
private void addFooter( Container targetPane ) {
if ( this.proj.getView().isHasFooter() ) {
( (JComponent) footer ).setMinimumSize( new Dimension( 100, 30 ) );
( (JComponent) footer ).setPreferredSize( new Dimension( 100, 30 ) );
targetPane.add( (JComponent) footer, BorderLayout.SOUTH );
}
}
private void addPopupEntries() {
if ( popupEntries.size() > 0 ) {
popup = new JPopupMenu();
JMenuItem menuItem = new JMenuItem( "A popup menu item" );
menuItem.addActionListener( this );
popup.add( menuItem );
popup.addSeparator();
MouseListener popupListener = new PopupListener();
frame.addMouseListener( popupListener );
menuBar.addMouseListener( popupListener );
}
}
private void initFrame() {
// remove all listeners and dispose current frame
Frame[] frames = Frame.getFrames();
for ( Frame frame : frames ) {
WindowListener[] wl = frame.getWindowListeners();
for ( WindowListener windowListener : wl ) {
frame.removeWindowListener( windowListener );
}
ComponentListener[] cl = frame.getComponentListeners();
for ( ComponentListener componentListener : cl ) {
frame.removeComponentListener( componentListener );
}
frame.dispose();
}
frame = new JFrame();
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowActivated( WindowEvent e ) {
// e.g. reorder windows
// Frame[] frames = Frame.getFrames();
// for ( Frame fr : frames ) {
// if ( !frame.equals( fr ) ) {
// fr.toFront();
// }
// }
// frame.requestFocus();
}
} );
// add listeners to store window position and size within current project
frame.addComponentListener( new ComponentAdapter() {
@Override
public void componentMoved( ComponentEvent event ) {
WindowType wt = proj.getView().getWindow();
wt.setLeft( (int) event.getComponent().getLocation().getX() );
wt.setTop( (int) event.getComponent().getLocation().getY() );
}
@Override
public void componentResized( ComponentEvent event ) {
WindowType wt = proj.getView().getWindow();
wt.setWidth( event.getComponent().getWidth() );
wt.setHeight( event.getComponent().getHeight() );
resizeToolbar();
}
} );
// add listeners that ensures that all frames assigned to a project will be (de-)iconified
// if main window/frame will be (de-)iconified
frame.addWindowListener( new WindowAdapter() {
@Override
public void windowIconified( WindowEvent e ) {
Frame[] frames = Frame.getFrames();
for ( Frame frame : frames ) {
frame.setState( Frame.ICONIFIED );
}
}
@Override
public void windowDeiconified( WindowEvent e ) {
Frame[] frames = Frame.getFrames();
for ( Frame frame : frames ) {
frame.setState( Frame.NORMAL );
}
}
} );
Component[] comps = this.frame.getContentPane().getComponents();
for ( Component component : comps ) {
this.frame.getContentPane().remove( component );
}
this.frame.setLocale( Locale.getDefault() );
this.frame.getContentPane().removeAll();
this.frame.setName( "iGeoDesktop" );
this.menuBar = (MenuBar) menuBarController.getView();
this.menuBar.putClientProperty( Options.HEADER_STYLE_KEY, HeaderStyle.BOTH );
this.menuBar.removeAll();
this.menuBar.setVisible( true );
this.frame.setJMenuBar( this.menuBar );
KeyListenerRegister.registerDefaultKeyListener( frame.getRootPane() );
// initialize new list for tool bar and menu buttons
toolbarButtons = new HashMap<String, List<AbstractButton>>();
menuItems = new HashMap<String, AbstractButton>();
}
@Override
public void registerKeyboardAction( ActionListener actionListener, KeyStroke keyStroke ) {
this.frame.getRootPane().registerKeyboardAction( actionListener, keyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW );
}
/**
* appends Modules onto the passed contains
*
* @param targetPane
*/
@Override
public void appendModules( List<IModule<Container>> modules, Container targetPane ) {
for ( IModule<Container> module : modules ) {
module.setGUIContainer( targetPane );
Object view = module.getViewForm();
if ( module.getComponentPositionAdapter().getHeaderPosition() > -1 ) {
JComponent toolBar = (JComponent) toolBarController.getView();
if ( toolBar != null ) {
int index = module.getComponentPositionAdapter().getHeaderPosition();
if ( index > toolBar.getComponentCount() ) {
index = toolBar.getComponentCount();
}
// components located in tool bar shall have a transparent background
// to keep look&feel of the tool bar
( (JComponent) view ).setBackground( new Color( 0, 0, 0, 0 ) );
toolBar.add( (JComponent) view, index );
}
} else if ( module.getComponentPositionAdapter().getFooterPosition() > -1 ) {
if ( getFooter() != null ) {
IFooterEntry fe = new FooterEntry( module.getName(), (JComponent) view );
getFooter().addEntry( fe, module.getComponentPositionAdapter().getFooterPosition() );
}
} else {
if ( view instanceof JFrame ) {
( (JFrame) view ).setVisible( true );
} else if ( view instanceof JInternalFrame ) {
( (JInternalFrame) view ).setVisible( true );
if ( targetPane instanceof JTabbedPane ) {
throw new ModuleException( Messages.getMessage( Locale.getDefault(), "$DG10001",
module.getIdentifier() ) );
} else if ( targetPane instanceof JSplitPane ) {
throw new ModuleException( Messages.getMessage( Locale.getDefault(), "$DG10002",
module.getIdentifier() ) );
}
targetPane.add( (JInternalFrame) view );
} else if ( view instanceof JComponent ) {
JComponent c = (JComponent) view;
if ( targetPane instanceof JTabbedPane ) {
( (JTabbedPane) targetPane ).addTab( module.getName(), c );
} else if ( targetPane instanceof JSplitPane ) {
SplitterPosition type = module.getComponentPositionAdapter().getSplitterPosition();
switch ( type ) {
case BOTTOM:
( (JSplitPane) targetPane ).add( c, JSplitPane.BOTTOM );
break;
case TOP:
( (JSplitPane) targetPane ).add( c, JSplitPane.TOP );
break;
case LEFT:
( (JSplitPane) targetPane ).add( c, JSplitPane.LEFT );
break;
case RIGHT:
( (JSplitPane) targetPane ).add( c, JSplitPane.RIGHT );
break;
}
} else if ( targetPane.getLayout() instanceof BorderLayout ) {
BorderPosition pos = module.getComponentPositionAdapter().getBorderPosition();
switch ( pos ) {
case CENTER:
targetPane.add( c, BorderLayout.CENTER );
break;
case NORTH:
targetPane.add( c, BorderLayout.NORTH );
break;
case SOUTH:
targetPane.add( c, BorderLayout.SOUTH );
break;
case WEST:
targetPane.add( c, BorderLayout.WEST );
break;
case EAST:
targetPane.add( c, BorderLayout.EAST );
break;
}
} else if ( targetPane.getLayout() instanceof BoxLayout ) {
ComponentPosition cpa = module.getComponentPositionAdapter();
int col = cpa.getGridColumn();
int row = cpa.getGridRow();
( (GridPanel) targetPane ).add( c, row, col );
} else {
targetPane.add( c );
}
}
if ( module instanceof DefaultModuleGroup<?> ) {
// recursion on sub modules if current module is a module group
Container tp = (Container) view;
List<IModule<Container>> children = ( (DefaultModuleGroup<Container>) module ).getChildModules();
LayoutType layout = module.getLayout();
tp = setTargetLayout( layout, tp, children, module.useHorizontalScrollbar(),
module.useVerticalScrollbar() );
appendModules( children, tp );
}
}
}
}
/**
* add all toolBarEntries of each module and of the container to the toolbar
*/
private void addToolBarEntries() {
this.toolbarPanel = new JPanel( new FlowLayout( FlowLayout.LEADING ) );
appendToolBar( null, this.toolbarEntries );
for ( IModule<Container> module : this.modules ) {
addToolBarEntries( module );
}
if ( proj.getView().getToolBar().get( 0 ).isVertical() ) {
frame.add( toolbarPanel, BorderLayout.WEST );
} else {
frame.add( toolbarPanel, BorderLayout.BEFORE_FIRST_LINE );
}
}
/**
* add entries (buttons) to the toolbar assigned to one specific module and its children
*
* @param module
*/
@Override
public void addToolBarEntries( IModule<Container> module ) {
if ( module instanceof IModuleGroup<?> ) {
for ( IModule<Container> childModule : ( (IModuleGroup<Container>) module ).getChildModules() ) {
addToolBarEntries( childModule );
}
} else {
String key = module.getIdentifier().getValue();
if ( module instanceof DefaultMapModule<?> ) {
key = module.getClass().getName();
}
if ( toolbarButtons.containsKey( key ) ) {
// if already a module of current type has been initialized avoid adding
// same buttons twice; use already existing buttons and assign current
// module as listener
List<AbstractButton> list = toolbarButtons.get( key );
for ( AbstractButton button : list ) {
button.addActionListener( module );
}
} else {
appendToolBar( module, module.getToolBarEntries() );
}
}
}
/**
* appends entries into the menu bar
*
*/
private void addMenuBarEntries() {
if ( getMenuBar() != null ) {
addModuleMenus( getMenuBar().getMenu() );
JMenu menu = new JMenu( Messages.getMessage( frame.getLocale(), "$DI10053" ) );
menu.setMnemonic( KeyEvent.VK_H );
JMenuItem item = new JMenuItem( Messages.getMessage( frame.getLocale(), "$DI10054" ) );
addIcon( "/org/deegree/igeo/views/images/help.png", item, 15 );
item.setName( "iGeoDesktop:open help" );
item.addActionListener( this );
item.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_F1, 0 ) );
// item.setMnemonic( KeyEvent.VK_O );
menu.add( item );
item = new JMenuItem( Messages.getMessage( frame.getLocale(), "$DI10055" ) );
item.setName( "iGeoDesktop:online help" );
item.addActionListener( this );
// item.setMnemonic( KeyEvent.VK_L );
menu.add( item );
menu.addSeparator();
item = new JMenuItem( Messages.getMessage( frame.getLocale(), "$DI10056" ) );
item.setName( "iGeoDesktop:about" );
item.addActionListener( this );
item.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_A, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK ) );
// item.setMnemonic( KeyEvent.VK_A );
menu.add( item );
this.menuBar.add( menu );
}
}
private void addModuleMenus( Collection<MenuType> projectMenus ) {
MenuNode root = new MenuNode( null, null );
LinkedList<Pair<IModule<Container>, MenuType>> menus = new LinkedList<Pair<IModule<Container>, MenuType>>();
for ( MenuType menu : projectMenus ) {
menus.add( new Pair<IModule<Container>, MenuType>( null, menu ) );
}
// first run to find all menus
List<IModule<Container>> modules = getModules();
for ( IModule<Container> module : modules ) {
for ( MenuType menu : module.getMenus() ) {
menus.add( new Pair<IModule<Container>, MenuType>( module, menu ) );
}
}
constructMenuTree( root, menus );
buildJMenus( null, root );
}
private void buildJMenus( JMenu parent, MenuNode node ) {
JMenu menu = null;
if ( node.menu != null ) {
String title = getMessage( getDefault(), node.menu.getName() );
menu = new JMenu( title );
setMenuAttributes( node.menu, menu );
menu.setVisible( true );
menu.setName( convertIdentifier( node.menu.getIdentifier() ).getAsQualifiedString() );
addIcon( node.menu.getIcon(), menu, 15 );
if ( parent == null ) {
menuBar.add( menu );
if ( node.module == null ) {
appendChildren( this, node.menu, menu );
} else {
appendChildren( node.module, node.menu, menu );
}
} else {
// parent.addSeparator();
appendChildren( node.module, node.menu, parent );
}
}
for ( MenuNode child : node.children ) {
buildJMenus( menu, child );
}
}
private void constructMenuTree( MenuNode node, Collection<Pair<IModule<Container>, MenuType>> children ) {
for ( Pair<IModule<Container>, MenuType> child : children ) {
IdentifierType parent = child.second.getParent();
MenuType menu = node.menu;
if ( ( menu == null && parent == null )
|| ( menu != null && parent != null && parent.getValue().equals( menu.getIdentifier().getValue() ) ) ) {
MenuNode newNode = new MenuNode( child.second, child.first );
node.children.add( newNode );
constructMenuTree( newNode, children );
}
}
}
/**
* appends entries to an already existing menu item
*
* @param root
* @param menu
*/
@SuppressWarnings("unchecked")
private void appendChildren( ActionListener listener, MenuType root, JMenu menu ) {
try {
List<Object> list = root.getMenuItemOrMenu();
for ( Object object : list ) {
if ( object instanceof MenuType ) {
MenuType mt = (MenuType) object;
if ( !menuItems.containsKey( listener.getClass().getName() + "|" + mt.getName() ) ) {
String title = Messages.getMessage( Locale.getDefault(), mt.getName() );
JMenu item = new JMenu( title );
item.setName( Util.convertIdentifier( mt.getIdentifier() ).getAsQualifiedString() );
setMenuAttributes( mt, item );
addIcon( mt.getIcon(), item, 15 );
menu.add( item );
appendChildren( listener, mt, item );
// store item assign with an action to avoid initializing it twice
menuItems.put( listener.getClass().getName() + "|" + mt.getName(), item );
}
} else {
MenuItemType menuItem = (MenuItemType) object;
if ( !menuItems.containsKey( listener.getClass().getName() + "|" + menuItem.getAssignedAction() ) ) {
String title = Messages.getMessage( Locale.getDefault(), menuItem.getName() );
JMenuItem item = null;
String assignedGroup = menuItem.getAssignedGroup();
// set simple menuItem as default
if ( menuItem.getName().equals( "-" ) ) {
menu.addSeparator();
return;
} else if ( menuItem.getEntryType() == null
|| menuItem.getEntryType() == EntryValueType.SIMPLE_ITEM ) {
item = new JMenuItem( title );
} else if ( menuItem.getEntryType() == EntryValueType.RADIO_BUTTON_ITEM ) {
item = new JRadioButtonMenuItem( title );
URL url = PopUpRegister.class.getResource( "/org/deegree/igeo/views/images/radiobutton_unselected.gif" );
item.setIcon( new ImageIcon( url ) );
url = PopUpRegister.class.getResource( "/org/deegree/igeo/views/images/radiobutton_selected.gif" );
item.setSelectedIcon( new ImageIcon( url ) );
} else if ( menuItem.getEntryType() == EntryValueType.CHECK_BOX_ITEM ) {
item = new JCheckBoxMenuItem( title );
URL url = PopUpRegister.class.getResource( "/org/deegree/igeo/views/images/checkbox_unselected.gif" );
item.setIcon( new ImageIcon( url ) );
url = PopUpRegister.class.getResource( "/org/deegree/igeo/views/images/checkbox_selected.gif" );
item.setSelectedIcon( new ImageIcon( url ) );
} else {
// item is null.
return;
}
item.setName( menuItem.getAssignedAction() );
if ( listener instanceof IModule ) {
// register component for a module and action. This will be used
// to synchronize state of different components responsible for
// the same action
registerAction( ( (IModule<Container>) listener ).getIdentifier(),
menuItem.getAssignedAction(), item );
}
setMenuAttributes( menuItem, item );
addIcon( menuItem.getIcon(), item, 15 );
menu.add( item );
if ( assignedGroup != null && assignedGroup.length() > 0
&& item instanceof JRadioButtonMenuItem ) {
ButtonGroup bgp = btGroups.get( assignedGroup );
if ( bgp == null ) {
bgp = new ButtonGroup();
btGroups.put( assignedGroup, bgp );
}
bgp.add( item );
}
// menu bar entry belongs to main application
item.addActionListener( listener );
// store item assign with an action to avoid initializing it twice
menuItems.put( listener.getClass().getName() + "|" + menuItem.getAssignedAction(), item );
} else {
AbstractButton ab = menuItems.get( listener.getClass().getName() + "|"
+ menuItem.getAssignedAction() );
ab.addActionListener( listener );
}
}
}
} catch ( Exception e ) {
LOG.logWarning( e.getMessage(), e );
}
}
private void setMenuAttributes( MenuType entry, JMenuItem item ) {
if ( entry.getTooltip() != null ) {
item.setToolTipText( Messages.getMessage( getLocale(), entry.getTooltip() ) );
}
if ( entry.getAccelerator() != null ) {
AcceleratorType at = entry.getAccelerator();
KeyStroke ks = KeyStroke.getKeyStroke( Key2Code.getKeyCode( at.getMnemonic().toString() ),
Key2Code.getMaskCode( at.getMask().toString() ), false );
item.setAccelerator( ks );
}
if ( entry.getMnemonic() != null ) {
String mt = entry.getMnemonic();
item.setMnemonic( Key2Code.getKeyCode( mt ) );
}
}
private void setMenuAttributes( MenuItemType entry, JMenuItem item ) {
if ( entry.getTooltip() != null ) {
item.setToolTipText( Messages.getMessage( getLocale(), entry.getTooltip() ) );
}
if ( entry.getAccelerator() != null ) {
AcceleratorType at = entry.getAccelerator();
KeyStroke ks = KeyStroke.getKeyStroke( Key2Code.getKeyCode( at.getMnemonic().toString() ),
Key2Code.getMaskCode( at.getMask().toString() ), false );
item.setAccelerator( ks );
}
if ( entry.getMnemonic() != null ) {
String mt = entry.getMnemonic();
item.setMnemonic( Key2Code.getKeyCode( mt ) );
}
}
/*
* (non-Javadoc)
*
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed( ActionEvent event ) {
IGeoDesktopEventHandler.actionPerformed( this, event );
}
/**
* performs a login
*
* @param user
* @param password
*/
@Override
public void login( String user, String password ) {
if ( user == null || user.length() < 3 ) {
DialogFactory.openWarningDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10874" ),
Messages.getMessage( frame.getLocale(), "$MD10875" ) );
return;
}
this.user = user;
this.password = password;
Command command = null;
Class<?> clzz = null;
String method = null;
try {
// method contains full name of command to be performed to authenticate a user
// this may be a dummy if server side security component uses IP address of a
// client for authentication
method = settings.getSecurityOptions().getAuthenticationMethod( null ).trim();
clzz = Class.forName( method );
} catch ( Exception e ) {
LOG.logError( e.getMessage(), e );
DialogFactory.openWarningDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10884", method ),
Messages.getMessage( frame.getLocale(), "$MD10885" ) );
return;
}
URL url = null;
try {
String authServer = settings.getSecurityOptions().getAuthenticationServer( null );
if ( authServer != null ) {
url = new URL( authServer );
}
} catch ( Exception e ) {
LOG.logError( e.getMessage(), e );
DialogFactory.openWarningDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10876" ),
Messages.getMessage( frame.getLocale(), "$MD10877" ) );
return;
}
try {
Class<?>[] types = new Class[] { String.class, String.class, URL.class };
Object[] values = new Object[] { user, password, url };
Constructor<?> construtctor = clzz.getConstructor( types );
command = (Command) construtctor.newInstance( values );
} catch ( Exception e ) {
LOG.logError( e.getMessage(), e );
DialogFactory.openWarningDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10886", method ),
Messages.getMessage( frame.getLocale(), "$MD10887" ) );
return;
}
try {
getCommandProcessor().executeSychronously( command, false );
if ( command.getResult() instanceof String ) {
// command that returns a certificate has been performed
String certificate = (String) command.getResult();
certificates.put( "default", certificate );
} else
// command that just says if a user/password combination is valid has been performed
if ( command.getResult() instanceof Boolean && ( (Boolean) command.getResult() ) == false ) {
// user could not be authenticated using his user/password
DialogFactory.openWarningDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10882" ),
Messages.getMessage( frame.getLocale(), "$MD10883" ) );
return;
}
} catch ( Exception e ) {
LOG.logError( e.getMessage(), e );
DialogFactory.openWarningDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10878" ),
Messages.getMessage( frame.getLocale(), "$MD10879" ) );
return;
}
DialogFactory.openInformationDialog( "application", frame,
Messages.getMessage( frame.getLocale(), "$MD10880" ),
Messages.getMessage( frame.getLocale(), "$MD10881" ) );
}
@Override
public void selectComponentForAction( Identifier module, String action, boolean select ) {
Map<String, List<Object>> map = actionMap.get( module );
List<Object> list = null;
if ( map != null ) {
list = map.get( action );
}
if ( list != null ) {
for ( Object object : list ) {
( (AbstractButton) object ).setSelected( select );
}
}
}
/**
*
* @return main window of the application
*/
@Override
public Container getMainWndow() {
return frame;
}
/**
* adapts the toolbar to current container size
*/
@Override
public void resizeToolbar() {
Component[] comps = toolbarPanel.getComponents();
int w = 0;
for ( Component comp : comps ) {
w += comp.getWidth();
}
if ( w > frame.getWidth() * 2 - 30 ) {
toolbarPanel.setPreferredSize( new Dimension( 100, 125 ) );
} else if ( w > frame.getWidth() - 20 ) {
toolbarPanel.setPreferredSize( new Dimension( 100, 80 ) );
} else {
toolbarPanel.setPreferredSize( new Dimension( 100, 45 ) );
}
toolbarPanel.revalidate();
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.ApplicationContainer#resetToolbar()
*/
@Override
public void resetToolbar() {
Collection<ButtonGroup> gr = btGroups.values();
for ( ButtonGroup buttonGroup : gr ) {
buttonGroup.removeSelection();
}
}
// /////////////////////////////////////////////////////////////////////////////////
// inner classes
// /////////////////////////////////////////////////////////////////////////////////
/**
*
* The <code>IGeoDesktop</code> class TODO add class documentation here.
*
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
*
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*
*/
class PopupListener extends MouseAdapter {
@Override
public void mousePressed( MouseEvent e ) {
maybeShowPopup( e );
}
@Override
public void mouseReleased( MouseEvent e ) {
maybeShowPopup( e );
}
private void maybeShowPopup( MouseEvent e ) {
if ( e.isPopupTrigger() ) {
popup.show( e.getComponent(), e.getX(), e.getY() );
}
}
}
/**
*
* The <code>MenuNode</code> class TODO add class documentation here.
*
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
*
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*
*/
class MenuNode {
MenuType menu;
IModule<Container> module;
LinkedList<MenuNode> children = new LinkedList<MenuNode>();
MenuNode( MenuType menu, IModule<Container> module ) {
this.menu = menu;
this.module = module;
}
@Override
public String toString() {
String str = "["
+ ( menu == null ? "(null)" : ( menu.getName() + "(" + menu.getIdentifier().getValue() + ")" ) )
+ " " + children + "]";
return str;
}
}
/**
* @param args
*/
public static void main( String[] args ) {
initProxy();
SplashWindow spw = null;
try {
JLabel label = new JLabel( new ImageIcon( IGeoDesktop.class.getResource( "igeodesktop.jpg" ) ) );
label.setSize( 420, 303 );
spw = new SplashWindow( label );
spw.setVisible( true );
IGeoDesktop g = new IGeoDesktop( spw );
URL url = null;
if ( args == null || args.length == 0 ) {
url = IGeoDesktop.class.getResource( "/default.prj" );
} else {
if ( args[0].startsWith( "http://" ) ) {
url = new URL( args[0] );
} else {
url = new File( args[0] ).toURI().toURL();
}
}
g.init();
g.getCommandProcessor().clear();
g.loadProject( url, false );
g.paint();
// opens a login dialog if system property 'autoLogin' is set to 'true'
if ( "true".equalsIgnoreCase( System.getProperty( "autoLogin" ) ) ) {
new LoginDialog( g );
}
} catch ( Exception e ) {
if ( spw != null )
spw.dispose();
String msg = e.getMessage();
if ( msg == null || msg.trim().length() == 0 ) {
msg = e.getClass().getName();
}
DialogFactory.openErrorDialog( "Application", null, "Error starting iGeoDesktop", msg, e );
LOG.logError( e );
}
}
}