org.deegree.igeo.desktop.AbstractiGeoDesktop.java Source code

Java tutorial

Introduction

Here is the source code for org.deegree.igeo.desktop.AbstractiGeoDesktop.java

Source

//$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);
            }
        }
    }
}