package org.objectstyle.wolips.componenteditor.inspector; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.source.Annotation; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.MenuEvent; import org.eclipse.swt.events.MenuListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Shell; import org.objectstyle.wolips.bindings.wod.IWodElement; import org.objectstyle.wolips.componenteditor.ComponenteditorPlugin; import org.objectstyle.wolips.templateeditor.TemplateEditor; import org.objectstyle.wolips.wodclipse.core.document.ITextWOEditor; public class BindingsTextDropHandler extends AbstractBindingsDropHandler<IWodElement, IRegion, Annotation, StyledText> implements MenuListener { private ITextWOEditor _woEditor; private BindingsPopUpMenu _bindingsMenu; public BindingsTextDropHandler(ITextWOEditor woEditor) { super(woEditor.getWOEditorControl()); _woEditor = woEditor; Shell shell = new Shell(woEditor.getWOEditorControl().getShell()); try { _bindingsMenu = new BindingsPopUpMenu(shell, woEditor.getParserCache()); _bindingsMenu.getMenu().addMenuListener(this); } catch (Exception e) { ComponenteditorPlugin.getDefault().log(e); } } public void menuHidden(MenuEvent event) { removeHoverAnnotation(); } public void menuShown(MenuEvent event) { // DO NOTHING } public void dispose() { if (_bindingsMenu != null) { _bindingsMenu.dispose(); } super.dispose(); } @Override protected Annotation _addHoverAnnotation(IRegion selectedItem) { Annotation annotation = new Annotation(TemplateEditor.BINDING_HOVER_ANNOTATION, false, null); _woEditor.getWOSourceViewer().getAnnotationModel().addAnnotation(annotation, new Position(selectedItem.getOffset(), selectedItem.getLength())); return annotation; } @Override protected void _removeHoverAnnotation(Annotation annotation) { if (annotation != null) { _woEditor.getWOSourceViewer().getAnnotationModel().removeAnnotation(annotation); } } @Override protected IAutoscroller createAutoscroller(StyledText editorControl) { return new TextAutoscroller(editorControl); } @Override protected IWodElement getSelectedContainerAtPoint(Point point, boolean forDrop) throws Exception { IWodElement wodElement = _woEditor.getWodElementAtPoint(point, forDrop, true); return wodElement; } @Override protected IRegion getSelectedItemAtPoint(IWodElement container, Point point) { IRegion selectionRegion = new Region(container.getStartOffset(), container.getFullEndOffset() - container.getStartOffset()); return selectionRegion; } @Override protected Rectangle getSelectionRectangle(IRegion item) { Rectangle selectionRect = getEditorControl().getTextBounds(item.getOffset(), item.getOffset() + item.getLength() - 1); return selectionRect; } @Override protected boolean isSelectedItemChanged(IRegion oldItem, IRegion newItem) { return oldItem == null || oldItem.getOffset() != newItem.getOffset(); } @Override protected boolean dropFromColumnAtPoint(WOBrowserColumn column, Point dropPoint, BindingsDragHandler dragHandler) throws Exception { boolean dropFinished = true; Point controlDropPoint = getEditorControl().toControl(dropPoint); IWodElement wodElement = _woEditor.getWodElementAtPoint(controlDropPoint, true, true); if (wodElement == null) { removeHoverAnnotation(); } else { String droppedKeyPath = column.getSelectedKeyPath(); if (_bindingsMenu != null) { boolean menuShown = _bindingsMenu.showMenuAtLocation(wodElement, droppedKeyPath, dropPoint, dragHandler); if (!menuShown) { removeHoverAnnotation(); } else { dropFinished = false; } } } return dropFinished; } }