[jbosstools-commits] JBoss Tools SVN: r6990 - in trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp: support/kb and 1 other directory.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Tue Mar 18 11:40:24 EDT 2008


Author: mareshkau
Date: 2008-03-18 11:40:24 -0400 (Tue, 18 Mar 2008)
New Revision: 6990

Modified:
   trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPTextEditor.java
   trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/support/kb/WTPTextJspKbConnector.java
Log:
http://jira.jboss.org/jira/browse/JBIDE-1896, patch from Snjezana Peco was applied. It's fixed a memmory link error for editiong *.xhtml files.

Modified: trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPTextEditor.java
===================================================================
--- trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPTextEditor.java	2008-03-18 15:32:57 UTC (rev 6989)
+++ trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/jspeditor/JSPTextEditor.java	2008-03-18 15:40:24 UTC (rev 6990)
@@ -1,1131 +1,1131 @@
-/*******************************************************************************
- * 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.jst.jsp.jspeditor;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Properties;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextListener;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.TextEvent;
-import org.eclipse.jface.text.formatter.IContentFormatter;
-import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.jface.text.source.IOverviewRuler;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.IVerticalRuler;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP;
-import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.dnd.DropTargetAdapter;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.DropTargetListener;
-import org.eclipse.swt.dnd.FileTransfer;
-import org.eclipse.swt.dnd.HTMLTransfer;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.editors.text.ILocationProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetSorter;
-import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
-import org.eclipse.wst.sse.ui.internal.IModelProvider;
-import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
-import org.eclipse.wst.sse.ui.internal.actions.StructuredTextEditorActionConstants;
-import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
-import org.eclipse.wst.sse.ui.internal.contentoutline.ConfigurableContentOutlinePage;
-import org.eclipse.wst.sse.ui.internal.properties.ConfigurablePropertySheetPage;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ConfigurationPointCalculator;
-import org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration;
-import org.eclipse.wst.xml.core.internal.document.AttrImpl;
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.jboss.tools.common.core.resources.XModelObjectEditorInput;
-import org.jboss.tools.common.meta.action.XActionInvoker;
-import org.jboss.tools.common.model.XModelBuffer;
-import org.jboss.tools.common.model.XModelObject;
-import org.jboss.tools.common.model.XModelTransferBuffer;
-import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
-import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
-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.DropContext;
-import org.jboss.tools.common.model.ui.editors.dnd.context.InnerDragBuffer;
-import org.jboss.tools.common.model.ui.texteditors.TextMerge;
-import org.jboss.tools.common.model.ui.texteditors.dnd.TextEditorDrop;
-import org.jboss.tools.common.model.ui.texteditors.dnd.TextEditorDropProvider;
-import org.jboss.tools.common.model.ui.views.palette.IIgnoreSelection;
-import org.jboss.tools.common.model.ui.views.palette.PaletteInsertHelper;
-import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
-import org.jboss.tools.common.text.xml.IOccurrencePreferenceProvider;
-import org.jboss.tools.common.text.xml.XmlEditorPlugin;
-import org.jboss.tools.common.text.xml.ui.FreeCaretStyledText;
-import org.jboss.tools.jst.jsp.HTMLTextViewerConfiguration;
-import org.jboss.tools.jst.jsp.JSPTextViewerConfiguration;
-import org.jboss.tools.jst.jsp.JspEditorPlugin;
-import org.jboss.tools.jst.jsp.editor.IJSPTextEditor;
-import org.jboss.tools.jst.jsp.editor.ITextFormatter;
-import org.jboss.tools.jst.jsp.editor.IVisualContext;
-import org.jboss.tools.jst.jsp.editor.IVisualController;
-import org.jboss.tools.jst.jsp.outline.JSPContentOutlineConfiguration;
-import org.jboss.tools.jst.jsp.outline.JSPPropertySheetConfiguration;
-import org.jboss.tools.jst.jsp.preferences.VpePreference;
-import org.jboss.tools.jst.jsp.support.kb.WTPTextJspKbConnector;
-import org.jboss.tools.jst.jsp.text.xpl.IStructuredTextOccurrenceStructureProvider;
-import org.jboss.tools.jst.jsp.text.xpl.StructuredTextOccurrenceStructureProviderRegistry;
-import org.jboss.tools.jst.jsp.ui.action.ExtendedFormatAction;
-import org.jboss.tools.jst.jsp.ui.action.IExtendedAction;
-import org.jboss.tools.jst.web.tld.VpeTaglibManager;
-import org.jboss.tools.jst.web.tld.VpeTaglibManagerProvider;
-import org.w3c.dom.DocumentType;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author Jeremy
- *
- */
-public class JSPTextEditor extends StructuredTextEditor implements
-		ITextListener, IJSPTextEditor, ITextFormatter,
-		IOccurrencePreferenceProvider {
-	private IStructuredTextOccurrenceStructureProvider fOccurrenceModelUpdater;
-
-	TextEditorDrop dnd = new TextEditorDrop();
-
-	JSPMultiPageEditor parentEditor;
-
-	long timeStamp = -1;
-
-	long savedTimeStamp = -1;
-
-	IVisualController vpeController;
-	//Added By Max Areshkau
-	//Fix for JBIDE-788
-	protected SourceEditorPageContext pageContext = null;
-
-	public JSPTextEditor(JSPMultiPageEditor parentEditor) {
-		JspEditorPlugin.getDefault().initDefaultPluginPreferences();
-		dnd.setTextEditorDropProvider(new TextEditorDropProviderImpl());
-		this.parentEditor = parentEditor;
-		super
-				.setSourceViewerConfiguration(new JSPTextViewerConfiguration());
-	}
-	
-	protected void setSourceViewerConfiguration(SourceViewerConfiguration config) {
-		if (config instanceof StructuredTextViewerConfigurationJSP) {
-			if (!(config instanceof JSPTextViewerConfiguration)) {
-				config = new JSPTextViewerConfiguration();
-			}
-		} else if (config instanceof StructuredTextViewerConfigurationHTML) {
-			if (!(config instanceof HTMLTextViewerConfiguration)) {
-				config = new HTMLTextViewerConfiguration();
-			}
-		} else {
-			config = new JSPTextViewerConfiguration();
-		}
-		super.setSourceViewerConfiguration(config);
-	}
-
-	/** This is *only* for allowing unit tests to access the source configuration. */
-	public SourceViewerConfiguration getSourceViewerConfigurationForTest () {
-		return getSourceViewerConfiguration();
-	}
-	//Added By Max Areshkau
-	//Fix for JBIDE-788
-    public IVisualContext getPageContext() {
-    	
-		if (pageContext==null) {
-			pageContext = new SourceEditorPageContext();
-		}
-		IDocument document = getTextViewer().getDocument();
-		int offset = this.getTextViewer().getTextWidget().getCaretOffset();
-    	IndexedRegion treeNode = ContentAssistUtils.getNodeAt(this.getTextViewer(), offset);
-    	Node node = (Node) treeNode;
-		pageContext.setReferenceNode(node);
-    	pageContext.setDocument(document);
-		
-		return pageContext;
-	}
-	
-	protected void initializeDrop(ITextViewer textViewer) {
-
-		Composite c = textViewer.getTextWidget();
-		Label l = new Label(c, SWT.NONE);
-		l.dispose();
-	}
-
-	private ConfigurableContentOutlinePage fOutlinePage = null;
-
-	private OutlinePageListener fOutlinePageListener = null;
-
-	private IPropertySheetPage fPropertySheetPage;
-
-	public Object getAdapter(Class adapter) {
-		if (ISourceViewer.class.equals(adapter)) {
-			return JSPTextEditor.this.getSourceViewer();
-		} else if (IContentOutlinePage.class.equals(adapter)) {
-			if (fOutlinePage == null || fOutlinePage.getControl() == null
-					|| fOutlinePage.getControl().isDisposed()) {
-				IStructuredModel internalModel = getModel();
-				ContentOutlineConfiguration cfg = new JSPContentOutlineConfiguration(
-						this);
-				if (cfg != null) {
-					ConfigurableContentOutlinePage outlinePage = new ConfigurableContentOutlinePage();
-					outlinePage.setConfiguration(cfg);
-					if (internalModel != null) {
-						outlinePage.setInputContentTypeIdentifier(internalModel
-								.getContentTypeIdentifier());
-						outlinePage.setInput(internalModel);
-					}
-
-					if (fOutlinePageListener == null) {
-						fOutlinePageListener = new OutlinePageListener();
-					}
-
-					outlinePage
-							.addSelectionChangedListener(fOutlinePageListener);
-					outlinePage.addDoubleClickListener(fOutlinePageListener);
-
-					fOutlinePage = outlinePage;
-				}
-			}
-			return fOutlinePage;
-		} else if (IPropertySheetPage.class == adapter) {
-			if (fPropertySheetPage == null
-					|| fPropertySheetPage.getControl() == null
-					|| fPropertySheetPage.getControl().isDisposed()) {
-				JSPPropertySheetConfiguration cfg = new JSPPropertySheetConfiguration();
-				if (cfg != null) {
-					ConfigurablePropertySheetPage propertySheetPage = new ConfigurablePropertySheetPage();
-					propertySheetPage.setConfiguration(cfg);
-					fPropertySheetPage = propertySheetPage;
-					setSorter(cfg.getSorter(), propertySheetPage);
-				}
-			}
-			return fPropertySheetPage;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	private void setSorter(PropertySheetSorter sorter,
-			ConfigurablePropertySheetPage sheet) {
-		try {
-			Method method = PropertySheetPage.class.getDeclaredMethod(
-					"setSorter", new Class[] { PropertySheetSorter.class });
-			method.setAccessible(true);
-			method.invoke(sheet, new Object[] { sorter });
-		} catch (Exception e) {
-			JspEditorPlugin.getPluginLog().logError(e);
-		}
-	}
-
-	public String getEditorId() {
-		return JSPUIPlugin.ID;
-	}
-
-	public IStructuredTextOccurrenceStructureProvider getOccurrencePreferenceProvider() {
-		return fOccurrenceModelUpdater;
-	}
-
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-
-		StructuredTextOccurrenceStructureProviderRegistry registry = XmlEditorPlugin
-				.getDefault().getOccurrenceStructureProviderRegistry(
-						JspEditorPlugin.PLUGIN_ID);
-		fOccurrenceModelUpdater = registry
-				.getCurrentOccurrenceProvider(JspEditorPlugin.PLUGIN_ID);
-
-		if (fOccurrenceModelUpdater != null)
-			fOccurrenceModelUpdater.install(this, getTextViewer());
-
-		installActivePropmtSupport();
-
-		createDrop();
-		setModified(false);
-		getSourceViewer().removeTextListener(this);
-		getSourceViewer().addTextListener(this);
-
-		Object dtid = getSourceViewer().getTextWidget().getData("DropTarget");
-		if (dtid != null) {
-			if (dtid instanceof DropTarget) {
-				DropTarget dropTarget = (DropTarget) dtid;
-				dropTarget.addDropListener(new DropTargetAdapter() {
-					private FreeCaretStyledText getFreeCaretControl(
-							Object sourceOrTarget) {
-							if (sourceOrTarget == null)
-								return null;
-
-							Object control = null;
-
-							if (sourceOrTarget instanceof DropTarget) {
-								control = ((DropTarget) sourceOrTarget)
-										.getControl();
-							} else if (sourceOrTarget instanceof DragSource) {
-								control = ((DragSource) sourceOrTarget)
-										.getControl();
-							} else
-								return null;
-
-							if (control instanceof FreeCaretStyledText)
-								return (FreeCaretStyledText) control;
-						return null;
-					}
-
-					private int getPosition(StyledText t, int x, int y) {
-						try {
-							Point pp = t.toControl(x, y);
-							x = pp.x;
-							y = pp.y;
-							int lineIndex = (t.getTopPixel() + y)
-									/ t.getLineHeight();
-							if (lineIndex >= t.getLineCount()) {
-								return t.getCharCount();
-							} else {
-								int c = 0;
-								try {
-									c = t.getOffsetAtLocation(new Point(x, y));
-									if (c < 0)
-										c = 0;
-								} catch (Exception ex) {
-									c = t.getOffsetAtLine(lineIndex + 1)
-											- (t.getLineDelimiter() == null ? 0
-													: t.getLineDelimiter()
-															.length());
-								}
-								return c;
-							}
-						} catch (Exception e) {
-							return 0;
-						}
-					}
-
-					public void dragEnter(DropTargetEvent event) {
-						getFreeCaretControl(event.widget).enableFreeCaret(true);
-					}
-
-					public void dragLeave(DropTargetEvent event) {
-						getFreeCaretControl(event.widget).enableFreeCaret(false);
-					}
-
-					public void dragOperationChanged(DropTargetEvent event) {
-						getFreeCaretControl(event.widget).enableFreeCaret(false);
-					}
-
-					public void dragOver(DropTargetEvent event) {
-						FreeCaretStyledText fcst = getFreeCaretControl(event.widget);
-						int pos = getPosition(fcst, event.x, event.y);
-						Point p = fcst.getLocationAtOffset(pos);
-						fcst.myRedraw(p.x, p.y);
-					}
-
-					public void drop(DropTargetEvent event) {
-						getFreeCaretControl(event.widget).enableFreeCaret(false);
-					}
-				});
-			}
-		}
-	}
-
-	protected ISourceViewer createSourceViewer(Composite parent,
-			IVerticalRuler ruler, int styles) {
-		ISourceViewer sv = super.createSourceViewer(parent, ruler, styles);
-		sv.getTextWidget().addFocusListener(new TextFocusListener());
-		return sv;
-	}
-
-	protected StructuredTextViewer createStructedTextViewer(Composite parent,
-			IVerticalRuler verticalRuler, int styles) {
-		return new JSPStructuredTextViewer(parent, verticalRuler,
-				getOverviewRuler(), isOverviewRulerVisible(), styles,
-				parentEditor, this);
-	}
-
-	class TextFocusListener extends FocusAdapter {
-		public void focusLost(FocusEvent e) {
-			if (JSPTextEditor.super.isDirty()) {
-				Display.getDefault().syncExec(new Runnable() {
-					public void run() {
-						try {
-							Thread.sleep(200);
-						} catch (InterruptedException exc) {
-							JspEditorPlugin.getPluginLog().logError(exc);
-						}
-						save();
-					}
-				});
-			}
-		}
-	}
-
-	public void save() {
-		if (!lock && isModified()) {
-			lock = true;
-			try {
-				FileAnyImpl f = (FileAnyImpl) getModelObject();
-				if (f != null)
-					f.edit(getSourceViewer().getDocument().get());
-			} catch (Exception e) {
-				JspEditorPlugin.getPluginLog().logError(e);
-			} finally {
-				setModified(false);
-				lock = false;
-			}
-		}
-	}
-
-	boolean modified = false;
-
-	public void setModified(boolean set) {
-		if (this.modified != set) {
-			this.modified = set;
-			if (set) {
-				XModelObject o = getModelObject();
-				if (o != null)
-					o.setModified(true);
-			}
-			super.firePropertyChange(IEditorPart.PROP_DIRTY);
-		}
-	}
-	
-	public void updateModification() {
-		//added by Max Areshkau
-		//Fix for JBIDE-788
-		getPageContext().refreshBundleValues();
-		
-		XModelObject object = getModelObject();
-		if (object != null && !object.isModified() && isModified()) {
-			setModified(false);
-		} else {
-			firePropertyChange(ITextEditor.PROP_DIRTY);
-		}
-	}
-
-	public boolean isModified() {
-		return modified;
-	}
-
-	protected void doSetInput(IEditorInput input) throws CoreException {
-		super.doSetInput(XModelObjectEditorInput.checkInput(input));
-		if (getSourceViewer() != null
-				&& getSourceViewer().getDocument() != null) {
-			getSourceViewer().removeTextListener(this);
-			getSourceViewer().addTextListener(this);
-		}
-		if (listener != null)
-			listener.dispose();
-		listener = null;
-		XModelObject o = getModelObject();
-		if (o instanceof FileAnyImpl) {
-			listener = new BodyListenerImpl((FileAnyImpl) o);
-		}
-	}
-
-	boolean lock = false;
-
-	public boolean isDirty() {
-		if (getEditorInput() instanceof IModelObjectEditorInput) {
-			XModelObject o = getModelObject();
-			if (o != null && o.isModified())
-				return true;
-			else {
-				return isModified();
-			}
-		} else {
-			return super.isDirty();
-		}
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		XModelObject o = getModelObject();
-		super.doSave(monitor);
-		if (o != null && (monitor == null || !monitor.isCanceled())) {
-			if (o != null)
-				save();
-			if (getEditorInput() instanceof ILocationProvider) {
-				XModelObject p = o.getParent();
-				if (p instanceof FolderImpl) {
-					((FolderImpl) p).saveChild(o);
-				}
-			} else {
-				o.setModified(false);
-				XModelObjectLoaderUtil.updateModifiedOnSave(o);
-			}
-			super.firePropertyChange(IEditorPart.PROP_DIRTY);
-		}
-	}
-
-	public void firePropertyChangeDirty() {
-		super.firePropertyChange(IEditorPart.PROP_DIRTY);
-	}
-
-	public XModelObject getModelObject() {
-		if (getEditorInput() instanceof IModelObjectEditorInput) {
-			return ((IModelObjectEditorInput) getEditorInput())
-					.getXModelObject();
-		}
-		return null;
-	}
-
-	class TextEditorDropProviderImpl implements TextEditorDropProvider {
-
-		public ISourceViewer getSourceViewer() {
-			return JSPTextEditor.this.getSourceViewer();
-		}
-
-		public XModelObject getModelObject() {
-			return JSPTextEditor.this.getModelObject();
-		}
-
-		public void insert(Properties p) {
-			PaletteInsertHelper.insertIntoEditor(getSourceViewer(), p);
-		}
-
-	}
-
-	public void textChanged(TextEvent event) {
-		if (event.getDocumentEvent() != null) {
-			setModified(true);
-		}
-	}
-
-	public void doRevertToSaved() {
-		save();
-		XModelObject o = getModelObject();
-		if (o == null) {
-			super.doRevertToSaved();
-			return;
-		}
-		Properties p = new Properties();
-		XActionInvoker.invoke("DiscardActions.Discard", o, p);
-		if (!"true".equals(p.getProperty("done")))
-			return;
-		super.doRevertToSaved();
-		if (o.isModified())
-			o.setModified(false);
-		modified = false;
-		firePropertyChange(IEditorPart.PROP_DIRTY);
-		updatePartControl(getEditorInput());
-	}
-
-	public IAnnotationModel getAnnotationModel() {
-		return getSourceViewer().getAnnotationModel();
-	}
-
-	private WTPTextJspKbConnector wtpTextJspKbConnector;
-
-	private void installActivePropmtSupport() {
-		try {
-			IDocument document = getTextViewer().getDocument();
-			IStructuredModel model = null;
-			if (getDocumentProvider() instanceof IModelProvider) {
-				model = ((IModelProvider) getDocumentProvider())
-						.getModel(getEditorInput());
-			} else {
-				if (document instanceof IStructuredDocument) {
-					model = getModel();
-				}
-			}
-			if (wtpTextJspKbConnector == null
-					&& model != null
-					&& (getContentType().toLowerCase().indexOf("jsp") != -1 || getContentType()
-							.toLowerCase().indexOf("html") != -1)) {
-				wtpTextJspKbConnector = new WTPTextJspKbConnector(
-						getEditorInput(), document, model);
-				wtpTextJspKbConnector.setTaglibManagerProvider(parentEditor);
-			}
-		} catch (Exception x) {
-			JspEditorPlugin.getPluginLog().logError("Error while installing active prpmpting support", x);
-		}
-	}
-
-	private String getContentType() {
-		String type = null;
-		try {
-			type = getModel().getContentTypeIdentifier();
-		} finally {
-			if (type == null)
-				type = "";
-		}
-		return type;
-	}
-
-	public WTPTextJspKbConnector getWTPTextJspKbConnector() {
-		return wtpTextJspKbConnector;
-	}
-
-	public static class JSPStructuredTextViewer extends StructuredTextViewer
-			implements VpeTaglibManagerProvider, IIgnoreSelection {
-
-		boolean insertFromPallete = false;
-
-		private VpeTaglibManagerProvider provider;
-
-		private JSPTextEditor editor;
-
-		private boolean ignore = false;
-
-		public JSPStructuredTextViewer(Composite parent,
-				IVerticalRuler verticalRuler, int styles) {
-			super(parent, verticalRuler, null, false, styles);
-		}
-
-		public JSPStructuredTextViewer(Composite parent,
-				IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
-				boolean showAnnotationsOverview, int styles,
-				VpeTaglibManagerProvider provider, JSPTextEditor editor) {
-			super(parent, verticalRuler, overviewRuler,
-					showAnnotationsOverview, styles);
-			this.provider = provider;
-			this.editor = editor;
-		}
-
-		protected StyledText createTextWidget(Composite parent, int styles) {
-			return new FreeCaretStyledText(parent, styles);
-		}
-
-		public VpeTaglibManager getTaglibManager() {
-			//added by Max Areshkau
-			//Fix for JBIDE-788
-			if (getEditor() != null) {
-				if(getEditor().getPageContext() instanceof VpeTaglibManager)
-				
-					
-				return (VpeTaglibManager)getEditor().getPageContext();
-			}
-			return null;
-		}
-
-		public boolean doesIgnore() {
-			return ignore;
-		}
-
-		public void setIgnore(boolean ignore) {
-			this.ignore = ignore;
-		}
-
-		public void doOperation(int operation) {
-			if (operation == UNDO || operation == REDO
-					|| operation == FORMAT_DOCUMENT
-					|| operation == FORMAT_ACTIVE_ELEMENTS) {
-				if (editor.getVPEController() != null) {
-					editor.getVPEController().preLongOperation();
-				}
-			}
-
-			super.doOperation(operation);
-
-			if (operation == UNDO || operation == REDO
-					|| operation == FORMAT_DOCUMENT
-					|| operation == FORMAT_ACTIVE_ELEMENTS) {
-				if (editor.getVPEController() != null) {
-					editor.getVPEController().postLongOperation();
-				}
-			}
-		}
-				
-		protected void handleDispose() {
-			if (editor != null && editor.getSourceViewer() != null && editor.getSourceViewer().getTextWidget() != null && editor.getVPEController() != null) {
-				StyledText widget = editor.getSourceViewer().getTextWidget();
-				widget.removeSelectionListener(editor.getVPEController());
-			}
-			super.handleDispose();
-		}
-	
-
-		/**
-		 * @return the editor
-		 */
-		//Added By Max Areshkau
-		//Fix for JBIDE-788
-		public JSPTextEditor getEditor() {
-			return editor;
-		}
-
-		/**
-		 * @param editor the editor to set
-		 */
-		//Added By Max Areshkau
-		//Fix for JBIDE-788
-		public void setEditor(JSPTextEditor editor) {
-			this.editor = editor;
-		}
-	
-	}
-	public JSPMultiPageEditor getParentEditor() {
-		return parentEditor;
-	}
-
-	public void setVPEController(IVisualController c) {
-		vpeController = c;
-	}
-
-	public IVisualController getVPEController() {
-		return vpeController;
-	}
-
-	public void runDropCommand(final String flavor, final String data) {
-		XModelBuffer b = XModelTransferBuffer.getInstance().getBuffer();
-		final XModelObject o = b == null ? null : b.source();
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				if(o != null && !XModelTransferBuffer.getInstance().isEnabled()) {
-					XModelTransferBuffer.getInstance().enable();
-					XModelTransferBuffer.getInstance().getBuffer().addSource(o);
-				}
-				try {
-					DropData dropData = new DropData(flavor,
-						data,
-						getEditorInput(), getSourceViewer(),
-						getSelectionProvider());
-					dropData.setAttributeName(dropContext.getAttributeName());
-					IDropCommand dropCommand = DropCommandFactory.getInstance().getDropCommand(flavor, JSPTagProposalFactory.getInstance());
-
-					boolean promptAttributes = "yes".equals(VpePreference.ALWAYS_REQUEST_FOR_ATTRIBUTE.getValue());
-					dropCommand.getDefaultModel().setPromptForTagAttributesRequired(promptAttributes);
-					dropCommand.execute(dropData);
-				} finally {
-					XModelTransferBuffer.getInstance().disable();
-				}
-			}
-		});
-	}
-
-	private void createDrop() {
-		DropTarget target = new DropTarget(getSourceViewer().getTextWidget(),
-				DND.DROP_MOVE | DND.DROP_COPY);
-		Transfer[] types = new Transfer[] { ModelTransfer.getInstance(),
-				HTMLTransfer.getInstance(), TextTransfer.getInstance(),
-				FileTransfer.getInstance() };
-		target.setTransfer(types);
-		target.addDropListener(new DTL());
-	}
-
-	DropContext dropContext = new DropContext();
-
-	class DTL implements DropTargetListener {
-		int lastpos = -1;
-
-		int lastdetail = -1;
-
-		public void dragEnter(DropTargetEvent event) {
-			lastpos = -1;
-		}
-
-		public void dragLeave(DropTargetEvent event) {
-			lastpos = -1;
-		}
-
-		public void dragOperationChanged(DropTargetEvent event) {
-		}
-
-		public void dragOver(DropTargetEvent event) {
-			if (!isEditable()
-					|| (getModelObject() != null && !getModelObject()
-							.isObjectEditable())) {
-				event.detail = DND.DROP_NONE;
-				return;
-			}
-			dropContext.setDropTargetEvent(event);
-			if (dropContext.getFlavor() == null) {
-				event.detail = DND.DROP_NONE;
-				return;
-			}
-			// Drop from VPE to Source is forbidden
-			if (dropContext.getFlavor().equals("text/html")) {
-				if (InnerDragBuffer.object != null) {
-					event.detail = DND.DROP_NONE;
-				}
-				return;
-			}
-			int pos = getPosition(event.x, event.y);
-			if (lastpos == pos && pos >= 0) {
-				pos = lastpos;
-				event.detail = lastdetail;
-				return;
-			}
-			lastpos = pos;
-			dropContext.clean();
-			getSourceViewer().getDocument();
-			IndexedRegion region = getModel().getIndexedRegion(pos);
-			if (region instanceof ElementImpl) {
-				ElementImpl jspElement = (ElementImpl) region;
-				NamedNodeMap attributes = jspElement.getAttributes();
-				if (pos == jspElement.getStartOffset()
-						|| pos == jspElement.getEndStartOffset()) {
-					event.detail = lastdetail = DND.DROP_MOVE;
-					return;
-				}
-				for (int i = 0; i < attributes.getLength(); i++) {
-					Node attribute = attributes.item(i);
-					if (attribute instanceof AttrImpl) {
-						AttrImpl jspAttr = (AttrImpl) attribute;
-						ITextRegion valueRegion = jspAttr.getValueRegion();
-						if (valueRegion == null) {
-							event.detail = lastdetail = DND.DROP_NONE;
-							return;
-						}
-						int startPos = jspElement.getStartOffset()
-								+ valueRegion.getStart();
-						int endPos = jspElement.getStartOffset()
-								+ valueRegion.getTextEnd();
-						if (pos > startPos && pos < endPos) {
-							dropContext.setOverAttributeValue(true);
-							dropContext.setAttributeName(jspAttr.getNodeName());
-							event.detail = lastdetail = DND.DROP_MOVE;
-							return;
-						}
-					}
-				}
-				event.detail = lastdetail = DND.DROP_NONE;
-			} else if (region instanceof Text
-					&& isInsideResponseRedirect((Text) region, pos
-							- region.getStartOffset())) {
-				dropContext.setOverAttributeValue(true);
-				event.detail = lastdetail = DND.DROP_MOVE;
-			} else if (region instanceof Text) {
-				event.detail = lastdetail = DND.DROP_MOVE;
-			} else if (region instanceof DocumentType) {
-				event.detail = lastdetail = DND.DROP_NONE;
-			} else if (region == null) {
-				//new place
-				event.detail = lastdetail = DND.DROP_MOVE;
-			}
-		}
-
-		public void drop(DropTargetEvent event) {
-			int offset = getPosition(event.x, event.y);
-			selectAndReveal(offset, 0);
-			dropContext.runDropCommand(JSPTextEditor.this, event);
-		}
-
-		public void dropAccept(DropTargetEvent event) {
-		}
-
-	}
-
-	private int getPosition(int x, int y) {
-		try {
-			ISourceViewer v = getSourceViewer();
-			StyledText t = v.getTextWidget();
-			Point pp = t.toControl(x, y);
-			x = pp.x;
-			y = pp.y;
-			int lineIndex = (t.getTopPixel() + y) / t.getLineHeight();
-			if (lineIndex >= t.getLineCount()) {
-				return t.getCharCount();
-			} else {
-				int c = 0;
-				try {
-					c = t.getOffsetAtLocation(new Point(x, y));
-					if (c < 0)
-						c = 0;
-				} catch (Exception ex) {
-					c = t.getOffsetAtLine(lineIndex + 1)
-							- (t.getLineDelimiter() == null ? 0 : t
-									.getLineDelimiter().length());
-				}
-				return c;
-			}
-		} catch (Exception e) {
-			return 0;
-		}
-	}
-
-	public String[] getConfigurationPoints() {
-		String contentTypeIdentifierID = null;
-		if (getModel() != null)
-			contentTypeIdentifierID = getModel().getContentTypeIdentifier();
-		return ConfigurationPointCalculator.getConfigurationPoints(this,
-				contentTypeIdentifierID, ConfigurationPointCalculator.SOURCE,
-				StructuredTextEditor.class);
-	}
-
-	public void formatTextRegion(IDocument document, IRegion region) {
-		SourceViewerConfiguration conf = getSourceViewerConfiguration();
-
-		if (conf instanceof StructuredTextViewerConfiguration) {
-			StructuredTextViewerConfiguration stvc = (StructuredTextViewerConfiguration) conf;
-			IContentFormatter f = stvc.getContentFormatter(getSourceViewer());
-			f.format(document, region);
-		}
-	}
-
-	Point storedSelection = new Point(0, 0);
-
-	protected void handleCursorPositionChanged() {
-		super.handleCursorPositionChanged();
-		ISelection selection = getSelectionProvider().getSelection();
-		Point p = getTextViewer().getTextWidget().getSelection();
-		if (storedSelection == null || !storedSelection.equals(p)) {
-			storedSelection = p;
-			if (selection instanceof ITextSelection) {
-				ITextSelection ts = (ITextSelection) selection;
-				if (ts.getLength() == 0) {
-					if (vpeController != null) {
-						vpeController
-								.selectionChanged(new SelectionChangedEvent(
-										getSelectionProvider(),
-										getSelectionProvider().getSelection()));
-					}
-				}
-			}
-		}
-	}
-
-	static int firingSelectionFailedCount = 0;
-
-	private class OutlinePageListener implements IDoubleClickListener,
-			ISelectionChangedListener {
-		public void doubleClick(DoubleClickEvent event) {
-			if (event.getSelection().isEmpty())
-				return;
-
-			int start = -1;
-			int length = 0;
-			if (event.getSelection() instanceof IStructuredSelection) {
-				ISelection currentSelection = getSelectionProvider()
-						.getSelection();
-				if (currentSelection instanceof IStructuredSelection) {
-					Object current = ((IStructuredSelection) currentSelection)
-							.toArray();
-					Object newSelection = ((IStructuredSelection) event
-							.getSelection()).toArray();
-					if (!current.equals(newSelection)) {
-						IStructuredSelection selection = (IStructuredSelection) event
-								.getSelection();
-						Object o = selection.getFirstElement();
-						if (o instanceof IndexedRegion) {
-							start = ((IndexedRegion) o).getStartOffset();
-							length = ((IndexedRegion) o).getEndOffset() - start;
-						} else if (o instanceof ITextRegion) {
-							start = ((ITextRegion) o).getStart();
-							length = ((ITextRegion) o).getEnd() - start;
-						} else if (o instanceof IRegion) {
-							start = ((ITextRegion) o).getStart();
-							length = ((ITextRegion) o).getLength();
-						}
-					}
-				}
-			} else if (event.getSelection() instanceof ITextSelection) {
-				start = ((ITextSelection) event.getSelection()).getOffset();
-				length = ((ITextSelection) event.getSelection()).getLength();
-			}
-			if (start > -1) {
-				getSourceViewer().setRangeIndication(start, length, false);
-				selectAndReveal(start, length);
-			}
-		}
-
-		public void selectionChanged(SelectionChangedEvent event) {
-			if (event.getSelection().isEmpty() || isFiringSelection())
-				return;
-
-			boolean ignoreSelection = false;
-			if (getSourceViewer() != null
-					&& getSourceViewer() instanceof IIgnoreSelection) {
-				IIgnoreSelection is = ((IIgnoreSelection) getSourceViewer());
-				ignoreSelection = is.doesIgnore();
-			}
-			if (getSourceViewer() != null
-					&& getSourceViewer().getTextWidget() != null
-					&& !getSourceViewer().getTextWidget().isDisposed()
-					&& !getSourceViewer().getTextWidget().isFocusControl()
-					&& !ignoreSelection) {
-				int start = -1;
-				int length = 0;
-				if (event.getSelection() instanceof IStructuredSelection) {
-					ISelection current = getSelectionProvider().getSelection();
-					if (current instanceof IStructuredSelection) {
-						Object[] currentSelection = ((IStructuredSelection) current)
-								.toArray();
-						Object[] newSelection = ((IStructuredSelection) event
-								.getSelection()).toArray();
-						if (!Arrays.equals(currentSelection, newSelection)) {
-							if (newSelection.length > 0) {
-								/*
-								 * No ordering is guaranteed for multiple
-								 * selection
-								 */
-								Object o = newSelection[0];
-								if (o instanceof IndexedRegion) {
-									start = ((IndexedRegion) o)
-											.getStartOffset();
-									int end = ((IndexedRegion) o)
-											.getEndOffset();
-									if (newSelection.length > 1) {
-										for (int i = 1; i < newSelection.length; i++) {
-											start = Math
-													.min(
-															start,
-															((IndexedRegion) newSelection[i])
-																	.getStartOffset());
-											end = Math
-													.max(
-															end,
-															((IndexedRegion) newSelection[i])
-																	.getEndOffset());
-										}
-										length = end - start;
-									}
-								} else if (o instanceof ITextRegion) {
-									start = ((ITextRegion) o).getStart();
-									int end = ((ITextRegion) o).getEnd();
-									if (newSelection.length > 1) {
-										for (int i = 1; i < newSelection.length; i++) {
-											start = Math
-													.min(
-															start,
-															((ITextRegion) newSelection[i])
-																	.getStart());
-											end = Math
-													.max(
-															end,
-															((ITextRegion) newSelection[i])
-																	.getEnd());
-										}
-										length = end - start;
-									}
-								} else if (o instanceof IRegion) {
-									start = ((IRegion) o).getOffset();
-									int end = start + ((IRegion) o).getLength();
-									if (newSelection.length > 1) {
-										for (int i = 1; i < newSelection.length; i++) {
-											start = Math.min(start,
-													((IRegion) newSelection[i])
-															.getOffset());
-											end = Math
-													.max(
-															end,
-															((IRegion) newSelection[i])
-																	.getOffset()
-																	+ ((IRegion) newSelection[i])
-																			.getLength());
-										}
-										length = end - start;
-									}
-								}
-							}
-						}
-					}
-				} else if (event.getSelection() instanceof ITextSelection) {
-					start = ((ITextSelection) event.getSelection()).getOffset();
-				}
-				if (start > -1) {
-					updateRangeIndication0(event.getSelection());
-					selectAndReveal(start, length);
-				}
-			}
-		}
-
-		Method m = null;
-
-		private boolean isFiringSelection() {
-			if (getSelectionProvider() == null)
-				return false;
-			if (firingSelectionFailedCount > 0)
-				return false;
-			try {
-				if (m == null) {
-					Class c = getSelectionProvider().getClass();
-					m = c.getDeclaredMethod("isFiringSelection", new Class[0]);
-					m.setAccessible(true);
-				}
-				Boolean b = (Boolean) m.invoke(getSelectionProvider(),
-						new Object[0]);
-				return b.booleanValue();
-			} catch (Exception e) {
-				firingSelectionFailedCount++;
-				JspEditorPlugin.getPluginLog().logError(e);
-			}
-			return false;
-		}
-	}
-
-	private void updateRangeIndication0(ISelection selection) {
-		if (selection instanceof IStructuredSelection
-				&& !((IStructuredSelection) selection).isEmpty()) {
-			Object[] objects = ((IStructuredSelection) selection).toArray();
-			if (objects.length > 0) {
-				int start = ((IndexedRegion) objects[0]).getStartOffset();
-				int end = ((IndexedRegion) objects[objects.length - 1])
-						.getEndOffset();
-				getSourceViewer().setRangeIndication(start, end - start, false);
-			} else {
-				getSourceViewer().removeRangeIndication();
-			}
-		} else {
-			if (selection instanceof ITextSelection) {
-				getSourceViewer().setRangeIndication(
-						((ITextSelection) selection).getOffset(),
-						((ITextSelection) selection).getLength(), false);
-			} else {
-				getSourceViewer().removeRangeIndication();
-			}
-		}
-	}
-
-	protected IExtendedAction createExtendedAction(String actionID) {
-		if (StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT
-				.equals(actionID)
-				|| ITextEditorActionConstants.UNDO.equals(actionID)
-				|| ITextEditorActionConstants.REDO.equals(actionID)) {
-			return new ExtendedFormatAction(this, actionID);
-		}
-		return null;
-	}
-
-	protected void initializeEditor() {
-		super.initializeEditor();
-		getPreferenceStore();
-	}
-
-	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.jst.jsp.jspeditor;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.Properties;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.formatter.IContentFormatter;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP;
+import org.eclipse.jst.jsp.ui.internal.JSPUIPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.HTMLTransfer;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.editors.text.ILocationProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheetSorter;
+import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
+import org.eclipse.wst.sse.ui.internal.IModelProvider;
+import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.internal.actions.StructuredTextEditorActionConstants;
+import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils;
+import org.eclipse.wst.sse.ui.internal.contentoutline.ConfigurableContentOutlinePage;
+import org.eclipse.wst.sse.ui.internal.properties.ConfigurablePropertySheetPage;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.ConfigurationPointCalculator;
+import org.eclipse.wst.sse.ui.views.contentoutline.ContentOutlineConfiguration;
+import org.eclipse.wst.xml.core.internal.document.AttrImpl;
+import org.eclipse.wst.xml.core.internal.document.ElementImpl;
+import org.jboss.tools.common.core.resources.XModelObjectEditorInput;
+import org.jboss.tools.common.meta.action.XActionInvoker;
+import org.jboss.tools.common.model.XModelBuffer;
+import org.jboss.tools.common.model.XModelObject;
+import org.jboss.tools.common.model.XModelTransferBuffer;
+import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
+import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
+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.DropContext;
+import org.jboss.tools.common.model.ui.editors.dnd.context.InnerDragBuffer;
+import org.jboss.tools.common.model.ui.texteditors.TextMerge;
+import org.jboss.tools.common.model.ui.texteditors.dnd.TextEditorDrop;
+import org.jboss.tools.common.model.ui.texteditors.dnd.TextEditorDropProvider;
+import org.jboss.tools.common.model.ui.views.palette.IIgnoreSelection;
+import org.jboss.tools.common.model.ui.views.palette.PaletteInsertHelper;
+import org.jboss.tools.common.model.util.XModelObjectLoaderUtil;
+import org.jboss.tools.common.text.xml.IOccurrencePreferenceProvider;
+import org.jboss.tools.common.text.xml.XmlEditorPlugin;
+import org.jboss.tools.common.text.xml.ui.FreeCaretStyledText;
+import org.jboss.tools.jst.jsp.HTMLTextViewerConfiguration;
+import org.jboss.tools.jst.jsp.JSPTextViewerConfiguration;
+import org.jboss.tools.jst.jsp.JspEditorPlugin;
+import org.jboss.tools.jst.jsp.editor.IJSPTextEditor;
+import org.jboss.tools.jst.jsp.editor.ITextFormatter;
+import org.jboss.tools.jst.jsp.editor.IVisualContext;
+import org.jboss.tools.jst.jsp.editor.IVisualController;
+import org.jboss.tools.jst.jsp.outline.JSPContentOutlineConfiguration;
+import org.jboss.tools.jst.jsp.outline.JSPPropertySheetConfiguration;
+import org.jboss.tools.jst.jsp.preferences.VpePreference;
+import org.jboss.tools.jst.jsp.support.kb.WTPTextJspKbConnector;
+import org.jboss.tools.jst.jsp.text.xpl.IStructuredTextOccurrenceStructureProvider;
+import org.jboss.tools.jst.jsp.text.xpl.StructuredTextOccurrenceStructureProviderRegistry;
+import org.jboss.tools.jst.jsp.ui.action.ExtendedFormatAction;
+import org.jboss.tools.jst.jsp.ui.action.IExtendedAction;
+import org.jboss.tools.jst.web.tld.VpeTaglibManager;
+import org.jboss.tools.jst.web.tld.VpeTaglibManagerProvider;
+import org.w3c.dom.DocumentType;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+/**
+ * @author Jeremy
+ *
+ */
+public class JSPTextEditor extends StructuredTextEditor implements
+		ITextListener, IJSPTextEditor, ITextFormatter,
+		IOccurrencePreferenceProvider {
+	private IStructuredTextOccurrenceStructureProvider fOccurrenceModelUpdater;
+
+	TextEditorDrop dnd = new TextEditorDrop();
+
+	JSPMultiPageEditor parentEditor;
+
+	long timeStamp = -1;
+
+	long savedTimeStamp = -1;
+
+	IVisualController vpeController;
+	//Added By Max Areshkau
+	//Fix for JBIDE-788
+	protected SourceEditorPageContext pageContext = null;
+
+	public JSPTextEditor(JSPMultiPageEditor parentEditor) {
+		JspEditorPlugin.getDefault().initDefaultPluginPreferences();
+		dnd.setTextEditorDropProvider(new TextEditorDropProviderImpl());
+		this.parentEditor = parentEditor;
+		super
+				.setSourceViewerConfiguration(new JSPTextViewerConfiguration());
+	}
+	
+	protected void setSourceViewerConfiguration(SourceViewerConfiguration config) {
+		if (config instanceof StructuredTextViewerConfigurationJSP) {
+			if (!(config instanceof JSPTextViewerConfiguration)) {
+				config = new JSPTextViewerConfiguration();
+			}
+		} else if (config instanceof StructuredTextViewerConfigurationHTML) {
+			if (!(config instanceof HTMLTextViewerConfiguration)) {
+				config = new HTMLTextViewerConfiguration();
+			}
+		} else {
+			config = new JSPTextViewerConfiguration();
+		}
+		super.setSourceViewerConfiguration(config);
+	}
+
+	/** This is *only* for allowing unit tests to access the source configuration. */
+	public SourceViewerConfiguration getSourceViewerConfigurationForTest () {
+		return getSourceViewerConfiguration();
+	}
+	//Added By Max Areshkau
+	//Fix for JBIDE-788
+    public IVisualContext getPageContext() {
+    	
+		if (pageContext==null) {
+			pageContext = new SourceEditorPageContext();
+		}
+		IDocument document = getTextViewer().getDocument();
+		int offset = this.getTextViewer().getTextWidget().getCaretOffset();
+    	IndexedRegion treeNode = ContentAssistUtils.getNodeAt(this.getTextViewer(), offset);
+    	Node node = (Node) treeNode;
+		pageContext.setReferenceNode(node);
+    	pageContext.setDocument(document);
+		
+		return pageContext;
+	}
+	
+	protected void initializeDrop(ITextViewer textViewer) {
+
+		Composite c = textViewer.getTextWidget();
+		Label l = new Label(c, SWT.NONE);
+		l.dispose();
+	}
+
+	private ConfigurableContentOutlinePage fOutlinePage = null;
+
+	private OutlinePageListener fOutlinePageListener = null;
+
+	private IPropertySheetPage fPropertySheetPage;
+
+	public Object getAdapter(Class adapter) {
+		if (ISourceViewer.class.equals(adapter)) {
+			return JSPTextEditor.this.getSourceViewer();
+		} else if (IContentOutlinePage.class.equals(adapter)) {
+			if (fOutlinePage == null || fOutlinePage.getControl() == null
+					|| fOutlinePage.getControl().isDisposed()) {
+				IStructuredModel internalModel = getModel();
+				ContentOutlineConfiguration cfg = new JSPContentOutlineConfiguration(
+						this);
+				if (cfg != null) {
+					ConfigurableContentOutlinePage outlinePage = new ConfigurableContentOutlinePage();
+					outlinePage.setConfiguration(cfg);
+					if (internalModel != null) {
+						outlinePage.setInputContentTypeIdentifier(internalModel
+								.getContentTypeIdentifier());
+						outlinePage.setInput(internalModel);
+					}
+
+					if (fOutlinePageListener == null) {
+						fOutlinePageListener = new OutlinePageListener();
+					}
+
+					outlinePage
+							.addSelectionChangedListener(fOutlinePageListener);
+					outlinePage.addDoubleClickListener(fOutlinePageListener);
+
+					fOutlinePage = outlinePage;
+				}
+			}
+			return fOutlinePage;
+		} else if (IPropertySheetPage.class == adapter) {
+			if (fPropertySheetPage == null
+					|| fPropertySheetPage.getControl() == null
+					|| fPropertySheetPage.getControl().isDisposed()) {
+				JSPPropertySheetConfiguration cfg = new JSPPropertySheetConfiguration();
+				if (cfg != null) {
+					ConfigurablePropertySheetPage propertySheetPage = new ConfigurablePropertySheetPage();
+					propertySheetPage.setConfiguration(cfg);
+					fPropertySheetPage = propertySheetPage;
+					setSorter(cfg.getSorter(), propertySheetPage);
+				}
+			}
+			return fPropertySheetPage;
+		}
+		return super.getAdapter(adapter);
+	}
+
+	private void setSorter(PropertySheetSorter sorter,
+			ConfigurablePropertySheetPage sheet) {
+		try {
+			Method method = PropertySheetPage.class.getDeclaredMethod(
+					"setSorter", new Class[] { PropertySheetSorter.class });
+			method.setAccessible(true);
+			method.invoke(sheet, new Object[] { sorter });
+		} catch (Exception e) {
+			JspEditorPlugin.getPluginLog().logError(e);
+		}
+	}
+
+	public String getEditorId() {
+		return JSPUIPlugin.ID;
+	}
+
+	public IStructuredTextOccurrenceStructureProvider getOccurrencePreferenceProvider() {
+		return fOccurrenceModelUpdater;
+	}
+
+	public void createPartControl(Composite parent) {
+		super.createPartControl(parent);
+
+		StructuredTextOccurrenceStructureProviderRegistry registry = XmlEditorPlugin
+				.getDefault().getOccurrenceStructureProviderRegistry(
+						JspEditorPlugin.PLUGIN_ID);
+		fOccurrenceModelUpdater = registry
+				.getCurrentOccurrenceProvider(JspEditorPlugin.PLUGIN_ID);
+
+		if (fOccurrenceModelUpdater != null)
+			fOccurrenceModelUpdater.install(this, getTextViewer());
+
+		installActivePropmtSupport();
+
+		createDrop();
+		setModified(false);
+		getSourceViewer().removeTextListener(this);
+		getSourceViewer().addTextListener(this);
+
+		Object dtid = getSourceViewer().getTextWidget().getData("DropTarget");
+		if (dtid != null) {
+			if (dtid instanceof DropTarget) {
+				DropTarget dropTarget = (DropTarget) dtid;
+				dropTarget.addDropListener(new DropTargetAdapter() {
+					private FreeCaretStyledText getFreeCaretControl(
+							Object sourceOrTarget) {
+							if (sourceOrTarget == null)
+								return null;
+
+							Object control = null;
+
+							if (sourceOrTarget instanceof DropTarget) {
+								control = ((DropTarget) sourceOrTarget)
+										.getControl();
+							} else if (sourceOrTarget instanceof DragSource) {
+								control = ((DragSource) sourceOrTarget)
+										.getControl();
+							} else
+								return null;
+
+							if (control instanceof FreeCaretStyledText)
+								return (FreeCaretStyledText) control;
+						return null;
+					}
+
+					private int getPosition(StyledText t, int x, int y) {
+						try {
+							Point pp = t.toControl(x, y);
+							x = pp.x;
+							y = pp.y;
+							int lineIndex = (t.getTopPixel() + y)
+									/ t.getLineHeight();
+							if (lineIndex >= t.getLineCount()) {
+								return t.getCharCount();
+							} else {
+								int c = 0;
+								try {
+									c = t.getOffsetAtLocation(new Point(x, y));
+									if (c < 0)
+										c = 0;
+								} catch (Exception ex) {
+									c = t.getOffsetAtLine(lineIndex + 1)
+											- (t.getLineDelimiter() == null ? 0
+													: t.getLineDelimiter()
+															.length());
+								}
+								return c;
+							}
+						} catch (Exception e) {
+							return 0;
+						}
+					}
+
+					public void dragEnter(DropTargetEvent event) {
+						getFreeCaretControl(event.widget).enableFreeCaret(true);
+					}
+
+					public void dragLeave(DropTargetEvent event) {
+						getFreeCaretControl(event.widget).enableFreeCaret(false);
+					}
+
+					public void dragOperationChanged(DropTargetEvent event) {
+						getFreeCaretControl(event.widget).enableFreeCaret(false);
+					}
+
+					public void dragOver(DropTargetEvent event) {
+						FreeCaretStyledText fcst = getFreeCaretControl(event.widget);
+						int pos = getPosition(fcst, event.x, event.y);
+						Point p = fcst.getLocationAtOffset(pos);
+						fcst.myRedraw(p.x, p.y);
+					}
+
+					public void drop(DropTargetEvent event) {
+						getFreeCaretControl(event.widget).enableFreeCaret(false);
+					}
+				});
+			}
+		}
+	}
+
+	protected ISourceViewer createSourceViewer(Composite parent,
+			IVerticalRuler ruler, int styles) {
+		ISourceViewer sv = super.createSourceViewer(parent, ruler, styles);
+		sv.getTextWidget().addFocusListener(new TextFocusListener());
+		return sv;
+	}
+
+	protected StructuredTextViewer createStructedTextViewer(Composite parent,
+			IVerticalRuler verticalRuler, int styles) {
+		return new JSPStructuredTextViewer(parent, verticalRuler,
+				getOverviewRuler(), isOverviewRulerVisible(), styles,
+				parentEditor, this);
+	}
+
+	class TextFocusListener extends FocusAdapter {
+		public void focusLost(FocusEvent e) {
+			if (JSPTextEditor.super.isDirty()) {
+				Display.getDefault().syncExec(new Runnable() {
+					public void run() {
+						try {
+							Thread.sleep(200);
+						} catch (InterruptedException exc) {
+							JspEditorPlugin.getPluginLog().logError(exc);
+						}
+						save();
+					}
+				});
+			}
+		}
+	}
+
+	public void save() {
+		if (!lock && isModified()) {
+			lock = true;
+			try {
+				FileAnyImpl f = (FileAnyImpl) getModelObject();
+				if (f != null)
+					f.edit(getSourceViewer().getDocument().get());
+			} catch (Exception e) {
+				JspEditorPlugin.getPluginLog().logError(e);
+			} finally {
+				setModified(false);
+				lock = false;
+			}
+		}
+	}
+
+	boolean modified = false;
+
+	public void setModified(boolean set) {
+		if (this.modified != set) {
+			this.modified = set;
+			if (set) {
+				XModelObject o = getModelObject();
+				if (o != null)
+					o.setModified(true);
+			}
+			super.firePropertyChange(IEditorPart.PROP_DIRTY);
+		}
+	}
+	
+	public void updateModification() {
+		//added by Max Areshkau
+		//Fix for JBIDE-788
+		getPageContext().refreshBundleValues();
+		
+		XModelObject object = getModelObject();
+		if (object != null && !object.isModified() && isModified()) {
+			setModified(false);
+		} else {
+			firePropertyChange(ITextEditor.PROP_DIRTY);
+		}
+	}
+
+	public boolean isModified() {
+		return modified;
+	}
+
+	protected void doSetInput(IEditorInput input) throws CoreException {
+		super.doSetInput(XModelObjectEditorInput.checkInput(input));
+		if (getSourceViewer() != null
+				&& getSourceViewer().getDocument() != null) {
+			getSourceViewer().removeTextListener(this);
+			getSourceViewer().addTextListener(this);
+		}
+		if (listener != null)
+			listener.dispose();
+		listener = null;
+		XModelObject o = getModelObject();
+		if (o instanceof FileAnyImpl) {
+			listener = new BodyListenerImpl((FileAnyImpl) o);
+		}
+	}
+
+	boolean lock = false;
+
+	public boolean isDirty() {
+		if (getEditorInput() instanceof IModelObjectEditorInput) {
+			XModelObject o = getModelObject();
+			if (o != null && o.isModified())
+				return true;
+			else {
+				return isModified();
+			}
+		} else {
+			return super.isDirty();
+		}
+	}
+
+	public void doSave(IProgressMonitor monitor) {
+		XModelObject o = getModelObject();
+		super.doSave(monitor);
+		if (o != null && (monitor == null || !monitor.isCanceled())) {
+			if (o != null)
+				save();
+			if (getEditorInput() instanceof ILocationProvider) {
+				XModelObject p = o.getParent();
+				if (p instanceof FolderImpl) {
+					((FolderImpl) p).saveChild(o);
+				}
+			} else {
+				o.setModified(false);
+				XModelObjectLoaderUtil.updateModifiedOnSave(o);
+			}
+			super.firePropertyChange(IEditorPart.PROP_DIRTY);
+		}
+	}
+
+	public void firePropertyChangeDirty() {
+		super.firePropertyChange(IEditorPart.PROP_DIRTY);
+	}
+
+	public XModelObject getModelObject() {
+		if (getEditorInput() instanceof IModelObjectEditorInput) {
+			return ((IModelObjectEditorInput) getEditorInput())
+					.getXModelObject();
+		}
+		return null;
+	}
+
+	class TextEditorDropProviderImpl implements TextEditorDropProvider {
+
+		public ISourceViewer getSourceViewer() {
+			return JSPTextEditor.this.getSourceViewer();
+		}
+
+		public XModelObject getModelObject() {
+			return JSPTextEditor.this.getModelObject();
+		}
+
+		public void insert(Properties p) {
+			PaletteInsertHelper.insertIntoEditor(getSourceViewer(), p);
+		}
+
+	}
+
+	public void textChanged(TextEvent event) {
+		if (event.getDocumentEvent() != null) {
+			setModified(true);
+		}
+	}
+
+	public void doRevertToSaved() {
+		save();
+		XModelObject o = getModelObject();
+		if (o == null) {
+			super.doRevertToSaved();
+			return;
+		}
+		Properties p = new Properties();
+		XActionInvoker.invoke("DiscardActions.Discard", o, p);
+		if (!"true".equals(p.getProperty("done")))
+			return;
+		super.doRevertToSaved();
+		if (o.isModified())
+			o.setModified(false);
+		modified = false;
+		firePropertyChange(IEditorPart.PROP_DIRTY);
+		updatePartControl(getEditorInput());
+	}
+
+	public IAnnotationModel getAnnotationModel() {
+		return getSourceViewer().getAnnotationModel();
+	}
+
+	private WTPTextJspKbConnector wtpTextJspKbConnector;
+
+	private void installActivePropmtSupport() {
+		try {
+			IDocument document = getTextViewer().getDocument();
+			IStructuredModel model = null;
+			if (getDocumentProvider() instanceof IModelProvider) {
+				model = ((IModelProvider) getDocumentProvider())
+						.getModel(getEditorInput());
+			} else {
+				if (document instanceof IStructuredDocument) {
+					model = getModel();
+				}
+			}
+			if (wtpTextJspKbConnector == null
+					&& model != null
+					&& (getContentType().toLowerCase().indexOf("jsp") != -1 || getContentType()
+							.toLowerCase().indexOf("html") != -1)) {
+				wtpTextJspKbConnector = new WTPTextJspKbConnector(
+						getEditorInput(), document, model);
+				wtpTextJspKbConnector.setTaglibManagerProvider(parentEditor);
+			}
+		} catch (Exception x) {
+			JspEditorPlugin.getPluginLog().logError("Error while installing active prpmpting support", x);
+		}
+	}
+
+	private String getContentType() {
+		String type = null;
+		try {
+			type = getModel().getContentTypeIdentifier();
+		} finally {
+			if (type == null)
+				type = "";
+		}
+		return type;
+	}
+
+	public WTPTextJspKbConnector getWTPTextJspKbConnector() {
+		return wtpTextJspKbConnector;
+	}
+
+	public static class JSPStructuredTextViewer extends StructuredTextViewer
+			implements VpeTaglibManagerProvider, IIgnoreSelection {
+
+		boolean insertFromPallete = false;
+
+		private VpeTaglibManagerProvider provider;
+
+		private JSPTextEditor editor;
+
+		private boolean ignore = false;
+
+		public JSPStructuredTextViewer(Composite parent,
+				IVerticalRuler verticalRuler, int styles) {
+			super(parent, verticalRuler, null, false, styles);
+		}
+
+		public JSPStructuredTextViewer(Composite parent,
+				IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
+				boolean showAnnotationsOverview, int styles,
+				VpeTaglibManagerProvider provider, JSPTextEditor editor) {
+			super(parent, verticalRuler, overviewRuler,
+					showAnnotationsOverview, styles);
+			this.provider = provider;
+			this.editor = editor;
+		}
+
+		protected StyledText createTextWidget(Composite parent, int styles) {
+			return new FreeCaretStyledText(parent, styles);
+		}
+
+		public VpeTaglibManager getTaglibManager() {
+			//added by Max Areshkau
+			//Fix for JBIDE-788
+			if (getEditor() != null) {
+				if(getEditor().getPageContext() instanceof VpeTaglibManager)
+				
+					
+				return (VpeTaglibManager)getEditor().getPageContext();
+			}
+			return null;
+		}
+
+		public boolean doesIgnore() {
+			return ignore;
+		}
+
+		public void setIgnore(boolean ignore) {
+			this.ignore = ignore;
+		}
+
+		public void doOperation(int operation) {
+			if (operation == UNDO || operation == REDO
+					|| operation == FORMAT_DOCUMENT
+					|| operation == FORMAT_ACTIVE_ELEMENTS) {
+				if (editor.getVPEController() != null) {
+					editor.getVPEController().preLongOperation();
+				}
+			}
+
+			super.doOperation(operation);
+
+			if (operation == UNDO || operation == REDO
+					|| operation == FORMAT_DOCUMENT
+					|| operation == FORMAT_ACTIVE_ELEMENTS) {
+				if (editor.getVPEController() != null) {
+					editor.getVPEController().postLongOperation();
+				}
+			}
+		}
+				
+		protected void handleDispose() {
+			if (editor != null && editor.getSourceViewer() != null && editor.getSourceViewer().getTextWidget() != null && editor.getVPEController() != null) {
+				StyledText widget = editor.getSourceViewer().getTextWidget();
+				widget.removeSelectionListener(editor.getVPEController());
+			}
+			super.handleDispose();
+		}
+	
+
+		/**
+		 * @return the editor
+		 */
+		//Added By Max Areshkau
+		//Fix for JBIDE-788
+		public JSPTextEditor getEditor() {
+			return editor;
+		}
+
+		/**
+		 * @param editor the editor to set
+		 */
+		//Added By Max Areshkau
+		//Fix for JBIDE-788
+		public void setEditor(JSPTextEditor editor) {
+			this.editor = editor;
+		}
+	
+	}
+	public JSPMultiPageEditor getParentEditor() {
+		return parentEditor;
+	}
+
+	public void setVPEController(IVisualController c) {
+		vpeController = c;
+	}
+
+	public IVisualController getVPEController() {
+		return vpeController;
+	}
+
+	public void runDropCommand(final String flavor, final String data) {
+		XModelBuffer b = XModelTransferBuffer.getInstance().getBuffer();
+		final XModelObject o = b == null ? null : b.source();
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				if(o != null && !XModelTransferBuffer.getInstance().isEnabled()) {
+					XModelTransferBuffer.getInstance().enable();
+					XModelTransferBuffer.getInstance().getBuffer().addSource(o);
+				}
+				try {
+					DropData dropData = new DropData(flavor,
+						data,
+						getEditorInput(), getSourceViewer(),
+						getSelectionProvider());
+					dropData.setAttributeName(dropContext.getAttributeName());
+					IDropCommand dropCommand = DropCommandFactory.getInstance().getDropCommand(flavor, JSPTagProposalFactory.getInstance());
+
+					boolean promptAttributes = "yes".equals(VpePreference.ALWAYS_REQUEST_FOR_ATTRIBUTE.getValue());
+					dropCommand.getDefaultModel().setPromptForTagAttributesRequired(promptAttributes);
+					dropCommand.execute(dropData);
+				} finally {
+					XModelTransferBuffer.getInstance().disable();
+				}
+			}
+		});
+	}
+
+	private void createDrop() {
+		DropTarget target = new DropTarget(getSourceViewer().getTextWidget(),
+				DND.DROP_MOVE | DND.DROP_COPY);
+		Transfer[] types = new Transfer[] { ModelTransfer.getInstance(),
+				HTMLTransfer.getInstance(), TextTransfer.getInstance(),
+				FileTransfer.getInstance() };
+		target.setTransfer(types);
+		target.addDropListener(new DTL());
+	}
+
+	DropContext dropContext = new DropContext();
+
+	class DTL implements DropTargetListener {
+		int lastpos = -1;
+
+		int lastdetail = -1;
+
+		public void dragEnter(DropTargetEvent event) {
+			lastpos = -1;
+		}
+
+		public void dragLeave(DropTargetEvent event) {
+			lastpos = -1;
+		}
+
+		public void dragOperationChanged(DropTargetEvent event) {
+		}
+
+		public void dragOver(DropTargetEvent event) {
+			if (!isEditable()
+					|| (getModelObject() != null && !getModelObject()
+							.isObjectEditable())) {
+				event.detail = DND.DROP_NONE;
+				return;
+			}
+			dropContext.setDropTargetEvent(event);
+			if (dropContext.getFlavor() == null) {
+				event.detail = DND.DROP_NONE;
+				return;
+			}
+			// Drop from VPE to Source is forbidden
+			if (dropContext.getFlavor().equals("text/html")) {
+				if (InnerDragBuffer.object != null) {
+					event.detail = DND.DROP_NONE;
+				}
+				return;
+			}
+			int pos = getPosition(event.x, event.y);
+			if (lastpos == pos && pos >= 0) {
+				pos = lastpos;
+				event.detail = lastdetail;
+				return;
+			}
+			lastpos = pos;
+			dropContext.clean();
+			getSourceViewer().getDocument();
+			IndexedRegion region = getModel().getIndexedRegion(pos);
+			if (region instanceof ElementImpl) {
+				ElementImpl jspElement = (ElementImpl) region;
+				NamedNodeMap attributes = jspElement.getAttributes();
+				if (pos == jspElement.getStartOffset()
+						|| pos == jspElement.getEndStartOffset()) {
+					event.detail = lastdetail = DND.DROP_MOVE;
+					return;
+				}
+				for (int i = 0; i < attributes.getLength(); i++) {
+					Node attribute = attributes.item(i);
+					if (attribute instanceof AttrImpl) {
+						AttrImpl jspAttr = (AttrImpl) attribute;
+						ITextRegion valueRegion = jspAttr.getValueRegion();
+						if (valueRegion == null) {
+							event.detail = lastdetail = DND.DROP_NONE;
+							return;
+						}
+						int startPos = jspElement.getStartOffset()
+								+ valueRegion.getStart();
+						int endPos = jspElement.getStartOffset()
+								+ valueRegion.getTextEnd();
+						if (pos > startPos && pos < endPos) {
+							dropContext.setOverAttributeValue(true);
+							dropContext.setAttributeName(jspAttr.getNodeName());
+							event.detail = lastdetail = DND.DROP_MOVE;
+							return;
+						}
+					}
+				}
+				event.detail = lastdetail = DND.DROP_NONE;
+			} else if (region instanceof Text
+					&& isInsideResponseRedirect((Text) region, pos
+							- region.getStartOffset())) {
+				dropContext.setOverAttributeValue(true);
+				event.detail = lastdetail = DND.DROP_MOVE;
+			} else if (region instanceof Text) {
+				event.detail = lastdetail = DND.DROP_MOVE;
+			} else if (region instanceof DocumentType) {
+				event.detail = lastdetail = DND.DROP_NONE;
+			} else if (region == null) {
+				//new place
+				event.detail = lastdetail = DND.DROP_MOVE;
+			}
+		}
+
+		public void drop(DropTargetEvent event) {
+			int offset = getPosition(event.x, event.y);
+			selectAndReveal(offset, 0);
+			dropContext.runDropCommand(JSPTextEditor.this, event);
+		}
+
+		public void dropAccept(DropTargetEvent event) {
+		}
+
+	}
+
+	private int getPosition(int x, int y) {
+		try {
+			ISourceViewer v = getSourceViewer();
+			StyledText t = v.getTextWidget();
+			Point pp = t.toControl(x, y);
+			x = pp.x;
+			y = pp.y;
+			int lineIndex = (t.getTopPixel() + y) / t.getLineHeight();
+			if (lineIndex >= t.getLineCount()) {
+				return t.getCharCount();
+			} else {
+				int c = 0;
+				try {
+					c = t.getOffsetAtLocation(new Point(x, y));
+					if (c < 0)
+						c = 0;
+				} catch (Exception ex) {
+					c = t.getOffsetAtLine(lineIndex + 1)
+							- (t.getLineDelimiter() == null ? 0 : t
+									.getLineDelimiter().length());
+				}
+				return c;
+			}
+		} catch (Exception e) {
+			return 0;
+		}
+	}
+
+	public String[] getConfigurationPoints() {
+		String contentTypeIdentifierID = null;
+		if (getModel() != null)
+			contentTypeIdentifierID = getModel().getContentTypeIdentifier();
+		return ConfigurationPointCalculator.getConfigurationPoints(this,
+				contentTypeIdentifierID, ConfigurationPointCalculator.SOURCE,
+				StructuredTextEditor.class);
+	}
+
+	public void formatTextRegion(IDocument document, IRegion region) {
+		SourceViewerConfiguration conf = getSourceViewerConfiguration();
+
+		if (conf instanceof StructuredTextViewerConfiguration) {
+			StructuredTextViewerConfiguration stvc = (StructuredTextViewerConfiguration) conf;
+			IContentFormatter f = stvc.getContentFormatter(getSourceViewer());
+			f.format(document, region);
+		}
+	}
+
+	Point storedSelection = new Point(0, 0);
+
+	protected void handleCursorPositionChanged() {
+		super.handleCursorPositionChanged();
+		ISelection selection = getSelectionProvider().getSelection();
+		Point p = getTextViewer().getTextWidget().getSelection();
+		if (storedSelection == null || !storedSelection.equals(p)) {
+			storedSelection = p;
+			if (selection instanceof ITextSelection) {
+				ITextSelection ts = (ITextSelection) selection;
+				if (ts.getLength() == 0) {
+					if (vpeController != null) {
+						vpeController
+								.selectionChanged(new SelectionChangedEvent(
+										getSelectionProvider(),
+										getSelectionProvider().getSelection()));
+					}
+				}
+			}
+		}
+	}
+
+	static int firingSelectionFailedCount = 0;
+
+	private class OutlinePageListener implements IDoubleClickListener,
+			ISelectionChangedListener {
+		public void doubleClick(DoubleClickEvent event) {
+			if (event.getSelection().isEmpty())
+				return;
+
+			int start = -1;
+			int length = 0;
+			if (event.getSelection() instanceof IStructuredSelection) {
+				ISelection currentSelection = getSelectionProvider()
+						.getSelection();
+				if (currentSelection instanceof IStructuredSelection) {
+					Object current = ((IStructuredSelection) currentSelection)
+							.toArray();
+					Object newSelection = ((IStructuredSelection) event
+							.getSelection()).toArray();
+					if (!current.equals(newSelection)) {
+						IStructuredSelection selection = (IStructuredSelection) event
+								.getSelection();
+						Object o = selection.getFirstElement();
+						if (o instanceof IndexedRegion) {
+							start = ((IndexedRegion) o).getStartOffset();
+							length = ((IndexedRegion) o).getEndOffset() - start;
+						} else if (o instanceof ITextRegion) {
+							start = ((ITextRegion) o).getStart();
+							length = ((ITextRegion) o).getEnd() - start;
+						} else if (o instanceof IRegion) {
+							start = ((ITextRegion) o).getStart();
+							length = ((ITextRegion) o).getLength();
+						}
+					}
+				}
+			} else if (event.getSelection() instanceof ITextSelection) {
+				start = ((ITextSelection) event.getSelection()).getOffset();
+				length = ((ITextSelection) event.getSelection()).getLength();
+			}
+			if (start > -1) {
+				getSourceViewer().setRangeIndication(start, length, false);
+				selectAndReveal(start, length);
+			}
+		}
+
+		public void selectionChanged(SelectionChangedEvent event) {
+			if (event.getSelection().isEmpty() || isFiringSelection())
+				return;
+
+			boolean ignoreSelection = false;
+			if (getSourceViewer() != null
+					&& getSourceViewer() instanceof IIgnoreSelection) {
+				IIgnoreSelection is = ((IIgnoreSelection) getSourceViewer());
+				ignoreSelection = is.doesIgnore();
+			}
+			if (getSourceViewer() != null
+					&& getSourceViewer().getTextWidget() != null
+					&& !getSourceViewer().getTextWidget().isDisposed()
+					&& !getSourceViewer().getTextWidget().isFocusControl()
+					&& !ignoreSelection) {
+				int start = -1;
+				int length = 0;
+				if (event.getSelection() instanceof IStructuredSelection) {
+					ISelection current = getSelectionProvider().getSelection();
+					if (current instanceof IStructuredSelection) {
+						Object[] currentSelection = ((IStructuredSelection) current)
+								.toArray();
+						Object[] newSelection = ((IStructuredSelection) event
+								.getSelection()).toArray();
+						if (!Arrays.equals(currentSelection, newSelection)) {
+							if (newSelection.length > 0) {
+								/*
+								 * No ordering is guaranteed for multiple
+								 * selection
+								 */
+								Object o = newSelection[0];
+								if (o instanceof IndexedRegion) {
+									start = ((IndexedRegion) o)
+											.getStartOffset();
+									int end = ((IndexedRegion) o)
+											.getEndOffset();
+									if (newSelection.length > 1) {
+										for (int i = 1; i < newSelection.length; i++) {
+											start = Math
+													.min(
+															start,
+															((IndexedRegion) newSelection[i])
+																	.getStartOffset());
+											end = Math
+													.max(
+															end,
+															((IndexedRegion) newSelection[i])
+																	.getEndOffset());
+										}
+										length = end - start;
+									}
+								} else if (o instanceof ITextRegion) {
+									start = ((ITextRegion) o).getStart();
+									int end = ((ITextRegion) o).getEnd();
+									if (newSelection.length > 1) {
+										for (int i = 1; i < newSelection.length; i++) {
+											start = Math
+													.min(
+															start,
+															((ITextRegion) newSelection[i])
+																	.getStart());
+											end = Math
+													.max(
+															end,
+															((ITextRegion) newSelection[i])
+																	.getEnd());
+										}
+										length = end - start;
+									}
+								} else if (o instanceof IRegion) {
+									start = ((IRegion) o).getOffset();
+									int end = start + ((IRegion) o).getLength();
+									if (newSelection.length > 1) {
+										for (int i = 1; i < newSelection.length; i++) {
+											start = Math.min(start,
+													((IRegion) newSelection[i])
+															.getOffset());
+											end = Math
+													.max(
+															end,
+															((IRegion) newSelection[i])
+																	.getOffset()
+																	+ ((IRegion) newSelection[i])
+																			.getLength());
+										}
+										length = end - start;
+									}
+								}
+							}
+						}
+					}
+				} else if (event.getSelection() instanceof ITextSelection) {
+					start = ((ITextSelection) event.getSelection()).getOffset();
+				}
+				if (start > -1) {
+					updateRangeIndication0(event.getSelection());
+					selectAndReveal(start, length);
+				}
+			}
+		}
+
+		Method m = null;
+
+		private boolean isFiringSelection() {
+			if (getSelectionProvider() == null)
+				return false;
+			if (firingSelectionFailedCount > 0)
+				return false;
+			try {
+				if (m == null) {
+					Class c = getSelectionProvider().getClass();
+					m = c.getDeclaredMethod("isFiringSelection", new Class[0]);
+					m.setAccessible(true);
+				}
+				Boolean b = (Boolean) m.invoke(getSelectionProvider(),
+						new Object[0]);
+				return b.booleanValue();
+			} catch (Exception e) {
+				firingSelectionFailedCount++;
+				JspEditorPlugin.getPluginLog().logError(e);
+			}
+			return false;
+		}
+	}
+
+	private void updateRangeIndication0(ISelection selection) {
+		if (selection instanceof IStructuredSelection
+				&& !((IStructuredSelection) selection).isEmpty()) {
+			Object[] objects = ((IStructuredSelection) selection).toArray();
+			if (objects.length > 0) {
+				int start = ((IndexedRegion) objects[0]).getStartOffset();
+				int end = ((IndexedRegion) objects[objects.length - 1])
+						.getEndOffset();
+				getSourceViewer().setRangeIndication(start, end - start, false);
+			} else {
+				getSourceViewer().removeRangeIndication();
+			}
+		} else {
+			if (selection instanceof ITextSelection) {
+				getSourceViewer().setRangeIndication(
+						((ITextSelection) selection).getOffset(),
+						((ITextSelection) selection).getLength(), false);
+			} else {
+				getSourceViewer().removeRangeIndication();
+			}
+		}
+	}
+
+	protected IExtendedAction createExtendedAction(String actionID) {
+		if (StructuredTextEditorActionConstants.ACTION_NAME_FORMAT_DOCUMENT
+				.equals(actionID)
+				|| ITextEditorActionConstants.UNDO.equals(actionID)
+				|| ITextEditorActionConstants.REDO.equals(actionID)) {
+			return new ExtendedFormatAction(this, actionID);
+		}
+		return null;
+	}
+
+	protected void initializeEditor() {
+		super.initializeEditor();
+		getPreferenceStore();
+	}
+
+	public void dispose() {
 		// some things in the configuration need to clean
 		// up after themselves
 		getSourceViewer().removeTextListener(this);
@@ -1139,69 +1139,75 @@
 		}
 		fOutlinePage=null;
 		fOutlinePageListener=null;
