All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.swt.custom.StyledTextDropTargetEffect Maven / Gradle / Ivy

Go to download

The osx x86_64 swt jar as available in the Eclipse 4.6 (Neon) release for OSX. It is suitable for use with jface and other dependencies available from maven central in the org.eclipse.scout.sdk.deps group. The sources is copied from swt-4.6-cocoa-macosx-x86_64.zip from http://download.eclipse.org/eclipse/downloads/drops4/R-4.6-201606061100/ and javadoc is generated from sources.

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2016 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.swt.custom;

import org.eclipse.swt.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

/**
 * This adapter class provides a default drag under effect (eg. select and scroll)
 * when a drag occurs over a StyledText.
 *
 * 

Classes that wish to provide their own drag under effect for a StyledText * can extend this class, override the StyledTextDropTargetEffect.dragOver * method and override any other applicable methods in StyledTextDropTargetEffect to * display their own drag under effect.

* * Subclasses that override any methods of this class should call the corresponding * super method to get the default drag under effect implementation. * *

The feedback value is either one of the FEEDBACK constants defined in * class DND which is applicable to instances of this class, * or it must be built by bitwise OR'ing together * (that is, using the int "|" operator) two or more * of those DND effect constants. *

*

*

*
Feedback:
*
FEEDBACK_SELECT, FEEDBACK_SCROLL
*
*

* * @see DropTargetAdapter * @see DropTargetEvent * @see Sample code and further information * * @since 3.3 */ public class StyledTextDropTargetEffect extends DropTargetEffect { static final int CARET_WIDTH = 2; static final int SCROLL_HYSTERESIS = 100; // milli seconds static final int SCROLL_TOLERANCE = 20; // pixels int currentOffset = -1; long scrollBeginTime; int scrollX = -1, scrollY = -1; Listener paintListener; /** * Creates a new StyledTextDropTargetEffect to handle the drag under effect on the specified * StyledText. * * @param styledText the StyledText over which the user positions the cursor to drop the data */ public StyledTextDropTargetEffect(StyledText styledText) { super(styledText); paintListener = new Listener () { @Override public void handleEvent (Event event) { if (currentOffset != -1) { StyledText text = (StyledText) getControl(); Point position = text.getLocationAtOffset(currentOffset); int height = text.getLineHeight(currentOffset); event.gc.setBackground(event.display.getSystemColor (SWT.COLOR_BLACK)); event.gc.fillRectangle(position.x, position.y, CARET_WIDTH, height); } } }; } /** * This implementation of dragEnter provides a default drag under effect * for the feedback specified in event.feedback. * * For additional information see DropTargetAdapter.dragEnter. * * Subclasses that override this method should call super.dragEnter(event) * to get the default drag under effect implementation. * * @param event the information associated with the drag start event * * @see DropTargetAdapter * @see DropTargetEvent */ @Override public void dragEnter(DropTargetEvent event) { currentOffset = -1; scrollBeginTime = 0; scrollX = -1; scrollY = -1; getControl().removeListener(SWT.Paint, paintListener); getControl().addListener (SWT.Paint, paintListener); } /** * This implementation of dragLeave provides a default drag under effect * for the feedback specified in event.feedback. * * For additional information see DropTargetAdapter.dragLeave. * * Subclasses that override this method should call super.dragLeave(event) * to get the default drag under effect implementation. * * @param event the information associated with the drag leave event * * @see DropTargetAdapter * @see DropTargetEvent */ @Override public void dragLeave(DropTargetEvent event) { StyledText text = (StyledText) getControl(); if (currentOffset != -1) { refreshCaret(text, currentOffset, -1); } text.removeListener(SWT.Paint, paintListener); scrollBeginTime = 0; scrollX = -1; scrollY = -1; } /** * This implementation of dragOver provides a default drag under effect * for the feedback specified in event.feedback. * * For additional information see DropTargetAdapter.dragOver. * * Subclasses that override this method should call super.dragOver(event) * to get the default drag under effect implementation. * * @param event the information associated with the drag over event * * @see DropTargetAdapter * @see DropTargetEvent * @see DND#FEEDBACK_SELECT * @see DND#FEEDBACK_SCROLL */ @Override public void dragOver(DropTargetEvent event) { int effect = event.feedback; StyledText text = (StyledText) getControl(); Point pt = text.getDisplay().map(null, text, event.x, event.y); if ((effect & DND.FEEDBACK_SCROLL) == 0) { scrollBeginTime = 0; scrollX = scrollY = -1; } else { if (text.getCharCount() == 0) { scrollBeginTime = 0; scrollX = scrollY = -1; } else { if (scrollX != -1 && scrollY != -1 && scrollBeginTime != 0 && (pt.x >= scrollX && pt.x <= (scrollX + SCROLL_TOLERANCE) || pt.y >= scrollY && pt.y <= (scrollY + SCROLL_TOLERANCE))) { if (System.currentTimeMillis() >= scrollBeginTime) { Rectangle area = text.getClientArea(); GC gc = new GC(text); FontMetrics fm = gc.getFontMetrics(); gc.dispose(); int charWidth = fm.getAverageCharWidth(); int scrollAmount = 10*charWidth; if (pt.x < area.x + 3*charWidth) { int leftPixel = text.getHorizontalPixel(); text.setHorizontalPixel(leftPixel - scrollAmount); } if (pt.x > area.width - 3*charWidth) { int leftPixel = text.getHorizontalPixel(); text.setHorizontalPixel(leftPixel + scrollAmount); } int lineHeight = text.getLineHeight(); if (pt.y < area.y + lineHeight) { int topPixel = text.getTopPixel(); text.setTopPixel(topPixel - lineHeight); } if (pt.y > area.height - lineHeight) { int topPixel = text.getTopPixel(); text.setTopPixel(topPixel + lineHeight); } scrollBeginTime = 0; scrollX = scrollY = -1; } } else { scrollBeginTime = System.currentTimeMillis() + SCROLL_HYSTERESIS; scrollX = pt.x; scrollY = pt.y; } } } if ((effect & DND.FEEDBACK_SELECT) != 0) { int[] trailing = new int [1]; int newOffset = text.getOffsetAtPoint(pt.x, pt.y, trailing, false); newOffset += trailing [0]; if (newOffset != currentOffset) { refreshCaret(text, currentOffset, newOffset); currentOffset = newOffset; } } } void refreshCaret(StyledText text, int oldOffset, int newOffset) { if (oldOffset != newOffset) { if (oldOffset != -1) { Point oldPos = text.getLocationAtOffset(oldOffset); int oldHeight = text.getLineHeight(oldOffset); text.redraw (oldPos.x, oldPos.y, CARET_WIDTH, oldHeight, false); } if (newOffset != -1) { Point newPos = text.getLocationAtOffset(newOffset); int newHeight = text.getLineHeight(newOffset); text.redraw (newPos.x, newPos.y, CARET_WIDTH, newHeight, false); } } } /** * This implementation of dropAccept provides a default drag under effect * for the feedback specified in event.feedback. * * For additional information see DropTargetAdapter.dropAccept. * * Subclasses that override this method should call super.dropAccept(event) * to get the default drag under effect implementation. * * @param event the information associated with the drop accept event * * @see DropTargetAdapter * @see DropTargetEvent */ @Override public void dropAccept(DropTargetEvent event) { if (currentOffset != -1) { StyledText text = (StyledText) getControl(); text.setSelection(currentOffset); currentOffset = -1; } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy