Harald Wolff 2018-02-10 14:45:39 +01:00
commit 79109885b5
1 changed files with 131 additions and 26 deletions

View File

@ -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);
}
}