blob: c73a6bf1e2fb5a0774d4df6a79e5f0e7109fce68 [file] [log] [blame]
/*******************************************************************************
* 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());
}
}