package dba.gui.auxClasses.jGraph;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.swing.mxGraphOutline;
import com.mxgraph.view.mxGraphView;
import javax.swing.*;
import java.awt.event.MouseEvent;
import dba.utils.constants;
/**
* Wrapper for mxGraphOutline, enforces maximum and minimum ZoomFactors
*/
public class XGraphOutline extends mxGraphOutline {
public XGraphOutline(mxGraphComponent component) {
super(component);
super.removeMouseListener(tracker);
super.removeMouseMotionListener(tracker);
super.tracker = new XMouseTracker();
super.addMouseMotionListener(tracker);
super.addMouseListener(tracker);
}
/**
* Wrapper for MouseTracker, constrains the reachable ZoomLevels
*/
public class XMouseTracker extends MouseTracker {
/*
*Calculates new ZoomFactor and Visible Area after the mouse is released
*/
@Override
public void mouseReleased(MouseEvent e) {
if (start != null) {
if (zoomGesture) {
double dx = e.getX() - start.getX();
double w = finderBounds.getWidth();
final JScrollBar hs = graphComponent.getHorizontalScrollBar();
final double sx;
if (hs != null) {
sx = (double) hs.getValue() / hs.getMaximum();
} else {
sx = 0;
}
final JScrollBar vs = graphComponent.getVerticalScrollBar();
final double sy;
if (vs != null) {
sy = (double) vs.getValue() / vs.getMaximum();
} else {
sy = 0;
}
mxGraphView view = graphComponent.getGraph().getView();
double scale = view.getScale();
double newScale = scale - (dx * scale) / w;
//Enforce minimum and maximum ZoomLevels
if (newScale > constants.maximumZoomFactor) {
newScale = constants.maximumZoomFactor;
} else if (newScale < constants.minimumZoomFactor) {
newScale = constants.minimumZoomFactor;
}
double factor = newScale / scale;
view.setScale(newScale);
if (hs != null) {
hs.setValue((int) (sx * hs.getMaximum() * factor));
}
if (vs != null) {
vs.setValue((int) (sy * vs.getMaximum() * factor));
}
}
zoomGesture = false;
start = null;
}
}
}
}