-		if (fOccurrenceModelUpdater != null) {
-			fOccurrenceModelUpdater.uninstall();
-			fOccurrenceModelUpdater = null;
-		}
-		super.dispose();
+		if (fOccurrenceModelUpdater != null) {
+			fOccurrenceModelUpdater.uninstall();
+			fOccurrenceModelUpdater = null;
+		}
+		if (pageContext != null) {
+			pageContext.dispose();
+			pageContext = null;
+		}
+		
 		if (wtpTextJspKbConnector != null) {
 			wtpTextJspKbConnector.setTaglibManagerProvider(null);
+			wtpTextJspKbConnector.dispose();
 			wtpTextJspKbConnector = null;
 		}
-		if (listener != null)
-			listener.dispose();
-		listener = null;
-	}
-
-	BodyListenerImpl listener = null;
-
-	class BodyListenerImpl implements FileAnyImpl.BodyListener {
-		FileAnyImpl file;
-
-		BodyListenerImpl(FileAnyImpl file) {
-			this.file = file;
-			file.addListener(this);
-		}
-
-		public void bodyChanged(String body) {
-			setText(body);
-		}
-
-		public void dispose() {
-			file.removeListener(this);
-		}
-	}
-
-	public void setText(String text) {
-		if (getSourceViewer() == null
-				|| getSourceViewer().getDocument() == null)
-			return;
-		String txt = getSourceViewer().getDocument().get();
-		if (txt != null && txt.length() > 0) {
-			if (!TextMerge.replace(getSourceViewer().getDocument(), text)) {
-				getSourceViewer().getDocument().set(text);
-			}
-		} else {
-			getSourceViewer().getDocument().set(text);
-		}
-	}
-
-	boolean isInsideResponseRedirect(Text textNode, int off) {
-		if (off < 0)
-			return false;
-		String START = "response.sendRedirect(\"";
-		String END = "\")";
-		String text = textNode.getNodeValue();
-		int i = 0;
-		while (i < text.length() && i < off) {
-			int i1 = text.indexOf(START, i);
-			if (i1 < 0 || i1 + START.length() > off)
-				return false;
-			int i2 = text.indexOf(END, i1 + START.length());
-			if (i2 < 0 || i2 >= off)
-				return true;
-			i = i2 + END.length();
-		}
-		return false;
-	}
-}
+		super.dispose();
+		if (listener != null)
+			listener.dispose();
+		listener = null;
+	}
+
+	BodyListenerImpl listener = null;
+
+	class BodyListenerImpl implements FileAnyImpl.BodyListener {
+		FileAnyImpl file;
+
+		BodyListenerImpl(FileAnyImpl file) {
+			this.file = file;
+			file.addListener(this);
+		}
+
+		public void bodyChanged(String body) {
+			setText(body);
+		}
+
+		public void dispose() {
+			file.removeListener(this);
+		}
+	}
+
+	public void setText(String text) {
+		if (getSourceViewer() == null
+				|| getSourceViewer().getDocument() == null)
+			return;
+		String txt = getSourceViewer().getDocument().get();
+		if (txt != null && txt.length() > 0) {
+			if (!TextMerge.replace(getSourceViewer().getDocument(), text)) {
+				getSourceViewer().getDocument().set(text);
+			}
+		} else {
+			getSourceViewer().getDocument().set(text);
+		}
+	}
+
+	boolean isInsideResponseRedirect(Text textNode, int off) {
+		if (off < 0)
+			return false;
+		String START = "response.sendRedirect(\"";
+		String END = "\")";
+		String text = textNode.getNodeValue();
+		int i = 0;
+		while (i < text.length() && i < off) {
+			int i1 = text.indexOf(START, i);
+			if (i1 < 0 || i1 + START.length() > off)
+				return false;
+			int i2 = text.indexOf(END, i1 + START.length());
+			if (i2 < 0 || i2 >= off)
+				return true;
+			i = i2 + END.length();
+		}
+		return false;
+	}
+}

