From 70638c097176cb413dfa7427f79b18656cae7967 Mon Sep 17 00:00:00 2001 From: Sergey Vasiliev Date: Mon, 27 Feb 2006 19:17:38 +0300 Subject: [PATCH] navigation providers for dom elements --- openapi/src/com/intellij/util/xml/DomElement.java | 2 +- .../util/xml/DomElementNavigateProvider.java | 29 +++++++ .../util/xml/DomElementsNavigationManager.java | 41 ++++++++++ .../xml/impl/DomElementsNavigationManagerImpl.java | 88 ++++++++++++++++++++++ .../intellij/util/xml/impl/DomFileElementImpl.java | 13 ---- .../util/xml/impl/DomInvocationHandler.java | 19 ----- .../actions/GotoDomElementDeclarationAction.java | 14 +++- 7 files changed, 171 insertions(+), 35 deletions(-) create mode 100644 openapi/src/com/intellij/util/xml/DomElementNavigateProvider.java create mode 100644 openapi/src/com/intellij/util/xml/DomElementsNavigationManager.java create mode 100644 source/com/intellij/util/xml/impl/DomElementsNavigationManagerImpl.java diff --git a/openapi/src/com/intellij/util/xml/DomElement.java b/openapi/src/com/intellij/util/xml/DomElement.java index 32fdc48ca2..6af020e37d 100644 --- a/openapi/src/com/intellij/util/xml/DomElement.java +++ b/openapi/src/com/intellij/util/xml/DomElement.java @@ -16,7 +16,7 @@ import java.lang.reflect.Type; /** * @author peter */ -public interface DomElement extends Navigatable { +public interface DomElement { @Nullable XmlTag getXmlTag(); diff --git a/openapi/src/com/intellij/util/xml/DomElementNavigateProvider.java b/openapi/src/com/intellij/util/xml/DomElementNavigateProvider.java new file mode 100644 index 0000000000..6414cd30ae --- /dev/null +++ b/openapi/src/com/intellij/util/xml/DomElementNavigateProvider.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2006 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.intellij.util.xml; + +/** + * User: Sergey.Vasiliev + */ +public interface DomElementNavigateProvider { + String getProviderName(); + + void navigate(DomElement domElement, boolean requestFocus); + + boolean canNavigate(DomElement domElement); +} diff --git a/openapi/src/com/intellij/util/xml/DomElementsNavigationManager.java b/openapi/src/com/intellij/util/xml/DomElementsNavigationManager.java new file mode 100644 index 0000000000..d95156dff9 --- /dev/null +++ b/openapi/src/com/intellij/util/xml/DomElementsNavigationManager.java @@ -0,0 +1,41 @@ +/* + * Copyright 2000-2006 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.intellij.util.xml; + +import com.intellij.openapi.project.Project; + +import java.util.Set; + +/** + * User: Sergey.Vasiliev + */ +public abstract class DomElementsNavigationManager { + public static String DEFAULT_PROVIDER_NAME = "DEFAULT_PROVIDER_NAME"; + + public static DomElementsNavigationManager getManager(Project project) { + return project.getComponent(DomElementsNavigationManager.class); + } + + public abstract Set getDomElementsNavigateProviders(DomElement domElement); + + public abstract DomElementNavigateProvider getDomElementsNavigateProvider(String providerName); + + public abstract void registerDomElementsNavigateProvider(DomElementNavigateProvider provider); + + +} diff --git a/source/com/intellij/util/xml/impl/DomElementsNavigationManagerImpl.java b/source/com/intellij/util/xml/impl/DomElementsNavigationManagerImpl.java new file mode 100644 index 0000000000..fa8463d6d3 --- /dev/null +++ b/source/com/intellij/util/xml/impl/DomElementsNavigationManagerImpl.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2000-2006 JetBrains s.r.o. All Rights Reserved. + */ + +package com.intellij.util.xml.impl; + +import com.intellij.util.xml.DomElementsNavigationManager; +import com.intellij.util.xml.DomElementNavigateProvider; +import com.intellij.util.xml.DomElement; +import com.intellij.openapi.components.ProjectComponent; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; + +import java.util.*; + +import org.jetbrains.annotations.NonNls; + +/** + * User: Sergey.Vasiliev + */ +public class DomElementsNavigationManagerImpl extends DomElementsNavigationManager implements ProjectComponent { + private Map myProviders = new HashMap(); + private Project myProject; + + private DomElementNavigateProvider myTextEditorProvider = new MyDomElementNavigateProvider(); + + public DomElementsNavigationManagerImpl(final Project project) { + myProject = project; + myProviders.put(myTextEditorProvider.getProviderName(), myTextEditorProvider); + } + + public Set getDomElementsNavigateProviders(DomElement domElement) { + Set result = new HashSet(); + + for (DomElementNavigateProvider navigateProvider : myProviders.values()) { + if (navigateProvider.canNavigate(domElement)) result.add(navigateProvider) ; + } + return result; + } + + public DomElementNavigateProvider getDomElementsNavigateProvider(String providerName) { + return myProviders.get(providerName); + } + + public void registerDomElementsNavigateProvider(DomElementNavigateProvider provider) { + myProviders.put(provider.getProviderName(), provider); + } + + public void projectOpened() { + + } + + public void projectClosed() { + + } + + @NonNls + public String getComponentName() { + return getClass().getName(); + } + + public void initComponent() { + + } + + public void disposeComponent() { + + } + + private class MyDomElementNavigateProvider implements DomElementNavigateProvider { + + public String getProviderName() { + return DEFAULT_PROVIDER_NAME; + } + + public void navigate(DomElement domElement, boolean requestFocus) { + final OpenFileDescriptor fileDescriptor = + new OpenFileDescriptor(myProject, domElement.getRoot().getFile().getVirtualFile(), domElement.getXmlTag().getTextOffset()); + + FileEditorManagerEx.getInstanceEx(myProject).openTextEditor(fileDescriptor, requestFocus); + } + + public boolean canNavigate(DomElement domElement) { + return domElement != null && domElement.isValid(); + } + } +} diff --git a/source/com/intellij/util/xml/impl/DomFileElementImpl.java b/source/com/intellij/util/xml/impl/DomFileElementImpl.java index 9197626d67..07ff5023e7 100644 --- a/source/com/intellij/util/xml/impl/DomFileElementImpl.java +++ b/source/com/intellij/util/xml/impl/DomFileElementImpl.java @@ -227,17 +227,4 @@ public class DomFileElementImpl implements DomFileElement< public void putUserData(Key key, T value) { myUserData.put(key, value); } - - - public void navigate(boolean requestFocus) { - - } - - public boolean canNavigate() { - return false; - } - - public boolean canNavigateToSource() { - return false; - } } diff --git a/source/com/intellij/util/xml/impl/DomInvocationHandler.java b/source/com/intellij/util/xml/impl/DomInvocationHandler.java index d4fe0aaba8..14805aa5e0 100644 --- a/source/com/intellij/util/xml/impl/DomInvocationHandler.java +++ b/source/com/intellij/util/xml/impl/DomInvocationHandler.java @@ -567,24 +567,5 @@ public abstract class DomInvocationHandler implements InvocationHandler, DomElem myFixedChildrenClasses.put(tagName, aClass); } } - - - public void navigate(boolean requestFocus) { - final Project project = getManager().getProject(); - - final OpenFileDescriptor fileDescriptor = new OpenFileDescriptor(project, getFile().getVirtualFile(), - getXmlTag().getTextOffset()); - - - FileEditorManagerEx.getInstanceEx(project).openTextEditor(fileDescriptor, requestFocus); - } - - public boolean canNavigate() { - return true; - } - - public boolean canNavigateToSource() { - return true; - } } diff --git a/source/com/intellij/util/xml/tree/actions/GotoDomElementDeclarationAction.java b/source/com/intellij/util/xml/tree/actions/GotoDomElementDeclarationAction.java index 27d5c8fede..23b3182aee 100644 --- a/source/com/intellij/util/xml/tree/actions/GotoDomElementDeclarationAction.java +++ b/source/com/intellij/util/xml/tree/actions/GotoDomElementDeclarationAction.java @@ -7,8 +7,13 @@ package com.intellij.util.xml.tree.actions; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.util.xml.tree.DomModelTreeView; import com.intellij.util.xml.tree.BaseDomElementNode; +import com.intellij.util.xml.DomElementsNavigationManager; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.DomElementNavigateProvider; import jetbrains.fabrique.ui.treeStructure.SimpleNode; +import java.util.Set; + /** * User: Sergey.Vasiliev */ @@ -16,9 +21,14 @@ public class GotoDomElementDeclarationAction extends BaseDomTreeAction { public void actionPerformed(AnActionEvent e, DomModelTreeView treeView) { final SimpleNode simpleNode = treeView.getTree().getSelectedNode(); - + if(simpleNode instanceof BaseDomElementNode) { - ((BaseDomElementNode)simpleNode).getDomElement().navigate(true); + final DomElement domElement = ((BaseDomElementNode)simpleNode).getDomElement(); + final DomElementNavigateProvider provider = + DomElementsNavigationManager.getManager(domElement.getManager().getProject()).getDomElementsNavigateProvider(DomElementsNavigationManager.DEFAULT_PROVIDER_NAME); + + provider.navigate(domElement, true); + } } -- 2.11.4.GIT