/******************************************************************************* * Copyright (c) 2004, 2007 Boeing. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Boeing - initial API and implementation *******************************************************************************/ package org.eclipse.nebula.widgets.xviewer.util.internal; import org.eclipse.nebula.widgets.xviewer.XViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; /** * @author Donald G. Dunne */ public class XViewerMouseListener implements MouseListener { private final XViewer xViewer; private MouseEvent leftClickEvent; public XViewerMouseListener(XViewer xViewer) { this.xViewer = xViewer; } @Override public void mouseDoubleClick(MouseEvent event) { Point point = new Point(event.x, event.y); TreeColumn column = xViewer.getColumnUnderMouseClick(point); TreeItem itemToReturn = xViewer.getItemUnderMouseClick(point); xViewer.handleDoubleClick(column, itemToReturn); } @Override public void mouseDown(MouseEvent event) { if (isLeftClick(event)) { leftClickEvent = event; } if (isRightClick(event)) { xViewer.processRightClickMouseEvent(new Point(event.x, event.y)); } } private boolean isRightClick(MouseEvent event) { return event.button == 3; } @Override public void mouseUp(MouseEvent event) { TreeItem item = xViewer.getItemUnderMouseClick(new Point(event.x, event.y)); if (item == null) { return; } try { TreeColumn column = xViewer.getColumnUnderMouseClick(new Point(event.x, event.y)); if (column == null) { return; } if (isLeftClick(event) && controlNotBeingHeld(event)) { if (altIsBeingHeld(event)) { // System.out.println("Column " + colNum); xViewer.handleAltLeftClick(column, item); } else if (clickOccurredInIconArea(event, item)) { xViewer.handleLeftClickInIconArea(column, item); } else { // System.out.println("Column " + colNum); xViewer.handleLeftClick(column, item); } } xViewer.updateStatusLabel(); } catch (ArrayIndexOutOfBoundsException ex) { // mouse clicked outside of last/valid column return; } } private boolean clickOccurredInIconArea(MouseEvent event, TreeItem item) { Integer columnNumber = xViewer.getColumnNumberUnderMouseClick(new Point(event.x, event.y)); if (columnNumber == null) { return false; } Rectangle rect = item.getBounds(columnNumber); return (event.x <= (rect.x + 18)); } private boolean isLeftClick(MouseEvent event) { return event.button == 1; } private boolean altIsBeingHeld(MouseEvent event) { return ((event.stateMask & SWT.MODIFIER_MASK) == SWT.ALT); } private boolean controlNotBeingHeld(MouseEvent event) { return !controlBeingHeld(event); } private boolean controlBeingHeld(MouseEvent event) { return ((event.stateMask & SWT.MODIFIER_MASK) == SWT.CTRL); } public MouseEvent getLeftClickEvent() { return leftClickEvent; } }