| /******************************************************************************* |
| * Copyright (c) 2000, 2005 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ui.internal.forms.widgets; |
| |
| import java.util.ArrayList; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.MouseEvent; |
| import org.eclipse.swt.graphics.*; |
| import org.eclipse.swt.widgets.Display; |
| |
| public class SelectionData { |
| public Display display; |
| public Color bg; |
| public Color fg; |
| private Point start; |
| private Point stop; |
| private ArrayList segments; |
| private boolean newLineNeeded; |
| |
| public SelectionData(MouseEvent e) { |
| display = e.display; |
| segments = new ArrayList(); |
| start = new Point(e.x, e.y); |
| stop = new Point(e.x, e.y); |
| bg = e.display.getSystemColor(SWT.COLOR_LIST_SELECTION); |
| fg = e.display.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT); |
| } |
| |
| public void markNewLine() { |
| newLineNeeded=true; |
| } |
| public void addSegment(String text) { |
| if (newLineNeeded) { |
| segments.add(System.getProperty("line.separator")); //$NON-NLS-1$ |
| newLineNeeded=false; |
| } |
| segments.add(text); |
| } |
| |
| public void update(MouseEvent e) { |
| //Control c = (Control)e.widget; |
| stop.x = e.x; |
| stop.y = e.y; |
| } |
| public void reset() { |
| segments.clear(); |
| } |
| public String getSelectionText() { |
| StringBuffer buf = new StringBuffer(); |
| for (int i=0; i<segments.size(); i++) { |
| buf.append((String)segments.get(i)); |
| } |
| return buf.toString(); |
| } |
| public boolean canCopy() { |
| return segments.size()>0; |
| } |
| |
| private int getTopOffset() { |
| return start.y<stop.y?start.y:stop.y; |
| } |
| private int getBottomOffset() { |
| return start.y>stop.y?start.y:stop.y; |
| } |
| public int getLeftOffset(Locator locator) { |
| return isInverted(locator)? stop.x:start.x; |
| } |
| public int getLeftOffset(int rowHeight) { |
| return isInverted(rowHeight) ? stop.x:start.x; |
| } |
| public int getRightOffset(Locator locator) { |
| return isInverted(locator)? start.x: stop.x; |
| } |
| public int getRightOffset(int rowHeight) { |
| return isInverted(rowHeight) ? start.x:stop.x; |
| } |
| private boolean isInverted(Locator locator) { |
| int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0]; |
| return isInverted(rowHeight); |
| } |
| private boolean isInverted(int rowHeight) { |
| int deltaY = start.y - stop.y; |
| if (Math.abs(deltaY) > rowHeight) { |
| // inter-row selection |
| return deltaY>0; |
| } |
| // intra-row selection |
| return start.x > stop.x; |
| } |
| public boolean isEnclosed() { |
| return !start.equals(stop); |
| } |
| |
| public boolean isSelectedRow(Locator locator) { |
| if (!isEnclosed()) |
| return false; |
| int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0]; |
| return isSelectedRow(locator.y, rowHeight); |
| } |
| public boolean isSelectedRow(int y, int rowHeight) { |
| if (!isEnclosed()) |
| return false; |
| return (y + rowHeight >= getTopOffset() && |
| y <= getBottomOffset()); |
| } |
| public boolean isFirstSelectionRow(Locator locator) { |
| if (!isEnclosed()) |
| return false; |
| int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0]; |
| return (locator.y + rowHeight >= getTopOffset() && |
| locator.y <= getTopOffset()); |
| } |
| public boolean isFirstSelectionRow(int y, int rowHeight) { |
| if (!isEnclosed()) |
| return false; |
| return (y + rowHeight >= getTopOffset() && |
| y <= getTopOffset()); |
| } |
| public boolean isLastSelectionRow(Locator locator) { |
| if (!isEnclosed()) |
| return false; |
| int rowHeight = ((int [])locator.heights.get(locator.rowCounter))[0]; |
| return (locator.y + rowHeight >=getBottomOffset() && |
| locator.y <= getBottomOffset()); |
| } |
| public boolean isLastSelectionRow(int y, int rowHeight) { |
| if (!isEnclosed()) |
| return false; |
| return (y + rowHeight >=getBottomOffset() && |
| y <= getBottomOffset()); |
| } |
| } |