package org.objectstyle.wolips.componenteditor.part; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.IRewriteTarget; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.graphics.Point; import org.objectstyle.wolips.bindings.api.Wo; import org.objectstyle.wolips.componenteditor.actions.ComponentInserter; import org.objectstyle.wolips.templateeditor.TemplateEditor; public class ComponentDropTargetAdaptor extends DropTargetAdapter { private ComponentEditor _componentEditor; private IRegion _selection; public ComponentDropTargetAdaptor(ComponentEditor componentEditor) { _componentEditor = componentEditor; } public StyledText getStyledText() { return _componentEditor.getTemplateEditor().getSourceEditor().getViewer().getTextWidget(); } public TemplateEditor getTemplateEditor() { return _componentEditor.getTemplateEditor(); } @Override public void dragEnter(DropTargetEvent event) { try { getTemplateEditor().getSourceEditor().getParserCache().getHtmlEntry().clear(); } catch (Exception e) { e.printStackTrace(); } Point selectionRange = getStyledText().getSelectionRange(); if (selectionRange == null) { _selection = null; } else { _selection = new Region(selectionRange.x, selectionRange.y); } if (event.detail == DND.DROP_DEFAULT) { event.detail = DND.DROP_MOVE; } } @Override public void dragOperationChanged(DropTargetEvent event) { if (event.detail == DND.DROP_DEFAULT) { event.detail = DND.DROP_MOVE; } } @Override public void dragOver(DropTargetEvent event) { try { event.feedback |= DND.FEEDBACK_SCROLL; Point controlPoint = getTemplateEditor().getSourceEditor().getViewer().getTextWidget().toControl(event.x, event.y); _selection = getTemplateEditor().getSourceEditor().getSelectionRegionAtPoint(controlPoint, true, true); if (_selection != null) { getTemplateEditor().getSourceEditor().getViewer().setSelectedRange(_selection.getOffset(), _selection.getLength()); } } catch (Exception e) { // e.printStackTrace(); } } @Override public void drop(DropTargetEvent event) { ComponentInserter inserter = null; boolean selectRange = false; IStructuredSelection structuredSelection = (IStructuredSelection) event.data; if (structuredSelection != null && !structuredSelection.isEmpty()) { IResource resource = (IResource) structuredSelection.getFirstElement(); if (resource instanceof IFolder) { IFolder folder = (IFolder) resource; String name = folder.getName(); if (name.endsWith(".wo")) { String componentName = name.substring(0, name.lastIndexOf('.')); boolean inline = true; inserter = new ComponentInserter(_componentEditor, componentName, inline); Wo wo = inserter.getWo(); if (wo != null) { selectRange = wo.isComponentContent(); } } } } if (inserter == null) { event.detail = DND.DROP_NONE; return; } IRewriteTarget target = (IRewriteTarget) _componentEditor.getAdapter(IRewriteTarget.class); if (target != null) { target.beginCompoundChange(); } if (!getTemplateEditor().getSourceEditor().validateEditorInputState()) { event.detail = DND.DROP_NONE; return; } if (selectRange) { getTemplateEditor().getSelectionProvider().setSelection(new TextSelection(_selection.getOffset(), _selection.getLength())); } else { getTemplateEditor().getSelectionProvider().setSelection(new TextSelection(_selection.getOffset(), 0)); } inserter.insert(); } }