cleanup
[idea/community.git] / xml / impl / src / com / intellij / xml / breadcrumbs / BreadcrumbsLoaderComponent.java
1 /*
2  * Copyright (c) 2007, Your Corporation. All Rights Reserved.
3  */
4
5 package com.intellij.xml.breadcrumbs;
6
7 import com.intellij.application.options.editor.WebEditorOptions;
8 import com.intellij.lang.html.HTMLLanguage;
9 import com.intellij.openapi.Disposable;
10 import com.intellij.openapi.components.AbstractProjectComponent;
11 import com.intellij.openapi.fileEditor.*;
12 import com.intellij.openapi.project.Project;
13 import com.intellij.openapi.util.Disposer;
14 import com.intellij.openapi.vfs.VirtualFile;
15 import com.intellij.openapi.vfs.impl.http.HttpVirtualFile;
16 import com.intellij.psi.FileViewProvider;
17 import com.intellij.psi.PsiFile;
18 import com.intellij.psi.PsiManager;
19 import com.intellij.psi.xml.XmlDocument;
20 import com.intellij.psi.xml.XmlFile;
21 import org.jetbrains.annotations.NonNls;
22 import org.jetbrains.annotations.NotNull;
23
24 import javax.swing.*;
25 import java.util.List;
26
27 /**
28  * @author spleaner
29  */
30 public class BreadcrumbsLoaderComponent extends AbstractProjectComponent {  
31
32   public BreadcrumbsLoaderComponent(@NotNull final Project project) {
33     super(project);
34   }
35
36   @NonNls
37   @NotNull
38   public String getComponentName() {
39     return "HtmlBreadcrumbsComponent";
40   }
41
42   public void initComponent() {
43     myProject.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new MyFileEditorManagerListener());
44   }
45
46   private static boolean isEnabled() {
47     return WebEditorOptions.getInstance().isBreadcrumbsEnabled();
48   }
49
50   private static class MyFileEditorManagerListener implements FileEditorManagerListener {
51     public void fileOpened(final FileEditorManager source, final VirtualFile file) {
52       if (isEnabled() && isSuitable(source.getProject(), file)) {
53         final FileEditor[] fileEditors = source.getEditors(file);
54         for (final FileEditor each : fileEditors) {
55           if (each instanceof TextEditor) {
56             final BreadcrumbsXmlWrapper wrapper = new BreadcrumbsXmlWrapper(((TextEditor)each).getEditor());
57             final JComponent c = wrapper.getComponent();
58             source.addTopComponent(each, c);
59
60             Disposer.register(each, wrapper);
61             Disposer.register(each, new Disposable() {
62               public void dispose() {
63                 source.removeTopComponent(each, c);
64               }
65             });
66           }
67         }
68       }
69     }
70
71     private static boolean isSuitable(final Project project, final VirtualFile file) {
72       if (file instanceof HttpVirtualFile) {
73         return false;
74       }
75
76       final FileViewProvider psiFile = PsiManager.getInstance(project).findViewProvider(file);
77
78       return psiFile != null
79              && hasNonEmptyHtml(psiFile)
80              && BreadcrumbsXmlWrapper.findInfoProvider(psiFile) != null;
81     }
82
83     public static boolean hasNonEmptyHtml(FileViewProvider viewProvider) {
84       final List<PsiFile> files = viewProvider.getAllFiles();
85
86       if (files.size() < 2) return true; // There is only HTML Language
87
88       for (PsiFile file : files) {
89         if (file.getLanguage() == HTMLLanguage.INSTANCE && file instanceof XmlFile) {
90           final XmlDocument xml = ((XmlFile)file).getDocument();
91           return xml != null && xml.getRootTag() != null;
92         }
93       }
94       return false;
95     }
96
97     public void fileClosed(final FileEditorManager source, final VirtualFile file) {
98     }
99
100     public void selectionChanged(final FileEditorManagerEvent event) {
101     }
102   }
103 }