package jeql.workbench.ui.geomview; /* * The JTS Topology Suite is a collection of Java classes that * implement the fundamental operations required to validate a given * geo-spatial data set to a known topological specification. * * Copyright (C) 2001 Vivid Solutions * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For more information, contact: * * Vivid Solutions * Suite #1A * 2328 Government Street * Victoria BC V8T 5G5 * Canada * * (250)385-6040 * www.vividsolutions.com */ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.event.ComponentEvent; import java.awt.geom.Point2D; import java.text.NumberFormat; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; import jeql.workbench.ui.geomview.tool.Tool; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; /** * Panel which displays rendered geometries. * * @version 1.7 */ public class GeometryViewPanel extends JPanel { private LayerList lyrList; private GridRenderer gridRenderer; private Tool currentTool = null; private Viewport viewport = new Viewport(this); private RenderManager renderMgr; //---------------------------------------- BorderLayout borderLayout1 = new BorderLayout(); public GeometryViewPanel() { gridRenderer = new GridRenderer(viewport); try { initUI(); } catch (Exception ex) { ex.printStackTrace(); } renderMgr = new RenderManager(this); } void initUI() throws Exception { this.addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(ComponentEvent e) { this_componentResized(e); } }); this.setBackground(Color.white); this.setBorder(BorderFactory.createLoweredBevelBorder()); this.setLayout(borderLayout1); setToolTipText(""); setBorder(BorderFactory.createEmptyBorder()); } public void setModel(LayerList model) { this.lyrList = model; } public LayerList getModel() { return lyrList; } public void setGridEnabled(boolean isEnabled) { gridRenderer.setEnabled(isEnabled); } public Viewport getViewport() { return viewport; } public void updateView() { // fireGeometryChanged(new GeometryEvent(this)); forceRepaint(); } public void forceRepaint() { renderMgr.setDirty(true); Component source = SwingUtilities.windowForComponent(this); if (source == null) source = this; source.repaint(); } private LayerList getLayerList() { return lyrList; } public void paintComponent(Graphics g) { super.paintComponent(g); renderMgr.render(); renderMgr.copyImage(g); } /* public void flash(Geometry g) { Graphics2D gr = (Graphics2D) getGraphics(); gr.setXORMode(Color.white); Stroke stroke = new BasicStroke(5); try { GeometryPainter.paint(g, viewport, gr, Color.RED, null, stroke); Thread.sleep(200); GeometryPainter.paint(g, viewport, gr, Color.RED, null, stroke); } catch (Exception ex) { // nothing we can do } gr.setPaintMode(); } */ void this_componentResized(ComponentEvent e) { renderMgr.componentResized(); viewport.update(); } public void setSource(LayerList lyrList) { boolean doZoom = this.lyrList == null; setModel(lyrList); if (doZoom) zoomToFullExtent(); updateView(); } public void setCurrentTool(Tool newTool) { removeMouseListener(currentTool); removeMouseMotionListener(currentTool); currentTool = newTool; currentTool.activate(); setCursor(currentTool.getCursor()); addMouseListener(currentTool); addMouseMotionListener(currentTool); } public void zoomToGeometry(int i) { Envelope g = lyrList.getEnvelope(i); if (g == null) return; zoom(g); } public void zoomToFullExtent() { zoom(lyrList.getEnvelopeAll()); } public void zoom(Geometry geom) { zoom(geom.getEnvelopeInternal()); } public void zoom(Envelope zoomEnv) { if (zoomEnv == null) return; renderMgr.setDirty(true); if (zoomEnv.isNull()) { viewport.zoomToInitialExtent(); return; } double averageExtent = (zoomEnv.getWidth() + zoomEnv.getHeight()) / 2d; // fix to allow zooming to points if (averageExtent == 0.0) averageExtent = 1.0; double buffer = averageExtent * 0.03; zoomEnv.expandToInclude(zoomEnv.getMaxX() + buffer, zoomEnv.getMaxY() + buffer); zoomEnv.expandToInclude(zoomEnv.getMinX() - buffer, zoomEnv.getMinY() - buffer); viewport.zoom(zoomEnv); } public void zoom(Point center, double realZoomFactor) { renderMgr.setDirty(true); double width = getSize().width / realZoomFactor; double height = getSize().height / realZoomFactor; double bottomOfNewViewAsPerceivedByOldView = center.y + (height / 2d); double leftOfNewViewAsPerceivedByOldView = center.x - (width / 2d); Point bottomLeftOfNewViewAsPerceivedByOldView = new Point( (int) leftOfNewViewAsPerceivedByOldView, (int) bottomOfNewViewAsPerceivedByOldView); Point2D bottomLeftOfNewViewAsPerceivedByModel = viewport.toModel(bottomLeftOfNewViewAsPerceivedByOldView); viewport.setScale(getViewport().getScale() * realZoomFactor); viewport.setViewOrigin(bottomLeftOfNewViewAsPerceivedByModel.getX(), bottomLeftOfNewViewAsPerceivedByModel.getY()); } public void zoomPan(double xDisplacement, double yDisplacement) { renderMgr.setDirty(true); getViewport().setViewOrigin(getViewport().getViewOriginX() - xDisplacement, getViewport().getViewOriginY() - yDisplacement); } public String cursorLocation(Point2D pView) { Point2D p = getViewport().toModel(pView); NumberFormat format = getViewport().getScaleFormat(); return format.format(p.getX()) + ", " + format.format(p.getY()); } public Renderer getRenderer() { return new GeometryEditPanelRenderer(); } class GeometryEditPanelRenderer implements Renderer { private Renderer currentRenderer = null; public GeometryEditPanelRenderer() { } public void render(Graphics2D g) { Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gridRenderer.paint(g2); renderLayers(g2); } public void renderLayers(Graphics2D g) { LayerList layerList = getLayerList(); int n = layerList.size(); for (int i = 0; i < n; i++) { currentRenderer = new LayerRenderer(layerList.getLayer(i), viewport); currentRenderer.render(g); } currentRenderer = null; } public synchronized void cancel() { if (currentRenderer != null) currentRenderer.cancel(); } } }