/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cismap.commons.gui.capabilitywidget; import com.jgoodies.looks.Options; import com.jgoodies.looks.plastic.PlasticXPLookAndFeel; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.PrecisionModel; import org.jdesktop.swingx.JXErrorPane; import org.jdesktop.swingx.error.ErrorInfo; import org.jdom.Attribute; import org.jdom.Element; import org.openide.util.NbBundle; import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.logging.Level; import javax.swing.AbstractAction; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.WindowConstants; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import de.cismet.cismap.commons.CrsTransformer; import de.cismet.cismap.commons.LayerConfig; import de.cismet.cismap.commons.XBoundingBox; import de.cismet.cismap.commons.capabilities.AbstractCapabilitiesTreeModel; import de.cismet.cismap.commons.featureservice.FeatureServiceUtilities; import de.cismet.cismap.commons.featureservice.H2FeatureService; import de.cismet.cismap.commons.featureservice.ShapeFolderTreeCellRenderer; import de.cismet.cismap.commons.featureservice.ShapeFolderTreeModel; import de.cismet.cismap.commons.featureservice.WFSCapabilitiesTreeCellRenderer; import de.cismet.cismap.commons.featureservice.WFSCapabilitiesTreeModel; import de.cismet.cismap.commons.featureservice.factory.H2FeatureServiceFactory; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.cismap.commons.interaction.MapBoundsListener; import de.cismet.cismap.commons.interaction.events.CapabilityEvent; import de.cismet.cismap.commons.internaldb.DBTableInformation; import de.cismet.cismap.commons.internaldb.InternalDbTree; import de.cismet.cismap.commons.preferences.CapabilitiesListTreeNode; import de.cismet.cismap.commons.preferences.CapabilitiesPreferences; import de.cismet.cismap.commons.preferences.CapabilityLink; import de.cismet.cismap.commons.raster.wms.WMSCapabilitiesTreeCellRenderer; import de.cismet.cismap.commons.raster.wms.WMSCapabilitiesTreeModel; import de.cismet.cismap.commons.wfs.capabilities.FeatureType; import de.cismet.cismap.commons.wfs.capabilities.WFSCapabilities; import de.cismet.cismap.commons.wfs.capabilities.WFSCapabilitiesFactory; import de.cismet.cismap.commons.wms.capabilities.*; import de.cismet.commons.security.AccessHandler; import de.cismet.security.WebAccessManager; import de.cismet.security.exceptions.RequestFailedException; import de.cismet.security.handler.WSSAccessHandler; import de.cismet.tools.CismetThreadPool; import de.cismet.tools.configuration.Configurable; import de.cismet.tools.gui.DefaultPopupMenuListener; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author thorsten.hell@cismet.de * @version $Revision$, $Date$ */ public class CapabilityWidget extends JPanel implements DropTargetListener, ChangeListener, ActionListener, Configurable, MapBoundsListener { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger( "de.cismet.cismap.commons.gui.capabilitywidget.CapabilityWidget"); // NOI18N //~ Instance fields -------------------------------------------------------- int selectedIndex = -1; private int maxServerNameLength = 14; private ImageIcon icoConnect = new ImageIcon(getClass().getResource( "/de/cismet/cismap/commons/gui/capabilitywidget/res/connect.png")); // NOI18N private ImageIcon icoConnected = new ImageIcon(getClass().getResource( "/de/cismet/cismap/commons/raster/wms/res/server.png")); // NOI18N private ImageIcon icoError = new ImageIcon(getClass().getResource( "/de/cismet/cismap/commons/gui/capabilitywidget/res/error.png")); // NOI18N private LinkedHashMap<LinkWithSubparent, JComponent> capabilityUrls = new LinkedHashMap<LinkWithSubparent, JComponent>(); private LinkedHashMap<JComponent, LinkWithSubparent> capabilityUrlsReverse = new LinkedHashMap<JComponent, LinkWithSubparent>(); private int acceptableActions = DnDConstants.ACTION_COPY_OR_MOVE; private HashMap<Component, WMSCapabilities> wmsCapabilities = new HashMap<Component, WMSCapabilities>(); private HashMap<Component, JTree> wmsCapabilitiesTrees = new HashMap<Component, JTree>(); private HashMap<Component, JTree> jdbcTrees = new HashMap<Component, JTree>(); private HashMap<Component, JTree> cidsTrees = new HashMap<Component, JTree>(); private HashMap<Component, WFSCapabilities> wfsCapabilities = new HashMap<Component, WFSCapabilities>(); private HashMap<Component, JTree> wfsCapabilitiesTrees = new HashMap<Component, JTree>(); private HashMap<Component, JTree> shapeFolderTrees = new HashMap<Component, JTree>(); private TreeSet<String> reverseAxisOrder = new TreeSet<String>(); private CapabilitiesPreferences preferences = new CapabilitiesPreferences(); private JPopupMenu capabilityList = new JPopupMenu(); private CapabilityWidget thisWidget = null; private Element serverElement; private JPopupMenu treePopMenu = new JPopupMenu(); private String filterString = null; // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cmdAddByUrl; private javax.swing.JButton cmdAddFromList; private javax.swing.JButton cmdCollapse; private javax.swing.JButton cmdRefresh; private javax.swing.JButton cmdRemove; private javax.swing.JPanel jPanel1; private javax.swing.JToolBar jToolBar1; private javax.swing.JTabbedPane tbpCapabilities; private javax.swing.JTextField txtSearch; // End of variables declaration//GEN-END:variables //~ Constructors ----------------------------------------------------------- /** * Creates new form CapabilityWidget. */ public CapabilityWidget() { thisWidget = this; initComponents(); tbpCapabilities.addChangeListener(this); tbpCapabilities.putClientProperty(Options.NO_CONTENT_BORDER_KEY, Boolean.FALSE); tbpCapabilities.setRequestFocusEnabled(false); cmdAddFromList.setComponentPopupMenu(capabilityList); final DropTarget dt = new DropTarget(this, acceptableActions, this); // tbpCapabilities.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); tbpCapabilities.setUI(new // WindowsTabbedPaneUI()); final JMenuItem pmenuItem = new JMenuItem(); pmenuItem.setAction(new AbstractAction() { { putValue( NAME, NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.CapabilityWidget().pmenuItem.text")); } @Override public void actionPerformed(final ActionEvent e) { JTree tree = wmsCapabilitiesTrees.get(tbpCapabilities.getSelectedComponent()); if (tree == null) { tree = wfsCapabilitiesTrees.get(tbpCapabilities.getSelectedComponent()); } if (tree == null) { tree = jdbcTrees.get(tbpCapabilities.getSelectedComponent()); } if (tree == null) { tree = cidsTrees.get(tbpCapabilities.getSelectedComponent()); } if (tree instanceof DragTree) { zoomToExtent((DragTree)tree); } else if (tree instanceof InternalDbTree) { zoomToExtent((InternalDbTree)tree); } } }); treePopMenu.add(pmenuItem); txtSearch.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(final DocumentEvent e) { check(txtSearch.getText()); } @Override public void removeUpdate(final DocumentEvent e) { check(txtSearch.getText()); } @Override public void changedUpdate(final DocumentEvent e) { check(txtSearch.getText()); } private void check(final String text) { filterString = text; addFilterToActiveTree(); } }); } //~ Methods ---------------------------------------------------------------- /** * Zooms the map to the extent of the selected elements of the given InternalDbTree, * * @param iTree DOCUMENT ME! */ private void zoomToExtent(final InternalDbTree iTree) { final DBTableInformation[] infos = iTree.getDBTableInformationOfSelectionPath(); Geometry geom = null; for (final DBTableInformation dbInfo : infos) { try { final H2FeatureService layer = new H2FeatureService(dbInfo.getName(), dbInfo.getDatabasePath(), dbInfo.getDatabaseTable(), null); layer.initAndWait(); final Geometry envelope = ((H2FeatureServiceFactory)layer.getFeatureFactory()).getEnvelope(); if (envelope != null) { if (geom == null) { geom = envelope; } else { geom = geom.union(envelope); } } } catch (Exception ex) { log.error("Error while creating H2FeatureService", ex); } } if (geom != null) { CismapBroker.getInstance().getMappingComponent().gotoBoundingBoxWithHistory(new XBoundingBox(geom)); } } /** * DOCUMENT ME! */ private void addFilterToActiveTree() { final JTree tree = getActiveTree(); if (tree != null) { final Object model = tree.getModel(); if (model instanceof StringFilter) { ((StringFilter)model).setFilterString(filterString); tree.updateUI(); } } } /** * Erzeugt ein neues Tab in der TabbedPane und stoesst das parsen der Capabilities-XML an, die ueber den Link * ansprechbar ist. * * @param link URL zur Capabilities-XML-Datei * @param subparent DOCUMENT ME! * @param interactive true, falls per Drag&Drop, sonst false */ private void processUrl(final String link, final String subparent, final boolean interactive) { if (Thread.getDefaultUncaughtExceptionHandler() == null) { if (log.isDebugEnabled()) { log.debug("uncaught exception handler registered"); } Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(final Thread t, final Throwable e) { log.error("uncaughtException: ", e); } }); } log.info("processURL: " + link); // NOI18N // Gibts diese URL schon? // Text im Tab der L\u00E4nge der URL anpassen String tabText; if ((subparent != null) && (subparent.trim().length() > 0)) { tabText = subparent; } else { if (link.startsWith("http://") && (link.length() > 21)) { // NOI18N tabText = link.substring(7, 21) + "..."; // NOI18N } else if (link.length() > 14) { tabText = link.substring(0, 14) + "..."; // NOI18N } else { tabText = link; } } final JPanel load = getNewWaitingPanel(tabText); final Object test = capabilityUrls.get(new LinkWithSubparent(link, subparent)); final String tabTextCopy = tabText; EventQueue.invokeLater(new Runnable() { @Override public void run() { if ((test != null) && (test instanceof JComponent)) { synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent((JComponent)test), load); } } final LinkWithSubparent linkObject = new LinkWithSubparent(link, subparent); capabilityUrls.put(linkObject, load); capabilityUrlsReverse.put(load, linkObject); synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextAddTab( tbpCapabilities, tabTextCopy, icoConnect, load); } tbpCapabilities.setSelectedComponent(load); // setOGCWMSCapabilitiesTree(link, tbpCapabilities.getComponentCount()-1); if (log.isDebugEnabled()) { log.debug( "link.toLowerCase().contains(service=wms)" + link.toLowerCase().contains("service=wms") + " link: " + link.toLowerCase()); } File shapeFolder = null; if (link.startsWith("file:")) { String uri = link; if (uri.endsWith("\r")) { uri = uri.substring(0, uri.length() - 1); } final File folderCandidate = new File(link.substring(7).trim()); if (folderCandidate.isDirectory()) { shapeFolder = folderCandidate; } } // TODO // should be refactored --> coomon parts like capabilities s if (shapeFolder != null) { // NOI18N addShapeFolderCapabilitiesTree(link, load, interactive, subparent); } else if (link.toLowerCase().contains("service=wfs")) { // NOI18N addOGCWFSCapabilitiesTree(link, load, interactive); } else if (link.toLowerCase().contains("service=wms")) { // NOI18N addOGCWMSCapabilitiesTree(link, load, interactive, subparent); } else if (link.toLowerCase().contains("service=wss")) { // NOI18N try { if (log.isDebugEnabled()) { log.debug("WSS Capabilties Link hinzugefügt"); // NOI18N } final URL url = new URL(link.substring(0, link.indexOf('?'))); if (log.isDebugEnabled()) { log.debug("URL des WSS: " + url.toString()); // NOI18N } if (!WebAccessManager.getInstance().isHandlerForURLRegistered(url)) { WebAccessManager.getInstance() .registerAccessHandler(url, AccessHandler.ACCESS_HANDLER_TYPES.WSS); } addOGCCapabilitiesTree(link, load, interactive); } catch (MalformedURLException ex) { log.error("Url is not wellformed no wss authentication possible", ex); // NOI18N } } else if (link.toLowerCase().contains("service=cids")) { addCidsCapabilitesTree(link, load, subparent); } else if (link.toLowerCase().contains("service=internal_db")) { addInternalDBCapabilitesTree(link, load, subparent); } else { // ToDo cleveres Probieren wenn z.B. nur die service URL angebenen wurde --> // getCapabiltiesrequest aufbauen und probieren log.info("service nicht spezifizierbar"); // NOI18N final Object[] alternatives = { "OGC-Web Mapping Service", "OGC-Web Feature Service", "OGC-Web Security Service" }; // NOI18N final Object selectedValue = JOptionPane.showInputDialog( StaticSwingTools.getParentFrame(CapabilityWidget.this), org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.processUrl(String,String,boolean).JOptionPane.message", new Object[] { link }), // NOI18N org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.processUrl(String,String,boolean).JOptionPane.title"), JOptionPane.INFORMATION_MESSAGE, null, alternatives, alternatives[0]); // NOI18N if (selectedValue == alternatives[0]) { linkObject.setService("WMS"); addOGCWMSCapabilitiesTree(link, load, interactive, subparent); } else if (selectedValue == alternatives[1]) { linkObject.setService("WFS"); addOGCWFSCapabilitiesTree(link, load, interactive); } else if (selectedValue == alternatives[2]) { try { if (log.isDebugEnabled()) { log.debug("WSS Capabilties Link hinzugefügt"); // NOI18N } URL url; if (link.indexOf('?') != -1) { url = new URL(link.substring(0, link.indexOf('?'))); } else { url = new URL(link); } if (log.isDebugEnabled()) { log.debug("URL des WSS: " + url.toString()); // NOI18N } if (!WebAccessManager.getInstance().isHandlerForURLRegistered(url)) { WebAccessManager.getInstance() .registerAccessHandler(url, AccessHandler.ACCESS_HANDLER_TYPES.WSS); } addOGCCapabilitiesTree(link, load, interactive); } catch (MalformedURLException ex) { log.error("Url is not wellformed no wss authentication possible", ex); // NOI18N } } else if (selectedValue == null) { tbpCapabilities.remove(load); capabilityUrls.remove(capabilityUrlsReverse.get(load)); capabilityUrlsReverse.remove(load); } else { addOGCWMSCapabilitiesTree(null, load, interactive, null); } } } }); } /** * Erzeugt ein neues Tab in der TabbedPane und st\u00F6\u00DFt das parsen der Capabilities-XML an, die \u00FCber den * Link ansprechbar ist. Ruft processUrl(link, true) auf. * * @param link URL zur Capabilities-XML-Datei * @param subparent DOCUMENT ME! */ public void processUrl(final String link, final String subparent) { processUrl(link, subparent, true); } /** * Called when the drag operation has terminated with a drop on the operable part of the drop site for the <code> * DropTarget</code> registered with this listener. * * <p>This method is responsible for undertaking the transfer of the data associated with the gesture. The <code> * DropTargetDropEvent</code> provides a means to obtain a <code>Transferable</code> object that represents the data * object(s) to be transfered.</p> * * <P>From this method, the <code>DropTargetListener</code> shall accept or reject the drop via the acceptDrop(int * dropAction) or rejectDrop() methods of the <code>DropTargetDropEvent</code> parameter.</P> * * <P>Subsequent to acceptDrop(), but not before, <code>DropTargetDropEvent</code>'s getTransferable() method may be * invoked, and data transfer may be performed via the returned <code>Transferable</code>'s getTransferData() * method.</P> * * <P>At the completion of a drop, an implementation of this method is required to signal the success/failure of the * drop by passing an appropriate <code>boolean</code> to the <code>DropTargetDropEvent</code>'s * dropComplete(boolean success) method.</P> * * <P>Note: The data transfer should be completed before the call to the <code>DropTargetDropEvent</code>'s * dropComplete(boolean success) method. After that, a call to the getTransferData() method of the <code> * Transferable</code> returned by <code>DropTargetDropEvent.getTransferable()</code> is guaranteed to succeed only * if the data transfer is local; that is, only if <code>DropTargetDropEvent.isLocalTransfer()</code> returns <code> * true</code>. Otherwise, the behavior of the call is implementation-dependent.</P> * * @param dtde the <code>DropTargetDropEvent</code> */ @Override public void drop(final DropTargetDropEvent dtde) { if (isDropOk(dtde)) { final String link = getLink(dtde); processUrl(link, null); } } /** * restliche unbenutzte DnD-Methoden. * * @param dte DOCUMENT ME! */ @Override public void dragExit(final DropTargetEvent dte) { } /** * DOCUMENT ME! * * @param dtde DOCUMENT ME! */ @Override public void dropActionChanged(final DropTargetDragEvent dtde) { } /** * DOCUMENT ME! * * @param dtde DOCUMENT ME! */ @Override public void dragOver(final DropTargetDragEvent dtde) { } /** * DOCUMENT ME! * * @param dtde DOCUMENT ME! */ @Override public void dragEnter(final DropTargetDragEvent dtde) { } /** * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The * content of this method is always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel1 = new javax.swing.JPanel(); jToolBar1 = new javax.swing.JToolBar(); cmdCollapse = new javax.swing.JButton(); cmdAddFromList = new javax.swing.JButton(); cmdAddByUrl = new javax.swing.JButton(); cmdRemove = new javax.swing.JButton(); cmdRefresh = new javax.swing.JButton(); txtSearch = new javax.swing.JTextField(); tbpCapabilities = StaticSwingTools.jTabbedPaneWithVerticalTextCreator( JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT); setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); setPreferredSize(new java.awt.Dimension(200, 250)); setLayout(new java.awt.BorderLayout()); jPanel1.setLayout(new java.awt.BorderLayout()); jToolBar1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); cmdCollapse.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/collapseTree.png"))); // NOI18N cmdCollapse.setToolTipText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdCollapse.toolTipText")); // NOI18N cmdCollapse.setMargin(new java.awt.Insets(2, 1, 2, 1)); cmdCollapse.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdCollapseActionPerformed(evt); } }); jToolBar1.add(cmdCollapse); cmdAddFromList.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/addServerFromList.png"))); // NOI18N cmdAddFromList.setToolTipText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdAddFromList.toolTipText")); // NOI18N cmdAddFromList.setMargin(new java.awt.Insets(2, 1, 2, 1)); cmdAddFromList.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdAddFromListActionPerformed(evt); } }); jToolBar1.add(cmdAddFromList); cmdAddByUrl.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/addServerFromUrl.png"))); // NOI18N cmdAddByUrl.setToolTipText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdAddByUrl.toolTipText")); // NOI18N cmdAddByUrl.setMargin(new java.awt.Insets(2, 1, 2, 1)); cmdAddByUrl.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdAddByUrlActionPerformed(evt); } }); jToolBar1.add(cmdAddByUrl); cmdRemove.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/tab_remove.png"))); // NOI18N cmdRemove.setToolTipText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdRemove.toolTipText")); // NOI18N cmdRemove.setMargin(new java.awt.Insets(2, 1, 2, 1)); cmdRemove.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdRemoveActionPerformed(evt); } }); jToolBar1.add(cmdRemove); cmdRefresh.setIcon(new javax.swing.ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/refresh.png"))); // NOI18N cmdRefresh.setToolTipText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdRefresh.toolTipText")); // NOI18N cmdRefresh.setMargin(new java.awt.Insets(2, 1, 2, 1)); cmdRefresh.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(final java.awt.event.ActionEvent evt) { cmdRefreshActionPerformed(evt); } }); jToolBar1.add(cmdRefresh); txtSearch.setToolTipText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.txtSearch.tooltip")); // NOI18N jToolBar1.add(txtSearch); jPanel1.add(jToolBar1, java.awt.BorderLayout.CENTER); add(jPanel1, java.awt.BorderLayout.NORTH); tbpCapabilities.setBorder(javax.swing.BorderFactory.createEmptyBorder(2, 2, 2, 2)); tbpCapabilities.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT); tbpCapabilities.setPreferredSize(new java.awt.Dimension(180, 400)); tbpCapabilities.addChangeListener(new javax.swing.event.ChangeListener() { @Override public void stateChanged(final javax.swing.event.ChangeEvent evt) { tbpCapabilitiesStateChanged(evt); } }); add(tbpCapabilities, java.awt.BorderLayout.CENTER); } // </editor-fold>//GEN-END:initComponents /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdAddFromListActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdAddFromListActionPerformed capabilityList.show(cmdAddFromList, 0, cmdAddFromList.getHeight()); capabilityList.setVisible(true); } //GEN-LAST:event_cmdAddFromListActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdRefreshActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdRefreshActionPerformed final JTree active = getActiveTree(); if (active != null) { final LinkWithSubparent link = capabilityUrlsReverse.get(tbpCapabilities.getSelectedComponent()); addLinkManually(link); } } //GEN-LAST:event_cmdRefreshActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdAddByUrlActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdAddByUrlActionPerformed final String input = JOptionPane.showInputDialog( StaticSwingTools.getParentFrame(this), org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdAddByUrlActionPerformed().JOptionPane.message"), // NOI18N org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.cmdAddByUrlActionPerformed().JOptionPane.title"), // NOI18N JOptionPane.INFORMATION_MESSAGE); if (input != null) { processUrl(input, null, true); } } //GEN-LAST:event_cmdAddByUrlActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdRemoveActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdRemoveActionPerformed removeActiveCapabilityTree(); } //GEN-LAST:event_cmdRemoveActionPerformed /** * Entfernt einen Capability-Baum aus der TabbedPane. */ private void removeActiveCapabilityTree() { final JTree active = getActiveTree(); if (active != null) { if (log.isDebugEnabled()) { log.debug("active = " + active); // NOI18N } // ToDo wenn das hier nur bei einem aktivierten Tree gemacht wird kann der link nicht mehr hinzugefügt // werden final LinkWithSubparent link = capabilityUrlsReverse.get(tbpCapabilities.getSelectedComponent()); capabilityUrls.remove(link); capabilityUrlsReverse.remove(tbpCapabilities.getSelectedComponent()); if (wmsCapabilities.get(tbpCapabilities.getSelectedComponent()) != null) { if (log.isDebugEnabled()) { log.debug("Entferne WMSCapabilities-Tree"); // NOI18N } wmsCapabilities.remove(tbpCapabilities.getSelectedComponent()); wmsCapabilitiesTrees.remove(tbpCapabilities.getSelectedComponent()); tbpCapabilities.remove(tbpCapabilities.indexOfComponent(tbpCapabilities.getSelectedComponent())); } else if (wfsCapabilities.get(tbpCapabilities.getSelectedComponent()) != null) { if (log.isDebugEnabled()) { log.debug("Entferne WFSCapabilities-Tree"); // NOI18N } wfsCapabilities.remove(tbpCapabilities.getSelectedComponent()); wfsCapabilitiesTrees.remove(tbpCapabilities.getSelectedComponent()); tbpCapabilities.remove(tbpCapabilities.indexOfComponent(tbpCapabilities.getSelectedComponent())); } else if (jdbcTrees.get(tbpCapabilities.getSelectedComponent()) != null) { jdbcTrees.remove(tbpCapabilities.getSelectedComponent()); tbpCapabilities.remove(tbpCapabilities.getSelectedComponent()); } else if (cidsTrees.get(tbpCapabilities.getSelectedComponent()) != null) { cidsTrees.remove(tbpCapabilities.getSelectedComponent()); tbpCapabilities.remove(tbpCapabilities.getSelectedComponent()); } else if (shapeFolderTrees.get(tbpCapabilities.getSelectedComponent()) != null) { shapeFolderTrees.remove(tbpCapabilities.getSelectedComponent()); tbpCapabilities.remove(tbpCapabilities.getSelectedComponent()); } else { log.warn("Keine Component zum entfernen aktiv"); // NOI18N } } else { if (log.isDebugEnabled()) { log.debug("kein Baum aktiv, entferne selektierten Reiter"); // NOI18N } if (tbpCapabilities.getSelectedComponent() != null) { final LinkWithSubparent link = capabilityUrlsReverse.get(tbpCapabilities.getSelectedComponent()); capabilityUrls.remove(link); capabilityUrlsReverse.remove(tbpCapabilities.getSelectedComponent()); wmsCapabilities.remove(tbpCapabilities.getSelectedComponent()); wfsCapabilities.remove(tbpCapabilities.getSelectedComponent()); jdbcTrees.remove(tbpCapabilities.getSelectedComponent()); cidsTrees.remove(tbpCapabilities.getSelectedComponent()); shapeFolderTrees.remove(tbpCapabilities.getSelectedComponent()); tbpCapabilities.remove(tbpCapabilities.getSelectedComponent()); } else { log.warn("The link was not removed from the capabilitiyURLs"); } } } /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void cmdCollapseActionPerformed(final java.awt.event.ActionEvent evt) { //GEN-FIRST:event_cmdCollapseActionPerformed final JTree active = getActiveTree(); if (active != null) { int row = active.getRowCount() - 1; while (row > 0) { active.collapseRow(row); row--; } } } //GEN-LAST:event_cmdCollapseActionPerformed /** * DOCUMENT ME! * * @param evt DOCUMENT ME! */ private void tbpCapabilitiesStateChanged(final javax.swing.event.ChangeEvent evt) { //GEN-FIRST:event_tbpCapabilitiesStateChanged addFilterToActiveTree(); } //GEN-LAST:event_tbpCapabilitiesStateChanged /** * Liefert den momentan selektierten Capabilties-Baum. * * @return selektierter Capabilties-Baum */ private JTree getActiveTree() { if (wmsCapabilitiesTrees.get(tbpCapabilities.getSelectedComponent()) != null) { return wmsCapabilitiesTrees.get(tbpCapabilities.getSelectedComponent()); } else if (wfsCapabilitiesTrees.get(tbpCapabilities.getSelectedComponent()) != null) { return wfsCapabilitiesTrees.get(tbpCapabilities.getSelectedComponent()); } else if (jdbcTrees.get(tbpCapabilities.getSelectedComponent()) != null) { return jdbcTrees.get(tbpCapabilities.getSelectedComponent()); } else if (cidsTrees.get(tbpCapabilities.getSelectedComponent()) != null) { return cidsTrees.get(tbpCapabilities.getSelectedComponent()); } else if (shapeFolderTrees.get(tbpCapabilities.getSelectedComponent()) != null) { return shapeFolderTrees.get(tbpCapabilities.getSelectedComponent()); } else { return null; } } /** * refreshs all open JDBCtrees. */ public void refreshJdbcTrees() { final Set<Component> keys = new HashSet(jdbcTrees.keySet()); for (final Component key : keys) { final JTree jdbcTree = jdbcTrees.get(key); if (jdbcTree instanceof InternalDbTree) { ((InternalDbTree)jdbcTree).refresh(); } } } /** * Testmethode, um das Widget Standalone zu testen. * * @param args Parameter */ public static void main(final String[] args) { try { org.apache.log4j.PropertyConfigurator.configure(ClassLoader.getSystemResource( "/de/cismet/cismap/commons/demo/log4j.properties")); // NOI18N } catch (Exception e) { e.printStackTrace(); } try { UIManager.setLookAndFeel(new PlasticXPLookAndFeel()); } catch (Exception e) { log.warn("Error while setting LookAndFeel", e); // NOI18N } EventQueue.invokeLater(new Runnable() { @Override public void run() { final JFrame f = new JFrame(); f.getContentPane().add(new CapabilityWidget()); f.pack(); f.setVisible(true); f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); } }); } /** * Testet, ob ein g\u00FCltiges Objekt in das CapabilityWidget gezogen wurde. * * @param e DropEvent * * @return true, falls g\u00FCltiges Objekt, sonst false */ private boolean isDropOk(final DropTargetDropEvent e) { if (e.isDataFlavorSupported(DataFlavor.getTextPlainUnicodeFlavor()) || e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { return true; } else { return false; } } /** * Extrahiert die URL aus dem auf das Widget gezogenen Objekt. * * @param dtde DropEvent * * @return URL als String-Objekt */ private String getLink(final DropTargetDropEvent dtde) { String link = null; try { dtde.acceptDrop(acceptableActions); if (dtde.isDataFlavorSupported(DataFlavor.getTextPlainUnicodeFlavor())) { final Object data = dtde.getTransferable().getTransferData(DataFlavor.getTextPlainUnicodeFlavor()); if (data instanceof InputStream) { final InputStream input = (InputStream)data; final InputStreamReader isr = new InputStreamReader(input); final StringBuffer str = new StringBuffer(); int in = -1; try { while ((in = isr.read()) >= 0) { if (in != 0) { str.append((char)in); } } link = str.toString(); } catch (IOException ioe) { /* * bug #4094987 sun.io.MalformedInputException: Missing byte-order mark e.g. if dragging from MS * Word 97 to Java still a bug in 1.2 final */ System.err.println("cannot read" + ioe); // NOI18N dtde.dropComplete(false); final String message = org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.getLink(DropTargetDropEvent).message", new Object[] { ioe.getMessage() }); // NOI18N JOptionPane.showMessageDialog( StaticSwingTools.getParentFrame(this), message, org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.getLink(DropTargetDropEvent).title"), // NOI18N JOptionPane.ERROR_MESSAGE); return null; } } // Wir gehen davon aus, dass der Link Title immer in der 2ten Zeile steht try { link = link.substring(0, link.indexOf("\n")); // NOI18N } catch (Exception e) { } return link; } else { final Object data = dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor); if (data instanceof List) { if (((List)data).size() > 0) { final File f = (File)((List)data).get(0); link = "file://" + f.getAbsolutePath(); } } } } catch (Exception e) { e.printStackTrace(); } return link; } /** * DOCUMENT ME! * * @param tabTitle DOCUMENT ME! * * @return DOCUMENT ME! */ private JPanel getNewWaitingPanel(final String tabTitle) { final JPanel panLoad = new JPanel(); final JLabel lblWorld = new JLabel(); final JLabel lblLoading = new JLabel(); final JPanel panFillTop = new JPanel(); final JPanel panFillBottom = new JPanel(); panLoad.setLayout(new GridBagLayout()); panLoad.putClientProperty("tabTitle", tabTitle); // NOI18N lblWorld.setHorizontalAlignment(SwingConstants.CENTER); lblWorld.setIcon(new ImageIcon( getClass().getResource("/de/cismet/cismap/commons/gui/capabilitywidget/res/load.png"))); // NOI18N lblWorld.setVerticalAlignment(SwingConstants.TOP); GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panLoad.add(lblWorld, gridBagConstraints); lblLoading.setText(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.lblLoading.text")); // NOI18N gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = GridBagConstraints.NORTH; panLoad.add(lblLoading, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.3; panLoad.add(panFillTop, gridBagConstraints); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.fill = GridBagConstraints.BOTH; gridBagConstraints.weighty = 1.0; panLoad.add(panFillBottom, gridBagConstraints); return panLoad; } /** * DOCUMENT ME! * * @param link DOCUMENT ME! * @param comp DOCUMENT ME! * @param subparent DOCUMENT ME! */ private void addCidsCapabilitesTree(final String link, final JComponent comp, final String subparent) { final Runnable r = new Runnable() { @Override public void run() { try { final Class treeRendererClass = Class.forName( "de.cismet.cismap.cidslayer.CidsCapabilitesTreeCellRenderer"); final Class treeModelClass = Class.forName("de.cismet.cismap.cidslayer.CidsLayerTreeModel"); // final Class treeModelClass = ClassLoader.getSystemClassLoader() // .loadClass("de.cismet.cismap.cidslayer.CidsLayerTreeModel"); // final Class treeRendererClass = ClassLoader.getSystemClassLoader() // .loadClass("de.cismet.cismap.cidslayer.CidsCapabilitesTreeCellRenderer"); final String[] args = link.split("[=&]"); String domain = ""; String rootName = ""; for (int i = 0; i < args.length; i++) { if (args[i].equalsIgnoreCase("domain") && ((i + 1) < args.length)) { domain = args[i + 1]; } if (args[i].equalsIgnoreCase("title") && ((i + 1) < args.length)) { rootName = args[i + 1]; } } if (domain.isEmpty()) { tbpCapabilities.remove(comp); return; } final String title = rootName; final TreeModel tm = (TreeModel)treeModelClass.getConstructor(String.class, String.class) .newInstance(domain, title); final TreeCellRenderer tcr = (TreeCellRenderer)treeRendererClass.newInstance(); final DragTree tree = new DragTree(); final DropTarget dt = new DropTarget(tree, acceptableActions, thisWidget); EventQueue.invokeLater(new Runnable() { @Override public void run() { addPopupMenu(tree); tree.setModel(tm); tree.setBorder(new EmptyBorder(1, 1, 1, 1)); tree.setCellRenderer(tcr); final JScrollPane sPane = new JScrollPane(); sPane.setViewportView(tree); sPane.setBorder(new EmptyBorder(1, 1, 1, 1)); StaticSwingTools.setNiftyScrollBars(sPane); synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent(comp), sPane); } cidsTrees.put(sPane, tree); stateChanged(null); capabilityUrls.put(new LinkWithSubparent(link, subparent), sPane); capabilityUrlsReverse.put(sPane, new LinkWithSubparent(link, subparent)); sPane.putClientProperty("tabTitle", title); synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, title, icoConnect, Color.black, sPane); } /*synchronized(this) { * tbpCapabilities.setToolTipTextAt(tbpCapabilities.indexOfComponent(sPane), );}*/ stateChanged(null); } }); } catch (Exception ex) { tbpCapabilities.remove(comp); final JComponent jc = capabilityUrls.get(new LinkWithSubparent(link, null)); capabilityUrls.remove(new LinkWithSubparent(link, null)); capabilityUrlsReverse.remove(jc); log.error("Error while adding cids capabilites tree", ex); } } }; CismetThreadPool.execute(new Thread(r, "CapabilityWidget addCidsCapabilitesTree()")); /*try { * treeModelClass = * ClassLoader.getSystemClassLoader().loadClass("de.cismet.cismap.cidslayer.CidsLayerTreeModel"); final * TreeModel tm = (TreeModel) treeModelClass.getConstructor(String.class).newInstance(cl.getLink()); final * DragTree tree = new DragTree(); final DropTarget dt = new DropTarget(tree, acceptableActions, thisWidget); * //final ListMenuItem lmi = new ListMenuItem("cidsLayer", cl); lmi.addActionListener(new ActionListener() { * @Override public void actionPerformed(ActionEvent e) { * * } }); menu.add(lmi); } catch (ClassNotFoundException ex) { log.error("ClassNotFoundException", ex); } catch * (NoSuchMethodException ex) { log.error("NoSuchMethodException", ex); } catch (SecurityException ex) { * log.error("SecurityException", ex); } catch (InstantiationException ex) { log.error("InstantiationException", * ex); } catch (IllegalAccessException ex) { log.error("IllegalAccessException", ex); } catch * (IllegalArgumentException ex) { log.error("IllegalArgumentException", ex); } catch (InvocationTargetException * ex) { * log.error("InvocationTargetException", ex);}*/ } /** * DOCUMENT ME! * * @param link DOCUMENT ME! * @param comp DOCUMENT ME! * @param subparent DOCUMENT ME! */ private void addInternalDBCapabilitesTree(final String link, final JComponent comp, final String subparent) { final Runnable r = new Runnable() { @Override public void run() { try { final int index = link.lastIndexOf("?"); String databasePath = link; if (index != -1) { databasePath = link.substring(0, index); } if (databasePath.startsWith("file://")) { databasePath = databasePath.substring("file://".length()); } final String title = NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addInternalDBCapabilitiesTree.title"); final String dbPath = databasePath; final InternalDbTree tree = new InternalDbTree(databasePath); // final DropTarget dt = new DropTarget(tree, acceptableActions, thisWidget); EventQueue.invokeLater(new Runnable() { @Override public void run() { tree.setBorder(new EmptyBorder(1, 1, 1, 1)); final JScrollPane sPane = new JScrollPane(); sPane.setViewportView(tree); sPane.setBorder(new EmptyBorder(1, 1, 1, 1)); StaticSwingTools.setNiftyScrollBars(sPane); synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent(comp), sPane); } jdbcTrees.put(sPane, tree); stateChanged(null); capabilityUrls.put(new LinkWithSubparent(link, subparent), sPane); capabilityUrlsReverse.put(sPane, new LinkWithSubparent(link, subparent)); sPane.putClientProperty("tabTitle", title); synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, title, icoConnect, Color.black, sPane); } stateChanged(null); } }); } catch (Exception ex) { tbpCapabilities.remove(comp); final JComponent jc = capabilityUrls.get(new LinkWithSubparent(link, null)); capabilityUrls.remove(new LinkWithSubparent(link, null)); capabilityUrlsReverse.remove(jc); log.error("Error while adding internal db tree.", ex); } } }; CismetThreadPool.execute(new Thread(r, "CapabilityWidget addInternalDBCapabilitesTree()")); } /** * Erzeugt den Baum aus der geparsten Capabilities-XML und f\u00FCgt ihn der TabbedPane hinzu. * * @param link Capabilites-URL * @param comp Component * @param interactive true, falls per Drag&Drop, sonst false * @param subparent DOCUMENT ME! */ private void addShapeFolderCapabilitiesTree(final String link, final JComponent comp, final boolean interactive, final String subparent) { if (log.isDebugEnabled()) { log.debug("addShapeFolderCapabilitiesTree()"); // NOI18N } final Runnable r = new Runnable() { @Override public void run() { try { final DragTree trvCap = new DragTree(); final ShapeFolderTreeModel tm = new ShapeFolderTreeModel(link); final DropTarget dt = new DropTarget(trvCap, acceptableActions, thisWidget); EventQueue.invokeLater(new Runnable() { @Override public void run() { addPopupMenu(trvCap); trvCap.setModel(tm); trvCap.setBorder(new EmptyBorder(1, 1, 1, 1)); trvCap.setCellRenderer(new ShapeFolderTreeCellRenderer()); final JScrollPane sPane = new JScrollPane(); sPane.setViewportView(trvCap); sPane.setBorder(new EmptyBorder(1, 1, 1, 1)); StaticSwingTools.setNiftyScrollBars(sPane); synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent(comp), sPane); } // wmsCapabilities.put(sPane, cap); shapeFolderTrees.put(sPane, trvCap); stateChanged(null); capabilityUrls.put(new LinkWithSubparent(link, subparent), sPane); capabilityUrlsReverse.put(sPane, new LinkWithSubparent(link, subparent)); String title = link.substring(link.lastIndexOf("/")); if (subparent != null) { title = subparent; } final String titleOrig = title; if (title.length() > 0) { if (title.length() > maxServerNameLength) { title = title.substring(0, maxServerNameLength - 3) + "..."; // NOI18N } sPane.putClientProperty("tabTitle", title); // NOI18N synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, title, icoConnected, Color.black, sPane); } synchronized (this) { tbpCapabilities.setToolTipTextAt( tbpCapabilities.indexOfComponent(sPane), titleOrig); } stateChanged(null); } } }); } catch (Throwable e) { log.error("Error while creating the ShapeFolder tree", e); // NOI18N String message = ""; // NOI18N tbpCapabilities.setIconAt(tbpCapabilities.indexOfComponent(comp), icoError); if ((e instanceof RequestFailedException) || (e.getMessage() == null) || e.getMessage().equals("null")) { // NOI18N message = e.getCause().getMessage(); } else { message = e.getMessage(); } if (interactive) { final ErrorInfo ei = new ErrorInfo(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addShapeFolderTree.JOptionPane.title"), // NOI18N org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addShapeFolderTree.JOptionPane.message"), // NOI18N null, null, e, Level.SEVERE, null); JXErrorPane.showDialog(thisWidget, ei); } // TODO: Error \u00FCber die Statuszeile bekanntgeben log.error("Error while loading Shape folder: " + message, e); // NOI18N tbpCapabilities.remove(tbpCapabilities.indexOfComponent(comp)); final JComponent jc = capabilityUrls.get(new LinkWithSubparent(link, null)); capabilityUrls.remove(new LinkWithSubparent(link, null)); capabilityUrlsReverse.remove(jc); } } }; CismetThreadPool.execute(new Thread(r, "CapabilityWidget addShapeFolderCapabilitiesTree()")); } /** * Erzeugt einen WMS-Baum aus der geparsten Capabilities-XML und f\u00FCgt ihn der TabbedPane hinzu. * * @param link Capabilites-URL * @param comp Component * @param subparent DOCUMENT ME! */ private void addOGCWMSCapabilitiesTree(final String link, final JComponent comp, final String subparent) { addOGCWMSCapabilitiesTree(link, comp, true, subparent); } /** * Falls ein Link manuell \u00FCber einen Dialog eingegeben wurde. * * @param link Capability-Link */ private void addLinkManually(final LinkWithSubparent link) { processUrl(link.getLink(), link.getSubparent(), false); } /** * Erzeugt den Baum aus der geparsten Capabilities-XML und f\u00FCgt ihn der TabbedPane hinzu. * * @param link Capabilites-URL * @param comp Component * @param interactive true, falls per Drag&Drop, sonst false * @param subparent DOCUMENT ME! */ private void addOGCWMSCapabilitiesTree(final String link, final JComponent comp, final boolean interactive, final String subparent) { if (log.isDebugEnabled()) { log.debug("addOGCWMSCapabilitiesTree()"); // NOI18N } final Runnable r = new Runnable() { @Override public void run() { try { final DragTree trvCap = new DragTree(); final WMSCapabilitiesFactory capFact = new WMSCapabilitiesFactory(); final CismapBroker broker = CismapBroker.getInstance(); if (log.isDebugEnabled()) { log.debug("Capability Widget: Creating WMScapabilities for URL: " + link); // NOI18N } // final WMSCapabilities cap = // capFact.createCapabilities(HttpAuthentication.getInputStreamReaderFromURL(CapabilityWidget.this, // getCapURL)); final WMSCapabilities cap = capFact.createCapabilities(link); if (log.isDebugEnabled()) { log.debug("finished creating Capabilties"); // NOI18N } // TODO for WFS ToDo funktionalität abgeschaltet steckt zur zeit in CismetGUICommons --> // refactoring broker.addHttpCredentialProviderCapabilities(cap, // broker.getHttpCredentialProviderURL(getCapURL)); if (broker.isServerSecuredByPassword(cap)) { // broker.addProperty(getCapURL.toString(), cap.getCapability().getLayer().getTitle()); } trvCap.setWmsCapabilities(cap); final WMSCapabilitiesTreeModel tm = new WMSCapabilitiesTreeModel(cap, subparent); final DropTarget dt = new DropTarget(trvCap, acceptableActions, thisWidget); EventQueue.invokeLater(new Runnable() { @Override public void run() { addPopupMenu(trvCap); trvCap.setModel(tm); trvCap.setBorder(new EmptyBorder(1, 1, 1, 1)); trvCap.setCellRenderer(new WMSCapabilitiesTreeCellRenderer()); final JScrollPane sPane = new JScrollPane(); sPane.setViewportView(trvCap); sPane.setBorder(new EmptyBorder(1, 1, 1, 1)); StaticSwingTools.setNiftyScrollBars(sPane); synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent(comp), sPane); } wmsCapabilities.put(sPane, cap); wmsCapabilitiesTrees.put(sPane, trvCap); stateChanged(null); capabilityUrls.put(new LinkWithSubparent(link, subparent), sPane); capabilityUrlsReverse.put(sPane, new LinkWithSubparent(link, subparent)); String title = cap.getLayer().getTitle().trim(); if (subparent != null) { title = subparent; } final String titleOrig = title; if (title.length() > 0) { if (title.length() > maxServerNameLength) { title = title.substring(0, maxServerNameLength - 3) + "..."; // NOI18N } sPane.putClientProperty("tabTitle", title); // NOI18N synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, title, icoConnected, Color.black, sPane); } synchronized (this) { tbpCapabilities.setToolTipTextAt( tbpCapabilities.indexOfComponent(sPane), titleOrig); } stateChanged(null); } } }); } catch (Throwable e) { log.error("Fehler während dem Erstellen des WMSCapabilties Baums", e); // NOI18N String message = ""; // NOI18N tbpCapabilities.setIconAt(tbpCapabilities.indexOfComponent(comp), icoError); if ((e instanceof RequestFailedException) || (e.getMessage() == null) || e.getMessage().equals("null")) { // NOI18N message = e.getCause().getMessage(); } else { message = e.getMessage(); } if (interactive) { final ErrorInfo ei = new ErrorInfo(org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addOGCWMSCapabilitiesTree.JOptionPane.title"), // NOI18N org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addOGCWMSCapabilitiesTree.JOptionPane.message"), // NOI18N null, null, e, Level.SEVERE, null); JXErrorPane.showDialog(thisWidget, ei); } // TODO: Error \u00FCber die Statuszeile bekanntgeben log.error("Error while loading server capabilities: " + message, e); // NOI18N tbpCapabilities.remove(tbpCapabilities.indexOfComponent(comp)); final JComponent jc = capabilityUrls.get(new LinkWithSubparent(link, null)); capabilityUrls.remove(new LinkWithSubparent(link, null)); capabilityUrlsReverse.remove(jc); } } }; CismetThreadPool.execute(new Thread(r, "CapabilityWidget addOGCWMSCapabilitiesTree()")); } /** * DOCUMENT ME! * * @param link DOCUMENT ME! * @param comp DOCUMENT ME! * @param interactive DOCUMENT ME! */ public void addOGCCapabilitiesTree(final String link, final JComponent comp, final boolean interactive) { if (log.isDebugEnabled()) { log.debug("addOGCCapabilitiesTree()"); // NOI18N } final Runnable r = new Runnable() { @Override public void run() { try { final DragTree trvCap = new DragTree(); addPopupMenu(trvCap); // ToDo outsource/generalise method // URL-String als URL speichern final URL getCapURL = new URL(link); URL postURL; // WFSCapabilities aus dem \u00FCbergebenen Link (liefert XML-Dok) parsen // log.debug("Versuche WFSCapabilities zu parsen"); if (link.indexOf('?') > 0) { postURL = new URL(link.substring(0, link.indexOf('?'))); } else { postURL = getCapURL; } final URL finalPostUrl = postURL; // final WFSOperator op = new WFSOperator(); // final WFSCapabilities cap = op.parseWFSCapabilites(postURL); // // // Hashmap mit den FeatureLayer-Attributen erzeugen // log.debug("Erzeuge WFSCapabilitiesTreeModel"); // final WFSCapabilitiesTreeModel tm = new WFSCapabilitiesTreeModel(cap); // tm.setFeatureTypes(op.getElements(postURL, cap.getFeatureTypeList())); // Den WFSTree als DropTarget spezifizieren // final AbstractCapabilitiesTreeModel capTreeModel = passwordDialog.getCapabilitiesTree(); final DropTarget dt = new DropTarget(trvCap, acceptableActions, thisWidget); final AbstractCapabilitiesTreeModel capTreeModel; // TODO!!! Wenn beim abrufen der Capabillities der neue Server entfernt wird --> kann er nicht // mehr hinzugefügt werden kann final AccessHandler handler = WebAccessManager.getInstance().getHandlerForURL(finalPostUrl); final String securedServiceType = ((WSSAccessHandler)handler).getSecuredServiceTypeForURL( finalPostUrl); if (securedServiceType != null) { if (log.isDebugEnabled()) { log.debug("SecuredServiceType des WSS konnte bestimmt werden: " + securedServiceType); // NOI18N } if (securedServiceType.equals(WSSAccessHandler.SECURED_SERVICE_TYPE.WFS.toString())) { if (log.isDebugEnabled()) { log.debug("Gesicheter Service ist ein: " + WSSAccessHandler.SECURED_SERVICE_TYPE.WFS); // NOI18N log.debug("Capability Widget: Creating WFScapabilities for URL: " + finalPostUrl.toString()); // NOI18N } // InputStream result = WebAccessManager.getInstance().doRequest(finalPostUrl, new StringReader("?REQUEST=GetCapabilities&service=WFS"), AccessHandler.ACCESS_METHODS.GET_REQUEST); // final WFSOperator op = new WFSOperator(); // final WFSCapabilities capWFS = op.parseWFSCapabilites(new BufferedReader(new InputStreamReader(result))); // log.debug("Erstelle WFSCapabilitiesTreeModel"); // !!!ToDo WebAccessMananger testen final WFSCapabilitiesFactory capFact = new WFSCapabilitiesFactory(); final WFSCapabilities cap = capFact.createCapabilities(link); final String name = FeatureServiceUtilities.getServiceName(cap); capTreeModel = new WFSCapabilitiesTreeModel(cap); capTreeModel.setServiceName(name); // ((WFSCapabilitiesTreeModel) // capTreeModel).setFeatureTypes(op.getElements(finalPostUrl, // capWFS.getFeatureTypeList())); } else if (securedServiceType.equals( WSSAccessHandler.SECURED_SERVICE_TYPE.WMS.toString())) { if (log.isDebugEnabled()) { log.debug("Gesicheter Service ist ein: " + WSSAccessHandler.SECURED_SERVICE_TYPE.WMS); // NOI18N } try { final WMSCapabilitiesFactory capFact = new WMSCapabilitiesFactory(); if (log.isDebugEnabled()) { log.debug("Capability Widget: Creating WMScapabilities for URL: " + link); // NOI18N } // ToDO Langsam final WMSCapabilities capWMS = capFact.createCapabilities(link); if (log.isDebugEnabled()) { log.debug("Erstelle WMSCapabilitiesTreeModel"); // NOI18N } capTreeModel = new WMSCapabilitiesTreeModel(capWMS); capTreeModel.setServiceName(capWMS.getLayer().getTitle().trim()); } catch (Exception ex) { log.error("Exception during doRequest cause: ", ex); // NOI18N return; } } else { if (log.isDebugEnabled()) { log.debug("Gesicherter Service ist von unbekanntem Typ."); // NOI18N } return; } } else { log.warn("SecuredServiceType des WSS konnte nicht bestimmt werden"); // NOI18N return; } // ToDo Listener oder sonstwas damit das retrieval auch abgebrochen wird if (tbpCapabilities.indexOfComponent(comp) == -1) { log.info("Ladepanel ist nicht mehr in TabbedPane --> retrieval wird abgebrochen"); // NOI18N final LinkWithSubparent link = capabilityUrlsReverse.get(comp); capabilityUrls.remove(link); capabilityUrlsReverse.remove(comp); if (wmsCapabilities.get(comp) != null) { if (log.isDebugEnabled()) { log.debug("Entferne WMSCapabilities-Tree"); // NOI18N } wmsCapabilities.remove(comp); wmsCapabilitiesTrees.remove(comp); tbpCapabilities.remove(tbpCapabilities.indexOfComponent(comp)); } else if (wfsCapabilities.get(comp) != null) { if (log.isDebugEnabled()) { log.debug("Entferne WFSCapabilities-Tree"); // NOI18N } wfsCapabilities.remove(comp); wfsCapabilitiesTrees.remove(comp); tbpCapabilities.remove(comp); } else if (shapeFolderTrees.get(comp) != null) { shapeFolderTrees.remove(comp); } else { log.warn("Keine Component zum entfernen aktiv"); // NOI18N } return; } else { if (log.isDebugEnabled()) { log.debug("Capabilitespanel noch vorhanden --> stelle baum dar"); // NOI18N } } EventQueue.invokeLater(new Runnable() { @Override public void run() { // broker.addHttpCredentialProviderCapabilities(cap, // broker.getHttpCredentialProviderURL(url)); ToDO subparent final String name = capTreeModel.getServiceName(); if (log.isDebugEnabled()) { log.debug("ServiceName: " + name); // NOI18N } trvCap.setModel(capTreeModel); trvCap.setBorder(new EmptyBorder( 1, 1, 1, 1)); final JScrollPane sPane = new JScrollPane(); sPane.setViewportView(trvCap); sPane.setBorder( new EmptyBorder(1, 1, 1, 1)); StaticSwingTools.setNiftyScrollBars(sPane); synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent(comp), sPane); } // ToDo generalize --> getCapabilities of AbstractCapabilitiesTreeModel if (capTreeModel instanceof WMSCapabilitiesTreeModel) { if (log.isDebugEnabled()) { log.debug("WMSTree"); // NOI18N } wmsCapabilities.put( sPane, ((WMSCapabilitiesTreeModel)capTreeModel).getCapabilities()); wmsCapabilitiesTrees.put(sPane, trvCap); trvCap.setWmsCapabilities( ((WMSCapabilitiesTreeModel)capTreeModel).getCapabilities()); trvCap.setCellRenderer(new WMSCapabilitiesTreeCellRenderer()); stateChanged(null); } else if (capTreeModel instanceof WFSCapabilitiesTreeModel) { if (log.isDebugEnabled()) { log.debug("WFSTree"); // NOI18N } wfsCapabilities.put( sPane, ((WFSCapabilitiesTreeModel)capTreeModel).getCapabilities()); wfsCapabilitiesTrees.put(sPane, trvCap); trvCap.setCellRenderer(new WFSCapabilitiesTreeCellRenderer(name)); stateChanged(null); } else { // Throw exception } capabilityUrls.put(new LinkWithSubparent(link, null), sPane); capabilityUrlsReverse.put(sPane, new LinkWithSubparent(link, null)); String title = name; final String titleOrig = title; if (title.length() > 0) { if (title.length() > maxServerNameLength) { title = title.substring(0, maxServerNameLength - 3) + "..."; // NOI18N } sPane.putClientProperty("tabTitle", title); // NOI18N synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, title, icoConnected, Color.black, sPane); } synchronized (this) { tbpCapabilities.setToolTipTextAt( tbpCapabilities.indexOfComponent(sPane), titleOrig); } stateChanged(null); } } }); } catch (Throwable e) { String message = ""; // NOI18N tbpCapabilities.setIconAt(tbpCapabilities.indexOfComponent(comp), icoError); if ((e.getMessage() == null) || e.getMessage().equals("null")) { // NOI18N message = e.getCause().getMessage(); } else { message = e.getMessage(); } if (interactive) { JOptionPane.showMessageDialog( StaticSwingTools.getParentFrame(thisWidget), org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addOGCCapabilitiesTree(String,JComponent,boolean).JOptionPane.message", new Object[] { message }), // NOI18N org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addOGCCapabilitiesTree(String,JComponent,boolean).JOptionPane.title"), // NOI18N JOptionPane.ERROR_MESSAGE); } log.error("Error during the loading of the capabilities of the server. " + message, e); // NOI18N tbpCapabilities.remove(tbpCapabilities.indexOfComponent(comp)); final JComponent jc = capabilityUrls.get(new LinkWithSubparent(link, null)); capabilityUrls.remove(new LinkWithSubparent(link, null)); capabilityUrlsReverse.remove(jc); } } }; CismetThreadPool.execute(new Thread(r, "CapabilityWidget addOGCCapabilitiesTree()")); } /** * Erzeugt den Baum aus der geparsten Capabilities-XML und f\u00FCgt ihn der TabbedPane hinzu. * * @param link Capabilites-URL * @param comp Component * @param interactive true, falls per Drag&Drop, sonst false */ private void addOGCWFSCapabilitiesTree(final String link, final JComponent comp, final boolean interactive) { if (log.isDebugEnabled()) { log.debug("addOGCWFSCapabilitiesTree()"); // NOI18N } final Runnable r = new Runnable() { @Override public void run() { try { final DragTree trvCap = new DragTree(); // URL-String als URL speichern final URL getCapURL = new URL(link); URL postURL; if (log.isDebugEnabled()) { // WFSCapabilities aus dem \u00FCbergebenen Link (liefert XML-Dok) parsen log.debug("try to parse WFSCapabilities"); // NOI18N } if (link.indexOf('?') > 0) { postURL = new URL(link.substring(0, link.indexOf('?'))); } else { postURL = getCapURL; } final URL finalPostUrl = postURL; final WFSCapabilitiesFactory capFact = new WFSCapabilitiesFactory(); final WFSCapabilities cap = capFact.createCapabilities(link); trvCap.setWfsCapabilities(cap); trvCap.setReverseOrder(reverseAxisOrder.contains(link)); final String name = FeatureServiceUtilities.getServiceName(cap); if (log.isDebugEnabled()) { // Hashmap mit den FeatureLayer-Attributen erzeugen log.debug("create WFSCapabilitiesTreeModel"); // NOI18N } final WFSCapabilitiesTreeModel tm = new WFSCapabilitiesTreeModel(cap); // Den WFSTree als DropTarget spezifizieren final DropTarget dt = new DropTarget(trvCap, acceptableActions, thisWidget); EventQueue.invokeLater(new Runnable() { @Override public void run() { addPopupMenu(trvCap); trvCap.setModel(tm); trvCap.setBorder(new EmptyBorder(1, 1, 1, 1)); trvCap.setCellRenderer(new WFSCapabilitiesTreeCellRenderer(name)); final JScrollPane sPane = new JScrollPane(); sPane.setViewportView(trvCap); sPane.setBorder(new EmptyBorder(1, 1, 1, 1)); StaticSwingTools.setNiftyScrollBars(sPane); synchronized (this) { tbpCapabilities.setComponentAt(tbpCapabilities.indexOfComponent(comp), sPane); } wfsCapabilities.put(sPane, cap); wfsCapabilitiesTrees.put(sPane, trvCap); stateChanged(null); capabilityUrls.put(new LinkWithSubparent(link, null), sPane); capabilityUrlsReverse.put(sPane, new LinkWithSubparent(link, null)); String title = name; final String titleOrig = title; if (title.length() > 0) { if (title.length() > maxServerNameLength) { title = title.substring(0, maxServerNameLength - 3) + "..."; // NOI18N } sPane.putClientProperty("tabTitle", title); // NOI18N synchronized (this) { StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, title, icoConnected, Color.black, sPane); } synchronized (this) { tbpCapabilities.setToolTipTextAt( tbpCapabilities.indexOfComponent(sPane), titleOrig); } stateChanged(null); } } }); } catch (Throwable e) { String message = ""; // NOI18N tbpCapabilities.setIconAt(tbpCapabilities.indexOfComponent(comp), icoError); if ((e.getMessage() == null) || e.getMessage().equals("null")) { // NOI18N if (e.getCause() != null) { message = e.getCause().getMessage(); } } else { message = e.getMessage(); } if (interactive) { JOptionPane.showMessageDialog( StaticSwingTools.getParentFrame(thisWidget), org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addOGCWFSCapabilitiesTree(String,JComponent,boolean).JOptionPane.message", new Object[] { message }), // NOI18N org.openide.util.NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.addOGCWFSCapabilitiesTree(String,JComponent,boolean).JOptionPane.title"), // NOI18N JOptionPane.ERROR_MESSAGE); } log.error("Loading of the server capabilities failed. " + message, e); // NOI18N tbpCapabilities.remove(tbpCapabilities.indexOfComponent(comp)); final JComponent jc = capabilityUrls.get(new LinkWithSubparent(link, null)); capabilityUrls.remove(new LinkWithSubparent(link, null)); capabilityUrlsReverse.remove(jc); } } }; CismetThreadPool.execute(new Thread(r, "CapabilityWidget addOGCWFSCapabilitiesTree()")); } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void stateChanged(final ChangeEvent e) { if (selectedIndex > -1) { try { tbpCapabilities.setForegroundAt(selectedIndex, null); String t; t = (String)((JComponent)tbpCapabilities.getComponentAt(selectedIndex)).getClientProperty("tabTitle"); // NOI18N if (t == null) { t = ""; // NOI18N } StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, t, icoConnected, Color.black, (JComponent)tbpCapabilities.getComponentAt(selectedIndex)); } catch (Throwable skip) { // do nothing } } selectedIndex = tbpCapabilities.getSelectedIndex(); if (selectedIndex > -1) { String t = (String)((JComponent)tbpCapabilities.getComponentAt(selectedIndex)).getClientProperty( "tabTitle"); // NOI18N if (t == null) { t = ""; // NOI18N } tbpCapabilities.setForegroundAt(selectedIndex, Color.blue); StaticSwingTools.jTabbedPaneWithVerticalTextSetNewText( tbpCapabilities, t, icoConnected, Color.blue, (JComponent)tbpCapabilities.getComponentAt(selectedIndex)); } if (wmsCapabilities.get(tbpCapabilities.getSelectedComponent()) != null) { CismapBroker.getInstance() .fireCapabilityServerChanged(new CapabilityEvent( wmsCapabilities.get(tbpCapabilities.getSelectedComponent()))); } else if (wfsCapabilities.get(tbpCapabilities.getSelectedComponent()) != null) { CismapBroker.getInstance() .fireCapabilityServerChanged(new CapabilityEvent( wfsCapabilities.get(tbpCapabilities.getSelectedComponent()))); } else { if (log.isDebugEnabled()) { log.debug(wmsCapabilities); // NOI18N log.debug(wfsCapabilities); // NOI18N } } } /** * Invoked when an action occurs. Loggt das ActionEvent als ERROR. * * @param e DOCUMENT ME! */ @Override public void actionPerformed(final ActionEvent e) { log.error(e); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public Element getConfiguration() { // TODO Im Moment gibts nur OGC-WMS Links. Da faul .... final Element ret = new Element("cismapCapabilitiesPreferences"); // NOI18N { final Set wmsCapabilitiesSet = capabilityUrls.keySet(); final Iterator<LinkWithSubparent> it = wmsCapabilitiesSet.iterator(); final LinkWithSubparent selectedLink = capabilityUrlsReverse.get(tbpCapabilities.getSelectedComponent()); while (it.hasNext()) { final LinkWithSubparent link = it.next(); String linkText = link.getLink(); if (link.getService() != null) { if (linkText.contains("?")) { linkText += "&SERVICE=" + link.getService(); } else { linkText += "?SERVICE=" + link.getService(); } } final CapabilityLink cl = new CapabilityLink( CapabilityLink.OGC, linkText, reverseAxisOrder.contains(link.getLink()), link.equals(selectedLink), link.getSubparent()); ret.addContent(cl.getElement()); } } ret.setAttribute(new Attribute("searchPanelActivated", String.valueOf(isSearchEnabled()))); return ret; } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void masterConfigure(final Element e) { serverElement = e; } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void configure(final Element e) { preferences = new CapabilitiesPreferences(serverElement, e); configure(preferences); } /** * Konfiguriert das Widget und bestimmt, welche Capabilities verstanden werden. * * @param node cp CapabilitiesPreferences * * @return DOCUMENT ME! */ //J- public void configure(final CapabilitiesPreferences cp) { removeAllServer(); final Iterator<Integer> it = cp.getCapabilities().keySet().iterator(); LinkWithSubparent activeLink = null; while (it.hasNext()) { final Integer i = it.next(); final CapabilityLink cl = cp.getCapabilities().get(i); LinkWithSubparent link = new LinkWithSubparent(cl.getLink(), cl.getSubparent()); if (cl.getType().equals(CapabilityLink.OGC) || cl.getType().equals(CapabilityLink.OGC_DEPRECATED)|| cl.getType().equals("cidsLayer") || cl.getType().equals(CapabilityLink.INTERNAL_DB)) { addLinkManually(link); } if (cl.isActive()) { activeLink = link; } // TODO Hier WFS, ESRI, Google, ... } if (activeLink != null) { final LinkWithSubparent componentToSelect = activeLink; EventQueue.invokeLater(new Runnable() { @Override public void run() { tbpCapabilities.setSelectedComponent(capabilityUrls.get(componentToSelect)); } }); } // CapabilityList-Baum neu aufbauen capabilityList.removeAll(); final JMenu menu = createCapabilitiesListSubmenu(cp.getCapabilitiesListTree()); for (final Component component : menu.getMenuComponents()) { capabilityList.add(component); } setSearchEnabled(cp.isSearchActivated()); } //J+ /** * Erzeugt rekursiv aus einem CapabilitiesListTreeNode ein JMenu mit Untermenues und CapabilityLink-Einträgen. * * @param node Der Knoten aus dem ein JMenu erzeugt werden soll * * @return JMenu mit den Menu-Einträgen und Untermenues des Knoten */ private JMenu createCapabilitiesListSubmenu(final CapabilitiesListTreeNode node) { final JMenu menu = new JMenu(node.getTitle()); // Untermenues rekursiv erzeugen for (final CapabilitiesListTreeNode subnode : node.getSubnodes()) { menu.add(createCapabilitiesListSubmenu(subnode)); } // CapabilityLink-Einträge erzeugen for (final CapabilityLink cl : node.getCapabilitiesList().values()) { if (cl.getType().equals(CapabilityLink.OGC) || cl.getType().equals(CapabilityLink.OGC_DEPRECATED) || cl.getType().equals("cidsLayer") || cl.getType().equals(CapabilityLink.INTERNAL_DB)) { final ListMenuItem lmi = new ListMenuItem("test", cl); // NOI18N if (cl.isReverseAxisOrder()) { reverseAxisOrder.add(cl.getLink()); } lmi.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { addLinkManually(new LinkWithSubparent(cl.getLink(), cl.getSubparent())); } }); menu.add(lmi); } else if (cl.getType().equals(CapabilityLink.SEPARATOR)) { menu.addSeparator(); } // TODO Hier WFS, ESRI, Google, ... } // fertig return menu; } /** * Entfernt alle vorhandenen Capabilities-B\u00E4ume. */ public void removeAllServer() { final int mx = tbpCapabilities.getTabCount(); for (int i = 0; i < mx; ++i) { removeActiveCapabilityTree(); } } /** * DOCUMENT ME! * * @param cl DOCUMENT ME! */ private void addSubmenuToMenu(final CapabilityLink cl) { final ListMenuItem lmi = new ListMenuItem("test", cl); // NOI18N lmi.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { addLinkManually(new LinkWithSubparent(cl.getLink(), cl.getSubparent())); } }); capabilityList.add(lmi); } /** * DOCUMENT ME! */ @Override public void shownMapBoundsChanged() { final JTree t = getActiveTree(); if (t != null) { t.repaint(); } } /** * DOCUMENT ME! * * @param trvCap DOCUMENT ME! */ private void addPopupMenu(final JTree trvCap) { trvCap.addMouseListener(new DefaultPopupMenuListener(treePopMenu)); } /** * DOCUMENT ME! * * @param trvCap DOCUMENT ME! * @param additionalItems DOCUMENT ME! */ private void addPopupMenu(final JTree trvCap, final JMenuItem[] additionalItems) { if ((additionalItems == null) || (additionalItems.length == 0)) { trvCap.addMouseListener(new DefaultPopupMenuListener(treePopMenu)); } else { final JPopupMenu menu = new JPopupMenu(); for (int i = 0; i < treePopMenu.getComponentCount(); ++i) { final Component c = treePopMenu.getComponent(i); if (c instanceof JMenuItem) { menu.add(new JMenuItem(((JMenuItem)c).getAction())); } } for (final JMenuItem item : additionalItems) { menu.add(item); } trvCap.addMouseListener(new DefaultPopupMenuListener(menu)); } } /** * DOCUMENT ME! * * @param currentTrvCap DOCUMENT ME! */ private void zoomToExtent(final DragTree currentTrvCap) { if (log.isDebugEnabled()) { log.debug("zoom to extent."); } if (currentTrvCap != null) { final String currentCrs = CismapBroker.getInstance().getSrs().getCode(); final WMSCapabilities wmsCap = currentTrvCap.getWmsCapabilities(); Geometry bestGeom = null; // search for a bounding box with the right CRS if (wmsCap != null) { final TreePath[] paths = currentTrvCap.getSelectionPaths(); for (final TreePath tp : paths) { Envelope e = null; if ((tp != null) && (tp.getLastPathComponent() instanceof Layer)) { e = getEnvelopeForWmsLayer((Layer)tp.getLastPathComponent()); } if (e == null) { e = getEnvelopeForWmsCaps(wmsCap); } if (e != null) { if (bestGeom == null) { bestGeom = createGeometryFromEnvelope(e); } else { bestGeom = bestGeom.union(createGeometryFromEnvelope(e)); } } } } else if (currentTrvCap.getWfsCapabilities() != null) { // the selected server is a wfs final TreePath[] paths = currentTrvCap.getSelectionPaths(); for (final TreePath tp : paths) { Envelope e = null; FeatureType selectedFeature = null; if ((tp != null) && (tp.getLastPathComponent() instanceof FeatureType)) { selectedFeature = (FeatureType)tp.getLastPathComponent(); } else { try { final Iterator<FeatureType> it = currentTrvCap.getWfsCapabilities() .getFeatureTypeList() .iterator(); if (it.hasNext()) { selectedFeature = it.next(); } } catch (final Exception ex) { log.error("Cannot receive the feature type list from the capabilities document", ex); } } if (selectedFeature != null) { e = getEnvelopeFromFeatureType(selectedFeature); } if (e != null) { if (bestGeom == null) { bestGeom = createGeometryFromEnvelope(e); } else { Geometry additionalGeom = createGeometryFromEnvelope(e); if (bestGeom.getSRID() != additionalGeom.getSRID()) { additionalGeom = CrsTransformer.transformToGivenCrs( additionalGeom, CrsTransformer.createCrsFromSrid(bestGeom.getSRID())); } bestGeom = bestGeom.union(additionalGeom); } } } } if (bestGeom == null) { log.warn("no envelope found in the capabilities document"); JOptionPane.showMessageDialog( StaticSwingTools.getParentFrame(thisWidget), NbBundle.getMessage(CapabilityWidget.class, "CapabilityWidget.zoomToExtent().JOptionPane.msg"), NbBundle.getMessage( CapabilityWidget.class, "CapabilityWidget.zoomToExtent().JOptionPane.title"), JOptionPane.ERROR_MESSAGE); } if (bestGeom != null) { final Geometry env = CrsTransformer.transformToCurrentCrs(bestGeom); final XBoundingBox bb = new XBoundingBox(env); if (bb != null) { CismapBroker.getInstance().getMappingComponent().gotoBoundingBoxWithHistory(bb); } else { log.warn("no valid bounding box found."); } } } } /** * DOCUMENT ME! * * @param l currentTrvCap DOCUMENT ME! * * @return DOCUMENT ME! */ public static Envelope getEnvelopeForWmsLayer(final Layer l) { Envelope bestEnvelope = null; final LayerBoundingBox[] boxes = l.getBoundingBoxes(); final String currentCrs = CismapBroker.getInstance().getSrs().getCode(); // search for a bounding box with the right CRS if (boxes != null) { for (final LayerBoundingBox tmp : boxes) { if (tmp.getSRS().equals(currentCrs)) { bestEnvelope = tmp; break; } } } if (bestEnvelope == null) { if (l.getLatLonBoundingBoxes() != null) { bestEnvelope = l.getLatLonBoundingBoxes(); } else { if ((boxes != null) && (boxes.length > 0)) { bestEnvelope = boxes[0]; } } } return bestEnvelope; } /** * DOCUMENT ME! * * @param caps DOCUMENT ME! * * @return DOCUMENT ME! */ public static Envelope getEnvelopeForWmsCaps(final WMSCapabilities caps) { Envelope bestEnvelope = null; if (caps != null) { final LayerBoundingBox[] boxes = caps.getLayer().getBoundingBoxes(); final String currentCrs = CismapBroker.getInstance().getSrs().getCode(); // search for a bounding box with the right CRS if (boxes != null) { for (final LayerBoundingBox tmp : boxes) { if (tmp.getSRS().equals(currentCrs)) { bestEnvelope = tmp; } } } if (bestEnvelope == null) { if (caps.getLayer().getLatLonBoundingBoxes() != null) { bestEnvelope = caps.getLayer().getLatLonBoundingBoxes(); } else { if ((boxes != null) && (boxes.length > 0)) { bestEnvelope = boxes[0]; } } } } return bestEnvelope; } /** * DOCUMENT ME! * * @param feature currentTrvCap DOCUMENT ME! * * @return DOCUMENT ME! */ public static Envelope getEnvelopeFromFeatureType(final FeatureType feature) { Envelope bestEnvelope = null; if (feature != null) { final Envelope[] envs = feature.getWgs84BoundingBoxes(); if ((envs != null) && (envs.length > 0)) { bestEnvelope = envs[0]; } } return bestEnvelope; } /** * converts the given envelope to a geometry object. * * @param env the envelope to convert * * @return DOCUMENT ME! */ public static Geometry createGeometryFromEnvelope(final Envelope env) { final double x1 = env.getMin().getX(); final double x2 = env.getMax().getX(); final double y1 = env.getMin().getY(); final double y2 = env.getMax().getY(); final CoordinateSystem cs = env.getCoordinateSystem(); String crs = null; if (cs != null) { crs = cs.getIdentifier(); } else { if (env instanceof LayerBoundingBox) { crs = ((LayerBoundingBox)env).getSRS(); } } final GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), CrsTransformer.extractSridFromCrs(crs)); final com.vividsolutions.jts.geom.Envelope envelope = new com.vividsolutions.jts.geom.Envelope(x1, x2, y1, y2); return factory.toGeometry(envelope); } /** * DOCUMENT ME! * * @param enabled DOCUMENT ME! */ public void setSearchEnabled(final boolean enabled) { txtSearch.setVisible(enabled); if (!enabled) { txtSearch.setText(""); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isSearchEnabled() { return txtSearch.isVisible(); } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class ListMenuItem extends JMenuItem { //~ Instance fields ---------------------------------------------------- private CapabilityLink capabilityLink; //~ Constructors ------------------------------------------------------- /** * Creates a new ListMenuItem object. * * @param label DOCUMENT ME! * @param cl DOCUMENT ME! */ public ListMenuItem(final String label, final CapabilityLink cl) { super(cl.getTitle()); this.capabilityLink = cl; } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public CapabilityLink getCapabilityLink() { return capabilityLink; } /** * DOCUMENT ME! * * @param capabilityLink DOCUMENT ME! */ public void setCapabilityLink(final CapabilityLink capabilityLink) { this.capabilityLink = capabilityLink; } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class DragTree extends JTree implements DragGestureListener, DragSourceListener { //~ Instance fields ---------------------------------------------------- DragSource dragSource = null; TreePath[] cachedTreePaths; // DND Fehlverhalten Workaround private TreePath[] lastCachedTreePaths; // DND Fehlverhalten Workaround private boolean autoSelection = false; private boolean valueChanged = false; private WMSCapabilities wmsCapabilities; private WFSCapabilities wfsCapabilities; private boolean reverseOrder; //~ Constructors ------------------------------------------------------- /** * Creates a new DragTree object. */ public DragTree() { dragSource = DragSource.getDefaultDragSource(); dragSource.createDefaultDragGestureRecognizer( this, // component where drag originates DnDConstants.ACTION_COPY_OR_MOVE, // actions this); // drag gesture recognizer addMouseListener(new MouseAdapter() { @Override public void mousePressed(final MouseEvent e) { if (!valueChanged) { lastCachedTreePaths = cachedTreePaths; } valueChanged = false; } }); getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { // DND Fehlverhalten Workaround @Override public void valueChanged(final TreeSelectionEvent e) { if (autoSelection) { return; } final java.util.List<TreePath> path = new ArrayList<TreePath>(); ; valueChanged = true; if (cachedTreePaths != null) { path.addAll(Arrays.asList(cachedTreePaths)); } for (final TreePath tmpPath : e.getPaths()) { if (e.isAddedPath(tmpPath)) { path.add(tmpPath); } else { path.remove(tmpPath); } } lastCachedTreePaths = cachedTreePaths; cachedTreePaths = path.toArray(new TreePath[path.size()]); } }); getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(final TreeSelectionEvent e) { if ((getSelectionPath() != null) && ((getSelectionPath().getLastPathComponent() instanceof Layer) || (getSelectionPath().getLastPathComponent() instanceof Element) || (getSelectionPath().getLastPathComponent() instanceof FeatureType) || (getSelectionPath().getLastPathComponent() instanceof File))) { CismapBroker.getInstance() .fireCapabilityLayerChanged( new CapabilityEvent(getSelectionPath().getLastPathComponent())); } else { if (getSelectionPath() != null) { // FIXME: WTF? Warum wan? log.warn( "getSelectionPath().getLastPathComponent()=" + getSelectionPath().getLastPathComponent()); // NOI18N } } } }); } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void dragGestureRecognized(final DragGestureEvent e) { getSelectionModel().setSelectionPaths(cachedTreePaths); // DND Fehlverhalten Workaround final TreePath selPath = getPathForLocation((int)e.getDragOrigin().getX(), (int)e.getDragOrigin().getY()); // DND Fehlverhalten Workaround autoSelection = true; if ((e.getTriggerEvent().getModifiers() & (e.getTriggerEvent().CTRL_MASK)) != 0) { // DND Fehlverhalten Workaround getSelectionModel().setSelectionPaths(cachedTreePaths); // DND Fehlverhalten Workaround / getSelectionModel().addSelectionPath(selPath); // DND Fehlverhalten Workaround cachedTreePaths = getSelectionModel().getSelectionPaths(); // DND Fehlverhalten Workaround } else if ((e.getTriggerEvent().getModifiers() & e.getTriggerEvent().SHIFT_MASK) != 0) { getSelectionModel().addSelectionPaths(cachedTreePaths); // DND Fehlverhalten Workaround cachedTreePaths = getSelectionModel().getSelectionPaths(); // DND Fehlverhalten Workaround } else { if (contains(lastCachedTreePaths, selPath)) { getSelectionModel().setSelectionPaths(lastCachedTreePaths); // DND Fehlverhalten Workaround cachedTreePaths = lastCachedTreePaths; } } autoSelection = false; Transferable trans = null; if (this.getModel() instanceof WMSCapabilitiesTreeModel) { trans = new DefaultTransferable(new SelectionAndCapabilities( getSelectionModel().getSelectionPaths(), wmsCapabilities, capabilityUrlsReverse.get(tbpCapabilities.getSelectedComponent()).getLink())); } else if (this.getModel() instanceof WFSCapabilitiesTreeModel) { final WFSCapabilitiesTreeModel model = (WFSCapabilitiesTreeModel)this.getModel(); if (log.isDebugEnabled()) { log.debug("create Transferable for WFS"); // NOI18N } // TODO ein Transferable zum Testen erstellen if (getSelectionModel().getSelectionPath().getLastPathComponent() instanceof FeatureType) { final TreePath[] paths = getSelectionModel().getSelectionPaths(); final FeatureType[] features = new FeatureType[paths.length]; for (int i = 0; i < paths.length; ++i) { features[i] = (FeatureType)paths[i].getLastPathComponent(); } trans = new DefaultTransferable(new WFSSelectionAndCapabilities(features, reverseOrder)); } } else if (this.getModel() instanceof ShapeFolderTreeModel) { final TreePath[] paths = getSelectionModel().getSelectionPaths(); final List<File> files = new ArrayList<File>(); for (final TreePath path : paths) { final Object o = path.getLastPathComponent(); if (o instanceof File) { if (!((File)o).isDirectory()) { files.add((File)o); } } } if (files.isEmpty()) { return; } trans = new DefaultTransferable(files.toArray(new File[files.size()])); } else if (this.getModel().getClass().getName().equals("de.cismet.cismap.cidslayer.CidsLayerTreeModel")) { final List<LayerConfig> objects = new ArrayList<LayerConfig>(); final TreePath[] paths = getSelectionModel().getSelectionPaths(); for (final TreePath path : paths) { final Object o = path.getLastPathComponent(); if (o instanceof LayerConfig) { objects.add((LayerConfig)o); } } trans = new DefaultTransferable(objects.toArray(new LayerConfig[objects.size()])); // trans = new DefaultTransferable(getSelectionModel().getSelectionPath().getLastPathComponent()); } dragSource.startDrag(e, DragSource.DefaultCopyDrop, trans, this); } /** * DOCUMENT ME! * * @param list DOCUMENT ME! * @param path DOCUMENT ME! * * @return DOCUMENT ME! */ private boolean contains(final TreePath[] list, final TreePath path) { if (list == null) { return false; } for (final TreePath tmpPath : list) { if (tmpPath.equals(path)) { return true; } } return false; } /** * unbenutzte DnD-Methoden. * * @param e DOCUMENT ME! */ @Override public void dragDropEnd(final DragSourceDropEvent e) { } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void dragEnter(final DragSourceDragEvent e) { } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void dragExit(final DragSourceEvent e) { } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void dragOver(final DragSourceDragEvent e) { } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ @Override public void dropActionChanged(final DragSourceDragEvent e) { } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public WMSCapabilities getWmsCapabilities() { return wmsCapabilities; } /** * DOCUMENT ME! * * @param wmsCapabilities DOCUMENT ME! */ public void setWmsCapabilities(final WMSCapabilities wmsCapabilities) { this.wmsCapabilities = wmsCapabilities; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public WFSCapabilities getWfsCapabilities() { return wfsCapabilities; } /** * DOCUMENT ME! * * @param wfsCapabilities DOCUMENT ME! */ public void setWfsCapabilities(final WFSCapabilities wfsCapabilities) { this.wfsCapabilities = wfsCapabilities; } /** * DOCUMENT ME! * * @param reverseOrder the reverseOrder to set */ public void setReverseOrder(final boolean reverseOrder) { this.reverseOrder = reverseOrder; } } /** * Klasse, die Transferable implementiert und den Datentransfer beim Drag&Drop sichert. * * @version $Revision$, $Date$ */ class DefaultTransferable implements Transferable { //~ Instance fields ---------------------------------------------------- private DataFlavor TREEPATH_FLAVOR = new DataFlavor( DataFlavor.javaJVMLocalObjectMimeType, "SelectionAndCapabilities"); // NOI18N private Object o; //~ Constructors ------------------------------------------------------- /** * Creates a new DefaultTransferable object. * * @param o DOCUMENT ME! */ public DefaultTransferable(final Object o) { this.o = o; } //~ Methods ------------------------------------------------------------ /** * Returns whether or not the specified data flavor is supported for this object. * * @param flavor the requested flavor for the data * * @return boolean indicating whether or not the data flavor is supported */ @Override public boolean isDataFlavorSupported(final DataFlavor flavor) { if (flavor.match(TREEPATH_FLAVOR)) { return true; } else { return false; } } /** * Returns an object which represents the data to be transferred. The class of the object returned is defined by * the representation class of the flavor. * * @param flavor the requested flavor for the data * * @return DOCUMENT ME! * * @exception UnsupportedFlavorException if the requested data flavor is not supported. * @exception IOException if the data is no longer available in the requested flavor. * * @see DataFlavor#getRepresentationClass */ @Override public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (flavor.match(TREEPATH_FLAVOR)) { return o; } else { return null; } } /** * Returns an array of DataFlavor objects indicating the flavors the data can be provided in. The array should * be ordered according to preference for providing the data (from most richly descriptive to least * descriptive). * * @return an array of data flavors in which this data can be transferred */ @Override public DataFlavor[] getTransferDataFlavors() { final DataFlavor[] ar = new DataFlavor[1]; ar[0] = TREEPATH_FLAVOR; return ar; } } /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ class LinkWithSubparent { //~ Instance fields ---------------------------------------------------- String link = null; String subparent = null; String service = null; //~ Constructors ------------------------------------------------------- /** * Creates a new LinkWithSubparent object. * * @param link DOCUMENT ME! * @param subparent DOCUMENT ME! */ public LinkWithSubparent(final String link, final String subparent) { this.link = link; this.subparent = subparent; } //~ Methods ------------------------------------------------------------ /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getLink() { return link; } /** * DOCUMENT ME! * * @param link DOCUMENT ME! */ public void setLink(final String link) { this.link = link; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getSubparent() { return subparent; } /** * DOCUMENT ME! * * @param subparent DOCUMENT ME! */ public void setSubparent(final String subparent) { this.subparent = subparent; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getService() { return service; } /** * DOCUMENT ME! * * @param service DOCUMENT ME! */ public void setService(final String service) { this.service = service; } /** * DOCUMENT ME! * * @param obj DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public boolean equals(final Object obj) { if (obj instanceof LinkWithSubparent) { final LinkWithSubparent tester = (LinkWithSubparent)obj; final String t = tester.link + tester.subparent; final String thisT = link + subparent; return t.equals(thisT); } else { return false; } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ @Override public int hashCode() { final String t = link + subparent; return t.hashCode(); } } }