package org.eclipse.iee.editor.core.pad; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; public class MouseEventManager implements MouseListener, MouseMoveListener, MouseTrackListener { private Composite fComposite; private Cursor fResizeCursorNS = new Cursor(null, SWT.CURSOR_SIZENS); private Cursor fResizeCursorEW = new Cursor(null, SWT.CURSOR_SIZEWE); private Cursor fArrowCursor = new Cursor(null, SWT.CURSOR_ARROW); private Cursor fResizeCursorNWSE = new Cursor(null, SWT.CURSOR_SIZENWSE); private boolean fIsCursorCanBeChanged = true; private boolean fCanResize = false; private boolean fIsResizing = false; private boolean fChangeWidth = false; private boolean fChangeHeigth = false; public MouseEventManager(Composite composite) { fComposite = composite; } @Override public void mouseExit(MouseEvent e) { fComposite.setCursor(fArrowCursor); fCanResize = false; fChangeWidth = false; fChangeHeigth = false; } @Override public void mouseMove(MouseEvent e) { int delta = IPadConfiguration.BORDER_WIDTH + 3; Point border = fComposite.getSize(); if (fIsCursorCanBeChanged) { if (e.x < border.x - delta) { if (e.y > border.y - delta) { /* bottom side */ fComposite.setCursor(fResizeCursorNS); fCanResize = true; fChangeWidth = false; fChangeHeigth = true; } } else { if (e.y > border.y - delta) { /* bottom-right corner */ fComposite.setCursor(fResizeCursorNWSE); fCanResize = true; fChangeWidth = true; fChangeHeigth = true; } else { /* right side */ fComposite.setCursor(fResizeCursorEW); fCanResize = true; fChangeWidth = true; fChangeHeigth = false; } } } } @Override public void mouseDown(MouseEvent e) { /* First button is pressed for resizing */ if (e.button == 1 && fCanResize) { fIsResizing = true; fIsCursorCanBeChanged = false; } } @Override public void mouseUp(MouseEvent e) { if (e.button != 1) { return; } /* If first button is released: */ if (fIsResizing) { Point beforeResize = fComposite.getSize(); Rectangle beforeResizeBounds = fComposite.getBounds(); if (e.x > 0 && e.y > 0) { Point afterResize = null; Rectangle afterResizeBounds = null; int newWidth = e.x; int newHeigth = e.y; int newLocationX = beforeResizeBounds.x; int newLocationY = beforeResizeBounds.y; if (fChangeWidth && fChangeHeigth) { // To prevent appearance of uninformative pad // XXX Pad's min size if (newWidth < 70) newWidth = 70; if (newHeigth < 70) newHeigth = 70; } if (fChangeWidth && !fChangeHeigth) { newHeigth = beforeResize.y; if (newWidth < 70) newWidth = 70; } if (!fChangeWidth && fChangeHeigth) { newWidth = beforeResize.x; if (newHeigth < 70) newHeigth = 70; } // Now the case is unreached if (!fChangeWidth && !fChangeHeigth) { newWidth = beforeResize.x; newHeigth = beforeResize.y; } afterResize = new Point(newWidth, newHeigth); afterResizeBounds = new Rectangle(newLocationX, newLocationY, newWidth, newHeigth); fComposite.setSize(afterResize); fComposite.setBounds(afterResizeBounds); fComposite.redraw(); } fIsCursorCanBeChanged = true; fIsResizing = false; fCanResize = false; } } @Override public void mouseDoubleClick(MouseEvent e) {} @Override public void mouseHover(MouseEvent e) {} @Override public void mouseEnter(MouseEvent e) {} }