blob: 914fd208ec0878a0dd75f3d701acafecc35a8111 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.sequence;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
/**
* Created by IntelliJ IDEA.
* User: dan
* Date: Oct 28, 2010
* Time: 10:30:40 PM
* To change this template use File | Settings | File Templates.
*/
public class ZoomingPanel extends JPanel {
private int zoomBoxStartX;
private int zoomBoxStartY;
private int zoomBoxWidth;
private int zoomBoxHeight;
private SequenceDiagram child;
public ZoomingPanel() {
super();
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
startBox(e.getX(), e.getY());
}
@Override
public void mouseReleased(MouseEvent e) {
endBox(e.getX(), e.getY());
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() != MouseEvent.BUTTON1) {
unzoom();
} else {
child.selectState(e.getX(), e.getY());
}
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
((JPanel)e.getSource()).scrollRectToVisible(r);
showBox(e.getX(), e.getY());
}
@Override
public void mouseMoved(MouseEvent e) {
int popupX = ZoomingPanel.this.getLocationOnScreen().x + e.getX();
int popupY = ZoomingPanel.this.getLocationOnScreen().y + e.getY();
child.showPopupText(e.getX(), e.getY(), popupX, popupY);
}
});
BorderLayout layout = new BorderLayout();
layout.setHgap(0);
layout.setVgap(0);
this.setLayout(layout);
}
private void unzoom() {
resizeMe(0, 0, getWidth(), getHeight());
}
void resizeMe(int zoomBoxX, int zoomBoxY, int zoomBoxWidth, int zoomBoxHeight) {
Dimension viewSize = getParent().getSize();
double windowWidth = viewSize.getWidth();
double windowHeight = viewSize.getHeight();
double scaleX = getWidth() / ((double) zoomBoxWidth);
double scaleY = getHeight() / ((double) zoomBoxHeight);
int oldWidth = getWidth();
int oldHeight = getHeight();
int width = (int) (scaleX * windowWidth);
int height = (int) (scaleY * windowHeight);
// this.setPreferredSize(new Dimension(width, height));
child.resizeMe(width, height);
//TODO not sure this one is needed
this.revalidate();
//scroll to the new rectangle
// int scrollX = (int) (zoomBoxX * scaleX);
// int scrollY = (int) (zoomBoxY * scaleY);
// int scrollWidth= (int) (zoomBoxWidth * scaleX);
// int scrollHeight = (int) (zoomBoxHeight * scaleY);
int scrollX = (int) (zoomBoxX * (width / (double) oldWidth));
int scrollY = (int) (zoomBoxY * (height / (double) oldHeight));
int scrollWidth= (int) (zoomBoxWidth * (width / (double) oldWidth));
int scrollHeight = (int) (zoomBoxHeight * (height / (double) oldHeight));
Rectangle r = new Rectangle(scrollX, scrollY, scrollWidth, scrollHeight);
((JViewport)getParent()).scrollRectToVisible(r);
repaint();
}
public void setSequenceDiagram(SequenceDiagram diag) {
this.child = diag;
this.add(child, BorderLayout.CENTER);
}
private void showBox(int x, int y) {
if(zoomBoxWidth != -1) {
repaint(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight());
}
this.zoomBoxWidth = x - zoomBoxStartX;
this.zoomBoxHeight = y - zoomBoxStartY;
repaint(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight());
}
private void startBox(int x, int y) {
this.zoomBoxStartX = x;
this.zoomBoxStartY = y;
}
private void endBox(int x, int y) {
if(zoomBoxStartX != -1 && zoomBoxStartY != -1
&& zoomBoxWidth != -1 && zoomBoxHeight != -1
&& zoomBoxWidth != 0 && zoomBoxHeight != 0) {
resizeMe(getBoxX() , getBoxY(), getBoxWidth(), getBoxHeight());
repaint(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight());
this.zoomBoxStartX = -1;
this.zoomBoxStartY = -1;
this.zoomBoxWidth = -1;
this.zoomBoxHeight = -1;
}
}
public int getBoxX() {
return zoomBoxWidth >= 0 ? zoomBoxStartX : zoomBoxStartX + zoomBoxWidth;
}
public int getBoxY() {
return zoomBoxHeight >= 0 ? zoomBoxStartY : zoomBoxStartY + zoomBoxHeight;
}
public int getBoxHeight() {
return zoomBoxHeight >= 0 ? zoomBoxHeight : -zoomBoxHeight;
}
public int getBoxWidth() {
return zoomBoxWidth >= 0 ? zoomBoxWidth : -zoomBoxWidth;
}
@Override
public void paint(Graphics g) {
super.paint(g);
if(zoomBoxStartX != -1 && zoomBoxStartY != -1 && zoomBoxWidth != -1 && zoomBoxHeight != -1) {
Graphics2D g2 = (Graphics2D) g.create();
Composite old = g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
g2.setColor(Color.BLUE);
// g2.drawRect(zoomBoxStartX, zoomBoxStartY, zoomBoxWidth, zoomBoxHeight);
// g2.setBackground(Color.BLUE);
g2.fillRect(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight());
g2.setComposite(old);
}
}
}