Author: sdzmitrovich
Date: 2008-02-26 02:37:32 -0500 (Tue, 26 Feb 2008)
New Revision: 6568
Added:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/EditableTemplateAdapter.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateKeyEventHandler.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateNodesManager.java
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeSourceDomBuilder.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualDomBuilder.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualKeyHandler.java
Log:
was added new attributes editing mechanism
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java 2008-02-26
02:51:01 UTC (rev 6567)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -10,7 +10,7 @@
******************************************************************************/
package org.jboss.tools.vpe.editor;
-import java.util.Iterator;
+import java.util.Iterator;
import java.util.List;
import java.util.Properties;
@@ -26,9 +26,9 @@
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
+import org.eclipse.jface.bindings.Binding;
+import org.eclipse.jface.bindings.keys.KeySequence;
+import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.viewers.ISelection;
@@ -58,12 +58,12 @@
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
-import org.eclipse.ui.internal.keys.WorkbenchKeyboard;
-import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.fieldassist.ContentAssistCommandAdapter;
+import org.eclipse.ui.internal.keys.WorkbenchKeyboard;
+import org.eclipse.ui.keys.IBindingService;
import org.eclipse.ui.progress.UIJob;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
@@ -83,6 +83,7 @@
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.event.XModelTreeEvent;
import org.jboss.tools.common.model.event.XModelTreeListener;
@@ -102,7 +103,6 @@
import org.jboss.tools.common.model.util.ModelFeatureFactory;
import org.jboss.tools.common.model.util.XModelTreeListenerSWTSync;
import org.jboss.tools.jst.jsp.editor.IJSPTextEditor;
-import org.jboss.tools.jst.jsp.editor.IVisualContext;
import org.jboss.tools.jst.jsp.editor.IVisualController;
import org.jboss.tools.jst.jsp.preferences.VpePreference;
import org.jboss.tools.jst.web.tld.TLDToPaletteHelper;
@@ -133,6 +133,7 @@
import org.jboss.tools.vpe.editor.template.VpeTemplate;
import org.jboss.tools.vpe.editor.template.VpeTemplateListener;
import org.jboss.tools.vpe.editor.template.VpeTemplateManager;
+import org.jboss.tools.vpe.editor.template.VpeTemplateNodesManager;
import org.jboss.tools.vpe.editor.toolbar.format.FormatControllerManager;
import org.jboss.tools.vpe.editor.util.HTML;
import org.jboss.tools.vpe.editor.util.TextUtil;
@@ -174,7 +175,7 @@
VpeDomMapping domMapping;
private VpeTemplateManager templateManager;
private VpeSourceDomBuilder sourceBuilder;
- public VpeVisualDomBuilder visualBuilder;
+ private VpeVisualDomBuilder visualBuilder;
private VpeSelectionBuilder selectionBuilder;
private VpeVisualKeyHandler visualKeyHandler;
private ActiveEditorSwitcher switcher = new ActiveEditorSwitcher();
@@ -1379,20 +1380,45 @@
private Node getSourceNodeAt(int offset) {
if (sourceEditor != null && getModel() != null) {
IndexedRegion node = getModel().getIndexedRegion(offset);
- if (node instanceof IDOMElement) {
- IDOMElement element = (IDOMElement)node;
- if (offset < element.getEndStartOffset()) {
- NamedNodeMap attrs = element.getAttributes();
- if (attrs != null) {
- for (int i = 0; i < attrs.getLength(); i++) {
- if (attrs.item(i) instanceof AttrImpl) {
- AttrImpl attr = (AttrImpl)attrs.item(i);
- if (getSourceAttributeOffset(attr, offset) != -1) {
- VpeElementMapping elementMapping =
domMapping.getNearElementMapping(attr.getOwnerElement());
- if (elementMapping != null) {
- String[] atributeNames =
elementMapping.getTemplate().getOutputAtributeNames();
- if (atributeNames != null && atributeNames.length > 0 &&
attr.getName().equalsIgnoreCase(atributeNames[0])) {
- return attr;
+ if (node instanceof IDOMNode) {
+
+ VpeElementMapping elementMapping = domMapping
+ .getNearElementMapping((IDOMNode) node);
+
+ if (elementMapping != null) {
+
+ // if template implements VpeTemplateNodesManager interface
+ if (elementMapping.getTemplate() instanceof VpeTemplateNodesManager) {
+ Node focusedAttr = ((VpeTemplateNodesManager) elementMapping
+ .getTemplate()).getFocusedNode((IDOMNode) node,
+ offset, elementMapping.getData());
+ if (node != null)
+ return focusedAttr;
+ }
+ if (node instanceof IDOMElement) {
+ IDOMElement element = (IDOMElement) node;
+
+ if (offset < element.getEndStartOffset()) {
+ NamedNodeMap attrs = element.getAttributes();
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ if (attrs.item(i) instanceof AttrImpl) {
+ AttrImpl attr = (AttrImpl) attrs
+ .item(i);
+ if (getSourceAttributeOffset(attr,
+ offset) != -1) {
+
+ String[] atributeNames = elementMapping
+ .getTemplate()
+ .getOutputAtributeNames();
+ if (atributeNames != null
+ && atributeNames.length > 0
+ && attr
+ .getName()
+ .equalsIgnoreCase(
+ atributeNames[0])) {
+ return attr;
+ }
}
}
}
@@ -1400,7 +1426,7 @@
}
}
}
- }
+ }
if (node == null) {
node = getModel().getIndexedRegion(offset - 1);
}
@@ -1409,7 +1435,7 @@
}
}
return null;
- }
+ }
private int getSourceNodeOffset(Node node, int pos, boolean endFlag) {
if (node == null) return 0;
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeSourceDomBuilder.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeSourceDomBuilder.java 2008-02-26
02:51:01 UTC (rev 6567)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeSourceDomBuilder.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -17,7 +17,6 @@
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jst.jsp.core.internal.domdocument.TextImplForJSP;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
@@ -38,6 +37,7 @@
import org.jboss.tools.vpe.editor.selection.VpeSelectionHelper;
import org.jboss.tools.vpe.editor.template.VpeTemplate;
import org.jboss.tools.vpe.editor.template.VpeTemplateManager;
+import org.jboss.tools.vpe.editor.template.VpeTemplateNodesManager;
import org.jboss.tools.vpe.editor.util.TextUtil;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMNode;
@@ -55,7 +55,7 @@
IDOMModel model;
private Document sourceDocument;
private VpePageContext pageContext;
- private StructuredTextEditor sourceEditor;
+ private StructuredTextEditor sourceEditor;
public VpeSourceDomBuilder(VpeDomMapping domMapping, INodeAdapter sorceAdapter,
VpeTemplateManager templateManager, StructuredTextEditor sourceEditor, VpePageContext
pageContext) {
super(domMapping, sorceAdapter, templateManager);
@@ -253,10 +253,20 @@
boolean openBundleEditors(nsIDOMNode visualNode) {
Node sourceNode = domMapping.getNearSourceNode(visualNode);
if (sourceNode != null && sourceNode.getNodeType() == Node.ELEMENT_NODE) {
- VpeElementMapping elementMapping =
(VpeElementMapping)domMapping.getNodeMapping(sourceNode);
+ VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+ .getNodeMapping(sourceNode);
if (elementMapping != null) {
+
VpeTemplate template = elementMapping.getTemplate();
- template.openBundleEditors(pageContext, (Element)sourceNode,
elementMapping.getData());
+
+ // if template implements VpeTemplateNodesManager interface
+ if (template instanceof VpeTemplateNodesManager) {
+ return ((VpeTemplateNodesManager) template).openBundle(
+ pageContext, visualNode, elementMapping.getData());
+ } else {
+ template.openBundleEditors(pageContext,
+ (Element) sourceNode, elementMapping.getData());
+ }
}
}
return false;
@@ -310,10 +320,34 @@
Node sourceParent = domMapping.getNearSourceNode(visualText);
if (sourceParent != null) {
if (sourceParent.getNodeType() == Node.ELEMENT_NODE) {
- VpeElementMapping elementMapping =
(VpeElementMapping)domMapping.getNodeMapping(sourceParent);
+
+ VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+ .getNodeMapping(sourceParent);
+
if (elementMapping != null) {
+
VpeTemplate template = elementMapping.getTemplate();
- template.setSourceAttributeSelection(pageContext, (Element)sourceParent, offset,
length, elementMapping.getData());
+
+ // if template implements VpeTemplateAttributesManager
+ // functions
+ if (template instanceof VpeTemplateNodesManager) {
+ // get attribute
+ Node node = ((VpeTemplateNodesManager) template)
+ .getSourceNode(pageContext,
+ visualText, elementMapping.getData());
+ // set selection
+ if (node != null)
+ ((VpeTemplateNodesManager) template)
+ .setSourceNodeSelection(pageContext,
+ node, offset, length);
+ else
+ setSelection(sourceParent, offset, length);
+ } else {
+
+ template.setSourceAttributeSelection(pageContext,
+ (Element) sourceParent, offset, length,
+ elementMapping.getData());
+ }
}
} else if (sourceParent.getNodeType() == Node.COMMENT_NODE) {
// VpeVisualElementInfo info = domMapping.getVisualElementInfo(sourceParent);
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualDomBuilder.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualDomBuilder.java 2008-02-26
02:51:01 UTC (rev 6567)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualDomBuilder.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -29,6 +29,7 @@
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.IDocument;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.ui.IEditorInput;
@@ -38,6 +39,7 @@
import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
import org.eclipse.wst.xml.core.internal.document.ElementImpl;
import org.eclipse.wst.xml.core.internal.document.NodeImpl;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.project.IModelNature;
@@ -62,6 +64,7 @@
import org.jboss.tools.vpe.editor.template.VpeTagDescription;
import org.jboss.tools.vpe.editor.template.VpeTemplate;
import org.jboss.tools.vpe.editor.template.VpeTemplateManager;
+import org.jboss.tools.vpe.editor.template.VpeTemplateNodesManager;
import org.jboss.tools.vpe.editor.template.VpeToggableTemplate;
import org.jboss.tools.vpe.editor.template.dnd.VpeDnd;
import org.jboss.tools.vpe.editor.util.HTML;
@@ -86,7 +89,6 @@
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import org.eclipse.jface.text.IDocument;
public class VpeVisualDomBuilder extends VpeDomBuilder {
/** REGEX_EL */
@@ -1540,35 +1542,54 @@
}
public boolean isTextEditable(nsIDOMNode visualNode) {
- if (visualNode != null) {
- nsIDOMNode parent = visualNode.getParentNode();
- if (parent != null
- && parent.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
- nsIDOMElement element = (nsIDOMElement) parent
- .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
- nsIDOMAttr style = element.getAttributeNode("style");
- if (style != null) {
- String styleValue = style.getNodeValue();
- String[] items = styleValue.split(";");
- for (int i = 0; i < items.length; i++) {
- String[] item = items[i].split(":");
- if ("-moz-user-modify".equals(item[0].trim())
- && "read-only".equals(item[1].trim())) {
- return false;
+
+
+ // get VpeNodeMapping
+ VpeNodeMapping nodeMapping = domMapping
+ .getNearNodeMapping(visualNode);
+
+ // if it is element mapping
+ if (nodeMapping instanceof VpeElementMapping) {
+ // get template
+ VpeTemplate template = ((VpeElementMapping) nodeMapping)
+ .getTemplate();
+ // if template implements VpeTemplateAttributesManager
+ if (template instanceof VpeTemplateNodesManager)
+ return ((VpeTemplateNodesManager) template).isNodeEditable(
+ pageContext, visualNode,
+ ((VpeElementMapping) nodeMapping).getData());
+
+ }
+
+ if (visualNode != null) {
+ nsIDOMNode parent = visualNode.getParentNode();
+ if (parent != null
+ && parent.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
+ nsIDOMElement element = (nsIDOMElement) parent
+ .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
+ nsIDOMAttr style = element.getAttributeNode("style");
+ if (style != null) {
+ String styleValue = style.getNodeValue();
+ String[] items = styleValue.split(";");
+ for (int i = 0; i < items.length; i++) {
+ String[] item = items[i].split(":");
+ if ("-moz-user-modify".equals(item[0].trim())
+ && "read-only".equals(item[1].trim())) {
+ return false;
+ }
+ }
+ }
+ nsIDOMAttr classAttr = element.getAttributeNode("class");
+ if (classAttr != null) {
+ String classValue = classAttr.getNodeValue().trim();
+ if ("__any__tag__caption".equals(classValue)) {
+ return false;
+ }
+ }
}
- }
}
- nsIDOMAttr classAttr = element.getAttributeNode("class");
- if (classAttr != null) {
- String classValue = classAttr.getNodeValue().trim();
- if ("__any__tag__caption".equals(classValue)) {
- return false;
- }
- }
- }
+ return true;
}
- return true;
- }
VpeVisualInnerDropInfo getInnerDropInfo(Node sourceDropContainer,
int sourceDropOffset) {
@@ -1628,7 +1649,7 @@
protected void setTooltip(Element sourceElement, nsIDOMElement visualElement) {
if (visualElement != null && sourceElement != null
- && !((ElementImpl) sourceElement).isJSPTag()) {
+ && !((IDOMElement) sourceElement).isJSPTag()) {
if (HTML.TAG_HTML.equalsIgnoreCase(sourceElement.getNodeName()))
return;
String titleValue = getTooltip(sourceElement);
@@ -1897,6 +1918,13 @@
VpeElementMapping elementMapping = domMapping
.getNearElementMapping(sourceElement);
if (elementMapping != null) {
+
+ if (elementMapping.getTemplate() instanceof VpeTemplateNodesManager) {
+ return (nsIDOMText) ((VpeTemplateNodesManager) elementMapping
+ .getTemplate()).getVisualNode(pageContext, attr,
+ elementMapping.getData());
+ }
+
return elementMapping.getTemplate().getOutputTextNode(pageContext,
sourceElement, elementMapping.getData());
}
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualKeyHandler.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualKeyHandler.java 2008-02-26
02:51:01 UTC (rev 6567)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualKeyHandler.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -44,15 +44,14 @@
import org.jboss.tools.vpe.editor.selection.VpeSourceSelectionBuilder;
import org.jboss.tools.vpe.editor.template.VpeHtmlTemplate;
import org.jboss.tools.vpe.editor.template.VpeTemplate;
+import org.jboss.tools.vpe.editor.template.VpeTemplateKeyEventHandler;
import org.jboss.tools.vpe.editor.util.FlatIterator;
import org.jboss.tools.vpe.editor.util.HTML;
import org.jboss.tools.vpe.editor.util.TextUtil;
-import org.jboss.tools.vpe.editor.util.VpeDebugUtil;
import org.jboss.tools.vpe.xulrunner.editor.XulRunnerVpeUtils;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMKeyEvent;
import org.mozilla.interfaces.nsIDOMNode;
-import org.mozilla.interfaces.nsISelection;
import org.mozilla.xpcom.XPCOMException;
import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
@@ -168,10 +167,21 @@
long keyCode = keyEvent.getKeyCode();
boolean shiftKey = keyEvent.getShiftKey();
+ // get template of selected element
+ VpeTemplate template = getCurrentSelectionTemplate();
+
+ // if template сan handle keyEvent than pass control to him. And if
+ // template handled event return true
+ if ((template instanceof VpeTemplateKeyEventHandler)
+ && ((VpeTemplateKeyEventHandler) template).handleKeyPress(
+ pageContext, keyEvent)) {
+ return true;
+ }
+
if (keyCode == VK_ENTER) {
return split();
} else if (keyCode == VK_LEFT && !shiftKey) {
- return moveLeft();
+ return moveLeft();
} else if (keyCode == VK_UP && !shiftKey) {
return moveUp();
} else if (keyCode == VK_RIGHT && !shiftKey) {
@@ -1814,4 +1824,20 @@
return pageContext.getEditPart().getController().getXulRunnerEditor().getLastSelectedElement();
}
+
+
+ /**
+ * get {@link VpeTemplate} from selection
+ *
+ * @return
+ */
+ private VpeTemplate getCurrentSelectionTemplate() {
+ VpeElementMapping elementMapping = domMapping
+ .getNearElementMapping(getSelectedNode());
+
+ if (elementMapping != null)
+ return elementMapping.getTemplate();
+
+ return null;
+ }
}
\ No newline at end of file
Added:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/EditableTemplateAdapter.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/EditableTemplateAdapter.java
(rev 0)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/EditableTemplateAdapter.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -0,0 +1,763 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is 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:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.vpe.editor.template;
+
+import java.util.List;
+
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMAttr;
+import org.jboss.tools.vpe.editor.context.VpePageContext;
+import org.jboss.tools.vpe.editor.mapping.VpeElementMapping;
+import org.jboss.tools.vpe.editor.mapping.VpeNodeMapping;
+import org.jboss.tools.vpe.editor.util.TextUtil;
+import org.mozilla.interfaces.nsIDOMKeyEvent;
+import org.mozilla.interfaces.nsIDOMNode;
+import org.mozilla.interfaces.nsIDOMText;
+import org.mozilla.interfaces.nsISelection;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Abstract class to handle keyEvent.
+ *
+ * Default implementation of {@link VpeTemplateKeyEventHandler}. In result of
+ * work handleKeyPress() call one from handle* methods.
+ *
+ * You must override some handle* methods if you want change work of your
+ * handler *
+ *
+ * Default implementation of {@link VpeTemplateNodesManager}.
+ *
+ * @author Sergey Dzmitrovich
+ *
+ */
+public abstract class EditableTemplateAdapter extends VpeAbstractTemplate
+ implements VpeTemplateKeyEventHandler, VpeTemplateNodesManager {
+
+ /**
+ * name of "view" tag
+ */
+ private static final String VIEW_TAGNAME = "view";
+
+ /**
+ * name of "locale" attribute
+ */
+ private static final String LOCALE_ATTRNAME = "locale";
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.jboss.tools.vpe.editor.template.VpeTemplateKeyEventHandler#handleKeyPress(org.jboss.tools.vpe.editor.context.VpePageContext,
+ * org.mozilla.interfaces.nsIDOMKeyEvent)
+ */
+ public boolean handleKeyPress(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+
+ long keyCode = keyEvent.getKeyCode();
+
+ if (keyCode == nsIDOMKeyEvent.DOM_VK_ENTER) {
+ return handleEnter(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_LEFT)
+ && (!keyEvent.getShiftKey())) {
+ return handleLeft(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_UP)
+ && (!keyEvent.getShiftKey())) {
+ return handleUp(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_RIGHT)
+ && (!keyEvent.getShiftKey())) {
+ return handleRight(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_DOWN)
+ && (!keyEvent.getShiftKey())) {
+ return handleDown(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_HOME)
+ && (!keyEvent.getShiftKey())) {
+ return handleHome(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_END)
+ && (!keyEvent.getShiftKey())) {
+ return handleEnd(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_BACK_SPACE)
+ && (!keyEvent.getShiftKey())) {
+ return handleLeftDelete(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_DELETE)
+ && (!keyEvent.getShiftKey())) {
+ return handleRightDelete(pageContext, keyEvent);
+
+ } else if ((keyCode == nsIDOMKeyEvent.DOM_VK_PAGE_UP)
+ && (!keyEvent.getShiftKey())) {
+ return handlePageUp(pageContext, keyEvent);
+
+ } else if (keyEvent.getCharCode() != 0) {
+ return handleCharacter(pageContext, keyEvent);
+
+ } else if ((keyEvent.getKeyCode() == nsIDOMKeyEvent.DOM_VK_INSERT)
+ && keyEvent.getShiftKey()) {
+ return handleInsert(pageContext, keyEvent);
+ }
+
+ return false;
+ }
+
+ /**
+ * Default handling of a pressing the "insert" event - always return false.
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleInsert(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /**
+ * Default handling of a pressing a character event
+ *
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleCharacter(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+
+ // get selection
+ nsISelection selection = pageContext.getEditPart().getController()
+ .getXulRunnerEditor().getSelection();
+
+ // get visual node which is focused
+ nsIDOMNode visualNode = selection.getFocusNode();
+
+ System.out.print("\n name:" + visualNode.getLocalName() + "\t
value:"
+ + visualNode.getNodeValue());
+
+ VpeElementMapping elementMapping = getElmentMapping(pageContext,
+ visualNode);
+
+ if (elementMapping == null || elementMapping.getData() == null) {
+ return false;
+ }
+
+ Object data = elementMapping.getData();
+
+ // if node editable
+ if (isNodeEditable(pageContext, visualNode, data)) {
+
+ // get source node
+ Node node = getSourceNode(pageContext, visualNode, data);
+
+ if (node == null)
+ return false;
+
+ // get focus and anchor offsets
+ int focusOffset = selection.getFocusOffset();
+ int anchorOffset = selection.getAnchorOffset();
+
+ // initialization offset and length selected string
+ int startOffset = 0;
+ int length = 0;
+
+ // set start offset and length selected string
+ if (focusOffset < anchorOffset) {
+ startOffset = focusOffset;
+ length = anchorOffset - focusOffset;
+ } else {
+ startOffset = anchorOffset;
+ length = focusOffset - anchorOffset;
+ }
+
+ // get inserted string
+ long charCode = keyEvent.getCharCode();
+ char[] s = new char[1];
+ s[0] = (char) charCode;
+ String str = new String(s);
+ if (TextUtil.containsKey(s[0])) {
+ str = TextUtil.getValue(s[0]);
+ }
+
+ // get value
+ String oldValue = node.getNodeValue();
+
+ // create new value
+ String newValue = oldValue.substring(0, startOffset) + str
+ + oldValue.substring(startOffset + length);
+
+ node.setNodeValue(newValue);
+
+ // set selection
+ setSourceNodeSelection(pageContext, node, startOffset + 1, 0);
+
+ }
+ return true;
+ }
+
+ /**
+ * Default implementation of a handling of a pressing the "page up" event -
+ * always return false.
+ *
+ * Override this method for a handling of a pressing the "page up" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handlePageUp(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /**
+ * Default implementation of a handling of a pressing the "delete" event
+ *
+ * Override this method for a handling of a pressing the "delete" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleRightDelete(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ // get selection
+ nsISelection selection = pageContext.getEditPart().getController()
+ .getXulRunnerEditor().getSelection();
+
+ // get visual node which is focused
+ nsIDOMNode visualNode = selection.getFocusNode();
+
+ VpeElementMapping elementMapping = getElmentMapping(pageContext,
+ visualNode);
+
+ if (elementMapping == null || elementMapping.getData() == null) {
+ return false;
+ }
+
+ Object data = elementMapping.getData();
+
+ // if node editable
+ if (isNodeEditable(pageContext, visualNode, data)) {
+
+ // get source node
+ Node node = getSourceNode(pageContext, visualNode, data);
+
+ if (node == null)
+ return false;
+
+ // get focus and anchor offsets
+ int focusOffset = selection.getFocusOffset();
+ int anchorOffset = selection.getAnchorOffset();
+
+ // initialization offset and length selected string
+ int startOffset = 0;
+ int length = 0;
+
+ // set start offset and length selected string
+ // if text was not selected then will be deleted next character
+ if (focusOffset == anchorOffset) {
+
+ // if offset is end of text will do nothing
+ if (focusOffset == node.getNodeValue().length()) {
+ return true;
+ }
+
+ startOffset = focusOffset;
+ length = 1;
+ }
+ // if some text was selected
+ else if (focusOffset < anchorOffset) {
+ startOffset = focusOffset;
+ length = anchorOffset - focusOffset;
+ } else {
+ startOffset = anchorOffset;
+ length = focusOffset - anchorOffset;
+ }
+
+ // get old value
+ String oldValue = node.getNodeValue();
+
+ // create new value
+ String newValue = oldValue.substring(0, startOffset)
+ + oldValue.substring(startOffset + length);
+
+ // set new value
+ node.setNodeValue(newValue);
+
+ // set new selection
+ setSourceNodeSelection(pageContext, node, startOffset, 0);
+
+ }
+
+ return true;
+ }
+
+ /**
+ * Default implementation of a handling of a pressing the "backspace" event
+ *
+ * Override this method for a handling of a pressing the "backspace" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleLeftDelete(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+
+ // get selection
+ nsISelection selection = pageContext.getEditPart().getController()
+ .getXulRunnerEditor().getSelection();
+
+ // get visual node which is focused
+ nsIDOMNode visualNode = selection.getFocusNode();
+
+ // if node editable
+ VpeElementMapping elementMapping = getElmentMapping(pageContext,
+ visualNode);
+
+ if (elementMapping == null || elementMapping.getData() == null) {
+ return false;
+ }
+
+ Object data = elementMapping.getData();
+
+ // if node editable
+ if (isNodeEditable(pageContext, visualNode, data)) {
+
+ // get source node
+ Node node = getSourceNode(pageContext, visualNode, data);
+
+ if (node == null)
+ return false;
+
+ // get focus and anchor offsets
+ int focusOffset = selection.getFocusOffset();
+ int anchorOffset = selection.getAnchorOffset();
+
+ // initialization offset and length selected string
+ int startOffset = 0;
+ int length = 0;
+
+ // set start offset and length selected string
+ // if text was not selected then will be deleted previous character
+ if (focusOffset == anchorOffset) {
+ // if offset is start of text then will do nothing
+ if (focusOffset == 0)
+ return true;
+ // set start offset to previous character
+ startOffset = focusOffset - 1;
+ length = 1;
+ }
+ // if some text was selected
+ else if (focusOffset < anchorOffset) {
+ startOffset = focusOffset;
+ length = anchorOffset - focusOffset;
+ } else {
+ startOffset = anchorOffset;
+ length = focusOffset - anchorOffset;
+ }
+
+ // get old value
+ String oldValue = node.getNodeValue();
+
+ // create new value
+ String newValue = oldValue.substring(0, startOffset)
+ + oldValue.substring(startOffset + length);
+
+ // set new value
+ node.setNodeValue(newValue);
+
+ // set new selection
+ setSourceNodeSelection(pageContext, node, startOffset, 0);
+
+ }
+
+ return true;
+ }
+
+ /**
+ * Default handling of a pressing the "end" event - always return false.
+ *
+ * Override this method to handle of a pressing the "end" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleEnd(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /**
+ * Default handling of a pressing the "home" event - always return false.
+ *
+ * Override this method to handle of a pressing the "home" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleHome(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /**
+ * Default handling of a pressing the "down" event - always return false.
+ *
+ * Override this method to handle of a pressing the "down" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleDown(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /**
+ * Default handling of a pressing the "right" event - always return false.
+ *
+ * Override this method to handle of a pressing the "right" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleRight(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+
+ // get selection
+ nsISelection selection = pageContext.getEditPart().getController()
+ .getXulRunnerEditor().getSelection();
+
+ // get visual node which is focused
+ nsIDOMNode visualNode = selection.getFocusNode();
+
+ VpeElementMapping elementMapping = getElmentMapping(pageContext,
+ visualNode);
+
+ if (elementMapping == null || elementMapping.getData() == null) {
+ return false;
+ }
+
+ Object data = elementMapping.getData();
+
+ // if node editable
+ if (isNodeEditable(pageContext, visualNode, data)) {
+
+ // get source node
+ Node node = getSourceNode(pageContext, visualNode, data);
+
+ if (node == null)
+ return false;
+
+ // get focus and anchor offsets
+ int focusOffset = selection.getFocusOffset();
+
+ if (focusOffset != node.getNodeValue().length()) {
+ setSourceNodeSelection(pageContext, node, focusOffset + 1, 0);
+ }
+ }
+ return true;
+
+ }
+
+ /**
+ * Default handling of a pressing the "up" event - always return false.
+ *
+ * Override this method to handle of a pressing the "up" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleUp(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /**
+ * Default handling of a pressing the "left" event - always return false.
+ *
+ * Override this method to handle of a pressing the "left" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleLeft(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+
+ // get selection
+ nsISelection selection = pageContext.getEditPart().getController()
+ .getXulRunnerEditor().getSelection();
+
+ // get visual node which is focused
+ nsIDOMNode visualNode = selection.getFocusNode();
+
+ VpeElementMapping elementMapping = getElmentMapping(pageContext,
+ visualNode);
+
+ if (elementMapping == null || elementMapping.getData() == null) {
+ return false;
+ }
+
+ Object data = elementMapping.getData();
+
+ // if node editable
+ if (isNodeEditable(pageContext, visualNode, data)) {
+
+ // get source node
+ Node node = getSourceNode(pageContext, visualNode, data);
+
+ if (node == null)
+ return false;
+
+ // get focus and anchor offsets
+ int focusOffset = selection.getFocusOffset();
+
+ if (focusOffset != 0) {
+ setSourceNodeSelection(pageContext, node, focusOffset - 1, 0);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Default handling of a pressing the "enter" event - always return false.
+ *
+ * Override to handling of a pressing the "enter" event
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param keyEvent -
+ * event
+ * @return whether handled event
+ */
+ protected boolean handleEnter(VpePageContext pageContext,
+ nsIDOMKeyEvent keyEvent) {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.jboss.tools.vpe.editor.template.VpeTemplateNodesManager#getSourceNode(org.jboss.tools.vpe.editor.context.VpePageContext,
+ * org.mozilla.interfaces.nsIDOMNode)
+ */public Node getSourceNode(VpePageContext pageContext,
+ nsIDOMNode visualNode, Object data) {
+
+ if ((data != null) && (data instanceof List)) {
+
+ List<VpeNodeMapping> attributesMapping = (List<VpeNodeMapping>) data;
+
+ for (VpeNodeMapping mapping : attributesMapping) {
+
+ if (mapping.getVisualNode().equals(visualNode))
+ return mapping.getSourceNode();
+
+ }
+
+ }
+ return null;
+ }
+
+ public nsIDOMNode getVisualNode(VpePageContext pageContext, Node node,
+ Object data) {
+ if ((data != null) && (data instanceof List)) {
+
+ List<VpeNodeMapping> attributesMapping = (List<VpeNodeMapping>) data;
+ for (VpeNodeMapping mapping : attributesMapping) {
+ if (mapping.getSourceNode().equals(node))
+ return (nsIDOMText) mapping.getVisualNode();
+ }
+ }
+ return null;
+ }
+
+ public boolean isNodeEditable(VpePageContext pageContext,
+ nsIDOMNode visualNode, Object data) {
+
+ if ((data != null) && (data instanceof List)) {
+
+ List<VpeNodeMapping> attributesMapping = (List<VpeNodeMapping>) data;
+
+ for (VpeNodeMapping mapping : attributesMapping) {
+
+ if (mapping.getVisualNode().equals(visualNode))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.jboss.tools.vpe.editor.template.VpeTemplateNodesManager#setSourceNodeSelection(org.jboss.tools.vpe.editor.context.VpePageContext,
+ * org.w3c.dom.Node, int, int)
+ */
+ public void setSourceNodeSelection(VpePageContext pageContext, Node node,
+ int offset, int length) {
+
+ int start = getStartOffsetNode(node) + 1;
+
+ pageContext.getSourceBuilder().getStructuredTextViewer()
+ .setSelectedRange(start + offset, length);
+ pageContext.getSourceBuilder().getStructuredTextViewer().revealRange(
+ start + offset, length);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
org.jboss.tools.vpe.editor.template.VpeTemplateNodesManager#getFocusedNode(org.w3c.dom.Node,
+ * int)
+ */
+ public Node getFocusedNode(Node sourceNode, int offset, Object data) {
+
+ if ((data != null) && (data instanceof List)) {
+
+ List<VpeNodeMapping> attributesMapping = (List<VpeNodeMapping>) data;
+
+ for (VpeNodeMapping mapping : attributesMapping) {
+
+ if ((offset > getStartOffsetNode(mapping.getSourceNode()))
+ && (offset < getEndOffsetNode(mapping.getSourceNode())))
+ return mapping.getSourceNode();
+ }
+ }
+
+ return sourceNode;
+ }
+
+ /**
+ * get start offset of node
+ *
+ * @param node
+ * @return
+ */
+ private int getStartOffsetNode(Node node) {
+
+ if (node instanceof IDOMAttr) {
+ return ((IDOMAttr) node).getValueRegionStartOffset();
+ } else if (node instanceof IndexedRegion) {
+ return ((IndexedRegion) node).getStartOffset();
+ }
+ return 0;
+ }
+
+ /**
+ * get end offset of node
+ *
+ * @param node
+ * @return
+ */
+ private int getEndOffsetNode(Node node) {
+
+ if (node instanceof IndexedRegion) {
+ return ((IndexedRegion) node).getEndOffset();
+ }
+ return 0;
+ }
+
+ public boolean openBundle(VpePageContext pageContext,
+ nsIDOMNode visualNode, Object data) {
+
+ Node node = getSourceNode(pageContext, visualNode, data);
+
+ // so as nsIDOMMouseEvent doesn't give simple selected nsIDOMText as
+ // target, but nsiSelection can give simple "text"
+ // TODO may be, there is a better way to get selected simple nsIDOMText
+ if (node == null) {
+
+ // get selection
+ nsISelection selection = pageContext.getEditPart().getController()
+ .getXulRunnerEditor().getSelection();
+
+ // get visual node which is focused
+ nsIDOMNode tempNode = selection.getFocusNode();
+
+ node = getSourceNode(pageContext, tempNode, data);
+
+ }
+
+ if (node == null)
+ return false;
+
+ return pageContext.getBundle().openBundle(node.getNodeValue(),
+ getPageLocale(pageContext, node));
+
+ }
+
+ /**
+ *
+ * @param pageContext
+ * @param sourceElement
+ * @return
+ */
+ private String getPageLocale(VpePageContext pageContext, Node sourceNode) {
+
+ while (sourceNode != null) {
+
+ if (VIEW_TAGNAME.equals(sourceNode.getLocalName())) {
+ break;
+ }
+ sourceNode = sourceNode.getParentNode();
+ }
+
+ if ((sourceNode == null) || !(sourceNode instanceof Element)
+ || !(((Element) sourceNode).hasAttribute(LOCALE_ATTRNAME)))
+ return null;
+
+ String locale = ((Element) sourceNode).getAttribute(LOCALE_ATTRNAME);
+
+ return locale;
+
+ }
+
+ private VpeElementMapping getElmentMapping(VpePageContext pageContext,
+ nsIDOMNode node) {
+
+ return pageContext.getDomMapping().getNearElementMapping(node);
+
+ }
+}
Added:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateKeyEventHandler.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateKeyEventHandler.java
(rev 0)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateKeyEventHandler.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is 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:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.vpe.editor.template;
+
+import org.jboss.tools.vpe.editor.context.VpePageContext;
+import org.mozilla.interfaces.nsIDOMKeyEvent;
+
+/**
+ * interface for handling of keyEvent by himself template
+ *
+ * @author Sergey Dzmitrovich
+ *
+ */
+public interface VpeTemplateKeyEventHandler {
+
+ /**
+ * handle keyEvent
+ *
+ * @param pageContext
+ * @param keyEvent -
+ * happens when element of current template is selected and
+ * is pressed key
+ * @return
+ */
+ boolean handleKeyPress(VpePageContext pageContext, nsIDOMKeyEvent keyEvent);
+
+}
Added:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateNodesManager.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateNodesManager.java
(rev 0)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateNodesManager.java 2008-02-26
07:37:32 UTC (rev 6568)
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is 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:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.vpe.editor.template;
+
+import org.jboss.tools.vpe.editor.context.VpePageContext;
+import org.mozilla.interfaces.nsIDOMNode;
+import org.w3c.dom.Node;
+
+/**
+ * Interface for editing of attributes of a template
+ *
+ * @author Sergey Dzmitrovich
+ *
+ */
+public interface VpeTemplateNodesManager {
+
+ /**
+ * @param pageContext -
+ * context of vpe
+ * @param visualNode -
+ * selected visual node
+ *
+ * @return true if selected attribute is editable
+ */
+ public boolean isNodeEditable(VpePageContext pageContext,
+ nsIDOMNode visualNode, Object data);
+
+ /**
+ * set attribute in sourceEditor
+ *
+ * @param pageContext -
+ * context of vpe
+ * @param attr -
+ * attribute
+ * @param focusOffset -
+ * focus offset
+ * @param length -
+ * length of selection
+ *
+ */
+ public void setSourceNodeSelection(VpePageContext pageContext, Node node,
+ int focusOffset, int length);
+
+ /**
+ * get visual element of attribute from source element
+ *
+ * @param pageContext
+ * @param attr
+ * @param data
+ * @return
+ */
+ public nsIDOMNode getVisualNode(VpePageContext pageContext, Node node,
+ Object data);
+
+ /**
+ * get source element of attribute from visual element
+ *
+ * @param pageContext
+ * @param visualNode
+ * @param data
+ * @return
+ */
+ public Node getSourceNode(VpePageContext pageContext,
+ nsIDOMNode visualNode, Object data);
+
+ /**
+ * get sourceNode by offset
+ *
+ * @param sourceNode
+ * @param offset
+ * @return
+ */
+ public Node getFocusedNode(Node sourceNode, int offset, Object data);
+
+ /**
+ * open bundle
+ *
+ * @param pageContext
+ * @param visualNod
+ * @return
+ */
+ boolean openBundle(VpePageContext pageContext, nsIDOMNode visualNode, Object data);
+}