/* * Copyright 2003-2011 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 jetbrains.mps.ide.findusages.view; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindowAnchor; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManager; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; import jetbrains.mps.classloading.ClassLoaderManager; import jetbrains.mps.classloading.MPSClassesListener; import jetbrains.mps.classloading.MPSClassesListenerAdapter; import jetbrains.mps.ide.MPSCoreComponents; import jetbrains.mps.ide.tools.BaseProjectTool; import jetbrains.mps.module.ReloadableModuleBase; import javax.swing.Icon; import java.util.Set; public abstract class TabbedUsagesTool extends BaseProjectTool { private final ClassLoaderManager myClassLoaderManager; private ContentManagerAdapter myContentListener; private MPSClassesListener myClassesListener; private ContentManager myContentManager; public TabbedUsagesTool(Project project, String id, int number, Icon icon, ToolWindowAnchor anchor, boolean canCloseContent) { super(project, id, number, icon, anchor, canCloseContent); myClassLoaderManager = ApplicationManager.getApplication().getComponent(MPSCoreComponents.class).getClassLoaderManager(); } @Override protected void createTool() { } @Override public void doRegister() { myContentListener = new ContentManagerAdapter() { @Override public void contentRemoved(ContentManagerEvent event) { int index = event.getIndex(); getUsagesView(index).dispose(); onRemove(index); } }; myContentManager = getContentManager(); myContentManager.addContentManagerListener(myContentListener); if (forceCloseOnReload()) { myClassesListener = new MPSClassesListenerAdapter() { @Override public void beforeClassesUnloaded(Set<? extends ReloadableModuleBase> modules) { ApplicationManager.getApplication().invokeLater(() -> { if (getProject().isDisposed()) return; myContentManager.removeAllContents(true); }); } }; myClassLoaderManager.addClassesHandler(myClassesListener); } } @Override public void doUnregister() { //this is done automatically on content manager dispose, otherwise a dependency UVT->CM must be added //getContentManager().removeContentManagerListener(myContentListener); if (myClassesListener != null) { myClassLoaderManager.removeClassesHandler(myClassesListener); } } protected void closeTab(int index) { ContentManager contentManager = getContentManager(); Content content = contentManager.getContent(index); assert content != null; contentManager.removeContent(content, true); } protected void closeLastUnpinnedTab(int index) { if (index == -1) return; ContentManager contentManager = getContentManager(); Content content = contentManager.getContent(index); assert content != null; if (content.isPinned()) return; contentManager.removeContent(content, true); } protected abstract UsagesView getUsagesView(int index); protected abstract void onRemove(int index); protected boolean forceCloseOnReload() { return false; } }