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