From a9eacb0f76a28b72595598d366002c2c7cd27b30 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 30 Oct 2013 19:32:24 +0400 Subject: [PATCH] [log] Don't load the log on startup: wait until user opens it * Make VcsLogManager a service instead of component. * Introduce VcsLogContentProvider implementing the ChangesView EP which initializes the component only when it is selected for the first time. --- .../vcs-log/impl/src/META-INF/vcs-log.xml | 10 +- .../vcs/log/impl/VcsLogContentProvider.java | 58 ++++++++++++ .../com/intellij/vcs/log/impl/VcsLogImpl.java | 14 +-- .../intellij/vcs/log/impl/VcsLogManager.java | 93 ++++++------------- 4 files changed, 97 insertions(+), 78 deletions(-) create mode 100644 platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java diff --git a/platform/vcs-log/impl/src/META-INF/vcs-log.xml b/platform/vcs-log/impl/src/META-INF/vcs-log.xml index 201db98c58c9..d5596f2daf88 100644 --- a/platform/vcs-log/impl/src/META-INF/vcs-log.xml +++ b/platform/vcs-log/impl/src/META-INF/vcs-log.xml @@ -1,17 +1,15 @@ - - - com.intellij.vcs.log.impl.VcsLogManager - com.intellij.vcs.log.impl.VcsLogManager - - + + + diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java new file mode 100644 index 000000000000..fc2a77e14c93 --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogContentProvider.java @@ -0,0 +1,58 @@ +/* + * Copyright 2000-2013 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.vcs.log.impl; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.vcs.changes.ui.ChangesViewContentProvider; +import com.intellij.util.NotNullFunction; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +/** + * Provides the Content tab to the ChangesView log toolwindow. + * + * Delegates to the VcsLogManager. + */ +public class VcsLogContentProvider implements ChangesViewContentProvider, NotNullFunction { + + @NotNull private final VcsLogManager myLogManager; + + public VcsLogContentProvider(@NotNull VcsLogManager logManager) { + myLogManager = logManager; + } + + @NotNull + @Override + public Boolean fun(Project project) { + if (!Registry.is("git.new.log")) { + return false; + } + return !myLogManager.findLogProviders().isEmpty(); + } + + @Override + public JComponent initContent() { + return myLogManager.initContent(); + } + + @Override + public void disposeContent() { + } + + +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java index e645505dc90d..07da58e71db4 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogImpl.java @@ -20,8 +20,6 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.vcs.log.Hash; import com.intellij.vcs.log.VcsFullCommitDetails; import com.intellij.vcs.log.VcsLog; -import com.intellij.vcs.log.data.VcsLogDataHolder; -import com.intellij.vcs.log.ui.VcsLogUI; import com.intellij.vcs.log.ui.tables.AbstractVcsLogTableModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -34,12 +32,10 @@ import java.util.List; */ public class VcsLogImpl implements VcsLog { - private final VcsLogDataHolder myDataHolder; - private final VcsLogUI myUi; + private final VcsLogManager myLogManager; public VcsLogImpl(VcsLogManager vcsLogManager) { - myDataHolder = vcsLogManager.getDataHolder(); - myUi = vcsLogManager.getLogUi(); + myLogManager = vcsLogManager; } /** @@ -47,14 +43,14 @@ public class VcsLogImpl implements VcsLog { * TODO Temporary method until the old Git log is switched off and removed */ public boolean isReady() { - return myDataHolder != null && myUi != null; + return myLogManager.getDataHolder() != null && myLogManager.getLogUi() != null; } @Override @NotNull public List getSelectedCommits() { List hashes = ContainerUtil.newArrayList(); - JBTable table = myUi.getTable(); + JBTable table = myLogManager.getLogUi().getTable(); for (int row : table.getSelectedRows()) { Hash hash = ((AbstractVcsLogTableModel)table.getModel()).getHashAtRow(row); if (hash != null) { @@ -67,7 +63,7 @@ public class VcsLogImpl implements VcsLog { @Override @Nullable public VcsFullCommitDetails getDetailsIfAvailable(@NotNull final Hash hash) { - return myDataHolder.getCommitDetailsGetter().getCommitDataIfAvailable(hash); + return myLogManager.getDataHolder().getCommitDetailsGetter().getCommitDataIfAvailable(hash); } @Nullable diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java index e241c0ccb76e..5e7a0a809835 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/impl/VcsLogManager.java @@ -1,17 +1,12 @@ package com.intellij.vcs.log.impl; import com.intellij.openapi.Disposable; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.ProjectLevelVcsManager; -import com.intellij.openapi.vcs.changes.ui.ChangesViewContentI; import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindowManager; @@ -22,11 +17,9 @@ import com.intellij.ui.components.JBLoadingPanel; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentManagerAdapter; import com.intellij.ui.content.ContentManagerEvent; -import com.intellij.ui.content.impl.ContentImpl; import com.intellij.util.Consumer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; -import com.intellij.util.ui.UIUtil; import com.intellij.vcs.log.VcsLogObjectsFactory; import com.intellij.vcs.log.VcsLogProvider; import com.intellij.vcs.log.VcsLogRefresher; @@ -46,10 +39,11 @@ import java.util.Set; /** * @author Kirill Likhodedov */ -public class VcsLogManager extends AbstractProjectComponent { +public class VcsLogManager { public static final ExtensionPointName LOG_PROVIDER_EP = ExtensionPointName.create("com.intellij.logProvider"); + @NotNull private final Project myProject; @NotNull private final ProjectLevelVcsManager myVcsManager; @NotNull private final VcsLogObjectsFactory myLogObjectsFactory; @NotNull private final VcsLogSettings mySettings; @@ -59,63 +53,34 @@ public class VcsLogManager extends AbstractProjectComponent { private VcsLogDataHolder myLogDataHolder; private VcsLogUI myUi; - protected VcsLogManager(@NotNull Project project, @NotNull ProjectLevelVcsManager vcsManagerInitializedFirst, - @NotNull VcsLogObjectsFactory logObjectsFactory, @NotNull VcsLogSettings settings, - @NotNull VcsLogUiProperties uiProperties) { - super(project); - myVcsManager = vcsManagerInitializedFirst; + public VcsLogManager(@NotNull Project project, @NotNull ProjectLevelVcsManager vcsManager, + @NotNull VcsLogObjectsFactory logObjectsFactory, @NotNull VcsLogSettings settings, + @NotNull VcsLogUiProperties uiProperties) { + myProject = project; + myVcsManager = vcsManager; myLogObjectsFactory = logObjectsFactory; mySettings = settings; myUiProperties = uiProperties; } - @Override - public void initComponent() { - super.initComponent(); + @NotNull + public JComponent initContent() { + final Map logProviders = findLogProviders(); + final VcsLogContainer mainPanel = new VcsLogContainer(myProject); - if (!Registry.is("git.new.log")) { - return; - } - - ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { - public void run() { - ChangesViewContentManager changesView = (ChangesViewContentManager)ChangesViewContentManager.getInstance(myProject); - changesView.executeWhenInitialized(new DumbAwareRunnable() { - @Override - public void run() { - UIUtil.invokeAndWaitIfNeeded(new Runnable() { - @Override - public void run() { - final Map logProviders = findLogProviders(); - if (logProviders.isEmpty()) { - return; - } - - final VcsLogContainer mainPanel = new VcsLogContainer(myProject); - final Content content = new ContentImpl(mainPanel, "Log", true); - ChangesViewContentI changesView = ChangesViewContentManager.getInstance(myProject); - changesView.addContent(content); - content.setCloseable(false); - - VcsLogDataHolder.init(myProject, myLogObjectsFactory, logProviders, mySettings, new Consumer() { - @Override - public void consume(VcsLogDataHolder vcsLogDataHolder) { - Disposer.register(myProject, vcsLogDataHolder); - VcsLogUI logUI = new VcsLogUI(vcsLogDataHolder, myProject, mySettings, - new VcsLogColorManagerImpl(logProviders.keySet()), myUiProperties); - myLogDataHolder = vcsLogDataHolder; - myUi = logUI; - mainPanel.init(logUI.getMainFrame().getMainComponent()); - myLogRefresher = new PostponeableLogRefresher(myProject, vcsLogDataHolder, content); - refreshLogOnVcsEvents(logProviders); - } - }); - } - }); - } - }); + VcsLogDataHolder.init(myProject, myLogObjectsFactory, logProviders, mySettings, new Consumer() { + @Override + public void consume(VcsLogDataHolder vcsLogDataHolder) { + VcsLogUI logUI = new VcsLogUI(vcsLogDataHolder, myProject, mySettings, + new VcsLogColorManagerImpl(logProviders.keySet()), myUiProperties); + myLogDataHolder = vcsLogDataHolder; + myUi = logUI; + mainPanel.init(logUI.getMainFrame().getMainComponent()); + myLogRefresher = new PostponeableLogRefresher(myProject, vcsLogDataHolder); + refreshLogOnVcsEvents(logProviders); } }); + return mainPanel; } private void refreshLogOnVcsEvents(@NotNull Map logProviders) { @@ -130,7 +95,7 @@ public class VcsLogManager extends AbstractProjectComponent { } @NotNull - private Map findLogProviders() { + public Map findLogProviders() { Map logProviders = ContainerUtil.newHashMap(); VcsLogProvider[] allLogProviders = Extensions.getExtensions(LOG_PROVIDER_EP, myProject); for (AbstractVcs vcs : myVcsManager.getAllActiveVcss()) { @@ -174,9 +139,9 @@ public class VcsLogManager extends AbstractProjectComponent { private static class PostponeableLogRefresher implements VcsLogRefresher, Disposable { private static final String TOOLWINDOW_ID = ChangesViewContentManager.TOOLWINDOW_ID; + private static final String TAB_NAME = "Log"; @NotNull private final VcsLogDataHolder myDataHolder; - @NotNull private final Content myContentPane; @NotNull private final ToolWindowManagerImpl myToolWindowManager; @NotNull private final ToolWindowImpl myToolWindow; @NotNull private final MyRefreshPostponedEventsListener myPostponedEventsListener; @@ -185,9 +150,8 @@ public class VcsLogManager extends AbstractProjectComponent { @NotNull private final Set myRootsToRefresh = ContainerUtil.newHashSet(); @NotNull private final Object REFRESH_LOCK = new Object(); - public PostponeableLogRefresher(@NotNull Project project, @NotNull VcsLogDataHolder dataHolder, @NotNull Content contentPane) { + public PostponeableLogRefresher(@NotNull Project project, @NotNull VcsLogDataHolder dataHolder) { myDataHolder = dataHolder; - myContentPane = contentPane; myToolWindowManager = (ToolWindowManagerImpl)ToolWindowManager.getInstance(project); myToolWindow = (ToolWindowImpl)myToolWindowManager.getToolWindow(TOOLWINDOW_ID); @@ -229,8 +193,11 @@ public class VcsLogManager extends AbstractProjectComponent { } private boolean isOurContentPaneShowing() { - return myToolWindowManager.isToolWindowRegistered(TOOLWINDOW_ID) && - myToolWindow.isVisible() && myContentPane.equals(myToolWindow.getContentManager().getSelectedContent()); + if (myToolWindowManager.isToolWindowRegistered(TOOLWINDOW_ID) && myToolWindow.isVisible()) { + Content content = myToolWindow.getContentManager().getSelectedContent(); + return content != null && content.getTabName().equals(TAB_NAME); + } + return false; } private void refreshPostponedRoots() {