001: /*
002: * uDig - User Friendly Desktop Internet GIS client
003: * http://udig.refractions.net
004: * (C) 2004, Refractions Research Inc.
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: */
017: package net.refractions.udig.tool.info;
018:
019: import java.awt.Rectangle;
020:
021: import net.refractions.udig.project.ui.ApplicationGIS;
022: import net.refractions.udig.project.ui.internal.commands.draw.DrawShapeCommand;
023: import net.refractions.udig.project.ui.render.displayAdapter.MapMouseEvent;
024: import net.refractions.udig.project.ui.tool.AbstractModalTool;
025: import net.refractions.udig.project.ui.tool.ModalTool;
026: import net.refractions.udig.tool.info.internal.InfoView2;
027:
028: import org.eclipse.jface.viewers.StructuredSelection;
029: import org.eclipse.swt.widgets.Display;
030: import org.eclipse.ui.IWorkbenchPage;
031: import org.eclipse.ui.PlatformUI;
032: import org.geotools.geometry.jts.ReferencedEnvelope;
033: import org.opengis.referencing.crs.CoordinateReferenceSystem;
034:
035: import com.vividsolutions.jts.geom.Envelope;
036:
037: /**
038: * InfoTool is Map Tool used to grab identity information about what is on the screen.
039: * <p>
040: * InfoTool makes use its ModalTool superclass to access RenderManager;
041: * getInfo is a first class request supported by the API. You can however trace through
042: * this code as an example for creating your own tools.
043: * </p>
044: * <p>
045: * Workflow:
046: * <ul>
047: * <li>RenderManger.getInfo( Point ) for each renderer asks ...
048: * <li>Renderer.getInfo( Point ) which ...
049: * <li>back projects Point to a Extent used with
050: * <li>Resource (ie FeatureSource.getFeatures( filter ) to arrive at
051: * <li>Information (ie a FeatureCollection) wrapped in an LayerPointInfo providing
052: * <li>LayerPointInfo.getObject() & LayerPointInfo.getMimeType()
053: * </ul>
054: * </p>
055: *
056: * @author Jody Garnett
057: * @version $Revision: 1.9 $
058: */
059: public class InfoTool extends AbstractModalTool implements ModalTool {
060:
061: /**
062: * ID of the current tool.
063: */
064: public static final String ID = "net.refractions.udig.tool.info.infoMode"; //$NON-NLS-1$
065: public static final String CATEGORY_ID = "net.refractions.udig.tool.category.info"; //$NON-NLS-1$
066:
067: /**
068: * Creates an LayerPointInfo Tool.
069: */
070: public InfoTool() {
071: super (MOUSE | MOTION);
072: }
073:
074: @Override
075: public void mousePressed(MapMouseEvent e) {
076: draw.setValid(true); // make sure context.getViewportPane().repaint() knows about us
077: context.sendASyncCommand(draw); // should of isValided us
078: feedback(e);
079:
080: }
081:
082: @Override
083: public void mouseDragged(MapMouseEvent e) {
084: feedback(e);
085:
086: }
087:
088: DrawShapeCommand draw = new DrawShapeCommand();
089:
090: /**
091: * Provides user feedback
092: * @param e
093: */
094: public void feedback(MapMouseEvent e) {
095: draw.setShape(new Rectangle(e.x - 3, e.y - 3, 5, 5));
096: context.getViewportPane().repaint(e.x - 4, e.y - 4, 7, 7);
097:
098: super .mouseDragged(e);
099: }
100:
101: /**
102: * What's this then?
103: * <p>
104: * See class description for intended workflow.
105: * </p>
106: * @see net.refractions.udig.project.ui.tool.AbstractTool#mouseReleased(MapMouseEvent)
107: */
108: public void mouseReleased(MapMouseEvent e) {
109: try {
110:
111: Envelope box = context.getBoundingBox(e.getPoint(), 5);
112: ReferencedEnvelope bbox;
113: if (box instanceof ReferencedEnvelope) {
114: bbox = (ReferencedEnvelope) box;
115: } else {
116: CoordinateReferenceSystem crs = context
117: .getViewportModel().getCRS();
118: bbox = new ReferencedEnvelope(box, crs);
119:
120: }
121: final InfoView2.InfoRequest request = new InfoView2.InfoRequest();
122: request.bbox = bbox;
123: request.layers = context.getMapLayers();
124:
125: Display.getDefault().asyncExec(new Runnable() {
126: public void run() {
127: InfoView2 infoView = (InfoView2) ApplicationGIS
128: .getView(true, InfoView2.VIEW_ID);
129:
130: // JONES: deselect current feature so it won't flash when view is activated (it won't be valid
131: // one the new search passes.
132: if (infoView != null)
133: if (infoView.getSite().getSelectionProvider() != null)
134: infoView.getSite().getSelectionProvider()
135: .setSelection(
136: new StructuredSelection());
137:
138: //JONES: activate view now that there is no current selection.
139: IWorkbenchPage page = PlatformUI.getWorkbench()
140: .getActiveWorkbenchWindow().getActivePage();
141: if (!page.isPartVisible(infoView))
142: page.bringToTop(infoView);
143:
144: // we got here and info was null? Don't want to fail on first attempt
145: infoView = (InfoView2) ApplicationGIS.getView(
146: false, InfoView2.VIEW_ID);
147: infoView.search(request);
148: }
149: });
150: } catch (Throwable e1) {
151: // Should log problem ..
152: InfoPlugin.log("Could not display information", e1); //$NON-NLS-1$
153: } finally {
154: draw.setValid(false); // get us off the draw stack for context.getViewportPane().repaint();
155: context.getViewportPane().repaint();
156: }
157: }
158:
159: /**
160: * @see net.refractions.udig.project.ui.tool.Tool#dispose()
161: */
162: public void dispose() {
163: super.dispose();
164: }
165:
166: }
|