diff options
Diffstat (limited to 'plugins/svn4idea/src')
8 files changed, 136 insertions, 126 deletions
diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java index 9d8df6591268..bbafc719f43b 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java @@ -53,12 +53,7 @@ import java.util.TreeSet; @State( name = "SvnConfiguration", - roamingType = RoamingType.DISABLED, - storages = { - @Storage( - file = StoragePathMacros.WORKSPACE_FILE - ) - } + storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE)} ) public class SvnConfiguration implements PersistentStateComponent<SvnConfigurationState> { diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeModel.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeModel.java index c57391dc546e..38195f64053f 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeModel.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeModel.java @@ -122,10 +122,12 @@ public class RepositoryTreeModel extends DefaultTreeModel implements Disposable return myCacheLoader; } + @NotNull public Expander getLazyLoadingExpander() { return myDefaultExpanderFactory.fun(myBrowser); } + @NotNull public Expander getSelectionKeepingExpander() { return new KeepingSelectionExpander(myBrowser); } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeNode.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeNode.java index f21ca1735ff4..90f617ecad72 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeNode.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/RepositoryTreeNode.java @@ -15,9 +15,12 @@ */ package org.jetbrains.idea.svn.dialogs; +import com.intellij.CommonBundle; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.util.NotNullFunction; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.FilteringIterator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.SvnVcs; @@ -27,7 +30,6 @@ import org.jetbrains.idea.svn.dialogs.browserCache.NodeLoadState; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.util.SVNPathUtil; -import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; import java.util.ArrayList; import java.util.Collections; @@ -37,16 +39,16 @@ import java.util.List; public class RepositoryTreeNode implements TreeNode, Disposable { private TreeNode myParentNode; - private List<TreeNode> myChildren; + @NotNull private final List<TreeNode> myChildren; private final RepositoryTreeModel myModel; private final SVNURL myURL; private final Object myUserObject; - private final NodeLoadState myLoadState; + @NotNull private final NodeLoadState myLoadState; private NodeLoadState myChildrenLoadState; public RepositoryTreeNode(RepositoryTreeModel model, TreeNode parentNode, - @NotNull SVNURL url, Object userObject, final NodeLoadState state) { + @NotNull SVNURL url, Object userObject, @NotNull NodeLoadState state) { myParentNode = parentNode; myURL = url; @@ -54,6 +56,7 @@ public class RepositoryTreeNode implements TreeNode, Disposable { myUserObject = userObject; myLoadState = state; + myChildren = ContainerUtil.newArrayList(); myChildrenLoadState = NodeLoadState.EMPTY; } @@ -113,10 +116,10 @@ public class RepositoryTreeNode implements TreeNode, Disposable { return SVNPathUtil.tail(myURL.getPath()); } - public void reload(final Expander expander, final boolean removeCurrentChildren) { + public void reload(@NotNull Expander expander, boolean removeCurrentChildren) { ApplicationManager.getApplication().assertIsDispatchThread(); - if (removeCurrentChildren || (myChildren == null)) { + if (removeCurrentChildren || NodeLoadState.EMPTY.equals(myChildrenLoadState)) { initChildren(); } @@ -124,15 +127,15 @@ public class RepositoryTreeNode implements TreeNode, Disposable { } private void initChildren() { - myChildren = new ArrayList<TreeNode>(); - myChildren.add(new DefaultMutableTreeNode("Loading")); + myChildren.clear(); + myChildren.add(new SimpleTextNode(CommonBundle.getLoadingTreeNodeText())); myChildrenLoadState = NodeLoadState.LOADING; } private List getChildren() { ApplicationManager.getApplication().assertIsDispatchThread(); - - if (myChildren == null) { + + if (NodeLoadState.EMPTY.equals(myChildrenLoadState)) { initChildren(); myModel.getCacheLoader().load(this, myModel.getLazyLoadingExpander()); } @@ -145,10 +148,7 @@ public class RepositoryTreeNode implements TreeNode, Disposable { @Nullable public DirectoryEntry getSVNDirEntry() { - if (myUserObject instanceof DirectoryEntry) { - return (DirectoryEntry) myUserObject; - } - return null; + return myUserObject instanceof DirectoryEntry ? (DirectoryEntry)myUserObject : null; } public void dispose() { @@ -164,35 +164,19 @@ public class RepositoryTreeNode implements TreeNode, Disposable { @NotNull public List<TreeNode> getAllAlreadyLoadedChildren() { - if (myChildren != null) { - final List<TreeNode> result = new ArrayList<TreeNode>(myChildren.size()); - for (TreeNode child : myChildren) { - result.add(child); - } - return result; - } - return Collections.emptyList(); + return ContainerUtil.newArrayList(myChildren); } @NotNull public List<RepositoryTreeNode> getAlreadyLoadedChildren() { - if (myChildren != null) { - final List<RepositoryTreeNode> result = new ArrayList<RepositoryTreeNode>(myChildren.size()); - for (TreeNode child : myChildren) { - if (child instanceof RepositoryTreeNode) { - result.add((RepositoryTreeNode) child); - } - } - return result; - } - return Collections.emptyList(); + return ContainerUtil.collect(myChildren.iterator(), FilteringIterator.instanceOf(RepositoryTreeNode.class)); } public boolean isDisposed() { return myModel.isDisposed(); } - public void setChildren(final List<DirectoryEntry> children, final NodeLoadState state) { + public void setChildren(@NotNull List<DirectoryEntry> children, @NotNull NodeLoadState state) { final List<TreeNode> nodes = new ArrayList<TreeNode>(); for (final DirectoryEntry entry : children) { if (!myModel.isShowFiles() && !entry.isDirectory()) { @@ -213,19 +197,17 @@ public class RepositoryTreeNode implements TreeNode, Disposable { } public void setAlienChildren(final List<TreeNode> children, final NodeLoadState oldState) { - if (myChildren == null) { - myChildren = new ArrayList<TreeNode>(); - } else { - myChildren.clear(); - } + myChildren.clear(); for (TreeNode child : children) { if (child instanceof RepositoryTreeNode) { ((RepositoryTreeNode) child).setParentNode(this); myChildren.add(child); myChildrenLoadState = oldState; - } else if (child instanceof DefaultMutableTreeNode) { - myChildren.add(new DefaultMutableTreeNode(((DefaultMutableTreeNode) child).getUserObject())); + } + else if (child instanceof SimpleTextNode) { + SimpleTextNode node = (SimpleTextNode)child; + myChildren.add(new SimpleTextNode(node.getText(), node.isError())); myChildrenLoadState = oldState; } } @@ -233,13 +215,9 @@ public class RepositoryTreeNode implements TreeNode, Disposable { myModel.reload(this); } - public void setErrorNode(final String text, final NodeLoadState state) { - if (myChildren == null) { - myChildren = new ArrayList<TreeNode>(); - } + public void setErrorNode(@NotNull String text) { myChildren.clear(); - myChildren.add(new DefaultMutableTreeNode(text)); - + myChildren.add(new SimpleTextNode(text, true)); myChildrenLoadState = NodeLoadState.ERROR; myModel.reload(this); } @@ -257,24 +235,20 @@ public class RepositoryTreeNode implements TreeNode, Disposable { return myModel.findByUrl(this); } - public RepositoryTreeModel getModel() { - return myModel; - } - public NodeLoadState getChildrenLoadState() { return myChildrenLoadState; } - public void doOnSubtree(final NotNullFunction<RepositoryTreeNode, Object> function) { - final SubTreeWalker walker = new SubTreeWalker(this, function); - walker.execute(); + public void doOnSubtree(@NotNull NotNullFunction<RepositoryTreeNode, Object> function) { + new SubTreeWalker(this, function).execute(); } private static class SubTreeWalker { - private final RepositoryTreeNode myNode; - private final NotNullFunction<RepositoryTreeNode, Object> myFunction; - private SubTreeWalker(final RepositoryTreeNode node, final NotNullFunction<RepositoryTreeNode, Object> function) { + @NotNull private final RepositoryTreeNode myNode; + @NotNull private final NotNullFunction<RepositoryTreeNode, Object> myFunction; + + private SubTreeWalker(@NotNull RepositoryTreeNode node, @NotNull NotNullFunction<RepositoryTreeNode, Object> function) { myNode = node; myFunction = function; } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SimpleTextNode.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SimpleTextNode.java new file mode 100644 index 000000000000..ce3f0d923252 --- /dev/null +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SimpleTextNode.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2014 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 org.jetbrains.idea.svn.dialogs; + +import org.jetbrains.annotations.NotNull; + +import javax.swing.tree.DefaultMutableTreeNode; + +/** + * @author Konstantin Kolosovsky. + */ +public class SimpleTextNode extends DefaultMutableTreeNode { + + private final boolean myIsError; + + public SimpleTextNode(@NotNull String text) { + this(text, false); + } + + public SimpleTextNode(@NotNull String text, boolean isError) { + super(text); + myIsError = isError; + } + + public boolean isError() { + return myIsError; + } + + @NotNull + public String getText() { + return (String)getUserObject(); + } +} diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SvnRepositoryTreeCellRenderer.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SvnRepositoryTreeCellRenderer.java index 6ecd89f82fd7..75742303b050 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SvnRepositoryTreeCellRenderer.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/SvnRepositoryTreeCellRenderer.java @@ -15,17 +15,14 @@ */ package org.jetbrains.idea.svn.dialogs; -import com.intellij.CommonBundle; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.PlatformIcons; import com.intellij.util.text.DateFormatUtil; import org.jetbrains.idea.svn.browse.DirectoryEntry; -import org.tmatesoft.svn.core.SVNErrorMessage; import javax.swing.*; -import javax.swing.tree.DefaultMutableTreeNode; public class SvnRepositoryTreeCellRenderer extends ColoredTreeCellRenderer { @@ -56,13 +53,11 @@ public class SvnRepositoryTreeCellRenderer extends ColoredTreeCellRenderer { ? FileTypeManager.getInstance().getFileTypeByFileName(name).getIcon() : PlatformIcons.DIRECTORY_CLOSED_ICON); } - } else if (value instanceof DefaultMutableTreeNode) { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; - if (node.getUserObject() instanceof String) { - append(CommonBundle.getLoadingTreeNodeText(), SimpleTextAttributes.REGULAR_ATTRIBUTES); - } else if (node.getUserObject() instanceof SVNErrorMessage) { - append(node.getUserObject().toString(), SimpleTextAttributes.ERROR_ATTRIBUTES); - } + } + else if (value instanceof SimpleTextNode) { + SimpleTextNode node = (SimpleTextNode)value; + + append(node.getText(), node.isError() ? SimpleTextAttributes.ERROR_ATTRIBUTES : SimpleTextAttributes.REGULAR_ATTRIBUTES); } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/CacheLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/CacheLoader.java index d80efb97a123..f8553d5c66c3 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/CacheLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/CacheLoader.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.svn.dialogs.browserCache; import com.intellij.openapi.components.ServiceManager; +import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.browse.DirectoryEntry; import org.jetbrains.idea.svn.dialogs.RepositoryTreeNode; @@ -23,7 +24,8 @@ import javax.swing.*; import java.util.List; public class CacheLoader extends Loader { - private final Loader myRepositoryLoader; + + @NotNull private final Loader myRepositoryLoader; public static Loader getInstance() { return ServiceManager.getService(Loader.class); @@ -34,7 +36,7 @@ public class CacheLoader extends Loader { myRepositoryLoader = new RepositoryLoader(myCache); } - public void load(final RepositoryTreeNode node, final Expander expander) { + public void load(@NotNull final RepositoryTreeNode node, @NotNull final Expander expander) { SwingUtilities.invokeLater(new Runnable(){ public void run() { final String nodeUrl = node.getURL().toString(); @@ -53,15 +55,8 @@ public class CacheLoader extends Loader { }); } - public void forceRefresh(final String repositoryRootUrl) { - myCache.clear(repositoryRootUrl); - } - + @NotNull protected NodeLoadState getNodeLoadState() { return NodeLoadState.CACHED; } - - public Loader getRepositoryLoader() { - return myRepositoryLoader; - } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/Loader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/Loader.java index ab2b6ddb67f3..62d7ec10024a 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/Loader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/Loader.java @@ -15,51 +15,52 @@ */ package org.jetbrains.idea.svn.dialogs.browserCache; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.svn.browse.DirectoryEntry; import org.jetbrains.idea.svn.dialogs.RepositoryTreeNode; import java.util.List; public abstract class Loader { - protected final SvnRepositoryCache myCache; - protected Loader(final SvnRepositoryCache cache) { + @NotNull protected final SvnRepositoryCache myCache; + + protected Loader(@NotNull SvnRepositoryCache cache) { myCache = cache; } - public abstract void load(final RepositoryTreeNode node, final Expander afterRefreshExpander); - public abstract void forceRefresh(final String repositoryRootUrl); + public abstract void load(@NotNull RepositoryTreeNode node, @NotNull Expander afterRefreshExpander); + + @NotNull protected abstract NodeLoadState getNodeLoadState(); - protected void refreshNodeError(final RepositoryTreeNode node, final String text) { - if (node.isDisposed()) { - return; - } - final RepositoryTreeNode existingNode = node.getNodeWithSamePathUnderModelRoot(); - if (existingNode == null) { - return; - } - if (existingNode.isDisposed()) { - return; - } + protected void refreshNodeError(@NotNull RepositoryTreeNode node, @NotNull String text) { + RepositoryTreeNode existingNode = findExistingNode(node); - existingNode.setErrorNode(text, getNodeLoadState()); + if (existingNode != null) { + existingNode.setErrorNode(text); + } } - protected void refreshNode(final RepositoryTreeNode node, final List<DirectoryEntry> data, final Expander expander) { - if (node.isDisposed()) { - return; - } - final RepositoryTreeNode existingNode = node.getNodeWithSamePathUnderModelRoot(); - if (existingNode == null) { - return; + protected void refreshNode(@NotNull RepositoryTreeNode node, @NotNull List<DirectoryEntry> data, @NotNull Expander expander) { + RepositoryTreeNode existingNode = findExistingNode(node); + + if (existingNode != null) { + expander.onBeforeRefresh(existingNode); + existingNode.setChildren(data, getNodeLoadState()); + expander.onAfterRefresh(existingNode); } + } - if (existingNode.isDisposed()) { - return; + @Nullable + private static RepositoryTreeNode findExistingNode(@NotNull RepositoryTreeNode node) { + RepositoryTreeNode result = null; + + if (!node.isDisposed()) { + result = node.getNodeWithSamePathUnderModelRoot(); } - expander.onBeforeRefresh(existingNode); - existingNode.setChildren(data, getNodeLoadState()); - expander.onAfterRefresh(existingNode); + + return result == null || result.isDisposed() ? null : result; } } diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/RepositoryLoader.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/RepositoryLoader.java index 319699cfc1b8..6786d8648300 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/RepositoryLoader.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/dialogs/browserCache/RepositoryLoader.java @@ -21,6 +21,7 @@ import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vcs.VcsException; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.svn.SvnVcs; import org.jetbrains.idea.svn.api.Depth; @@ -28,26 +29,29 @@ import org.jetbrains.idea.svn.auth.SvnAuthenticationProvider; import org.jetbrains.idea.svn.browse.DirectoryEntry; import org.jetbrains.idea.svn.browse.DirectoryEntryConsumer; import org.jetbrains.idea.svn.dialogs.RepositoryTreeNode; -import org.tmatesoft.svn.core.*; +import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.SvnTarget; import javax.swing.*; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Queue; +import java.util.TreeSet; class RepositoryLoader extends Loader { // may be several requests if: several same-level nodes are expanded simultaneosly; or browser can be opening into some expanded state - private final Queue<Pair<RepositoryTreeNode, Expander>> myLoadQueue; + @NotNull private final Queue<Pair<RepositoryTreeNode, Expander>> myLoadQueue; private boolean myQueueProcessorActive; - RepositoryLoader(final SvnRepositoryCache cache) { + RepositoryLoader(@NotNull SvnRepositoryCache cache) { super(cache); - myLoadQueue = new LinkedList<Pair<RepositoryTreeNode, Expander>>(); + myLoadQueue = ContainerUtil.newLinkedList(); myQueueProcessorActive = false; } - public void load(final RepositoryTreeNode node, final Expander afterRefreshExpander) { + public void load(@NotNull RepositoryTreeNode node, @NotNull Expander afterRefreshExpander) { ApplicationManager.getApplication().assertIsDispatchThread(); final Pair<RepositoryTreeNode, Expander> data = Pair.create(node, afterRefreshExpander); @@ -59,12 +63,12 @@ class RepositoryLoader extends Loader { } } - private void setResults(final Pair<RepositoryTreeNode, Expander> data, final List<DirectoryEntry> children) { + private void setResults(@NotNull Pair<RepositoryTreeNode, Expander> data, @NotNull List<DirectoryEntry> children) { myCache.put(data.first.getURL().toString(), children); refreshNode(data.first, children, data.second); } - private void setError(final Pair<RepositoryTreeNode, Expander> data, final String message) { + private void setError(@NotNull Pair<RepositoryTreeNode, Expander> data, @NotNull String message) { myCache.put(data.first.getURL().toString(), message); refreshNodeError(data.first, message); } @@ -85,7 +89,7 @@ class RepositoryLoader extends Loader { } } - private void startLoadTask(final Pair<RepositoryTreeNode, Expander> data) { + private void startLoadTask(@NotNull final Pair<RepositoryTreeNode, Expander> data) { final ModalityState state = ModalityState.current(); ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override @@ -101,18 +105,16 @@ class RepositoryLoader extends Loader { }); } - public void forceRefresh(final String repositoryRootUrl) { - // ? remove - } - + @NotNull protected NodeLoadState getNodeLoadState() { return NodeLoadState.REFRESHED; } private class LoadTask implements Runnable { - private final Pair<RepositoryTreeNode, Expander> myData; - private LoadTask(final Pair<RepositoryTreeNode, Expander> data) { + @NotNull private final Pair<RepositoryTreeNode, Expander> myData; + + private LoadTask(@NotNull Pair<RepositoryTreeNode, Expander> data) { myData = data; } @@ -147,7 +149,7 @@ class RepositoryLoader extends Loader { SwingUtilities.invokeLater(new Runnable() { public void run() { - setResults(myData, new ArrayList<DirectoryEntry>(entries)); + setResults(myData, ContainerUtil.newArrayList(entries)); startNext(); } }); |