forked from LupusNobilis/java-org.hwo.ui
JDiaAutoScaleFix
commit
79109885b5
|
@ -1,12 +1,17 @@
|
||||||
package org.hwo.ui;
|
package org.hwo.ui;
|
||||||
|
|
||||||
|
import java.awt.BasicStroke;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Cursor;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.MouseInfo;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.KeyListener;
|
||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseMotionListener;
|
import java.awt.event.MouseMotionListener;
|
||||||
|
@ -17,6 +22,7 @@ import java.util.LinkedList;
|
||||||
|
|
||||||
import javax.swing.BoundedRangeModel;
|
import javax.swing.BoundedRangeModel;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeEvent;
|
||||||
import javax.swing.event.ChangeListener;
|
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.Scaler;
|
||||||
import org.hwo.ui.diagram.SimplePlotLabeler;
|
import org.hwo.ui.diagram.SimplePlotLabeler;
|
||||||
import org.hwo.ui.diagram.SimplePlotProvider;
|
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 {
|
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<DiagramListener> diagramListeners = new LinkedList<>();
|
||||||
private LinkedList<ChangeListener> changeListeners = new LinkedList<>();
|
private LinkedList<ChangeListener> changeListeners = new LinkedList<>();
|
||||||
|
@ -97,14 +108,14 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
|
|
||||||
private double dragPanStart;
|
private double dragPanStart;
|
||||||
|
|
||||||
|
private Point mousePos;
|
||||||
|
|
||||||
private double mouseWheelZoom = 1.03;
|
private double mouseWheelZoom = 1.03;
|
||||||
|
|
||||||
|
|
||||||
public JDiagram(){
|
public JDiagram(){
|
||||||
setMinimumSize(new Dimension(80, 80));
|
setMinimumSize(new Dimension(80, 80));
|
||||||
setDoubleBuffered(true);
|
setDoubleBuffered(true);
|
||||||
|
|
||||||
|
|
||||||
defaultLabeler = new SimplePlotLabeler();
|
defaultLabeler = new SimplePlotLabeler();
|
||||||
abszissLabeler = defaultLabeler;
|
abszissLabeler = defaultLabeler;
|
||||||
|
|
||||||
|
@ -117,49 +128,82 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
|
|
||||||
drawHorizontalGrid = true;
|
drawHorizontalGrid = true;
|
||||||
|
|
||||||
|
this.dragMode = DDragMode.NONE;
|
||||||
|
|
||||||
verticalGridColor = new Color(192, 192, 192);
|
verticalGridColor = new Color(192, 192, 192);
|
||||||
setBackground(Color.black);
|
setBackground(Color.black);
|
||||||
setForeground(Color.WHITE);
|
setForeground(Color.WHITE);
|
||||||
|
|
||||||
setPlotProvider(new SimplePlotProvider(1, 0));
|
setPlotProvider(new SimplePlotProvider(1, 0));
|
||||||
|
|
||||||
addMouseListener(new MouseAdapter() {
|
addMouseListener(new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mousePressed(MouseEvent e) {
|
public void mousePressed(MouseEvent e) {
|
||||||
|
dragMousePoint = e.getPoint();
|
||||||
|
dragPoint = mapMouseToDiagram(dragMousePoint);
|
||||||
|
|
||||||
|
|
||||||
switch (e.getButton()) {
|
switch (e.getButton()) {
|
||||||
case MouseEvent.BUTTON2:
|
case MouseEvent.BUTTON2:
|
||||||
|
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
|
||||||
dragMode = DDragMode.PAN;
|
dragMode = DDragMode.PAN;
|
||||||
dragMousePoint = e.getPoint();
|
|
||||||
dragPoint = mapMouseToDiagram(dragMousePoint);
|
|
||||||
dragPanStart = getAbszissMinimum();
|
dragPanStart = getAbszissMinimum();
|
||||||
break;
|
break;
|
||||||
|
case MouseEvent.BUTTON1:
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseReleased(MouseEvent e) {
|
public void mouseReleased(MouseEvent e) {
|
||||||
dragMode = DDragMode.NONE;
|
dragMode = DDragMode.NONE;
|
||||||
|
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseExited(MouseEvent e) {
|
||||||
|
mousePos = null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
addMouseMotionListener(new MouseAdapter() {
|
addMouseMotionListener(new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mouseDragged(MouseEvent e) {
|
public void mouseDragged(MouseEvent e) {
|
||||||
Point2D p = mapMouseToDiagram(dragMousePoint);
|
if(dragMousePoint != null) {
|
||||||
Point2D np = mapMouseToDiagram(e.getPoint());
|
Point2D p = mapMouseToDiagram(dragMousePoint);
|
||||||
double dx = np.getX() - p.getX();
|
Point2D np = mapMouseToDiagram(e.getPoint());
|
||||||
|
double dx = np.getX() - p.getX();
|
||||||
switch (dragMode) {
|
|
||||||
case PAN:
|
|
||||||
double nmin = dragPanStart - dx;
|
|
||||||
|
|
||||||
nmin = limitAbszissMinimum(nmin);
|
switch (dragMode) {
|
||||||
|
case PAN:
|
||||||
setAbszissMinimum(nmin);
|
double nmin = dragPanStart - dx;
|
||||||
repaint();
|
|
||||||
break;
|
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() {
|
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(){
|
private void fireViewWindowChanged(){
|
||||||
|
@ -394,6 +463,8 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
paintAbszisse ((Graphics2D) g);
|
paintAbszisse ((Graphics2D) g);
|
||||||
paintGraphs ((Graphics2D) g);
|
paintGraphs ((Graphics2D) g);
|
||||||
}
|
}
|
||||||
|
if(mousePos != null)
|
||||||
|
paintMouseCrosshair((Graphics2D) g);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double[] getordinateLabelHints(int ordinate){
|
public double[] getordinateLabelHints(int ordinate){
|
||||||
|
@ -509,9 +580,7 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void paintAbszisse(Graphics2D g){
|
void paintAbszisse(Graphics2D g){
|
||||||
int nMarker = nAbszissLabels;
|
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
|
* Pan and Zoom
|
||||||
*/
|
*/
|
||||||
|
@ -699,8 +803,6 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
return nmin;
|
return nmin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class OrdinateView {
|
class OrdinateView {
|
||||||
|
|
||||||
int num;
|
int num;
|
||||||
|
@ -738,6 +840,8 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*+++++++++++++++++++++++++BOUNDEND RANGE MODEL+++++++++++++++++++++++++++++*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMinimum() {
|
public int getMinimum() {
|
||||||
return (int)(plotProvider.getPositionMinimum() * 1000.0f);
|
return (int)(plotProvider.getPositionMinimum() * 1000.0f);
|
||||||
|
@ -802,4 +906,5 @@ public class JDiagram extends JComponent implements PlotProviderListener, Bounde
|
||||||
public void removeChangeListener(ChangeListener x) {
|
public void removeChangeListener(ChangeListener x) {
|
||||||
this.changeListeners.remove(x);
|
this.changeListeners.remove(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue