package org.objectstyle.wolips.componenteditor.inspector;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
public abstract class AbstractBindingsDropHandler<T, U, V, W extends Control> implements IWOBrowserDelegate, IAutoscroller.Delegate {
private V _bindingsAnnotation;
private U _selectedItem;
private IAutoscroller _autoscroller;
private PopAnimator _popper;
private W _editorControl;
public AbstractBindingsDropHandler(W editorControl) {
_editorControl = editorControl;
_popper = new PopAnimator();
_popper.setControl(_editorControl);
_autoscroller = createAutoscroller(_editorControl);
_autoscroller.setDelegate(this);
}
public W getEditorControl() {
return _editorControl;
}
public void autoscrollOccurred(IAutoscroller scroller) {
removeHoverAnnotation();
}
public void dispose() {
if (_popper != null) {
if (!_editorControl.isDisposed()) {
_editorControl.removePaintListener(_popper);
}
_popper.dispose();
}
}
public synchronized V getBindingsAnnotation() {
return _bindingsAnnotation;
}
protected synchronized void addHoverAnnotation(U selectedItem) {
_bindingsAnnotation = _addHoverAnnotation(selectedItem);
_popper.startAnimation();
}
protected synchronized void removeHoverAnnotation() {
_popper.stopAnimation();
if (_bindingsAnnotation != null) {
_removeHoverAnnotation(_bindingsAnnotation);
_bindingsAnnotation = null;
_selectedItem = null;
}
}
protected boolean isEditorActive() {
return _editorControl.isVisible();
}
public void bindingDragging(WOBrowserColumn column, Point dragPoint) {
try {
// If the editor isn't visible, don't allow dragging
if (!isEditorActive()) {
removeHoverAnnotation();
return;
}
U previousSelectedItem = _selectedItem;
Point controlDragPoint = _editorControl.toControl(dragPoint);
_autoscroller.autoscroll(controlDragPoint);
Rectangle controlBounds = _editorControl.getBounds();
controlBounds.x = 0;
controlBounds.y = 0;
// Don't bother doing anything if we're outside of the Template
// Editor's bounds
if (controlBounds.contains(controlDragPoint)) {
T selectedContainer = getSelectedContainerAtPoint(controlDragPoint, false);
// We only want to throb WO tags ...
if (selectedContainer != null) {
// IRegion selectionRegion =
// templateSourceEditor.getSelectionRegionForElementAtPoint(element,
// controlDragPoint, false);
U selectedItem = getSelectedItemAtPoint(selectedContainer, controlDragPoint);
// If there's no current selection, clear a previous
// selection
if (selectedItem == null) {
removeHoverAnnotation();
// If there is a current selection and it differs from
// the previous
// selection, calculate new offsets and throb it ...
} else if (isSelectedItemChanged(previousSelectedItem, selectedItem)) {
removeHoverAnnotation();
// If we're scrolling, don't do tag highlighting, or
// we'll mess
// up the metrics
if (_autoscroller.isScrollStarted()) {
// IGNORE
} else {
// Add the annotation
try {
_selectedItem = selectedItem;
Rectangle selectionRect = getSelectionRectangle(selectedItem);
_popper.setAnimationRect(selectionRect);
addHoverAnnotation(selectedItem);
} catch (Throwable t) {
_popper.setAnimationRect(null);
}
}
// Otherwise we're on the same selection, so repaint it
// so it throbs
} else {
_popper.step();
}
// It's not a WO tag, so just clear any current selection
// ...
} else if (_bindingsAnnotation != null) {
removeHoverAnnotation();
}
} else if (_bindingsAnnotation != null) {
removeHoverAnnotation();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void bindingDragCanceled(WOBrowserColumn column) {
bindingDragFinished(column, null, false, null);
}
public boolean bindingDropped(WOBrowserColumn column, Point dropPoint, BindingsDragHandler dragHandler) {
return bindingDragFinished(column, dropPoint, true, dragHandler);
}
public boolean bindingDragFinished(WOBrowserColumn column, Point dropPoint, boolean dropped, BindingsDragHandler dragHandler) {
boolean dropFinished = true;
try {
_autoscroller.stopScroll();
Point controlDragPoint = _editorControl.toControl(dropPoint);
Rectangle controlBounds = _editorControl.getBounds();
controlBounds.x = 0;
controlBounds.y = 0;
if (isEditorActive() && dropped && controlBounds.contains(controlDragPoint)) {
dropFinished = dropFromColumnAtPoint(column, dropPoint, dragHandler);
} else {
removeHoverAnnotation();
}
} catch (Exception e) {
e.printStackTrace();
}
return dropFinished;
}
public void browserColumnAdded(WOBrowserColumn column) {
// System.out.println("WOBrowserPageBookView.browserColumnAdded: " +
// column);
}
public void browserColumnRemoved(WOBrowserColumn column) {
// System.out.println("BindingsInspectorPage.browserColumnRemoved: " +
// column);
}
protected abstract IAutoscroller createAutoscroller(W editorControl);
protected abstract V _addHoverAnnotation(U selectedItem);
protected abstract void _removeHoverAnnotation(V annotation);
protected abstract boolean isSelectedItemChanged(U oldItem, U newItem);
protected abstract U getSelectedItemAtPoint(T container, Point point);
protected abstract T getSelectedContainerAtPoint(Point point, boolean forDrop) throws Exception;
protected abstract Rectangle getSelectionRectangle(U item);
protected abstract boolean dropFromColumnAtPoint(WOBrowserColumn column, Point dropPoint, BindingsDragHandler dragHandler) throws Exception;
}