commit
79109885b5
|
@ -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<DiagramListener> diagramListeners = new LinkedList<>();
|
||||
private LinkedList<ChangeListener> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue