/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2007 - 2008, Open Source Geospatial Foundation (OSGeo)
* (C) 2008 - 2010, Johann Sorel
*
* 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;
* version 2.1 of the License.
*
* 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.
*/
package org.geotoolkit.gui.swing.render2d.control.information;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.Area;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.MouseInputListener;
import org.geotoolkit.display2d.GraphicVisitor;
import org.geotoolkit.display.canvas.RenderingContext;
import org.geotoolkit.display.VisitFilter;
import org.geotoolkit.display.SearchArea;
import org.geotoolkit.display2d.canvas.RenderingContext2D;
import org.geotoolkit.display2d.primitive.SearchAreaJ2D;
import org.geotoolkit.gui.swing.render2d.JMap2D;
import org.geotoolkit.gui.swing.render2d.control.information.presenter.DefaultInformationPresenter;
import org.geotoolkit.gui.swing.render2d.control.information.presenter.InformationPresenter;
import org.geotoolkit.gui.swing.render2d.control.navigation.AbstractNavigationHandler;
import org.opengis.display.primitive.Graphic;
/**
* Information handler.
*
* @author Johann Sorel (Puzzle-GIS)
* @module
*/
public class InformationHandler extends AbstractNavigationHandler {
private final MouseListen mouseInputListener = new MouseListen();
private InformationPresenter presenter = new DefaultInformationPresenter();
private double zoomFactor = 2;
public InformationHandler(final JMap2D map) {
super(map);
}
public InformationPresenter getPresenter() {
return presenter;
}
public void setPresenter(final InformationPresenter presenter) {
this.presenter = presenter;
}
/**
* {@inheritDoc }
*/
@Override
public void install(final Component component) {
super.install(component);
component.addMouseListener(mouseInputListener);
component.addMouseMotionListener(mouseInputListener);
component.addMouseWheelListener(mouseInputListener);
}
/**
* {@inheritDoc }
*/
@Override
public void uninstall(final Component component) {
super.uninstall(component);
component.removeMouseListener(mouseInputListener);
component.removeMouseMotionListener(mouseInputListener);
component.removeMouseWheelListener(mouseInputListener);
}
private class MouseListen implements MouseInputListener, MouseWheelListener {
private int startX;
private int startY;
private int lastX;
private int lastY;
private int mousebutton = 0;
@Override
public void mouseClicked(final MouseEvent e) {
mousebutton = e.getButton();
}
@Override
public void mousePressed(final MouseEvent e) {
startX = e.getX();
startY = e.getY();
lastX = 0;
lastY = 0;
mousebutton = e.getButton();
if (mousebutton == MouseEvent.BUTTON1) {
final Area searchArea = new Area(new Rectangle(e.getPoint().x-2,e.getPoint().y-2,4,4));
final InformationVisitor visitor = new InformationVisitor();
map.getCanvas().getGraphicsIn(searchArea, visitor, VisitFilter.INTERSECTS);
if(!visitor.graphics.isEmpty()){
final JInformationDialog dialog = new JInformationDialog(map);
dialog.display(visitor.graphics, presenter, e.getLocationOnScreen(), visitor.ctx, visitor.area);
}
} else if (mousebutton == MouseEvent.BUTTON3) {
decorationPane.setCoord(0, 0, map.getComponent().getWidth(), map.getComponent().getHeight(), true);
}
}
@Override
public void mouseReleased(final MouseEvent e) {
int endX = e.getX();
int endY = e.getY();
//right mouse button : pan action
if (mousebutton == MouseEvent.BUTTON3) {
decorationPane.setFill(false);
decorationPane.setCoord(-10, -10,-10, -10, false);
processDrag(startX, startY, endX, endY);
}
lastX = 0;
lastY = 0;
}
@Override
public void mouseEntered(final MouseEvent e) {
map.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
@Override
public void mouseExited(final MouseEvent e) {
map.setCursor(null);
}
@Override
public void mouseDragged(final MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (mousebutton == MouseEvent.BUTTON3) {
if ((lastX > 0) && (lastY > 0)) {
int dx = lastX - startX;
int dy = lastY - startY;
decorationPane.setFill(false);
decorationPane.setCoord(dx, dy, map.getComponent().getWidth(), map.getComponent().getHeight(), true);
}
lastX = x;
lastY = y;
}
}
@Override
public void mouseMoved(final MouseEvent e) {
}
@Override
public void mouseWheelMoved(final MouseWheelEvent e) {
int rotate = e.getWheelRotation();
if(rotate<0){
scale(e.getPoint(),zoomFactor);
}else if(rotate>0){
scale(e.getPoint(),1d/zoomFactor);
}
}
}
private static class InformationVisitor implements GraphicVisitor{
private final List<Graphic> graphics = new ArrayList<Graphic>();
private RenderingContext2D ctx = null;
private SearchAreaJ2D area = null;
@Override
public void startVisit() {
}
@Override
public void endVisit() {
}
@Override
public void visit(final Graphic graphic, final RenderingContext context, final SearchArea area) {
this.graphics.add(graphic);
this.ctx = (RenderingContext2D) context;
this.area = (SearchAreaJ2D) area;
}
@Override
public boolean isStopRequested() {
return false;
}
}
}