| /* |
| * Copyright 2000-2009 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.usageView.impl; |
| |
| import com.intellij.icons.AllIcons; |
| import com.intellij.ide.impl.ContentManagerWatcher; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.Key; |
| import com.intellij.openapi.wm.ToolWindow; |
| import com.intellij.openapi.wm.ToolWindowAnchor; |
| import com.intellij.openapi.wm.ToolWindowId; |
| import com.intellij.openapi.wm.ToolWindowManager; |
| import com.intellij.ui.content.*; |
| import com.intellij.usageView.UsageViewManager; |
| import com.intellij.usages.UsageView; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| |
| public class UsageViewManagerImpl extends UsageViewManager { |
| private final Key<Boolean> REUSABLE_CONTENT_KEY = Key.create("UsageTreeManager.REUSABLE_CONTENT_KEY"); |
| private final Key<Boolean> NOT_REUSABLE_CONTENT_KEY = Key.create("UsageTreeManager.NOT_REUSABLE_CONTENT_KEY"); //todo[myakovlev] dont use it |
| private final Key<UsageView> NEW_USAGE_VIEW_KEY = Key.create("NEW_USAGE_VIEW_KEY"); |
| private final ContentManager myFindContentManager; |
| |
| public UsageViewManagerImpl(final Project project, final ToolWindowManager toolWindowManager) { |
| ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.FIND, true, ToolWindowAnchor.BOTTOM, project, true); |
| toolWindow.setToHideOnEmptyContent(true); |
| toolWindow.setIcon(AllIcons.Toolwindows.ToolWindowFind); |
| myFindContentManager = toolWindow.getContentManager(); |
| myFindContentManager.addContentManagerListener(new ContentManagerAdapter() { |
| @Override |
| public void contentRemoved(ContentManagerEvent event) { |
| event.getContent().release(); |
| } |
| }); |
| new ContentManagerWatcher(toolWindow, myFindContentManager); |
| } |
| |
| @Override |
| public Content addContent(String contentName, boolean reusable, final JComponent component, boolean toOpenInNewTab, boolean isLockable) { |
| return addContent(contentName, null, null, reusable, component, toOpenInNewTab, isLockable); |
| } |
| |
| @Override |
| public Content addContent(String contentName, String tabName, String toolwindowTitle, boolean reusable, final JComponent component, |
| boolean toOpenInNewTab, boolean isLockable) { |
| Key<Boolean> contentKey = reusable ? REUSABLE_CONTENT_KEY : NOT_REUSABLE_CONTENT_KEY; |
| |
| if (!toOpenInNewTab && reusable) { |
| Content[] contents = myFindContentManager.getContents(); |
| Content contentToDelete = null; |
| |
| for (Content content : contents) { |
| if (!content.isPinned() && |
| content.getUserData(contentKey) != null |
| ) { |
| UsageView usageView = content.getUserData(NEW_USAGE_VIEW_KEY); |
| if (usageView == null || !usageView.isSearchInProgress()) { |
| contentToDelete = content; |
| } |
| } |
| } |
| if (contentToDelete != null) { |
| myFindContentManager.removeContent(contentToDelete, true); |
| } |
| } |
| Content content = ContentFactory.SERVICE.getInstance().createContent(component, contentName, isLockable); |
| content.setTabName(tabName); |
| content.setToolwindowTitle(toolwindowTitle); |
| content.putUserData(contentKey, Boolean.TRUE); |
| content.putUserData(ToolWindow.SHOW_CONTENT_ICON, Boolean.TRUE); |
| |
| myFindContentManager.addContent(content); |
| myFindContentManager.setSelectedContent(content); |
| |
| return content; |
| } |
| |
| @Override |
| public int getReusableContentsCount() { |
| return getContentCount(true); |
| } |
| |
| private int getContentCount(boolean reusable) { |
| Key<Boolean> contentKey = reusable ? REUSABLE_CONTENT_KEY : NOT_REUSABLE_CONTENT_KEY; |
| int count = 0; |
| Content[] contents = myFindContentManager.getContents(); |
| for (Content content : contents) { |
| if (content.getUserData(contentKey) != null) { |
| count++; |
| } |
| } |
| return count; |
| } |
| |
| @Override |
| public Content getSelectedContent(boolean reusable) { |
| Key<Boolean> contentKey = reusable ? REUSABLE_CONTENT_KEY : NOT_REUSABLE_CONTENT_KEY; |
| Content selectedContent = myFindContentManager.getSelectedContent(); |
| return selectedContent == null || selectedContent.getUserData(contentKey) == null ? null : selectedContent; |
| } |
| |
| @Override |
| public Content getSelectedContent() { |
| return myFindContentManager == null ? null : myFindContentManager.getSelectedContent(); |
| } |
| |
| @Override |
| public void closeContent(@NotNull Content content) { |
| myFindContentManager.removeContent(content, true); |
| content.release(); |
| } |
| } |