package org.geotoolkit.pending.demo.swing;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.SwingConstants;
import javax.swing.event.MouseInputListener;
import org.geotoolkit.gui.swing.navigator.DateRenderer;
import org.geotoolkit.gui.swing.navigator.JNavigator;
import org.geotoolkit.gui.swing.navigator.JNavigatorBand;
import org.geotoolkit.temporal.object.TemporalConstants;
/**
* Demonstration of the Navigation component.
*
* Navigator is similar to what could be found in project management libraries
* to display Gant schemas.
*
*/
public class NavigatorDemo {
public static void main(String[] args) {
final JNavigator guiNavigator = new JNavigator();
guiNavigator.setModelRenderer(new DateRenderer());
//add some data bands on the navigator
for(int i=0;i<30;i++){
guiNavigator.getBands().add(new TaskBand());
}
//move to current date
guiNavigator.getModel().scale(1f/TemporalConstants.HOUR_MS, 0);
guiNavigator.getModel().translate(-System.currentTimeMillis());
//set a popup menu on the gradient area (at the bottom of the componant)
final JPopupMenu menu = new JPopupMenu("basemenu");
menu.add(new JMenuItem("base action 1"));
menu.add(new JMenuItem("base action 2"));
guiNavigator.setComponentPopupMenu(menu);
final JFrame frm = new JFrame();
frm.setSize(800, 600);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setLocationRelativeTo(null);
frm.setContentPane(guiNavigator);
frm.setVisible(true);
}
/**
* Band displaying a single red line
*/
private static final class TaskBand extends JNavigatorBand implements MouseInputListener {
private final int tolerance = 3;
private double start;
private double end;
public TaskBand() {
setPreferredSize(new Dimension(50, 30));
start = System.currentTimeMillis() + Math.random() * TemporalConstants.MONTH_MS;
end = start + TemporalConstants.MONTH_MS;
//this band toolip
setToolTipText(String.valueOf(Math.random()*1000));
//this band popup actions
final JPopupMenu menu = new JPopupMenu("");
menu.add(new JMenuItem("action 1"));
menu.add(new JMenuItem("action 2"));
setComponentPopupMenu(menu);
//listen to move events to drag the bar around
addMouseListener(this);
addMouseMotionListener(this);
}
private boolean isOver(int position){
final double pos1 = getModel().getGraphicValueAt(start) - tolerance;
final double pos2 = getModel().getGraphicValueAt(end) + tolerance;
return position>=pos1 && position <=pos2;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
final Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
final int orientation = getNavigator().getOrientation();
final boolean horizontal = (orientation == SwingConstants.NORTH || orientation == SwingConstants.SOUTH);
final float centered = horizontal ? getHeight() / 2 : getWidth() / 2;
if (!horizontal) {
//we apply a transform on eveyrthing we paint
g2d.translate(getWidth(), 0);
g2d.rotate(Math.toRadians(90));
}
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
double start = getModel().getGraphicValueAt(this.start);
double end = getModel().getGraphicValueAt(this.end);
final Shape shape = new java.awt.geom.Line2D.Double(start, centered, end, centered);
g2d.draw(shape);
}
////////////////////////////////////////////////////////////////////////////
// navigation events ///////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
private int lastMouseX = 0;
private int lastMouseY = 0;
private int newMouseX = 0;
private int newMouseY = 0;
private boolean flagMove = false;
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
if(isOver(e.getX())){
flagMove = (e.getButton() == MouseEvent.BUTTON1);
newMouseX = e.getX();
newMouseY = e.getY();
lastMouseX = newMouseX;
lastMouseY = newMouseY;
e.consume();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(flagMove) e.consume();
flagMove = false;
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
if(e.isConsumed()) return;
newMouseX = e.getX();
newMouseY = e.getY();
if(flagMove){
if(isOver(e.getX())){
//dragging task
final double scale = getModel().getScale();
final double tr = lastMouseX-newMouseX;
start -= 1/scale*tr;
end -= 1/scale*tr;
e.consume();
repaint();
}
}
lastMouseX = newMouseX;
lastMouseY = newMouseY;
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
}