[jbosstools-commits] JBoss Tools SVN: r6155 - in trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor: context and 3 other directories.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Thu Feb 7 08:49:33 EST 2008


Author: mareshkau
Date: 2008-02-07 08:49:32 -0500 (Thu, 07 Feb 2008)
New Revision: 6155

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/VpePreviewDomBuilder.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/context/VpePageContext.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeDomMapping.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeElementMapping.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeHtmlTemplate.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeJspRootCreator.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTaglibCreator.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateManager.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateSet.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeXmlnsCreator.java
   trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/XmlUtil.java
Log:
http://jira.jboss.org/jira/browse/JBIDE-788

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-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -1,298 +1,299 @@
-/*******************************************************************************
- * Copyright (c) 2007 Exadel, Inc. and 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:
- *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
- ******************************************************************************/ 
-package org.jboss.tools.vpe.editor;
-
+/*******************************************************************************
+ * Copyright (c) 2007 Exadel, Inc. and 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:
+ *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/ 
+package org.jboss.tools.vpe.editor;
+
 import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
+import java.util.List;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IMenuListener;
+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.text.ITextSelection;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.LineStyleEvent;
-import org.eclipse.swt.custom.LineStyleListener;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.MenuEvent;
-import org.eclipse.swt.events.MenuListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.LineStyleEvent;
+import org.eclipse.swt.custom.LineStyleListener;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.events.MenuListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MessageBox;
+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.PlatformUI;
-import org.eclipse.ui.actions.ActionFactory;
+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.progress.UIJob;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.view.events.INodeSelectionListener;
-import org.eclipse.wst.sse.ui.internal.view.events.ITextSelectionListener;
-import org.eclipse.wst.sse.ui.internal.view.events.NodeSelectionChangedEvent;
-import org.eclipse.wst.sse.ui.internal.view.events.TextSelectionChangedEvent;
-import org.eclipse.wst.xml.core.internal.document.AttrImpl;
-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.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.jboss.tools.common.model.XModelObject;
-import org.jboss.tools.common.model.event.XModelTreeEvent;
-import org.jboss.tools.common.model.event.XModelTreeListener;
-import org.jboss.tools.common.model.options.PreferenceModelUtilities;
-import org.jboss.tools.common.model.ui.dnd.ModelTransfer;
-import org.jboss.tools.common.model.ui.editor.IModelObjectEditorInput;
-import org.jboss.tools.common.model.ui.editors.dnd.DropCommandFactory;
-import org.jboss.tools.common.model.ui.editors.dnd.DropData;
-import org.jboss.tools.common.model.ui.editors.dnd.IDropCommand;
-import org.jboss.tools.common.model.ui.editors.dnd.JSPTagProposalFactory;
-import org.jboss.tools.common.model.ui.editors.dnd.context.InnerDragBuffer;
-import org.jboss.tools.common.model.ui.objecteditor.ExtendedProperties;
-import org.jboss.tools.common.model.ui.objecteditor.ExtendedPropertiesWizard;
-import org.jboss.tools.common.model.ui.util.ModelUtilities;
-import org.jboss.tools.common.model.ui.views.palette.PaletteInsertHelper;
-import org.jboss.tools.common.model.util.EclipseResourceUtil;
-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.IVisualController;
-import org.jboss.tools.jst.jsp.preferences.VpePreference;
-import org.jboss.tools.jst.web.tld.TLDToPaletteHelper;
-import org.jboss.tools.jst.web.tld.TLDUtil;
-import org.jboss.tools.jst.web.tld.URIConstants;
-import org.jboss.tools.vpe.VpeDebug;
-import org.jboss.tools.vpe.VpePlugin;
-import org.jboss.tools.vpe.editor.bundle.BundleMap;
-import org.jboss.tools.vpe.editor.context.VpePageContext;
-import org.jboss.tools.vpe.editor.css.AbsoluteFolderReferenceList;
-import org.jboss.tools.vpe.editor.css.CSSReferenceList;
-import org.jboss.tools.vpe.editor.css.RelativeFolderReferenceList;
-import org.jboss.tools.vpe.editor.css.ResourceReferenceListListener;
-import org.jboss.tools.vpe.editor.css.TaglibReferenceList;
-import org.jboss.tools.vpe.editor.mapping.VpeDomMapping;
-import org.jboss.tools.vpe.editor.mapping.VpeElementMapping;
-import org.jboss.tools.vpe.editor.menu.NodeActionManager;
-import org.jboss.tools.vpe.editor.menu.BaseActionManager.MyMenuManager;
-import org.jboss.tools.vpe.editor.mozilla.EditorDomEventListener;
-import org.jboss.tools.vpe.editor.mozilla.MozillaDropInfo;
-import org.jboss.tools.vpe.editor.mozilla.MozillaEditor;
-import org.jboss.tools.vpe.editor.selection.VpeSelectionController;
-import org.jboss.tools.vpe.editor.selection.VpeSelectionHelper;
-import org.jboss.tools.vpe.editor.template.VpeAnyData;
-import org.jboss.tools.vpe.editor.template.VpeEditAnyDialog;
-import org.jboss.tools.vpe.editor.template.VpeHtmlTemplate;
-import org.jboss.tools.vpe.editor.template.VpeIncludeList;
-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.toolbar.format.FormatControllerManager;
-import org.jboss.tools.vpe.editor.util.HTML;
-import org.jboss.tools.vpe.editor.util.TextUtil;
-import org.jboss.tools.vpe.editor.util.VisualDomUtil;
-import org.jboss.tools.vpe.editor.util.VpeDndUtil;
-import org.jboss.tools.vpe.messages.VpeUIMessages;
-import org.jboss.tools.vpe.selbar.SelectionBar;
-import org.jboss.tools.vpe.xulrunner.browser.util.DOMTreeDumper;
-import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
-import org.mozilla.interfaces.nsIDOMDocument;
-import org.mozilla.interfaces.nsIDOMElement;
-import org.mozilla.interfaces.nsIDOMEvent;
-import org.mozilla.interfaces.nsIDOMKeyEvent;
-import org.mozilla.interfaces.nsIDOMMouseEvent;
-import org.mozilla.interfaces.nsIDOMMutationEvent;
-import org.mozilla.interfaces.nsIDOMNode;
-import org.mozilla.interfaces.nsISelection;
-import org.mozilla.interfaces.nsISelectionListener;
-import org.mozilla.interfaces.nsISupports;
-import org.mozilla.xpcom.Mozilla;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-public class VpeController implements  INodeAdapter, IModelLifecycleListener, INodeSelectionListener, ITextSelectionListener, SelectionListener, EditorDomEventListener, VpeTemplateListener, XModelTreeListener, ResourceReferenceListListener, ISelectionChangedListener, IVisualController {
-	
-	StructuredTextEditor sourceEditor;
-	private MozillaEditor visualEditor;
-//	MozillaBrowser browser;
-	XulRunnerEditor xulRunnerEditor;
-	// TODO Sergey Vasilyev figure out with nsIPressShell
-//	private nsIPresShell presShell;
-	// TODO Max Areshkau figure out with nsISelectionController
-	private VpeSelectionController visualSelectionController;
-	VpeDomMapping domMapping;
-	private VpeTemplateManager templateManager;
-	private VpeSourceDomBuilder sourceBuilder;
-	public VpeVisualDomBuilder visualBuilder;
-	private VpeSelectionBuilder selectionBuilder;
-	private VpeVisualKeyHandler visualKeyHandler;
-	private ActiveEditorSwitcher switcher = new ActiveEditorSwitcher();
-	private Attr lastRemovedAttr;
-	private String lastRemovedAttrName;
-	private boolean mouseUpSelectionReasonFlag;
-	private boolean mouseDownSelectionFlag;
-	private boolean sourceChangeFlag;
-	private VpePageContext pageContext;
-	private BundleMap bundle;
-	private VpeEditorPart editPart;
-	private static final int AROUND_MENU = 1;
-	private static final int BEFORE_MENU = 2;
-	private static final int AFTER_MENU = 3;
-	
-	private CSSReferenceList cssReferenceListListener;
-	private TaglibReferenceList taglibReferenceListListener;
-	private AbsoluteFolderReferenceList absoluteFolderReferenceListListener;
-	private RelativeFolderReferenceList relativeFolderReferenceListListener;
-	private VpeIncludeList includeList = new VpeIncludeList();
-	private VpeVisualInnerDragInfo innerDragInfo = null;
-	private FormatControllerManager toolbarFormatControllerManager = null;
-	private SelectionBar selectionBar = null;
+import org.eclipse.ui.progress.UIJob;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
+import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.internal.view.events.INodeSelectionListener;
+import org.eclipse.wst.sse.ui.internal.view.events.ITextSelectionListener;
+import org.eclipse.wst.sse.ui.internal.view.events.NodeSelectionChangedEvent;
+import org.eclipse.wst.sse.ui.internal.view.events.TextSelectionChangedEvent;
+import org.eclipse.wst.xml.core.internal.document.AttrImpl;
+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.IDOMDocument;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.jboss.tools.common.model.XModelObject;
+import org.jboss.tools.common.model.event.XModelTreeEvent;
+import org.jboss.tools.common.model.event.XModelTreeListener;
+import org.jboss.tools.common.model.options.PreferenceModelUtilities;
+import org.jboss.tools.common.model.ui.dnd.ModelTransfer;
+import org.jboss.tools.common.model.ui.editor.IModelObjectEditorInput;
+import org.jboss.tools.common.model.ui.editors.dnd.DropCommandFactory;
+import org.jboss.tools.common.model.ui.editors.dnd.DropData;
+import org.jboss.tools.common.model.ui.editors.dnd.IDropCommand;
+import org.jboss.tools.common.model.ui.editors.dnd.JSPTagProposalFactory;
+import org.jboss.tools.common.model.ui.editors.dnd.context.InnerDragBuffer;
+import org.jboss.tools.common.model.ui.objecteditor.ExtendedProperties;
+import org.jboss.tools.common.model.ui.objecteditor.ExtendedPropertiesWizard;
+import org.jboss.tools.common.model.ui.util.ModelUtilities;
+import org.jboss.tools.common.model.ui.views.palette.PaletteInsertHelper;
+import org.jboss.tools.common.model.util.EclipseResourceUtil;
+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;
+import org.jboss.tools.jst.web.tld.TLDUtil;
+import org.jboss.tools.jst.web.tld.URIConstants;
+import org.jboss.tools.vpe.VpeDebug;
+import org.jboss.tools.vpe.VpePlugin;
+import org.jboss.tools.vpe.editor.bundle.BundleMap;
+import org.jboss.tools.vpe.editor.context.VpePageContext;
+import org.jboss.tools.vpe.editor.css.AbsoluteFolderReferenceList;
+import org.jboss.tools.vpe.editor.css.CSSReferenceList;
+import org.jboss.tools.vpe.editor.css.RelativeFolderReferenceList;
+import org.jboss.tools.vpe.editor.css.ResourceReferenceListListener;
+import org.jboss.tools.vpe.editor.css.TaglibReferenceList;
+import org.jboss.tools.vpe.editor.mapping.VpeDomMapping;
+import org.jboss.tools.vpe.editor.mapping.VpeElementMapping;
+import org.jboss.tools.vpe.editor.menu.NodeActionManager;
+import org.jboss.tools.vpe.editor.menu.BaseActionManager.MyMenuManager;
+import org.jboss.tools.vpe.editor.mozilla.EditorDomEventListener;
+import org.jboss.tools.vpe.editor.mozilla.MozillaDropInfo;
+import org.jboss.tools.vpe.editor.mozilla.MozillaEditor;
+import org.jboss.tools.vpe.editor.selection.VpeSelectionController;
+import org.jboss.tools.vpe.editor.selection.VpeSelectionHelper;
+import org.jboss.tools.vpe.editor.template.VpeAnyData;
+import org.jboss.tools.vpe.editor.template.VpeEditAnyDialog;
+import org.jboss.tools.vpe.editor.template.VpeHtmlTemplate;
+import org.jboss.tools.vpe.editor.template.VpeIncludeList;
+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.toolbar.format.FormatControllerManager;
+import org.jboss.tools.vpe.editor.util.HTML;
+import org.jboss.tools.vpe.editor.util.TextUtil;
+import org.jboss.tools.vpe.editor.util.VisualDomUtil;
+import org.jboss.tools.vpe.editor.util.VpeDndUtil;
+import org.jboss.tools.vpe.messages.VpeUIMessages;
+import org.jboss.tools.vpe.selbar.SelectionBar;
+import org.jboss.tools.vpe.xulrunner.browser.util.DOMTreeDumper;
+import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
+import org.mozilla.interfaces.nsIDOMDocument;
+import org.mozilla.interfaces.nsIDOMElement;
+import org.mozilla.interfaces.nsIDOMEvent;
+import org.mozilla.interfaces.nsIDOMKeyEvent;
+import org.mozilla.interfaces.nsIDOMMouseEvent;
+import org.mozilla.interfaces.nsIDOMMutationEvent;
+import org.mozilla.interfaces.nsIDOMNode;
+import org.mozilla.interfaces.nsISelection;
+import org.mozilla.interfaces.nsISelectionListener;
+import org.mozilla.interfaces.nsISupports;
+import org.mozilla.xpcom.Mozilla;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+public class VpeController implements INodeAdapter, IModelLifecycleListener, INodeSelectionListener, ITextSelectionListener, SelectionListener, EditorDomEventListener, VpeTemplateListener, XModelTreeListener, ResourceReferenceListListener, ISelectionChangedListener, IVisualController {
+	
+	StructuredTextEditor sourceEditor;
+	private MozillaEditor visualEditor;
+//	MozillaBrowser browser;
+	XulRunnerEditor xulRunnerEditor;
+	// TODO Sergey Vasilyev figure out with nsIPressShell
+//	private nsIPresShell presShell;
+	// TODO Max Areshkau figure out with nsISelectionController
+	private VpeSelectionController visualSelectionController;
+	VpeDomMapping domMapping;
+	private VpeTemplateManager templateManager;
+	private VpeSourceDomBuilder sourceBuilder;
+	public VpeVisualDomBuilder visualBuilder;
+	private VpeSelectionBuilder selectionBuilder;
+	private VpeVisualKeyHandler visualKeyHandler;
+	private ActiveEditorSwitcher switcher = new ActiveEditorSwitcher();
+	private Attr lastRemovedAttr;
+	private String lastRemovedAttrName;
+	private boolean mouseUpSelectionReasonFlag;
+	private boolean mouseDownSelectionFlag;
+	private boolean sourceChangeFlag;
+	private VpePageContext pageContext;
+	private BundleMap bundle;
+	private VpeEditorPart editPart;
+	private static final int AROUND_MENU = 1;
+	private static final int BEFORE_MENU = 2;
+	private static final int AFTER_MENU = 3;
+	
+	private CSSReferenceList cssReferenceListListener;
+	private TaglibReferenceList taglibReferenceListListener;
+	private AbsoluteFolderReferenceList absoluteFolderReferenceListListener;
+	private RelativeFolderReferenceList relativeFolderReferenceListListener;
+	private VpeIncludeList includeList = new VpeIncludeList();
+	private VpeVisualInnerDragInfo innerDragInfo = null;
+	private FormatControllerManager toolbarFormatControllerManager = null;
+	private SelectionBar selectionBar = null; 
 	private XModelTreeListenerSWTSync optionsListener;
-	//Added by Max Areshkau Fix for JBIDE-1479
-	private UIJob job = null;
-	Shell tip;
-	
-	public final static String MODEL_FLAVOR = ModelTransfer.MODEL; //$NON-NLS-1$
-	
-	public VpeController(VpeEditorPart editPart){
-
-		this.editPart = editPart;
-		dropWindow = new VpeDropWindow(editPart.getSite().getShell());
-	}
-
-	void init(StructuredTextEditor sourceEditor, MozillaEditor visualEditor) throws Exception {
-		this.sourceEditor = sourceEditor;
-		if(sourceEditor instanceof IJSPTextEditor) {
-			((IJSPTextEditor)sourceEditor).setVPEController(this);
-			dropWindow.setEditor((IJSPTextEditor)sourceEditor);
-		}
-		this.visualEditor = visualEditor;
-		visualEditor.setController(this);
-		templateManager = VpeTemplateManager.getInstance();
-		bundle = new BundleMap();
-		bundle.init(sourceEditor);
-		pageContext = new VpePageContext(templateManager, bundle, editPart);
-		domMapping = new VpeDomMapping(pageContext);
-		sourceBuilder = new VpeSourceDomBuilder(domMapping, this, templateManager, sourceEditor, pageContext);
-		visualBuilder = new VpeVisualDomBuilder(domMapping, this, templateManager, visualEditor, pageContext);
-		pageContext.setSourceDomBuilder(sourceBuilder);
-		pageContext.setVisualDomBuilder(visualBuilder);
-		IDOMModel sourceModel = (IDOMModel)getModel();
-		if (sourceModel == null) {
-			return;
-		}
-		sourceModel.addModelLifecycleListener(this);
-		IDOMDocument sourceDocument = sourceModel.getDocument();
-		visualBuilder.refreshExternalLinks();
-		visualBuilder.buildDom(sourceDocument);
-		
-		templateManager.addTemplateListener(this);
-
-		xulRunnerEditor = visualEditor.getXulRunnerEditor();
-		// TODO Sergey Vasilyev figure out with nsIPressShell
-//		presShell = browser.getPresShell();
-		visualSelectionController = new VpeSelectionController(xulRunnerEditor.getSelection());
-		selectionBuilder = new VpeSelectionBuilder(domMapping, sourceBuilder, visualBuilder,  visualSelectionController);
-		visualKeyHandler = new VpeVisualKeyHandler(sourceEditor, domMapping, pageContext){
-			public void doSave(IProgressMonitor monitor){
-				editPart.doSave(monitor);
-			}
-		};
-
-//		glory
-		ISelectionProvider provider = sourceEditor.getSelectionProvider();
+	//Added by Max Areshkau Fix for JBIDE-1479
+	private UIJob job = null;
+	Shell tip;
+	
+	public final static String MODEL_FLAVOR = ModelTransfer.MODEL; //$NON-NLS-1$
+	
+	public VpeController(VpeEditorPart editPart){
+
+		this.editPart = editPart;
+		dropWindow = new VpeDropWindow(editPart.getSite().getShell());
+	}
+
+	void init(StructuredTextEditor sourceEditor, MozillaEditor visualEditor) throws Exception {
+		this.sourceEditor = sourceEditor;
+		if(sourceEditor instanceof IJSPTextEditor) {
+			((IJSPTextEditor)sourceEditor).setVPEController(this);
+			dropWindow.setEditor((IJSPTextEditor)sourceEditor);
+		}
+		this.visualEditor = visualEditor;
+		visualEditor.setController(this);
+		templateManager = VpeTemplateManager.getInstance();
+		bundle = new BundleMap();
+		bundle.init(sourceEditor);
+		pageContext = new VpePageContext(templateManager, bundle, editPart);
+		domMapping = new VpeDomMapping(pageContext);
+		sourceBuilder = new VpeSourceDomBuilder(domMapping, this, templateManager, sourceEditor, pageContext);
+		visualBuilder = new VpeVisualDomBuilder(domMapping, this, templateManager, visualEditor, pageContext);
+		pageContext.setSourceDomBuilder(sourceBuilder);
+		pageContext.setVisualDomBuilder(visualBuilder);
+		IDOMModel sourceModel = (IDOMModel)getModel();
+		if (sourceModel == null) {
+			return;
+		}
+		sourceModel.addModelLifecycleListener(this);
+		IDOMDocument sourceDocument = sourceModel.getDocument();
+		visualBuilder.refreshExternalLinks();
+		visualBuilder.buildDom(sourceDocument);
+		
+		templateManager.addTemplateListener(this);
+
+		xulRunnerEditor = visualEditor.getXulRunnerEditor();
+		// TODO Sergey Vasilyev figure out with nsIPressShell
+//		presShell = browser.getPresShell();
+		visualSelectionController = new VpeSelectionController(xulRunnerEditor.getSelection());
+		selectionBuilder = new VpeSelectionBuilder(domMapping, sourceBuilder, visualBuilder,  visualSelectionController);
+		visualKeyHandler = new VpeVisualKeyHandler(sourceEditor, domMapping, pageContext){
+			public void doSave(IProgressMonitor monitor){
+				editPart.doSave(monitor);
+			}
+		};
+
+//		glory
+		ISelectionProvider provider = sourceEditor.getSelectionProvider();
 		//Max Areshkau  JBIDE-1105 If selection event received after selection in 
 		//visual part we lost focus of selection, so we should process selection event
 		//in time of selection
 //		if (provider instanceof IPostSelectionProvider) 
 //			((IPostSelectionProvider) provider).addPostSelectionChangedListener(this);	
 //		else 
-			provider.addSelectionChangedListener(this);
-
-//		ViewerSelectionManager selectionManager = sourceEditor.getViewerSelectionManager();
-//		selectionManager.addNodeSelectionListener(this);
-//		selectionManager.addTextSelectionListener(this);
-		StyledText textWidget = VpeSelectionHelper.getSourceTextWidget(sourceEditor);
-		if (textWidget != null) {
-			textWidget.addSelectionListener(this);
-		}
-
-		visualEditor.setEditorDomEventListener(this);
-		switcher.initActiveEditor();
-		
+		provider.addSelectionChangedListener(this);
+
+//		ViewerSelectionManager selectionManager = sourceEditor.getViewerSelectionManager();
+//		selectionManager.addNodeSelectionListener(this);
+//		selectionManager.addTextSelectionListener(this);
+		StyledText textWidget = VpeSelectionHelper.getSourceTextWidget(sourceEditor);
+		if (textWidget != null) {
+			textWidget.addSelectionListener(this);
+		}
+
+		visualEditor.setEditorDomEventListener(this);
+		switcher.initActiveEditor();
+		
 		if (optionsListener == null) {
-			XModelObject optionsObject = ModelUtilities.getPreferenceModel().getByPath(VpePreference.EDITOR_PATH);
+	   	XModelObject optionsObject = ModelUtilities.getPreferenceModel().getByPath(VpePreference.EDITOR_PATH);
 			optionsListener = new XModelTreeListenerSWTSync(this);
-			optionsObject.getModel().addModelTreeListener(optionsListener);
+		optionsObject.getModel().addModelTreeListener(optionsListener);
 		}
-		
-
-		cssReferenceListListener = CSSReferenceList.getInstance();
-		cssReferenceListListener.addChangeListener(this);
-
-		taglibReferenceListListener = TaglibReferenceList.getInstance();
-		taglibReferenceListListener.addChangeListener(this);
-
-		absoluteFolderReferenceListListener = AbsoluteFolderReferenceList.getInstance();
-		absoluteFolderReferenceListListener.addChangeListener(this);
-
-		relativeFolderReferenceListListener = RelativeFolderReferenceList.getInstance();
-		relativeFolderReferenceListListener.addChangeListener(this);
-		
-		pageContext.fireTaglibsChanged();
-	}
-
-	public void dispose() {
+		
+
+		cssReferenceListListener = CSSReferenceList.getInstance();
+		cssReferenceListListener.addChangeListener(this);
+
+		taglibReferenceListListener = TaglibReferenceList.getInstance();
+		taglibReferenceListListener.addChangeListener(this);
+
+		absoluteFolderReferenceListListener = AbsoluteFolderReferenceList.getInstance();
+		absoluteFolderReferenceListListener.addChangeListener(this);
+
+		relativeFolderReferenceListListener = RelativeFolderReferenceList.getInstance();
+		relativeFolderReferenceListListener.addChangeListener(this);
+		
+//		pageContext.fireTaglibsChanged();
+	}
+
+	public void dispose() {
 		if (optionsListener != null) {
 			XModelObject optionsObject = ModelUtilities.getPreferenceModel().getByPath(VpePreference.EDITOR_PATH);
 			optionsObject.getModel().removeModelTreeListener(optionsListener);
@@ -303,569 +304,572 @@
 		if (sourceModel != null) {
 			sourceModel.removeModelLifecycleListener(this);
 		}
-		switcher.destroyActiveEditor();
+		switcher.destroyActiveEditor();
 		switcher=null;
-		
-		if (templateManager != null) {
-			templateManager.removeTemplateListener(this);
+		
+		if (templateManager != null) {
+			templateManager.removeTemplateListener(this);
 			templateManager=null;
-		}
-		if (visualBuilder != null) {
-			visualBuilder.dispose();
-			visualBuilder = null;
-		}
+		}
+		if (visualBuilder != null) {
+			visualBuilder.dispose();
+			visualBuilder = null;
+		}
 		sourceBuilder=null;
-		if (sourceEditor != null) {
-//glory
-			ISelectionProvider provider = sourceEditor.getSelectionProvider();
-			provider.removeSelectionChangedListener(this);
-//			ViewerSelectionManager selectionManager = sourceEditor.getViewerSelectionManager();
-//			selectionManager.removeNodeSelectionListener(this);
-//			selectionManager.removeTextSelectionListener(this);
-			StyledText textWidget = VpeSelectionHelper.getSourceTextWidget(sourceEditor);
-			if (textWidget != null) {
-				textWidget.removeSelectionListener(this);
-			}
+		if (sourceEditor != null) {
+//glory
+			ISelectionProvider provider = sourceEditor.getSelectionProvider();
+			provider.removeSelectionChangedListener(this);
+//			ViewerSelectionManager selectionManager = sourceEditor.getViewerSelectionManager();
+//			selectionManager.removeNodeSelectionListener(this);
+//			selectionManager.removeTextSelectionListener(this);
+			StyledText textWidget = VpeSelectionHelper.getSourceTextWidget(sourceEditor);
+			if (textWidget != null) {
+				textWidget.removeSelectionListener(this);
+			}
 			((IJSPTextEditor)sourceEditor).setVPEController(null);
 			
-		}
+		}
 		if (dropWindow != null) {
 			dropWindow.setEditor(null);
 		}
-		if (visualEditor != null) {
-			visualEditor.setEditorDomEventListener(null);
-			if (visualSelectionController != null) {
-//				visualSelectionController.Release();
-				visualSelectionController = null;
-			}
-			// TODO Sergey Vasilyev figure out with Press Shell
-//			if (presShell != null) {
-//				presShell.Release();
-//				presShell = null;
-//			}
+		if (visualEditor != null) {
+			visualEditor.setEditorDomEventListener(null);
+			if (visualSelectionController != null) {
+//				visualSelectionController.Release();
+				visualSelectionController = null;
+			}
+			// TODO Sergey Vasilyev figure out with Press Shell
+//			if (presShell != null) {
+//				presShell.Release();
+//				presShell = null;
+//			}
 			visualEditor = null;
-		}
-
-		if (cssReferenceListListener != null) {
-			cssReferenceListListener.removeChangeListener(this);
-		}
-		if (taglibReferenceListListener != null) {
-			taglibReferenceListListener.removeChangeListener(this);
-		}
-		if (absoluteFolderReferenceListListener != null) {
-			absoluteFolderReferenceListListener.removeChangeListener(this);
-		}
-		if (relativeFolderReferenceListListener != null) {
-			relativeFolderReferenceListListener.removeChangeListener(this);
-		}
+		}
+
+		if (cssReferenceListListener != null) {
+			cssReferenceListListener.removeChangeListener(this);
+		}
+		if (taglibReferenceListListener != null) {
+			taglibReferenceListListener.removeChangeListener(this);
+		}
+		if (absoluteFolderReferenceListListener != null) {
+			absoluteFolderReferenceListListener.removeChangeListener(this);
+		}
+		if (relativeFolderReferenceListListener != null) {
+			relativeFolderReferenceListListener.removeChangeListener(this);
+		}
 		toolbarFormatControllerManager = null;
-	}
-
-	// INodeAdapter implementation
-	public boolean isAdapterForType(Object type) {
-		return type == this;
-	}
-	//FIX Fox JBIDE-1479 added by Max Areshkau
-	public void notifyChanged(final INodeNotifier  notifier, final int eventType,final Object feature,final Object oldValue,final Object newValue, final int pos) {
-
-		//start job when we modify file in ui thread, without this code
-		//changes will be applied with 1 second delay
-        Display display = null;
-        if (PlatformUI.isWorkbenchRunning())
-        display= PlatformUI.getWorkbench().getDisplay();
-
-        if (display != null && (Thread.currentThread() == display.getThread())) {
-        notifyChangedInUiThread(notifier, eventType, feature, oldValue, newValue, pos);
-        return;
-        } 
-		//start job when we modify file in non ui thread
-		if(job!=null) {
-			job.cancel();
-		}
-
-		job =  new UIJob("NotifyChangedJob"){
-			@Override
-			public IStatus runInUIThread(IProgressMonitor monitor) {
-					//we checks is job was canceled and if is it true we cancel job
-				if(monitor.isCanceled()) {
-					return Status.CANCEL_STATUS;
-				} else {
-					notifyChangedInUiThread(notifier, eventType, feature, oldValue, newValue, pos);
-				}
-				return Status.OK_STATUS;
-			}};
-			job.setPriority(Job.LONG);
-			job.schedule(1000L);		
-	}	
-	
-	public void notifyChangedInUiThread(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int pos) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		if (VpeDebug.PRINT_SOURCE_MUTATION_EVENT) {
-			printSourceEvent(notifier, eventType, feature, oldValue, newValue, pos);
-		}
-		if(visualBuilder==null) {
-			return;
-		}
-		visualBuilder.rebuildFlag = false;
-		
-		switch (eventType) {
-		case INodeNotifier.CHANGE:
-			sourceChangeFlag = true;
-			int type = ((Node)notifier).getNodeType();
-			visualEditor.hideResizer();
-			visualBuilder.setSelectionRectangle(null);
-			if (type == Node.TEXT_NODE) {
-				visualBuilder.setText((Node)notifier);
-				visualEditor.showResizer();
-				//Added by Max Areshkau JBIDE-1554
-				visualBuilder.updateNode((Node)notifier);
-			} else if (type == Node.COMMENT_NODE) {
-				if("yes".equals(VpePreference.SHOW_COMMENTS.getValue())) { //$NON-NLS-1$
-					visualBuilder.setSelectionRectangle(null);
-					visualBuilder.updateNode((Node)notifier);
-				}
-			} else if (feature != null && ((Node)feature).getNodeType() == Node.ATTRIBUTE_NODE) {
-				if (newValue != null) {
-					String attrName = ((Attr)feature).getName();
-					if ((Attr)feature == lastRemovedAttr && !attrName.equals(lastRemovedAttrName)) {
-						lastRemovedAttr = null;
-						visualBuilder.removeAttribute((Element)notifier, lastRemovedAttrName);
-					}
-					visualBuilder.setAttribute((Element)notifier, ((Attr)feature).getName(), (String)newValue);
-				} else {
-					lastRemovedAttr = (Attr)feature;
-					lastRemovedAttrName = ((Attr)feature).getName();
-					visualBuilder.removeAttribute((Element)notifier, lastRemovedAttrName);
-				}
-			}
-			visualEditor.showResizer();
-			break;
-
-		case INodeNotifier.ADD:
-			break;
-		
-		case INodeNotifier.REMOVE:
-			visualBuilder.stopToggle((Node)feature);
-			visualBuilder.removeNode((Node)feature);
-			break;
-			
-		case INodeNotifier.STRUCTURE_CHANGED:
-			visualEditor.hideResizer();
-			visualBuilder.setSelectionRectangle(null);
-			visualBuilder.updateNode((Node)notifier);
-			break;
-		case INodeNotifier.CONTENT_CHANGED:
-			if (!sourceChangeFlag) {
-				if (feature != null && ((Node)feature).getNodeType() == Node.TEXT_NODE) {
-					//if (((Node)notifier).getNodeName().equalsIgnoreCase("style")) {
-						visualEditor.hideResizer();
-						visualBuilder.setSelectionRectangle(null);
-						visualBuilder.setText((Node)feature);
-						visualEditor.showResizer();
-					//}
-				}
-			} else {
-				sourceChangeFlag = false;
-			}
-			break;
-		}
-		if (visualBuilder.rebuildFlag) {
-			pageContext.fireTaglibsChanged();
-		} else if (pageContext.isTaglibChanged()) {
-			visualRefreshImpl();
-			pageContext.fireTaglibsChanged();
-		}
-		switcher.stopActiveEditor();
-	}
-
-	// INodeSelectionListener implementation
-	public void nodeSelectionChanged(NodeSelectionChangedEvent event) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		List<?> nodes = event.getSelectedNodes();
-		if (nodes != null && nodes.size() > 0) {
-			Node sourceNode = (Node)nodes.get(0);
-			if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
-				System.out.println(">>>>>>>>>>>>>> nodeSelectionChanged  sourceNode: " + sourceNode.getNodeName() + "  " + event.getCaretPosition()); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (event.getSource() instanceof IContentOutlinePage) {
-				sourceSelectionChanged();
-			}
-		}
-		switcher.stopActiveEditor();
-	}
-
-	// ITextSelectionListener implementation
-	//TODO Max Areshau looks like this method don't used
-	public void textSelectionChanged(TextSelectionChangedEvent event) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
-			System.out.println(">>>>>>>>>>>>>> textSelectionChanged  " + event.getSource()); //$NON-NLS-1$
-		}
-//		if (event.getSource() instanceof StyledText) {
-			sourceSelectionChanged();
-//		}
-		switcher.stopActiveEditor();
-	}
-
-	// SelectionListener implementation
-	public void widgetSelected(SelectionEvent event) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
-			System.out.println(">>>>>>>>>>>>>> widgetSelected"); //$NON-NLS-1$
-		}
-		if (event.getSource() instanceof StyledText) {
-			sourceSelectionChanged();
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void widgetDefaultSelected(SelectionEvent event) {
-		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
-			System.out.println(">>>>>>>>>>>>>> widgetDefaultSelected"); //$NON-NLS-1$
-		}
-	}
-	
-	public void sourceSelectionChanged() {
-		sourceSelectionChanged(false);
-	}
-	
-	public void sourceSelectionChanged(boolean showCaret) {
-		Point range = sourceEditor.getTextViewer().getSelectedRange();
-		int anchorPosition = range.x;
-		int focusPosition = range.x + range.y;
-		boolean extendFlag = range.y != 0;
-		boolean reversionFlag = extendFlag && anchorPosition == VpeSelectionHelper.getCaretOffset(sourceEditor);
-		if (reversionFlag) {
-			anchorPosition = focusPosition;
-			focusPosition = range.x;
-		}
-		Node focusNode = getSourceNodeAt(focusPosition);
-		if (focusNode == null) {
-			return;
-		}
-		int focusOffset = getSourceNodeOffset(focusNode, focusPosition, extendFlag && !reversionFlag);
-		Node anchorNode = null;
-		int anchorOffset = 0;
-		if (extendFlag) {
-			anchorNode = getSourceNodeAt(anchorPosition);
-			anchorOffset = getSourceNodeOffset(anchorNode, anchorPosition, reversionFlag);
-		} else {
-			anchorNode = focusNode;
-			anchorOffset = focusOffset;
-		}
-
-		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
-			System.out.println("sourceSelectionChanged"); //$NON-NLS-1$
-			System.out.println("               anchorNode: " + anchorNode.getNodeName() + "  anchorOffset: " + anchorOffset); //$NON-NLS-1$ //$NON-NLS-2$
-			System.out.println("               focusNode: " + focusNode.getNodeName() + "  focusOffset: " + focusOffset + "  focusPosition: " + focusPosition); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		}
-		try{
-			if(anchorNode.getNodeType() == Node.TEXT_NODE || anchorNode.getNodeType() == Node.ATTRIBUTE_NODE){
-				String text;
-				if (anchorNode.getNodeType() == Node.TEXT_NODE) {
-					IndexedRegion region = (IndexedRegion)anchorNode;
-					text = sourceEditor.getTextViewer().getDocument().get(region.getStartOffset(), region.getEndOffset()-region.getStartOffset());
-				} else {
-					text = ((AttrImpl)anchorNode).getValueRegionText();
-				}
-				anchorOffset = TextUtil.visualPosition(text, anchorOffset);
-			}
-			if(focusNode.getNodeType() == Node.TEXT_NODE || focusNode.getNodeType() == Node.ATTRIBUTE_NODE){
-				IndexedRegion region = (IndexedRegion)focusNode;
-				String text;
-				if (focusNode.getNodeType() == Node.TEXT_NODE) {
-					text = sourceEditor.getTextViewer().getDocument().get(region.getStartOffset(), region.getEndOffset()-region.getStartOffset());
-				} else {
-					text = ((AttrImpl)focusNode).getValueRegionText();
-				}
-				focusOffset = TextUtil.visualPosition(text, focusOffset);
-			}
-		}catch(Exception ex){
-			VpePlugin.reportProblem(ex);
-		}
-		
-		selectionBuilder.setVisualSelection(anchorNode, anchorOffset, focusNode, focusOffset, reversionFlag, showCaret);
-	}
-	
-	public void sourceSelectionToVisualSelection(boolean showCaret) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		sourceSelectionChanged(showCaret);
-		switcher.stopActiveEditor();
-	}
-		
-	// IModelLifecycleListener implementation
-	public void processPreModelEvent(ModelLifecycleEvent event) {
-	}
-
-	public void processPostModelEvent(ModelLifecycleEvent event) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		if (event.getType() == ModelLifecycleEvent.MODEL_RELEASED) {
-			if (VpeDebug.PRINT_SOURCE_MODEL_LIFECYCLE_EVENT) {
-				System.out.println(">>> processPostModelEvent: " + event.toString()); //$NON-NLS-1$
-			}
-			visualBuilder.setSelectionRectangle(null);
-			IStructuredModel model = event.getModel();
-			model.removeModelLifecycleListener(this);
-			IDOMModel sourceModel = (IDOMModel)getModel();
-			sourceModel.addModelLifecycleListener(this);
-			bundle.clearAll();
-			bundle.refresh();
-			visualBuilder.setSelectionRectangle(null);
-			IDOMDocument sourceDocument = sourceModel.getDocument();
-			visualBuilder.rebuildDom(sourceDocument);
-			pageContext.fireTaglibsChanged();
-		}
-		switcher.stopActiveEditor();
-	}
-
-	// EditorDomEventListener implementation
-	public void subtreeModified(nsIDOMMutationEvent mutationEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void nodeInserted(nsIDOMMutationEvent mutationEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		nsIDOMNode targetNode = mutationEvent.getRelatedNode();
-		if (!VpeVisualDomBuilder.isAnonElement(targetNode)) {
-			sourceBuilder.addNode(targetNode);
-			visualBuilder.resetPseudoElement(targetNode);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void nodeRemoved(nsIDOMMutationEvent mutationEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		nsIDOMNode targetNode = VisualDomUtil.getTargetNode(mutationEvent);
-		if (!VpeVisualDomBuilder.isAnonElement(targetNode)) {
-			visualBuilder.setSelectionRectangle(null);
-			sourceBuilder.removeNode(targetNode);
-			visualBuilder.resetPseudoElement(targetNode);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void nodeRemovedFromDocument(nsIDOMMutationEvent mutationEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void nodeInsertedIntoDocument(nsIDOMMutationEvent mutationEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void attrModified(nsIDOMMutationEvent mutationEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void characterDataModified(nsIDOMMutationEvent mutationEvent) {
-		
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
-			printVisualEvent(mutationEvent);
-		}
-		nsIDOMNode targetNode = VisualDomUtil.getTargetNode(mutationEvent);
-		sourceBuilder.setText(targetNode);
-		visualBuilder.resetPseudoElement(targetNode);
-		switcher.stopActiveEditor();
-	}
-
-	public void notifySelectionChanged(nsIDOMDocument doc, nsISelection selection, short reason) {
-		if (switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			mouseUpSelectionReasonFlag = (reason & nsISelectionListener.MOUSEUP_REASON) > 0;
-			if (mouseUpSelectionReasonFlag || reason == nsISelectionListener.NO_REASON || reason == nsISelectionListener.KEYPRESS_REASON || reason == nsISelectionListener.SELECTALL_REASON || (reason & nsISelectionListener.MOUSEDOWN_REASON) > 0) {
-				if (VpeDebug.PRINT_VISUAL_SELECTION_EVENT) {
-					System.out.println("<<< notifySelectionChanged: " + reason); //$NON-NLS-1$
-				}
-				selectionBuilder.setSelection(selection);
-			}
-			switcher.stopActiveEditor();
-		}
-	}
-
-
-	public void mouseDown(nsIDOMMouseEvent mouseEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		nsIDOMElement visualDragElement = selectionBuilder.getDragElement(mouseEvent);
-		if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
-			nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
-			System.out.println("<<< mouseDown  targetNode: " + visualNode.getNodeName() + " (" + visualNode + ")  selectedElement: " + (visualDragElement != null ? visualDragElement.getNodeName() + " (" + visualDragElement + ")" : null)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		}
-		mouseDownSelectionFlag = false;
-		
-		if (visualDragElement != null) {
-			
-			//we shouldn't change selection when we click on <input type="text" /> element,
-			//because if we change after resizing the input element lost selection
-			if(!(HTML.TAG_INPUT.equalsIgnoreCase(visualDragElement.getNodeName())&&
-			HTML.ATTR_TEXT.equalsIgnoreCase(visualDragElement.getAttribute(HTML.ATTR_TYPE))
-			&&visualDragElement.getAttribute(HTML.ATTR_TYPE)!=null)) {				
-			
-			selectionBuilder.setVisualElementSelection(visualDragElement);
-			mouseDownSelectionFlag = true;		
-			} 
-		} else {
-			selectionBuilder.setCaretAtMouse(mouseEvent);
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void mouseUp(nsIDOMMouseEvent mouseEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
-			System.out.println("<<< mouseUp"); //$NON-NLS-1$
-		}
-		if (mouseDownSelectionFlag) {
-			mouseEvent.preventDefault();
-			mouseEvent.stopPropagation();
-			mouseDownSelectionFlag = false;
-		}
-		switcher.stopActiveEditor();
-	}
-	
-	public void mouseClick(nsIDOMMouseEvent mouseEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
-		
-		if (visualNode != null) {
-			if (!mouseUpSelectionReasonFlag) {
-				if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
-					System.out.println("<<< mouseClick  visualNode: " + visualNode.getNodeName() + " (" + visualNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-				if (visualBuilder.isContentArea(visualNode)) {
-					selectionBuilder.setClickContentAreaSelection();
-				}
-			} else {
-				mouseUpSelectionReasonFlag = false;
-			}
-
-			if (visualBuilder.doToggle(VisualDomUtil.getTargetNode(mouseEvent))) {
-				selectionBuilder.setClickContentAreaSelection();
-			}
-		}
-		switcher.stopActiveEditor(); 
-	}
-
-	public void mouseDblClick(nsIDOMMouseEvent mouseEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
-		if (visualNode != null) {
-			if (!sourceBuilder.openBundleEditors(visualNode)) {
-			    sourceBuilder.openIncludeEditor(visualNode);
-			}
-			if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
-				System.out.println("<<< mouseDblClick  visualNode: " + visualNode.getNodeName() + " (" + visualNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void mouseMove(nsIDOMMouseEvent mouseEvent) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
-		if (visualNode != null) {
-			if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
-				System.out.println("<<< mouseMove  visualNode: " + visualNode.getNodeName() + " (" + visualNode + ")");
-			}
-			visualBuilder.setMoveCursor(mouseEvent);		
-		}
-		switcher.stopActiveEditor();
-	}
-	
-	public void keyPress(nsIDOMKeyEvent keyEvent) {
-		if (VpeDebug.PRINT_VISUAL_KEY_EVENT) {
-			System.out.println("<<< keyPress  type: " + keyEvent.getType() + "  Ctrl: " + keyEvent.getCtrlKey() + "  Shift: " + keyEvent.getShiftKey() + "  CharCode: " + keyEvent.getCharCode() + "  KeyCode: " + keyEvent.getKeyCode()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-		}
-
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-		switcher.stopActiveEditor();
-			return;
-		}
-		
-		visualEditor.hideResizer();
-		switcher.stopActiveEditor();
-
-		
-		try {
-			if (visualKeyHandler.keyPressHandler(keyEvent)) {
-				switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL);
-				// Edward
-				sourceSelectionChanged(true); 
-				visualSelectionController.setCaretEnabled(true);
-				switcher.stopActiveEditor();
-			} else {
-				//adding calls of core event handlers, for example 'CTR+H' or 'CTRL+M' event handler dialog
-				Event keyboardEvent = new Event ();
-				//widget where event occur
-				keyboardEvent.widget = xulRunnerEditor.getBrowser();
-							
-				keyboardEvent.stateMask = (keyEvent.getAltKey() ? SWT.ALT : 0) | (keyEvent.getCtrlKey() ? SWT.CTRL : 0) | (keyEvent.getShiftKey() ? SWT.SHIFT : 0) | (keyEvent.getMetaKey() ? SWT.MOD1 : 0);
-				keyboardEvent.x=0;
-				keyboardEvent.y=0;
-				keyboardEvent.type=SWT.KeyDown;
-				
-				if(keyEvent.getKeyCode()==0) {
-					keyboardEvent.keyCode=(int)keyEvent.getCharCode();
-				} else{
+	}
+
+	// INodeAdapter implementation
+	public boolean isAdapterForType(Object type) {
+		return type == this;
+	}
+	//FIX Fox JBIDE-1479 added by Max Areshkau
+	public void notifyChanged(final INodeNotifier  notifier, final int eventType,final Object feature,final Object oldValue,final Object newValue, final int pos) {
+
+		//start job when we modify file in ui thread, without this code
+		//changes will be applied with 1 second delay
+        Display display = null;
+        if (PlatformUI.isWorkbenchRunning())
+        display= PlatformUI.getWorkbench().getDisplay();
+
+        if (display != null && (Thread.currentThread() == display.getThread())) {
+        notifyChangedInUiThread(notifier, eventType, feature, oldValue, newValue, pos);
+        return;
+        } 
+		//start job when we modify file in non ui thread
+		if(job!=null) {
+			job.cancel();
+		}
+
+		job =  new UIJob("NotifyChangedJob"){
+			@Override
+			public IStatus runInUIThread(IProgressMonitor monitor) {
+					//we checks is job was canceled and if is it true we cancel job
+				if(monitor.isCanceled()) {
+					return Status.CANCEL_STATUS;
+				} else {
+					notifyChangedInUiThread(notifier, eventType, feature, oldValue, newValue, pos);
+				}
+				return Status.OK_STATUS;
+			}};
+			job.setPriority(Job.LONG);
+			job.schedule(1000L);		
+	}	
+	
+	public void notifyChangedInUiThread(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int pos) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		if (VpeDebug.PRINT_SOURCE_MUTATION_EVENT) {
+			printSourceEvent(notifier, eventType, feature, oldValue, newValue, pos);
+		}
+		if(visualBuilder==null) {
+			return;
+		}
+		visualBuilder.rebuildFlag = false;
+		
+		switch (eventType) {
+		case INodeNotifier.CHANGE:
+			sourceChangeFlag = true;
+			int type = ((Node)notifier).getNodeType();
+			visualEditor.hideResizer();
+			visualBuilder.setSelectionRectangle(null);
+			if (type == Node.TEXT_NODE) {
+				visualBuilder.setText((Node)notifier);
+				visualEditor.showResizer();
+				//Added by Max Areshkau JBIDE-1554
+				visualBuilder.updateNode((Node)notifier);
+			} else if (type == Node.COMMENT_NODE) {
+				if("yes".equals(VpePreference.SHOW_COMMENTS.getValue())) { //$NON-NLS-1$
+					visualBuilder.setSelectionRectangle(null);
+					visualBuilder.updateNode((Node)notifier);
+				}
+			} else if (feature != null && ((Node)feature).getNodeType() == Node.ATTRIBUTE_NODE) {
+				if (newValue != null) {
+					String attrName = ((Attr)feature).getName();
+					if ((Attr)feature == lastRemovedAttr && !attrName.equals(lastRemovedAttrName)) {
+						lastRemovedAttr = null;
+						visualBuilder.removeAttribute((Element)notifier, lastRemovedAttrName);
+					}
+					visualBuilder.setAttribute((Element)notifier, ((Attr)feature).getName(), (String)newValue);
+				} else {
+					lastRemovedAttr = (Attr)feature;
+					lastRemovedAttrName = ((Attr)feature).getName();
+					visualBuilder.removeAttribute((Element)notifier, lastRemovedAttrName);
+				}
+			}
+			visualEditor.showResizer();
+			break;
+
+		case INodeNotifier.ADD:
+			break;
+		
+		case INodeNotifier.REMOVE:
+			visualBuilder.stopToggle((Node)feature);
+			visualBuilder.removeNode((Node)feature);
+			break;
+			
+		case INodeNotifier.STRUCTURE_CHANGED:
+			visualEditor.hideResizer();
+			visualBuilder.setSelectionRectangle(null);
+			visualBuilder.updateNode((Node)notifier);
+			break;
+		case INodeNotifier.CONTENT_CHANGED:
+			if (!sourceChangeFlag) {
+				if (feature != null && ((Node)feature).getNodeType() == Node.TEXT_NODE) {
+					//if (((Node)notifier).getNodeName().equalsIgnoreCase("style")) {
+						visualEditor.hideResizer();
+						visualBuilder.setSelectionRectangle(null);
+						visualBuilder.setText((Node)feature);
+						visualEditor.showResizer();
+					//}
+				}
+			} else {
+				sourceChangeFlag = false;
+			}
+			break;
+		}
+		if (visualBuilder.rebuildFlag) {
+//			pageContext.fireTaglibsChanged();
+		} 
+		//TODO Max Areshkau JBIDE-788
+//		else if (pageContext.isTaglibChanged()) {
+//			visualRefreshImpl();
+////			pageContext.fireTaglibsChanged();
+//		}
+		switcher.stopActiveEditor();
+	}
+
+	// INodeSelectionListener implementation
+	public void nodeSelectionChanged(NodeSelectionChangedEvent event) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		List<?> nodes = event.getSelectedNodes();
+		if (nodes != null && nodes.size() > 0) {
+			Node sourceNode = (Node)nodes.get(0);
+			if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
+				System.out.println(">>>>>>>>>>>>>> nodeSelectionChanged  sourceNode: " + sourceNode.getNodeName() + "  " + event.getCaretPosition()); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+			if (event.getSource() instanceof IContentOutlinePage) {
+				sourceSelectionChanged();
+			}
+		}
+		switcher.stopActiveEditor();
+	}
+
+	// ITextSelectionListener implementation
+	//TODO Max Areshau looks like this method don't used
+	public void textSelectionChanged(TextSelectionChangedEvent event) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
+			System.out.println(">>>>>>>>>>>>>> textSelectionChanged  " + event.getSource()); //$NON-NLS-1$
+		}
+//		if (event.getSource() instanceof StyledText) {
+			sourceSelectionChanged();
+//		}
+		switcher.stopActiveEditor();
+	}
+
+	// SelectionListener implementation
+	public void widgetSelected(SelectionEvent event) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
+			System.out.println(">>>>>>>>>>>>>> widgetSelected"); //$NON-NLS-1$
+		}
+		if (event.getSource() instanceof StyledText) {
+			sourceSelectionChanged();
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void widgetDefaultSelected(SelectionEvent event) {
+		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
+			System.out.println(">>>>>>>>>>>>>> widgetDefaultSelected"); //$NON-NLS-1$
+		}
+	}
+	
+	public void sourceSelectionChanged() {
+		sourceSelectionChanged(false);
+	}
+	
+	public void sourceSelectionChanged(boolean showCaret) {
+		Point range = sourceEditor.getTextViewer().getSelectedRange();
+		int anchorPosition = range.x;
+		int focusPosition = range.x + range.y;
+		boolean extendFlag = range.y != 0;
+		boolean reversionFlag = extendFlag && anchorPosition == VpeSelectionHelper.getCaretOffset(sourceEditor);
+		if (reversionFlag) {
+			anchorPosition = focusPosition;
+			focusPosition = range.x;
+		}
+		Node focusNode = getSourceNodeAt(focusPosition);
+		if (focusNode == null) {
+			return;
+		}
+		int focusOffset = getSourceNodeOffset(focusNode, focusPosition, extendFlag && !reversionFlag);
+		Node anchorNode = null;
+		int anchorOffset = 0;
+		if (extendFlag) {
+			anchorNode = getSourceNodeAt(anchorPosition);
+			anchorOffset = getSourceNodeOffset(anchorNode, anchorPosition, reversionFlag);
+		} else {
+			anchorNode = focusNode;
+			anchorOffset = focusOffset;
+		}
+
+		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
+			System.out.println("sourceSelectionChanged"); //$NON-NLS-1$
+			System.out.println("               anchorNode: " + anchorNode.getNodeName() + "  anchorOffset: " + anchorOffset); //$NON-NLS-1$ //$NON-NLS-2$
+			System.out.println("               focusNode: " + focusNode.getNodeName() + "  focusOffset: " + focusOffset + "  focusPosition: " + focusPosition); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		}
+		try{
+			if(anchorNode.getNodeType() == Node.TEXT_NODE || anchorNode.getNodeType() == Node.ATTRIBUTE_NODE){
+				String text;
+				if (anchorNode.getNodeType() == Node.TEXT_NODE) {
+					IndexedRegion region = (IndexedRegion)anchorNode;
+					text = sourceEditor.getTextViewer().getDocument().get(region.getStartOffset(), region.getEndOffset()-region.getStartOffset());
+				} else {
+					text = ((AttrImpl)anchorNode).getValueRegionText();
+				}
+				anchorOffset = TextUtil.visualPosition(text, anchorOffset);
+			}
+			if(focusNode.getNodeType() == Node.TEXT_NODE || focusNode.getNodeType() == Node.ATTRIBUTE_NODE){
+				IndexedRegion region = (IndexedRegion)focusNode;
+				String text;
+				if (focusNode.getNodeType() == Node.TEXT_NODE) {
+					text = sourceEditor.getTextViewer().getDocument().get(region.getStartOffset(), region.getEndOffset()-region.getStartOffset());
+				} else {
+					text = ((AttrImpl)focusNode).getValueRegionText();
+				}
+				focusOffset = TextUtil.visualPosition(text, focusOffset);
+			}
+		}catch(Exception ex){
+			VpePlugin.reportProblem(ex);
+		}
+		
+		selectionBuilder.setVisualSelection(anchorNode, anchorOffset, focusNode, focusOffset, reversionFlag, showCaret);
+	}
+	
+	public void sourceSelectionToVisualSelection(boolean showCaret) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		sourceSelectionChanged(showCaret);
+		switcher.stopActiveEditor();
+	}
+		
+	// IModelLifecycleListener implementation
+	public void processPreModelEvent(ModelLifecycleEvent event) {
+	}
+
+	public void processPostModelEvent(ModelLifecycleEvent event) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		if (event.getType() == ModelLifecycleEvent.MODEL_RELEASED) {
+			if (VpeDebug.PRINT_SOURCE_MODEL_LIFECYCLE_EVENT) {
+				System.out.println(">>> processPostModelEvent: " + event.toString()); //$NON-NLS-1$
+			}
+			visualBuilder.setSelectionRectangle(null);
+			IStructuredModel model = event.getModel();
+			model.removeModelLifecycleListener(this);
+			IDOMModel sourceModel = (IDOMModel)getModel();
+			sourceModel.addModelLifecycleListener(this);
+			bundle.clearAll();
+			bundle.refresh();
+			visualBuilder.setSelectionRectangle(null);
+			IDOMDocument sourceDocument = sourceModel.getDocument();
+			visualBuilder.rebuildDom(sourceDocument);
+//			pageContext.fireTaglibsChanged();
+		}
+		switcher.stopActiveEditor();
+	}
+
+	// EditorDomEventListener implementation
+	public void subtreeModified(nsIDOMMutationEvent mutationEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void nodeInserted(nsIDOMMutationEvent mutationEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		nsIDOMNode targetNode = mutationEvent.getRelatedNode();
+		if (!VpeVisualDomBuilder.isAnonElement(targetNode)) {
+			sourceBuilder.addNode(targetNode);
+			visualBuilder.resetPseudoElement(targetNode);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void nodeRemoved(nsIDOMMutationEvent mutationEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		nsIDOMNode targetNode = VisualDomUtil.getTargetNode(mutationEvent);
+		if (!VpeVisualDomBuilder.isAnonElement(targetNode)) {
+			visualBuilder.setSelectionRectangle(null);
+			sourceBuilder.removeNode(targetNode);
+			visualBuilder.resetPseudoElement(targetNode);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void nodeRemovedFromDocument(nsIDOMMutationEvent mutationEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void nodeInsertedIntoDocument(nsIDOMMutationEvent mutationEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void attrModified(nsIDOMMutationEvent mutationEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void characterDataModified(nsIDOMMutationEvent mutationEvent) {
+		
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MUTATION_EVENT) {
+			printVisualEvent(mutationEvent);
+		}
+		nsIDOMNode targetNode = VisualDomUtil.getTargetNode(mutationEvent);
+		sourceBuilder.setText(targetNode);
+		visualBuilder.resetPseudoElement(targetNode);
+		switcher.stopActiveEditor();
+	}
+
+	public void notifySelectionChanged(nsIDOMDocument doc, nsISelection selection, short reason) {
+		if (switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			mouseUpSelectionReasonFlag = (reason & nsISelectionListener.MOUSEUP_REASON) > 0;
+			if (mouseUpSelectionReasonFlag || reason == nsISelectionListener.NO_REASON || reason == nsISelectionListener.KEYPRESS_REASON || reason == nsISelectionListener.SELECTALL_REASON || (reason & nsISelectionListener.MOUSEDOWN_REASON) > 0) {
+				if (VpeDebug.PRINT_VISUAL_SELECTION_EVENT) {
+					System.out.println("<<< notifySelectionChanged: " + reason); //$NON-NLS-1$
+				}
+				selectionBuilder.setSelection(selection);
+			}
+			switcher.stopActiveEditor();
+		}
+	}
+
+
+	public void mouseDown(nsIDOMMouseEvent mouseEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		nsIDOMElement visualDragElement = selectionBuilder.getDragElement(mouseEvent);
+		if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
+			nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
+			System.out.println("<<< mouseDown  targetNode: " + visualNode.getNodeName() + " (" + visualNode + ")  selectedElement: " + (visualDragElement != null ? visualDragElement.getNodeName() + " (" + visualDragElement + ")" : null)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+		}
+		mouseDownSelectionFlag = false;
+		
+		if (visualDragElement != null) {
+			
+			//we shouldn't change selection when we click on <input type="text" /> element,
+			//because if we change after resizing the input element lost selection
+			if(!(HTML.TAG_INPUT.equalsIgnoreCase(visualDragElement.getNodeName())&&
+			HTML.ATTR_TEXT.equalsIgnoreCase(visualDragElement.getAttribute(HTML.ATTR_TYPE))
+			&&visualDragElement.getAttribute(HTML.ATTR_TYPE)!=null)) {				
+			
+			selectionBuilder.setVisualElementSelection(visualDragElement);
+			mouseDownSelectionFlag = true;		
+			} 
+		} else {
+			selectionBuilder.setCaretAtMouse(mouseEvent);
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void mouseUp(nsIDOMMouseEvent mouseEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
+			System.out.println("<<< mouseUp"); //$NON-NLS-1$
+		}
+		if (mouseDownSelectionFlag) {
+			mouseEvent.preventDefault();
+			mouseEvent.stopPropagation();
+			mouseDownSelectionFlag = false;
+		}
+		switcher.stopActiveEditor();
+	}
+	
+	public void mouseClick(nsIDOMMouseEvent mouseEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
+		
+		if (visualNode != null) {
+			if (!mouseUpSelectionReasonFlag) {
+				if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
+					System.out.println("<<< mouseClick  visualNode: " + visualNode.getNodeName() + " (" + visualNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+				if (visualBuilder.isContentArea(visualNode)) {
+					selectionBuilder.setClickContentAreaSelection();
+				}
+			} else {
+				mouseUpSelectionReasonFlag = false;
+			}
+
+			if (visualBuilder.doToggle(VisualDomUtil.getTargetNode(mouseEvent))) {
+				selectionBuilder.setClickContentAreaSelection();
+			}
+		}
+		switcher.stopActiveEditor(); 
+	}
+
+	public void mouseDblClick(nsIDOMMouseEvent mouseEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
+		if (visualNode != null) {
+			if (!sourceBuilder.openBundleEditors(visualNode)) {
+			    sourceBuilder.openIncludeEditor(visualNode);
+			}
+			if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
+				System.out.println("<<< mouseDblClick  visualNode: " + visualNode.getNodeName() + " (" + visualNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void mouseMove(nsIDOMMouseEvent mouseEvent) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
+		if (visualNode != null) {
+			if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
+				System.out.println("<<< mouseMove  visualNode: " + visualNode.getNodeName() + " (" + visualNode + ")");
+			}
+			visualBuilder.setMoveCursor(mouseEvent);		
+		}
+		switcher.stopActiveEditor();
+	}
+	
+	public void keyPress(nsIDOMKeyEvent keyEvent) {
+		if (VpeDebug.PRINT_VISUAL_KEY_EVENT) {
+			System.out.println("<<< keyPress  type: " + keyEvent.getType() + "  Ctrl: " + keyEvent.getCtrlKey() + "  Shift: " + keyEvent.getShiftKey() + "  CharCode: " + keyEvent.getCharCode() + "  KeyCode: " + keyEvent.getKeyCode()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+		}
+
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+		switcher.stopActiveEditor();
+			return;
+		}
+		
+		visualEditor.hideResizer();
+		switcher.stopActiveEditor();
+
+		
+		try {
+			if (visualKeyHandler.keyPressHandler(keyEvent)) {
+				switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL);
+				// Edward
+				sourceSelectionChanged(true); 
+				visualSelectionController.setCaretEnabled(true);
+				switcher.stopActiveEditor();
+			} else {
+				//adding calls of core event handlers, for example 'CTR+H' or 'CTRL+M' event handler dialog
+				Event keyboardEvent = new Event ();
+				//widget where event occur
+				keyboardEvent.widget = xulRunnerEditor.getBrowser();
+							
+				keyboardEvent.stateMask = (keyEvent.getAltKey() ? SWT.ALT : 0) | (keyEvent.getCtrlKey() ? SWT.CTRL : 0) | (keyEvent.getShiftKey() ? SWT.SHIFT : 0) | (keyEvent.getMetaKey() ? SWT.MOD1 : 0);
+				keyboardEvent.x=0;
+				keyboardEvent.y=0;
+				keyboardEvent.type=SWT.KeyDown;
+				
+				if(keyEvent.getKeyCode()==0) {
+					
+					keyboardEvent.keyCode=(int)keyEvent.getCharCode();
+				} else{
 					keyboardEvent.keyCode=(int)keyEvent.getKeyCode();			
 				}
-				
+					
 				// JBIDE-1627 
 				List<KeyStroke> possibleKeyStrokes = WorkbenchKeyboard.generatePossibleKeyStrokes(keyboardEvent);
 				IWorkbench iWorkbench = VpePlugin.getDefault().getWorkbench();
@@ -888,1534 +892,1533 @@
 							}
 						}
 					}
-				}
-
-				//sends xulrunner event to eclipse environment
-				getXulRunnerEditor().getBrowser().notifyListeners(keyboardEvent.type, keyboardEvent);
-				
-			}
-		} catch (Exception e) {
-			VpePlugin.getPluginLog().logError(e);
-			visualRefresh();
-		}
-
-	}
-
-	public void elementResized(nsIDOMElement element, int resizerConstrains, int top, int left, int width, int height) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		visualEditor.hideResizer();
-		switcher.stopActiveEditor();
-
-		visualBuilder.resize(element, resizerConstrains, top, left, width, height);
-		sourceSelectionChanged();
-	}
-	
-	public void dragGesture(nsIDOMEvent domEvent) {
-
-		nsIDOMMouseEvent mouseEvent = (nsIDOMMouseEvent) domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
-			boolean canDragFlag = canInnerDrag(mouseEvent);
-			//start drag sessionvpe-element
-			if(canDragFlag) {				
-				startDragSession(domEvent);
-				}
-	}
-	
-	private void createMenuForNode(Node node, MenuManager manager) {
-		createMenuForNode(node, manager, false);
-	}
-	
-	private void createMenuForNode(Node node, MenuManager manager, boolean topLevelFlag) {
-		NodeActionManager.setTextNodeSplitter(null);
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			VpeElementMapping elementMapping = (VpeElementMapping)domMapping.getNodeMapping(node);
-			if (elementMapping != null && elementMapping.getTemplate() != null) {
-				manager.add(new VpeAction("<"+node.getNodeName()+"> Attributes", node) {  //$NON-NLS-1$ //$NON-NLS-2$
-						public void  run() {
-							showProperties(actionNode);								
-						}
-				});
-				
-				if (!topLevelFlag) {
-					manager.add(new VpeAction("Select This Tag", node) {  //$NON-NLS-1$
-						public void  run() {
-							selectionBuilder.setVisualSelection(actionNode,0,actionNode,0,false,true);
-
-						}
-					});
-				}
-				Node parent = node.getParentNode();
-				if(parent != null && parent.getNodeType() == Node.ELEMENT_NODE){
-					MenuManager menuManager = new MenuManager("Parent Tag"); //$NON-NLS-1$
-					menuManager.setParent(manager);
-					manager.add(menuManager);
-					createMenuForNode(parent, menuManager);
-				}
-				
-				manager.add(new Separator());
-			}
-		}
-		NodeActionManager actionManager = new NodeActionManager(getModel(), null);
-		
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			Point range = sourceEditor.getTextViewer().getSelectedRange();
-			TextNodeSplitterImpl splitter = new TextNodeSplitterImpl(range, (Text)node);
-			NodeActionManager.setTextNodeSplitter(splitter);
-		}
-
-		
-		if (actionManager != null) {
-			StructuredSelection structuredSelection = new StructuredSelection(node);
-			actionManager.fillContextMenuForVpe(manager, structuredSelection);
-			
-		}
-
-		IContributionItem[] items = manager.getItems();
-		
-		for(int i=0;i< items.length;i++){
-			if(items[i] instanceof MenuManager){
-				MenuManager mm = (MenuManager)items[i];
-				if(NodeActionManager.INSERT_AROUND_MENU.equals(mm.getMenuText())){
-					listenContextMenu(mm, (IndexedRegion)node, AROUND_MENU);
-				}else if(NodeActionManager.INSERT_BEFORE_MENU.equals(mm.getMenuText())){
-					listenContextMenu(mm, (IndexedRegion)node, BEFORE_MENU);
-				}else if(NodeActionManager.INSERT_AFTER_MENU.equals(mm.getMenuText())){
-					listenContextMenu(mm, (IndexedRegion)node, AFTER_MENU);
-				}
-			}
-		}
-		
-		manager.add(new Separator());
-		
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			VpeElementMapping elementMapping = (VpeElementMapping)domMapping.getNodeMapping(node);
-			if (elementMapping != null && elementMapping.getTemplate() != null && elementMapping.getTemplate().getType() == VpeHtmlTemplate.TYPE_ANY) {
-				final VpeTemplate selectedTemplate = elementMapping.getTemplate();
-				
-				manager.add(new VpeAction("Template", node) {  //$NON-NLS-1$
-					public void  run() {
-						boolean isCorrectNS = pageContext.isCorrectNS(actionNode);
-						VpeAnyData data = null;
-						if (isCorrectNS) {
-							data = selectedTemplate.getAnyData();
-							data.setUri(pageContext.getSourceTaglibUri(actionNode));
-							data.setName(actionNode.getNodeName());
-						}
-						data = editAnyData(sourceEditor, isCorrectNS, data);
-						if (data != null && data.isChanged()) templateManager.setAnyTemplate(data);
-					}
-				});
-
-				manager.add(new Separator());
-			}
-		
-		
-			manager.add(new VpeTextOperationAction("Cut", ActionFactory.CUT.getId(), (IndexedRegion)node)); //$NON-NLS-1$
-			manager.add(new VpeTextOperationAction("Copy", ActionFactory.COPY.getId(), (IndexedRegion)node)); //$NON-NLS-1$
-			manager.add(new VpeTextOperationAction("Paste", ActionFactory.PASTE.getId(), (IndexedRegion)node)); //$NON-NLS-1$
-		}else if(node.getNodeType() == Node.TEXT_NODE){
-			manager.add(new Action("Cut") {  //$NON-NLS-1$
-				public void  run() {
-					sourceEditor.getAction(ActionFactory.CUT.getId()).run();
-				}
-			});
-			manager.add(new Action("Copy") {  //$NON-NLS-1$
-				public void  run() {
-					sourceEditor.getAction(ActionFactory.COPY.getId()).run();
-				}
-			});
-			manager.add(new Action("Paste") {  //$NON-NLS-1$
-				public void  run() {
-					sourceEditor.getAction(ActionFactory.PASTE.getId()).run();
-				}
-			});
-		}
-		manager.add(new Separator());
-		
-		if (actionManager != null) {
-			StructuredSelection structuredSelection = node.getNodeType() == Node.ELEMENT_NODE ? new StructuredSelection(node) : null;
-			actionManager.addContextMenuForVpe(manager, structuredSelection);
-		}
-		
-		if(node.getNodeType() == Node.ELEMENT_NODE){
-			boolean stripEnable = false;
-			NodeImpl impl = (NodeImpl)node;
-			if(impl.isContainer()){
-				NodeList list = impl.getChildNodes();
-				if(list.getLength() > 0){
-					if(list.getLength() == 1){
-						Node child = list.item(0);
-						if(child.getNodeType() == Node.TEXT_NODE){
-							if("".equals(child.getNodeValue().trim()))stripEnable = false; //$NON-NLS-1$
-							else stripEnable = true;
-						}else stripEnable = true;
-					}else stripEnable = true;
-				}
-			}
-			if(stripEnable)
-			manager.add(new VpeAction("Strip Tag", node) {  //$NON-NLS-1$
-				public void  run() {
-					Node parent = actionNode.getParentNode();
-					if(parent != null){
-						int index = ((NodeImpl)actionNode).getIndex();
-						parent.removeChild(actionNode);
-						NodeList children = actionNode.getChildNodes();
-						int lengh = children.getLength();
-						Node child;
-						for(int i=0; i < lengh; i++){
-							child = children.item(0);
-							actionNode.removeChild(child);
-							insertNode(parent, child, index++);
-						}
-					}
-				}
-				
-				private void insertNode(Node parent, Node node, int index){
-					Node oldNode=null;
-					int childSize = parent.getChildNodes().getLength();
-					
-					if(index <= (childSize-1))oldNode = parent.getChildNodes().item(index);
-					if(oldNode != null)parent.insertBefore(node, oldNode);
-					else parent.appendChild(node);
-				}
-			});
-		}
-		if(node.getNodeType() == Node.TEXT_NODE){
-			manager.add(new Action("Delete") {  //$NON-NLS-1$
-				public void  run() {
-					sourceEditor.getAction(ActionFactory.DELETE.getId()).run();
-				}
-			});
-		}
-
-		if (VpeDebug.VISUAL_CONTEXTMENU_DUMP_SOURCE) {
-			manager.add(new Action("Dump Source") { //$NON-NLS-1$
-				public void  run() {	
-					DOMTreeDumper dumper = new DOMTreeDumper();
-					dumper.dumpToStream(System.out, visualEditor.getDomDocument());
-				}
-			});
-		}
-		
-		if (VpeDebug.VISUAL_CONTEXTMENU_DUMP_MAPPING) {
-			manager.add(new Action("Dump Mapping") {  //$NON-NLS-1$
-				public void  run() {
-					printMapping();
-				}
-			});
-		}
-		
-		if (VpeDebug.VISUAL_CONTEXTMENU_TEST) {
-			manager.add(new VpeAction("Test", node) {  //$NON-NLS-1$
-				public void  run() {
-					test(actionNode);
-				}
-			});
-		}
-	}
-	
-	/**
-	 * Calls when on when browser receive context menu event.
-	 * 
-	 * @param contextFlags -not used in this function, just for becouse this parametr
-	 * 			exist in nsIContextMenuListener
-	 * @param event  event from browser used here
-	 * @param node where this event are occur
-	 */
-	public void onShowContextMenu(long contextFlags, nsIDOMEvent event, nsIDOMNode node) {
-		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(event);
-		
-		if (visualNode != null) {
-			Node selectedSourceNode = null;
-			selectedSourceNode = selectionBuilder.setContextMenuSelection(visualNode);
-			if (selectedSourceNode != null) {
-
-				MenuManager menuManager = new MenuManager("#popup"); //$NON-NLS-1$
-				final Menu contextMenu = menuManager.createContextMenu(visualEditor.getControl());
-				contextMenu.addMenuListener(
-						new MenuListener(){
-							Menu menu = contextMenu;
-							public void menuHidden(MenuEvent e) {
-								Display.getCurrent().asyncExec(
-									new Runnable() {
-										public void run() {
-											menu.dispose();
-										}
-									}
-								);
-							}
-							public void menuShown(MenuEvent e) {
-							}
-						}
-				);
-				createMenuForNode(selectedSourceNode, menuManager, true);
-
-				contextMenu.setVisible(true);
-				
-			}
-		}
-	}
-	
-
-	private VpeAnyData editAnyData(StructuredTextEditor sourceEditor, boolean isCorrectNS, VpeAnyData data) {
-		Shell shell = sourceEditor.getEditorPart().getSite().getShell();
-		if (isCorrectNS) {
-			VpeEditAnyDialog editDialog = new VpeEditAnyDialog(shell, data);
-			editDialog.open();
-		} else {
-			MessageBox message = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
-			message.setMessage(VpeUIMessages.NAMESPACE_NOT_DEFINED);
-			message.open();
-		}
-		return data;
-	}
-
-	// VpeTemplateListener implementation
-	public void templateReloaded() {
-		visualRefresh();
-	}
-	
-	// VpeTaglibListener implementation
-//	public void taglibPrefixChanged(String[] prefixs) {
-//		if (VpeDebug.printSourceMutationEvent) {
-//			String s = ""; //$NON-NLS-1$
-//			for (int i = 0; i < prefixs.length; i++) {
-//				if (i > 0) {
-//					s += ", "; //$NON-NLS-1$
-//				}
-//				s += prefixs[i];
-//			}
-//		}
-//		queryVisualRefresh = true;
-////		visualRefreshImpl();
-//	}
-	
-	public void visualRefresh() {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		visualRefreshImpl();
-		pageContext.fireTaglibsChanged();
-
-		switcher.stopActiveEditor();
-	}
-	
-	void visualRefreshImpl() {
-		visualEditor.hideResizer();
-		visualBuilder.setSelectionRectangle(null);
-		IDOMModel sourceModel = (IDOMModel)getModel();
-		if (sourceModel != null) {
-			IDOMDocument sourceDocument = sourceModel.getDocument();
-			visualBuilder.rebuildDom(sourceDocument);
-		} else {
-			visualBuilder.rebuildDom(null);
-		}
-	}
-	
-	public void preLongOperation() {
-		switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL);
-	}
-
-	public void postLongOperation() {
-		switcher.stopActiveEditor();
-		visualRefresh();
-	}
-	
-	// for debug
-	private void printSourceEvent(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int pos) {
-		System.out.println(">>> eventType: " + INodeNotifier.EVENT_TYPE_STRINGS[eventType] + "  pos: " + pos + "  notifier: " + ((Node)notifier).getNodeName() + "  hashCode: " + notifier.hashCode()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		if (feature != null) {
-			if (feature instanceof Node) {
-				System.out.println("     feature: " + ((Node)feature).getNodeType() + "  " + ((Node)feature).getNodeName() + "  hashCode: " + feature.hashCode()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			} else {
-				System.out.println("     feature: " + feature); //$NON-NLS-1$
-			}
-		}
-		if (oldValue != null) {
-			if (oldValue instanceof Node) {
-				System.out.println("     oldValue: " + ((Node)oldValue).getNodeName() + "  hashCode: " + oldValue.hashCode()); //$NON-NLS-1$ //$NON-NLS-2$
-			} else {
-				System.out.println("     oldValue: " + oldValue); //$NON-NLS-1$
-			}
-		}
-		if (newValue != null) {
-			if (newValue instanceof Node) {
-				System.out.println("     newValue: " + ((Node)newValue).getNodeName() + "  hashCode: " + newValue.hashCode() + "    " + ((Node)newValue).getNodeType()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			} else {
-				System.out.println("     newValue: " + newValue); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private void printVisualEvent(nsIDOMEvent event) {
-		System.out.print("<<< " + event.getType()); //$NON-NLS-1$
-
-		if (event instanceof nsIDOMMutationEvent) {
-			nsIDOMMutationEvent mutationEvent = (nsIDOMMutationEvent)event;
-
-			System.out.print("  EventPhase: " + mutationEvent.getEventPhase()); //$NON-NLS-1$
-
-			nsIDOMNode relatedNode = mutationEvent.getRelatedNode();
-			System.out.print("  RelatedNode: " + (relatedNode == null ? null : relatedNode.getNodeName())); //$NON-NLS-1$
-			
-			nsIDOMNode targetNode = VisualDomUtil.getTargetNode(mutationEvent);
-			String name = targetNode != null ? targetNode.getNodeName() : null;
-			System.out.print("  TargetNode: " + name + " (" + targetNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-			System.out.print("  PrevValue: " + mutationEvent.getPrevValue().trim()); //$NON-NLS-1$
-			System.out.print("  NewValue: " + mutationEvent.getNewValue().trim()); //$NON-NLS-1$
-		}
-		System.out.println();
-	}
-	
-	private void printMapping() {
-		domMapping.printMapping();
-	}
-	
-	private class ActiveEditorSwitcher {
-		private static final int ACTIVE_EDITOR_CANNOT = 0;
-		private static final int ACTIVE_EDITOR_NONE = 1;
-		private static final int ACTIVE_EDITOR_SOURCE = 2;
-		private static final int ACTIVE_EDITOR_VISUAL = 3;
-		
-		private int type = ACTIVE_EDITOR_CANNOT;
-		
-		private void initActiveEditor() {
-			type = ACTIVE_EDITOR_NONE;
-		}
-		
-		private void destroyActiveEditor() {
-			type = ACTIVE_EDITOR_CANNOT;
-		}
-		
-		private boolean startActiveEditor(int newType) {
-			if (type == ACTIVE_EDITOR_NONE) {
-				if( newType == ACTIVE_EDITOR_SOURCE &&
-						editPart.getVisualMode() == VpeEditorPart.SOURCE_MODE) {
-					return false;
-				}
-				type = newType;
-				return true;
-			} else {
-				return false;
-			}
-		}
-		
-		private void stopActiveEditor() {
-			onRefresh();
-			type = ACTIVE_EDITOR_NONE;
-		}
-	}
-	
-	private void showProperties(Node node){
-		ExtendedProperties p = createExtendedProperties(node);
-		if(p != null) ExtendedPropertiesWizard.run(p);
-	}
-	
-	ExtendedProperties createExtendedProperties(Node node) {
-		try {
-			Class c = ModelFeatureFactory.getInstance().getFeatureClass("org.jboss.tools.jst.jsp.outline.VpeProperties"); //$NON-NLS-1$
-			return (ExtendedProperties)c.getDeclaredConstructor(new Class[]{Node.class}).newInstance(new Object[]{node});
-		} catch (Exception e) {
-			VpePlugin.reportProblem(e);
-			return null;
-		}
-	}
-	
-	
-	private void test(Node node) {
-	}
-
-	void refreshBundleValues() {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		if (bundle != null) {
-			bundle.refresh();
-			if (pageContext != null) {
-				pageContext.refreshBundleValues();
-			}
-		}
-		switcher.stopActiveEditor();
-	}
-
-	void refreshTemplates() {
-		if (includeList.includesRefresh()) {
-			visualRefresh();
-		}
-		if (templateManager != null) {
-			templateManager.reload();
-		}
-		if (bundle != null) {
-			bundle.refresh();
-			if (pageContext != null) {
-				if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-					return;
-				}
-				pageContext.refreshBundleValues();
-				switcher.stopActiveEditor();
-			}
-		}
-	}
-	
-	// implements XModelTreeListener
-  	 public void nodeChanged(XModelTreeEvent event) {
-  	 	visualRefresh();
-   	 }
-   	 
-	 public void structureChanged(XModelTreeEvent event) {
-	 }
-	 
-	 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 == null) {
-				node = getModel().getIndexedRegion(offset - 1);
-			}
-			if (node instanceof Node) {
-				return (Node) node;
-			}
-		}
-		return null;
-	 }
-	 
-	 private int getSourceNodeOffset(Node node, int pos, boolean endFlag) {
-	 	if (node == null) return 0;
-		int start = ((IndexedRegion)node).getStartOffset();
-		int end = ((IndexedRegion)node).getEndOffset();
-		
-		switch (node.getNodeType()) {
-		case Node.ATTRIBUTE_NODE:
-			if (node instanceof AttrImpl) {
-				return getSourceAttributeOffset((AttrImpl)node, pos);
-			}
-		case Node.TEXT_NODE:
-			if (pos < start) {
-				return 0;
-			} else if (pos > end) {
-				return end - start;
-			} else {
-				return pos - start;
-			}
-		case Node.COMMENT_NODE:
-			if (pos > end) {
-				pos = end;
-			}
-			int offset = pos - start - 4;
-			return offset < 0 ? 0 : offset;
-		case Node.ELEMENT_NODE:
-	 		ElementImpl element = (ElementImpl)node;
-	 		if (element.isContainer()) {
-		 		if (pos < element.getStartEndOffset()) {
-		 			return 0;
-		 		} else {
-		 			return 1;
-		 		}
-	 		} else {
-		 		return endFlag ? 1 : 0;
-	 		}
-		default:
-			return endFlag ? 1 : 0;
-		}
-	 }
-	 
-	private int getSourceAttributeOffset(AttrImpl attr, int pos) {
-		if (attr.getValueRegion() != null) {
-			int start = attr.getValueRegionStartOffset();
-			String value = attr.getValueRegionText();
-			int len = value.length();
-			if (pos >= start && pos <= start + len) {
-				int offset = pos - start;
-				if (len > 1 && value.charAt(0) == '"' && value.charAt(len - 1) == '"') {
-					if (offset <= 0 || offset >= len) {
-						return -1;
-					}
-					offset--;
-				}
-				return offset;
-			}
-		}
-		return -1;
-	}
-
-	private int getSourceNodeOffset1(Node node, int pos, boolean endFlag) {
-	 	if (node == null) return 0;
-		int start = ((IndexedRegion)node).getStartOffset();
-		int end = ((IndexedRegion)node).getEndOffset();
-		
-		switch (node.getNodeType()) {
-		case Node.ATTRIBUTE_NODE:
-			if (node instanceof AttrImpl) {
-				AttrImpl attr = (AttrImpl)node; 
-				start = attr.getValueRegionStartOffset();
-				end = start + attr.getValueRegion().getLength();
-				int ret = 0;
-				if (pos > end) {
-					ret = end - start;
-				} else {
-					ret = pos - start;
-				}
-				if (ret > 0 && attr.getValueRegionText().charAt(0) == '"') {
-					ret--;
-				}
-				return ret;
-			}
-		case Node.TEXT_NODE:
-			if (pos < start) {
-				return 0;
-			} else if (pos > end) {
-				return end - start;
-			} else {
-				return pos - start;
-			}
-		case Node.COMMENT_NODE:
-			if (pos > end) {
-				pos = end;
-			}
-			int offset = pos - start - 4;
-			return offset < 0 ? 0 : offset;
-		case Node.ELEMENT_NODE:
-	 		ElementImpl element = (ElementImpl)node;
-	 		if (element.isContainer()) {
-		 		if (pos < element.getStartEndOffset()) {
-		 			return 0;
-		 		} else if (pos < element.getStartEndOffset()) {
-		 			return 1;
-		 		} else if (pos == element.getStartEndOffset()) {
-		 			return 2;
-		 		}
-	 		} else {
-		 		return endFlag ? 1 : 0;
-	 		}
-		default:
-			return endFlag ? 1 : 0;
-		}
-	}
-
-	 private void listenContextMenu(MenuManager manager, IndexedRegion region, int type){
-	 	MenuManager mm = new MyMenuManager("From Palette",true); //$NON-NLS-1$
-	 	manager.add(mm);
-	 	manager.addMenuListener(new VpeMenuListener(mm, region, type));
-	 }
-	 
-	 class VpeMenuListener implements IMenuListener{
-	 	private MenuManager manager;
-	 	private IndexedRegion region;
-	 	private int type;
-	 	private boolean loaded=false;
-	 	
-	 	public VpeMenuListener(MenuManager manager, IndexedRegion region, int type){
-	 		this.manager = manager;
-	 		this.region = region;
-	 		this.type = type;
-	 	}
-		public void menuAboutToShow(IMenuManager m) {
-			if(loaded)return;
-			loaded=true;
-			fillContextMenuFromPalette(manager, region, type);
-			manager.getParent().update(true);
-		}
-	 }
-	 private MenuManager fillContextMenuFromPalette(MenuManager manager, IndexedRegion region, int type){
-		XModelObject model = ModelUtilities.getPreferenceModel().getByPath("%Palette%"); //$NON-NLS-1$
-		
-		XModelObject[] folders = model.getChildren();
-		for(int i=0;i<folders.length;i++){
-			if ("yes".equals(folders[i].getAttributeValue("hidden"))) continue; //$NON-NLS-1$ //$NON-NLS-2$
-			MenuManager mm = new MenuManager(folders[i].getAttributeValue("name")); //$NON-NLS-1$
-			manager.add(mm);
-			fillPaletteFolder(mm, region, folders[i], type);
-		}
-		return manager;
-	 }
-	 
-	 private void fillPaletteFolder(MenuManager menu, IndexedRegion region, XModelObject folder, int type){
-		XModelObject[] groups = folder.getChildren();
-		for(int i=0;i<groups.length;i++){
-			if ("yes".equals(groups[i].getAttributeValue("hidden"))) continue; //$NON-NLS-1$ //$NON-NLS-2$
-			MenuManager mm = new MenuManager(groups[i].getAttributeValue("name")); //$NON-NLS-1$
-			menu.add(mm);
-			fillPaletteGroup(mm, region, groups[i], type);
-		}
-	 }
-	 
-	 private void fillPaletteGroup(MenuManager menu, IndexedRegion region, XModelObject group, int type){
-		XModelObject[] items = group.getChildren();
-		String endText;
-		
-		for(int i=0;i<items.length;i++){
-			if ("yes".equals(items[i].getAttributeValue("hidden"))) continue; //$NON-NLS-1$ //$NON-NLS-2$
-			endText = items[i].getAttributeValue("end text"); //$NON-NLS-1$
-			
-			if(type == AROUND_MENU && (endText == null || "".equals(endText))) continue; //$NON-NLS-1$
-			createInsertAction(menu, region, items[i], type);
-		}
-	 }
-	 
-	 private void createInsertAction(MenuManager menu, IndexedRegion region, XModelObject item, int type){
-		
-
-		XModelObject parent = item.getParent();
-		String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$
-		String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$
-		String tagName = item.getAttributeValue("name"); //$NON-NLS-1$
-		String[] texts = new String[]{"<"+tagName+">"}; //$NON-NLS-1$ //$NON-NLS-2$
-		if(tagName.indexOf("taglib") < 0) //$NON-NLS-1$
-			PaletteInsertHelper.applyPrefix(texts, sourceEditor, tagName, uri, defaultPrefix);
-		tagName = texts[0];
-		
-		menu.add(new InsertAction(tagName, region, item, type));
-	 }
-	 
-	 class InsertAction extends Action{
-	 	private XModelObject item;
-	 	private int type;
-	 	private IndexedRegion region;
-	 	
-	 	public InsertAction(String title, IndexedRegion region, XModelObject item, int type){
-	 		super(title);
-	 		this.item = item;
-	 		this.type = type;
-	 		this.region = region;
-	 	}
-	 	public void run(){
-			try {
-				String tagName = item.getAttributeValue("name"); //$NON-NLS-1$
-				
-				XModelObject parent = item.getParent();
-				String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$
-				String libraryVersion = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_VERSION); //$NON-NLS-1$
-				String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$
-				VpeSelectionProvider selProvider = new VpeSelectionProvider(region);
-
-				String startText = "" + item.getAttributeValue("start text"); //$NON-NLS-1$ //$NON-NLS-2$
-				String endText = "" + item.getAttributeValue("end text"); //$NON-NLS-1$ //$NON-NLS-2$
-				if(type == AROUND_MENU){
-				}else if(type == BEFORE_MENU){
-					selProvider = new VpeSelectionProvider(region.getStartOffset());
-				}else if(type == AFTER_MENU){
-					selProvider = new VpeSelectionProvider(region.getEndOffset());
-				}
-				
-				Properties p = new Properties();
-				p.setProperty("tag name", tagName); //$NON-NLS-1$
-				p.setProperty("start text", startText); //$NON-NLS-1$
-				p.setProperty("end text", endText); //$NON-NLS-1$
-				p.setProperty("automatically reformat tag body", "" + item.getAttributeValue("automatically reformat tag body")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				p.setProperty(URIConstants.LIBRARY_URI, uri);
-				p.setProperty(URIConstants.LIBRARY_VERSION, libraryVersion);
-				String addTaglib = item.getParent().getAttributeValue(TLDToPaletteHelper.ADD_TAGLIB);
-				p.setProperty(URIConstants.DEFAULT_PREFIX, defaultPrefix);
-				p.setProperty(PaletteInsertHelper.PROPOPERTY_ADD_TAGLIB, addTaglib);
-				if(((Node)region).getNodeType() == Node.ELEMENT_NODE)
-					p.put("selectionProvider", selProvider); //$NON-NLS-1$
-				PaletteInsertHelper.insertIntoEditor(sourceEditor.getTextViewer(), p);
-			} catch (Exception e) {
-				VpePlugin.reportProblem(e);
-			}
-			
-	 	}
-	 	
-	 }
-	 
-	 class VpeSelectionProvider implements ISelectionProvider{
-	 	VpeSelection selection;
-	 	
-	 	public VpeSelectionProvider(IndexedRegion region){
-	 		selection = new VpeSelection(region);
-	 	}
-	 	public VpeSelectionProvider(int position){
-	 		selection = new VpeSelection(position);
-	 	}
-	 	public VpeSelectionProvider(int offset, int length){
-	 		selection = new VpeSelection(offset, length);
-	 	}
-	 	
-	 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		}
-		public ISelection getSelection() {
-			return selection;
-		}
-		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-
-		}
-		public void setSelection(ISelection selection) {
-		}
-	 }
-	 
-	 class VpeSelection implements ITextSelection{
-	 	String text=""; //$NON-NLS-1$
-	 	int offset, length;
-
-	 	public VpeSelection(int position){
-	 		offset = position;
-	 		length = 0;
-	 	}
-	 	
-	 	public VpeSelection(int offset, int length){
-	 		this.offset = offset;
-	 		this.length = length;
-	 		if (length > 0) {
-		 		try{
-		 			text = sourceEditor.getTextViewer().getDocument().get(offset, length);
-		 		}catch(Exception ex){
-					VpePlugin.reportProblem(ex);
-		 		}
-	 		}
-	 	}
-	 	
-	 	public VpeSelection(IndexedRegion region){
-	 		offset = region.getStartOffset();
-	 		length = region.getEndOffset() - offset;
-	 		try{
-	 			text = sourceEditor.getTextViewer().getDocument().get(offset, length);
-	 		}catch(Exception ex){
-				VpePlugin.reportProblem(ex);
-	 		}
-	 	}
-	 	
-	 	public int getEndLine() {
-			return 0;
-		}
-		public int getLength() {
-			return length;
-		}
-		public int getOffset() {
-			return offset;
-		}
-		public int getStartLine() {
-			return 0;
-		}
-		public String getText() {
-			return text;
-		}
-		public boolean isEmpty() {
-			return false;
-		}
-}
-
-	class VpeAction extends Action{
-		public Node actionNode;
-		public VpeAction(String name, Node node){
-			super(name);
-			this.actionNode = node;
-		}
-	}
-	
-	class VpeTextOperationAction extends Action{
-		private String id;
-		private IndexedRegion region;
-		public VpeTextOperationAction(String name, String id, IndexedRegion region){
-			super(name);
-			this.id = id;
-			this.region = region;
-		}
-		public void run(){
-			sourceEditor.getSelectionProvider().setSelection(new VpeSelection(region));
-			sourceEditor.getAction(id).run();
-		}
-	}
-
-    public void refreshExternalLinks() {
-        pageContext.getVisualBuilder().refreshExternalLinks();
-    }
-
-    public IPath getPath() {
-        if (editPart != null) {
-            IEditorInput input = editPart.getEditorInput();
-            if (input != null && input instanceof IFileEditorInput) {
-                return ((IFileEditorInput)input).getFile().getFullPath();
-            }
-        }
-        return null;
-    }
-
-    public void changed(Object source) {
-    	if(cssReferenceListListener == source) {
-    		pageContext.getVisualBuilder().refreshExternalLinks();
-    	} else if (absoluteFolderReferenceListListener == source ||
-    				relativeFolderReferenceListListener == source ||
-    				taglibReferenceListListener == source) {
-    		visualRefresh();
-    	}
-    }
-    
-	public void dragEnter(nsIDOMEvent event) {
-		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
-			System.out.println("<<<<<<<<<<<<<<<<<<<< DragEnter"); //$NON-NLS-1$
-		}
-	}
-
-	public void dragExit(nsIDOMEvent event) {
-		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
-			System.out.println("<<<<<<<<<<<<<<<<<<<< dragExit"); //$NON-NLS-1$
-		}
-		// TODO Sergey Vasilyev figure out with drag caret
-//		xulRunnerEditor.hideDragCaret();
-	}
-	
-	public void dragOver(nsIDOMEvent event) {
-
-		visualBuilder.getDnd().dragOver(event, this);
-
-	}
-		
-	public void _dragOver(nsIDOMEvent event) {
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
-			return;
-		}
-		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
-			System.out.println("<<<<<<<<<<<<<<<<<<<< dragOver"); //$NON-NLS-1$
-		}
-		
-//		browser.computeDropPosition(event);
-		
-		boolean canDrop = !xulRunnerEditor.isMozillaDragFlavor();
-		if (canDrop) {
-			Clipboard clipboard = new Clipboard(Display.getCurrent());
-			canDrop = clipboard.getContents(ModelTransfer.getInstance()) != null;
-		}
-		if (canDrop) {
-			canDrop = VpeDndUtil.isDropEnabled((IModelObjectEditorInput)sourceEditor.getEditorInput());
-		}
-		if (canDrop) {
-			VpeVisualCaretInfo caretInfo = selectionBuilder.getVisualCaretInfo(event);
-			canDrop = caretInfo.exist();
-			if (canDrop) {
-				caretInfo.showCaret();
-			} else {
-				caretInfo.hideCaret();
-			}
-		}
-		if (!canDrop) {
-			event.stopPropagation();
-			event.preventDefault();
-		}
-		switcher.stopActiveEditor();
-	}
-
-	public void drop(nsIDOMEvent event) {
-		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
-			System.out.println("<<< outerDrop"); //$NON-NLS-1$
-		}
-		event.preventDefault();
-	}
-
-	public boolean canInnerDrag(nsIDOMMouseEvent event) {
-		onHideTooltip();
-
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.print("<<<<<< canInnerDrag"); //$NON-NLS-1$
-		}
-		if (innerDragInfo != null) {
-			innerDragInfo.Release();
-			innerDragInfo = null;
-		}
-		boolean canDrag = false;
-		VpeVisualInnerDragInfo dragInfo = selectionBuilder.getInnerDragInfo(event);
-		if (dragInfo != null) {
-			nsIDOMNode dragNode = dragInfo.getNode();
-			if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-				System.out.print(" dragNode: " + dragNode.getNodeName() + "(" + dragNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			}
-			switch (dragNode.getNodeType()) {
-			case nsIDOMNode.ELEMENT_NODE:
-				canDrag = visualBuilder.canInnerDrag((nsIDOMElement)dragNode);
-			case nsIDOMNode.TEXT_NODE:
-				canDrag = visualBuilder.isTextEditable(dragNode);
-			}
-			if (canDrag) {
-				VpeSourceInnerDragInfo sourceInnerDragInfo = visualBuilder.getSourceInnerDragInfo(dragInfo);
-				if (sourceInnerDragInfo.getNode() != null) {
-					innerDragInfo = dragInfo;
-					InnerDragBuffer.object = sourceInnerDragInfo.getNode();
-					Display.getDefault().asyncExec(new Runnable() {
-						public void run() {
-							InnerDragBuffer.object = null;
-						}
-					});
-				} else {
-					canDrag = false;
-				}
-			} 
-			if (!canDrag) {
-				dragInfo.Release();
-			}
-		}
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.println("  canDrag: " + canDrag); //$NON-NLS-1$
-		}
-		return canDrag;
-	}
-	
-	VpeDropWindow dropWindow = null;
-	
-	public MozillaDropInfo canInnerDrop(nsIDOMMouseEvent event) {
-		onHideTooltip();
-
-		if(dropWindow.active) {
-			if(!event.getAltKey()) {
-				dropWindow.close();
-			} else {
-				return null;
-			}
-		}
-		if(event.getAltKey()) {
-			nsIDOMNode visualNode = VisualDomUtil.getTargetNode(event);
-			Node sourceNode = domMapping.getNearSourceNode(visualNode);
-			if(sourceNode != null) {
-				dropWindow.active = true;
-				dropWindow.setEventPosition(event.getScreenX(), event.getScreenY());
-				dropWindow.setInitialTargetNode(sourceNode);
-				dropWindow.open();
-				event.stopPropagation();
-				event.preventDefault();
-				return null;
-			}
-		}
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.print("<<<<<< canInnerDrop"); //$NON-NLS-1$
-		}
-		boolean canDrop = false;;
-		nsIDOMNode caretParent = null;
-		long caretOffset = 0;
-		if (innerDragInfo != null) {
-			VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(event);
-			if (visualDropInfo.getDropContainer() != null) {
-				if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-					System.out.print("  x: " + visualDropInfo.getMouseX() + "  y: " + visualDropInfo.getMouseY() +  //$NON-NLS-1$ //$NON-NLS-2$
-							"  container: " + visualDropInfo.getDropContainer().getNodeName() +  //$NON-NLS-1$
-							"(" + visualDropInfo.getDropContainer() + ")" + //$NON-NLS-1$ //$NON-NLS-2$
-							"  parent: " + visualDropInfo.getDropContainer().getParentNode().getNodeName() + //$NON-NLS-1$
-							"(" + visualDropInfo.getDropContainer().getParentNode() + ")" + //$NON-NLS-1$ //$NON-NLS-2$
-							"  offset: " + visualDropInfo.getDropOffset()); //$NON-NLS-1$
-				}
-				VpeSourceInnerDragInfo sourceInnerDragInfo = visualBuilder.getSourceInnerDragInfo(innerDragInfo);
-				VpeSourceInnerDropInfo sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceInnerDragInfo.getNode(), visualDropInfo, true);
-				canDrop = sourceDropInfo.canDrop();
-				if (canDrop) {
-					VpeVisualInnerDropInfo newVisualDropInfo = visualBuilder.getInnerDropInfo(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
-					if (newVisualDropInfo != null) {
-						visualBuilder.correctVisualDropPosition(newVisualDropInfo, visualDropInfo);
-						caretParent = newVisualDropInfo.getDropContainer();
-						caretOffset = newVisualDropInfo.getDropOffset();
-					}
-				}
-			}
-			visualDropInfo.Release();
-		}
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.println("  canDrop: " + canDrop); //$NON-NLS-1$
-		}
-		return new MozillaDropInfo(canDrop, caretParent, caretOffset);
-	}
-
-	public void innerDrop(nsIDOMMouseEvent event) {
-		onHideTooltip();
-
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.print("<<<<<< innerDrop"); //$NON-NLS-1$
-		}
-		if (innerDragInfo != null) {
-			VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(event);
-			if (visualDropInfo.getDropContainer() != null) {
-				if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-					System.out.print("  container: " + visualDropInfo.getDropContainer().getNodeName() +  //$NON-NLS-1$
-							"(" + visualDropInfo.getDropContainer() + ")" +  //$NON-NLS-1$ //$NON-NLS-2$
-							"  offset: " + visualDropInfo.getDropOffset()); //$NON-NLS-1$
-				}
-
-				VpeSourceInnerDragInfo sourceInnerDragInfo = visualBuilder.getSourceInnerDragInfo(innerDragInfo);
-				VpeSourceInnerDropInfo sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceInnerDragInfo.getNode(), visualDropInfo, true);
-				if(sourceDropInfo.canDrop()){
-					VpeVisualInnerDropInfo newVisualDropInfo = visualBuilder.getInnerDropInfo(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
-					if (newVisualDropInfo != null) {
-						visualBuilder.correctVisualDropPosition(newVisualDropInfo, visualDropInfo);
-						sourceDropInfo.setTop(visualDropInfo.getMouseY());
-						sourceDropInfo.setLeft(visualDropInfo.getMouseX());
-						visualBuilder.innerDrop(sourceInnerDragInfo, sourceDropInfo);
-						if (innerDragInfo != null) {
-							innerDragInfo.Release();
-							innerDragInfo = null;
-						}
-					}
-				}
-			}
-		}
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.println();
-		}
-	}
-
-	public MozillaDropInfo canExternalDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data) {
-		InnerDragBuffer.object = null;
-		onHideTooltip();
-
-		if(dropWindow.active) {
-			if(!mouseEvent.getAltKey()) {
-				dropWindow.close();
-			} else {
-				return new MozillaDropInfo(false, null, 0);
-			}
-		}
-		if(mouseEvent.getAltKey()) {
-			nsIDOMEvent event = (nsIDOMEvent) mouseEvent.queryInterface(nsIDOMEvent.NS_IDOMEVENT_IID);
-			nsIDOMNode visualNode = (nsIDOMNode) event.getTarget().queryInterface(nsIDOMNode.NS_IDOMNODE_IID);
-			Node sourceNode = domMapping.getNearSourceNode(visualNode);
-			if(sourceNode != null) {
-				if(ModelTransfer.MODEL.equals(flavor)){ //$NON-NLS-1$
-//					XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
-//					InnerDragBuffer.object = object;
-				} else {
-					dropWindow.flavor = flavor;
-				}
-				dropWindow.active = true;
-				dropWindow.setEventPosition(mouseEvent.getScreenX(), mouseEvent.getScreenY());
-				dropWindow.setInitialTargetNode(sourceNode);
-				dropWindow.open();
-				mouseEvent.stopPropagation();
-				mouseEvent.preventDefault();
-				return new MozillaDropInfo(false, null, 0);
-			}
-		}
-		boolean canDrop = false;
-		nsIDOMNode caretParent = null;
-		long caretOffset = 0;
-
-		if(MODEL_FLAVOR.equals(flavor)){
-			XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
-			if(object.getFileType() == XModelObject.FILE && !TLDUtil.isTaglib(object)) {
-				IFile f = (IFile)EclipseResourceUtil.getResource(object);
-				canDrop = f != null;
-				VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
-				caretParent = visualDropInfo.getDropContainer();
-				caretOffset = visualDropInfo.getDropOffset();
-			} else {			
-				String tagname = getTagName(object);
-				if(tagname.indexOf("taglib") >= 0) tagname= "taglib"; //$NON-NLS-1$ //$NON-NLS-2$
-				Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
-				VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
-				if (visualDropInfo.getDropContainer() != null) {
-				VpeSourceInnerDropInfo sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceDragNode, visualDropInfo, true);
-					canDrop = sourceDropInfo.canDrop();
-					if (canDrop) {
-						VpeVisualInnerDropInfo newVisualDropInfo = visualBuilder.getInnerDropInfo(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
-						if (newVisualDropInfo != null) {
-							visualBuilder.correctVisualDropPosition(newVisualDropInfo, visualDropInfo);
-							caretParent = newVisualDropInfo.getDropContainer();
-							caretOffset = newVisualDropInfo.getDropOffset();
-						}
-					}
-				}
-				visualDropInfo.Release();
-			}
-		}else if(XulRunnerEditor.TRANS_FLAVOR_kFileMime.equals(flavor) ||
-				XulRunnerEditor.TRANS_FLAVOR_kURLMime.equals(flavor)) {
-			VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
-			caretParent = visualDropInfo.getDropContainer();
-			caretOffset = visualDropInfo.getDropOffset();
-			try {
-				canDrop = true;
-			} catch (Exception ex) {
-				VpePlugin.reportProblem(ex);
-			}
-		}
-		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-			System.out.println("  canDrop: " + canDrop + (canDrop ? "  container: " + caretParent.getNodeName() + "  offset: " + caretOffset : "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		return new MozillaDropInfo(canDrop, caretParent, caretOffset);
-		
-	}
-
-	public VpeSourceInnerDropInfo canExternalDropMacro(XModelObject object, Node parentNode, int offset) {
-		String tagname = getTagName(object);
-		Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
-		return visualBuilder.getSourceInnerDropInfo(sourceDragNode, parentNode, offset, false);
-	}
-
-	public void externalDropAny(final String flavor, final String data, final Point range, Node container) {
-		if(flavor == null || flavor.length() == 0) return;
-		IDropCommand dropCommand = DropCommandFactory.getInstance().getDropCommand(flavor, JSPTagProposalFactory.getInstance());
-
-		boolean promptAttributes = "yes".equals(VpePreference.ALWAYS_REQUEST_FOR_ATTRIBUTE.getValue());
-		dropCommand.getDefaultModel().setPromptForTagAttributesRequired(promptAttributes);
-
-		dropCommand.execute(
-			new DropData(
-				flavor,
-				data,
-				getPageContext(),
-				sourceEditor.getEditorInput(),
-				(ISourceViewer)sourceEditor.getAdapter(ISourceViewer.class), 
-				new VpeSelectionProvider(range.x,range.y),
-				container
-			)
-		);		
-	}
-
-	private String getTagName(XModelObject object) {
-		String tagname = object.getAttributeValue("name"); //$NON-NLS-1$
-
-		XModelObject parent = object.getParent();
-		String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$
-		String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$
-		
-		String[] texts = new String[]{"<"+tagname+">"}; //$NON-NLS-1$ //$NON-NLS-2$
-		PaletteInsertHelper.applyPrefix(texts, sourceEditor, tagname, uri, defaultPrefix);
-		tagname = texts[0].substring(1,texts[0].length()-1);
-		
-		return tagname;
-	}
-
-	public void externalDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data) {
-		onHideTooltip();
-
-		VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
-		Point range = selectionBuilder.getSourceSelectionRangeAtVisualNode(visualDropInfo.getDropContainer(), (int)visualDropInfo.getDropOffset());
-		VpeSourceInnerDropInfo sourceDropInfo = null;
-		
-		if(MODEL_FLAVOR.equals(flavor)){
-			XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
-			if(object.getFileType() == XModelObject.FILE && !TLDUtil.isTaglib(object)) {
-				flavor = "application/x-moz-file"; //$NON-NLS-1$
-				IFile f = (IFile)EclipseResourceUtil.getResource(object);
-				try {
-					data = f.getLocation().toFile().toURL().toString();
-				} catch (Exception e) {
-					VpePlugin.getPluginLog().logError(e);
-				}
-			} else {			
-				String tagname = getTagName(object);
-				if(tagname.indexOf("taglib") >= 0) tagname= "taglib"; //$NON-NLS-1$ //$NON-NLS-2$
-				Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
-				if (visualDropInfo.getDropContainer() != null) {
-					sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceDragNode, visualDropInfo, true);
-					range = selectionBuilder.getSourceSelectionRange(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
-				}
-			}
-		}
-		
-		if (visualDropInfo.getDropContainer() != null) {
-			if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-				System.out.println("  drop!  container: " + visualDropInfo.getDropContainer().getNodeName()); //$NON-NLS-1$
-			}
-			externalDropAny(flavor, data, range, sourceDropInfo == null?null:sourceDropInfo.getContainer());
-		}
-	}
-	
-	public void onShowTooltip(int x, int y, final String text) {
-		
-		if (tip != null && !tip.isDisposed()) tip.dispose();
-		
-		Display display = visualEditor.getControl().getDisplay();
-		Shell parent = visualEditor.getControl().getShell();
-		
-		tip = new Shell(parent, SWT.NO_FOCUS| SWT.ON_TOP);
-		Color bckgColor = new Color(tip.getDisplay(), 255, 250, 236);
-		tip.setBackground(bckgColor);					
-		
-		Composite composite = tip;
-		GridLayout layout= new GridLayout();		
-		layout.numColumns = 2;
-		layout.marginHeight= 0;
-		layout.marginWidth= 0;
-		layout.verticalSpacing= 0;
-		layout.horizontalSpacing= 0;	
-		composite.setLayout(layout);
-		GridData gd= new GridData(GridData.FILL_BOTH);
-		composite.setLayoutData(gd);
-		
-		
-		final StyledText tipControlHeaderText = new StyledText(composite,  SWT.MULTI | SWT.READ_ONLY);
-				
-		tipControlHeaderText.setForeground(bckgColor);
-		tipControlHeaderText.setBackground(bckgColor);
-			
-		String formatText = text.trim();
-		
-		/** attributeString string containing the pairs attribute and it's value as one string*/	
-		String[] attributeString = formatText.split("\n"); //$NON-NLS-1$
-		/** buffer string containing the attribute and the value in the different succeding string*/
-		String[] buffer = attributeString[0].split(" "); //$NON-NLS-1$
-		
-		tipControlHeaderText.setText(buffer[0].toString());
-				
-		tipControlHeaderText.addLineStyleListener(
-			new LineStyleListener() {
-				public void lineGetStyle(LineStyleEvent event){
-					Color color = new Color(tipControlHeaderText.getDisplay(), 201, 51, 40);
-					if (event.lineOffset == 0) {			
-						StyleRange st = new StyleRange();
-						st.fontStyle = SWT.BOLD;
-						st.foreground = color;
-						event.styles = new StyleRange[]{st};
-						st.start = event.lineOffset;
-						st.length = event.lineText.length();						
-					}
-				}
-			}
-		);
-		
-		GridData gridData = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
-		gridData.horizontalAlignment = GridData.FILL; 
-		gridData.horizontalSpan = 2;
-		tipControlHeaderText.setLayoutData(gridData);
-		
-		StringBuffer tempAttr = new StringBuffer();
-		StringBuffer tempValue = new StringBuffer();
-		
-		if (attributeString.length >= 2) {
-			for (int i = 1; i < attributeString.length; i++) {
-				buffer = attributeString[i].split(" ", 2); //$NON-NLS-1$
-				if (i == 1) {
-					tempAttr.append(buffer[0] + " "); //$NON-NLS-1$
-					tempValue.append((buffer.length>=2?buffer[1]:"") + " "); //$NON-NLS-1$ //$NON-NLS-2$
-				} else {
-					tempAttr.append("\n" + buffer[0] + " "); //$NON-NLS-1$ //$NON-NLS-2$
-					tempValue.append(" \n" + (buffer.length>=2?buffer[1]:"") + " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				}
-			}
-	
-			final StyledText tipControlAttributeText = new StyledText(composite,
-					SWT.MULTI | SWT.READ_ONLY);
-			
-			tipControlAttributeText.setForeground(bckgColor);
-			tipControlAttributeText.setBackground(bckgColor);
-	
-			tipControlAttributeText.setText(tempAttr.toString());
-			tipControlAttributeText
-					.addLineStyleListener(new LineStyleListener() {
-						public void lineGetStyle(LineStyleEvent event) {
-							Color color = new Color(tipControlHeaderText
-									.getDisplay(), 42, 148, 0);
-							StyleRange st = new StyleRange();
-							st.start = event.lineOffset;
-							st.length = event.lineText.length();
-							st.foreground = color;
-							st.fontStyle = SWT.NORMAL;
-							event.styles = new StyleRange[] { st };
-						}
-					});
-			GridData gridData1 = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
-			gridData1.horizontalAlignment = GridData.FILL;	
-			tipControlAttributeText.setLayoutData(gridData1);
-	
-			final StyledText tipControlValueText = new StyledText(composite,
-					SWT.MULTI | SWT.READ_ONLY);
-		
-			tipControlValueText.setBackground(bckgColor);
-	
-			tipControlValueText.setText(tempValue.toString());
-	
-			
-			
-			GridData gridData2 = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
-			gridData2.horizontalAlignment = GridData.FILL;
-			tipControlValueText.setLayoutData(gridData2);
-		}
-		/*
-		* Bug in Mozilla embedded API.  Tooltip coordinates are wrong for 
-		* elements inside an inline frame (IFrame tag).  The workaround is 
-		* to position the tooltip based on the mouse cursor location.
-		*/
-		Point point = display.getCursorLocation();
-		/* Assuming cursor is 21x21 because this is the size of
-		 * the arrow cursor on Windows
-		 */ 
-		point.y += 21;
-		tip.setLocation(point);
-		tip.pack();
-		tip.setVisible(true);
-	}
-	
-	public void onHideTooltip() {
-		if (tip != null && !tip.isDisposed()) tip.dispose();
-		tip = null;
-	}
-	
-	public VpePageContext getPageContext() {
-		return pageContext;
-	}
-
-	public StructuredTextEditor getSourceEditor() {
-		return sourceEditor;
-	}
-
-	public FormatControllerManager getToolbarFormatControllerManager() {
-		return toolbarFormatControllerManager;
-	}
-
-	public void setToolbarFormatControllerManager(FormatControllerManager formatControllerManager) {
-		toolbarFormatControllerManager = formatControllerManager;
-	}
-	public void setSelectionBarController(SelectionBar selectionBar) {
-		this.selectionBar = selectionBar;
-	}
-
-	public IStructuredModel getModel() {
-		return sourceEditor.getModel();
-	}
-
-	public VpeDomMapping getDomMapping() {
-		return domMapping;
-	}
-	
-	public VpeIncludeList getIncludeList(){
-		try {
-			if(includeList == null)
-				throw new Exception("includeList - NULL!!!"); //$NON-NLS-1$
-		} catch (Exception e) {
-			VpePlugin.getPluginLog().logError(e);
-		}
-		return includeList;
-	}
-
-	public void selectionChanged(SelectionChangedEvent event) {
-		if (editPart.getVisualMode() != VpeEditorPart.SOURCE_MODE) {
-			if(toolbarFormatControllerManager != null) toolbarFormatControllerManager.selectionChanged();
-		}
-
-		if(selectionBar != null) selectionBar.selectionChanged();
-		
-		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
-			return;
-		}
-		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
-			System.out.println(">>>>>>>>>>>>>> selectionChanged  " + event.getSource()); //$NON-NLS-1$
-		}
-		sourceSelectionChanged();
-		switcher.stopActiveEditor();
-	}
-
-	// nsIClipboardDragDropHooks implementation
-	public void onPasteOrDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data) {
-		onHideTooltip();
-
-		VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
-		Point range = selectionBuilder.getSourceSelectionRangeAtVisualNode(visualDropInfo.getDropContainer(), (int)visualDropInfo.getDropOffset());
-		VpeSourceInnerDropInfo sourceDropInfo = null;
-
-		XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
-
-		String tagname = getTagName(object);
-		if(tagname.indexOf("taglib") >= 0) tagname= "taglib"; //$NON-NLS-1$ //$NON-NLS-2$
-		Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
-		if (visualDropInfo.getDropContainer() != null) {
-			sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceDragNode, visualDropInfo, true);
-			range = selectionBuilder.getSourceSelectionRange(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
-		}
-		
-		if (visualDropInfo.getDropContainer() != null) {
-			if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
-				System.out.println("  drop!  container: " + visualDropInfo.getDropContainer().getNodeName()); //$NON-NLS-1$
-			}
-			final String finalFlavor = flavor;
-			final String finalData = data;
-			final Point finalRange = range;
-			final Node finalDropContainer = sourceDropInfo == null ? null : sourceDropInfo.getContainer();
-			Display.getDefault().asyncExec(new Runnable() {
-				public void run() {
-					externalDropAny(finalFlavor, finalData, finalRange, finalDropContainer);
-				}
-			});
-		}
-	}
-
-	public void drop(Node node, Node parentNode, int offset) {
-		visualBuilder.innerDrop(node, parentNode, offset);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.interfaces.nsISupports#queryInterface(java.lang.String)
-	 */
-	public nsISupports queryInterface(String arg0) {
-		return Mozilla.getInstance().queryInterface(this, arg0);
-	}
-	/**
-	 * Calls when editor content should be refreshed
-	 */
-	public void onRefresh() {
-		//when we using separate thread to display selection rectangle 
-		//it's working better than without
-		/*
-		 * HACK 
-		 * We need wait some time while standart event will be handled
-		 * and in process event handles some components are repainted(like buttons)
-		 * and flasher are not repainted, so we should paint flasher
-		 */
-
-		
-			Display.getDefault().asyncExec(new Thread(){
-				public void run(){
-					
-					getXulRunnerEditor().showSelectionRectangle();
-				}
-			});
-		
-	}
-
-	/**
-	 * @return the xulRunnerEditor
-	 */
-	public XulRunnerEditor getXulRunnerEditor() {
-		return xulRunnerEditor;
-	}
-
-	/**
-	 * @param xulRunnerEditor the xulRunnerEditor to set
-	 */
-	public void setXulRunnerEditor(XulRunnerEditor xulRunnerEditor) {
-		this.xulRunnerEditor = xulRunnerEditor;
-	}
-	
-	/**
-	 * Start drag session
-	 */
-	public void startDragSession(nsIDOMEvent domEvent) {
-		
-		visualBuilder.getDnd().startDragSession(domEvent);
-	}
-
-	public void dragDrop(nsIDOMEvent domEvent) {
-		
-		visualBuilder.getDnd().dragDrop(domEvent,this);
-	}
-
-	/**
-	 * @return the selectionBuilder
-	 */
-	public VpeSelectionBuilder getSelectionBuilder() {
-		return selectionBuilder;
-	}
-
-	/**
-	 * @param selectionBuilder the selectionBuilder to set
-	 */
-	public void setSelectionBuilder(VpeSelectionBuilder selectionBuilder) {
-		this.selectionBuilder = selectionBuilder;
-	}
-
-}
+				}
+				//sends xulrunner event to eclipse environment
+				getXulRunnerEditor().getBrowser().notifyListeners(keyboardEvent.type, keyboardEvent);
+				
+			}
+		} catch (Exception e) {
+			VpePlugin.getPluginLog().logError(e);
+			visualRefresh();
+		}
+
+	}
+
+	public void elementResized(nsIDOMElement element, int resizerConstrains, int top, int left, int width, int height) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		visualEditor.hideResizer();
+		switcher.stopActiveEditor();
+
+		visualBuilder.resize(element, resizerConstrains, top, left, width, height);
+		sourceSelectionChanged();
+	}
+	
+	public void dragGesture(nsIDOMEvent domEvent) {
+
+		nsIDOMMouseEvent mouseEvent = (nsIDOMMouseEvent) domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
+			boolean canDragFlag = canInnerDrag(mouseEvent);
+			//start drag sessionvpe-element
+			if(canDragFlag) {				
+				startDragSession(domEvent);
+				}
+	}
+	
+	private void createMenuForNode(Node node, MenuManager manager) {
+		createMenuForNode(node, manager, false);
+	}
+	
+	private void createMenuForNode(Node node, MenuManager manager, boolean topLevelFlag) {
+		NodeActionManager.setTextNodeSplitter(null);
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			VpeElementMapping elementMapping = (VpeElementMapping)domMapping.getNodeMapping(node);
+			if (elementMapping != null && elementMapping.getTemplate() != null) {
+				manager.add(new VpeAction("<"+node.getNodeName()+"> Attributes", node) {  //$NON-NLS-1$ //$NON-NLS-2$
+						public void  run() {
+							showProperties(actionNode);								
+						}
+				});
+				
+				if (!topLevelFlag) {
+					manager.add(new VpeAction("Select This Tag", node) {  //$NON-NLS-1$
+						public void  run() {
+							selectionBuilder.setVisualSelection(actionNode,0,actionNode,0,false,true);
+
+						}
+					});
+				}
+				Node parent = node.getParentNode();
+				if(parent != null && parent.getNodeType() == Node.ELEMENT_NODE){
+					MenuManager menuManager = new MenuManager("Parent Tag"); //$NON-NLS-1$
+					menuManager.setParent(manager);
+					manager.add(menuManager);
+					createMenuForNode(parent, menuManager);
+				}
+				
+				manager.add(new Separator());
+			}
+		}
+		NodeActionManager actionManager = new NodeActionManager(getModel(), null);
+		
+		if (node.getNodeType() == Node.TEXT_NODE) {
+			Point range = sourceEditor.getTextViewer().getSelectedRange();
+			TextNodeSplitterImpl splitter = new TextNodeSplitterImpl(range, (Text)node);
+			NodeActionManager.setTextNodeSplitter(splitter);
+		}
+
+		
+		if (actionManager != null) {
+			StructuredSelection structuredSelection = new StructuredSelection(node);
+			actionManager.fillContextMenuForVpe(manager, structuredSelection);
+			
+		}
+
+		IContributionItem[] items = manager.getItems();
+		
+		for(int i=0;i< items.length;i++){
+			if(items[i] instanceof MenuManager){
+				MenuManager mm = (MenuManager)items[i];
+				if(NodeActionManager.INSERT_AROUND_MENU.equals(mm.getMenuText())){
+					listenContextMenu(mm, (IndexedRegion)node, AROUND_MENU);
+				}else if(NodeActionManager.INSERT_BEFORE_MENU.equals(mm.getMenuText())){
+					listenContextMenu(mm, (IndexedRegion)node, BEFORE_MENU);
+				}else if(NodeActionManager.INSERT_AFTER_MENU.equals(mm.getMenuText())){
+					listenContextMenu(mm, (IndexedRegion)node, AFTER_MENU);
+				}
+			}
+		}
+		
+		manager.add(new Separator());
+		
+		if (node.getNodeType() == Node.ELEMENT_NODE) {
+			VpeElementMapping elementMapping = (VpeElementMapping)domMapping.getNodeMapping(node);
+			if (elementMapping != null && elementMapping.getTemplate() != null && elementMapping.getTemplate().getType() == VpeHtmlTemplate.TYPE_ANY) {
+				final VpeTemplate selectedTemplate = elementMapping.getTemplate();
+				//TODO Max Areshkau JBIDE-788 Fix That
+//				manager.add(new VpeAction("Template", node) {  //$NON-NLS-1$
+//					public void  run() {
+//						boolean isCorrectNS = pageContext.isCorrectNS(actionNode);
+//						VpeAnyData data = null;
+//						if (isCorrectNS) {
+//							data = selectedTemplate.getAnyData();
+//							data.setUri(pageContext.getSourceTaglibUri(actionNode));
+//							data.setName(actionNode.getNodeName());
+//						}
+//						data = editAnyData(sourceEditor, isCorrectNS, data);
+//						if (data != null && data.isChanged()) templateManager.setAnyTemplate(data);
+//					}
+//				});
+
+				manager.add(new Separator());
+			}
+		
+		
+			manager.add(new VpeTextOperationAction("Cut", ActionFactory.CUT.getId(), (IndexedRegion)node)); //$NON-NLS-1$
+			manager.add(new VpeTextOperationAction("Copy", ActionFactory.COPY.getId(), (IndexedRegion)node)); //$NON-NLS-1$
+			manager.add(new VpeTextOperationAction("Paste", ActionFactory.PASTE.getId(), (IndexedRegion)node)); //$NON-NLS-1$
+		}else if(node.getNodeType() == Node.TEXT_NODE){
+			manager.add(new Action("Cut") {  //$NON-NLS-1$
+				public void  run() {
+					sourceEditor.getAction(ActionFactory.CUT.getId()).run();
+				}
+			});
+			manager.add(new Action("Copy") {  //$NON-NLS-1$
+				public void  run() {
+					sourceEditor.getAction(ActionFactory.COPY.getId()).run();
+				}
+			});
+			manager.add(new Action("Paste") {  //$NON-NLS-1$
+				public void  run() {
+					sourceEditor.getAction(ActionFactory.PASTE.getId()).run();
+				}
+			});
+		}
+		manager.add(new Separator());
+		
+		if (actionManager != null) {
+			StructuredSelection structuredSelection = node.getNodeType() == Node.ELEMENT_NODE ? new StructuredSelection(node) : null;
+			actionManager.addContextMenuForVpe(manager, structuredSelection);
+		}
+		
+		if(node.getNodeType() == Node.ELEMENT_NODE){
+			boolean stripEnable = false;
+			NodeImpl impl = (NodeImpl)node;
+			if(impl.isContainer()){
+				NodeList list = impl.getChildNodes();
+				if(list.getLength() > 0){
+					if(list.getLength() == 1){
+						Node child = list.item(0);
+						if(child.getNodeType() == Node.TEXT_NODE){
+							if("".equals(child.getNodeValue().trim()))stripEnable = false; //$NON-NLS-1$
+							else stripEnable = true;
+						}else stripEnable = true;
+					}else stripEnable = true;
+				}
+			}
+			if(stripEnable)
+			manager.add(new VpeAction("Strip Tag", node) {  //$NON-NLS-1$
+				public void  run() {
+					Node parent = actionNode.getParentNode();
+					if(parent != null){
+						int index = ((NodeImpl)actionNode).getIndex();
+						parent.removeChild(actionNode);
+						NodeList children = actionNode.getChildNodes();
+						int lengh = children.getLength();
+						Node child;
+						for(int i=0; i < lengh; i++){
+							child = children.item(0);
+							actionNode.removeChild(child);
+							insertNode(parent, child, index++);
+						}
+					}
+				}
+				
+				private void insertNode(Node parent, Node node, int index){
+					Node oldNode=null;
+					int childSize = parent.getChildNodes().getLength();
+					
+					if(index <= (childSize-1))oldNode = parent.getChildNodes().item(index);
+					if(oldNode != null)parent.insertBefore(node, oldNode);
+					else parent.appendChild(node);
+				}
+			});
+		}
+		if(node.getNodeType() == Node.TEXT_NODE){
+			manager.add(new Action("Delete") {  //$NON-NLS-1$
+				public void  run() {
+					sourceEditor.getAction(ActionFactory.DELETE.getId()).run();
+				}
+			});
+		}
+
+		if (VpeDebug.VISUAL_CONTEXTMENU_DUMP_SOURCE) {
+			manager.add(new Action("Dump Source") { //$NON-NLS-1$
+				public void  run() {	
+					DOMTreeDumper dumper = new DOMTreeDumper();
+					dumper.dumpToStream(System.out, visualEditor.getDomDocument());
+				}
+			});
+		}
+		
+		if (VpeDebug.VISUAL_CONTEXTMENU_DUMP_MAPPING) {
+			manager.add(new Action("Dump Mapping") {  //$NON-NLS-1$
+				public void  run() {
+					printMapping();
+				}
+			});
+		}
+		
+		if (VpeDebug.VISUAL_CONTEXTMENU_TEST) {
+			manager.add(new VpeAction("Test", node) {  //$NON-NLS-1$
+				public void  run() {
+					test(actionNode);
+				}
+			});
+		}
+	}
+	
+	/**
+	 * Calls when on when browser receive context menu event.
+	 * 
+	 * @param contextFlags -not used in this function, just for becouse this parametr
+	 * 			exist in nsIContextMenuListener
+	 * @param event  event from browser used here
+	 * @param node where this event are occur
+	 */
+	public void onShowContextMenu(long contextFlags, nsIDOMEvent event, nsIDOMNode node) {
+		nsIDOMNode visualNode = VisualDomUtil.getTargetNode(event);
+		
+		if (visualNode != null) {
+			Node selectedSourceNode = null;
+			selectedSourceNode = selectionBuilder.setContextMenuSelection(visualNode);
+			if (selectedSourceNode != null) {
+
+				MenuManager menuManager = new MenuManager("#popup"); //$NON-NLS-1$
+				final Menu contextMenu = menuManager.createContextMenu(visualEditor.getControl());
+				contextMenu.addMenuListener(
+						new MenuListener(){
+							Menu menu = contextMenu;
+							public void menuHidden(MenuEvent e) {
+								Display.getCurrent().asyncExec(
+									new Runnable() {
+										public void run() {
+											menu.dispose();
+										}
+									}
+								);
+							}
+							public void menuShown(MenuEvent e) {
+							}
+						}
+				);
+				createMenuForNode(selectedSourceNode, menuManager, true);
+
+				contextMenu.setVisible(true);
+				
+			}
+		}
+	}
+	
+
+	private VpeAnyData editAnyData(StructuredTextEditor sourceEditor, boolean isCorrectNS, VpeAnyData data) {
+		Shell shell = sourceEditor.getEditorPart().getSite().getShell();
+		if (isCorrectNS) {
+			VpeEditAnyDialog editDialog = new VpeEditAnyDialog(shell, data);
+			editDialog.open();
+		} else {
+			MessageBox message = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
+			message.setMessage(VpeUIMessages.NAMESPACE_NOT_DEFINED);
+			message.open();
+		}
+		return data;
+	}
+
+	// VpeTemplateListener implementation
+	public void templateReloaded() {
+		visualRefresh();
+	}
+	
+	// VpeTaglibListener implementation
+//	public void taglibPrefixChanged(String[] prefixs) {
+//		if (VpeDebug.printSourceMutationEvent) {
+//			String s = ""; //$NON-NLS-1$
+//			for (int i = 0; i < prefixs.length; i++) {
+//				if (i > 0) {
+//					s += ", "; //$NON-NLS-1$
+//				}
+//				s += prefixs[i];
+//			}
+//		}
+//		queryVisualRefresh = true;
+////		visualRefreshImpl();
+//	}
+	
+	public void visualRefresh() {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		visualRefreshImpl();
+//		pageContext.fireTaglibsChanged();
+
+		switcher.stopActiveEditor();
+	}
+	
+	void visualRefreshImpl() {
+		visualEditor.hideResizer();
+		visualBuilder.setSelectionRectangle(null);
+		IDOMModel sourceModel = (IDOMModel)getModel();
+		if (sourceModel != null) {
+			IDOMDocument sourceDocument = sourceModel.getDocument();
+			visualBuilder.rebuildDom(sourceDocument);
+		} else {
+			visualBuilder.rebuildDom(null);
+		}
+	}
+	
+	public void preLongOperation() {
+		switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL);
+	}
+
+	public void postLongOperation() {
+		switcher.stopActiveEditor();
+		visualRefresh();
+	}
+	
+	// for debug
+	private void printSourceEvent(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int pos) {
+		System.out.println(">>> eventType: " + INodeNotifier.EVENT_TYPE_STRINGS[eventType] + "  pos: " + pos + "  notifier: " + ((Node)notifier).getNodeName() + "  hashCode: " + notifier.hashCode()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		if (feature != null) {
+			if (feature instanceof Node) {
+				System.out.println("     feature: " + ((Node)feature).getNodeType() + "  " + ((Node)feature).getNodeName() + "  hashCode: " + feature.hashCode()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			} else {
+				System.out.println("     feature: " + feature); //$NON-NLS-1$
+			}
+		}
+		if (oldValue != null) {
+			if (oldValue instanceof Node) {
+				System.out.println("     oldValue: " + ((Node)oldValue).getNodeName() + "  hashCode: " + oldValue.hashCode()); //$NON-NLS-1$ //$NON-NLS-2$
+			} else {
+				System.out.println("     oldValue: " + oldValue); //$NON-NLS-1$
+			}
+		}
+		if (newValue != null) {
+			if (newValue instanceof Node) {
+				System.out.println("     newValue: " + ((Node)newValue).getNodeName() + "  hashCode: " + newValue.hashCode() + "    " + ((Node)newValue).getNodeType()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			} else {
+				System.out.println("     newValue: " + newValue); //$NON-NLS-1$
+			}
+		}
+	}
+
+	private void printVisualEvent(nsIDOMEvent event) {
+		System.out.print("<<< " + event.getType()); //$NON-NLS-1$
+
+		if (event instanceof nsIDOMMutationEvent) {
+			nsIDOMMutationEvent mutationEvent = (nsIDOMMutationEvent)event;
+
+			System.out.print("  EventPhase: " + mutationEvent.getEventPhase()); //$NON-NLS-1$
+
+			nsIDOMNode relatedNode = mutationEvent.getRelatedNode();
+			System.out.print("  RelatedNode: " + (relatedNode == null ? null : relatedNode.getNodeName())); //$NON-NLS-1$
+			
+			nsIDOMNode targetNode = VisualDomUtil.getTargetNode(mutationEvent);
+			String name = targetNode != null ? targetNode.getNodeName() : null;
+			System.out.print("  TargetNode: " + name + " (" + targetNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+			System.out.print("  PrevValue: " + mutationEvent.getPrevValue().trim()); //$NON-NLS-1$
+			System.out.print("  NewValue: " + mutationEvent.getNewValue().trim()); //$NON-NLS-1$
+		}
+		System.out.println();
+	}
+	
+	private void printMapping() {
+		domMapping.printMapping();
+	}
+	
+	private class ActiveEditorSwitcher {
+		private static final int ACTIVE_EDITOR_CANNOT = 0;
+		private static final int ACTIVE_EDITOR_NONE = 1;
+		private static final int ACTIVE_EDITOR_SOURCE = 2;
+		private static final int ACTIVE_EDITOR_VISUAL = 3;
+		
+		private int type = ACTIVE_EDITOR_CANNOT;
+		
+		private void initActiveEditor() {
+			type = ACTIVE_EDITOR_NONE;
+		}
+		
+		private void destroyActiveEditor() {
+			type = ACTIVE_EDITOR_CANNOT;
+		}
+		
+		private boolean startActiveEditor(int newType) {
+			if (type == ACTIVE_EDITOR_NONE) {
+				if( newType == ACTIVE_EDITOR_SOURCE &&
+						editPart.getVisualMode() == VpeEditorPart.SOURCE_MODE) {
+					return false;
+				}
+				type = newType;
+				return true;
+			} else {
+				return false;
+			}
+		}
+		
+		private void stopActiveEditor() {
+			onRefresh();
+			type = ACTIVE_EDITOR_NONE;
+		}
+	}
+	
+	private void showProperties(Node node){
+		ExtendedProperties p = createExtendedProperties(node);
+		if(p != null) ExtendedPropertiesWizard.run(p);
+	}
+	
+	ExtendedProperties createExtendedProperties(Node node) {
+		try {
+			Class c = ModelFeatureFactory.getInstance().getFeatureClass("org.jboss.tools.jst.jsp.outline.VpeProperties"); //$NON-NLS-1$
+			return (ExtendedProperties)c.getDeclaredConstructor(new Class[]{Node.class}).newInstance(new Object[]{node});
+		} catch (Exception e) {
+			VpePlugin.reportProblem(e);
+			return null;
+		}
+	}
+	
+	
+	private void test(Node node) {
+	}
+
+	void refreshBundleValues() {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		if (bundle != null) {
+			bundle.refresh();
+			if (pageContext != null) {
+				pageContext.refreshBundleValues();
+			}
+		}
+		switcher.stopActiveEditor();
+	}
+
+	void refreshTemplates() {
+		if (includeList.includesRefresh()) {
+			visualRefresh();
+		}
+		if (templateManager != null) {
+			templateManager.reload();
+		}
+		if (bundle != null) {
+			bundle.refresh();
+			if (pageContext != null) {
+				if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+					return;
+				}
+				pageContext.refreshBundleValues();
+				switcher.stopActiveEditor();
+			}
+		}
+	}
+	
+	// implements XModelTreeListener
+  	 public void nodeChanged(XModelTreeEvent event) {
+  	 	visualRefresh();
+   	 }
+   	 
+	 public void structureChanged(XModelTreeEvent event) {
+	 }
+	 
+	 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 == null) {
+				node = getModel().getIndexedRegion(offset - 1);
+			}
+			if (node instanceof Node) {
+				return (Node) node;
+			}
+		}
+		return null;
+	 }
+	 
+	 private int getSourceNodeOffset(Node node, int pos, boolean endFlag) {
+	 	if (node == null) return 0;
+		int start = ((IndexedRegion)node).getStartOffset();
+		int end = ((IndexedRegion)node).getEndOffset();
+		
+		switch (node.getNodeType()) {
+		case Node.ATTRIBUTE_NODE:
+			if (node instanceof AttrImpl) {
+				return getSourceAttributeOffset((AttrImpl)node, pos);
+			}
+		case Node.TEXT_NODE:
+			if (pos < start) {
+				return 0;
+			} else if (pos > end) {
+				return end - start;
+			} else {
+				return pos - start;
+			}
+		case Node.COMMENT_NODE:
+			if (pos > end) {
+				pos = end;
+			}
+			int offset = pos - start - 4;
+			return offset < 0 ? 0 : offset;
+		case Node.ELEMENT_NODE:
+	 		ElementImpl element = (ElementImpl)node;
+	 		if (element.isContainer()) {
+		 		if (pos < element.getStartEndOffset()) {
+		 			return 0;
+		 		} else {
+		 			return 1;
+		 		}
+	 		} else {
+		 		return endFlag ? 1 : 0;
+	 		}
+		default:
+			return endFlag ? 1 : 0;
+		}
+	 }
+	 
+	private int getSourceAttributeOffset(AttrImpl attr, int pos) {
+		if (attr.getValueRegion() != null) {
+			int start = attr.getValueRegionStartOffset();
+			String value = attr.getValueRegionText();
+			int len = value.length();
+			if (pos >= start && pos <= start + len) {
+				int offset = pos - start;
+				if (len > 1 && value.charAt(0) == '"' && value.charAt(len - 1) == '"') {
+					if (offset <= 0 || offset >= len) {
+						return -1;
+					}
+					offset--;
+				}
+				return offset;
+			}
+		}
+		return -1;
+	}
+
+	private int getSourceNodeOffset1(Node node, int pos, boolean endFlag) {
+	 	if (node == null) return 0;
+		int start = ((IndexedRegion)node).getStartOffset();
+		int end = ((IndexedRegion)node).getEndOffset();
+		
+		switch (node.getNodeType()) {
+		case Node.ATTRIBUTE_NODE:
+			if (node instanceof AttrImpl) {
+				AttrImpl attr = (AttrImpl)node; 
+				start = attr.getValueRegionStartOffset();
+				end = start + attr.getValueRegion().getLength();
+				int ret = 0;
+				if (pos > end) {
+					ret = end - start;
+				} else {
+					ret = pos - start;
+				}
+				if (ret > 0 && attr.getValueRegionText().charAt(0) == '"') {
+					ret--;
+				}
+				return ret;
+			}
+		case Node.TEXT_NODE:
+			if (pos < start) {
+				return 0;
+			} else if (pos > end) {
+				return end - start;
+			} else {
+				return pos - start;
+			}
+		case Node.COMMENT_NODE:
+			if (pos > end) {
+				pos = end;
+			}
+			int offset = pos - start - 4;
+			return offset < 0 ? 0 : offset;
+		case Node.ELEMENT_NODE:
+	 		ElementImpl element = (ElementImpl)node;
+	 		if (element.isContainer()) {
+		 		if (pos < element.getStartEndOffset()) {
+		 			return 0;
+		 		} else if (pos < element.getStartEndOffset()) {
+		 			return 1;
+		 		} else if (pos == element.getStartEndOffset()) {
+		 			return 2;
+		 		}
+	 		} else {
+		 		return endFlag ? 1 : 0;
+	 		}
+		default:
+			return endFlag ? 1 : 0;
+		}
+	}
+
+	 private void listenContextMenu(MenuManager manager, IndexedRegion region, int type){
+	 	MenuManager mm = new MyMenuManager("From Palette",true); //$NON-NLS-1$
+	 	manager.add(mm);
+	 	manager.addMenuListener(new VpeMenuListener(mm, region, type));
+	 }
+	 
+	 class VpeMenuListener implements IMenuListener{
+	 	private MenuManager manager;
+	 	private IndexedRegion region;
+	 	private int type;
+	 	private boolean loaded=false;
+	 	
+	 	public VpeMenuListener(MenuManager manager, IndexedRegion region, int type){
+	 		this.manager = manager;
+	 		this.region = region;
+	 		this.type = type;
+	 	}
+		public void menuAboutToShow(IMenuManager m) {
+			if(loaded)return;
+			loaded=true;
+			fillContextMenuFromPalette(manager, region, type);
+			manager.getParent().update(true);
+		}
+	 }
+	 private MenuManager fillContextMenuFromPalette(MenuManager manager, IndexedRegion region, int type){
+		XModelObject model = ModelUtilities.getPreferenceModel().getByPath("%Palette%"); //$NON-NLS-1$
+		
+		XModelObject[] folders = model.getChildren();
+		for(int i=0;i<folders.length;i++){
+			if ("yes".equals(folders[i].getAttributeValue("hidden"))) continue; //$NON-NLS-1$ //$NON-NLS-2$
+			MenuManager mm = new MenuManager(folders[i].getAttributeValue("name")); //$NON-NLS-1$
+			manager.add(mm);
+			fillPaletteFolder(mm, region, folders[i], type);
+		}
+		return manager;
+	 }
+	 
+	 private void fillPaletteFolder(MenuManager menu, IndexedRegion region, XModelObject folder, int type){
+		XModelObject[] groups = folder.getChildren();
+		for(int i=0;i<groups.length;i++){
+			if ("yes".equals(groups[i].getAttributeValue("hidden"))) continue; //$NON-NLS-1$ //$NON-NLS-2$
+			MenuManager mm = new MenuManager(groups[i].getAttributeValue("name")); //$NON-NLS-1$
+			menu.add(mm);
+			fillPaletteGroup(mm, region, groups[i], type);
+		}
+	 }
+	 
+	 private void fillPaletteGroup(MenuManager menu, IndexedRegion region, XModelObject group, int type){
+		XModelObject[] items = group.getChildren();
+		String endText;
+		
+		for(int i=0;i<items.length;i++){
+			if ("yes".equals(items[i].getAttributeValue("hidden"))) continue; //$NON-NLS-1$ //$NON-NLS-2$
+			endText = items[i].getAttributeValue("end text"); //$NON-NLS-1$
+			
+			if(type == AROUND_MENU && (endText == null || "".equals(endText))) continue; //$NON-NLS-1$
+			createInsertAction(menu, region, items[i], type);
+		}
+	 }
+	 
+	 private void createInsertAction(MenuManager menu, IndexedRegion region, XModelObject item, int type){
+		
+
+		XModelObject parent = item.getParent();
+		String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$
+		String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$
+		String tagName = item.getAttributeValue("name"); //$NON-NLS-1$
+		String[] texts = new String[]{"<"+tagName+">"}; //$NON-NLS-1$ //$NON-NLS-2$
+		if(tagName.indexOf("taglib") < 0) //$NON-NLS-1$
+			PaletteInsertHelper.applyPrefix(texts, sourceEditor, tagName, uri, defaultPrefix);
+		tagName = texts[0];
+		
+		menu.add(new InsertAction(tagName, region, item, type));
+	 }
+	 
+	 class InsertAction extends Action{
+	 	private XModelObject item;
+	 	private int type;
+	 	private IndexedRegion region;
+	 	
+	 	public InsertAction(String title, IndexedRegion region, XModelObject item, int type){
+	 		super(title);
+	 		this.item = item;
+	 		this.type = type;
+	 		this.region = region;
+	 	}
+	 	public void run(){
+			try {
+				String tagName = item.getAttributeValue("name"); //$NON-NLS-1$
+				
+				XModelObject parent = item.getParent();
+				String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$
+				String libraryVersion = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_VERSION); //$NON-NLS-1$
+				String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$
+				VpeSelectionProvider selProvider = new VpeSelectionProvider(region);
+
+				String startText = "" + item.getAttributeValue("start text"); //$NON-NLS-1$ //$NON-NLS-2$
+				String endText = "" + item.getAttributeValue("end text"); //$NON-NLS-1$ //$NON-NLS-2$
+				if(type == AROUND_MENU){
+				}else if(type == BEFORE_MENU){
+					selProvider = new VpeSelectionProvider(region.getStartOffset());
+				}else if(type == AFTER_MENU){
+					selProvider = new VpeSelectionProvider(region.getEndOffset());
+				}
+				
+				Properties p = new Properties();
+				p.setProperty("tag name", tagName); //$NON-NLS-1$
+				p.setProperty("start text", startText); //$NON-NLS-1$
+				p.setProperty("end text", endText); //$NON-NLS-1$
+				p.setProperty("automatically reformat tag body", "" + item.getAttributeValue("automatically reformat tag body")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				p.setProperty(URIConstants.LIBRARY_URI, uri);
+				p.setProperty(URIConstants.LIBRARY_VERSION, libraryVersion);
+				String addTaglib = item.getParent().getAttributeValue(TLDToPaletteHelper.ADD_TAGLIB);
+				p.setProperty(URIConstants.DEFAULT_PREFIX, defaultPrefix);
+				p.setProperty(PaletteInsertHelper.PROPOPERTY_ADD_TAGLIB, addTaglib);
+				if(((Node)region).getNodeType() == Node.ELEMENT_NODE)
+					p.put("selectionProvider", selProvider); //$NON-NLS-1$
+				PaletteInsertHelper.insertIntoEditor(sourceEditor.getTextViewer(), p);
+			} catch (Exception e) {
+				VpePlugin.reportProblem(e);
+			}
+			
+	 	}
+	 	
+	 }
+	 
+	 class VpeSelectionProvider implements ISelectionProvider{
+	 	VpeSelection selection;
+	 	
+	 	public VpeSelectionProvider(IndexedRegion region){
+	 		selection = new VpeSelection(region);
+	 	}
+	 	public VpeSelectionProvider(int position){
+	 		selection = new VpeSelection(position);
+	 	}
+	 	public VpeSelectionProvider(int offset, int length){
+	 		selection = new VpeSelection(offset, length);
+	 	}
+	 	
+	 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+		}
+		public ISelection getSelection() {
+			return selection;
+		}
+		public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+
+		}
+		public void setSelection(ISelection selection) {
+		}
+	 }
+	 
+	 class VpeSelection implements ITextSelection{
+	 	String text=""; //$NON-NLS-1$
+	 	int offset, length;
+
+	 	public VpeSelection(int position){
+	 		offset = position;
+	 		length = 0;
+	 	}
+	 	
+	 	public VpeSelection(int offset, int length){
+	 		this.offset = offset;
+	 		this.length = length;
+	 		if (length > 0) {
+		 		try{
+		 			text = sourceEditor.getTextViewer().getDocument().get(offset, length);
+		 		}catch(Exception ex){
+					VpePlugin.reportProblem(ex);
+		 		}
+	 		}
+	 	}
+	 	
+	 	public VpeSelection(IndexedRegion region){
+	 		offset = region.getStartOffset();
+	 		length = region.getEndOffset() - offset;
+	 		try{
+	 			text = sourceEditor.getTextViewer().getDocument().get(offset, length);
+	 		}catch(Exception ex){
+				VpePlugin.reportProblem(ex);
+	 		}
+	 	}
+	 	
+	 	public int getEndLine() {
+			return 0;
+		}
+		public int getLength() {
+			return length;
+		}
+		public int getOffset() {
+			return offset;
+		}
+		public int getStartLine() {
+			return 0;
+		}
+		public String getText() {
+			return text;
+		}
+		public boolean isEmpty() {
+			return false;
+		}
+}
+
+	class VpeAction extends Action{
+		public Node actionNode;
+		public VpeAction(String name, Node node){
+			super(name);
+			this.actionNode = node;
+		}
+	}
+	
+	class VpeTextOperationAction extends Action{
+		private String id;
+		private IndexedRegion region;
+		public VpeTextOperationAction(String name, String id, IndexedRegion region){
+			super(name);
+			this.id = id;
+			this.region = region;
+		}
+		public void run(){
+			sourceEditor.getSelectionProvider().setSelection(new VpeSelection(region));
+			sourceEditor.getAction(id).run();
+		}
+	}
+
+    public void refreshExternalLinks() {
+        pageContext.getVisualBuilder().refreshExternalLinks();
+    }
+
+    public IPath getPath() {
+        if (editPart != null) {
+            IEditorInput input = editPart.getEditorInput();
+            if (input != null && input instanceof IFileEditorInput) {
+                return ((IFileEditorInput)input).getFile().getFullPath();
+            }
+        }
+        return null;
+    }
+
+    public void changed(Object source) {
+    	if(cssReferenceListListener == source) {
+    		pageContext.getVisualBuilder().refreshExternalLinks();
+    	} else if (absoluteFolderReferenceListListener == source ||
+    				relativeFolderReferenceListListener == source ||
+    				taglibReferenceListListener == source) {
+    		visualRefresh();
+    	}
+    }
+    
+	public void dragEnter(nsIDOMEvent event) {
+		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
+			System.out.println("<<<<<<<<<<<<<<<<<<<< DragEnter"); //$NON-NLS-1$
+		}
+	}
+
+	public void dragExit(nsIDOMEvent event) {
+		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
+			System.out.println("<<<<<<<<<<<<<<<<<<<< dragExit"); //$NON-NLS-1$
+		}
+		// TODO Sergey Vasilyev figure out with drag caret
+//		xulRunnerEditor.hideDragCaret();
+	}
+	
+	public void dragOver(nsIDOMEvent event) {
+
+		visualBuilder.getDnd().dragOver(event, this);
+
+	}
+		
+	public void _dragOver(nsIDOMEvent event) {
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_VISUAL)) {
+			return;
+		}
+		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
+			System.out.println("<<<<<<<<<<<<<<<<<<<< dragOver"); //$NON-NLS-1$
+		}
+		
+//		browser.computeDropPosition(event);
+		
+		boolean canDrop = !xulRunnerEditor.isMozillaDragFlavor();
+		if (canDrop) {
+			Clipboard clipboard = new Clipboard(Display.getCurrent());
+			canDrop = clipboard.getContents(ModelTransfer.getInstance()) != null;
+		}
+		if (canDrop) {
+			canDrop = VpeDndUtil.isDropEnabled((IModelObjectEditorInput)sourceEditor.getEditorInput());
+		}
+		if (canDrop) {
+			VpeVisualCaretInfo caretInfo = selectionBuilder.getVisualCaretInfo(event);
+			canDrop = caretInfo.exist();
+			if (canDrop) {
+				caretInfo.showCaret();
+			} else {
+				caretInfo.hideCaret();
+			}
+		}
+		if (!canDrop) {
+			event.stopPropagation();
+			event.preventDefault();
+		}
+		switcher.stopActiveEditor();
+	}
+
+	public void drop(nsIDOMEvent event) {
+		if (VpeDebug.PRINT_VISUAL_DRAGDROP_EVENT) {
+			System.out.println("<<< outerDrop"); //$NON-NLS-1$
+		}
+		event.preventDefault();
+	}
+
+	public boolean canInnerDrag(nsIDOMMouseEvent event) {
+		onHideTooltip();
+
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.print("<<<<<< canInnerDrag"); //$NON-NLS-1$
+		}
+		if (innerDragInfo != null) {
+			innerDragInfo.Release();
+			innerDragInfo = null;
+		}
+		boolean canDrag = false;
+		VpeVisualInnerDragInfo dragInfo = selectionBuilder.getInnerDragInfo(event);
+		if (dragInfo != null) {
+			nsIDOMNode dragNode = dragInfo.getNode();
+			if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+				System.out.print(" dragNode: " + dragNode.getNodeName() + "(" + dragNode + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			}
+			switch (dragNode.getNodeType()) {
+			case nsIDOMNode.ELEMENT_NODE:
+				canDrag = visualBuilder.canInnerDrag((nsIDOMElement)dragNode);
+			case nsIDOMNode.TEXT_NODE:
+				canDrag = visualBuilder.isTextEditable(dragNode);
+			}
+			if (canDrag) {
+				VpeSourceInnerDragInfo sourceInnerDragInfo = visualBuilder.getSourceInnerDragInfo(dragInfo);
+				if (sourceInnerDragInfo.getNode() != null) {
+					innerDragInfo = dragInfo;
+					InnerDragBuffer.object = sourceInnerDragInfo.getNode();
+					Display.getDefault().asyncExec(new Runnable() {
+						public void run() {
+							InnerDragBuffer.object = null;
+						}
+					});
+				} else {
+					canDrag = false;
+				}
+			} 
+			if (!canDrag) {
+				dragInfo.Release();
+			}
+		}
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.println("  canDrag: " + canDrag); //$NON-NLS-1$
+		}
+		return canDrag;
+	}
+	
+	VpeDropWindow dropWindow = null;
+	
+	public MozillaDropInfo canInnerDrop(nsIDOMMouseEvent event) {
+		onHideTooltip();
+
+		if(dropWindow.active) {
+			if(!event.getAltKey()) {
+				dropWindow.close();
+			} else {
+				return null;
+			}
+		}
+		if(event.getAltKey()) {
+			nsIDOMNode visualNode = VisualDomUtil.getTargetNode(event);
+			Node sourceNode = domMapping.getNearSourceNode(visualNode);
+			if(sourceNode != null) {
+				dropWindow.active = true;
+				dropWindow.setEventPosition(event.getScreenX(), event.getScreenY());
+				dropWindow.setInitialTargetNode(sourceNode);
+				dropWindow.open();
+				event.stopPropagation();
+				event.preventDefault();
+				return null;
+			}
+		}
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.print("<<<<<< canInnerDrop"); //$NON-NLS-1$
+		}
+		boolean canDrop = false;;
+		nsIDOMNode caretParent = null;
+		long caretOffset = 0;
+		if (innerDragInfo != null) {
+			VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(event);
+			if (visualDropInfo.getDropContainer() != null) {
+				if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+					System.out.print("  x: " + visualDropInfo.getMouseX() + "  y: " + visualDropInfo.getMouseY() +  //$NON-NLS-1$ //$NON-NLS-2$
+							"  container: " + visualDropInfo.getDropContainer().getNodeName() +  //$NON-NLS-1$
+							"(" + visualDropInfo.getDropContainer() + ")" + //$NON-NLS-1$ //$NON-NLS-2$
+							"  parent: " + visualDropInfo.getDropContainer().getParentNode().getNodeName() + //$NON-NLS-1$
+							"(" + visualDropInfo.getDropContainer().getParentNode() + ")" + //$NON-NLS-1$ //$NON-NLS-2$
+							"  offset: " + visualDropInfo.getDropOffset()); //$NON-NLS-1$
+				}
+				VpeSourceInnerDragInfo sourceInnerDragInfo = visualBuilder.getSourceInnerDragInfo(innerDragInfo);
+				VpeSourceInnerDropInfo sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceInnerDragInfo.getNode(), visualDropInfo, true);
+				canDrop = sourceDropInfo.canDrop();
+				if (canDrop) {
+					VpeVisualInnerDropInfo newVisualDropInfo = visualBuilder.getInnerDropInfo(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
+					if (newVisualDropInfo != null) {
+						visualBuilder.correctVisualDropPosition(newVisualDropInfo, visualDropInfo);
+						caretParent = newVisualDropInfo.getDropContainer();
+						caretOffset = newVisualDropInfo.getDropOffset();
+					}
+				}
+			}
+			visualDropInfo.Release();
+		}
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.println("  canDrop: " + canDrop); //$NON-NLS-1$
+		}
+		return new MozillaDropInfo(canDrop, caretParent, caretOffset);
+	}
+
+	public void innerDrop(nsIDOMMouseEvent event) {
+		onHideTooltip();
+
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.print("<<<<<< innerDrop"); //$NON-NLS-1$
+		}
+		if (innerDragInfo != null) {
+			VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(event);
+			if (visualDropInfo.getDropContainer() != null) {
+				if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+					System.out.print("  container: " + visualDropInfo.getDropContainer().getNodeName() +  //$NON-NLS-1$
+							"(" + visualDropInfo.getDropContainer() + ")" +  //$NON-NLS-1$ //$NON-NLS-2$
+							"  offset: " + visualDropInfo.getDropOffset()); //$NON-NLS-1$
+				}
+
+				VpeSourceInnerDragInfo sourceInnerDragInfo = visualBuilder.getSourceInnerDragInfo(innerDragInfo);
+				VpeSourceInnerDropInfo sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceInnerDragInfo.getNode(), visualDropInfo, true);
+				if(sourceDropInfo.canDrop()){
+					VpeVisualInnerDropInfo newVisualDropInfo = visualBuilder.getInnerDropInfo(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
+					if (newVisualDropInfo != null) {
+						visualBuilder.correctVisualDropPosition(newVisualDropInfo, visualDropInfo);
+						sourceDropInfo.setTop(visualDropInfo.getMouseY());
+						sourceDropInfo.setLeft(visualDropInfo.getMouseX());
+						visualBuilder.innerDrop(sourceInnerDragInfo, sourceDropInfo);
+						if (innerDragInfo != null) {
+							innerDragInfo.Release();
+							innerDragInfo = null;
+						}
+					}
+				}
+			}
+		}
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.println();
+		}
+	}
+
+	public MozillaDropInfo canExternalDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data) {
+		InnerDragBuffer.object = null;
+		onHideTooltip();
+
+		if(dropWindow.active) {
+			if(!mouseEvent.getAltKey()) {
+				dropWindow.close();
+			} else {
+				return new MozillaDropInfo(false, null, 0);
+			}
+		}
+		if(mouseEvent.getAltKey()) {
+			nsIDOMEvent event = (nsIDOMEvent) mouseEvent.queryInterface(nsIDOMEvent.NS_IDOMEVENT_IID);
+			nsIDOMNode visualNode = (nsIDOMNode) event.getTarget().queryInterface(nsIDOMNode.NS_IDOMNODE_IID);
+			Node sourceNode = domMapping.getNearSourceNode(visualNode);
+			if(sourceNode != null) {
+				if(ModelTransfer.MODEL.equals(flavor)){ //$NON-NLS-1$
+//					XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
+//					InnerDragBuffer.object = object;
+				} else {
+					dropWindow.flavor = flavor;
+				}
+				dropWindow.active = true;
+				dropWindow.setEventPosition(mouseEvent.getScreenX(), mouseEvent.getScreenY());
+				dropWindow.setInitialTargetNode(sourceNode);
+				dropWindow.open();
+				mouseEvent.stopPropagation();
+				mouseEvent.preventDefault();
+				return new MozillaDropInfo(false, null, 0);
+			}
+		}
+		boolean canDrop = false;
+		nsIDOMNode caretParent = null;
+		long caretOffset = 0;
+
+		if(MODEL_FLAVOR.equals(flavor)){
+			XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
+			if(object.getFileType() == XModelObject.FILE && !TLDUtil.isTaglib(object)) {
+				IFile f = (IFile)EclipseResourceUtil.getResource(object);
+				canDrop = f != null;
+				VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
+				caretParent = visualDropInfo.getDropContainer();
+				caretOffset = visualDropInfo.getDropOffset();
+			} else {			
+				String tagname = getTagName(object);
+				if(tagname.indexOf("taglib") >= 0) tagname= "taglib"; //$NON-NLS-1$ //$NON-NLS-2$
+				Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
+				VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
+				if (visualDropInfo.getDropContainer() != null) {
+				VpeSourceInnerDropInfo sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceDragNode, visualDropInfo, true);
+					canDrop = sourceDropInfo.canDrop();
+					if (canDrop) {
+						VpeVisualInnerDropInfo newVisualDropInfo = visualBuilder.getInnerDropInfo(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
+						if (newVisualDropInfo != null) {
+							visualBuilder.correctVisualDropPosition(newVisualDropInfo, visualDropInfo);
+							caretParent = newVisualDropInfo.getDropContainer();
+							caretOffset = newVisualDropInfo.getDropOffset();
+						}
+					}
+				}
+				visualDropInfo.Release();
+			}
+		}else if(XulRunnerEditor.TRANS_FLAVOR_kFileMime.equals(flavor) ||
+				XulRunnerEditor.TRANS_FLAVOR_kURLMime.equals(flavor)) {
+			VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
+			caretParent = visualDropInfo.getDropContainer();
+			caretOffset = visualDropInfo.getDropOffset();
+			try {
+				canDrop = true;
+			} catch (Exception ex) {
+				VpePlugin.reportProblem(ex);
+			}
+		}
+		if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+			System.out.println("  canDrop: " + canDrop + (canDrop ? "  container: " + caretParent.getNodeName() + "  offset: " + caretOffset : "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		}
+		return new MozillaDropInfo(canDrop, caretParent, caretOffset);
+		
+	}
+
+	public VpeSourceInnerDropInfo canExternalDropMacro(XModelObject object, Node parentNode, int offset) {
+		String tagname = getTagName(object);
+		Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
+		return visualBuilder.getSourceInnerDropInfo(sourceDragNode, parentNode, offset, false);
+	}
+
+	public void externalDropAny(final String flavor, final String data, final Point range, Node container) {
+		if(flavor == null || flavor.length() == 0) return;
+		IDropCommand dropCommand = DropCommandFactory.getInstance().getDropCommand(flavor, JSPTagProposalFactory.getInstance());
+
+		boolean promptAttributes = "yes".equals(VpePreference.ALWAYS_REQUEST_FOR_ATTRIBUTE.getValue());
+		dropCommand.getDefaultModel().setPromptForTagAttributesRequired(promptAttributes);
+
+		dropCommand.execute(
+			new DropData(
+				flavor,
+				data,
+				sourceEditor.getEditorInput(),
+				(ISourceViewer)sourceEditor.getAdapter(ISourceViewer.class), 
+				new VpeSelectionProvider(range.x,range.y),
+				container
+			)
+		);		
+	}
+
+	private String getTagName(XModelObject object) {
+		String tagname = object.getAttributeValue("name"); //$NON-NLS-1$
+
+		XModelObject parent = object.getParent();
+		String uri = (parent == null) ? "" : parent.getAttributeValue(URIConstants.LIBRARY_URI); //$NON-NLS-1$
+		String defaultPrefix = (parent == null) ? "" : parent.getAttributeValue(URIConstants.DEFAULT_PREFIX); //$NON-NLS-1$
+		
+		String[] texts = new String[]{"<"+tagname+">"}; //$NON-NLS-1$ //$NON-NLS-2$
+		PaletteInsertHelper.applyPrefix(texts, sourceEditor, tagname, uri, defaultPrefix);
+		tagname = texts[0].substring(1,texts[0].length()-1);
+		
+		return tagname;
+	}
+
+	public void externalDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data) {
+		onHideTooltip();
+
+		VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
+		Point range = selectionBuilder.getSourceSelectionRangeAtVisualNode(visualDropInfo.getDropContainer(), (int)visualDropInfo.getDropOffset());
+		VpeSourceInnerDropInfo sourceDropInfo = null;
+		
+		if(MODEL_FLAVOR.equals(flavor)){
+			XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
+			if(object.getFileType() == XModelObject.FILE && !TLDUtil.isTaglib(object)) {
+				flavor = "application/x-moz-file"; //$NON-NLS-1$
+				IFile f = (IFile)EclipseResourceUtil.getResource(object);
+				try {
+					data = f.getLocation().toFile().toURL().toString();
+				} catch (Exception e) {
+					VpePlugin.getPluginLog().logError(e);
+				}
+			} else {			
+				String tagname = getTagName(object);
+				if(tagname.indexOf("taglib") >= 0) tagname= "taglib"; //$NON-NLS-1$ //$NON-NLS-2$
+				Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
+				if (visualDropInfo.getDropContainer() != null) {
+					sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceDragNode, visualDropInfo, true);
+					range = selectionBuilder.getSourceSelectionRange(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
+				}
+			}
+		}
+		
+		if (visualDropInfo.getDropContainer() != null) {
+			if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+				System.out.println("  drop!  container: " + visualDropInfo.getDropContainer().getNodeName()); //$NON-NLS-1$
+			}
+			externalDropAny(flavor, data, range, sourceDropInfo == null?null:sourceDropInfo.getContainer());
+		}
+	}
+	
+	public void onShowTooltip(int x, int y, final String text) {
+		
+		if (tip != null && !tip.isDisposed()) tip.dispose();
+		
+		Display display = visualEditor.getControl().getDisplay();
+		Shell parent = visualEditor.getControl().getShell();
+		
+		tip = new Shell(parent, SWT.NO_FOCUS| SWT.ON_TOP);
+		Color bckgColor = new Color(tip.getDisplay(), 255, 250, 236);
+		tip.setBackground(bckgColor);					
+		
+		Composite composite = tip;
+		GridLayout layout= new GridLayout();		
+		layout.numColumns = 2;
+		layout.marginHeight= 0;
+		layout.marginWidth= 0;
+		layout.verticalSpacing= 0;
+		layout.horizontalSpacing= 0;	
+		composite.setLayout(layout);
+		GridData gd= new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(gd);
+		
+		
+		final StyledText tipControlHeaderText = new StyledText(composite,  SWT.MULTI | SWT.READ_ONLY);
+				
+		tipControlHeaderText.setForeground(bckgColor);
+		tipControlHeaderText.setBackground(bckgColor);
+			
+		String formatText = text.trim();
+		
+		/** attributeString string containing the pairs attribute and it's value as one string*/	
+		String[] attributeString = formatText.split("\n"); //$NON-NLS-1$
+		/** buffer string containing the attribute and the value in the different succeding string*/
+		String[] buffer = attributeString[0].split(" "); //$NON-NLS-1$
+		
+		tipControlHeaderText.setText(buffer[0].toString());
+				
+		tipControlHeaderText.addLineStyleListener(
+			new LineStyleListener() {
+				public void lineGetStyle(LineStyleEvent event){
+					Color color = new Color(tipControlHeaderText.getDisplay(), 201, 51, 40);
+					if (event.lineOffset == 0) {			
+						StyleRange st = new StyleRange();
+						st.fontStyle = SWT.BOLD;
+						st.foreground = color;
+						event.styles = new StyleRange[]{st};
+						st.start = event.lineOffset;
+						st.length = event.lineText.length();						
+					}
+				}
+			}
+		);
+		
+		GridData gridData = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
+		gridData.horizontalAlignment = GridData.FILL; 
+		gridData.horizontalSpan = 2;
+		tipControlHeaderText.setLayoutData(gridData);
+		
+		StringBuffer tempAttr = new StringBuffer();
+		StringBuffer tempValue = new StringBuffer();
+		
+		if (attributeString.length >= 2) {
+			for (int i = 1; i < attributeString.length; i++) {
+				buffer = attributeString[i].split(" ", 2); //$NON-NLS-1$
+				if (i == 1) {
+					tempAttr.append(buffer[0] + " "); //$NON-NLS-1$
+					tempValue.append((buffer.length>=2?buffer[1]:"") + " "); //$NON-NLS-1$ //$NON-NLS-2$
+				} else {
+					tempAttr.append("\n" + buffer[0] + " "); //$NON-NLS-1$ //$NON-NLS-2$
+					tempValue.append(" \n" + (buffer.length>=2?buffer[1]:"") + " "); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				}
+			}
+	
+			final StyledText tipControlAttributeText = new StyledText(composite,
+					SWT.MULTI | SWT.READ_ONLY);
+			
+			tipControlAttributeText.setForeground(bckgColor);
+			tipControlAttributeText.setBackground(bckgColor);
+	
+			tipControlAttributeText.setText(tempAttr.toString());
+			tipControlAttributeText
+					.addLineStyleListener(new LineStyleListener() {
+						public void lineGetStyle(LineStyleEvent event) {
+							Color color = new Color(tipControlHeaderText
+									.getDisplay(), 42, 148, 0);
+							StyleRange st = new StyleRange();
+							st.start = event.lineOffset;
+							st.length = event.lineText.length();
+							st.foreground = color;
+							st.fontStyle = SWT.NORMAL;
+							event.styles = new StyleRange[] { st };
+						}
+					});
+			GridData gridData1 = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
+			gridData1.horizontalAlignment = GridData.FILL;	
+			tipControlAttributeText.setLayoutData(gridData1);
+	
+			final StyledText tipControlValueText = new StyledText(composite,
+					SWT.MULTI | SWT.READ_ONLY);
+		
+			tipControlValueText.setBackground(bckgColor);
+	
+			tipControlValueText.setText(tempValue.toString());
+	
+			
+			
+			GridData gridData2 = new GridData(GridData.BEGINNING | GridData.FILL_BOTH);
+			gridData2.horizontalAlignment = GridData.FILL;
+			tipControlValueText.setLayoutData(gridData2);
+		}
+		/*
+		* Bug in Mozilla embedded API.  Tooltip coordinates are wrong for 
+		* elements inside an inline frame (IFrame tag).  The workaround is 
+		* to position the tooltip based on the mouse cursor location.
+		*/
+		Point point = display.getCursorLocation();
+		/* Assuming cursor is 21x21 because this is the size of
+		 * the arrow cursor on Windows
+		 */ 
+		point.y += 21;
+		tip.setLocation(point);
+		tip.pack();
+		tip.setVisible(true);
+	}
+	
+	public void onHideTooltip() {
+		if (tip != null && !tip.isDisposed()) tip.dispose();
+		tip = null;
+	}
+	
+	public VpePageContext getPageContext() {
+		
+		return pageContext;
+	}
+
+	public StructuredTextEditor getSourceEditor() {
+		return sourceEditor;
+	}
+
+	public FormatControllerManager getToolbarFormatControllerManager() {
+		return toolbarFormatControllerManager;
+	}
+
+	public void setToolbarFormatControllerManager(FormatControllerManager formatControllerManager) {
+		toolbarFormatControllerManager = formatControllerManager;
+	}
+	public void setSelectionBarController(SelectionBar selectionBar) {
+		this.selectionBar = selectionBar;
+	}
+
+	public IStructuredModel getModel() {
+		return sourceEditor.getModel();
+	}
+
+	public VpeDomMapping getDomMapping() {
+		return domMapping;
+	}
+	
+	public VpeIncludeList getIncludeList(){
+		try {
+			if(includeList == null)
+				throw new Exception("includeList - NULL!!!"); //$NON-NLS-1$
+		} catch (Exception e) {
+			VpePlugin.getPluginLog().logError(e);
+		}
+		return includeList;
+	}
+
+	public void selectionChanged(SelectionChangedEvent event) {
+		if (editPart.getVisualMode() != VpeEditorPart.SOURCE_MODE) {
+			if(toolbarFormatControllerManager != null) toolbarFormatControllerManager.selectionChanged();
+		}
+
+		if(selectionBar != null) selectionBar.selectionChanged();
+		
+		if (!switcher.startActiveEditor(ActiveEditorSwitcher.ACTIVE_EDITOR_SOURCE)) {
+			return;
+		}
+		if (VpeDebug.PRINT_SOURCE_SELECTION_EVENT) {
+			System.out.println(">>>>>>>>>>>>>> selectionChanged  " + event.getSource()); //$NON-NLS-1$
+		}
+		sourceSelectionChanged();
+		switcher.stopActiveEditor();
+	}
+
+	// nsIClipboardDragDropHooks implementation
+	public void onPasteOrDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data) {
+		onHideTooltip();
+
+		VpeVisualInnerDropInfo visualDropInfo = selectionBuilder.getInnerDropInfo(mouseEvent);
+		Point range = selectionBuilder.getSourceSelectionRangeAtVisualNode(visualDropInfo.getDropContainer(), (int)visualDropInfo.getDropOffset());
+		VpeSourceInnerDropInfo sourceDropInfo = null;
+
+		XModelObject object = PreferenceModelUtilities.getPreferenceModel().getModelBuffer().source();
+
+		String tagname = getTagName(object);
+		if(tagname.indexOf("taglib") >= 0) tagname= "taglib"; //$NON-NLS-1$ //$NON-NLS-2$
+		Node sourceDragNode = ((Document)getModel().getAdapter(Document.class)).createElement(tagname);
+		if (visualDropInfo.getDropContainer() != null) {
+			sourceDropInfo = visualBuilder.getSourceInnerDropInfo(sourceDragNode, visualDropInfo, true);
+			range = selectionBuilder.getSourceSelectionRange(sourceDropInfo.getContainer(), sourceDropInfo.getOffset());
+		}
+		
+		if (visualDropInfo.getDropContainer() != null) {
+			if (VpeDebug.PRINT_VISUAL_INNER_DRAGDROP_EVENT) {
+				System.out.println("  drop!  container: " + visualDropInfo.getDropContainer().getNodeName()); //$NON-NLS-1$
+			}
+			final String finalFlavor = flavor;
+			final String finalData = data;
+			final Point finalRange = range;
+			final Node finalDropContainer = sourceDropInfo == null ? null : sourceDropInfo.getContainer();
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					externalDropAny(finalFlavor, finalData, finalRange, finalDropContainer);
+				}
+			});
+		}
+	}
+
+	public void drop(Node node, Node parentNode, int offset) {
+		visualBuilder.innerDrop(node, parentNode, offset);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.mozilla.interfaces.nsISupports#queryInterface(java.lang.String)
+	 */
+	public nsISupports queryInterface(String arg0) {
+		return Mozilla.getInstance().queryInterface(this, arg0);
+	}
+	/**
+	 * Calls when editor content should be refreshed
+	 */
+	public void onRefresh() {
+		//when we using separate thread to display selection rectangle 
+		//it's working better than without
+		/*
+		 * HACK 
+		 * We need wait some time while standart event will be handled
+		 * and in process event handles some components are repainted(like buttons)
+		 * and flasher are not repainted, so we should paint flasher
+		 */
+
+		
+			Display.getDefault().asyncExec(new Thread(){
+				public void run(){
+					
+					getXulRunnerEditor().showSelectionRectangle();
+				}
+			});
+		
+	}
+
+	/**
+	 * @return the xulRunnerEditor
+	 */
+	public XulRunnerEditor getXulRunnerEditor() {
+		return xulRunnerEditor;
+	}
+
+	/**
+	 * @param xulRunnerEditor the xulRunnerEditor to set
+	 */
+	public void setXulRunnerEditor(XulRunnerEditor xulRunnerEditor) {
+		this.xulRunnerEditor = xulRunnerEditor;
+	}
+	
+	/**
+	 * Start drag session
+	 */
+	public void startDragSession(nsIDOMEvent domEvent) {
+		
+		visualBuilder.getDnd().startDragSession(domEvent);
+	}
+
+	public void dragDrop(nsIDOMEvent domEvent) {
+		
+		visualBuilder.getDnd().dragDrop(domEvent,this);
+	}
+
+	/**
+	 * @return the selectionBuilder
+	 */
+	public VpeSelectionBuilder getSelectionBuilder() {
+		return selectionBuilder;
+	}
+
+	/**
+	 * @param selectionBuilder the selectionBuilder to set
+	 */
+	public void setSelectionBuilder(VpeSelectionBuilder selectionBuilder) {
+		this.selectionBuilder = selectionBuilder;
+	}
+
+}

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpePreviewDomBuilder.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpePreviewDomBuilder.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpePreviewDomBuilder.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -68,9 +68,8 @@
 		boolean registerFlag = isCurrentMainDocument();
 		switch (sourceNode.getNodeType()) {
 		case Node.ELEMENT_NODE:
-			Map xmlnsMap = createXmlns((Element)sourceNode);
+//			Map xmlnsMap = createXmlns((Element)sourceNode);
 			Set ifDependencySet = new HashSet();
-			getPageContext().setCurrentVisualNode(visualOldContainer);
 			VpeTemplate template = templateManager.getTemplate(getPageContext(), (Element)sourceNode, ifDependencySet);
 			VpeCreationData creationData;
 			
@@ -88,7 +87,6 @@
 				creationData = defTemplate.create(getPageContext(), sourceNode, getVisualDocument());
 			}
 			
-			getPageContext().setCurrentVisualNode(null);
 			nsIDOMElement visualNewElement;
 			visualNewElement = (nsIDOMElement)creationData.getNode();
 			setTooltip((Element)sourceNode, visualNewElement);
@@ -105,9 +103,7 @@
 					addChildren(template, sourceNode, visualOldContainer, childrenInfoList);
 				}
 			}
-			getPageContext().setCurrentVisualNode(visualOldContainer);
 			template.validate(getPageContext(), (Element)sourceNode, getVisualDocument(), creationData);
-			getPageContext().setCurrentVisualNode(null);
 			return visualNewElement;
 		case Node.TEXT_NODE:
 			return createTextNode(sourceNode, registerFlag);

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-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeVisualDomBuilder.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -1,867 +1,869 @@
-/*******************************************************************************
- * Copyright (c) 2007 Exadel, Inc. and 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:
- *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
- ******************************************************************************/
-package org.jboss.tools.vpe.editor;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
+/*******************************************************************************
+ * Copyright (c) 2007 Exadel, Inc. and 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:
+ *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.vpe.editor;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-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.jboss.tools.common.model.XModel;
-import org.jboss.tools.common.model.XModelObject;
-import org.jboss.tools.common.model.project.IModelNature;
-import org.jboss.tools.common.model.util.EclipseResourceUtil;
-import org.jboss.tools.jst.jsp.preferences.VpePreference;
-import org.jboss.tools.jst.web.model.helpers.WebAppHelper;
-import org.jboss.tools.vpe.VpeDebug;
-import org.jboss.tools.vpe.VpePlugin;
-import org.jboss.tools.vpe.dnd.VpeDnD;
-import org.jboss.tools.vpe.editor.bundle.BundleMap;
-import org.jboss.tools.vpe.editor.context.VpePageContext;
-import org.jboss.tools.vpe.editor.css.CSSReferenceList;
-import org.jboss.tools.vpe.editor.css.ResourceReference;
-import org.jboss.tools.vpe.editor.mapping.VpeDomMapping;
-import org.jboss.tools.vpe.editor.mapping.VpeElementMapping;
-import org.jboss.tools.vpe.editor.mapping.VpeNodeMapping;
-import org.jboss.tools.vpe.editor.mozilla.MozillaEditor;
-import org.jboss.tools.vpe.editor.template.VpeChildrenInfo;
-import org.jboss.tools.vpe.editor.template.VpeCreationData;
+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.jboss.tools.common.model.XModel;
+import org.jboss.tools.common.model.XModelObject;
+import org.jboss.tools.common.model.project.IModelNature;
+import org.jboss.tools.common.model.util.EclipseResourceUtil;
+import org.jboss.tools.jst.jsp.preferences.VpePreference;
+import org.jboss.tools.jst.web.model.helpers.WebAppHelper;
+import org.jboss.tools.vpe.VpeDebug;
+import org.jboss.tools.vpe.VpePlugin;
+import org.jboss.tools.vpe.dnd.VpeDnD;
+import org.jboss.tools.vpe.editor.bundle.BundleMap;
+import org.jboss.tools.vpe.editor.context.VpePageContext;
+import org.jboss.tools.vpe.editor.css.CSSReferenceList;
+import org.jboss.tools.vpe.editor.css.ResourceReference;
+import org.jboss.tools.vpe.editor.mapping.VpeDomMapping;
+import org.jboss.tools.vpe.editor.mapping.VpeElementMapping;
+import org.jboss.tools.vpe.editor.mapping.VpeNodeMapping;
+import org.jboss.tools.vpe.editor.mozilla.MozillaEditor;
+import org.jboss.tools.vpe.editor.template.VpeChildrenInfo;
+import org.jboss.tools.vpe.editor.template.VpeCreationData;
 import org.jboss.tools.vpe.editor.template.VpeCreatorUtil;
-import org.jboss.tools.vpe.editor.template.VpeDefaultPseudoContentCreator;
-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.VpeToggableTemplate;
-import org.jboss.tools.vpe.editor.template.dnd.VpeDnd;
-import org.jboss.tools.vpe.editor.util.HTML;
-import org.jboss.tools.vpe.editor.util.TextUtil;
-import org.jboss.tools.vpe.editor.util.VisualDomUtil;
-import org.jboss.tools.vpe.editor.util.VpeStyleUtil;
-import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
-import org.jboss.tools.vpe.xulrunner.editor.XulRunnerVpeUtils;
-import org.mozilla.interfaces.nsIDOMAttr;
-import org.mozilla.interfaces.nsIDOMDocument;
-import org.mozilla.interfaces.nsIDOMElement;
-import org.mozilla.interfaces.nsIDOMHTMLInputElement;
-import org.mozilla.interfaces.nsIDOMMouseEvent;
-import org.mozilla.interfaces.nsIDOMNode;
-import org.mozilla.interfaces.nsIDOMNodeList;
-import org.mozilla.interfaces.nsIDOMRange;
-import org.mozilla.interfaces.nsIDOMText;
-import org.mozilla.xpcom.XPCOMException;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import org.jboss.tools.vpe.editor.template.VpeDefaultPseudoContentCreator;
+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.VpeToggableTemplate;
+import org.jboss.tools.vpe.editor.template.dnd.VpeDnd;
+import org.jboss.tools.vpe.editor.util.HTML;
+import org.jboss.tools.vpe.editor.util.TextUtil;
+import org.jboss.tools.vpe.editor.util.VisualDomUtil;
+import org.jboss.tools.vpe.editor.util.VpeStyleUtil;
+import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
+import org.jboss.tools.vpe.xulrunner.editor.XulRunnerVpeUtils;
+import org.mozilla.interfaces.nsIDOMAttr;
+import org.mozilla.interfaces.nsIDOMDocument;
+import org.mozilla.interfaces.nsIDOMElement;
+import org.mozilla.interfaces.nsIDOMHTMLInputElement;
+import org.mozilla.interfaces.nsIDOMMouseEvent;
+import org.mozilla.interfaces.nsIDOMNode;
+import org.mozilla.interfaces.nsIDOMNodeList;
+import org.mozilla.interfaces.nsIDOMRange;
+import org.mozilla.interfaces.nsIDOMText;
+import org.mozilla.xpcom.XPCOMException;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+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 */
-    private static final Pattern REGEX_EL = Pattern.compile(
-	    "[\\$|\\#]\\{.*\\}", Pattern.MULTILINE + Pattern.DOTALL);
-
-    private static final String PSEUDO_ELEMENT = "br";
-    private static final String PSEUDO_ELEMENT_ATTR = "vpe:pseudo-element";
-    private static final String INIT_ELEMENT_ATTR = "vpe:init-element";
-    private static final String MOZ_ANONCLASS_ATTR = "_MOZ_ANONCLASS";
-    private static final String COMMENT_STYLE = "font-style:italic; color:green";
-    private static final String COMMENT_PREFIX = "";
-    private static final String COMMENT_SUFFIX = "";
-    private static final String INCLUDE_ELEMENT_ATTR = "vpe:include-element";
-    private static final int DRAG_AREA_WIDTH = 10;
-    private static final int DRAG_AREA_HEIGHT = 10;
-    private static final String ATTR_XMLNS = "xmlns";
-    private static final String ATTR_DRAG_AVAILABLE_CLASS = "__drag__available_style";
-
-    private MozillaEditor visualEditor;
-    private XulRunnerEditor xulRunnerEditor;
-    private nsIDOMDocument visualDocument;
-    private nsIDOMElement visualContentArea;
-    private VpePageContext pageContext;
-    private VpeDnD dnd;
-    private nsIDOMNode headNode;
-    private List includeStack;
-    boolean rebuildFlag = false;
-
-    /** faceletFile */
-    private boolean faceletFile = false;
-
-    private static final String ATTR_VPE = "vpe";
-    private static final String ATTR_VPE_INLINE_LINK_VALUE = "inlinelink";
-
-    private static final String ATTR_REL_STYLESHEET_VALUE = "stylesheet";
-
-    private static final String YES_STRING = "yes";
-    private static final String NO_STRING = "no";
-    private static final String ZERO_STRING = "0";
-    private static final String EMPTY_STRING = "";
-
-    private static final String ATRIBUTE_BORDER = "border";
-    private static final String ATRIBUTE_CELLSPACING = "cellspacing";
-    private static final String ATRIBUTE_CELLPADDING = "cellpadding";
-
-    private static final String DOTTED_BORDER_STYLE = "border : 1px dotted #808080";
-    private static final String DOTTED_BORDER_STYLE_FOR_IMG = "1px dotted #808080";
-    private static final String DOTTED_BORDER_STYLE_FOR_TD = "border-left : 1px dotted #808080; border-right : 1px dotted #808080; border-top : 1px dotted #808080; border-bottom : 0px; color:#0051DD; background-color:#ECF3FF; padding-left: 3px;  padding-right: 3px;  line-height : 10px; font-family : arial; font-size : 10px; text-align:top; margin : 1px; -moz-user-modify : read-only";
-    private static final String DOTTED_BORDER_STYLE_FOR_SPAN = "border : 1px solid #0051DD; color:#0051DD; background-color:#ECF3FF; padding-left: 3px;  padding-right: 3px;  line-height : 10px; font-family : arial; font-size : 10px; text-align:top; margin : 1px; -moz-user-modify : read-only";
-
-    static private HashSet<String> unborderedSourceNodes = new HashSet<String>();
-    static {
-	unborderedSourceNodes.add(HTML.TAG_HTML);
-	unborderedSourceNodes.add(HTML.TAG_HEAD);
-	unborderedSourceNodes.add(HTML.TAG_BODY);
-    }
-
-    static private HashSet<String> unborderedVisualNodes = new HashSet<String>();
-    static {
-	unborderedVisualNodes.add(HTML.TAG_TBODY);
-	unborderedVisualNodes.add(HTML.TAG_THEAD);
-	unborderedVisualNodes.add(HTML.TAG_TR);
-	unborderedVisualNodes.add(HTML.TAG_TD);
-	unborderedVisualNodes.add(HTML.TAG_COL);
-	unborderedVisualNodes.add(HTML.TAG_COLS);
-	unborderedVisualNodes.add(HTML.TAG_COLGROUP);
-	unborderedVisualNodes.add(HTML.TAG_LI);
-	unborderedVisualNodes.add(HTML.TAG_BR);
-    }
-    private VpeDnd dropper;
+public class VpeVisualDomBuilder extends VpeDomBuilder {
+    /** REGEX_EL */
+    private static final Pattern REGEX_EL = Pattern.compile(
+	    "[\\$|\\#]\\{.*\\}", Pattern.MULTILINE + Pattern.DOTALL);
+
+    private static final String PSEUDO_ELEMENT = "br";
+    private static final String PSEUDO_ELEMENT_ATTR = "vpe:pseudo-element";
+    private static final String INIT_ELEMENT_ATTR = "vpe:init-element";
+    private static final String MOZ_ANONCLASS_ATTR = "_MOZ_ANONCLASS";
+    private static final String COMMENT_STYLE = "font-style:italic; color:green";
+    private static final String COMMENT_PREFIX = "";
+    private static final String COMMENT_SUFFIX = "";
+    private static final String INCLUDE_ELEMENT_ATTR = "vpe:include-element";
+    private static final int DRAG_AREA_WIDTH = 10;
+    private static final int DRAG_AREA_HEIGHT = 10;
+    private static final String ATTR_XMLNS = "xmlns";
+    private static final String ATTR_DRAG_AVAILABLE_CLASS = "__drag__available_style";
+
+    private MozillaEditor visualEditor;
+    private XulRunnerEditor xulRunnerEditor;
+    private nsIDOMDocument visualDocument;
+    private nsIDOMElement visualContentArea;
+    private VpePageContext pageContext;
+    private VpeDnD dnd;
+    private nsIDOMNode headNode;
+    private List includeStack;
+    boolean rebuildFlag = false;
+
+    /** faceletFile */
+    private boolean faceletFile = false;
+
+    private static final String ATTR_VPE = "vpe";
+    private static final String ATTR_VPE_INLINE_LINK_VALUE = "inlinelink";
+
+    private static final String ATTR_REL_STYLESHEET_VALUE = "stylesheet";
+
+    private static final String YES_STRING = "yes";
+    private static final String NO_STRING = "no";
+    private static final String ZERO_STRING = "0";
+    private static final String EMPTY_STRING = "";
+
+    private static final String ATRIBUTE_BORDER = "border";
+    private static final String ATRIBUTE_CELLSPACING = "cellspacing";
+    private static final String ATRIBUTE_CELLPADDING = "cellpadding";
+
+    private static final String DOTTED_BORDER_STYLE = "border : 1px dotted #808080";
+    private static final String DOTTED_BORDER_STYLE_FOR_IMG = "1px dotted #808080";
+    private static final String DOTTED_BORDER_STYLE_FOR_TD = "border-left : 1px dotted #808080; border-right : 1px dotted #808080; border-top : 1px dotted #808080; border-bottom : 0px; color:#0051DD; background-color:#ECF3FF; padding-left: 3px;  padding-right: 3px;  line-height : 10px; font-family : arial; font-size : 10px; text-align:top; margin : 1px; -moz-user-modify : read-only";
+    private static final String DOTTED_BORDER_STYLE_FOR_SPAN = "border : 1px solid #0051DD; color:#0051DD; background-color:#ECF3FF; padding-left: 3px;  padding-right: 3px;  line-height : 10px; font-family : arial; font-size : 10px; text-align:top; margin : 1px; -moz-user-modify : read-only";
+
+    static private HashSet<String> unborderedSourceNodes = new HashSet<String>();
+    static {
+	unborderedSourceNodes.add(HTML.TAG_HTML);
+	unborderedSourceNodes.add(HTML.TAG_HEAD);
+	unborderedSourceNodes.add(HTML.TAG_BODY);
+    }
+
+    static private HashSet<String> unborderedVisualNodes = new HashSet<String>();
+    static {
+	unborderedVisualNodes.add(HTML.TAG_TBODY);
+	unborderedVisualNodes.add(HTML.TAG_THEAD);
+	unborderedVisualNodes.add(HTML.TAG_TR);
+	unborderedVisualNodes.add(HTML.TAG_TD);
+	unborderedVisualNodes.add(HTML.TAG_COL);
+	unborderedVisualNodes.add(HTML.TAG_COLS);
+	unborderedVisualNodes.add(HTML.TAG_COLGROUP);
+	unborderedVisualNodes.add(HTML.TAG_LI);
+	unborderedVisualNodes.add(HTML.TAG_BR);
+    }
+    private VpeDnd dropper;
     
     private Map<IFile,Document> includeDocuments = new HashMap<IFile, Document>();
-
-    public VpeVisualDomBuilder(VpeDomMapping domMapping,
-	    INodeAdapter sorceAdapter, VpeTemplateManager templateManager,
-	    MozillaEditor visualEditor, VpePageContext pageContext) {
-	super(domMapping, sorceAdapter, templateManager);
-	this.visualEditor = visualEditor;
-	xulRunnerEditor = visualEditor.getXulRunnerEditor();
-	this.visualDocument = visualEditor.getDomDocument();
-	this.visualContentArea = visualEditor.getContentArea();
-	this.dnd = new VpeDnD();
-	this.pageContext = pageContext;
-	this.headNode = visualEditor.getHeadNode();
-	dropper = new VpeDnd();
-	dropper.setDndData(false, true);
-
-	if (isFacelet()) {
-	    faceletFile = true;
-	} else {
-	    faceletFile = false;
-	}
-
-    }
-
-    public void buildDom(Document sourceDocument) {
+
+    public VpeVisualDomBuilder(VpeDomMapping domMapping,
+	    INodeAdapter sorceAdapter, VpeTemplateManager templateManager,
+	    MozillaEditor visualEditor, VpePageContext pageContext) {
+	super(domMapping, sorceAdapter, templateManager);
+	this.visualEditor = visualEditor;
+	xulRunnerEditor = visualEditor.getXulRunnerEditor();
+	this.visualDocument = visualEditor.getDomDocument();
+	this.visualContentArea = visualEditor.getContentArea();
+	this.dnd = new VpeDnD();
+	this.pageContext = pageContext;
+	this.headNode = visualEditor.getHeadNode();
+	dropper = new VpeDnd();
+	dropper.setDndData(false, true);
+
+	if (isFacelet()) {
+	    faceletFile = true;
+	} else {
+	    faceletFile = false;
+	}
+
+    }
+
+    public void buildDom(Document sourceDocument) {
 		VpeSourceDomBuilder sourceBuilder = pageContext.getSourceBuilder();
 		IDocument document = sourceBuilder.getStructuredTextViewer()
 				.getDocument();
 		if (document == null)
 			return;
-		includeStack = new ArrayList();
-		IEditorInput input = pageContext.getEditPart().getEditorInput();
-		if (input instanceof IFileEditorInput) {
-			IFile file = ((IFileEditorInput) input).getFile();
-			if (file != null) {
-				includeStack.add(new VpeIncludeInfo(null, file, pageContext
-						.getSourceBuilder().getSourceDocument()));
-			}
-		}
-		pageContext.refreshConnector();
-		pageContext.installIncludeElements();
-		addChildren(null, sourceDocument, visualContentArea);
-		registerNodes(new VpeNodeMapping(sourceDocument, visualContentArea));
-	}
-
-    public void rebuildDom(Document sourceDocument) {
+	includeStack = new ArrayList();
+	IEditorInput input = pageContext.getEditPart().getEditorInput();
+	if (input instanceof IFileEditorInput) {
+	    IFile file = ((IFileEditorInput) input).getFile();
+	    if (file != null) {
+		includeStack.add(new VpeIncludeInfo(null, file, pageContext
+			.getSourceBuilder().getSourceDocument()));
+	    }
+	}
+	pageContext.refreshConnector();
+	pageContext.installIncludeElements();
+	addChildren(null, sourceDocument, visualContentArea);
+	registerNodes(new VpeNodeMapping(sourceDocument, visualContentArea));
+    }
+
+    public void rebuildDom(Document sourceDocument) {
     	//clearIncludeDocuments();
-		cleanHead();
-		domMapping.clear(visualContentArea);
+	cleanHead();
+	domMapping.clear(visualContentArea);
 		super.dispose();
 
-		pageContext.clearAll();
-		refreshExternalLinks();
-		pageContext.getBundle().refreshRegisteredBundles();
-		nsIDOMNodeList children = visualContentArea.getChildNodes();
-		long len = children.getLength();
-		for (long i = len - 1; i >= 0; i--) {
-			visualContentArea.removeChild(children.item(i));
-		}
-
-		if (sourceDocument != null) {
-			buildDom(sourceDocument);
-		}
-
-		rebuildFlag = true;
-	}
-
-    // temporary, will be change to prefference's variable
-    // private boolean borderVisible = true;
-
-    private boolean addNode(Node sourceNode, nsIDOMNode visualNextNode,
-	    nsIDOMNode visualContainer) {
-	nsIDOMNode visualNewNode = createNode(sourceNode, visualContainer);
-	// Fix for JBIDE-1097
-	try {
-	    if (visualNewNode != null) {
-		nsIDOMHTMLInputElement iDOMInputElement = (nsIDOMHTMLInputElement) visualNewNode
-			.queryInterface(nsIDOMHTMLInputElement.NS_IDOMHTMLINPUTELEMENT_IID);
-		iDOMInputElement.setReadOnly(true);
-	    }
-	} catch (XPCOMException ex) {
-	    // just ignore this exception
-	}
-	if (visualNewNode != null) {
-	    if (visualNextNode == null) {
-		visualContainer.appendChild(visualNewNode);
-	    } else {
-		visualContainer.insertBefore(visualNewNode, visualNextNode);
-	    }
-	    return true;
-	}
-
-	return false;
-    }
-
-    private nsIDOMElement createBorder(Node sourceNode,
-	    nsIDOMElement visualNode, boolean block) {
-	nsIDOMElement border = null;
-	if (visualNode == null)
-	    return null;
-	if (unborderedSourceNodes.contains(sourceNode.getNodeName()
-		.toLowerCase()))
-	    return null;
-	if (unborderedVisualNodes.contains(visualNode.getNodeName()
-		.toLowerCase()))
-	    return null;
-	if (HTML.TAG_IMG.equalsIgnoreCase(visualNode.getNodeName())) {
-	    String width = visualNode.getAttribute(ATRIBUTE_BORDER);
-	    if (width == null || ZERO_STRING.equalsIgnoreCase(width)
-		    || EMPTY_STRING.equalsIgnoreCase(width)) {
-		String style = visualNode
-			.getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
-		style = VpeStyleUtil.setParameterInStyle(style,
-			ATRIBUTE_BORDER, DOTTED_BORDER_STYLE_FOR_IMG);
-		visualNode.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
-	    }
-	    return null;
-	}
-	if (block) {
-	    if (YES_STRING.equals(VpePreference.USE_DETAIL_BORDER.getValue())) {
-		border = visualDocument.createElement(HTML.TAG_TABLE);
-		border.setAttribute(ATRIBUTE_CELLSPACING, ZERO_STRING);
-		border.setAttribute(ATRIBUTE_CELLPADDING, ZERO_STRING);
-
-		nsIDOMElement tr1 = visualDocument.createElement(HTML.TAG_TR);
-		border.appendChild(tr1);
-		nsIDOMElement td1 = visualDocument.createElement(HTML.TAG_TD);
-		td1.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
-			DOTTED_BORDER_STYLE_FOR_TD);
-		nsIDOMText text = visualDocument.createTextNode(sourceNode
-			.getNodeName());
-		td1.appendChild(text);
-		tr1.appendChild(td1);
-		nsIDOMElement tr2 = visualDocument.createElement(HTML.TAG_TR);
-		border.appendChild(tr2);
-		nsIDOMElement td2 = visualDocument.createElement(HTML.TAG_TD);
-		tr2.appendChild(td2);
-		nsIDOMElement p = visualDocument.createElement(HTML.TAG_P);
-		p.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
-			DOTTED_BORDER_STYLE);
-		td2.appendChild(p);
-
-		p.appendChild(visualNode);
-
-	    } else {
-		border = visualDocument.createElement(HTML.TAG_TABLE);
-		border.setAttribute(ATRIBUTE_CELLSPACING, ZERO_STRING);
-		border.setAttribute(ATRIBUTE_CELLPADDING, ZERO_STRING);
-
-		nsIDOMElement tr2 = visualDocument.createElement(HTML.TAG_TR);
-		border.appendChild(tr2);
-		nsIDOMElement td2 = visualDocument.createElement(HTML.TAG_TD);
-		tr2.appendChild(td2);
-		nsIDOMElement p = visualDocument.createElement(HTML.TAG_P);
-		p.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
-			DOTTED_BORDER_STYLE);
-		td2.appendChild(p);
-
-		p.appendChild(visualNode);
-	    }
-	} else {
-	    border = visualDocument.createElement(HTML.TAG_SPAN);
-	    border.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
-		    DOTTED_BORDER_STYLE);
-	    if (YES_STRING.equals(VpePreference.USE_DETAIL_BORDER.getValue())) {
-		nsIDOMElement name = visualDocument
-			.createElement(HTML.TAG_SPAN);
-		name.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
-			DOTTED_BORDER_STYLE_FOR_SPAN);
-		nsIDOMText text = visualDocument.createTextNode(sourceNode
-			.getNodeName());
-		name.appendChild(text);
-		border.appendChild(name);
-	    }
-	    border.appendChild(visualNode);
-	}
-	if (VpeStyleUtil.getAbsolute((Element) sourceNode) && border != null) {
-	    int top = VpeStyleUtil.getSizeFromStyle((Element) sourceNode,
-		    VpeStyleUtil.ATTRIBUTE_STYLE + VpeStyleUtil.DOT_STRING
-			    + VpeStyleUtil.PARAMETER_TOP);
-	    int left = VpeStyleUtil.getSizeFromStyle((Element) sourceNode,
-		    VpeStyleUtil.ATTRIBUTE_STYLE + VpeStyleUtil.DOT_STRING
-			    + VpeStyleUtil.PARAMETER_LEFT);
-
-	    String style = visualNode
-		    .getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
-	    style = VpeStyleUtil.deleteFromString(style,
-		    VpeStyleUtil.PARAMETER_POSITION,
-		    VpeStyleUtil.SEMICOLON_STRING);
-	    style = VpeStyleUtil.deleteFromString(style,
-		    VpeStyleUtil.PARAMETER_TOP, VpeStyleUtil.SEMICOLON_STRING);
-	    style = VpeStyleUtil.deleteFromString(style,
-		    VpeStyleUtil.PARAMETER_LEFT, VpeStyleUtil.SEMICOLON_STRING);
-	    visualNode.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
-
-	    style = border.getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
-	    style = VpeStyleUtil.setAbsolute(style);
-	    if (top != -1)
-		style = VpeStyleUtil.setSizeInStyle(style,
-			VpeStyleUtil.PARAMETER_TOP, top);
-	    if (left != -1)
-		style = VpeStyleUtil.setSizeInStyle(style,
-			VpeStyleUtil.PARAMETER_LEFT, left);
-	    border.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
-	}
-	return border;
-    }
-
-    protected nsIDOMNode createNode(Node sourceNode,
-	    nsIDOMNode visualOldContainer) {
-	boolean registerFlag = isCurrentMainDocument();
-	switch (sourceNode.getNodeType()) {
-	case Node.ELEMENT_NODE:
-	    Map<?, ?> xmlnsMap = createXmlns((Element) sourceNode);
-	    Set<Node> ifDependencySet = new HashSet<Node>();
+	pageContext.clearAll();
+	refreshExternalLinks();
+	pageContext.getBundle().refreshRegisteredBundles();
+
+	nsIDOMNodeList children = visualContentArea.getChildNodes();
+	long len = children.getLength();
+	for (long i = len - 1; i >= 0; i--) {
+	    visualContentArea.removeChild(children.item(i));
+	}
+
+	if (sourceDocument != null) {
+	    buildDom(sourceDocument);
+	}
+
+	rebuildFlag = true;
+    }
+
+    // temporary, will be change to prefference's variable
+    // private boolean borderVisible = true;
+
+    private boolean addNode(Node sourceNode, nsIDOMNode visualNextNode,
+	    nsIDOMNode visualContainer) {
+	nsIDOMNode visualNewNode = createNode(sourceNode, visualContainer);
+	// Fix for JBIDE-1097
+	try {
+	    if (visualNewNode != null) {
+		nsIDOMHTMLInputElement iDOMInputElement = (nsIDOMHTMLInputElement) visualNewNode
+			.queryInterface(nsIDOMHTMLInputElement.NS_IDOMHTMLINPUTELEMENT_IID);
+		iDOMInputElement.setReadOnly(true);
+	    }
+	} catch (XPCOMException ex) {
+	    // just ignore this exception
+	}
+	if (visualNewNode != null) {
+	    if (visualNextNode == null) {
+		visualContainer.appendChild(visualNewNode);
+	    } else {
+		visualContainer.insertBefore(visualNewNode, visualNextNode);
+	    }
+	    return true;
+	}
+
+	return false;
+    }
+
+    private nsIDOMElement createBorder(Node sourceNode,
+	    nsIDOMElement visualNode, boolean block) {
+	nsIDOMElement border = null;
+	if (visualNode == null)
+	    return null;
+	if (unborderedSourceNodes.contains(sourceNode.getNodeName()
+		.toLowerCase()))
+	    return null;
+	if (unborderedVisualNodes.contains(visualNode.getNodeName()
+		.toLowerCase()))
+	    return null;
+	if (HTML.TAG_IMG.equalsIgnoreCase(visualNode.getNodeName())) {
+	    String width = visualNode.getAttribute(ATRIBUTE_BORDER);
+	    if (width == null || ZERO_STRING.equalsIgnoreCase(width)
+		    || EMPTY_STRING.equalsIgnoreCase(width)) {
+		String style = visualNode
+			.getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
+		style = VpeStyleUtil.setParameterInStyle(style,
+			ATRIBUTE_BORDER, DOTTED_BORDER_STYLE_FOR_IMG);
+		visualNode.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
+	    }
+	    return null;
+	}
+	if (block) {
+	    if (YES_STRING.equals(VpePreference.USE_DETAIL_BORDER.getValue())) {
+		border = visualDocument.createElement(HTML.TAG_TABLE);
+		border.setAttribute(ATRIBUTE_CELLSPACING, ZERO_STRING);
+		border.setAttribute(ATRIBUTE_CELLPADDING, ZERO_STRING);
+
+		nsIDOMElement tr1 = visualDocument.createElement(HTML.TAG_TR);
+		border.appendChild(tr1);
+		nsIDOMElement td1 = visualDocument.createElement(HTML.TAG_TD);
+		td1.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
+			DOTTED_BORDER_STYLE_FOR_TD);
+		nsIDOMText text = visualDocument.createTextNode(sourceNode
+			.getNodeName());
+		td1.appendChild(text);
+		tr1.appendChild(td1);
+		nsIDOMElement tr2 = visualDocument.createElement(HTML.TAG_TR);
+		border.appendChild(tr2);
+		nsIDOMElement td2 = visualDocument.createElement(HTML.TAG_TD);
+		tr2.appendChild(td2);
+		nsIDOMElement p = visualDocument.createElement(HTML.TAG_P);
+		p.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
+			DOTTED_BORDER_STYLE);
+		td2.appendChild(p);
+
+		p.appendChild(visualNode);
+
+	    } else {
+		border = visualDocument.createElement(HTML.TAG_TABLE);
+		border.setAttribute(ATRIBUTE_CELLSPACING, ZERO_STRING);
+		border.setAttribute(ATRIBUTE_CELLPADDING, ZERO_STRING);
+
+		nsIDOMElement tr2 = visualDocument.createElement(HTML.TAG_TR);
+		border.appendChild(tr2);
+		nsIDOMElement td2 = visualDocument.createElement(HTML.TAG_TD);
+		tr2.appendChild(td2);
+		nsIDOMElement p = visualDocument.createElement(HTML.TAG_P);
+		p.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
+			DOTTED_BORDER_STYLE);
+		td2.appendChild(p);
+
+		p.appendChild(visualNode);
+	    }
+	} else {
+	    border = visualDocument.createElement(HTML.TAG_SPAN);
+	    border.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
+		    DOTTED_BORDER_STYLE);
+	    if (YES_STRING.equals(VpePreference.USE_DETAIL_BORDER.getValue())) {
+		nsIDOMElement name = visualDocument
+			.createElement(HTML.TAG_SPAN);
+		name.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE,
+			DOTTED_BORDER_STYLE_FOR_SPAN);
+		nsIDOMText text = visualDocument.createTextNode(sourceNode
+			.getNodeName());
+		name.appendChild(text);
+		border.appendChild(name);
+	    }
+	    border.appendChild(visualNode);
+	}
+	if (VpeStyleUtil.getAbsolute((Element) sourceNode) && border != null) {
+	    int top = VpeStyleUtil.getSizeFromStyle((Element) sourceNode,
+		    VpeStyleUtil.ATTRIBUTE_STYLE + VpeStyleUtil.DOT_STRING
+			    + VpeStyleUtil.PARAMETER_TOP);
+	    int left = VpeStyleUtil.getSizeFromStyle((Element) sourceNode,
+		    VpeStyleUtil.ATTRIBUTE_STYLE + VpeStyleUtil.DOT_STRING
+			    + VpeStyleUtil.PARAMETER_LEFT);
+
+	    String style = visualNode
+		    .getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
+	    style = VpeStyleUtil.deleteFromString(style,
+		    VpeStyleUtil.PARAMETER_POSITION,
+		    VpeStyleUtil.SEMICOLON_STRING);
+	    style = VpeStyleUtil.deleteFromString(style,
+		    VpeStyleUtil.PARAMETER_TOP, VpeStyleUtil.SEMICOLON_STRING);
+	    style = VpeStyleUtil.deleteFromString(style,
+		    VpeStyleUtil.PARAMETER_LEFT, VpeStyleUtil.SEMICOLON_STRING);
+	    visualNode.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
+
+	    style = border.getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
+	    style = VpeStyleUtil.setAbsolute(style);
+	    if (top != -1)
+		style = VpeStyleUtil.setSizeInStyle(style,
+			VpeStyleUtil.PARAMETER_TOP, top);
+	    if (left != -1)
+		style = VpeStyleUtil.setSizeInStyle(style,
+			VpeStyleUtil.PARAMETER_LEFT, left);
+	    border.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
+	}
+	return border;
+    }
+
+    protected nsIDOMNode createNode(Node sourceNode,
+	    nsIDOMNode visualOldContainer) {
+	boolean registerFlag = isCurrentMainDocument();
+	switch (sourceNode.getNodeType()) {
+	case Node.ELEMENT_NODE:
+//	    Map<?, ?> xmlnsMap = createXmlns((Element) sourceNode);
+	    Set<Node> ifDependencySet = new HashSet<Node>();
 	    pageContext.setCurrentVisualNode(visualOldContainer);
-	    VpeTemplate template = templateManager.getTemplate(pageContext,
-		    (Element) sourceNode, ifDependencySet);
-
-	    VpeCreationData creationData = null;
-	  //FIX FOR JBIDE-1568, added by Max Areshkau
-		try {
-				creationData = template.create(getPageContext(), sourceNode, getVisualDocument());
-			}catch (XPCOMException ex) {
-				VpePlugin.getPluginLog().logError(ex);
-				VpeTemplate defTemplate = templateManager.getDefTemplate();
-				creationData = defTemplate.create(getPageContext(), sourceNode, getVisualDocument());
-			}
+	    VpeTemplate template = templateManager.getTemplate(pageContext,
+		    (Element) sourceNode, ifDependencySet);
+
+	    VpeCreationData creationData = null;
+	  //FIX FOR JBIDE-1568, added by Max Areshkau
+		try {
+				creationData = template.create(getPageContext(), sourceNode, getVisualDocument());
+			}catch (XPCOMException ex) {
+				VpePlugin.getPluginLog().logError(ex);
+				VpeTemplate defTemplate = templateManager.getDefTemplate();
+				creationData = defTemplate.create(getPageContext(), sourceNode, getVisualDocument());
+			}
 	    pageContext.setCurrentVisualNode(null);
-	    nsIDOMElement visualNewElement = (nsIDOMElement) creationData
-		    .getNode();
-
-	    if (visualNewElement != null)
-		correctVisualAttribute(visualNewElement);
-
-	    nsIDOMElement border = null;
-	    setTooltip((Element) sourceNode, visualNewElement);
-	    if (YES_STRING.equals(VpePreference.SHOW_BORDER_FOR_ALL_TAGS
-		    .getValue())
-		    && visualNewElement != null) {
-		boolean block = true;
-		if (template.getTagDescription(null, null, null,
-			visualNewElement, null).getDisplayType() == VpeTagDescription.DISPLAY_TYPE_INLINE) {
-		    block = false;
-		}
-		border = createBorder(sourceNode, visualNewElement, block);
-	    }
-	    if (!isCurrentMainDocument() && visualNewElement != null) {
-		setReadOnlyElement(visualNewElement);
-	    }
-	    if (registerFlag) {
-		VpeElementMapping elementMapping = new VpeElementMapping(
-			(Element) sourceNode, visualNewElement, border,
-			template, ifDependencySet, creationData.getData());
-		elementMapping.setXmlnsMap(xmlnsMap);
-		registerNodes(elementMapping);
-	    }
-	    if (template.isChildren()) {
-		List<?> childrenInfoList = creationData.getChildrenInfoList();
-		if (childrenInfoList == null) {
-		    addChildren(template, sourceNode,
-			    visualNewElement != null ? visualNewElement
-				    : visualOldContainer);
-		} else {
-		    addChildren(template, sourceNode, visualOldContainer,
-			    childrenInfoList);
-		}
-	    }
+	    nsIDOMElement visualNewElement = (nsIDOMElement) creationData
+		    .getNode();
+
+	    if (visualNewElement != null)
+		correctVisualAttribute(visualNewElement);
+
+	    nsIDOMElement border = null;
+	    setTooltip((Element) sourceNode, visualNewElement);
+	    if (YES_STRING.equals(VpePreference.SHOW_BORDER_FOR_ALL_TAGS
+		    .getValue())
+		    && visualNewElement != null) {
+		boolean block = true;
+		if (template.getTagDescription(null, null, null,
+			visualNewElement, null).getDisplayType() == VpeTagDescription.DISPLAY_TYPE_INLINE) {
+		    block = false;
+		}
+		border = createBorder(sourceNode, visualNewElement, block);
+	    }
+	    if (!isCurrentMainDocument() && visualNewElement != null) {
+		setReadOnlyElement(visualNewElement);
+	    }
+	    if (registerFlag) {
+		VpeElementMapping elementMapping = new VpeElementMapping(
+			(Element) sourceNode, visualNewElement, border,
+			template, ifDependencySet, creationData.getData());
+//		elementMapping.setXmlnsMap(xmlnsMap);
+		registerNodes(elementMapping);
+	    }
+	    if (template.isChildren()) {
+		List<?> childrenInfoList = creationData.getChildrenInfoList();
+		if (childrenInfoList == null) {
+		    addChildren(template, sourceNode,
+			    visualNewElement != null ? visualNewElement
+				    : visualOldContainer);
+		} else {
+		    addChildren(template, sourceNode, visualOldContainer,
+			    childrenInfoList);
+		}
+	    }
 	    pageContext.setCurrentVisualNode(visualOldContainer);
-	    template.validate(pageContext, (Element) sourceNode,
-		    visualDocument, creationData);
+	    template.validate(pageContext, (Element) sourceNode,
+		    visualDocument, creationData);
 	    pageContext.setCurrentVisualNode(null);
-	    if (border != null)
-		return border;
-	    else
-		return visualNewElement;
-	case Node.TEXT_NODE:
-	    return createTextNode(sourceNode, registerFlag);
-	case Node.COMMENT_NODE:
-	    if (!YES_STRING.equals(VpePreference.SHOW_COMMENTS.getValue())) {
-		return null;
-	    }
-	    nsIDOMElement visualNewComment = createComment(sourceNode);
-	    if (registerFlag) {
-		registerNodes(new VpeNodeMapping(sourceNode, visualNewComment));
-	    }
-	    return visualNewComment;
-	}
-	return null;
-    }
-
-    private void correctVisualAttribute(nsIDOMElement element) {
-
-	String styleValue = element.getAttribute(HTML.TAG_STYLE);
-	String backgroundValue = element
-		.getAttribute(VpeStyleUtil.PARAMETR_BACKGROND);
-
-	if (styleValue != null) {
-	    styleValue = VpeStyleUtil.addFullPathIntoURLValue(styleValue,
-		    pageContext.getEditPart().getEditorInput());
-	    element.setAttribute(HTML.TAG_STYLE, styleValue);
-	}
-	if (backgroundValue != null) {
-	    backgroundValue = VpeStyleUtil
-		    .addFullPathIntoBackgroundValue(backgroundValue,
-			    pageContext.getEditPart().getEditorInput());
-	    element.setAttribute(VpeStyleUtil.PARAMETR_BACKGROND,
-		    backgroundValue);
-	}
-    }
-
-    protected nsIDOMElement createComment(Node sourceNode) {
-	nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV);
-	div.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, COMMENT_STYLE);
-	String value = COMMENT_PREFIX + sourceNode.getNodeValue()
-		+ COMMENT_SUFFIX;
-	nsIDOMText text = visualDocument.createTextNode(value);
-	div.appendChild(text);
-	return div;
-    }
-
-    protected void addChildren(VpeTemplate containerTemplate,
-	    Node sourceContainer, nsIDOMNode visualContainer) {
-	NodeList sourceNodes = sourceContainer.getChildNodes();
-	int len = sourceNodes.getLength();
-	int childrenCount = 0;
-	for (int i = 0; i < len; i++) {
-	    Node sourceNode = sourceNodes.item(i);
-	    if (addNode(sourceNode, null, visualContainer)) {
-		childrenCount++;
-	    }
-	}
-	if (childrenCount == 0) {
-	    setPseudoContent(containerTemplate, sourceContainer,
-		    visualContainer);
-	}
-    }
-
-    protected void addChildren(VpeTemplate containerTemplate,
-	    Node sourceContainer, nsIDOMNode visualOldContainer,
-	    List<?> childrenInfoList) {
-	for (int i = 0; i < childrenInfoList.size(); i++) {
-	    VpeChildrenInfo info = (VpeChildrenInfo) childrenInfoList.get(i);
-	    nsIDOMNode visualParent = info.getVisualParent();
-	    if (visualParent == null)
-		visualParent = visualOldContainer;
-	    List<?> sourceChildren = info.getSourceChildren();
-	    int childrenCount = 0;
-	    if (sourceChildren != null) {
-		for (int j = 0; j < sourceChildren.size(); j++) {
-		    if (addNode((Node) sourceChildren.get(j), null,
-			    visualParent)) {
-			childrenCount++;
-		    }
-		}
-	    }
-	    if (childrenCount == 0 && childrenInfoList.size() == 0) {
-		setPseudoContent(containerTemplate, sourceContainer,
-			visualParent);
-	    }
-	}
-    }
-
-    // /////////////////////////////////////////////////////////////////////////
-    public nsIDOMNode addStyleNodeToHead(String styleText) {
-	nsIDOMNode newStyle = visualDocument
-		.createElement(VpeStyleUtil.ATTRIBUTE_STYLE);
-
-	if (styleText != null) {
-	    nsIDOMText newText = visualDocument.createTextNode(styleText);
-	    newStyle.appendChild(newText);
-	}
-	headNode.appendChild(newStyle);
-	return newStyle;
-    }
-
-    public nsIDOMNode replaceStyleNodeToHead(nsIDOMNode oldStyleNode,
-	    String styleText) {
-	nsIDOMElement newStyle = visualDocument
-		.createElement(VpeStyleUtil.ATTRIBUTE_STYLE);
-
-	if (styleText != null) {
-	    nsIDOMNode newText = visualDocument.createTextNode(styleText);
-	    newStyle.appendChild(newText);
-	}
-
-	headNode.replaceChild(newStyle, oldStyleNode);
-	return newStyle;
-    }
-
-    public void removeStyleNodeFromHead(nsIDOMNode oldStyleNode) {
-	headNode.removeChild(oldStyleNode);
-    }
-
-    void addExternalLinks() {
-	IEditorInput input = pageContext.getEditPart().getEditorInput();
-	IFile file = null;
-	if (input instanceof IFileEditorInput) {
-	    file = ((IFileEditorInput) input).getFile();
-	}
-	ResourceReference[] l = null;
-	if (file != null) {
-	    l = CSSReferenceList.getInstance().getAllResources(file);
-	}
-	if (l != null) {
-	    for (int i = 0; i < l.length; i++) {
-		ResourceReference item = l[i];
-		addLinkNodeToHead("file:///" + item.getLocation(), YES_STRING);
-	    }
-	}
-    }
-
-    void removeExternalLinks() {
-	nsIDOMNodeList childs = headNode.getChildNodes();
-	long length = childs.getLength();
-	for (long i = length - 1; i >= 0; i--) {
-	    nsIDOMNode node = childs.item(i);
-	    if (node.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
-		boolean isLink = false;
-		boolean isStyle = false;
-		if ((isLink = HTML.TAG_LINK
-			.equalsIgnoreCase(node.getNodeName()))
-			|| (isStyle = HTML.TAG_STYLE.equalsIgnoreCase(node
-				.getNodeName()))) {
-		    nsIDOMElement element = (nsIDOMElement) node
-			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
-		    if ((isLink || (isStyle && ATTR_VPE_INLINE_LINK_VALUE
-			    .equalsIgnoreCase(element.getAttribute(ATTR_VPE))))
-			    && YES_STRING.equalsIgnoreCase(element
-				    .getAttribute("ext"))) {
-			headNode.removeChild(node);
-		    }
-		}
-	    }
-	}
-    }
-
-    void refreshExternalLinks() {
-	removeExternalLinks();
-	addExternalLinks();
-    }
-
-    // ==========================================================
-    void resetPseudoElement(nsIDOMNode visualNode) {
-	if (visualNode != null) {
-	    nsIDOMNode visualParent = visualNode.getParentNode();
-	    if (visualParent != null) {
-		PseudoInfo info = getPseudoInfo(visualParent);
-		if (info.pseudoNode == null && !info.isElements) {
-		    addPseudoElementImpl(visualParent);
-		} else if (info.pseudoNode != null && info.isElements) {
-		    visualParent.removeChild(info.pseudoNode);
-		}
-	    }
-	}
-    }
-
-    private PseudoInfo getPseudoInfo(nsIDOMNode visualParent) {
-	nsIDOMNode pseudoNode = null;
-	boolean isElements = false;
-
-	if (visualParent == null)
-	    return new PseudoInfo();
-	nsIDOMNodeList visualNodes = visualParent.getChildNodes();
-	if (visualNodes == null)
-	    return new PseudoInfo();
-
-	long length = visualNodes.getLength();
-	for (long i = 0; i < length; i++) {
-	    nsIDOMNode visualNode = visualNodes.item(i);
-	    if (pseudoNode == null && isPseudoElement(visualNode)) {
-		pseudoNode = visualNode;
-	    } else if (!isEmptyText(visualNode)) {
-		isElements = true;
-	    }
-	    if (pseudoNode != null && isElements) {
-		break;
-	    }
-	}
-	return new PseudoInfo(pseudoNode, isElements);
-    }
-
-    static boolean isInitElement(nsIDOMNode visualNode) {
-	if (visualNode == null) {
-	    return false;
-	}
-
-	if (visualNode.getNodeType() != Node.ELEMENT_NODE) {
-	    return false;
-	}
-
-	if (YES_STRING.equalsIgnoreCase(((nsIDOMElement) visualNode)
-		.getAttribute(INIT_ELEMENT_ATTR))) {
-	    return true;
-	}
-
-	return false;
-    }
-
-    static boolean isPseudoElement(nsIDOMNode visualNode) {
-	if (visualNode == null) {
-	    return false;
-	}
-
-	if (visualNode.getNodeType() != Node.ELEMENT_NODE) {
-	    return false;
-	}
-
-	if (YES_STRING.equalsIgnoreCase(((nsIDOMElement) visualNode
-		.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
-		.getAttribute(PSEUDO_ELEMENT_ATTR))) {
-	    return true;
-	}
-
-	return false;
-    }
-
-    private void setPseudoContent(VpeTemplate containerTemplate,
-	    Node sourceContainer, nsIDOMNode visualContainer) {
-	if (containerTemplate != null) {
-	    containerTemplate.setPseudoContent(pageContext, sourceContainer,
-		    visualContainer, visualDocument);
-	} else {
-	    VpeDefaultPseudoContentCreator.getInstance().setPseudoContent(
-		    pageContext, sourceContainer, visualContainer,
-		    visualDocument);
-	}
-
-	// if (isEmptyElement(visualContainer)) {
-	// addPseudoElementImpl(visualContainer);
-	// }
-    }
-
-    private void addPseudoElementImpl(nsIDOMNode visualParent) {
-	if (!templateManager.isWithoutPseudoElementContainer(visualParent
-		.getNodeName())) {
-	    if (VpeDebug.VISUAL_ADD_PSEUDO_ELEMENT) {
-		System.out.println("-------------------- addPseudoElement: "
-			+ visualParent.getNodeName());
-	    }
-	    nsIDOMElement visualPseudoElement = visualDocument
-		    .createElement(PSEUDO_ELEMENT);
-	    visualPseudoElement.setAttribute(PSEUDO_ELEMENT_ATTR, "yes");
-	    visualParent.appendChild(visualPseudoElement);
-	}
-    }
-
-    public boolean isEmptyElement(nsIDOMNode visualParent) {
-	nsIDOMNodeList visualNodes = visualParent.getChildNodes();
-	long len = visualNodes.getLength();
-
-	if ((len == 0) || (len == 1 && isEmptyText(visualNodes.item(0)))) {
-	    return true;
-	}
-
-	return false;
-    }
-
-    public boolean isEmptyDocument() {
-	nsIDOMNodeList visualNodes = visualContentArea.getChildNodes();
-	long len = visualNodes.getLength();
-	if ((len == 0)
-		|| (len == 1 && (isEmptyText(visualNodes.item(0)) || isPseudoElement(visualNodes
-			.item(0))))) {
-	    return true;
-	}
-
-	return false;
-    }
-
-    private boolean isEmptyText(nsIDOMNode visualNode) {
-	if (visualNode == null
-		|| (visualNode.getNodeType() != nsIDOMNode.TEXT_NODE)) {
-	    return false;
-	}
-
-	if (visualNode.getNodeValue().trim().length() == 0) {
-	    return true;
-	}
-
-	return false;
-    }
-
-    // ==========================================================
-
-    public void updateNode(Node sourceNode) {
-	if (sourceNode == null)
-	    return;
-
-	switch (sourceNode.getNodeType()) {
-	case Node.DOCUMENT_NODE:
-	    rebuildDom((Document) sourceNode);
-	    break;
-	case Node.COMMENT_NODE:
-	    updateComment(sourceNode);
-	    break;
-	default:
-	    updateElement(getNodeForUpdate(sourceNode));
-	}
-    }
-
-    // TODO Ssergey Vasilyev make a common code for figuring out
-    // if it is need to update parent node or not
-    private Node getNodeForUpdate(Node sourceNode) {
-	/* Changing of <tr> or <td> tags can affect whole the table */
-	Node sourceTable = getParentTable(sourceNode, 2);
-	if (sourceTable != null) {
-	    return sourceTable;
-	}
-
-	/* Changing of an <option> tag can affect the parent select */
-	Node sourceSelect = getParentSelect(sourceNode);
-	if (sourceSelect != null) {
-	    return sourceSelect;
-	}
-
-	return sourceNode;
-    }
-
-    private void updateComment(Node sourceNode) {
-	VpeNodeMapping mapping = domMapping.getNodeMapping(sourceNode);
-	if (mapping != null
-		&& mapping.getType() == VpeNodeMapping.COMMENT_MAPPING) {
-	    nsIDOMNodeList visualNodes = mapping.getVisualNode()
-		    .getChildNodes();
-
-	    if (visualNodes.getLength() > 0) {
-		visualNodes.item(0).setNodeValue(sourceNode.getNodeValue());
-	    }
-	}
-    }
-
-    private void updateElement(Node sourceNode) {
-	VpeElementMapping elementMapping = null;
-	VpeNodeMapping nodeMapping = domMapping.getNodeMapping(sourceNode);
-	if (nodeMapping instanceof VpeElementMapping) {
-	    elementMapping = (VpeElementMapping) nodeMapping;
-	    if (elementMapping != null && elementMapping.getTemplate() != null) {
-		Node updateNode = elementMapping.getTemplate()
-			.getNodeForUptate(pageContext,
-				elementMapping.getSourceNode(),
-				elementMapping.getVisualNode(),
-				elementMapping.getData());
-		if (updateNode != null && updateNode != sourceNode) {
-		    updateNode(updateNode);
-		    return;
-		}
-	    }
-	}
-	nsIDOMNode visualOldNode = domMapping.remove(sourceNode);
+	    if (border != null)
+		return border;
+	    else
+		return visualNewElement;
+	case Node.TEXT_NODE:
+	    return createTextNode(sourceNode, registerFlag);
+	case Node.COMMENT_NODE:
+	    if (!YES_STRING.equals(VpePreference.SHOW_COMMENTS.getValue())) {
+		return null;
+	    }
+	    nsIDOMElement visualNewComment = createComment(sourceNode);
+	    if (registerFlag) {
+		registerNodes(new VpeNodeMapping(sourceNode, visualNewComment));
+	    }
+	    return visualNewComment;
+	}
+	return null;
+    }
+
+    private void correctVisualAttribute(nsIDOMElement element) {
+
+	String styleValue = element.getAttribute(HTML.TAG_STYLE);
+	String backgroundValue = element
+		.getAttribute(VpeStyleUtil.PARAMETR_BACKGROND);
+
+	if (styleValue != null) {
+	    styleValue = VpeStyleUtil.addFullPathIntoURLValue(styleValue,
+		    pageContext.getEditPart().getEditorInput());
+	    element.setAttribute(HTML.TAG_STYLE, styleValue);
+	}
+	if (backgroundValue != null) {
+	    backgroundValue = VpeStyleUtil
+		    .addFullPathIntoBackgroundValue(backgroundValue,
+			    pageContext.getEditPart().getEditorInput());
+	    element.setAttribute(VpeStyleUtil.PARAMETR_BACKGROND,
+		    backgroundValue);
+	}
+    }
+
+    protected nsIDOMElement createComment(Node sourceNode) {
+	nsIDOMElement div = visualDocument.createElement(HTML.TAG_DIV);
+	div.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, COMMENT_STYLE);
+	String value = COMMENT_PREFIX + sourceNode.getNodeValue()
+		+ COMMENT_SUFFIX;
+	nsIDOMText text = visualDocument.createTextNode(value);
+	div.appendChild(text);
+	return div;
+    }
+
+    protected void addChildren(VpeTemplate containerTemplate,
+	    Node sourceContainer, nsIDOMNode visualContainer) {
+	NodeList sourceNodes = sourceContainer.getChildNodes();
+	int len = sourceNodes.getLength();
+	int childrenCount = 0;
+	for (int i = 0; i < len; i++) {
+	    Node sourceNode = sourceNodes.item(i);
+	    if (addNode(sourceNode, null, visualContainer)) {
+		childrenCount++;
+	    }
+	}
+	if (childrenCount == 0) {
+	    setPseudoContent(containerTemplate, sourceContainer,
+		    visualContainer);
+	}
+    }
+
+    protected void addChildren(VpeTemplate containerTemplate,
+	    Node sourceContainer, nsIDOMNode visualOldContainer,
+	    List<?> childrenInfoList) {
+	for (int i = 0; i < childrenInfoList.size(); i++) {
+	    VpeChildrenInfo info = (VpeChildrenInfo) childrenInfoList.get(i);
+	    nsIDOMNode visualParent = info.getVisualParent();
+	    if (visualParent == null)
+		visualParent = visualOldContainer;
+	    List<?> sourceChildren = info.getSourceChildren();
+	    int childrenCount = 0;
+	    if (sourceChildren != null) {
+		for (int j = 0; j < sourceChildren.size(); j++) {
+		    if (addNode((Node) sourceChildren.get(j), null,
+			    visualParent)) {
+			childrenCount++;
+		    }
+		}
+	    }
+	    if (childrenCount == 0 && childrenInfoList.size() == 0) {
+		setPseudoContent(containerTemplate, sourceContainer,
+			visualParent);
+	    }
+	}
+    }
+
+    // /////////////////////////////////////////////////////////////////////////
+    public nsIDOMNode addStyleNodeToHead(String styleText) {
+	nsIDOMNode newStyle = visualDocument
+		.createElement(VpeStyleUtil.ATTRIBUTE_STYLE);
+
+	if (styleText != null) {
+	    nsIDOMText newText = visualDocument.createTextNode(styleText);
+	    newStyle.appendChild(newText);
+	}
+	headNode.appendChild(newStyle);
+	return newStyle;
+    }
+
+    public nsIDOMNode replaceStyleNodeToHead(nsIDOMNode oldStyleNode,
+	    String styleText) {
+	nsIDOMElement newStyle = visualDocument
+		.createElement(VpeStyleUtil.ATTRIBUTE_STYLE);
+
+	if (styleText != null) {
+	    nsIDOMNode newText = visualDocument.createTextNode(styleText);
+	    newStyle.appendChild(newText);
+	}
+
+	headNode.replaceChild(newStyle, oldStyleNode);
+	return newStyle;
+    }
+
+    public void removeStyleNodeFromHead(nsIDOMNode oldStyleNode) {
+	headNode.removeChild(oldStyleNode);
+    }
+
+    void addExternalLinks() {
+	IEditorInput input = pageContext.getEditPart().getEditorInput();
+	IFile file = null;
+	if (input instanceof IFileEditorInput) {
+	    file = ((IFileEditorInput) input).getFile();
+	}
+	ResourceReference[] l = null;
+	if (file != null) {
+	    l = CSSReferenceList.getInstance().getAllResources(file);
+	}
+	if (l != null) {
+	    for (int i = 0; i < l.length; i++) {
+		ResourceReference item = l[i];
+		addLinkNodeToHead("file:///" + item.getLocation(), YES_STRING);
+	    }
+	}
+    }
+
+    void removeExternalLinks() {
+	nsIDOMNodeList childs = headNode.getChildNodes();
+	long length = childs.getLength();
+	for (long i = length - 1; i >= 0; i--) {
+	    nsIDOMNode node = childs.item(i);
+	    if (node.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
+		boolean isLink = false;
+		boolean isStyle = false;
+		if ((isLink = HTML.TAG_LINK
+			.equalsIgnoreCase(node.getNodeName()))
+			|| (isStyle = HTML.TAG_STYLE.equalsIgnoreCase(node
+				.getNodeName()))) {
+		    nsIDOMElement element = (nsIDOMElement) node
+			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
+		    if ((isLink || (isStyle && ATTR_VPE_INLINE_LINK_VALUE
+			    .equalsIgnoreCase(element.getAttribute(ATTR_VPE))))
+			    && YES_STRING.equalsIgnoreCase(element
+				    .getAttribute("ext"))) {
+			headNode.removeChild(node);
+		    }
+		}
+	    }
+	}
+    }
+
+    void refreshExternalLinks() {
+	removeExternalLinks();
+	addExternalLinks();
+    }
+
+    // ==========================================================
+    void resetPseudoElement(nsIDOMNode visualNode) {
+	if (visualNode != null) {
+	    nsIDOMNode visualParent = visualNode.getParentNode();
+	    if (visualParent != null) {
+		PseudoInfo info = getPseudoInfo(visualParent);
+		if (info.pseudoNode == null && !info.isElements) {
+		    addPseudoElementImpl(visualParent);
+		} else if (info.pseudoNode != null && info.isElements) {
+		    visualParent.removeChild(info.pseudoNode);
+		}
+	    }
+	}
+    }
+
+    private PseudoInfo getPseudoInfo(nsIDOMNode visualParent) {
+	nsIDOMNode pseudoNode = null;
+	boolean isElements = false;
+
+	if (visualParent == null)
+	    return new PseudoInfo();
+	nsIDOMNodeList visualNodes = visualParent.getChildNodes();
+	if (visualNodes == null)
+	    return new PseudoInfo();
+
+	long length = visualNodes.getLength();
+	for (long i = 0; i < length; i++) {
+	    nsIDOMNode visualNode = visualNodes.item(i);
+	    if (pseudoNode == null && isPseudoElement(visualNode)) {
+		pseudoNode = visualNode;
+	    } else if (!isEmptyText(visualNode)) {
+		isElements = true;
+	    }
+	    if (pseudoNode != null && isElements) {
+		break;
+	    }
+	}
+	return new PseudoInfo(pseudoNode, isElements);
+    }
+
+    static boolean isInitElement(nsIDOMNode visualNode) {
+	if (visualNode == null) {
+	    return false;
+	}
+
+	if (visualNode.getNodeType() != Node.ELEMENT_NODE) {
+	    return false;
+	}
+
+	if (YES_STRING.equalsIgnoreCase(((nsIDOMElement) visualNode)
+		.getAttribute(INIT_ELEMENT_ATTR))) {
+	    return true;
+	}
+
+	return false;
+    }
+
+    static boolean isPseudoElement(nsIDOMNode visualNode) {
+	if (visualNode == null) {
+	    return false;
+	}
+
+	if (visualNode.getNodeType() != Node.ELEMENT_NODE) {
+	    return false;
+	}
+
+	if (YES_STRING.equalsIgnoreCase(((nsIDOMElement) visualNode
+		.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
+		.getAttribute(PSEUDO_ELEMENT_ATTR))) {
+	    return true;
+	}
+
+	return false;
+    }
+
+    private void setPseudoContent(VpeTemplate containerTemplate,
+	    Node sourceContainer, nsIDOMNode visualContainer) {
+	if (containerTemplate != null) {
+	    containerTemplate.setPseudoContent(pageContext, sourceContainer,
+		    visualContainer, visualDocument);
+	} else {
+	    VpeDefaultPseudoContentCreator.getInstance().setPseudoContent(
+		    pageContext, sourceContainer, visualContainer,
+		    visualDocument);
+	}
+
+	// if (isEmptyElement(visualContainer)) {
+	// addPseudoElementImpl(visualContainer);
+	// }
+    }
+
+    private void addPseudoElementImpl(nsIDOMNode visualParent) {
+	if (!templateManager.isWithoutPseudoElementContainer(visualParent
+		.getNodeName())) {
+	    if (VpeDebug.VISUAL_ADD_PSEUDO_ELEMENT) {
+		System.out.println("-------------------- addPseudoElement: "
+			+ visualParent.getNodeName());
+	    }
+	    nsIDOMElement visualPseudoElement = visualDocument
+		    .createElement(PSEUDO_ELEMENT);
+	    visualPseudoElement.setAttribute(PSEUDO_ELEMENT_ATTR, "yes");
+	    visualParent.appendChild(visualPseudoElement);
+	}
+    }
+
+    public boolean isEmptyElement(nsIDOMNode visualParent) {
+	nsIDOMNodeList visualNodes = visualParent.getChildNodes();
+	long len = visualNodes.getLength();
+
+	if ((len == 0) || (len == 1 && isEmptyText(visualNodes.item(0)))) {
+	    return true;
+	}
+
+	return false;
+    }
+
+    public boolean isEmptyDocument() {
+	nsIDOMNodeList visualNodes = visualContentArea.getChildNodes();
+	long len = visualNodes.getLength();
+	if ((len == 0)
+		|| (len == 1 && (isEmptyText(visualNodes.item(0)) || isPseudoElement(visualNodes
+			.item(0))))) {
+	    return true;
+	}
+
+	return false;
+    }
+
+    private boolean isEmptyText(nsIDOMNode visualNode) {
+	if (visualNode == null
+		|| (visualNode.getNodeType() != nsIDOMNode.TEXT_NODE)) {
+	    return false;
+	}
+
+	if (visualNode.getNodeValue().trim().length() == 0) {
+	    return true;
+	}
+
+	return false;
+    }
+
+    // ==========================================================
+
+    public void updateNode(Node sourceNode) {
+	if (sourceNode == null)
+	    return;
+
+	switch (sourceNode.getNodeType()) {
+	case Node.DOCUMENT_NODE:
+	    rebuildDom((Document) sourceNode);
+	    break;
+	case Node.COMMENT_NODE:
+	    updateComment(sourceNode);
+	    break;
+	default:
+	    updateElement(getNodeForUpdate(sourceNode));
+	}
+    }
+
+    // TODO Ssergey Vasilyev make a common code for figuring out
+    // if it is need to update parent node or not
+    private Node getNodeForUpdate(Node sourceNode) {
+	/* Changing of <tr> or <td> tags can affect whole the table */
+	Node sourceTable = getParentTable(sourceNode, 2);
+	if (sourceTable != null) {
+	    return sourceTable;
+	}
+
+	/* Changing of an <option> tag can affect the parent select */
+	Node sourceSelect = getParentSelect(sourceNode);
+	if (sourceSelect != null) {
+	    return sourceSelect;
+	}
+
+	return sourceNode;
+    }
+
+    private void updateComment(Node sourceNode) {
+	VpeNodeMapping mapping = domMapping.getNodeMapping(sourceNode);
+	if (mapping != null
+		&& mapping.getType() == VpeNodeMapping.COMMENT_MAPPING) {
+	    nsIDOMNodeList visualNodes = mapping.getVisualNode()
+		    .getChildNodes();
+
+	    if (visualNodes.getLength() > 0) {
+		visualNodes.item(0).setNodeValue(sourceNode.getNodeValue());
+	    }
+	}
+    }
+
+    private void updateElement(Node sourceNode) {
+	VpeElementMapping elementMapping = null;
+	VpeNodeMapping nodeMapping = domMapping.getNodeMapping(sourceNode);
+	if (nodeMapping instanceof VpeElementMapping) {
+	    elementMapping = (VpeElementMapping) nodeMapping;
+	    if (elementMapping != null && elementMapping.getTemplate() != null) {
+		Node updateNode = elementMapping.getTemplate()
+			.getNodeForUptate(pageContext,
+				elementMapping.getSourceNode(),
+				elementMapping.getVisualNode(),
+				elementMapping.getData());
+		if (updateNode != null && updateNode != sourceNode) {
+		    updateNode(updateNode);
+		    return;
+		}
+	    }
+	}
+	nsIDOMNode visualOldNode = domMapping.remove(sourceNode);
 	getSourceNodes().remove(sourceNode);
 	if (sourceNode instanceof INodeNotifier) {
 		((INodeNotifier) sourceNode).removeAdapter(getSorceAdapter());
 	}
-	if (visualOldNode != null) {
-	    if (elementMapping != null) {
-		nsIDOMElement border = elementMapping.getBorder();
-		if (border != null) {
-		    visualOldNode = border;
-		}
-	    }
-	    nsIDOMNode visualContainer = visualOldNode.getParentNode();
-	    nsIDOMNode visualNextNode = visualOldNode.getNextSibling();
-	    if (visualContainer != null) {
-		visualContainer.removeChild(visualOldNode);
-		addNode(sourceNode, visualNextNode, visualContainer);
-	    }
-	} else {
+	if (visualOldNode != null) {
+	    if (elementMapping != null) {
+		nsIDOMElement border = elementMapping.getBorder();
+		if (border != null) {
+		    visualOldNode = border;
+		}
+	    }
+	    nsIDOMNode visualContainer = visualOldNode.getParentNode();
+	    nsIDOMNode visualNextNode = visualOldNode.getNextSibling();
+	    if (visualContainer != null) {
+		visualContainer.removeChild(visualOldNode);
+		addNode(sourceNode, visualNextNode, visualContainer);
+	    }
+	} else {
 		//Max Areshkau Why we need update parent node when we update text node?
 		//lookd like we haven't need do it. 
-		if (sourceNode.getNodeType() == Node.TEXT_NODE) {
-	    	updateNode(sourceNode.getParentNode());
-	    }
-	}
-    }
-
-    public void removeNode(Node sourceNode) {
-	domMapping.remove(sourceNode);
+	    if (sourceNode.getNodeType() == Node.TEXT_NODE) {
+		updateNode(sourceNode.getParentNode());
+	    }
+	}
+    }
+
+    public void removeNode(Node sourceNode) {
+	domMapping.remove(sourceNode);
 	getSourceNodes().remove(sourceNode);
 	if (sourceNode instanceof INodeNotifier) {
 		((INodeNotifier) sourceNode).removeAdapter(getSorceAdapter());
 	}
-    }
-
-    private Node getParentTable(Node sourceNode, int depth) {
-	Node parentNode = sourceNode.getParentNode();
-	for (int i = 0; parentNode != null && i < depth; parentNode = parentNode
-		.getParentNode(), i++) {
-	    if (HTML.TAG_TABLE.equalsIgnoreCase(parentNode.getNodeName())) {
-		return parentNode;
-	    }
-	}
-	return null;
-    }
-
-    private Node getParentSelect(Node sourceNode) {
-	if (HTML.TAG_OPTION.equalsIgnoreCase(sourceNode.getNodeName())) {
-	    Node parentNode = sourceNode.getParentNode();
-	    if (HTML.TAG_SELECT.equalsIgnoreCase(parentNode.getNodeName())) {
-		return parentNode;
-	    }
-	}
-	return null;
-    }
-
+    }
+
+    private Node getParentTable(Node sourceNode, int depth) {
+	Node parentNode = sourceNode.getParentNode();
+	for (int i = 0; parentNode != null && i < depth; parentNode = parentNode
+		.getParentNode(), i++) {
+	    if (HTML.TAG_TABLE.equalsIgnoreCase(parentNode.getNodeName())) {
+		return parentNode;
+	    }
+	}
+	return null;
+    }
+
+    private Node getParentSelect(Node sourceNode) {
+	if (HTML.TAG_OPTION.equalsIgnoreCase(sourceNode.getNodeName())) {
+	    Node parentNode = sourceNode.getParentNode();
+	    if (HTML.TAG_SELECT.equalsIgnoreCase(parentNode.getNodeName())) {
+		return parentNode;
+	    }
+	}
+	return null;
+    }
+
 //    public void setText(Node sourceText) {
 //	Node sourceParent = sourceText.getParentNode();
 //	if (sourceParent != null && sourceParent.getLocalName() != null) {
@@ -888,1206 +890,1206 @@
 //			return;
 //		    }
     public boolean setText(Node sourceText) {
-		Node sourceParent = sourceText.getParentNode();
-		if (sourceParent != null && sourceParent.getLocalName() != null) {
-			String sourceParentName = sourceParent.getLocalName();
-			if (HTML.TAG_TEXTAREA.equalsIgnoreCase(sourceParentName)
-					|| HTML.TAG_OPTION.equalsIgnoreCase(sourceParentName)) {
-				updateNode(sourceText.getParentNode());
+	Node sourceParent = sourceText.getParentNode();
+	if (sourceParent != null && sourceParent.getLocalName() != null) {
+	    String sourceParentName = sourceParent.getLocalName();
+	    if (HTML.TAG_TEXTAREA.equalsIgnoreCase(sourceParentName)
+		    || HTML.TAG_OPTION.equalsIgnoreCase(sourceParentName)) {
+		updateNode(sourceText.getParentNode());
 				return true;
-			}
-		}
-		nsIDOMNode visualText = domMapping.getVisualNode(sourceText);
-		if (visualText != null) {
-			String visualValue = TextUtil.visualText(sourceText.getNodeValue());
-			visualText.setNodeValue(visualValue);
-		} else {
-			VpeNodeMapping nodeMapping = domMapping
-					.getNodeMapping(sourceParent);
-			if (nodeMapping != null
-					&& nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
-				VpeTemplate template = ((VpeElementMapping) nodeMapping)
-						.getTemplate();
-				if (template != null) {
-					if (!template.containsText()) {
+	    }
+	}
+	nsIDOMNode visualText = domMapping.getVisualNode(sourceText);
+	if (visualText != null) {
+	    String visualValue = TextUtil.visualText(sourceText.getNodeValue());
+	    visualText.setNodeValue(visualValue);
+	}else {
+	    VpeNodeMapping nodeMapping = domMapping
+		    .getNodeMapping(sourceParent);
+	    if (nodeMapping != null
+		    && nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
+		VpeTemplate template = ((VpeElementMapping) nodeMapping)
+			.getTemplate();
+		if (template != null) {
+		    if (!template.containsText()) {
 						return false;
-					}
-				}
-			}
-			updateNode(sourceText);
+		    }
+		}
+	    }
+	    updateNode(sourceText);
 			return true;
-		}
+	}
 
 		// }
 		// updateNode(sourceText);
 		return false;
-	}
+    }
 // }
-
-    public void setAttribute(Element sourceElement, String name, String value) {
-	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
-		.getNodeMapping(sourceElement);
-	if (elementMapping != null) {
-	    if (elementMapping.isIfDependencyFromAttribute(name)) {
-		updateElement(sourceElement);
-	    } else {
-		VpeTemplate template = elementMapping.getTemplate();
-		if (elementMapping.getBorder() != null) {
-		    updateElement(sourceElement);
-		} else if (template.isRecreateAtAttrChange(pageContext,
-			sourceElement, visualDocument,
-			(nsIDOMElement) elementMapping.getVisualNode(),
-			elementMapping.getData(), name, value)) {
-		    updateElement(sourceElement);
-		} else {
-		    nsIDOMElement visualElement = (nsIDOMElement) elementMapping
-			    .getVisualNode();
-		    if (visualElement != null) {
-			String visualElementName = visualElement.getNodeName();
-			if (HTML.TAG_SELECT.equalsIgnoreCase(visualElementName)) {
-			    updateElement(sourceElement);
-			    return;
-			} else if (HTML.TAG_OPTION
-				.equalsIgnoreCase(visualElementName)) {
-			    updateElement(sourceElement.getParentNode());
-			    return;
-			} else if (HTML.TAG_INPUT
-				.equalsIgnoreCase(visualElementName)) {
-			    updateElement(sourceElement);
-			}
-		    }
-		    setXmlnsAttribute(elementMapping, name, value);
-		    template.setAttribute(pageContext, sourceElement,
-			    visualDocument, visualElement, elementMapping
-				    .getData(), name, value);
-		    resetTooltip(sourceElement, visualElement);
-		}
-	    }
-	}
-    }
-
-    public void stopToggle(Node sourceNode) {
-	if (!(sourceNode instanceof Element))
-	    return;
-
-	Element sourceElement = (Element) sourceNode;
-	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
-		.getNodeMapping(sourceElement);
-	if (elementMapping != null) {
-	    VpeTemplate template = elementMapping.getTemplate();
-
-	    if (template instanceof VpeToggableTemplate) {
-		((VpeToggableTemplate) template).stopToggling(sourceElement);
-	    }
-	}
-    }
-
-    public boolean doToggle(nsIDOMNode visualNode) {
-	if (visualNode == null)
-	    return false;
-	nsIDOMElement visualElement = null;
-	try {
-
-	    visualElement = (nsIDOMElement) visualNode
-		    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
-	} catch (XPCOMException exception) {
-	    visualElement = (nsIDOMElement) visualNode.getParentNode()
-		    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
-	}
-	if (visualElement == null)
-	    return false;
-
-	nsIDOMAttr toggleIdAttr = visualElement
-		.getAttributeNode("vpe-user-toggle-id");
-	if (toggleIdAttr == null)
-	    return false;
-	String toggleId = toggleIdAttr.getNodeValue();
-
-	if (toggleId == null)
-	    return false;
-
-	boolean toggleLookup = false;
-	nsIDOMAttr toggleLookupAttr = visualElement
-		.getAttributeNode("vpe-user-toggle-lookup-parent");
-	if (toggleLookupAttr != null) {
-	    toggleLookup = "true".equals(toggleLookupAttr.getNodeValue());
-	}
-
-	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
-		.getNodeMapping(getLastSelectedElement());
-	Node sourceNode = (Node) domMapping
-		.getSourceNode(getLastSelectedElement());
-	if (sourceNode == null)
-	    return false;
-
-	Element sourceElement = (Element) (sourceNode instanceof Element ? sourceNode
-		: sourceNode.getParentNode());
-
-	if (elementMapping != null) {
-	    VpeTemplate template = elementMapping.getTemplate();
-
-	    while (toggleLookup && sourceElement != null
-		    && !(template instanceof VpeToggableTemplate)) {
-		sourceElement = (Element) sourceElement.getParentNode();
-		if (sourceElement == null)
-		    break;
-		elementMapping = (VpeElementMapping) domMapping
-			.getNodeMapping(sourceElement);
-		if (elementMapping == null)
-		    continue;
-		template = elementMapping.getTemplate();
-	    }
-
-	    if (template instanceof VpeToggableTemplate) {
-		((VpeToggableTemplate) template).toggle(this, sourceElement,
-			toggleId);
-		updateElement(sourceElement);
-		return true;
-	    }
-	}
-	return false;
-    }
-
-    public void removeAttribute(Element sourceElement, String name) {
-	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
-		.getNodeMapping(sourceElement);
-	if (elementMapping != null) {
-	    if (elementMapping.isIfDependencyFromAttribute(name)) {
-		updateElement(sourceElement);
-	    } else {
-		VpeTemplate template = elementMapping.getTemplate();
-		if (template.isRecreateAtAttrChange(pageContext, sourceElement,
-			visualDocument, (nsIDOMElement) elementMapping
-				.getVisualNode(), elementMapping.getData(),
-			name, null)) {
-		    updateElement(sourceElement);
-		} else {
-		    removeXmlnsAttribute(elementMapping, name);
-		    template.removeAttribute(pageContext, sourceElement,
-			    visualDocument, (nsIDOMElement) elementMapping
-				    .getVisualNode(), elementMapping.getData(),
-			    name);
-		    resetTooltip(sourceElement, (nsIDOMElement) elementMapping
-			    .getVisualNode());
-		}
-	    }
-	}
-    }
-
-    public void refreshBundleValues(Element sourceElement) {
-	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
-		.getNodeMapping(sourceElement);
-	if (elementMapping != null) {
-	    VpeTemplate template = elementMapping.getTemplate();
-	    template.refreshBundleValues(pageContext, sourceElement,
-		    elementMapping.getData());
-	}
-    }
-
-    boolean isContentArea(nsIDOMNode visualNode) {
-	return visualContentArea.equals(visualNode);
-    }
-
-    nsIDOMElement getContentArea() {
-	return visualContentArea;
-    }
-
-    void setSelectionRectangle(nsIDOMElement visualElement) {
-	setSelectionRectangle(visualElement, true);
-    }
-
-    void setSelectionRectangle(nsIDOMElement visualElement, boolean scroll) {
-	int resizerConstrains = getResizerConstrains(visualElement);
-	visualEditor.setSelectionRectangle(visualElement, resizerConstrains,
-		scroll);
-    }
-
-    public nsIDOMNode addLinkNodeToHead(String href_val, String ext_val) {
-	nsIDOMElement newNode = createLinkNode(href_val,
-		ATTR_REL_STYLESHEET_VALUE, ext_val);
-	headNode.appendChild(newNode);
-	return newNode;
-    }
-
-    public nsIDOMNode replaceLinkNodeToHead(nsIDOMNode oldNode,
-	    String href_val, String ext_val) {
-	nsIDOMNode newNode = createLinkNode(href_val,
-		ATTR_REL_STYLESHEET_VALUE, ext_val);
-	headNode.replaceChild(newNode, oldNode);
-	return newNode;
-    }
-
-    public nsIDOMNode replaceLinkNodeToHead(String href_val, String ext_val) {
-	nsIDOMNode newNode = null;
-	nsIDOMNode oldNode = getLinkNode(href_val, ext_val);
-	if (oldNode == null) {
-	    newNode = addLinkNodeToHead(href_val, ext_val);
-	}
-	return newNode;
-    }
-
-    public void removeLinkNodeFromHead(nsIDOMNode node) {
-	headNode.removeChild(node);
-    }
-
-    private nsIDOMElement createLinkNode(String href_val, String rel_val,
-	    String ext_val) {
-	nsIDOMElement linkNode = null;
-	if ((ATTR_REL_STYLESHEET_VALUE.equalsIgnoreCase(rel_val))
-		&& href_val.startsWith("file:")) {
-	    /*
-	     * Because of the Mozilla caches the linked css files we replace tag
-	     * <link rel="styleseet" href="file://..."> with tag <style
-	     * vpe="ATTR_VPE_INLINE_LINK_VALUE">file content</style> It is
-	     * LinkReplacer
-	     */
-	    linkNode = visualDocument.createElement(HTML.TAG_STYLE);
-	    linkNode.setAttribute(ATTR_VPE, ATTR_VPE_INLINE_LINK_VALUE);
-
-	    /* Copy links attributes into our <style> */
-	    linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_HREF, href_val);
-	    linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_EXT, ext_val);
-	    try {
-		StringBuffer styleText = new StringBuffer(EMPTY_STRING);
-		URL url = new URL((new Path(href_val)).toOSString());
-		String fileName = url.getFile();
-		BufferedReader in = new BufferedReader(new FileReader(
-			(fileName)));
-		String str = EMPTY_STRING;
-		while ((str = in.readLine()) != null) {
-		    styleText.append(str);
-		}
-
-		String styleForParse = styleText.toString();
-		styleForParse = VpeStyleUtil.addFullPathIntoURLValue(
-			styleForParse, href_val);
-
-		in.close();
-		nsIDOMText textNode = visualDocument
-			.createTextNode(styleForParse);
-		linkNode.appendChild(textNode);
-		return linkNode;
-	    } catch (FileNotFoundException fnfe) {
-		/* File which was pointed by user is not exists. Do nothing. */
-	    } catch (IOException ioe) {
-		VpePlugin.getPluginLog().logError(ioe.getMessage(), ioe);
-	    }
-	}
-
-	linkNode = visualDocument.createElement(HTML.TAG_LINK);
-	linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_REL, rel_val);
-	linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_HREF, href_val);
-	linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_EXT, ext_val);
-
-	return linkNode;
-    }
-
-    private boolean isLinkReplacer(nsIDOMNode node) {
-	return HTML.TAG_STYLE.equalsIgnoreCase(node.getNodeName())
-		&& ATTR_VPE_INLINE_LINK_VALUE
-			.equalsIgnoreCase(((nsIDOMElement) node
-				.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
-				.getAttribute(ATTR_VPE));
-    }
-
-    private nsIDOMNode getLinkNode(String href_val, String ext_val) {
-	nsIDOMNodeList children = headNode.getChildNodes();
-	long len = children.getLength();
-	for (long i = len - 1; i >= 0; i--) {
-	    nsIDOMNode node = children.item(i);
-	    if (node.getNodeType() == Node.ELEMENT_NODE) {
-		if (HTML.TAG_LINK.equalsIgnoreCase(node.getNodeName())
-			|| isLinkReplacer(node)) {
-		    nsIDOMElement element = (nsIDOMElement) node
-			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
-		    if (ext_val.equalsIgnoreCase(element
-			    .getAttribute(VpeTemplateManager.ATTR_LINK_EXT))
-			    && href_val
-				    .equalsIgnoreCase(element
-					    .getAttribute(VpeTemplateManager.ATTR_LINK_HREF))) {
-			return node;
-		    }
-		}
-	    }
-	}
-	return null;
-    }
-
-    private void cleanHead() {
-	nsIDOMNodeList children = headNode.getChildNodes();
-	long len = children.getLength();
-	for (long i = len - 1; i >= 0; i--) {
-	    nsIDOMNode node = children.item(i);
-	    if (node.getNodeType() == Node.ELEMENT_NODE) {
-		String name = node.getNodeName();
-		if (HTML.TAG_LINK.equalsIgnoreCase(name)
-			|| isLinkReplacer(node)) {
-		    if (NO_STRING.equalsIgnoreCase(((nsIDOMElement) node
-			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
-			    .getAttribute("ext"))) {
-			// int linkAddress =
-			// MozillaSupports.queryInterface(node,
-			// nsIStyleSheetLinkingElement.NS_ISTYLESHEETLINKINGELEMENT_IID);
-			// nsIStyleSheetLinkingElement linkingElement = new
-			// nsIStyleSheetLinkingElement(linkAddress);
-			// linkingElement.removeStyleSheet();
-			node = headNode.removeChild(node);
-		    }
-		} else if (HTML.TAG_STYLE.equalsIgnoreCase(node.getNodeName())
-			&& (!YES_STRING
-				.equalsIgnoreCase(((nsIDOMElement) node
-					.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
-					.getAttribute(ATTR_VPE)))) {
-		    node = headNode.removeChild(node);
-		}
-	    }
-	}
-    }
-
-    private class PseudoInfo {
-	private nsIDOMNode pseudoNode;
-	private boolean isElements;
-
-	private PseudoInfo() {
-	    this(null, false);
-	}
-
-	private PseudoInfo(nsIDOMNode pseudoNode, boolean isElements) {
-	    this.pseudoNode = pseudoNode;
-	    this.isElements = isElements;
-	}
-    }
-
-    void showDragCaret(nsIDOMNode node, int offset) {
-	xulRunnerEditor.showDragCaret(node, offset);
-    }
-
-    void hideDragCaret() {
-
-	xulRunnerEditor.hideDragCaret();
-    }
-
-    private int getResizerConstrains(nsIDOMNode visualNode) {
-	VpeNodeMapping nodeMapping = domMapping.getNodeMapping(visualNode);
-	if (nodeMapping != null
-		&& nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
-	    return ((VpeElementMapping) nodeMapping).getTemplate()
-		    .getTagDescription(pageContext,
-			    (Element) nodeMapping.getSourceNode(),
-			    visualDocument,
-			    (nsIDOMElement) nodeMapping.getVisualNode(),
-			    ((VpeElementMapping) nodeMapping).getData())
-		    .getResizeConstrains();
-	}
-	return VpeTagDescription.RESIZE_CONSTRAINS_NONE;
-    }
-
-    public void resize(nsIDOMElement element, int resizerConstrains, int top,
-	    int left, int width, int height) {
-	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
-		.getNodeMapping(element);
-	if (elementMapping != null) {
-	    elementMapping.getTemplate().resize(pageContext,
-		    (Element) elementMapping.getSourceNode(), visualDocument,
-		    element, elementMapping.getData(), resizerConstrains, top,
-		    left, width, height);
-	}
-    }
-
-    static boolean isAnonElement(nsIDOMNode visualNode) {
-	if (visualNode != null
-		&& visualNode.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
-	    String attrValue = ((nsIDOMElement) visualNode
-		    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
-		    .getAttribute(MOZ_ANONCLASS_ATTR);
-
-	    return attrValue != null && attrValue.length() > 0;
-	}
-
-	return false;
-    }
-
-    boolean canInnerDrag(nsIDOMElement visualDragElement) {
-	VpeNodeMapping node = domMapping.getNodeMapping(visualDragElement);
-	if (node instanceof VpeElementMapping) {
-	    VpeElementMapping elementMapping = (VpeElementMapping) node;
-	    if (elementMapping != null) {
-		return elementMapping.getTemplate().canInnerDrag(pageContext,
-			(Element) elementMapping.getSourceNode(),
-			visualDocument, visualDragElement,
-			elementMapping.getData());
-	    }
-	}
-	return false;
-    }
-
-    VpeSourceInnerDropInfo getSourceInnerDropInfo(Node sourceDragNode,
-	    VpeVisualInnerDropInfo visualDropInfo, boolean checkParentTemplates) {
-	nsIDOMNode visualDropContainer = visualDropInfo.getDropContainer();
-	long visualDropOffset = visualDropInfo.getDropOffset();
-	Node sourceDropContainer = null;
-	int sourceDropOffset = 0;
-
-	switch (visualDropContainer.getNodeType()) {
-	case nsIDOMNode.ELEMENT_NODE:
-	    nsIDOMNode visualOffsetNode = null;
-	    boolean afterFlag = false;
-	    long visualChildCount = VisualDomUtil
-		    .getChildCount(visualDropContainer);
-	    if (visualDropOffset < visualChildCount) {
-		visualOffsetNode = VisualDomUtil.getChildNode(
-			visualDropContainer, visualDropOffset);
-		if (isPseudoElement(visualOffsetNode)
-			|| isAnonElement(visualOffsetNode)) {
-		    visualOffsetNode = getLastAppreciableVisualChild(visualDropContainer);
-		    afterFlag = true;
-		}
-	    } else {
-		visualOffsetNode = getLastAppreciableVisualChild(visualDropContainer);
-		afterFlag = visualChildCount != 0;
-	    }
-	    if (visualOffsetNode != null) {
-		Node sourceOffsetNode = domMapping
-			.getSourceNode(visualOffsetNode);
-		if (sourceOffsetNode != null) {
-		    sourceDropContainer = sourceOffsetNode.getParentNode();
-		    sourceDropOffset = ((NodeImpl) sourceOffsetNode).getIndex();
-		    if (afterFlag) {
-			sourceDropOffset++;
-		    }
-		}
-	    }
-	    if (sourceDropContainer == null) {
-		sourceDropContainer = domMapping
-			.getNearSourceNode(visualDropContainer);
-		if (sourceDropContainer != null) {
-		    sourceDropOffset = sourceDropContainer.getChildNodes()
-			    .getLength();
-		}
-	    }
-	    if (sourceDropContainer == null) {
-		sourceDropContainer = domMapping
-			.getNearSourceNode(visualContentArea);
-		sourceDropOffset = sourceDropContainer.getChildNodes()
-			.getLength();
-	    }
-	    break;
-	case nsIDOMNode.TEXT_NODE:
-	    VpeNodeMapping nodeMapping = domMapping
-		    .getNearNodeMapping(visualDropContainer);
-	    switch (nodeMapping.getType()) {
-	    case VpeNodeMapping.TEXT_MAPPING:
-		sourceDropContainer = nodeMapping.getSourceNode();
-		sourceDropOffset = TextUtil.sourceInnerPosition(
-			sourceDropContainer.getNodeValue(), visualDropOffset);
-		break;
-	    case VpeNodeMapping.ELEMENT_MAPPING:
-		// it's attribute
-		if (isTextEditable(visualDropContainer)) {
-		    String[] atributeNames = ((VpeElementMapping) nodeMapping)
-			    .getTemplate().getOutputAtributeNames();
-		    if (atributeNames != null && atributeNames.length > 0) {
-			Element sourceElement = (Element) nodeMapping
-				.getSourceNode();
-			sourceDropContainer = sourceElement
-				.getAttributeNode(atributeNames[0]);
-			sourceDropOffset = TextUtil.sourceInnerPosition(
-				sourceDropContainer.getNodeValue(),
-				visualDropOffset);
-		    }
-		}
-		nodeMapping.getVisualNode();
-	    }
-	    break;
-	}
-	if (sourceDropContainer != null) {
-	    return getSourceInnerDropInfo(sourceDragNode, sourceDropContainer,
-		    sourceDropOffset, checkParentTemplates);
-	} else {
-	    return new VpeSourceInnerDropInfo(null, 0, false);
-	}
-    }
-
-    VpeSourceInnerDropInfo getSourceInnerDropInfo(Node dragNode,
-	    Node container, int offset, boolean checkParentsTemplates) {
-	// Thread.dumpStack();
-	boolean canDrop = false;
-	switch (container.getNodeType()) {
-	case Node.ELEMENT_NODE:
-	    VpeNodeMapping nodeMapping = domMapping.getNodeMapping(container);
-	    if (nodeMapping != null
-		    && nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
-		canDrop = ((VpeElementMapping) nodeMapping).getTemplate()
-			.canInnerDrop(pageContext, container, dragNode);
-	    }
-	    if (!canDrop) {
-		if (!checkParentsTemplates)
-		    return new VpeSourceInnerDropInfo(container, offset,
-			    canDrop);
-		// offset = ((NodeImpl)container).getIndex();
-		// container = container.getParentNode();
-		// TODO Max Areshkau unclear logic , if we can drop on element
-		// why we trying to drop
-		// this on parent
-		// return getSourceInnerDropInfo(dragNode, container, offset,
-		// false);
-		return new VpeSourceInnerDropInfo(container, offset, canDrop);
-	    }
-	    break;
-	case Node.TEXT_NODE:
-	case Node.DOCUMENT_NODE:
-	    canDrop = true;
-	    break;
-	case Node.ATTRIBUTE_NODE:
-	    canDrop = true;
-	    break;
-	}
-	if (canDrop) {
-	    return new VpeSourceInnerDropInfo(container, offset, canDrop);
-	} else {
-	    return new VpeSourceInnerDropInfo(null, 0, canDrop);
-	}
-    }
-
-    public void innerDrop(Node dragNode, Node container, int offset) {
-	VpeNodeMapping mapping = domMapping.getNearNodeMapping(container);
-	if (mapping != null) {
-	    nsIDOMNode visualDropContainer = mapping.getVisualNode();
-	    switch (mapping.getType()) {
-	    case VpeNodeMapping.TEXT_MAPPING:
-		break;
-	    case VpeNodeMapping.ELEMENT_MAPPING:
-		nsIDOMNode visualParent = visualDropContainer.getParentNode();
-		VpeNodeMapping oldMapping = mapping;
-		mapping = domMapping.getNearNodeMapping(visualParent);
-		if (mapping != null
-			&& mapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
-		    ((VpeElementMapping) mapping).getTemplate()
-			    .innerDrop(
-				    pageContext,
-				    new VpeSourceInnerDragInfo(dragNode, 0, 0),
-				    new VpeSourceInnerDropInfo(container,
-					    offset, true));
-		} else {
-		    ((VpeElementMapping) oldMapping).getTemplate()
-			    .innerDrop(
-				    pageContext,
-				    new VpeSourceInnerDragInfo(dragNode, 0, 0),
-				    new VpeSourceInnerDropInfo(container,
-					    offset, true));
-		}
-	    }
-
-	}
-    }
-
-    void innerDrop(VpeSourceInnerDragInfo dragInfo,
-	    VpeSourceInnerDropInfo dropInfo) {
-	dropper.drop(pageContext, dragInfo, dropInfo);
-    }
-
-    nsIDOMElement getNearDragElement(Element visualElement) {
-	VpeElementMapping elementMapping = domMapping
-		.getNearElementMapping(visualElement);
-	while (elementMapping != null) {
-	    if (canInnerDrag(elementMapping.getVisualElement())) {
-		return elementMapping.getVisualElement();
-	    }
-	    elementMapping = domMapping.getNearElementMapping(elementMapping
-		    .getVisualNode().getParentNode());
-	}
-	return null;
-    }
-
-    nsIDOMElement getDragElement(nsIDOMElement visualElement) {
-	VpeElementMapping elementMapping = domMapping
-		.getNearElementMapping(visualElement);
-	if (elementMapping != null
-		&& canInnerDrag(elementMapping.getVisualElement())) {
-	    return elementMapping.getVisualElement();
-	}
-	return null;
-    }
-
-    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;
-			}
-		    }
-		}
-		nsIDOMAttr classAttr = element.getAttributeNode("class");
-		if (classAttr != null) {
-		    String classValue = classAttr.getNodeValue().trim();
-		    if ("__any__tag__caption".equals(classValue)) {
-			return false;
-		    }
-		}
-	    }
-	}
-	return true;
-    }
-
-    VpeVisualInnerDropInfo getInnerDropInfo(Node sourceDropContainer,
-	    int sourceDropOffset) {
-	nsIDOMNode visualDropContainer = null;
-	long visualDropOffset = 0;
-
-	switch (sourceDropContainer.getNodeType()) {
-	case Node.TEXT_NODE:
-	    visualDropContainer = domMapping.getVisualNode(sourceDropContainer);
-	    visualDropOffset = TextUtil.visualInnerPosition(sourceDropContainer
-		    .getNodeValue(), sourceDropOffset);
-	    break;
-	case Node.ELEMENT_NODE:
-	case Node.DOCUMENT_NODE:
-	    NodeList sourceChildren = sourceDropContainer.getChildNodes();
-	    if (sourceDropOffset < sourceChildren.getLength()) {
-		Node sourceChild = sourceChildren.item(sourceDropOffset);
-		nsIDOMNode visualChild = domMapping.getVisualNode(sourceChild);
-		if (visualChild != null) {
-		    visualDropContainer = visualChild.getParentNode();
-
-		    visualDropOffset = VisualDomUtil.getOffset(visualChild);
-		}
-	    }
-	    if (visualDropContainer == null) {
-		visualDropContainer = domMapping
-			.getNearVisualNode(sourceDropContainer);
-		nsIDOMNode visualChild = getLastAppreciableVisualChild(visualDropContainer);
-		if (visualChild != null) {
-		    visualDropOffset = VisualDomUtil.getOffset(visualChild) + 1;
-		} else {
-		    visualDropOffset = 0;
-		}
-	    }
-	    break;
-	case Node.ATTRIBUTE_NODE:
-	    Element sourceElement = ((Attr) sourceDropContainer)
-		    .getOwnerElement();
-	    VpeElementMapping elementMapping = domMapping
-		    .getNearElementMapping(sourceElement);
-	    nsIDOMNode textNode = elementMapping.getTemplate()
-		    .getOutputTextNode(pageContext, sourceElement,
-			    elementMapping.getData());
-	    if (textNode != null) {
-		visualDropContainer = textNode;
-		visualDropOffset = TextUtil.visualInnerPosition(
-			sourceDropContainer.getNodeValue(), sourceDropOffset);
-	    }
-	    break;
-	}
-	if (visualDropContainer == null) {
-	    return null;
-	}
-	return new VpeVisualInnerDropInfo(visualDropContainer,
-		visualDropOffset, 0, 0);
-    }
-
-    protected void setTooltip(Element sourceElement, nsIDOMElement visualElement) {
-	if (visualElement != null && sourceElement != null
-		&& !((ElementImpl) sourceElement).isJSPTag()) {
-	    if (HTML.TAG_HTML.equalsIgnoreCase(sourceElement.getNodeName()))
-		return;
-	    String titleValue = getTooltip(sourceElement);
-
-	    if (titleValue != null) {
-		titleValue = titleValue.replaceAll("&", "&amp;");
-		titleValue = titleValue.replaceAll("<", "&lt;");
-		titleValue = titleValue.replaceAll(">", "&gt;");
-	    }
-
-	    if (titleValue != null) {
-		// visualElement.setAttribute("title", titleValue);
-		setTooltip(visualElement, titleValue);
-	    }
-	}
-    }
-
-    protected void setTooltip(nsIDOMElement visualElement, String titleValue) {
-	visualElement.setAttribute("title", titleValue);
-	nsIDOMNodeList children = visualElement.getChildNodes();
-	long len = children.getLength();
-	for (long i = 0; i < len; i++) {
-	    nsIDOMNode child = children.item(i);
-	    if (child.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
-		setTooltip(((nsIDOMElement) child
-			.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID)),
-			titleValue);
-	    }
-	}
-    }
-
-    private void resetTooltip(Element sourceElement, nsIDOMElement visualElement) {
-	if (visualElement != null && sourceElement != null
-		&& !((ElementImpl) sourceElement).isJSPTag()) {
-	    if (HTML.TAG_HTML.equalsIgnoreCase(sourceElement.getNodeName()))
-		return;
-	    String titleValue = getTooltip(sourceElement);
-
-	    if (titleValue != null) {
-		titleValue = titleValue.replaceAll("&", "&amp;");
-		titleValue = titleValue.replaceAll("<", "&lt;");
-		titleValue = titleValue.replaceAll(">", "&gt;");
-	    }
-
-	    if (titleValue != null) {
-		resetTooltip(visualElement, titleValue);
-	    }
-	}
-    }
-
-    private void resetTooltip(nsIDOMElement visualElement, String titleValue) {
-	visualElement.setAttribute("title", titleValue);
-	nsIDOMNodeList children = visualElement.getChildNodes();
-	long len = children.getLength();
-	for (long i = 0; i < len; i++) {
-	    nsIDOMNode child = children.item(i);
-	    if (child.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
-		if (domMapping.getNodeMapping(child) == null) {
-		    resetTooltip((nsIDOMElement) child
-			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID),
-			    titleValue);
-		}
-	    }
-	}
-    }
-
-    private String getTooltip(Element sourceElement) {
-	StringBuffer buffer = new StringBuffer();
-	buffer.append(sourceElement.getNodeName());
-	NamedNodeMap attrs = sourceElement.getAttributes();
-	int len = attrs.getLength();
-	for (int i = 0; i < len; i++) {
-	    if (i == 7) {
-		return buffer.append("\n\t... ").toString();
-	    }
-	    int valueLength = attrs.item(i).getNodeValue().length();
-	    if (valueLength > 30) {
-		StringBuffer temp = new StringBuffer();
-		temp.append(attrs.item(i).getNodeValue().substring(0, 15)
-			+ " ... "
-			+ attrs.item(i).getNodeValue().substring(
-				valueLength - 15, valueLength));
-		buffer.append("\n" + attrs.item(i).getNodeName() + ": " + temp);
-	    } else
-		buffer.append("\n" + attrs.item(i).getNodeName() + ": "
-			+ attrs.item(i).getNodeValue());
-
-	}
-
-	return buffer.toString();
-    }
-
-    Rectangle getNodeBounds(nsIDOMNode visualNode) {
-
-	return XulRunnerVpeUtils.getElementBounds(visualNode);
-    }
-
-    static boolean canInsertAfter(int x, int y, Rectangle rect) {
-	if (y > (rect.y + rect.height) || x > (rect.x + rect.width)) {
-	    return true;
-	}
-	return y >= rect.x && x > (rect.x + rect.width / 2);
-    }
-
-    static nsIDOMNode getLastAppreciableVisualChild(nsIDOMNode visualParent) {
-	nsIDOMNode visualLastChild = null;
-	nsIDOMNodeList visualChildren = visualParent.getChildNodes();
-	long len = visualChildren.getLength();
-	for (long i = len - 1; i >= 0; i--) {
-	    nsIDOMNode visualChild = visualChildren.item(i);
-	    if (!isPseudoElement(visualChild) && !isAnonElement(visualChild)) {
-		visualLastChild = visualChild;
-		break;
-	    }
-	}
-	return visualLastChild;
-    }
-
-    void correctVisualDropPosition(VpeVisualInnerDropInfo newVisualDropInfo,
-	    VpeVisualInnerDropInfo oldVisualDropInfo) {
-	nsIDOMNode newVisualDropContainer = newVisualDropInfo
-		.getDropContainer();
-	nsIDOMNode oldVisualDropContainer = oldVisualDropInfo
-		.getDropContainer();
-
-	if (newVisualDropContainer.equals(oldVisualDropContainer)) {
-	    newVisualDropInfo.setDropOffset(oldVisualDropInfo.getDropOffset());
-	    return;
-	}
-
-	nsIDOMNode child = oldVisualDropContainer;
-	while (child != null && child.getNodeType() != Node.DOCUMENT_NODE) {
-	    nsIDOMNode parent = child.getParentNode();
-	    if (newVisualDropContainer.equals(parent)) {
-		long offset = VisualDomUtil.getOffset(child);
-		Rectangle rect = getNodeBounds(child);
-		if (canInsertAfter(oldVisualDropInfo.getMouseX(),
-			oldVisualDropInfo.getMouseY(), rect)) {
-		    offset++;
-		}
-		newVisualDropInfo.setDropOffset(offset);
-	    }
-	    child = parent;
-	}
-    }
-
-    public nsIDOMRange createDOMRange() {
-	return xulRunnerEditor.createDOMRange();
-    }
-
-    public nsIDOMRange createDOMRange(nsIDOMNode selectedNode) {
-	nsIDOMRange range = createDOMRange();
-	range.selectNode(selectedNode);
-	return range;
-    }
-
-    public static boolean isIncludeElement(nsIDOMElement visualElement) {
-	return YES_STRING.equalsIgnoreCase(visualElement
-		.getAttribute(INCLUDE_ELEMENT_ATTR));
-    }
-
-    public static void markIncludeElement(nsIDOMElement visualElement) {
-	visualElement.setAttribute(INCLUDE_ELEMENT_ATTR, YES_STRING);
-    }
-
-    protected void setReadOnlyElement(nsIDOMElement node) {
-	String style = node.getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
-	style = VpeStyleUtil.setParameterInStyle(style, "-moz-user-modify",
-		"read-only");
-	node.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
-    }
-
-    void setMoveCursor(nsIDOMMouseEvent mouseEvent) {
-
-	nsIDOMElement selectedElement = xulRunnerEditor
-		.getLastSelectedElement();
-	if (selectedElement != null && canInnerDrag(selectedElement)) {
-	    String styleClasses = selectedElement.getAttribute(HTML.ATTR_CLASS);
-	    if (inDragArea(getNodeBounds(selectedElement), VisualDomUtil
-		    .getMousePoint(mouseEvent))) {
-		// change cursor
-		if (styleClasses == null
-			|| !(styleClasses.contains(ATTR_DRAG_AVAILABLE_CLASS))) {
-		    // change cursor style to move
-		    styleClasses = ATTR_DRAG_AVAILABLE_CLASS + " "
-			    + styleClasses;
-		}
-	    } else {
-		// change cursor style to normal
-		if (styleClasses != null) {
-
-		    styleClasses = styleClasses.replaceAll(
-			    ATTR_DRAG_AVAILABLE_CLASS, "");
-		}
-	    }
-	    selectedElement.setAttribute(HTML.ATTR_CLASS, styleClasses);
-	}
-    }
-
-    private boolean inDragArea(Rectangle dragArea, Point mousePoint) {
-	// TODO add drag and drop support
-	return dragArea.contains(mousePoint)
-		&& mousePoint.x < (dragArea.x + DRAG_AREA_WIDTH)
-		&& mousePoint.y < (dragArea.y + DRAG_AREA_HEIGHT);
-    }
-
-    nsIDOMElement getDragElement(nsIDOMMouseEvent mouseEvent) {
-
-	nsIDOMElement selectedElement = xulRunnerEditor
-		.getLastSelectedElement();
-	if (selectedElement != null && canInnerDrag(selectedElement)) {
-	    if (inDragArea(getNodeBounds(selectedElement), VisualDomUtil
-		    .getMousePoint(mouseEvent))) {
-		return selectedElement;
-	    }
-	}
-	return null;
-    }
-
-    VpeSourceInnerDragInfo getSourceInnerDragInfo(
-	    VpeVisualInnerDragInfo visualDragInfo) {
-	nsIDOMNode visualNode = visualDragInfo.getNode();
-	int offset = visualDragInfo.getOffset();
-	int length = visualDragInfo.getLength();
-
-	VpeNodeMapping nodeMapping = domMapping.getNearNodeMapping(visualNode);
-	Node sourceNode = nodeMapping.getSourceNode();
-
-	if (sourceNode != null) {
-	    switch (sourceNode.getNodeType()) {
-	    case Node.TEXT_NODE:
-		int end = TextUtil.sourceInnerPosition(visualNode
-			.getNodeValue(), offset + length);
-		offset = TextUtil.sourceInnerPosition(
-			visualNode.getNodeValue(), offset);
-		length = end - offset;
-		break;
-	    case Node.ELEMENT_NODE:
-		if (visualNode.getNodeType() == Node.TEXT_NODE) {
-		    // it's attribute
-		    sourceNode = null;
-		    if (isTextEditable(visualNode)) {
-			String[] atributeNames = ((VpeElementMapping) nodeMapping)
-				.getTemplate().getOutputAtributeNames();
-			if (atributeNames != null && atributeNames.length > 0) {
-			    Element sourceElement = (Element) nodeMapping
-				    .getSourceNode();
-			    sourceNode = sourceElement
-				    .getAttributeNode(atributeNames[0]);
-			    end = TextUtil.sourceInnerPosition(visualNode
-				    .getNodeValue(), offset + length);
-			    offset = TextUtil.sourceInnerPosition(visualNode
-				    .getNodeValue(), offset);
-			    length = end - offset;
-			}
-		    }
-		}
-		break;
-	    }
-	}
-	return new VpeSourceInnerDragInfo(sourceNode, offset, length);
-    }
-
-    public nsIDOMText getOutputTextNode(Attr attr) {
-	Element sourceElement = ((Attr) attr).getOwnerElement();
-	VpeElementMapping elementMapping = domMapping
-		.getNearElementMapping(sourceElement);
-	if (elementMapping != null) {
-	    return elementMapping.getTemplate().getOutputTextNode(pageContext,
-		    sourceElement, elementMapping.getData());
-	}
-	return null;
-    }
-
-    nsIDOMElement getLastSelectedElement() {
-
-	return xulRunnerEditor.getLastSelectedElement();
-    }
-
-    public void pushIncludeStack(VpeIncludeInfo includeInfo) {
-	includeStack.add(includeInfo);
-    }
-
-    public VpeIncludeInfo popIncludeStack() {
-	VpeIncludeInfo includeInfo = null;
-	if (includeStack.size() > 0) {
-	    includeInfo = (VpeIncludeInfo) includeStack.remove(includeStack
-		    .size() - 1);
-	}
-	return includeInfo;
-    }
-
-    public boolean isFileInIncludeStack(IFile file) {
-	if (file == null)
-	    return false;
-	for (int i = 0; i < includeStack.size(); i++) {
-	    if (file.equals(((VpeIncludeInfo) includeStack.get(i)).getFile())) {
-		return true;
-	    }
-	}
-	return false;
-    }
-
-    protected boolean isCurrentMainDocument() {
-	return includeStack.size() <= 1;
-    }
-
-    public int getCurrentMainIncludeOffset() {
-	if (includeStack.size() <= 1)
-	    return -1;
-	VpeIncludeInfo info = (VpeIncludeInfo) includeStack.get(1);
-	return ((IndexedRegion) info.getElement()).getStartOffset();
-    }
-
-    public VpeIncludeInfo getCurrentIncludeInfo() {
-	if (includeStack.size() <= 0)
-	    return null;
-	return (VpeIncludeInfo) includeStack.get(includeStack.size() - 1);
-    }
-
-    public VpeIncludeInfo getRootIncludeInfo() {
-	if (includeStack.size() <= 1)
-	    return null;
-	return (VpeIncludeInfo) includeStack.get(1);
-    }
-
+
+    public void setAttribute(Element sourceElement, String name, String value) {
+	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+		.getNodeMapping(sourceElement);
+	if (elementMapping != null) {
+	    if (elementMapping.isIfDependencyFromAttribute(name)) {
+		updateElement(sourceElement);
+	    } else {
+		VpeTemplate template = elementMapping.getTemplate();
+		if (elementMapping.getBorder() != null) {
+		    updateElement(sourceElement);
+		} else if (template.isRecreateAtAttrChange(pageContext,
+			sourceElement, visualDocument,
+			(nsIDOMElement) elementMapping.getVisualNode(),
+			elementMapping.getData(), name, value)) {
+		    updateElement(sourceElement);
+		} else {
+		    nsIDOMElement visualElement = (nsIDOMElement) elementMapping
+			    .getVisualNode();
+		    if (visualElement != null) {
+			String visualElementName = visualElement.getNodeName();
+			if (HTML.TAG_SELECT.equalsIgnoreCase(visualElementName)) {
+			    updateElement(sourceElement);
+			    return;
+			} else if (HTML.TAG_OPTION
+				.equalsIgnoreCase(visualElementName)) {
+			    updateElement(sourceElement.getParentNode());
+			    return;
+			} else if (HTML.TAG_INPUT
+				.equalsIgnoreCase(visualElementName)) {
+			    updateElement(sourceElement);
+			}
+		    }
+//		    setXmlnsAttribute(elementMapping, name, value);
+		    template.setAttribute(pageContext, sourceElement,
+			    visualDocument, visualElement, elementMapping
+				    .getData(), name, value);
+		    resetTooltip(sourceElement, visualElement);
+		}
+	    }
+	}
+    }
+
+    public void stopToggle(Node sourceNode) {
+	if (!(sourceNode instanceof Element))
+	    return;
+
+	Element sourceElement = (Element) sourceNode;
+	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+		.getNodeMapping(sourceElement);
+	if (elementMapping != null) {
+	    VpeTemplate template = elementMapping.getTemplate();
+
+	    if (template instanceof VpeToggableTemplate) {
+		((VpeToggableTemplate) template).stopToggling(sourceElement);
+	    }
+	}
+    }
+
+    public boolean doToggle(nsIDOMNode visualNode) {
+	if (visualNode == null)
+	    return false;
+	nsIDOMElement visualElement = null;
+	try {
+
+	    visualElement = (nsIDOMElement) visualNode
+		    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
+	} catch (XPCOMException exception) {
+	    visualElement = (nsIDOMElement) visualNode.getParentNode()
+		    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
+	}
+	if (visualElement == null)
+	    return false;
+
+	nsIDOMAttr toggleIdAttr = visualElement
+		.getAttributeNode("vpe-user-toggle-id");
+	if (toggleIdAttr == null)
+	    return false;
+	String toggleId = toggleIdAttr.getNodeValue();
+
+	if (toggleId == null)
+	    return false;
+
+	boolean toggleLookup = false;
+	nsIDOMAttr toggleLookupAttr = visualElement
+		.getAttributeNode("vpe-user-toggle-lookup-parent");
+	if (toggleLookupAttr != null) {
+	    toggleLookup = "true".equals(toggleLookupAttr.getNodeValue());
+	}
+
+	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+		.getNodeMapping(getLastSelectedElement());
+	Node sourceNode = (Node) domMapping
+		.getSourceNode(getLastSelectedElement());
+	if (sourceNode == null)
+	    return false;
+
+	Element sourceElement = (Element) (sourceNode instanceof Element ? sourceNode
+		: sourceNode.getParentNode());
+
+	if (elementMapping != null) {
+	    VpeTemplate template = elementMapping.getTemplate();
+
+	    while (toggleLookup && sourceElement != null
+		    && !(template instanceof VpeToggableTemplate)) {
+		sourceElement = (Element) sourceElement.getParentNode();
+		if (sourceElement == null)
+		    break;
+		elementMapping = (VpeElementMapping) domMapping
+			.getNodeMapping(sourceElement);
+		if (elementMapping == null)
+		    continue;
+		template = elementMapping.getTemplate();
+	    }
+
+	    if (template instanceof VpeToggableTemplate) {
+		((VpeToggableTemplate) template).toggle(this, sourceElement,
+			toggleId);
+		updateElement(sourceElement);
+		return true;
+	    }
+	}
+	return false;
+    }
+
+    public void removeAttribute(Element sourceElement, String name) {
+	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+		.getNodeMapping(sourceElement);
+	if (elementMapping != null) {
+	    if (elementMapping.isIfDependencyFromAttribute(name)) {
+		updateElement(sourceElement);
+	    } else {
+		VpeTemplate template = elementMapping.getTemplate();
+		if (template.isRecreateAtAttrChange(pageContext, sourceElement,
+			visualDocument, (nsIDOMElement) elementMapping
+				.getVisualNode(), elementMapping.getData(),
+			name, null)) {
+		    updateElement(sourceElement);
+		} 
+//		else {
+//		    removeXmlnsAttribute(elementMapping, name);
+//		    template.removeAttribute(pageContext, sourceElement,
+//			    visualDocument, (nsIDOMElement) elementMapping
+//				    .getVisualNode(), elementMapping.getData(),
+//			    name);
+//		    resetTooltip(sourceElement, (nsIDOMElement) elementMapping
+//			    .getVisualNode());
+//		}
+	    }
+	}
+    }
+
+    public void refreshBundleValues(Element sourceElement) {
+	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+		.getNodeMapping(sourceElement);
+	if (elementMapping != null) {
+	    VpeTemplate template = elementMapping.getTemplate();
+	    template.refreshBundleValues(pageContext, sourceElement,
+		    elementMapping.getData());
+	}
+    }
+
+    boolean isContentArea(nsIDOMNode visualNode) {
+	return visualContentArea.equals(visualNode);
+    }
+
+    nsIDOMElement getContentArea() {
+	return visualContentArea;
+    }
+
+    void setSelectionRectangle(nsIDOMElement visualElement) {
+	setSelectionRectangle(visualElement, true);
+    }
+
+    void setSelectionRectangle(nsIDOMElement visualElement, boolean scroll) {
+	int resizerConstrains = getResizerConstrains(visualElement);
+	visualEditor.setSelectionRectangle(visualElement, resizerConstrains,
+		scroll);
+    }
+
+    public nsIDOMNode addLinkNodeToHead(String href_val, String ext_val) {
+	nsIDOMElement newNode = createLinkNode(href_val,
+		ATTR_REL_STYLESHEET_VALUE, ext_val);
+	headNode.appendChild(newNode);
+	return newNode;
+    }
+
+    public nsIDOMNode replaceLinkNodeToHead(nsIDOMNode oldNode,
+	    String href_val, String ext_val) {
+	nsIDOMNode newNode = createLinkNode(href_val,
+		ATTR_REL_STYLESHEET_VALUE, ext_val);
+	headNode.replaceChild(newNode, oldNode);
+	return newNode;
+    }
+
+    public nsIDOMNode replaceLinkNodeToHead(String href_val, String ext_val) {
+	nsIDOMNode newNode = null;
+	nsIDOMNode oldNode = getLinkNode(href_val, ext_val);
+	if (oldNode == null) {
+	    newNode = addLinkNodeToHead(href_val, ext_val);
+	}
+	return newNode;
+    }
+
+    public void removeLinkNodeFromHead(nsIDOMNode node) {
+	headNode.removeChild(node);
+    }
+
+    private nsIDOMElement createLinkNode(String href_val, String rel_val,
+	    String ext_val) {
+	nsIDOMElement linkNode = null;
+	if ((ATTR_REL_STYLESHEET_VALUE.equalsIgnoreCase(rel_val))
+		&& href_val.startsWith("file:")) {
+	    /*
+	     * Because of the Mozilla caches the linked css files we replace tag
+	     * <link rel="styleseet" href="file://..."> with tag <style
+	     * vpe="ATTR_VPE_INLINE_LINK_VALUE">file content</style> It is
+	     * LinkReplacer
+	     */
+	    linkNode = visualDocument.createElement(HTML.TAG_STYLE);
+	    linkNode.setAttribute(ATTR_VPE, ATTR_VPE_INLINE_LINK_VALUE);
+
+	    /* Copy links attributes into our <style> */
+	    linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_HREF, href_val);
+	    linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_EXT, ext_val);
+	    try {
+		StringBuffer styleText = new StringBuffer(EMPTY_STRING);
+		URL url = new URL((new Path(href_val)).toOSString());
+		String fileName = url.getFile();
+		BufferedReader in = new BufferedReader(new FileReader(
+			(fileName)));
+		String str = EMPTY_STRING;
+		while ((str = in.readLine()) != null) {
+		    styleText.append(str);
+		}
+
+		String styleForParse = styleText.toString();
+		styleForParse = VpeStyleUtil.addFullPathIntoURLValue(
+			styleForParse, href_val);
+
+		in.close();
+		nsIDOMText textNode = visualDocument
+			.createTextNode(styleForParse);
+		linkNode.appendChild(textNode);
+		return linkNode;
+	    } catch (FileNotFoundException fnfe) {
+		/* File which was pointed by user is not exists. Do nothing. */
+	    } catch (IOException ioe) {
+		VpePlugin.getPluginLog().logError(ioe.getMessage(), ioe);
+	    }
+	}
+
+	linkNode = visualDocument.createElement(HTML.TAG_LINK);
+	linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_REL, rel_val);
+	linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_HREF, href_val);
+	linkNode.setAttribute(VpeTemplateManager.ATTR_LINK_EXT, ext_val);
+
+	return linkNode;
+    }
+
+    private boolean isLinkReplacer(nsIDOMNode node) {
+	return HTML.TAG_STYLE.equalsIgnoreCase(node.getNodeName())
+		&& ATTR_VPE_INLINE_LINK_VALUE
+			.equalsIgnoreCase(((nsIDOMElement) node
+				.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
+				.getAttribute(ATTR_VPE));
+    }
+
+    private nsIDOMNode getLinkNode(String href_val, String ext_val) {
+	nsIDOMNodeList children = headNode.getChildNodes();
+	long len = children.getLength();
+	for (long i = len - 1; i >= 0; i--) {
+	    nsIDOMNode node = children.item(i);
+	    if (node.getNodeType() == Node.ELEMENT_NODE) {
+		if (HTML.TAG_LINK.equalsIgnoreCase(node.getNodeName())
+			|| isLinkReplacer(node)) {
+		    nsIDOMElement element = (nsIDOMElement) node
+			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
+		    if (ext_val.equalsIgnoreCase(element
+			    .getAttribute(VpeTemplateManager.ATTR_LINK_EXT))
+			    && href_val
+				    .equalsIgnoreCase(element
+					    .getAttribute(VpeTemplateManager.ATTR_LINK_HREF))) {
+			return node;
+		    }
+		}
+	    }
+	}
+	return null;
+    }
+
+    private void cleanHead() {
+	nsIDOMNodeList children = headNode.getChildNodes();
+	long len = children.getLength();
+	for (long i = len - 1; i >= 0; i--) {
+	    nsIDOMNode node = children.item(i);
+	    if (node.getNodeType() == Node.ELEMENT_NODE) {
+		String name = node.getNodeName();
+		if (HTML.TAG_LINK.equalsIgnoreCase(name)
+			|| isLinkReplacer(node)) {
+		    if (NO_STRING.equalsIgnoreCase(((nsIDOMElement) node
+			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
+			    .getAttribute("ext"))) {
+			// int linkAddress =
+			// MozillaSupports.queryInterface(node,
+			// nsIStyleSheetLinkingElement.NS_ISTYLESHEETLINKINGELEMENT_IID);
+			// nsIStyleSheetLinkingElement linkingElement = new
+			// nsIStyleSheetLinkingElement(linkAddress);
+			// linkingElement.removeStyleSheet();
+			node = headNode.removeChild(node);
+		    }
+		} else if (HTML.TAG_STYLE.equalsIgnoreCase(node.getNodeName())
+			&& (!YES_STRING
+				.equalsIgnoreCase(((nsIDOMElement) node
+					.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
+					.getAttribute(ATTR_VPE)))) {
+		    node = headNode.removeChild(node);
+		}
+	    }
+	}
+    }
+
+    private class PseudoInfo {
+	private nsIDOMNode pseudoNode;
+	private boolean isElements;
+
+	private PseudoInfo() {
+	    this(null, false);
+	}
+
+	private PseudoInfo(nsIDOMNode pseudoNode, boolean isElements) {
+	    this.pseudoNode = pseudoNode;
+	    this.isElements = isElements;
+	}
+    }
+
+    void showDragCaret(nsIDOMNode node, int offset) {
+	xulRunnerEditor.showDragCaret(node, offset);
+    }
+
+    void hideDragCaret() {
+
+	xulRunnerEditor.hideDragCaret();
+    }
+
+    private int getResizerConstrains(nsIDOMNode visualNode) {
+	VpeNodeMapping nodeMapping = domMapping.getNodeMapping(visualNode);
+	if (nodeMapping != null
+		&& nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
+	    return ((VpeElementMapping) nodeMapping).getTemplate()
+		    .getTagDescription(pageContext,
+			    (Element) nodeMapping.getSourceNode(),
+			    visualDocument,
+			    (nsIDOMElement) nodeMapping.getVisualNode(),
+			    ((VpeElementMapping) nodeMapping).getData())
+		    .getResizeConstrains();
+	}
+	return VpeTagDescription.RESIZE_CONSTRAINS_NONE;
+    }
+
+    public void resize(nsIDOMElement element, int resizerConstrains, int top,
+	    int left, int width, int height) {
+	VpeElementMapping elementMapping = (VpeElementMapping) domMapping
+		.getNodeMapping(element);
+	if (elementMapping != null) {
+	    elementMapping.getTemplate().resize(pageContext,
+		    (Element) elementMapping.getSourceNode(), visualDocument,
+		    element, elementMapping.getData(), resizerConstrains, top,
+		    left, width, height);
+	}
+    }
+
+    static boolean isAnonElement(nsIDOMNode visualNode) {
+	if (visualNode != null
+		&& visualNode.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
+	    String attrValue = ((nsIDOMElement) visualNode
+		    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID))
+		    .getAttribute(MOZ_ANONCLASS_ATTR);
+
+	    return attrValue != null && attrValue.length() > 0;
+	}
+
+	return false;
+    }
+
+    boolean canInnerDrag(nsIDOMElement visualDragElement) {
+	VpeNodeMapping node = domMapping.getNodeMapping(visualDragElement);
+	if (node instanceof VpeElementMapping) {
+	    VpeElementMapping elementMapping = (VpeElementMapping) node;
+	    if (elementMapping != null) {
+		return elementMapping.getTemplate().canInnerDrag(pageContext,
+			(Element) elementMapping.getSourceNode(),
+			visualDocument, visualDragElement,
+			elementMapping.getData());
+	    }
+	}
+	return false;
+    }
+
+    VpeSourceInnerDropInfo getSourceInnerDropInfo(Node sourceDragNode,
+	    VpeVisualInnerDropInfo visualDropInfo, boolean checkParentTemplates) {
+	nsIDOMNode visualDropContainer = visualDropInfo.getDropContainer();
+	long visualDropOffset = visualDropInfo.getDropOffset();
+	Node sourceDropContainer = null;
+	int sourceDropOffset = 0;
+
+	switch (visualDropContainer.getNodeType()) {
+	case nsIDOMNode.ELEMENT_NODE:
+	    nsIDOMNode visualOffsetNode = null;
+	    boolean afterFlag = false;
+	    long visualChildCount = VisualDomUtil
+		    .getChildCount(visualDropContainer);
+	    if (visualDropOffset < visualChildCount) {
+		visualOffsetNode = VisualDomUtil.getChildNode(
+			visualDropContainer, visualDropOffset);
+		if (isPseudoElement(visualOffsetNode)
+			|| isAnonElement(visualOffsetNode)) {
+		    visualOffsetNode = getLastAppreciableVisualChild(visualDropContainer);
+		    afterFlag = true;
+		}
+	    } else {
+		visualOffsetNode = getLastAppreciableVisualChild(visualDropContainer);
+		afterFlag = visualChildCount != 0;
+	    }
+	    if (visualOffsetNode != null) {
+		Node sourceOffsetNode = domMapping
+			.getSourceNode(visualOffsetNode);
+		if (sourceOffsetNode != null) {
+		    sourceDropContainer = sourceOffsetNode.getParentNode();
+		    sourceDropOffset = ((NodeImpl) sourceOffsetNode).getIndex();
+		    if (afterFlag) {
+			sourceDropOffset++;
+		    }
+		}
+	    }
+	    if (sourceDropContainer == null) {
+		sourceDropContainer = domMapping
+			.getNearSourceNode(visualDropContainer);
+		if (sourceDropContainer != null) {
+		    sourceDropOffset = sourceDropContainer.getChildNodes()
+			    .getLength();
+		}
+	    }
+	    if (sourceDropContainer == null) {
+		sourceDropContainer = domMapping
+			.getNearSourceNode(visualContentArea);
+		sourceDropOffset = sourceDropContainer.getChildNodes()
+			.getLength();
+	    }
+	    break;
+	case nsIDOMNode.TEXT_NODE:
+	    VpeNodeMapping nodeMapping = domMapping
+		    .getNearNodeMapping(visualDropContainer);
+	    switch (nodeMapping.getType()) {
+	    case VpeNodeMapping.TEXT_MAPPING:
+		sourceDropContainer = nodeMapping.getSourceNode();
+		sourceDropOffset = TextUtil.sourceInnerPosition(
+			sourceDropContainer.getNodeValue(), visualDropOffset);
+		break;
+	    case VpeNodeMapping.ELEMENT_MAPPING:
+		// it's attribute
+		if (isTextEditable(visualDropContainer)) {
+		    String[] atributeNames = ((VpeElementMapping) nodeMapping)
+			    .getTemplate().getOutputAtributeNames();
+		    if (atributeNames != null && atributeNames.length > 0) {
+			Element sourceElement = (Element) nodeMapping
+				.getSourceNode();
+			sourceDropContainer = sourceElement
+				.getAttributeNode(atributeNames[0]);
+			sourceDropOffset = TextUtil.sourceInnerPosition(
+				sourceDropContainer.getNodeValue(),
+				visualDropOffset);
+		    }
+		}
+		nodeMapping.getVisualNode();
+	    }
+	    break;
+	}
+	if (sourceDropContainer != null) {
+	    return getSourceInnerDropInfo(sourceDragNode, sourceDropContainer,
+		    sourceDropOffset, checkParentTemplates);
+	} else {
+	    return new VpeSourceInnerDropInfo(null, 0, false);
+	}
+    }
+
+    VpeSourceInnerDropInfo getSourceInnerDropInfo(Node dragNode,
+	    Node container, int offset, boolean checkParentsTemplates) {
+	// Thread.dumpStack();
+	boolean canDrop = false;
+	switch (container.getNodeType()) {
+	case Node.ELEMENT_NODE:
+	    VpeNodeMapping nodeMapping = domMapping.getNodeMapping(container);
+	    if (nodeMapping != null
+		    && nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
+		canDrop = ((VpeElementMapping) nodeMapping).getTemplate()
+			.canInnerDrop(pageContext, container, dragNode);
+	    }
+	    if (!canDrop) {
+		if (!checkParentsTemplates)
+		    return new VpeSourceInnerDropInfo(container, offset,
+			    canDrop);
+		// offset = ((NodeImpl)container).getIndex();
+		// container = container.getParentNode();
+		// TODO Max Areshkau unclear logic , if we can drop on element
+		// why we trying to drop
+		// this on parent
+		// return getSourceInnerDropInfo(dragNode, container, offset,
+		// false);
+		return new VpeSourceInnerDropInfo(container, offset, canDrop);
+	    }
+	    break;
+	case Node.TEXT_NODE:
+	case Node.DOCUMENT_NODE:
+	    canDrop = true;
+	    break;
+	case Node.ATTRIBUTE_NODE:
+	    canDrop = true;
+	    break;
+	}
+	if (canDrop) {
+	    return new VpeSourceInnerDropInfo(container, offset, canDrop);
+	} else {
+	    return new VpeSourceInnerDropInfo(null, 0, canDrop);
+	}
+    }
+
+    public void innerDrop(Node dragNode, Node container, int offset) {
+	VpeNodeMapping mapping = domMapping.getNearNodeMapping(container);
+	if (mapping != null) {
+	    nsIDOMNode visualDropContainer = mapping.getVisualNode();
+	    switch (mapping.getType()) {
+	    case VpeNodeMapping.TEXT_MAPPING:
+		break;
+	    case VpeNodeMapping.ELEMENT_MAPPING:
+		nsIDOMNode visualParent = visualDropContainer.getParentNode();
+		VpeNodeMapping oldMapping = mapping;
+		mapping = domMapping.getNearNodeMapping(visualParent);
+		if (mapping != null
+			&& mapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
+		    ((VpeElementMapping) mapping).getTemplate()
+			    .innerDrop(
+				    pageContext,
+				    new VpeSourceInnerDragInfo(dragNode, 0, 0),
+				    new VpeSourceInnerDropInfo(container,
+					    offset, true));
+		} else {
+		    ((VpeElementMapping) oldMapping).getTemplate()
+			    .innerDrop(
+				    pageContext,
+				    new VpeSourceInnerDragInfo(dragNode, 0, 0),
+				    new VpeSourceInnerDropInfo(container,
+					    offset, true));
+		}
+	    }
+
+	}
+    }
+
+    void innerDrop(VpeSourceInnerDragInfo dragInfo,
+	    VpeSourceInnerDropInfo dropInfo) {
+	dropper.drop(pageContext, dragInfo, dropInfo);
+    }
+
+    nsIDOMElement getNearDragElement(Element visualElement) {
+	VpeElementMapping elementMapping = domMapping
+		.getNearElementMapping(visualElement);
+	while (elementMapping != null) {
+	    if (canInnerDrag(elementMapping.getVisualElement())) {
+		return elementMapping.getVisualElement();
+	    }
+	    elementMapping = domMapping.getNearElementMapping(elementMapping
+		    .getVisualNode().getParentNode());
+	}
+	return null;
+    }
+
+    nsIDOMElement getDragElement(nsIDOMElement visualElement) {
+	VpeElementMapping elementMapping = domMapping
+		.getNearElementMapping(visualElement);
+	if (elementMapping != null
+		&& canInnerDrag(elementMapping.getVisualElement())) {
+	    return elementMapping.getVisualElement();
+	}
+	return null;
+    }
+
+    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;
+			}
+		    }
+		}
+		nsIDOMAttr classAttr = element.getAttributeNode("class");
+		if (classAttr != null) {
+		    String classValue = classAttr.getNodeValue().trim();
+		    if ("__any__tag__caption".equals(classValue)) {
+			return false;
+		    }
+		}
+	    }
+	}
+	return true;
+    }
+
+    VpeVisualInnerDropInfo getInnerDropInfo(Node sourceDropContainer,
+	    int sourceDropOffset) {
+	nsIDOMNode visualDropContainer = null;
+	long visualDropOffset = 0;
+
+	switch (sourceDropContainer.getNodeType()) {
+	case Node.TEXT_NODE:
+	    visualDropContainer = domMapping.getVisualNode(sourceDropContainer);
+	    visualDropOffset = TextUtil.visualInnerPosition(sourceDropContainer
+		    .getNodeValue(), sourceDropOffset);
+	    break;
+	case Node.ELEMENT_NODE:
+	case Node.DOCUMENT_NODE:
+	    NodeList sourceChildren = sourceDropContainer.getChildNodes();
+	    if (sourceDropOffset < sourceChildren.getLength()) {
+		Node sourceChild = sourceChildren.item(sourceDropOffset);
+		nsIDOMNode visualChild = domMapping.getVisualNode(sourceChild);
+		if (visualChild != null) {
+		    visualDropContainer = visualChild.getParentNode();
+
+		    visualDropOffset = VisualDomUtil.getOffset(visualChild);
+		}
+	    }
+	    if (visualDropContainer == null) {
+		visualDropContainer = domMapping
+			.getNearVisualNode(sourceDropContainer);
+		nsIDOMNode visualChild = getLastAppreciableVisualChild(visualDropContainer);
+		if (visualChild != null) {
+		    visualDropOffset = VisualDomUtil.getOffset(visualChild) + 1;
+		} else {
+		    visualDropOffset = 0;
+		}
+	    }
+	    break;
+	case Node.ATTRIBUTE_NODE:
+	    Element sourceElement = ((Attr) sourceDropContainer)
+		    .getOwnerElement();
+	    VpeElementMapping elementMapping = domMapping
+		    .getNearElementMapping(sourceElement);
+	    nsIDOMNode textNode = elementMapping.getTemplate()
+		    .getOutputTextNode(pageContext, sourceElement,
+			    elementMapping.getData());
+	    if (textNode != null) {
+		visualDropContainer = textNode;
+		visualDropOffset = TextUtil.visualInnerPosition(
+			sourceDropContainer.getNodeValue(), sourceDropOffset);
+	    }
+	    break;
+	}
+	if (visualDropContainer == null) {
+	    return null;
+	}
+	return new VpeVisualInnerDropInfo(visualDropContainer,
+		visualDropOffset, 0, 0);
+    }
+
+    protected void setTooltip(Element sourceElement, nsIDOMElement visualElement) {
+	if (visualElement != null && sourceElement != null
+		&& !((ElementImpl) sourceElement).isJSPTag()) {
+	    if (HTML.TAG_HTML.equalsIgnoreCase(sourceElement.getNodeName()))
+		return;
+	    String titleValue = getTooltip(sourceElement);
+
+	    if (titleValue != null) {
+		titleValue = titleValue.replaceAll("&", "&amp;");
+		titleValue = titleValue.replaceAll("<", "&lt;");
+		titleValue = titleValue.replaceAll(">", "&gt;");
+	    }
+
+	    if (titleValue != null) {
+		// visualElement.setAttribute("title", titleValue);
+		setTooltip(visualElement, titleValue);
+	    }
+	}
+    }
+
+    protected void setTooltip(nsIDOMElement visualElement, String titleValue) {
+	visualElement.setAttribute("title", titleValue);
+	nsIDOMNodeList children = visualElement.getChildNodes();
+	long len = children.getLength();
+	for (long i = 0; i < len; i++) {
+	    nsIDOMNode child = children.item(i);
+	    if (child.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
+		setTooltip(((nsIDOMElement) child
+			.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID)),
+			titleValue);
+	    }
+	}
+    }
+
+    private void resetTooltip(Element sourceElement, nsIDOMElement visualElement) {
+	if (visualElement != null && sourceElement != null
+		&& !((ElementImpl) sourceElement).isJSPTag()) {
+	    if (HTML.TAG_HTML.equalsIgnoreCase(sourceElement.getNodeName()))
+		return;
+	    String titleValue = getTooltip(sourceElement);
+
+	    if (titleValue != null) {
+		titleValue = titleValue.replaceAll("&", "&amp;");
+		titleValue = titleValue.replaceAll("<", "&lt;");
+		titleValue = titleValue.replaceAll(">", "&gt;");
+	    }
+
+	    if (titleValue != null) {
+		resetTooltip(visualElement, titleValue);
+	    }
+	}
+    }
+
+    private void resetTooltip(nsIDOMElement visualElement, String titleValue) {
+	visualElement.setAttribute("title", titleValue);
+	nsIDOMNodeList children = visualElement.getChildNodes();
+	long len = children.getLength();
+	for (long i = 0; i < len; i++) {
+	    nsIDOMNode child = children.item(i);
+	    if (child.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
+		if (domMapping.getNodeMapping(child) == null) {
+		    resetTooltip((nsIDOMElement) child
+			    .queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID),
+			    titleValue);
+		}
+	    }
+	}
+    }
+
+    private String getTooltip(Element sourceElement) {
+	StringBuffer buffer = new StringBuffer();
+	buffer.append(sourceElement.getNodeName());
+	NamedNodeMap attrs = sourceElement.getAttributes();
+	int len = attrs.getLength();
+	for (int i = 0; i < len; i++) {
+	    if (i == 7) {
+		return buffer.append("\n\t... ").toString();
+	    }
+	    int valueLength = attrs.item(i).getNodeValue().length();
+	    if (valueLength > 30) {
+		StringBuffer temp = new StringBuffer();
+		temp.append(attrs.item(i).getNodeValue().substring(0, 15)
+			+ " ... "
+			+ attrs.item(i).getNodeValue().substring(
+				valueLength - 15, valueLength));
+		buffer.append("\n" + attrs.item(i).getNodeName() + ": " + temp);
+	    } else
+		buffer.append("\n" + attrs.item(i).getNodeName() + ": "
+			+ attrs.item(i).getNodeValue());
+
+	}
+
+	return buffer.toString();
+    }
+
+    Rectangle getNodeBounds(nsIDOMNode visualNode) {
+
+	return XulRunnerVpeUtils.getElementBounds(visualNode);
+    }
+
+    static boolean canInsertAfter(int x, int y, Rectangle rect) {
+	if (y > (rect.y + rect.height) || x > (rect.x + rect.width)) {
+	    return true;
+	}
+	return y >= rect.x && x > (rect.x + rect.width / 2);
+    }
+
+    static nsIDOMNode getLastAppreciableVisualChild(nsIDOMNode visualParent) {
+	nsIDOMNode visualLastChild = null;
+	nsIDOMNodeList visualChildren = visualParent.getChildNodes();
+	long len = visualChildren.getLength();
+	for (long i = len - 1; i >= 0; i--) {
+	    nsIDOMNode visualChild = visualChildren.item(i);
+	    if (!isPseudoElement(visualChild) && !isAnonElement(visualChild)) {
+		visualLastChild = visualChild;
+		break;
+	    }
+	}
+	return visualLastChild;
+    }
+
+    void correctVisualDropPosition(VpeVisualInnerDropInfo newVisualDropInfo,
+	    VpeVisualInnerDropInfo oldVisualDropInfo) {
+	nsIDOMNode newVisualDropContainer = newVisualDropInfo
+		.getDropContainer();
+	nsIDOMNode oldVisualDropContainer = oldVisualDropInfo
+		.getDropContainer();
+
+	if (newVisualDropContainer.equals(oldVisualDropContainer)) {
+	    newVisualDropInfo.setDropOffset(oldVisualDropInfo.getDropOffset());
+	    return;
+	}
+
+	nsIDOMNode child = oldVisualDropContainer;
+	while (child != null && child.getNodeType() != Node.DOCUMENT_NODE) {
+	    nsIDOMNode parent = child.getParentNode();
+	    if (newVisualDropContainer.equals(parent)) {
+		long offset = VisualDomUtil.getOffset(child);
+		Rectangle rect = getNodeBounds(child);
+		if (canInsertAfter(oldVisualDropInfo.getMouseX(),
+			oldVisualDropInfo.getMouseY(), rect)) {
+		    offset++;
+		}
+		newVisualDropInfo.setDropOffset(offset);
+	    }
+	    child = parent;
+	}
+    }
+
+    public nsIDOMRange createDOMRange() {
+	return xulRunnerEditor.createDOMRange();
+    }
+
+    public nsIDOMRange createDOMRange(nsIDOMNode selectedNode) {
+	nsIDOMRange range = createDOMRange();
+	range.selectNode(selectedNode);
+	return range;
+    }
+
+    public static boolean isIncludeElement(nsIDOMElement visualElement) {
+	return YES_STRING.equalsIgnoreCase(visualElement
+		.getAttribute(INCLUDE_ELEMENT_ATTR));
+    }
+
+    public static void markIncludeElement(nsIDOMElement visualElement) {
+	visualElement.setAttribute(INCLUDE_ELEMENT_ATTR, YES_STRING);
+    }
+
+    protected void setReadOnlyElement(nsIDOMElement node) {
+	String style = node.getAttribute(VpeStyleUtil.ATTRIBUTE_STYLE);
+	style = VpeStyleUtil.setParameterInStyle(style, "-moz-user-modify",
+		"read-only");
+	node.setAttribute(VpeStyleUtil.ATTRIBUTE_STYLE, style);
+    }
+
+    void setMoveCursor(nsIDOMMouseEvent mouseEvent) {
+
+	nsIDOMElement selectedElement = xulRunnerEditor
+		.getLastSelectedElement();
+	if (selectedElement != null && canInnerDrag(selectedElement)) {
+	    String styleClasses = selectedElement.getAttribute(HTML.ATTR_CLASS);
+	    if (inDragArea(getNodeBounds(selectedElement), VisualDomUtil
+		    .getMousePoint(mouseEvent))) {
+		// change cursor
+		if (styleClasses == null
+			|| !(styleClasses.contains(ATTR_DRAG_AVAILABLE_CLASS))) {
+		    // change cursor style to move
+		    styleClasses = ATTR_DRAG_AVAILABLE_CLASS + " "
+			    + styleClasses;
+		}
+	    } else {
+		// change cursor style to normal
+		if (styleClasses != null) {
+
+		    styleClasses = styleClasses.replaceAll(
+			    ATTR_DRAG_AVAILABLE_CLASS, "");
+		}
+	    }
+	    selectedElement.setAttribute(HTML.ATTR_CLASS, styleClasses);
+	}
+    }
+
+    private boolean inDragArea(Rectangle dragArea, Point mousePoint) {
+	// TODO add drag and drop support
+	return dragArea.contains(mousePoint)
+		&& mousePoint.x < (dragArea.x + DRAG_AREA_WIDTH)
+		&& mousePoint.y < (dragArea.y + DRAG_AREA_HEIGHT);
+    }
+
+    nsIDOMElement getDragElement(nsIDOMMouseEvent mouseEvent) {
+
+	nsIDOMElement selectedElement = xulRunnerEditor
+		.getLastSelectedElement();
+	if (selectedElement != null && canInnerDrag(selectedElement)) {
+	    if (inDragArea(getNodeBounds(selectedElement), VisualDomUtil
+		    .getMousePoint(mouseEvent))) {
+		return selectedElement;
+	    }
+	}
+	return null;
+    }
+
+    VpeSourceInnerDragInfo getSourceInnerDragInfo(
+	    VpeVisualInnerDragInfo visualDragInfo) {
+	nsIDOMNode visualNode = visualDragInfo.getNode();
+	int offset = visualDragInfo.getOffset();
+	int length = visualDragInfo.getLength();
+
+	VpeNodeMapping nodeMapping = domMapping.getNearNodeMapping(visualNode);
+	Node sourceNode = nodeMapping.getSourceNode();
+
+	if (sourceNode != null) {
+	    switch (sourceNode.getNodeType()) {
+	    case Node.TEXT_NODE:
+		int end = TextUtil.sourceInnerPosition(visualNode
+			.getNodeValue(), offset + length);
+		offset = TextUtil.sourceInnerPosition(
+			visualNode.getNodeValue(), offset);
+		length = end - offset;
+		break;
+	    case Node.ELEMENT_NODE:
+		if (visualNode.getNodeType() == Node.TEXT_NODE) {
+		    // it's attribute
+		    sourceNode = null;
+		    if (isTextEditable(visualNode)) {
+			String[] atributeNames = ((VpeElementMapping) nodeMapping)
+				.getTemplate().getOutputAtributeNames();
+			if (atributeNames != null && atributeNames.length > 0) {
+			    Element sourceElement = (Element) nodeMapping
+				    .getSourceNode();
+			    sourceNode = sourceElement
+				    .getAttributeNode(atributeNames[0]);
+			    end = TextUtil.sourceInnerPosition(visualNode
+				    .getNodeValue(), offset + length);
+			    offset = TextUtil.sourceInnerPosition(visualNode
+				    .getNodeValue(), offset);
+			    length = end - offset;
+			}
+		    }
+		}
+		break;
+	    }
+	}
+	return new VpeSourceInnerDragInfo(sourceNode, offset, length);
+    }
+
+    public nsIDOMText getOutputTextNode(Attr attr) {
+	Element sourceElement = ((Attr) attr).getOwnerElement();
+	VpeElementMapping elementMapping = domMapping
+		.getNearElementMapping(sourceElement);
+	if (elementMapping != null) {
+	    return elementMapping.getTemplate().getOutputTextNode(pageContext,
+		    sourceElement, elementMapping.getData());
+	}
+	return null;
+    }
+
+    nsIDOMElement getLastSelectedElement() {
+
+	return xulRunnerEditor.getLastSelectedElement();
+    }
+
+    public void pushIncludeStack(VpeIncludeInfo includeInfo) {
+	includeStack.add(includeInfo);
+    }
+
+    public VpeIncludeInfo popIncludeStack() {
+	VpeIncludeInfo includeInfo = null;
+	if (includeStack.size() > 0) {
+	    includeInfo = (VpeIncludeInfo) includeStack.remove(includeStack
+		    .size() - 1);
+	}
+	return includeInfo;
+    }
+
+    public boolean isFileInIncludeStack(IFile file) {
+	if (file == null)
+	    return false;
+	for (int i = 0; i < includeStack.size(); i++) {
+	    if (file.equals(((VpeIncludeInfo) includeStack.get(i)).getFile())) {
+		return true;
+	    }
+	}
+	return false;
+    }
+
+    protected boolean isCurrentMainDocument() {
+	return includeStack.size() <= 1;
+    }
+
+    public int getCurrentMainIncludeOffset() {
+	if (includeStack.size() <= 1)
+	    return -1;
+	VpeIncludeInfo info = (VpeIncludeInfo) includeStack.get(1);
+	return ((IndexedRegion) info.getElement()).getStartOffset();
+    }
+
+    public VpeIncludeInfo getCurrentIncludeInfo() {
+	if (includeStack.size() <= 0)
+	    return null;
+	return (VpeIncludeInfo) includeStack.get(includeStack.size() - 1);
+    }
+
+    public VpeIncludeInfo getRootIncludeInfo() {
+	if (includeStack.size() <= 1)
+	    return null;
+	return (VpeIncludeInfo) includeStack.get(1);
+    }
+
     public void dispose() {
     	clearIncludeDocuments();
     	includeDocuments=null;
-		cleanHead();
-		domMapping.clear(visualContentArea);
-		pageContext.dispose();
+	cleanHead();
+	domMapping.clear(visualContentArea);
+	pageContext.dispose();
 		super.dispose();
-	}
-
-	private void clearIncludeDocuments() {
-		Collection<Document> documents = includeDocuments.values();
-    	for (Iterator iterator = documents.iterator(); iterator.hasNext();) {
-			Document document = (Document) iterator.next();
-			VpeCreatorUtil.releaseDocumentFromRead(document);
-		}
-    	includeDocuments.clear();
-	}
-
-    protected Map createXmlns(Element sourceNode) {
-	NamedNodeMap attrs = ((Element) sourceNode).getAttributes();
-	if (attrs != null) {
-	    Map xmlnsMap = new HashMap();
-	    for (int i = 0; i < attrs.getLength(); i++) {
-		addTaglib(sourceNode, xmlnsMap, attrs.item(i).getNodeName(),
-			true);
-	    }
-	    if (xmlnsMap.size() > 0) {
-		return xmlnsMap;
-	    }
-	}
-	return null;
-    }
-
-    private void setXmlnsAttribute(VpeElementMapping elementMapping,
-	    String name, String value) {
-	Element sourceElement = (Element) elementMapping.getSourceNode();
-	if (sourceElement != null) {
-	    Map xmlnsMap = elementMapping.getXmlnsMap();
-	    if (xmlnsMap == null)
-		xmlnsMap = new HashMap();
-	    addTaglib(sourceElement, xmlnsMap, name, true);
-	    elementMapping.setXmlnsMap(xmlnsMap.size() > 0 ? xmlnsMap : null);
-	}
-    }
-
-    private void removeXmlnsAttribute(VpeElementMapping elementMapping,
-	    String name) {
-	Element sourceElement = (Element) elementMapping.getSourceNode();
-	if (sourceElement != null) {
-	    Map xmlnsMap = elementMapping.getXmlnsMap();
-	    if (xmlnsMap != null) {
-		Object id = xmlnsMap.remove(name);
-		if (id != null) {
-		    pageContext.setTaglib(((Integer) id).intValue(), null,
-			    null, true);
-		    elementMapping.setXmlnsMap(xmlnsMap.size() > 0 ? xmlnsMap
-			    : null);
-		}
-	    }
-	}
-    }
-
-    private void addTaglib(Element sourceElement, Map xmlnsMap,
-	    String attrName, boolean ns) {
-	Attr attr = sourceElement.getAttributeNode(attrName);
-	if (ATTR_XMLNS.equals(attr.getPrefix())) {
-	    xmlnsMap.put(attr.getNodeName(), Integer.valueOf(attr.hashCode()));
-	    pageContext.setTaglib(attr.hashCode(), attr.getNodeValue(), attr
-		    .getLocalName(), ns);
-	}
-    }
-
-    /**
-     * @return the dnd
-     */
-    public VpeDnD getDnd() {
-
-	return dnd;
-    }
-
-    /**
-     * @param dnd
-     *                the dnd to set
-     */
-    public void setDnd(VpeDnD dnd) {
-
-	this.dnd = dnd;
-    }
-
-    /**
-     * @return the pageContext
-     */
-    protected VpePageContext getPageContext() {
-	return pageContext;
-    }
-
-    /**
-     * @param pageContext
-     *                the pageContext to set
-     */
-    protected void setPageContext(VpePageContext pageContext) {
-	this.pageContext = pageContext;
-    }
-
-    /**
-     * @return the visualDocument
-     */
-    protected nsIDOMDocument getVisualDocument() {
-	return visualDocument;
-    }
-
-    /**
-     * @param visualDocument
-     *                the visualDocument to set
-     */
-    protected void setVisualDocument(nsIDOMDocument visualDocument) {
-	this.visualDocument = visualDocument;
-    }
-
-    /**
-     * Check this file is facelet
-     * 
-     * @return this if file is facelet, otherwize false
-     */
-    private boolean isFacelet() {
-	boolean isFacelet = false;
-
-	IEditorInput iEditorInput = pageContext.getEditPart().getEditorInput();
-	if (iEditorInput instanceof IFileEditorInput) {
-	    IFileEditorInput iFileEditorInput = (IFileEditorInput) iEditorInput;
-
-	    IFile iFile = iFileEditorInput.getFile();
-
-	    IProject project = iFile.getProject();
-	    IModelNature nature = EclipseResourceUtil.getModelNature(project);
-	    if (nature != null) {
-		XModel model = nature.getModel();
-		XModelObject webXML = WebAppHelper.getWebApp(model);
-		XModelObject param = WebAppHelper.findWebAppContextParam(
-			webXML, "javax.faces.DEFAULT_SUFFIX");
-		if (param != null) {
-		    String value = param.getAttributeValue("param-value");
-
-		    if (value.length() != 0 && iFile.getName().endsWith(value)) {
-			isFacelet = true;
-		    }
-		}
-	    }
-	}
-
-	return isFacelet;
-    }
-
-    /**
-     * Create a visual element for text node
-     * 
-     * @param sourceNode
-     * @param registerFlag
-     * @return a visual element for text node
-     */
-
-    protected nsIDOMNode createTextNode(Node sourceNode, boolean registerFlag) {
-	String sourceText = sourceNode.getNodeValue();
+    }
+    
+	private void clearIncludeDocuments() {
+		Collection<Document> documents = includeDocuments.values();
+    	for (Iterator iterator = documents.iterator(); iterator.hasNext();) {
+			Document document = (Document) iterator.next();
+			VpeCreatorUtil.releaseDocumentFromRead(document);
+		}
+    	includeDocuments.clear();
+	}
+//    protected Map createXmlns(Element sourceNode) {
+//	NamedNodeMap attrs = ((Element) sourceNode).getAttributes();
+//	if (attrs != null) {
+//	    Map xmlnsMap = new HashMap();
+//	    for (int i = 0; i < attrs.getLength(); i++) {
+//		addTaglib(sourceNode, xmlnsMap, attrs.item(i).getNodeName(),
+//			true);
+//	    }
+//	    if (xmlnsMap.size() > 0) {
+//		return xmlnsMap;
+//	    }
+//	}
+//	return null;
+//    }
+
+//    private void setXmlnsAttribute(VpeElementMapping elementMapping,
+//	    String name, String value) {
+//	Element sourceElement = (Element) elementMapping.getSourceNode();
+//	if (sourceElement != null) {
+//	    Map xmlnsMap = elementMapping.getXmlnsMap();
+//	    if (xmlnsMap == null)
+//		xmlnsMap = new HashMap();
+//	    addTaglib(sourceElement, xmlnsMap, name, true);
+//	    elementMapping.setXmlnsMap(xmlnsMap.size() > 0 ? xmlnsMap : null);
+//	}
+//    }
+
+//    private void removeXmlnsAttribute(VpeElementMapping elementMapping,
+//	    String name) {
+//	Element sourceElement = (Element) elementMapping.getSourceNode();
+//	if (sourceElement != null) {
+//	    Map xmlnsMap = elementMapping.getXmlnsMap();
+//	    if (xmlnsMap != null) {
+//		Object id = xmlnsMap.remove(name);
+//		if (id != null) {
+//		    pageContext.setTaglib(((Integer) id).intValue(), null,
+//			    null, true);
+//		    elementMapping.setXmlnsMap(xmlnsMap.size() > 0 ? xmlnsMap
+//			    : null);
+//		}
+//	    }
+//	}
+//    }
+//
+//    private void addTaglib(Element sourceElement, Map xmlnsMap,
+//	    String attrName, boolean ns) {
+//	Attr attr = sourceElement.getAttributeNode(attrName);
+//	if (ATTR_XMLNS.equals(attr.getPrefix())) {
+//	    xmlnsMap.put(attr.getNodeName(), Integer.valueOf(attr.hashCode()));
+//	    pageContext.setTaglib(attr.hashCode(), attr.getNodeValue(), attr
+//		    .getLocalName(), ns);
+//	}
+//    }
+
+    /**
+     * @return the dnd
+     */
+    public VpeDnD getDnd() {
+
+	return dnd;
+    }
+
+    /**
+     * @param dnd
+     *                the dnd to set
+     */
+    public void setDnd(VpeDnD dnd) {
+
+	this.dnd = dnd;
+    }
+
+    /**
+     * @return the pageContext
+     */
+    protected VpePageContext getPageContext() {
+	return pageContext;
+    }
+
+    /**
+     * @param pageContext
+     *                the pageContext to set
+     */
+    protected void setPageContext(VpePageContext pageContext) {
+	this.pageContext = pageContext;
+    }
+
+    /**
+     * @return the visualDocument
+     */
+    protected nsIDOMDocument getVisualDocument() {
+	return visualDocument;
+    }
+
+    /**
+     * @param visualDocument
+     *                the visualDocument to set
+     */
+    protected void setVisualDocument(nsIDOMDocument visualDocument) {
+	this.visualDocument = visualDocument;
+    }
+
+    /**
+     * Check this file is facelet
+     * 
+     * @return this if file is facelet, otherwize false
+     */
+    private boolean isFacelet() {
+	boolean isFacelet = false;
+
+	IEditorInput iEditorInput = pageContext.getEditPart().getEditorInput();
+	if (iEditorInput instanceof IFileEditorInput) {
+	    IFileEditorInput iFileEditorInput = (IFileEditorInput) iEditorInput;
+
+	    IFile iFile = iFileEditorInput.getFile();
+
+	    IProject project = iFile.getProject();
+	    IModelNature nature = EclipseResourceUtil.getModelNature(project);
+	    if (nature != null) {
+		XModel model = nature.getModel();
+		XModelObject webXML = WebAppHelper.getWebApp(model);
+		XModelObject param = WebAppHelper.findWebAppContextParam(
+			webXML, "javax.faces.DEFAULT_SUFFIX");
+		if (param != null) {
+		    String value = param.getAttributeValue("param-value");
+
+		    if (value.length() != 0 && iFile.getName().endsWith(value)) {
+			isFacelet = true;
+		    }
+		}
+	    }
+	}
+
+	return isFacelet;
+    }
+
+    /**
+     * Create a visual element for text node
+     * 
+     * @param sourceNode
+     * @param registerFlag
+     * @return a visual element for text node
+     */
+
+    protected nsIDOMNode createTextNode(Node sourceNode, boolean registerFlag) {
+	String sourceText = sourceNode.getNodeValue();
 	
 	//Max Areshkau this code causes very  slow work of visual editor
 	//when we editing in big files txt nodes.For example exmployee.xhtml from JBIDE1105
@@ -2096,48 +2098,48 @@
 //			registerNodes(new VpeNodeMapping(sourceNode, null));
 //	    return null;
 //	}
-
-	if (faceletFile) {
-	    Matcher matcher_EL = REGEX_EL.matcher(sourceText);
-	    if (matcher_EL.find()) {
-		BundleMap bundle = pageContext.getBundle();
-		int offset = pageContext.getVisualBuilder()
-			.getCurrentMainIncludeOffset();
-		if (offset == -1)
-		    offset = ((IndexedRegion) sourceNode).getStartOffset();
-		String jsfValue = bundle.getBundleValue(sourceText, offset);
-		sourceText = jsfValue;
-	    }
-	}
-	String visualText = TextUtil.visualText(sourceText);
-
-	nsIDOMNode visualNewTextNode = visualDocument
-		.createTextNode(visualText);
-	nsIDOMElement element = visualDocument.createElement(HTML.TAG_SPAN);
-	element.appendChild(visualNewTextNode);
-	if (registerFlag) {
-	    registerNodes(new VpeNodeMapping(sourceNode, element));
-	}
-
-	return element;
+
+	if (faceletFile) {
+	    Matcher matcher_EL = REGEX_EL.matcher(sourceText);
+	    if (matcher_EL.find()) {
+		BundleMap bundle = pageContext.getBundle();
+		int offset = pageContext.getVisualBuilder()
+			.getCurrentMainIncludeOffset();
+		if (offset == -1)
+		    offset = ((IndexedRegion) sourceNode).getStartOffset();
+		String jsfValue = bundle.getBundleValue(sourceText, offset);
+		sourceText = jsfValue;
+	    }
+	}
+	String visualText = TextUtil.visualText(sourceText);
+
+	nsIDOMNode visualNewTextNode = visualDocument
+		.createTextNode(visualText);
+	nsIDOMElement element = visualDocument.createElement(HTML.TAG_SPAN);
+	element.appendChild(visualNewTextNode);
+	if (registerFlag) {
+	    registerNodes(new VpeNodeMapping(sourceNode, element));
+	}
+
+	return element;
+    }
+
+    /**
+     * @return the xulRunnerEditor
+     */
+    public XulRunnerEditor getXulRunnerEditor() {
+	return xulRunnerEditor;
+    }
+
+    /**
+     * @param xulRunnerEditor
+     *                the xulRunnerEditor to set
+     */
+    public void setXulRunnerEditor(XulRunnerEditor xulRunnerEditor) {
+	this.xulRunnerEditor = xulRunnerEditor;
     }
 
-    /**
-     * @return the xulRunnerEditor
-     */
-    public XulRunnerEditor getXulRunnerEditor() {
-	return xulRunnerEditor;
-    }
-
-    /**
-     * @param xulRunnerEditor
-     *                the xulRunnerEditor to set
-     */
-    public void setXulRunnerEditor(XulRunnerEditor xulRunnerEditor) {
-	this.xulRunnerEditor = xulRunnerEditor;
-    }
-
 	public Map<IFile, Document> getIncludeDocuments() {
 		return includeDocuments;
-	}
-}
+    }
+}

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/context/VpePageContext.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/context/VpePageContext.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/context/VpePageContext.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -1,469 +1,384 @@
-/*******************************************************************************
- * Copyright (c) 2007 Exadel, Inc. and 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:
- *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
- ******************************************************************************/ 
-package org.jboss.tools.vpe.editor.context;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.jboss.tools.common.kb.KbConnectorFactory;
-import org.jboss.tools.common.kb.KbConnectorType;
-import org.jboss.tools.common.kb.KbTldResource;
-import org.jboss.tools.common.kb.wtp.JspWtpKbConnector;
-import org.jboss.tools.common.kb.wtp.TLDVersionHelper;
-import org.jboss.tools.common.kb.wtp.WtpKbConnector;
-import org.jboss.tools.common.model.XModel;
-import org.jboss.tools.common.model.project.IModelNature;
-import org.jboss.tools.common.model.util.EclipseResourceUtil;
-import org.jboss.tools.jst.jsp.editor.IVisualContext;
-import org.jboss.tools.jst.jsp.editor.TLDRegisterHelper;
-import org.jboss.tools.jst.jsp.preferences.VpePreference;
-import org.jboss.tools.jst.web.tld.TaglibData;
-import org.jboss.tools.jst.web.tld.VpeTaglibListener;
-import org.jboss.tools.jst.web.tld.VpeTaglibManager;
-import org.jboss.tools.vpe.VpeDebug;
-import org.jboss.tools.vpe.VpePlugin;
-import org.jboss.tools.vpe.editor.VpeEditorPart;
-import org.jboss.tools.vpe.editor.VpeSourceDomBuilder;
-import org.jboss.tools.vpe.editor.VpeVisualDomBuilder;
-import org.jboss.tools.vpe.editor.bundle.BundleMap;
-import org.jboss.tools.vpe.editor.css.AbsoluteFolderReferenceList;
-import org.jboss.tools.vpe.editor.css.CSSReferenceList;
-import org.jboss.tools.vpe.editor.css.RelativeFolderReferenceList;
-import org.jboss.tools.vpe.editor.css.ResourceReference;
-import org.jboss.tools.vpe.editor.css.TaglibReferenceList;
-import org.jboss.tools.vpe.editor.mapping.VpeDomMapping;
-import org.jboss.tools.vpe.editor.template.VpeTemplateManager;
-import org.jboss.tools.vpe.editor.util.FileUtil;
-import org.mozilla.interfaces.nsIDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Contains the information on edited page.
- */
-
-public class VpePageContext implements VpeTaglibManager, IVisualContext {
-	private VpeTemplateManager templateManager;
-	private List taglibs = new ArrayList();
-	private Set connectorDocuments = new HashSet();
-	private Map taglibMap = new HashMap();
-	private VpeTaglibListener[] taglibListeners = new VpeTaglibListener[0];
-	private BundleMap bundle;
-	private Set bundleDependencySet = new HashSet();
-	private VpeSourceDomBuilder sourceBuilder;
-	private VpeVisualDomBuilder visualBuilder;
-	private VpeEditorPart editPart;
-	private List lastTaglibs = new ArrayList();
-	private boolean taglibChanged = false;
-	WtpKbConnector connector;	
-	private nsIDOMNode currentVisualNode;
-	
-	public VpePageContext(VpeTemplateManager templateManager, BundleMap bundle, VpeEditorPart editPart) {
-		this.templateManager = templateManager;
-		this.bundle = bundle;
-		this.editPart = editPart;
-	}
-	
-	public VpeSourceDomBuilder getSourceBuilder(){
-		return sourceBuilder;
-	}
-	
-	public boolean isAbsolutePosition(){
-		if("yes".equals(VpePreference.USE_ABSOLUTE_POSITION.getValue()))return true;
-		else return false;
-	}
-	
-	public void setSourceDomBuilder(VpeSourceDomBuilder sourceBuilder) {
-		this.sourceBuilder = sourceBuilder;
-		refreshConnector();
-	}
-	
-	public void refreshConnector() {
-		try {
-			IDocument document = sourceBuilder.getStructuredTextViewer().getDocument();
-			if (document!= null) {
-				connectorDocuments.add(document);
-				connector = (WtpKbConnector)KbConnectorFactory.getIntstance().createConnector(KbConnectorType.JSP_WTP_KB_CONNECTOR, document);
-			}
-		} catch (Exception e) {
-			VpePlugin.getPluginLog().logError(e);
-		}
-	}
-	
-	public VpeVisualDomBuilder getVisualBuilder(){
-		return visualBuilder;
-	}
-	
-	public void setVisualDomBuilder(VpeVisualDomBuilder visualBuilder) {
-		this.visualBuilder = visualBuilder;
-	}
-	
-	public VpeDomMapping getDomMapping ()  {
-		return visualBuilder.getDomMapping();
-	}
-	
-	public void clearAll() {
-		taglibs.clear();
-		taglibMap.clear();
-		bundleDependencySet.clear();
-		bundle.clearAll();
-	}
-	
-	public void dispose() {
+/*******************************************************************************
+ * Copyright (c) 2007 Exadel, Inc. and 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:
+ *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/ 
+package org.jboss.tools.vpe.editor.context;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.ide.IDE;
+import org.jboss.tools.common.kb.KbConnectorFactory;
+import org.jboss.tools.common.kb.KbConnectorType;
+import org.jboss.tools.common.kb.wtp.WtpKbConnector;
+import org.jboss.tools.jst.jsp.editor.IVisualContext;
+import org.jboss.tools.jst.jsp.preferences.VpePreference;
+import org.jboss.tools.jst.web.tld.TaglibData;
+import org.jboss.tools.jst.web.tld.VpeTaglibListener;
+import org.jboss.tools.jst.web.tld.VpeTaglibManager;
+import org.jboss.tools.vpe.VpePlugin;
+import org.jboss.tools.vpe.editor.VpeEditorPart;
+import org.jboss.tools.vpe.editor.VpeSourceDomBuilder;
+import org.jboss.tools.vpe.editor.VpeVisualDomBuilder;
+import org.jboss.tools.vpe.editor.bundle.BundleMap;
+import org.jboss.tools.vpe.editor.css.AbsoluteFolderReferenceList;
+import org.jboss.tools.vpe.editor.css.CSSReferenceList;
+import org.jboss.tools.vpe.editor.css.RelativeFolderReferenceList;
+import org.jboss.tools.vpe.editor.css.ResourceReference;
+import org.jboss.tools.vpe.editor.css.TaglibReferenceList;
+import org.jboss.tools.vpe.editor.mapping.VpeDomMapping;
+import org.jboss.tools.vpe.editor.template.VpeTemplateManager;
+import org.jboss.tools.vpe.editor.util.FileUtil;
+import org.mozilla.interfaces.nsIDOMNode;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**
+ * Contains the information on edited page.
+ */
+
+public class VpePageContext implements IVisualContext {
+	private Set connectorDocuments = new HashSet();
+	private BundleMap bundle;
+	private Set bundleDependencySet = new HashSet();
+	private VpeSourceDomBuilder sourceBuilder;
+	private VpeVisualDomBuilder visualBuilder;
+	private VpeEditorPart editPart;
+	WtpKbConnector connector;
+	private nsIDOMNode currentVisualNode;	
+	
+	public VpePageContext(VpeTemplateManager templateManager, BundleMap bundle, VpeEditorPart editPart) {
+		this.bundle = bundle;
+		this.editPart = editPart;
+	}
+	
+	public VpeSourceDomBuilder getSourceBuilder(){
+		return sourceBuilder;
+	}
+	
+	public boolean isAbsolutePosition(){
+		if("yes".equals(VpePreference.USE_ABSOLUTE_POSITION.getValue()))return true;
+		else return false;
+	}
+	
+	public void setSourceDomBuilder(VpeSourceDomBuilder sourceBuilder) {
+		this.sourceBuilder = sourceBuilder;
+		refreshConnector();
+	}
+	
+	public void refreshConnector() {
+		try {
+			IDocument document = sourceBuilder.getStructuredTextViewer().getDocument();
+			connector = (WtpKbConnector)KbConnectorFactory.getIntstance().createConnector(KbConnectorType.JSP_WTP_KB_CONNECTOR, document);
+		} catch (Exception e) {
+			VpePlugin.getPluginLog().logError(e);
+		}
+	}
+	
+	public VpeVisualDomBuilder getVisualBuilder(){
+		return visualBuilder;
+	}
+	
+	public void setVisualDomBuilder(VpeVisualDomBuilder visualBuilder) {
+		this.visualBuilder = visualBuilder;
+	}
+	
+	public VpeDomMapping getDomMapping ()  {
+		return visualBuilder.getDomMapping();
+	}
+	
+	public void clearAll() {
+		bundleDependencySet.clear();
+		bundle.clearAll();
+	}
+	
+	public void dispose() {
 		for (Iterator iterator = connectorDocuments.iterator(); iterator.hasNext();) {
 			IDocument document = (IDocument) iterator.next();
 			KbConnectorFactory.getIntstance().removeConnector(KbConnectorType.JSP_WTP_KB_CONNECTOR, document);
 		}
 		connectorDocuments.clear();
 		connectorDocuments = null;
-		bundle.dispose();
-		clearAll();
-		taglibListeners=null;
-		editPart=null;
-		connector=null;
-		sourceBuilder=null;
-		visualBuilder=null;
-	}
-	
-	public void setTaglib(int id, String newUri, String newPrefix, boolean ns) {
-		if (newUri != null && newPrefix != null) {
-			TaglibData data = new TaglibData(id, newUri, newPrefix, ns);
-			if (!taglibs.contains(data)) {
-				taglibs.add(data);
-				rebuildTaglibMap();
-			}
-		}
-		/*for (int i = 0; i < taglibs.size(); i++) {
-			TaglibData taglib = (TaglibData)taglibs.get(i);
-			if (taglib.getId() == id) {
-				if (newUri != null && newPrefix != null) {
-					if (!newUri.equals(taglib.getUri()) || !newPrefix.equals(taglib.getPrefix())) {
-						taglibs.set(i, new TaglibData(id, newUri, newPrefix, ns));
-						rebuildTaglibMap();
-					}
-				} else {
-					taglibs.remove(i);
-					rebuildTaglibMap();
-				}
-				return;
-			}
-		}
-		if (newUri != null && newPrefix != null) {
-			taglibs.add(new TaglibData(id, newUri, newPrefix, ns));
-			rebuildTaglibMap();
-		}*/
-	}
-	
-	public String getTemplateTaglibPrefix(String sourceTaglibPrefix) {
-		return (String) taglibMap.get(sourceTaglibPrefix);
-	}
-	
-	private void rebuildTaglibMap() {
-		taglibMap.clear();
-		Set prefixSet = new HashSet();
-		for (int i = 0; i < taglibs.size(); i++) {
-			TaglibData taglib = (TaglibData)taglibs.get(i);
-			String prefix = taglib.getPrefix();
-			if (!prefixSet.contains(prefix)) {
-				String templatePrefix = templateManager.getTemplateTaglibPrefix(taglib.getUri());
-				if (templatePrefix != null) {
-					taglibMap.put(prefix, templatePrefix);
-				}
-				prefixSet.add(prefix);
-			}
-		}
-		taglibChanged = true;
-		
-		try {
-			registerTaglibs(connector, this, getSourceBuilder().getStructuredTextViewer().getDocument());
-		} catch (Exception e) {
-			VpePlugin.getPluginLog().logError(e);
-		}
-	}
-
-	public void addTaglibListener(VpeTaglibListener listener) {
-		if (listener != null) {
-			VpeTaglibListener[] newTaglibListeners = new VpeTaglibListener[taglibListeners.length + 1];
-			System.arraycopy(taglibListeners, 0, newTaglibListeners, 0, taglibListeners.length);
-			taglibListeners = newTaglibListeners;
-			taglibListeners[taglibListeners.length - 1] = listener;
-		}
-	}
-	
-	public void removeTaglibListener(VpeTaglibListener listener) {
-		if (listener == null || taglibListeners.length == 0) return;
-		int index = -1;
-		for (int i = 0; i < taglibListeners.length; i++) {
-			if (listener == taglibListeners[i]){
-				index = i;
-				break;
-			}
-		}
-		if (index == -1) return;
-		if (taglibListeners.length == 1) {
-			taglibListeners = new VpeTaglibListener[0];
-			return;
-		}
-		VpeTaglibListener[] newTaglibListeners = new VpeTaglibListener[taglibListeners.length - 1];
-		System.arraycopy(taglibListeners, 0, newTaglibListeners, 0, index);
-		System.arraycopy(taglibListeners, index + 1, newTaglibListeners, index, taglibListeners.length - index - 1);
-		taglibListeners = newTaglibListeners;
-	}
-	
-	public BundleMap getBundle() {
-		return bundle;
-	}
-
-	public void addBundleDependency(Element sourceNode) {
-		bundleDependencySet.add(sourceNode);
-	}
-	
-	public void removeBundleDependency(Element sourceNode) {
-		bundleDependencySet.remove(sourceNode);
-	}
-	
-	public void refreshBundleValues() {
-		Iterator iterator = bundleDependencySet.iterator();
-		while (iterator.hasNext()) {
-			Element sourceElement = (Element) iterator.next();
-			visualBuilder.refreshBundleValues(sourceElement);
-		}
-	}
-	
-	public boolean isCorrectNS(Node sourceNode) {
-		String sourcePrefix = sourceNode.getPrefix();
-		if (sourcePrefix == null || ((ElementImpl)sourceNode).isJSPTag()) {
-			return true;
-		}
-		for (int i = 0; i < taglibs.size(); i++) {
-			TaglibData taglib = (TaglibData)taglibs.get(i);
-			if (sourcePrefix.equals(taglib.getPrefix())) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	public String getSourceTaglibUri(Node sourceNode) {
-		String sourcePrefix = sourceNode.getPrefix();
-		if (sourcePrefix == null || ((ElementImpl)sourceNode).isJSPTag()) {
-			return null;
-		}
-		for (int i = 0; i < taglibs.size(); i++) {
-			TaglibData taglib = (TaglibData)taglibs.get(i);
-			if (sourcePrefix.equals(taglib.getPrefix())) {
-				return taglib.getUri();
-			}
-		}
-		return null;
-	}
-
-	public VpeEditorPart getEditPart() {
-		return editPart;
-	}
-
-	public void openIncludeFile(String file) {
-		IEditorInput input = editPart.getEditorInput();
-		IWorkbenchPage workbenchPage = VpePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		try{
-		    IFile f = FileUtil.getFile(input, file);
-		    if (f != null) {
-				IDE.openEditor(workbenchPage, f, true);
-		    }
-		}catch(Exception ex){
-			VpePlugin.reportProblem(ex);
-		}
-	}
-
-	public ResourceReference[] getIncludeTaglibs() {
-		IEditorInput input = getEditPart().getEditorInput();
-		IFile file = null;
-		if (input instanceof IFileEditorInput) {
-	        file = ((IFileEditorInput)input).getFile();
-	    }
-		ResourceReference[] resourceReferences = new ResourceReference[0];
-		if (file != null) {
-		    resourceReferences = TaglibReferenceList.getInstance().getAllResources(file);
-		}
-	    return resourceReferences;
-	}
-
-	public ResourceReference[] getIncludeCss() {
-		IEditorInput input = getEditPart().getEditorInput();
-		IFile file = null;
-		if (input instanceof IFileEditorInput) {
-	        file = ((IFileEditorInput)input).getFile();
-	    }
-		ResourceReference[] resourceReferences = new ResourceReference[0];
-		if (file != null) {
-		    resourceReferences = CSSReferenceList.getInstance().getAllResources(file);
-		}
-		return resourceReferences;
-	}
-
-	public void installIncludeElements() {
-		ResourceReference[] list = getIncludeTaglibs();
-		for (int i = 0; i < list.length; i++) {
-			ResourceReference reference = list[i];
-			setTaglib(i, reference.getLocation(), reference.getProperties(), false);
-		}
-
-		list = getIncludeCss();
-		for (int i = 0; i < list.length; i++) {
-			visualBuilder.addLinkNodeToHead(list[i].getLocation(), "yes");
-		}
-	}
-
-	public ResourceReference getRuntimeRelativeFolder(IFile file) {
-		ResourceReference[] list = RelativeFolderReferenceList.getInstance().getAllResources(file);
-		if (list.length > 0) {
-			return list[list.length - 1];
-		}
-		return null;
-	}
-
-	public ResourceReference getRuntimeAbsoluteFolder(IFile file) {
-		ResourceReference[] list = AbsoluteFolderReferenceList.getInstance().getAllResources(file);
-		if (list.length > 0) {
-			return list[list.length - 1];
-		}
-		return null;
-	}
-
-	public List<TaglibData> getTagLibs() {
-		List<TaglibData> clone = new ArrayList<TaglibData>();
-		Iterator iter = taglibs.iterator();
-		while (iter.hasNext()) {
-			TaglibData taglib = (TaglibData)iter.next();
-			//if (!taglib.inList(clone)) {
-			if (!clone.contains(taglib)) {
-				clone.add(taglib);
-			}
-		}
-		return clone;
-	}
-	
-	private boolean  buildTaglibsDifferences(List newTaglibs, List delTaglibs) {
-		Iterator lastIter = lastTaglibs.iterator();
-		while (lastIter.hasNext()) {
-			TaglibData oldTaglib = (TaglibData)lastIter.next();
-			Iterator newIter = newTaglibs.iterator();
-			while (newIter.hasNext()) {
-				//if (oldTaglib.isEquals((TaglibData)newIter.next())) {
-				if (oldTaglib.equals((TaglibData)newIter.next())) {
-					newIter.remove();
-					oldTaglib = null;
-					break;
-				}
-			}
-			if (oldTaglib != null) {
-				delTaglibs.add(oldTaglib);
-			}
-		}
-		return newTaglibs.size() > 0 || delTaglibs.size() > 0;
-	}
-	
-	public void fireTaglibsChanged() {
-		List newTaglibs = getTagLibs();
-		List delTaglibs = new ArrayList();
-		if (buildTaglibsDifferences(newTaglibs, delTaglibs)) {
-			if (VpeDebug.PRINT_SOURCE_MUTATION_EVENT) {
-				System.out.println(">>> TaglibsChanged");
-			}
-			for (int i = 0; i < taglibListeners.length; i++) {
-				taglibListeners[i].taglibPrefixChanged(null);
-				fireTaglibChanged(taglibListeners[i], newTaglibs, delTaglibs);
-			}
-			lastTaglibs = getTagLibs();
-		}
-		taglibChanged = false;
-	}
-	
-	private void fireTaglibChanged(VpeTaglibListener taglibListener, List newTaglibs, List delTaglibs) {
-		Iterator iter = delTaglibs.iterator();
-		while (iter.hasNext()) {
-			TaglibData taglib = (TaglibData)iter.next();
-			taglibListener.removeTaglib(taglib.getUri(), taglib.getPrefix());
-		}
-		iter = newTaglibs.iterator();
-		while (iter.hasNext()) {
-			TaglibData taglib = (TaglibData)iter.next();
-			taglibListener.addTaglib(taglib.getUri(), taglib.getPrefix());
-		}
-	}
-	
-	public boolean isTaglibChanged() {
-		//TODO Max Areshkau coused slow work vpe when we editing on source page text node 
-//		if (!taglibChanged) return false;
-//		List newTaglibs = getTagLibs();
-//		List delTaglibs = new ArrayList();
-//		return buildTaglibsDifferences(newTaglibs, delTaglibs);
-		return false;
-	}
-	
-	public WtpKbConnector getConnector() {
-		return connector;
-	}
-
-	boolean registerTaglibs(WtpKbConnector wtpKbConnector, VpeTaglibManager taglibManager, IDocument document) {
-		if(wtpKbConnector == null) return false;
-		TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(document);
-		if(taglibManager != null) {
-			List list = taglibManager.getTagLibs();
-			if(list != null) {
-				Iterator it = list.iterator();
-				while(it.hasNext()) {
-					TaglibData data = (TaglibData)it.next();
-					IEditorInput ei = editPart.getEditorInput();
-					TLDRegisterHelper.registerTld(data, (JspWtpKbConnector)wtpKbConnector, document, ei);
-				}
-				return true;
-			}
-		}
-		if(manager != null) {
-			List list = manager.getTaglibTrackers();
-			for (int i = 0; i < list.size(); i++) {
-				TaglibTracker tracker = (TaglibTracker)list.get(i);
-				if(tracker == null) continue;
-				String version = TLDVersionHelper.getTldVersion(tracker);
-				KbTldResource resource = new KbTldResource(tracker.getURI(), "", tracker.getPrefix(), version);
-				wtpKbConnector.registerResource(resource);
-			}
-			return true;
-		}
-		return false;
-	}
-	
-	public nsIDOMNode getCurrentVisualNode() {
-		return currentVisualNode;
-	}
-	
-	public void setCurrentVisualNode(nsIDOMNode currentVisualNode) {
-		this.currentVisualNode = currentVisualNode;
-	}
-
+		bundle.dispose();
+		clearAll();
+		editPart=null;
+		connector=null;
+		sourceBuilder=null;
+		visualBuilder=null;
+	}
+	
+	public BundleMap getBundle() {
+		return bundle;
+	}
+
+	public void addBundleDependency(Element sourceNode) {
+		bundleDependencySet.add(sourceNode);
+	}
+	
+	public void removeBundleDependency(Element sourceNode) {
+		bundleDependencySet.remove(sourceNode);
+	}
+	
+	public void refreshBundleValues() {
+		Iterator iterator = bundleDependencySet.iterator();
+		while (iterator.hasNext()) {
+			Element sourceElement = (Element) iterator.next();
+			visualBuilder.refreshBundleValues(sourceElement);
+		}
+	}
+	
+//	public boolean isCorrectNS(Node sourceNode) {
+//		String sourcePrefix = sourceNode.getPrefix();
+//		if (sourcePrefix == null || ((ElementImpl)sourceNode).isJSPTag()) {
+//			return true;
+//		}
+//		for (int i = 0; i < taglibs.size(); i++) {
+//			TaglibData taglib = (TaglibData)taglibs.get(i);
+//			if (sourcePrefix.equals(taglib.getPrefix())) {
+//				return true;
+//			}
+//		}
+//		return false;
+//	}
+	
+//	public String getSourceTaglibUri(Node sourceNode) {
+//		String sourcePrefix = sourceNode.getPrefix();
+//		if (sourcePrefix == null || ((ElementImpl)sourceNode).isJSPTag()) {
+//			return null;
+//		}
+//		for (int i = 0; i < taglibs.size(); i++) {
+//			TaglibData taglib = (TaglibData)taglibs.get(i);
+//			if (sourcePrefix.equals(taglib.getPrefix())) {
+//				return taglib.getUri();
+//			}
+//		}
+//		return null;
+//	}
+
+	public VpeEditorPart getEditPart() {
+		return editPart;
+	}
+
+	public void openIncludeFile(String file) {
+		IEditorInput input = editPart.getEditorInput();
+		IWorkbenchPage workbenchPage = VpePlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		try{
+		    IFile f = FileUtil.getFile(input, file);
+		    if (f != null) {
+				IDE.openEditor(workbenchPage, f, true);
+		    }
+		}catch(Exception ex){
+			VpePlugin.reportProblem(ex);
+		}
+	}
+
+	public ResourceReference[] getIncludeTaglibs() {
+		IEditorInput input = getEditPart().getEditorInput();
+		IFile file = null;
+		if (input instanceof IFileEditorInput) {
+	        file = ((IFileEditorInput)input).getFile();
+	    }
+		ResourceReference[] resourceReferences = new ResourceReference[0];
+		if (file != null) {
+		    resourceReferences = TaglibReferenceList.getInstance().getAllResources(file);
+		}
+	    return resourceReferences;
+	}
+
+	public ResourceReference[] getIncludeCss() {
+		IEditorInput input = getEditPart().getEditorInput();
+		IFile file = null;
+		if (input instanceof IFileEditorInput) {
+	        file = ((IFileEditorInput)input).getFile();
+	    }
+		ResourceReference[] resourceReferences = new ResourceReference[0];
+		if (file != null) {
+		    resourceReferences = CSSReferenceList.getInstance().getAllResources(file);
+		}
+		return resourceReferences;
+	}
+
+	public void installIncludeElements() {
+		ResourceReference[] list = getIncludeTaglibs();
+		for (int i = 0; i < list.length; i++) {
+			ResourceReference reference = list[i];
+//			setTaglib(i, reference.getLocation(), reference.getProperties(), false);
+		}
+
+		list = getIncludeCss();
+		for (int i = 0; i < list.length; i++) {
+			visualBuilder.addLinkNodeToHead(list[i].getLocation(), "yes");
+		}
+	}
+
+	public ResourceReference getRuntimeRelativeFolder(IFile file) {
+		ResourceReference[] list = RelativeFolderReferenceList.getInstance().getAllResources(file);
+		if (list.length > 0) {
+			return list[list.length - 1];
+		}
+		return null;
+	}
+
+	public ResourceReference getRuntimeAbsoluteFolder(IFile file) {
+		ResourceReference[] list = AbsoluteFolderReferenceList.getInstance().getAllResources(file);
+		if (list.length > 0) {
+			return list[list.length - 1];
+		}
+		return null;
+	}
+
+//	public List<TaglibData> getTagLibs() {
+//		List<TaglibData> clone = new ArrayList<TaglibData>();
+//		Iterator iter = taglibs.iterator();
+//		while (iter.hasNext()) {
+//			TaglibData taglib = (TaglibData)iter.next();
+//			if (!taglib.inList(clone)) {
+//				clone.add(taglib);
+//			}
+//		}
+//		return clone;
+//	}
+	
+//	private boolean  buildTaglibsDifferences(List newTaglibs, List delTaglibs) {
+//		Iterator lastIter = lastTaglibs.iterator();
+//		while (lastIter.hasNext()) {
+//			TaglibData oldTaglib = (TaglibData)lastIter.next();
+//			Iterator newIter = newTaglibs.iterator();
+//			while (newIter.hasNext()) {
+//				if (oldTaglib.isEquals((TaglibData)newIter.next())) {
+//					newIter.remove();
+//					oldTaglib = null;
+//					break;
+//				}
+//			}
+//			if (oldTaglib != null) {
+//				delTaglibs.add(oldTaglib);
+//			}
+//		}
+//		return newTaglibs.size() > 0 || delTaglibs.size() > 0;
+//	}
+	
+//	public void fireTaglibsChanged() {
+//		List newTaglibs = getTagLibs();
+//		List delTaglibs = new ArrayList();
+//		if (buildTaglibsDifferences(newTaglibs, delTaglibs)) {
+//			if (VpeDebug.PRINT_SOURCE_MUTATION_EVENT) {
+//				System.out.println(">>> TaglibsChanged");
+//			}
+//			for (int i = 0; i < taglibListeners.length; i++) {
+//				taglibListeners[i].taglibPrefixChanged(null);
+//				fireTaglibChanged(taglibListeners[i], newTaglibs, delTaglibs);
+//			}
+//			lastTaglibs = getTagLibs();
+//		}
+//		taglibChanged = false;
+//	}
+	
+	private void fireTaglibChanged(VpeTaglibListener taglibListener, List newTaglibs, List delTaglibs) {
+		Iterator iter = delTaglibs.iterator();
+		while (iter.hasNext()) {
+			TaglibData taglib = (TaglibData)iter.next();
+			taglibListener.removeTaglib(taglib.getUri(), taglib.getPrefix());
+		}
+		iter = newTaglibs.iterator();
+		while (iter.hasNext()) {
+			TaglibData taglib = (TaglibData)iter.next();
+			taglibListener.addTaglib(taglib.getUri(), taglib.getPrefix());
+		}
+	}
+	
+//	public boolean isTaglibChanged() {
+//		if (!taglibChanged) return false;
+//		List newTaglibs = getTagLibs();
+//		List delTaglibs = new ArrayList();
+//		return buildTaglibsDifferences(newTaglibs, delTaglibs);
+//	}
+	
+	public WtpKbConnector getConnector() {
+		return connector;
+	}
+
+	public void addTaglibListener(VpeTaglibListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public List<TaglibData> getTagLibs() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	public void removeTaglibListener(VpeTaglibListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void setReferenceNode(Node node) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/**
+	 * @return the currentVisualNode
+	 */
+	public nsIDOMNode getCurrentVisualNode() {
+		return currentVisualNode;
+	}
+
+	/**
+	 * @param currentVisualNode the currentVisualNode to set
+	 */
+	public void setCurrentVisualNode(nsIDOMNode currentVisualNode) {
+		this.currentVisualNode = currentVisualNode;
+	}
+
+//	boolean registerTaglibs(WtpKbConnector wtpKbConnector, VpeTaglibManager taglibManager, IDocument document) {
+//		if(wtpKbConnector == null) return false;
+//		TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(document);
+//		if(taglibManager != null) {
+//			List list = taglibManager.getTagLibs();
+//			if(list != null) {
+//				Iterator it = list.iterator();
+//				while(it.hasNext()) {
+//					TaglibData data = (TaglibData)it.next();
+//					IEditorInput ei = editPart.getEditorInput();
+//					TLDRegisterHelper.registerTld(data, (JspWtpKbConnector)wtpKbConnector, document, ei);
+//				}
+//				return true;
+//			}
+//		}
+//		if(manager != null) {
+//			List list = manager.getTaglibTrackers();
+//			for (int i = 0; i < list.size(); i++) {
+//				TaglibTracker tracker = (TaglibTracker)list.get(i);
+//				if(tracker == null) continue;
+//				String version = TLDVersionHelper.getTldVersion(tracker);
+//				KbTldResource resource = new KbTldResource(tracker.getURI(), "", tracker.getPrefix(), version);
+//				wtpKbConnector.registerResource(resource);
+//			}
+//			return true;
+//		}
+//		return false;
+//	}
+	
+//	public nsIDOMNode getCurrentVisualNode() {
+//		return currentVisualNode;
+//	}
+//	
+//	public void setCurrentVisualNode(nsIDOMNode currentVisualNode) {
+//		this.currentVisualNode = currentVisualNode;
+//	}
+
 }
\ No newline at end of file

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeDomMapping.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeDomMapping.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeDomMapping.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -281,13 +281,13 @@
 			}
 			if (nodeMapping.getType() == VpeNodeMapping.ELEMENT_MAPPING) {
 				VpeElementMapping elementMapping = (VpeElementMapping)nodeMapping;
-				Map xmlnsMap = elementMapping.getXmlnsMap();
-				if (xmlnsMap != null) {
-					for (Iterator iter = xmlnsMap.values().iterator(); iter.hasNext();) {
-						pageContext.setTaglib(((Integer)iter.next()).intValue(), null, null, true);
-					}
-					elementMapping.setXmlnsMap(null);
-				}
+//				Map xmlnsMap = elementMapping.getXmlnsMap();
+//				if (xmlnsMap != null) {
+//					for (Iterator iter = xmlnsMap.values().iterator(); iter.hasNext();) {
+//						pageContext.setTaglib(((Integer)iter.next()).intValue(), null, null, true);
+//					}
+//					elementMapping.setXmlnsMap(null);
+//				}
 				if (elementMapping.getBorder() != null) {
 					visualMap.remove(elementMapping.getBorder());
 				}

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeElementMapping.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeElementMapping.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mapping/VpeElementMapping.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -10,9 +10,7 @@
  ******************************************************************************/ 
 package org.jboss.tools.vpe.editor.mapping;
 
-import java.util.Map;
 import java.util.Set;
-
 import org.jboss.tools.vpe.editor.template.VpeTemplate;
 import org.jboss.tools.vpe.editor.template.expression.VpeExpressionBuilder;
 import org.mozilla.interfaces.nsIDOMElement;
@@ -22,7 +20,7 @@
 public class VpeElementMapping extends VpeNodeMapping {
 	private VpeTemplate template;
 	private Set ifDependencySet;
-	private Map xmlnsMap;
+//	private Map xmlnsMap;
 	private Object data;
 	private nsIDOMElement border;
 	
@@ -44,14 +42,14 @@
 		return template;
 	}
 	
-	public Map getXmlnsMap() {
-		return xmlnsMap;
-	}
+//	public Map getXmlnsMap() {
+//		return xmlnsMap;
+//	}
+//	
+//	public void setXmlnsMap(Map xmlnsMap) {
+//		this.xmlnsMap = xmlnsMap;
+//	}
 	
-	public void setXmlnsMap(Map xmlnsMap) {
-		this.xmlnsMap = xmlnsMap;
-	}
-	
 	public Object getData() {
 		return data;
 	}

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeHtmlTemplate.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeHtmlTemplate.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeHtmlTemplate.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -108,10 +108,12 @@
 				} else if (VpeTemplateManager.TAG_ANY.equals(name)) {
 					type = TYPE_ANY;
 					creator = new VpeAnyCreator(templateSection, dependencyMap, caseSensitive);
-				} else if (VpeTemplateManager.TAG_TAGLIB.equals(name)) {
-					type = TYPE_TAGLIB;
-					creator = new VpeTaglibCreator(templateSection, dependencyMap);
-				} else if (VpeTemplateManager.TAG_LINK.equals(name)) {
+				} 
+//				else if (VpeTemplateManager.TAG_TAGLIB.equals(name)) {
+//					type = TYPE_TAGLIB;
+//					creator = new VpeTaglibCreator(templateSection, dependencyMap);
+//				}
+				else if (VpeTemplateManager.TAG_LINK.equals(name)) {
 					type = TYPE_LINK;
 					creator = new VpeLinkCreator(templateSection, dependencyMap, caseSensitive);
 				} else if (VpeTemplateManager.TAG_LOAD_BUNDLE.equals(name)) {
@@ -308,14 +310,15 @@
 
 	private String getPageLocale(VpePageContext pageContext, IDOMElement sourceElement) {
 		IStructuredModel model = null;
-		try {	
-			List<TaglibData> taglibs = pageContext.getTagLibs();
+		try {
+			//TODO JBIDE-788 Max Areshkau Fix That
+//			List<TaglibData> taglibs = pageContext.getTagLibs();
 			// Find F tracker
 			TaglibData fTD = null;
-			for (int i = 0; i < taglibs.size(); i++) {
-				TaglibData td = (TaglibData)taglibs.get(i);
-				if ("http://java.sun.com/jsf/core".equals(td.getUri())) fTD = td;
-			}
+//			for (int i = 0; i < taglibs.size(); i++) {
+//				TaglibData td = (TaglibData)taglibs.get(i);
+//				if ("http://java.sun.com/jsf/core".equals(td.getUri())) fTD = td;
+//			}
 	
 			if (fTD == null || fTD.getPrefix() == null || fTD.getPrefix().length() == 0) return null;
 

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeJspRootCreator.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeJspRootCreator.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeJspRootCreator.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -49,26 +49,26 @@
 
 	public void removeAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name) {
 	    int address = getAddress(name);
-	    if (address > 0) {
-		    pageContext.setTaglib(address, null, null, true);
-	    }
+//	    if (address > 0) {
+//		    pageContext.setTaglib(address, null, null, true);
+//	    }
 //		setTaglib(pageContext, sourceElement);
 	}
 	
-	private void setTaglib(VpePageContext pageContext, Element sourceElement) {
-	    attrs = new ArrayList();
-	    NamedNodeMap attributes = sourceElement.getAttributes();
-	    for (int i = 0; i < attributes.getLength(); i++) {
-	        Attr attr = (Attr)attributes.item(i);
-			String name = attr.getNodeName();
-			if (name.indexOf(ATTR_PREFIX) == 0) {
-			    String prefix = name.substring(6);
-			    String uri = attr.getNodeValue();
-				pageContext.setTaglib(attr.hashCode(), uri, prefix, true);
-				attrs.add(new AttrElement(attr.hashCode(), name));
-			}
-	    }
-	}
+//	private void setTaglib(VpePageContext pageContext, Element sourceElement) {
+//	    attrs = new ArrayList();
+//	    NamedNodeMap attributes = sourceElement.getAttributes();
+//	    for (int i = 0; i < attributes.getLength(); i++) {
+//	        Attr attr = (Attr)attributes.item(i);
+//			String name = attr.getNodeName();
+//			if (name.indexOf(ATTR_PREFIX) == 0) {
+//			    String prefix = name.substring(6);
+//			    String uri = attr.getNodeValue();
+////				pageContext.setTaglib(attr.hashCode(), uri, prefix, true);
+//				attrs.add(new AttrElement(attr.hashCode(), name));
+//			}
+//	    }
+//	}
 
 	private int getAddress(String name) {
 	    for (int i = 0; i < attrs.size(); i++) {

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTaglibCreator.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTaglibCreator.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTaglibCreator.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -21,39 +21,40 @@
 import org.mozilla.interfaces.nsIDOMDocument;
 import org.mozilla.interfaces.nsIDOMElement;
 
-public class VpeTaglibCreator extends VpeAbstractCreator {
-	private static final String ATTR_URI = "uri";
-	private static final String ATTR_PREFIX = "prefix";
-
-	VpeTaglibCreator(Element taglibElement, VpeDependencyMap dependencyMap) {
-		build(taglibElement, dependencyMap);
-	}
-
-	private void build(Element taglibElement, VpeDependencyMap dependencyMap) {
-		dependencyMap.setCreator(this, VpeExpressionBuilder.attrSignature(ATTR_URI, true));
-		dependencyMap.setCreator(this, VpeExpressionBuilder.attrSignature(ATTR_PREFIX, true));
-	}
-
-	public VpeCreatorInfo create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, nsIDOMElement visualElement, Map visualNodeMap) {
-		setTaglib(pageContext, (Element)sourceNode);
-		return null;
-	}
-
-	public void setAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name, String value) {
-		setTaglib(pageContext, sourceElement);
-	}
-
-	public void removeAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name) {
-		setTaglib(pageContext, sourceElement);
-	}
-
-	public void removeElement(VpePageContext pageContext, Element sourceElement, Map visualNodeMap) {
-		pageContext.setTaglib(sourceElement.hashCode(), null, null, false);
-	}
-	
-	private void setTaglib(VpePageContext pageContext, Element sourceElement) {
-		String uri = sourceElement.getAttribute(ATTR_URI);
-		String prefix = sourceElement.getAttribute(ATTR_PREFIX);
-		pageContext.setTaglib(sourceElement.hashCode(), uri, prefix, false);
-	}
+public class VpeTaglibCreator //extends VpeAbstractCreator 
+{
+//	private static final String ATTR_URI = "uri";
+//	private static final String ATTR_PREFIX = "prefix";
+//
+//	VpeTaglibCreator(Element taglibElement, VpeDependencyMap dependencyMap) {
+//		build(taglibElement, dependencyMap);
+//	}
+//
+//	private void build(Element taglibElement, VpeDependencyMap dependencyMap) {
+//		dependencyMap.setCreator(this, VpeExpressionBuilder.attrSignature(ATTR_URI, true));
+//		dependencyMap.setCreator(this, VpeExpressionBuilder.attrSignature(ATTR_PREFIX, true));
+//	}
+//
+//	public VpeCreatorInfo create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, nsIDOMElement visualElement, Map visualNodeMap) {
+//		setTaglib(pageContext, (Element)sourceNode);
+//		return null;
+//	}
+//
+//	public void setAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name, String value) {
+////		setTaglib(pageContext, sourceElement);
+//	}
+//
+//	public void removeAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name) {
+////		setTaglib(pageContext, sourceElement);
+//	}
+//
+//	public void removeElement(VpePageContext pageContext, Element sourceElement, Map visualNodeMap) {
+////		pageContext.setTaglib(sourceElement.hashCode(), null, null, false);
+//	}
+//	
+//	private void setTaglib(VpePageContext pageContext, Element sourceElement) {
+////		String uri = sourceElement.getAttribute(ATTR_URI);
+////		String prefix = sourceElement.getAttribute(ATTR_PREFIX);
+////		pageContext.setTaglib(sourceElement.hashCode(), uri, prefix, false);
+//	}
 }

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateManager.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateManager.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateManager.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -21,10 +21,17 @@
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
+import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
 import org.eclipse.wst.xml.core.internal.document.ElementImpl;
 import org.jboss.tools.common.xml.XMLUtilities;
+import org.jboss.tools.jst.web.tld.TaglibData;
 import org.jboss.tools.vpe.VpePlugin;
 import org.jboss.tools.vpe.editor.context.VpePageContext;
+import org.jboss.tools.vpe.editor.util.XmlUtil;
 import org.osgi.framework.Bundle;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -155,7 +162,11 @@
 	private static VpeTemplateManager instance = null;
 	private static Object monitor = new Object();
 
+	/**
+	 * Contains Mapping from URI and namespace
+	 */
 	private Map<String,String> templateTaglibs = new HashMap<String,String>();
+	
 	private Map<String,VpeTemplateSet> caseSensitiveTags = new HashMap<String,VpeTemplateSet>();
 	private Map<String,VpeTemplateSet> ignoreSensitiveTags = new HashMap<String,VpeTemplateSet>();
 	private VpeTemplate defTemplate;
@@ -172,9 +183,6 @@
 	 */
 	private static final String NAMESPACE_IDENTIFIER_ATTRIBUTE="namespaceIdentifier";
 	
-	static {
-//		withoutWhitespaceContainer.
-	}
 
 	private VpeTemplateManager() {
 	}
@@ -218,39 +226,57 @@
 		}
 		return null;
 	}
-	
+
 	private String getTemplateName(VpePageContext pageContext, Node sourceNode) {
+		
 		String sourcePrefix = sourceNode.getPrefix();
+		
 		if (sourcePrefix == null || ((ElementImpl)sourceNode).isJSPTag() || "jsp".equals(sourcePrefix)) {
+			
 			return sourceNode.getNodeName();
 		}
-		String templatePrefix = pageContext.getTemplateTaglibPrefix(sourcePrefix);
-		if (templatePrefix != null) {
-			return templatePrefix + ":" + sourceNode.getLocalName();
+		
+		TLDCMDocumentManager tldcmDocumentManager= TaglibController.getTLDCMDocumentManager(pageContext.getSourceBuilder().getStructuredTextViewer().getDocument());
+			
+		//we are editing jsp page added by Max Areshkau JBIDE-788
+		if(tldcmDocumentManager!=null) {
+				List<TaglibTracker> taglibs_JSP =  tldcmDocumentManager.getTaglibTrackers();
+				for (TaglibTracker taglibTracker : taglibs_JSP) {
+					if(sourcePrefix.equals(taglibTracker.getPrefix())) {
+						String sourceNodeUri = taglibTracker.getURI();
+						String templatePrefix = getTemplateTaglibPrefix(sourceNodeUri);
+						if(templatePrefix != null) {
+							return templatePrefix+":"+sourceNode.getLocalName();
+						} else {
+							return null;
+						}
+					}
+				}
+			} 
+
+	
+		List<TaglibData> taglibs = XmlUtil.processNode(sourceNode);
+		
+		TaglibData sourceNodeTaglib = XmlUtil.getTaglibForPrefix(sourcePrefix, taglibs);		
+
+		if(sourceNodeTaglib == null) {
+			
+			return null;
 		}
+		
+		String sourceNodeUri = sourceNodeTaglib.getUri();
+
+		
+		String templateTaglibPrefix = getTemplateTaglibPrefix(sourceNodeUri);
+
+		if(templateTaglibPrefix != null) {
+			
+			return templateTaglibPrefix+":"+sourceNode.getLocalName();
+		}
+
 		return null;
 	}
-
 	
-	
-	
-///////////////////////////////////////////////////////////////////////////	
-///////////////////////////////////////////////////////////////////////////	
-///////////////////////////////////////////////////////////////////////////	
-
-//	public VpeTemplateInfo createVisualCommentInfo(VpePageContext pageContext, Comment sourceComment, nsIDOMDocument visualDocument, nsIDOMElement visualParent) {
-//		VpeVisualElementInfo info = new VpeVisualElementInfo();
-//		VpeTemplate template = _getTemplate(pageContext, sourceComment, info);
-//		if (template == null || template.getType() != VpeHtmlTemplate.TYPE_COMMENT) {
-//			return null;
-//		}
-//		Map visualNodeMap = new HashMap();
-//		VpeCreatorInfo creatorInfo = template.createVisualComment(pageContext, sourceComment, visualDocument, visualParent, visualNodeMap);
-//		info.setTemplate(template);
-//		info.setVisualNodeMap(visualNodeMap);
-//		return new VpeTemplateInfo(info, creatorInfo);
-//	}
-	
 	public String getTemplateTaglibPrefix(String sourceUri) {
 		return (String)templateTaglibs.get(sourceUri);
 	}
@@ -299,7 +325,8 @@
 						setTagElement((Element)node, confElement);
 					} else if (TAG_TEMPLATE.equals(node.getNodeName())) {
 						setDefTemplate(createTemplate((Element)node,confElement, true));
-					} else if (TAG_TEMPLATE_TAGLIB.equals(node.getNodeName())) {
+					}  
+					else if (TAG_TEMPLATE_TAGLIB.equals(node.getNodeName())) {
 						setTemplateTaglib((Element)node);
 					}
 				}
@@ -357,6 +384,10 @@
 		}
 	}
 	
+	/**
+	 * Register templates taglibs from templates files
+	 * @param templateTaglibElement
+	 */
 	private void setTemplateTaglib(Element templateTaglibElement) {
 		String uri = templateTaglibElement.getAttribute(ATTR_DIRECTIVE_TAGLIB_URI);
 		String pefix = templateTaglibElement.getAttribute(ATTR_DIRECTIVE_TAGLIB_PREFIX);
@@ -367,42 +398,6 @@
 		}
 	}
 	
-//	private VpeTemplate _getTemplate(VpePageContext pageContext, Node sourceNode, VpeVisualElementInfo info) {
-//		VpeTemplate template = _getTemplateImpl(pageContext, sourceNode, info);
-//		if (template != null) {
-//			return template;
-//		} else {
-//			return defTemplate;
-//		}
-//	}
-	
-//	private VpeTemplate _getTemplateImpl(VpePageContext pageContext, Node sourceNode, VpeVisualElementInfo info) {
-//		String name = getTemplateName(pageContext, sourceNode);
-//		if (name == null) {
-//			return null;
-//		}
-//		VpeTemplateSet set = (VpeTemplateSet)caseSensitiveTags.get(name);
-//		if (set != null) {
-//			return set._getTemplate(pageContext, sourceNode, info, true);
-//		}
-//		set = (VpeTemplateSet)ignoreSensitiveTags.get(name.toLowerCase());
-//		if (set != null) {
-//			return set._getTemplate(pageContext, sourceNode, info, false);
-//		}
-//		return null;
-//	}
-//	
-//	public VpeVisualElementInfo pseudoVisualElementInfo(VpePageContext pageContext, Element sourceElement, nsIDOMElement visualElement) {
-//		VpeVisualElementInfo info = new VpeVisualElementInfo();
-//		VpeTemplate template = _getTemplate(pageContext, sourceElement, info);
-//		Map visualNodeMap = new HashMap();
-//		template.pseudoVisualElement(pageContext, sourceElement, visualElement, visualNodeMap);
-//		info.setTemplate(template);
-//		info.setNode(visualElement);
-//		info.setVisualNodeMap(visualNodeMap);
-//		return info;
-//	}
-	
 	public void setAnyTemplate(VpeAnyData data) {
 		String elementName = data.getName();
 		boolean caseSensitive = data.isCaseSensitive();
@@ -460,7 +455,7 @@
 		reload();
 	}
 	
-	private Element appendTaglib(Set prefixSet, Document document, Element root, VpeAnyData data) {
+	private Element appendTaglib(Set<?> prefixSet, Document document, Element root, VpeAnyData data) {
 		if (data.getPrefix() != null && data.getUri() != null &&
 				data.getPrefix().length() > 0 && data.getUri().length() > 0 &&
 				!prefixSet.contains(data.getPrefix())) {

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateSet.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateSet.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeTemplateSet.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -19,7 +19,7 @@
 import org.jboss.tools.vpe.editor.context.VpePageContext;
 
 public class VpeTemplateSet {
-	private List templates = new ArrayList();
+	private List<VpeTemplateSet> templates = new ArrayList<VpeTemplateSet>();
 	private VpeTemplate defTemplate;
 	
 	VpeTemplateSet(){

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeXmlnsCreator.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeXmlnsCreator.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/template/VpeXmlnsCreator.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -23,45 +23,46 @@
 import org.mozilla.interfaces.nsIDOMDocument;
 import org.mozilla.interfaces.nsIDOMElement;
 
-public class VpeXmlnsCreator extends VpeAbstractCreator {
-	private static final String ATTR_XMLNS = "xmlns";
-	
-	VpeXmlnsCreator(VpeDependencyMap dependencyMap) {
-		build(dependencyMap);
-	}
-		
-	private void build(VpeDependencyMap dependencyMap) {
-		if (dependencyMap != null) {
-			dependencyMap.setCreator(this, VpeExpressionBuilder.SIGNATURE_ANY_ATTR);
-		}
-	}
+public class VpeXmlnsCreator //extends VpeAbstractCreator
+{
+//	private static final String ATTR_XMLNS = "xmlns";
+//	
+//	VpeXmlnsCreator(VpeDependencyMap dependencyMap) {
+//		build(dependencyMap);
+//	}
+//		
+//	private void build(VpeDependencyMap dependencyMap) {
+//		if (dependencyMap != null) {
+//			dependencyMap.setCreator(this, VpeExpressionBuilder.SIGNATURE_ANY_ATTR);
+//		}
+//	}
 
-	public VpeCreatorInfo create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, nsIDOMElement visualElement, Map visualNodeMap) {
-		NamedNodeMap attrs = ((Element)sourceNode).getAttributes();
-		if (attrs != null) {
-			for (int i = 0; i < attrs.getLength(); i++) {
-				addTaglib(pageContext, (Element)sourceNode, visualNodeMap, attrs.item(i).getNodeName());
-			}
-		}
-		return null;
-	}
+//	public VpeCreatorInfo create(VpePageContext pageContext, Node sourceNode, nsIDOMDocument visualDocument, nsIDOMElement visualElement, Map visualNodeMap) {
+//		NamedNodeMap attrs = ((Element)sourceNode).getAttributes();
+//		if (attrs != null) {
+//			for (int i = 0; i < attrs.getLength(); i++) {
+//				addTaglib(pageContext, (Element)sourceNode, visualNodeMap, attrs.item(i).getNodeName());
+//			}
+//		}
+//		return null;
+//	}
 
-	public void setAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name, String value) {
-		addTaglib(pageContext, sourceElement, visualNodeMap, name);
-	}
+//	public void setAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name, String value) {
+//		addTaglib(pageContext, sourceElement, visualNodeMap, name);
+//	}
 
-	public void removeAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name) {
-		Object id = visualNodeMap.get(name);
-		if (id != null) {
-			pageContext.setTaglib(((Integer)id).intValue(), null, null, true);
-		}
-	}
+//	public void removeAttribute(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String name) {
+//		Object id = visualNodeMap.get(name);
+//		if (id != null) {
+////			pageContext.setTaglib(((Integer)id).intValue(), null, null, true);
+//		}
+//	}
 
-	private void addTaglib(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String attrName) {
-		Attr attr = sourceElement.getAttributeNode(attrName);
-		if (ATTR_XMLNS.equals(attr.getPrefix())) {
-			visualNodeMap.put(attr.getNodeName(), Integer.valueOf(attr.hashCode()));
-			pageContext.setTaglib(attr.hashCode(), attr.getNodeValue(), attr.getLocalName(), true);
-		}
-	}
+//	private void addTaglib(VpePageContext pageContext, Element sourceElement, Map visualNodeMap, String attrName) {
+//		Attr attr = sourceElement.getAttributeNode(attrName);
+//		if (ATTR_XMLNS.equals(attr.getPrefix())) {
+//			visualNodeMap.put(attr.getNodeName(), Integer.valueOf(attr.hashCode()));
+////			pageContext.setTaglib(attr.hashCode(), attr.getNodeValue(), attr.getLocalName(), true);
+//		}
+//	}
 }

Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/XmlUtil.java
===================================================================
--- trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/XmlUtil.java	2008-02-07 13:37:02 UTC (rev 6154)
+++ trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/XmlUtil.java	2008-02-07 13:49:32 UTC (rev 6155)
@@ -11,13 +11,18 @@
 package org.jboss.tools.vpe.editor.util;
 
 import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.jboss.tools.jst.web.tld.TaglibData;
 import org.jboss.tools.vpe.VpePlugin;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
@@ -58,4 +63,95 @@
 			}
 		}
 	}
+	
+	/**
+	 * Returns List of taglibs which are available for current node.
+	 *  
+	 * @param node
+	 * @return
+	 */
+	public static List<TaglibData> processNode(Node node) {
+		
+		List<TaglibData> taglibs = new ArrayList<TaglibData>();
+		
+		if (node == null) {
+			
+			return taglibs;
+		}
+		
+		Node currentNode = node;
+		do {
+			NamedNodeMap attribList = currentNode.getAttributes();
+			if (null != attribList) {
+				for (int i = 0; i < attribList.getLength(); i++) {
+					Node tmp = attribList.item(i);
+					processAttribute(taglibs,(Attr)tmp, false);
+				}
+			}	
+			currentNode = currentNode.getParentNode();			
+
+		} while(currentNode!=null);
+
+		return taglibs;
+	}
+	/**
+	 * Processes taglib attribute
+	 * @param taglibs
+	 * @param attr
+	 * @param bScopePrefix
+	 */	
+	private static void processAttribute(List<TaglibData> taglibs, Attr attr, boolean bScopePrefix) {
+
+		String startStr = "xmlns:";
+		String name = attr.getName();
+		if (!name.startsWith(startStr)) {
+			return;
+		}
+		name = name.substring(startStr.length());
+		addTaglib(taglibs , attr.getValue(), name, true, bScopePrefix);
+		return;
+	}
+	
+	/**
+	 * Adds taglib to current taglibs
+	 * @param taglibs
+	 * @param newUri
+	 * @param newPrefix
+	 * @param ns
+	 * @param bScopePrefix
+	 */
+	private static void addTaglib(List<TaglibData> taglibs, String newUri, String newPrefix, boolean ns, boolean bScopePrefix) {	
+		boolean bHasSame = false;
+		for (int i = 0; i < taglibs.size(); i++) {
+			TaglibData taglib = (TaglibData)taglibs.get(i);
+			if (bScopePrefix && newPrefix.equals(taglib.getPrefix())) {
+				return;
+			}
+			if (newUri.equals(taglib.getUri()) && newPrefix.equals(taglib.getPrefix()) && ns == taglib.isNs()) {
+				bHasSame = true;
+				break;
+			}
+		}
+		if (!bHasSame) {
+			taglibs.add(new TaglibData(taglibs.size(), newUri, newPrefix, ns));
+		}
+	}
+	/**
+	 * Returns Taglib data by prefix
+	 * 
+	 * @param prefix
+	 * @param taglibData
+	 * @return
+	 */
+	public static TaglibData getTaglibForPrefix(String prefix, List<TaglibData> taglibData){
+				
+			for (TaglibData data : taglibData) {
+				
+				if(data.getPrefix()!=null && data.getPrefix().equalsIgnoreCase(prefix)) {
+					 return data;
+				}
+			}
+			
+			return null;
+	}
 }




More information about the jbosstools-commits mailing list