blob: b7a42218e3e65eb07739507c41f67c9c758eb67b [file] [log] [blame]
/*
* 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.openapi.vcs.changes.ui;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.VcsBundle;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.ChangeListOwner;
import com.intellij.openapi.vcs.changes.LocallyDeletedChange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.ColoredTreeCellRenderer;
import com.intellij.ui.SimpleTextAttributes;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
* @author max
*/
public class ChangesBrowserNode<T> extends DefaultMutableTreeNode {
private SimpleTextAttributes myAttributes;
protected int myCount = -1;
protected int myDirectoryCount = -1;
public static final Object IGNORED_FILES_TAG = new Object() {
public String toString() {
return VcsBundle.message("changes.nodetitle.ignored.files");
}
};
public static final Object LOCKED_FOLDERS_TAG = new Object() {
public String toString() {
return VcsBundle.message("changes.nodetitle.locked.folders");
}
};
public static final Object LOGICALLY_LOCKED_TAG = VcsBundle.message("changes.nodetitle.logicallt.locked.folders");
public static final Object UNVERSIONED_FILES_TAG = new Object() {
public String toString() {
return VcsBundle.message("changes.nodetitle.unversioned.files");
}
};
public static final Object MODIFIED_WITHOUT_EDITING_TAG = new Object() {
public String toString() {
return VcsBundle.message("changes.nodetitle.modified.without.editing");
}
};
public static final Object SWITCHED_FILES_TAG = new Object() {
public String toString() {
return VcsBundle.message("changes.nodetitle.switched.files");
}
};
public static final Object SWITCHED_ROOTS_TAG = new Object() {
public String toString() {
return VcsBundle.message("changes.nodetitle.switched.roots");
}
};
protected ChangesBrowserNode(Object userObject) {
super(userObject);
myAttributes = SimpleTextAttributes.REGULAR_ATTRIBUTES;
}
public static ChangesBrowserNode create(final Project project, @NotNull final LocallyDeletedChange change) {
return new ChangesBrowserLocallyDeletedNode(change, project);
}
public static ChangesBrowserNode create(final Project project, @NotNull Object userObject) {
/*if (userObject instanceof Change) {
return new ChangesBrowserChangeNode(project, (Change) userObject);
}*/
if (userObject instanceof VirtualFile) {
return new ChangesBrowserFileNode(project, (VirtualFile) userObject);
}
if (userObject instanceof FilePath) {
return new ChangesBrowserFilePathNode((FilePath) userObject);
}
/* if (userObject instanceof ChangeList) {
return new ChangesBrowserChangeListNode(project, (ChangeList) userObject);
}*/
if (userObject == IGNORED_FILES_TAG) {
return new ChangesBrowserIgnoredFilesNode(userObject);
}
if (userObject == LOCKED_FOLDERS_TAG) {
return new ChangesBrowserLockedFoldersNode(project, userObject);
}
if (userObject instanceof ChangesBrowserLogicallyLockedFile) {
return (ChangesBrowserNode) userObject;
}
return new ChangesBrowserNode(userObject);
}
@Override
public void insert(MutableTreeNode newChild, int childIndex) {
super.insert(newChild, childIndex);
myCount = -1;
myDirectoryCount = -1;
}
public int getCount() {
if (myCount == -1) {
myCount = 0;
final Enumeration nodes = children();
while (nodes.hasMoreElements()) {
ChangesBrowserNode child = (ChangesBrowserNode)nodes.nextElement();
myCount += child.getCount();
}
}
return myCount;
}
public int getDirectoryCount() {
if (myDirectoryCount == -1) {
myDirectoryCount = isDirectory() ? 1 : 0;
final Enumeration nodes = children();
while (nodes.hasMoreElements()) {
ChangesBrowserNode child = (ChangesBrowserNode)nodes.nextElement();
myDirectoryCount += child.getDirectoryCount();
}
}
return myDirectoryCount;
}
protected boolean isDirectory() {
return false;
}
public List<Change> getAllChangesUnder() {
return getAllObjectsUnder(Change.class);
}
public <T> List<T> getAllObjectsUnder(final Class<T> clazz) {
List<T> changes = new ArrayList<T>();
final Enumeration enumeration = preorderEnumeration();
while (enumeration.hasMoreElements()) {
ChangesBrowserNode child = (ChangesBrowserNode)enumeration.nextElement();
final Object value = child.getUserObject();
if (clazz.isAssignableFrom(value.getClass())) {
//noinspection unchecked
changes.add((T) value);
}
}
return changes;
}
public List<VirtualFile> getAllFilesUnder() {
List<VirtualFile> files = new ArrayList<VirtualFile>();
final Enumeration enumeration = breadthFirstEnumeration();
while (enumeration.hasMoreElements()) {
ChangesBrowserNode child = (ChangesBrowserNode)enumeration.nextElement();
final Object value = child.getUserObject();
if (value instanceof VirtualFile) {
final VirtualFile file = (VirtualFile)value;
if (file.isValid()) {
files.add(file);
}
}
}
return files;
}
public List<FilePath> getAllFilePathsUnder() {
List<FilePath> files = new ArrayList<FilePath>();
final Enumeration enumeration = breadthFirstEnumeration();
while (enumeration.hasMoreElements()) {
ChangesBrowserNode child = (ChangesBrowserNode)enumeration.nextElement();
final Object value = child.getUserObject();
if (child.isLeaf() && value instanceof FilePath) {
final FilePath file = (FilePath)value;
files.add(file);
}
final FilePath ownPath = child.getMyPath();
if (ownPath != null) {
files.add(ownPath);
}
}
return files;
}
@Nullable
protected FilePath getMyPath() {
return null;
}
public void render(final ChangesBrowserNodeRenderer renderer, final boolean selected, final boolean expanded, final boolean hasFocus) {
renderer.append(userObject.toString(), myAttributes);
appendCount(renderer);
}
protected String getCountText() {
int count = getCount();
int dirCount = getDirectoryCount();
if (dirCount == 0) {
return " " + VcsBundle.message("changes.nodetitle.changecount", count);
}
else if (count == 0 && dirCount > 0) {
return " " + VcsBundle.message("changes.nodetitle.directory.changecount", dirCount);
}
else {
return " " + VcsBundle.message("changes.nodetitle.directory.file.changecount", dirCount, count);
}
}
protected void appendCount(final ColoredTreeCellRenderer renderer) {
final String countText = getCountText();
renderer.append(countText, SimpleTextAttributes.GRAY_ITALIC_ATTRIBUTES);
}
public String toString() {
return getTextPresentation();
}
public String getTextPresentation() {
return userObject == null ? "" : userObject.toString();
}
@Override
public T getUserObject() {
//noinspection unchecked
return (T) userObject;
}
public boolean canAcceptDrop(final ChangeListDragBean dragBean) {
return false;
}
public void acceptDrop(final ChangeListOwner dragOwner, final ChangeListDragBean dragBean) {
}
public int getSortWeight() {
return 8;
}
public int compareUserObjects(final Object o2) {
return 0;
}
public FilePath[] getFilePathsUnder() {
return new FilePath[0];
}
public void setAttributes(SimpleTextAttributes attributes) {
myAttributes = attributes;
}
}