diff --git a/src/org/hwo/ui/JDiagram.java b/src/org/hwo/ui/JDiagram.java index db7f2d5..ee5e485 100644 --- a/src/org/hwo/ui/JDiagram.java +++ b/src/org/hwo/ui/JDiagram.java @@ -1,12 +1,17 @@ package org.hwo.ui; +import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.MouseInfo; import java.awt.Point; import java.awt.Toolkit; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; @@ -17,6 +22,7 @@ import java.util.LinkedList; import javax.swing.BoundedRangeModel; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -32,10 +38,15 @@ import org.hwo.ui.diagram.PlotProviderListener; import org.hwo.ui.diagram.Scaler; import org.hwo.ui.diagram.SimplePlotLabeler; import org.hwo.ui.diagram.SimplePlotProvider; +import java.awt.Rectangle; +import java.awt.Stroke; + +import javax.swing.border.LineBorder; +import java.awt.FlowLayout; public class JDiagram extends JComponent implements PlotProviderListener, BoundedRangeModel { - private enum DDragMode { NONE, PAN } + private enum DDragMode { NONE, PAN, CROSSHAIR } private LinkedList diagramListeners = new LinkedList<>(); private LinkedList changeListeners = new LinkedList<>(); @@ -97,14 +108,14 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde private double dragPanStart; + private Point mousePos; + private double mouseWheelZoom = 1.03; - - + public JDiagram(){ setMinimumSize(new Dimension(80, 80)); setDoubleBuffered(true); - defaultLabeler = new SimplePlotLabeler(); abszissLabeler = defaultLabeler; @@ -117,49 +128,82 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde drawHorizontalGrid = true; + this.dragMode = DDragMode.NONE; + verticalGridColor = new Color(192, 192, 192); setBackground(Color.black); setForeground(Color.WHITE); - + setPlotProvider(new SimplePlotProvider(1, 0)); - + addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { + dragMousePoint = e.getPoint(); + dragPoint = mapMouseToDiagram(dragMousePoint); + + switch (e.getButton()) { case MouseEvent.BUTTON2: + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); dragMode = DDragMode.PAN; - dragMousePoint = e.getPoint(); - dragPoint = mapMouseToDiagram(dragMousePoint); dragPanStart = getAbszissMinimum(); break; + case MouseEvent.BUTTON1: + break; + } } @Override public void mouseReleased(MouseEvent e) { dragMode = DDragMode.NONE; + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + repaint(); + } + + @Override + public void mouseExited(MouseEvent e) { + mousePos = null; } }); - + addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { - Point2D p = mapMouseToDiagram(dragMousePoint); - Point2D np = mapMouseToDiagram(e.getPoint()); - double dx = np.getX() - p.getX(); - - switch (dragMode) { - case PAN: - double nmin = dragPanStart - dx; + if(dragMousePoint != null) { + Point2D p = mapMouseToDiagram(dragMousePoint); + Point2D np = mapMouseToDiagram(e.getPoint()); + double dx = np.getX() - p.getX(); - nmin = limitAbszissMinimum(nmin); - - setAbszissMinimum(nmin); - repaint(); - break; + switch (dragMode) { + case PAN: + double nmin = dragPanStart - dx; + + nmin = limitAbszissMinimum(nmin); + + setAbszissMinimum(nmin); + repaint(); + break; + case CROSSHAIR: + break; + default: + + } } } + + @Override + public void mouseMoved(MouseEvent e) { + if(e.isControlDown()) { + mousePos = e.getPoint(); + } + else { + mousePos = null; + } + + repaint(); + } }); addMouseWheelListener(new MouseWheelListener() { @@ -189,6 +233,31 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde } }); + addKeyListener(new KeyListener() { + + @Override + public void keyTyped(KeyEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void keyReleased(KeyEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) { + System.out.println("CONTROL"); + + if((e.getModifiers() & KeyEvent.ALT_DOWN_MASK) != 0) { + setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); + dragMode = DDragMode.CROSSHAIR; + } + + } + }); } private void fireViewWindowChanged(){ @@ -394,6 +463,8 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde paintAbszisse ((Graphics2D) g); paintGraphs ((Graphics2D) g); } + if(mousePos != null) + paintMouseCrosshair((Graphics2D) g); } public double[] getordinateLabelHints(int ordinate){ @@ -509,9 +580,7 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde } } - } - void paintAbszisse(Graphics2D g){ int nMarker = nAbszissLabels; @@ -610,7 +679,42 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde } } - + + void paintMouseCrosshair(Graphics2D g) { + if(mousePos != null) { + g.setColor(Color.WHITE); + int x = getWidth() - bRight - plotWidth; + int y = bTop + plotHeight; + int xmax = getWidth() - bRight; + int ymax = bTop; + int mx = mousePos.x <= x? x : mousePos.x >= xmax? xmax : mousePos.x; + int my = mousePos.y >= y? y : mousePos.y <= ymax? ymax : mousePos.y; + + Point mp = new Point(mx,my); + + drawDashedLine(g, new Point(x, my),mp); + drawDashedLine(g, new Point(mx, y), mp); + + Point2D mmd = mapMouseToDiagram(mp); + + String display = String.format("[%.2f/%.2f]", mmd.getX(), mmd.getY()); + + int strSize = g.getFontMetrics().stringWidth(display); + + mx = mx + strSize + 10 >= getWidth()? mx - (strSize + 10) : mx + 10; + g.setColor(Color.BLACK); + g.drawString(display, mx, my); + } + } + + public void drawDashedLine(Graphics2D g, Point a, Point b){ + //float dash[] = {10.0f}; + Stroke dashed = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{9}, 0); + g.setStroke(dashed); + g.drawLine(a.x, a.y, b.x, b.y); + + } + /* * Pan and Zoom */ @@ -699,8 +803,6 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde return nmin; } - - class OrdinateView { int num; @@ -738,6 +840,8 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde } +/*+++++++++++++++++++++++++BOUNDEND RANGE MODEL+++++++++++++++++++++++++++++*/ + @Override public int getMinimum() { return (int)(plotProvider.getPositionMinimum() * 1000.0f); @@ -802,4 +906,5 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde public void removeChangeListener(ChangeListener x) { this.changeListeners.remove(x); } + }