//$HeadURL$
/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2008 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:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: poth@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 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.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.igeo.config.LayoutType;
import org.deegree.igeo.config.WindowType;
import org.deegree.igeo.config._AbstractViewFormType;
import org.deegree.igeo.i18n.Messages;
import org.deegree.igeo.modules.IModule;
import org.deegree.igeo.views.DialogFactory;
import org.deegree.igeo.views.swing.ControlElement;
import org.deegree.igeo.views.swing.Footer;
import org.deegree.igeo.views.swing.actionlisteners.KeyListenerRegister;
import org.deegree.kernel.ProcessMonitor;
/**
* Main class for running iGeodesktop as a swing application
*
*
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version. $Revision$, $Date$
*/
public class IGeoDesktopPanel extends IGeoDesktop {
private static final long serialVersionUID = -8423037307095733192L;
private static final ILogger LOG = LoggerFactory.getLogger( IGeoDesktopPanel.class );
private JPanel mainPanel;
/**
* @param processMonitor
*
*
*/
public IGeoDesktopPanel( ProcessMonitor processMonitor ) {
super( processMonitor );
mainPanel = new JPanel( new BorderLayout() );
initProxy();
}
/**
*
*/
public void init() {
toolBarController = new ControlElement( "ToolBar" );
footer = new Footer();
}
/**
* adapts the toolbar to current container size
*/
public void resizeToolbar() {
Component[] comps = toolbarPanel.getComponents();
int w = 0;
for ( Component comp : comps ) {
w += comp.getWidth();
}
if ( w > mainPanel.getWidth() * 2 - 30 ) {
toolbarPanel.setPreferredSize( new Dimension( 100, 125 ) );
} else if ( w > mainPanel.getWidth() - 20 ) {
toolbarPanel.setPreferredSize( new Dimension( 100, 80 ) );
} else {
toolbarPanel.setPreferredSize( new Dimension( 100, 45 ) );
}
toolbarPanel.revalidate();
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.AbstractApplicationContainer#paint()
*/
public void paint() {
if ( this.proj != null ) {
processMonitor.updateStatus( "initializing panel ..." );
initPanel();
_AbstractViewFormType vfc = this.proj.getView().getViewForm().get_AbstractViewForm().getValue();
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 a JDesktopPane
this.mainPanel.setLayout( new BorderLayout() );
rootTargetPane = new JDesktopPane();
// rootTargetPane.setBackground( new Color( 145,129,98) );
rootTargetPane.setBackground( new Color( 138, 127, 106 ) );
this.mainPanel.add( rootTargetPane, BorderLayout.CENTER );
} else {
rootTargetPane = new JPanel( new BorderLayout() );
this.mainPanel.add( rootTargetPane, BorderLayout.CENTER );
}
boolean hscb = vfc.isUseHorizontalScrollBar();
boolean vscb = vfc.isUseVerticalScrollBar();
addFooter();
LayoutType layout = this.proj.getView().getViewForm().getLayout();
rootTargetPane = setTargetLayout( layout, rootTargetPane, this.modules, hscb, vscb );
addToolBarEntries();
addPopupEntries();
try {
processMonitor.cancel();
} catch ( Exception e ) {
LOG.logError( e.getMessage(), e );
}
appendModules( this.modules, rootTargetPane );
SwingUtilities.updateComponentTreeUI( mainPanel );
WindowType w = this.proj.getView().getWindow();
if ( w.getWidth() > 0 ) {
this.mainPanel.setSize( w.getWidth(), w.getHeight() );
this.mainPanel.setPreferredSize( new Dimension( w.getWidth(), w.getHeight() ) );
this.mainPanel.setLocation( w.getLeft(), w.getTop() );
this.mainPanel.setVisible( true );
} else {
LOG.logInfo( "Application Container defined to be invisible" );
}
this.mainPanel.repaint();
}
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.AbstractApplicationContainer#cleanUp()
*/
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", mainPanel,
Messages.getMessage( mainPanel.getLocale(), "$DI10063" ),
Messages.getMessage( mainPanel.getLocale(), "$DI10064" ) ) ) {
if ( isNew ) {
IGeoDesktopEventHandler.saveProject( this );
} else {
IGeoDesktopEventHandler.saveProject( this, null );
}
}
} catch ( Exception e ) {
LOG.logWarning( "", e );
}
}
private void addFooter() {
if ( this.proj.getView().isHasFooter() ) {
( (JComponent) footer ).setMinimumSize( new Dimension( 100, 30 ) );
( (JComponent) footer ).setPreferredSize( new Dimension( 100, 30 ) );
mainPanel.add( (JComponent) footer, BorderLayout.AFTER_LAST_LINE );
}
}
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();
mainPanel.addMouseListener( popupListener );
}
}
private void initPanel() {
// add listeners to store window position and size within current project
mainPanel.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( (int) event.getComponent().getWidth() );
wt.setHeight( (int) event.getComponent().getHeight() );
resizeToolbar();
}
} );
this.mainPanel.setLocale( Locale.getDefault() );
this.mainPanel.removeAll();
this.mainPanel.setName( "iGeoDesktop" );
KeyListenerRegister.registerDefaultKeyListener( mainPanel.getRootPane() );
// initialize new list for tool bar
toolbarButtons = new HashMap<String, List<AbstractButton>>();
menuItems = new HashMap<String, AbstractButton>();
}
/**
* 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() ) {
mainPanel.add( toolbarPanel, BorderLayout.WEST );
} else {
mainPanel.add( toolbarPanel, BorderLayout.BEFORE_FIRST_LINE );
}
}
/**
*
* @return iGeoDesktop as a {@link JPanel}
*/
public JPanel getMainWndow() {
return mainPanel;
}
// /////////////////////////////////////////////////////////////////////////////////
// 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() );
}
}
}
}