Modified: trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/support/kb/WTPTextJspKbConnector.java
===================================================================
--- trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/support/kb/WTPTextJspKbConnector.java	2008-03-18 15:32:57 UTC (rev 6989)
+++ trunk/jst/plugins/org.jboss.tools.jst.jsp/src/org/jboss/tools/jst/jsp/support/kb/WTPTextJspKbConnector.java	2008-03-18 15:40:24 UTC (rev 6990)
@@ -1,455 +1,458 @@
-/*******************************************************************************
- * 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.jst.jsp.support.kb;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-
-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.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.xml.core.internal.document.NodeContainer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.jboss.tools.common.kb.KbConnector;
-import org.jboss.tools.common.kb.KbConnectorFactory;
-import org.jboss.tools.common.kb.KbConnectorType;
-import org.jboss.tools.common.kb.KbException;
-import org.jboss.tools.common.kb.KbResource;
-import org.jboss.tools.common.kb.TagDescriptor;
-import org.jboss.tools.jst.jsp.JspEditorPlugin;
-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.jst.web.tld.VpeTaglibManagerProvider;
-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;
-
-/**
- * @author Jeremy
- */
-public class WTPTextJspKbConnector implements KbConnector, VpeTaglibListener {
-	private KbConnector kbConnector;
-	private IDocument fDocument;
-	private IEditorInput fEditorInput;
-	private VpeTaglibManagerProvider taglibManagerProvider;
-
-	protected IStructuredModel model;
-	private Document dom;
-	protected int timerTaskCount = 0;
-//	protected boolean isGrammarInferenceEnabled;
-	protected static Timer timer = new Timer(true);
-
-	// Dinamic resources
-	
- 	private WTPKbdBundleNameResource fBundleNameResourceRegistered = null;
-	private WTPKbdBeanPropertyResource fBeanPropertyResourceRegistered = null;
-	private WTPKbdBundlePropertyResource fBundlePropertyResourceRegistered = null;
-	private WTPKbdActionResource fActionResourceRegistered = null;
-	private WTPKbdBeanMethodResource fBeanMethodResourceRegistered = null;
-	private WTPKbImageFileResource fImageFileResourced = null;
-	private WTPKbdManagedBeanNameResource fManagedBeanNameResourceRegistered = null;
-	private WTPKbJsfValuesResource fJSFValuesResource = null;
-	WTPKbdTaglibResource fTaglibResource = null;
-
-	public WTPTextJspKbConnector(IEditorInput editorInput, IDocument document, IStructuredModel model) {
-		try {
-			this.fDocument = document;
-			this.fEditorInput = editorInput;
-			this.model = model;
-
-			this.dom = (model instanceof IDOMModel) ? ((IDOMModel) model).getDocument() : null;
-
-			if (dom != null) {
-				new MyDocumentAdapter(dom);
-			}
-			kbConnector = KbConnectorFactory.getIntstance().createConnector(KbConnectorType.JSP_WTP_KB_CONNECTOR, document);
-			WTPKbdBundleNameResource bundleNameResource = new WTPKbdBundleNameResource(fEditorInput, this);
-			if (bundleNameResource.isReadyToUse()) {
-				fBundleNameResourceRegistered = bundleNameResource;
-				registerResource(fBundleNameResourceRegistered);
-			}
-			WTPKbdBeanPropertyResource beanPropertyResource = new WTPKbdBeanPropertyResource(fEditorInput, this);
-			if (beanPropertyResource.isReadyToUse()) {
-				fBeanPropertyResourceRegistered = beanPropertyResource;
-				registerResource(fBeanPropertyResourceRegistered);
-			}
-			WTPKbdBundlePropertyResource bundlePropertyResource = new WTPKbdBundlePropertyResource(fEditorInput, this);
-			if (bundlePropertyResource.isReadyToUse()) {
-				fBundlePropertyResourceRegistered = bundlePropertyResource;
-				registerResource(fBundlePropertyResourceRegistered);
-			}
-			WTPKbdActionResource actionResource = new WTPKbdActionResource(fEditorInput, this);
-			if (actionResource.isReadyToUse()) {
-				fActionResourceRegistered = actionResource;
-				registerResource(fActionResourceRegistered);
-			}
-			WTPKbdBeanMethodResource beanMethodResource = new WTPKbdBeanMethodResource(fEditorInput, this);
-			if (beanMethodResource.isReadyToUse()) {
-				fBeanMethodResourceRegistered = beanMethodResource;
-				registerResource(fBeanMethodResourceRegistered);
-			}
-			WTPKbImageFileResource imageFileResource = new WTPKbImageFileResource(fEditorInput);
-			if(imageFileResource.isReadyToUse()) {
-				fImageFileResourced = imageFileResource;
-				registerResource(fImageFileResourced);
-			}
-			WTPKbdManagedBeanNameResource managedBeanNameResource = new WTPKbdManagedBeanNameResource(fEditorInput, this);
-			if(managedBeanNameResource.isReadyToUse()) {
-				fManagedBeanNameResourceRegistered = managedBeanNameResource;
-				registerResource(fManagedBeanNameResourceRegistered);
-			}
-			WTPKbJsfValuesResource resource = new WTPKbJsfValuesResource(editorInput, this);
-			if(resource.isReadyToUse()) {
-				fJSFValuesResource = resource;
-				registerResource(fJSFValuesResource);
-			}
-			WTPKbdTaglibResource taglibResource = new WTPKbdTaglibResource(editorInput, this);
-			if(taglibResource.isReadyToUse()) {
-				fTaglibResource = taglibResource;
-				registerResource(fTaglibResource);
-			}
-			invokeDelayedUpdateKnownTagLists();
-		} catch(Exception e) {
-			JspEditorPlugin.getPluginLog().logError(e);
-		}
-	}
-
-	public void setTaglibManagerProvider(VpeTaglibManagerProvider taglibManagerProvider) {
-		this.taglibManagerProvider = taglibManagerProvider;
-	}
-
-
-	/**
-	 * @see org.jboss.tools.common.kb.KbConnector#queryTagInformation(java.lang.String)
-	 */
-	public TagDescriptor getTagInformation(String query) throws KbException {
-		return kbConnector.getTagInformation(query);
-	}
-
-	/**
-	 * @see org.jboss.tools.common.kb.KbConnector#getProposals(java.lang.String)
-	 */
-	public Collection getProposals(String query) throws KbException {
-		return kbConnector.getProposals(query);
-	}
-
-	/**
-	 * @see org.jboss.tools.common.kb.KbConnector#registerResource(org.jboss.tools.common.kb.KbResource)
-	 */
-	public boolean registerResource(KbResource resource) {
-		return kbConnector.registerResource(resource);
-	}
-	
-	public KbConnector getConnector() {
-		return kbConnector;
-	}
-
-	/**
-	 * @see org.jboss.tools.common.kb.KbConnector#unregisterResource(org.jboss.tools.common.kb.KbResource)
-	 */
-	public void unregisterResource(KbResource resource) {
-		kbConnector.unregisterResource(resource);
-	}
-
-	// Dinamic support
-	private Map<String,Object> trackers = new HashMap<String,Object>();
-	private Map<String,LoadBundleInfo> loadedBundles = new HashMap<String,LoadBundleInfo>();
-
-	private final static String[] TRACKERS_TO_WATCH = {"http://java.sun.com/jsf/core",
-		"https://ajax4jsf.dev.java.net/ajax"
-	};
-    private boolean taglibTrackerListenerInstalled = false;
-
-	public void invokeDelayedUpdateKnownTagLists() {
-		// Previous code is 
-		// timer.schedule(new MyTimerTask(), 500);
-		initTaglibPrefixes();
-		updateKnownTagLists();
-	}
-
-	private boolean isTrackerToWatch(String trackerUri) {
-		for(int i=0; TRACKERS_TO_WATCH != null && i<TRACKERS_TO_WATCH.length; i++) {
-			if (TRACKERS_TO_WATCH[i].equals(trackerUri)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	public void initTaglibPrefixes() {
-		trackers.clear();
-		if(taglibManagerProvider==null || taglibManagerProvider.getTaglibManager()==null) {
-			TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(fDocument);
-			if(manager!=null) {
-				List list = manager.getTaglibTrackers();
-				for(int i=0; i<list.size(); i++) {
-					TaglibTracker tracker = (TaglibTracker)list.get(i);
-					if (isTrackerToWatch(tracker.getURI())) {
-						trackers.put(tracker.getPrefix(), tracker);
-					}
-				}
-			}
-		} else {
-			List list = taglibManagerProvider.getTaglibManager().getTagLibs();
-			for(int i=0; i<list.size(); i++) {
-				TaglibData data = (TaglibData)list.get(i);
-				if (isTrackerToWatch(data.getUri())) {
-					trackers.put(data.getPrefix(), data);
-				}
-			}
-		}
-	}
-
-	public void taglibPrefixChanged(String[] prefixs) {
-		trackers.clear();
-		if(taglibManagerProvider==null || taglibManagerProvider.getTaglibManager()==null) {
-			TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(fDocument);
-			List list = manager.getTaglibTrackers();
-			for(int i=0; i<list.size(); i++) {
-				TaglibTracker tracker = (TaglibTracker)list.get(i);
-				if (isTrackerToWatch(tracker.getURI())) {
-					trackers.put(tracker.getPrefix(), tracker);
-				}
-			}
-		} else {
-			List list = taglibManagerProvider.getTaglibManager().getTagLibs();
-			for(int i=0; i<list.size(); i++) {
-				TaglibData data = (TaglibData)list.get(i);
-				if (isTrackerToWatch(data.getUri())) {
-					trackers.put(data.getPrefix(), data);
-				}
-			}
-		}
-		invokeDelayedUpdateKnownTagLists();
-	}
-
-	public void addTaglib(String uri, String prefix) {
-	}
-	
-	public void removeTaglib(String uri, String prefix) {
-	}
-
-    private boolean installTaglibTrackerListener() {
-    	if (taglibTrackerListenerInstalled) {
-			return true;
-    	}
-		if(taglibManagerProvider!=null) {
-			VpeTaglibManager manager = taglibManagerProvider.getTaglibManager();
-			if(manager!=null) {
-				manager.addTaglibListener(this);
-				taglibTrackerListenerInstalled = true;
-				return true;
-			}
-		}
-		return false;
-    }
-
-	public void updateKnownTagLists() {
-		loadedBundles.clear();
-		Element element = dom.getDocumentElement();
-		NodeList children = (NodeContainer)dom.getChildNodes();
-		installTaglibTrackerListener();
-		if (element != null) {
-			for (int i = 0; children != null && i < children.getLength(); i++) {
-				try {
-					IDOMNode xmlnode = (IDOMNode)children.item(i);
-					update((IDOMNode)xmlnode);
-				} catch (Exception x) {
-					JspEditorPlugin.getPluginLog().logError("Error while updating known tag lists", x);
-				}
-			}
-		}
-	}
-
-	private void update(IDOMNode element) {
-		if (element != null) {
-			registerKbResourceForNode(element);
-			for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
-				if (child instanceof IDOMNode) {
-					update((IDOMNode)child);
-				}
-			}
-		}
-	}
-
-	public class LoadBundleInfo {
-		IDOMNode loadBundleTag;
-		String basename;
-		String var;
-
-		LoadBundleInfo(IDOMNode element, String basename, String var) {
-			this.loadBundleTag = element;
-			this.basename = basename;
-			this.var = var;
-		}
-
-		int getLoadDeclarationOffset() {
-			return loadBundleTag.getStartOffset();
-		}
-
-		public String getBaseName() {
-			return basename;
-		}
-
-		String getVar() {
-			return var;
-		}
-	}
-
-	public Map getDeclaredBundles() {
-    	if (!taglibTrackerListenerInstalled) {
-    		initTaglibPrefixes();
-			updateKnownTagLists();
-    	}
-		return loadedBundles;
-	}
-
-	private void registerKbResourceForNode(IDOMNode node) {
-		try {
-			if (node == null) return;
-			String name = node.getNodeName();
-			if (name == null) return;
-			if (!name.endsWith("loadBundle")) return;
-			if (name.indexOf(':') == -1) return;
-			String prefix = name.substring(0, name.indexOf(':'));
-
-			if (!trackers.containsKey(prefix)) return;
-
-			NamedNodeMap attributes = node.getAttributes();
-			if (attributes == null) return;
-			String basename = (attributes.getNamedItem("basename") == null ? null : attributes.getNamedItem("basename").getNodeValue());
-			String var = (attributes.getNamedItem("var") == null ? null : attributes.getNamedItem("var").getNodeValue());
-			if (basename == null || basename.length() == 0 ||
-				var == null || var.length() == 0) return;
-
-			loadedBundles.put(var, new LoadBundleInfo(node, basename, var));
-		} catch (Exception x) {
-			JspEditorPlugin.getPluginLog().logError("Error while registering kb resource", x);
-		}
-	}
-
-	/**
-	 * This class listens to the changes in the CMDocument and triggers a CMDocument load
-	 */
-	class MyDocumentAdapter extends DocumentAdapter {
-		MyDocumentAdapter(Document document) {
-			super(document);
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index) {
-			switch (eventType) {
-				case INodeNotifier.ADD :
-					{
-						if (newValue instanceof Element) {
-							adapt((Element) newValue);
-						}
-						break;
-					}
-				case INodeNotifier.REMOVE: 
-					{
-						Node node = (Node) notifier;
-						if (node.getNodeType() == Node.ELEMENT_NODE) {
-						}
-						break;
-					}
-
-				case INodeNotifier.CHANGE :
-				case INodeNotifier.STRUCTURE_CHANGED :
-				case INodeNotifier.CONTENT_CHANGED :
-					{
-						Node node = (Node) notifier;
-						if (node.getNodeType() == Node.ELEMENT_NODE) {
-							switch (eventType) {
-								case INodeNotifier.CHANGE :
-									{
-										break;
-									}
-								case INodeNotifier.STRUCTURE_CHANGED :
-									{
-										// structure change          
-										break;
-									}
-								case INodeNotifier.CONTENT_CHANGED :
-									{
-										// some content changed
-									break;
-									}
-							}
-						}
-						else if (node.getNodeType() == Node.DOCUMENT_NODE) {
-						} else {
-						}
-						break;
-					}
-			}
-			invokeDelayedUpdateKnownTagLists();
-		}
-	}
-
-	//
-	protected class MyTimerTask extends TimerTask {
-		public MyTimerTask() {
-			super();
-			timerTaskCount++;
-		}
-
-		public void run() {
-			timerTaskCount--;
-			if (timerTaskCount == 0) {
-//				invokeCMDocumentLoad();
-				initTaglibPrefixes();
-				updateKnownTagLists();
-			}
-		}
-	}
-
-	// An abstract adapter that ensures that the children of a new Node are also adapted
-	abstract class DocumentAdapter implements INodeAdapter {
-		public DocumentAdapter(Document document) {
-			((INodeNotifier) document).addAdapter(this);
-			adapt(document.getDocumentElement());
-		}
-
-		public void adapt(Element element) {
-			if (element != null) {
-				if (((INodeNotifier) element).getExistingAdapter(this) == null) {
-					((INodeNotifier) element).addAdapter(this);
-
-					for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
-						if (child.getNodeType() == Node.ELEMENT_NODE) {
-							adapt((Element) child);
-						}
-					}
-				}
-			}
-		}
-
-		public boolean isAdapterForType(Object type) {
-			return type == this;
-		}
-
-		abstract public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index);
-	}
-
+/*******************************************************************************
+ * 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.jst.jsp.support.kb;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+
+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.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.xml.core.internal.document.NodeContainer;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
+import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
+import org.jboss.tools.common.kb.KbConnector;
+import org.jboss.tools.common.kb.KbConnectorFactory;
+import org.jboss.tools.common.kb.KbConnectorType;
+import org.jboss.tools.common.kb.KbException;
+import org.jboss.tools.common.kb.KbResource;
+import org.jboss.tools.common.kb.TagDescriptor;
+import org.jboss.tools.jst.jsp.JspEditorPlugin;
+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.jst.web.tld.VpeTaglibManagerProvider;
+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;
+
+/**
+ * @author Jeremy
+ */
+public class WTPTextJspKbConnector implements KbConnector, VpeTaglibListener {
+	private KbConnector kbConnector;
+	private IDocument fDocument;
+	private IEditorInput fEditorInput;
+	private VpeTaglibManagerProvider taglibManagerProvider;
+
+	protected IStructuredModel model;
+	private Document dom;
+	protected int timerTaskCount = 0;
+//	protected boolean isGrammarInferenceEnabled;
+	protected static Timer timer = new Timer(true);
+
+	// Dinamic resources
+	
+ 	private WTPKbdBundleNameResource fBundleNameResourceRegistered = null;
+	private WTPKbdBeanPropertyResource fBeanPropertyResourceRegistered = null;
+	private WTPKbdBundlePropertyResource fBundlePropertyResourceRegistered = null;
+	private WTPKbdActionResource fActionResourceRegistered = null;
+	private WTPKbdBeanMethodResource fBeanMethodResourceRegistered = null;
+	private WTPKbImageFileResource fImageFileResourced = null;
+	private WTPKbdManagedBeanNameResource fManagedBeanNameResourceRegistered = null;
+	private WTPKbJsfValuesResource fJSFValuesResource = null;
+	WTPKbdTaglibResource fTaglibResource = null;
+
+	public WTPTextJspKbConnector(IEditorInput editorInput, IDocument document, IStructuredModel model) {
+		try {
+			this.fDocument = document;
+			this.fEditorInput = editorInput;
+			this.model = model;
+
+			this.dom = (model instanceof IDOMModel) ? ((IDOMModel) model).getDocument() : null;
+
+			if (dom != null) {
+				new MyDocumentAdapter(dom);
+			}
+			kbConnector = KbConnectorFactory.getIntstance().createConnector(KbConnectorType.JSP_WTP_KB_CONNECTOR, document);
+			WTPKbdBundleNameResource bundleNameResource = new WTPKbdBundleNameResource(fEditorInput, this);
+			if (bundleNameResource.isReadyToUse()) {
+				fBundleNameResourceRegistered = bundleNameResource;
+				registerResource(fBundleNameResourceRegistered);
+			}
+			WTPKbdBeanPropertyResource beanPropertyResource = new WTPKbdBeanPropertyResource(fEditorInput, this);
+			if (beanPropertyResource.isReadyToUse()) {
+				fBeanPropertyResourceRegistered = beanPropertyResource;
+				registerResource(fBeanPropertyResourceRegistered);
+			}
+			WTPKbdBundlePropertyResource bundlePropertyResource = new WTPKbdBundlePropertyResource(fEditorInput, this);
+			if (bundlePropertyResource.isReadyToUse()) {
+				fBundlePropertyResourceRegistered = bundlePropertyResource;
+				registerResource(fBundlePropertyResourceRegistered);
+			}
+			WTPKbdActionResource actionResource = new WTPKbdActionResource(fEditorInput, this);
+			if (actionResource.isReadyToUse()) {
+				fActionResourceRegistered = actionResource;
+				registerResource(fActionResourceRegistered);
+			}
+			WTPKbdBeanMethodResource beanMethodResource = new WTPKbdBeanMethodResource(fEditorInput, this);
+			if (beanMethodResource.isReadyToUse()) {
+				fBeanMethodResourceRegistered = beanMethodResource;
+				registerResource(fBeanMethodResourceRegistered);
+			}
+			WTPKbImageFileResource imageFileResource = new WTPKbImageFileResource(fEditorInput);
+			if(imageFileResource.isReadyToUse()) {
+				fImageFileResourced = imageFileResource;
+				registerResource(fImageFileResourced);
+			}
+			WTPKbdManagedBeanNameResource managedBeanNameResource = new WTPKbdManagedBeanNameResource(fEditorInput, this);
+			if(managedBeanNameResource.isReadyToUse()) {
+				fManagedBeanNameResourceRegistered = managedBeanNameResource;
+				registerResource(fManagedBeanNameResourceRegistered);
+			}
+			WTPKbJsfValuesResource resource = new WTPKbJsfValuesResource(editorInput, this);
+			if(resource.isReadyToUse()) {
+				fJSFValuesResource = resource;
+				registerResource(fJSFValuesResource);
+			}
+			WTPKbdTaglibResource taglibResource = new WTPKbdTaglibResource(editorInput, this);
+			if(taglibResource.isReadyToUse()) {
+				fTaglibResource = taglibResource;
+				registerResource(fTaglibResource);
+			}
+			invokeDelayedUpdateKnownTagLists();
+		} catch(Exception e) {
+			JspEditorPlugin.getPluginLog().logError(e);
+		}
+	}
+
+	public void setTaglibManagerProvider(VpeTaglibManagerProvider taglibManagerProvider) {
+		this.taglibManagerProvider = taglibManagerProvider;
+	}
+
+
+	/**
+	 * @see org.jboss.tools.common.kb.KbConnector#queryTagInformation(java.lang.String)
+	 */
+	public TagDescriptor getTagInformation(String query) throws KbException {
+		return kbConnector.getTagInformation(query);
+	}
+
+	/**
+	 * @see org.jboss.tools.common.kb.KbConnector#getProposals(java.lang.String)
+	 */
+	public Collection getProposals(String query) throws KbException {
+		return kbConnector.getProposals(query);
+	}
+
+	/**
+	 * @see org.jboss.tools.common.kb.KbConnector#registerResource(org.jboss.tools.common.kb.KbResource)
+	 */
+	public boolean registerResource(KbResource resource) {
+		return kbConnector.registerResource(resource);
+	}
+	
+	public KbConnector getConnector() {
+		return kbConnector;
+	}
+
+	/**
+	 * @see org.jboss.tools.common.kb.KbConnector#unregisterResource(org.jboss.tools.common.kb.KbResource)
+	 */
+	public void unregisterResource(KbResource resource) {
+		kbConnector.unregisterResource(resource);
+	}
+
+	// Dinamic support
+	private Map<String,Object> trackers = new HashMap<String,Object>();
+	private Map<String,LoadBundleInfo> loadedBundles = new HashMap<String,LoadBundleInfo>();
+
+	private final static String[] TRACKERS_TO_WATCH = {"http://java.sun.com/jsf/core",
+		"https://ajax4jsf.dev.java.net/ajax"
+	};
+    private boolean taglibTrackerListenerInstalled = false;
+
+	public void invokeDelayedUpdateKnownTagLists() {
+		// Previous code is 
+		// timer.schedule(new MyTimerTask(), 500);
+		initTaglibPrefixes();
+		updateKnownTagLists();
+	}
+
+	private boolean isTrackerToWatch(String trackerUri) {
+		for(int i=0; TRACKERS_TO_WATCH != null && i<TRACKERS_TO_WATCH.length; i++) {
+			if (TRACKERS_TO_WATCH[i].equals(trackerUri)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public void initTaglibPrefixes() {
+		trackers.clear();
+		if(taglibManagerProvider==null || taglibManagerProvider.getTaglibManager()==null) {
+			TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(fDocument);
+			if(manager!=null) {
+				List list = manager.getTaglibTrackers();
+				for(int i=0; i<list.size(); i++) {
+					TaglibTracker tracker = (TaglibTracker)list.get(i);
+					if (isTrackerToWatch(tracker.getURI())) {
+						trackers.put(tracker.getPrefix(), tracker);
+					}
+				}
+			}
+		} else {
+			List list = taglibManagerProvider.getTaglibManager().getTagLibs();
+			for(int i=0; i<list.size(); i++) {
+				TaglibData data = (TaglibData)list.get(i);
+				if (isTrackerToWatch(data.getUri())) {
+					trackers.put(data.getPrefix(), data);
+				}
+			}
+		}
+	}
+
+	public void taglibPrefixChanged(String[] prefixs) {
+		trackers.clear();
+		if(taglibManagerProvider==null || taglibManagerProvider.getTaglibManager()==null) {
+			TLDCMDocumentManager manager = TaglibController.getTLDCMDocumentManager(fDocument);
+			List list = manager.getTaglibTrackers();
+			for(int i=0; i<list.size(); i++) {
+				TaglibTracker tracker = (TaglibTracker)list.get(i);
+				if (isTrackerToWatch(tracker.getURI())) {
+					trackers.put(tracker.getPrefix(), tracker);
+				}
+			}
+		} else {
+			List list = taglibManagerProvider.getTaglibManager().getTagLibs();
+			for(int i=0; i<list.size(); i++) {
+				TaglibData data = (TaglibData)list.get(i);
+				if (isTrackerToWatch(data.getUri())) {
+					trackers.put(data.getPrefix(), data);
+				}
+			}
+		}
+		invokeDelayedUpdateKnownTagLists();
+	}
+
+	public void addTaglib(String uri, String prefix) {
+	}
+	
+	public void removeTaglib(String uri, String prefix) {
+	}
+
+    private boolean installTaglibTrackerListener() {
+    	if (taglibTrackerListenerInstalled) {
+			return true;
+    	}
+		if(taglibManagerProvider!=null) {
+			VpeTaglibManager manager = taglibManagerProvider.getTaglibManager();
+			if(manager!=null) {
+				manager.addTaglibListener(this);
+				taglibTrackerListenerInstalled = true;
+				return true;
+			}
+		}
+		return false;
+    }
+
+	public void updateKnownTagLists() {
+		loadedBundles.clear();
+		Element element = dom.getDocumentElement();
+		NodeList children = (NodeContainer)dom.getChildNodes();
+		installTaglibTrackerListener();
+		if (element != null) {
+			for (int i = 0; children != null && i < children.getLength(); i++) {
+				try {
+					IDOMNode xmlnode = (IDOMNode)children.item(i);
+					update((IDOMNode)xmlnode);
+				} catch (Exception x) {
+					JspEditorPlugin.getPluginLog().logError("Error while updating known tag lists", x);
+				}
+			}
+		}
+	}
+
+	private void update(IDOMNode element) {
+		if (element != null) {
+			registerKbResourceForNode(element);
+			for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+				if (child instanceof IDOMNode) {
+					update((IDOMNode)child);
+				}
+			}
+		}
+	}
+
+	public class LoadBundleInfo {
+		IDOMNode loadBundleTag;
+		String basename;
+		String var;
+
+		LoadBundleInfo(IDOMNode element, String basename, String var) {
+			this.loadBundleTag = element;
+			this.basename = basename;
+			this.var = var;
+		}
+
+		int getLoadDeclarationOffset() {
+			return loadBundleTag.getStartOffset();
+		}
+
+		public String getBaseName() {
+			return basename;
+		}
+
+		String getVar() {
+			return var;
+		}
+	}
+
+	public Map getDeclaredBundles() {
+    	if (!taglibTrackerListenerInstalled) {
+    		initTaglibPrefixes();
+			updateKnownTagLists();
+    	}
+		return loadedBundles;
+	}
+
+	private void registerKbResourceForNode(IDOMNode node) {
+		try {
+			if (node == null) return;
+			String name = node.getNodeName();
+			if (name == null) return;
+			if (!name.endsWith("loadBundle")) return;
+			if (name.indexOf(':') == -1) return;
+			String prefix = name.substring(0, name.indexOf(':'));
+
+			if (!trackers.containsKey(prefix)) return;
+
+			NamedNodeMap attributes = node.getAttributes();
+			if (attributes == null) return;
+			String basename = (attributes.getNamedItem("basename") == null ? null : attributes.getNamedItem("basename").getNodeValue());
+			String var = (attributes.getNamedItem("var") == null ? null : attributes.getNamedItem("var").getNodeValue());
+			if (basename == null || basename.length() == 0 ||
+				var == null || var.length() == 0) return;
+
+			loadedBundles.put(var, new LoadBundleInfo(node, basename, var));
+		} catch (Exception x) {
+			JspEditorPlugin.getPluginLog().logError("Error while registering kb resource", x);
+		}
+	}
+
+	public void dispose() {
+		KbConnectorFactory.getIntstance().removeConnector(KbConnectorType.JSP_WTP_KB_CONNECTOR, fDocument);
+	}
+	/**
+	 * This class listens to the changes in the CMDocument and triggers a CMDocument load
+	 */
+	class MyDocumentAdapter extends DocumentAdapter {
+		MyDocumentAdapter(Document document) {
+			super(document);
+		}
+
+		public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index) {
+			switch (eventType) {
+				case INodeNotifier.ADD :
+					{
+						if (newValue instanceof Element) {
+							adapt((Element) newValue);
+						}
+						break;
+					}
+				case INodeNotifier.REMOVE: 
+					{
+						Node node = (Node) notifier;
+						if (node.getNodeType() == Node.ELEMENT_NODE) {
+						}
+						break;
+					}
+
+				case INodeNotifier.CHANGE :
+				case INodeNotifier.STRUCTURE_CHANGED :
+				case INodeNotifier.CONTENT_CHANGED :
+					{
+						Node node = (Node) notifier;
+						if (node.getNodeType() == Node.ELEMENT_NODE) {
+							switch (eventType) {
+								case INodeNotifier.CHANGE :
+									{
+										break;
+									}
+								case INodeNotifier.STRUCTURE_CHANGED :
+									{
+										// structure change          
+										break;
+									}
+								case INodeNotifier.CONTENT_CHANGED :
+									{
+										// some content changed
+									break;
+									}
+							}
+						}
+						else if (node.getNodeType() == Node.DOCUMENT_NODE) {
+						} else {
+						}
+						break;
+					}
+			}
+			invokeDelayedUpdateKnownTagLists();
+		}
+	}
+
+	//
+	protected class MyTimerTask extends TimerTask {
+		public MyTimerTask() {
+			super();
+			timerTaskCount++;
+		}
+
+		public void run() {
+			timerTaskCount--;
+			if (timerTaskCount == 0) {
+//				invokeCMDocumentLoad();
+				initTaglibPrefixes();
+				updateKnownTagLists();
+			}
+		}
+	}
+
+	// An abstract adapter that ensures that the children of a new Node are also adapted
+	abstract class DocumentAdapter implements INodeAdapter {
+		public DocumentAdapter(Document document) {
+			((INodeNotifier) document).addAdapter(this);
+			adapt(document.getDocumentElement());
+		}
+
+		public void adapt(Element element) {
+			if (element != null) {
+				if (((INodeNotifier) element).getExistingAdapter(this) == null) {
+					((INodeNotifier) element).addAdapter(this);
+
+					for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling()) {
+						if (child.getNodeType() == Node.ELEMENT_NODE) {
+							adapt((Element) child);
+						}
+					}
+				}
+			}
+		}
+
+		public boolean isAdapterForType(Object type) {
+			return type == this;
+		}
+
+		abstract public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index);
+	}
+
 }
\ No newline at end of file




More information about the jbosstools-commits mailing list