/*
* Copyright 2015 Laszlo Balazs-Csiki
*
* This file is part of Pixelitor. Pixelitor is free software: you
* can redistribute it and/or modify it under the terms of the GNU
* General Public License, version 3 as published by the Free
* Software Foundation.
*
* Pixelitor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pixelitor. If not, see <http://www.gnu.org/licenses/>.
*/
package pixelitor.tools;
import javax.swing.*;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
/**
* Provides a "hand tool"-like behavior (the contents of a scroll pane can be
* moved with a mouse drag) to the hand tool and other components
*/
public class HandToolSupport {
private int startX;
private int startY;
private int maxScrollPositionX;
private int maxScrollPositionY;
public void mousePressed(MouseEvent e, JViewport viewport) {
startX = e.getX();
startY = e.getY();
Dimension viewSize = viewport.getViewSize();
Dimension extentSize = viewport.getExtentSize(); // the size of the visible part of the view in view coordinates
maxScrollPositionX = viewSize.width - extentSize.width;
maxScrollPositionY = viewSize.height - extentSize.height;
}
public void mouseDragged(MouseEvent e, JViewport viewport) {
int dx = e.getX() - startX;
int dy = e.getY() - startY;
Point scrollPos = viewport.getViewPosition();
scrollPos.x -= dx;
scrollPos.y -= dy;
if (scrollPos.x < 0) {
scrollPos.x = 0;
}
if (scrollPos.y < 0) {
scrollPos.y = 0;
}
if (scrollPos.x > maxScrollPositionX) {
scrollPos.x = maxScrollPositionX;
}
if (scrollPos.y > maxScrollPositionY) {
scrollPos.y = maxScrollPositionY;
}
viewport.setViewPosition(scrollPos);
}
/**
* Adds the "hand tool"-like behavior to the given scroll pane
*/
public static void addBehavior(JScrollPane scrollPane) {
scrollPane.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
HandToolSupport support = new HandToolSupport();
JViewport viewport = scrollPane.getViewport();
Component panel = viewport.getView();
panel.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
support.mousePressed(e, viewport);
}
});
panel.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
support.mouseDragged(e, viewport);
}
});
}
}