className="com.intellij.openapi.vcs.changes.ChangesViewManager$ContentProvider"
preloaderClassName="com.intellij.openapi.vcs.changes.ChangesViewManager$ContentPreloader"
predicateClassName="com.intellij.openapi.vcs.changes.ChangesViewManager$ContentPredicate"
- displayNameSupplierClassName="com.intellij.openapi.vcs.changes.ChangesViewManager$DisplayNameSupplier"/>
+ displayNameSupplierClassName="com.intellij.openapi.vcs.changes.ChangesViewManager$DisplayNameSupplier"
+ isInCommitToolWindow="true"/>
<statusBarWidgetProvider implementation="com.intellij.openapi.vcs.changes.committed.IncomingChangesIndicatorProvider"/>
<editorNotificationProvider implementation="com.intellij.openapi.vcs.changes.committed.OutdatedVersionNotifier"/>
import static com.intellij.icons.AllIcons.Vcs.Patch_applied;
import static com.intellij.openapi.vcs.changes.shelf.DiffShelvedChangesActionProvider.createAppliedTextPatch;
import static com.intellij.openapi.vcs.changes.ui.ChangesGroupingSupport.REPOSITORY_GROUPING;
-import static com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.SHELF;
-import static com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.getToolWindowFor;
+import static com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.*;
import static com.intellij.openapi.vcs.changes.ui.ChangesViewContentManagerKt.isCommitToolWindow;
import static com.intellij.util.FontUtil.spaceAndThinSpace;
import static com.intellij.util.containers.ContainerUtil.*;
myContent.setTabName(SHELF); //NON-NLS overridden by displayName above
MyDnDTarget dnDTarget = new MyDnDTarget(myPanel.myProject, myContent);
myContent.putUserData(Content.TAB_DND_TARGET_KEY, dnDTarget);
+ myContent.putUserData(IS_IN_COMMIT_TOOLWINDOW_KEY, true);
myContent.setCloseable(false);
myContent.setDisposer(myPanel);
@Attribute("displayNameSupplierClassName")
public String displayNameSupplierClassName;
+ @Attribute("isInCommitToolWindow")
+ public boolean isInCommitToolWindow;
+
private PluginDescriptor myPluginDescriptor;
private ChangesViewContentProvider myInstance;
this.displayNameSupplierClassName = displayNameSupplierClassName;
}
+ public boolean isInCommitToolWindow() {
+ return isInCommitToolWindow;
+ }
+
+ public void setInCommitToolWindow(boolean isInCommitToolWindow) {
+ this.isInCommitToolWindow = isInCommitToolWindow;
+ }
+
public ChangesViewContentProvider getInstance(@NotNull Project project) {
if (myInstance == null) {
myInstance = (ChangesViewContentProvider)newClassInstance(project, className);
import com.intellij.openapi.util.registry.Registry
import com.intellij.openapi.util.registry.RegistryValue
import com.intellij.openapi.util.registry.RegistryValueListener
-import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.Companion.LOCAL_CHANGES
-import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.Companion.SHELF
import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowId
import com.intellij.openapi.wm.ToolWindowManager
private val isCommitToolWindowRegistryValue
get() = Registry.get("vcs.commit.tool.window")
-// TODO allow specifying preferred tool window for ChangesViewContentEP
-private val COMMIT_TOOL_WINDOW_CONTENT_FILTER: (String) -> Boolean = { it == LOCAL_CHANGES || it == SHELF || it == "Staging Area" }
-
internal val Project.isCommitToolWindow: Boolean
get() = ChangesViewContentManager.getInstanceImpl(this)?.isCommitToolWindow == true
class ChangesViewContentManager(private val project: Project) : ChangesViewContentI, Disposable {
private val toolWindows = mutableSetOf<ToolWindow>()
private val addedContents = mutableListOf<Content>()
+ private val commitToolWindowTabs = mutableSetOf<String>()
private val contentManagers: Collection<ContentManager> get() = toolWindows.map { it.contentManager }
+ internal fun getToolWindowId(shouldUseCommitToolWindow: Boolean): String {
+ return if (isCommitToolWindow && shouldUseCommitToolWindow) COMMIT_TOOLWINDOW_ID else TOOLWINDOW_ID
+ }
+
private fun getToolWindowIdFor(contentName: String): String {
- return if (isCommitToolWindow && COMMIT_TOOL_WINDOW_CONTENT_FILTER(contentName)) COMMIT_TOOLWINDOW_ID else TOOLWINDOW_ID
+ return getToolWindowId(commitToolWindowTabs.contains(contentName))
}
- private fun Content.resolveToolWindowId() = getToolWindowIdFor(tabName)
+ private fun Content.isInCommitToolWindow() = IS_IN_COMMIT_TOOLWINDOW_KEY.get(this) == true
+
+ private fun Content.resolveToolWindowId() = getToolWindowId(isInCommitToolWindow())
private fun Content.resolveToolWindow(): ToolWindow? {
val toolWindowId = resolveToolWindowId()
else {
addIntoCorrectPlace(contentManager, content)
}
+ if (content.isInCommitToolWindow()) {
+ commitToolWindowTabs.add(content.tabName)
+ }
}
override fun removeContent(content: Content) = removeContent(content, true)
private fun removeContent(content: Content, dispose: Boolean) {
+ commitToolWindowTabs.remove(content.tabName)
+
val contentManager = content.manager
if (contentManager == null || contentManager.isDisposed) {
addedContents.remove(content)
@JvmField
val CONTENT_PROVIDER_SUPPLIER_KEY = Key.create<() -> ChangesViewContentProvider>("CONTENT_PROVIDER_SUPPLIER")
+ @JvmField
+ val IS_IN_COMMIT_TOOLWINDOW_KEY = Key.create<Boolean>("IS_IN_COMMIT_TOOLWINDOW_KEY")
@JvmStatic
fun getInstance(project: Project) = project.service<ChangesViewContentI>()
import com.intellij.openapi.vcs.ProjectLevelVcsManager.VCS_CONFIGURATION_CHANGED
import com.intellij.openapi.vcs.VcsListener
import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.Companion.CONTENT_PROVIDER_SUPPLIER_KEY
-import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.Companion.getToolWindowIdFor
+import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.Companion.IS_IN_COMMIT_TOOLWINDOW_KEY
import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowFactory
import com.intellij.openapi.wm.ex.ToolWindowEx
}
private fun getExtensions(project: Project, toolWindow: ToolWindow): Collection<ChangesViewContentEP> {
- return ChangesViewContentEP.EP_NAME.getExtensions(project).filter { getToolWindowIdFor(project, it.tabName) == toolWindow.id }
+ return ChangesViewContentEP.EP_NAME.getExtensions(project).filter {
+ ChangesViewContentManager.getInstanceImpl(project)?.getToolWindowId(it.isInCommitToolWindow) == toolWindow.id
+ }
}
private fun createExtensionContent(project: Project, extension: ChangesViewContentEP): Content {
tabName = extension.tabName
putUserData(CHANGES_VIEW_EXTENSION, extension)
putUserData(CONTENT_PROVIDER_SUPPLIER_KEY) { extension.getInstance(project) }
+ putUserData(IS_IN_COMMIT_TOOLWINDOW_KEY, extension.isInCommitToolWindow)
extension.newPreloaderInstance(project)?.preloadTabContent(this)
}
<changesViewContent id="git.stage" tabName="Staging Area" className="git4idea.index.GitStageContentProvider"
predicateClassName="git4idea.index.GitStageContentVisibilityPredicate"
preloaderClassName="git4idea.index.GitStageContentPreloader"
- displayNameSupplierClassName="git4idea.index.GitStageDisplayNameSupplier"/>
+ displayNameSupplierClassName="git4idea.index.GitStageDisplayNameSupplier"
+ isInCommitToolWindow="true"/>
<projectService serviceImplementation="git4idea.index.ui.GitStageUiSettingsImpl"/>
<projectService serviceImplementation="git4idea.index.GitStageTracker"/>