From 2419db059d25d259331ae2ec32161dfcfc287735 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 3 May 2011 19:24:57 +0400 Subject: [PATCH] error nodes support --- .../com/intellij/ide/diff/DiffElement.java | 1 + .../intellij/ide/diff/DiffErrorElement.java | 97 +++++++++++++++++++ .../intellij/openapi/diff/impl/dir/DTree.java | 12 ++- .../intellij/openapi/diff/impl/dir/DType.java | 2 +- .../openapi/diff/impl/dir/DirDiffElement.java | 18 +++- .../diff/impl/dir/DirDiffOperation.java | 4 +- .../openapi/diff/impl/dir/DirDiffPanel.java | 10 +- .../diff/impl/dir/DirDiffTableModel.java | 2 + 8 files changed, 136 insertions(+), 10 deletions(-) create mode 100644 platform/platform-api/src/com/intellij/ide/diff/DiffErrorElement.java diff --git a/platform/platform-api/src/com/intellij/ide/diff/DiffElement.java b/platform/platform-api/src/com/intellij/ide/diff/DiffElement.java index bc998a9f07be..cca53d2dd08f 100644 --- a/platform/platform-api/src/com/intellij/ide/diff/DiffElement.java +++ b/platform/platform-api/src/com/intellij/ide/diff/DiffElement.java @@ -44,6 +44,7 @@ import java.util.concurrent.Callable; */ public abstract class DiffElement implements Disposable { public static final DiffElement[] EMPTY_ARRAY = new DiffElement[0]; + public static final DiffElement ERROR_NODE = new DiffErrorElement("Can't load elements", "An error has been occurred while getting children"); private DiffPanel myDiffPanel; private Editor myEditor; private static final Logger LOG = Logger.getInstance(DiffElement.class.getName()); diff --git a/platform/platform-api/src/com/intellij/ide/diff/DiffErrorElement.java b/platform/platform-api/src/com/intellij/ide/diff/DiffErrorElement.java new file mode 100644 index 000000000000..50b9998d9605 --- /dev/null +++ b/platform/platform-api/src/com/intellij/ide/diff/DiffErrorElement.java @@ -0,0 +1,97 @@ +/* + * Copyright 2000-2011 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.ide.diff; + +import com.intellij.openapi.project.Project; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Icons; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.io.IOException; + +/** + * @author Konstantin Bulenkov + */ +public class DiffErrorElement extends DiffElement { + private final String myMessage; + private final JTextArea myDescription; + + public DiffErrorElement() { + this("Can't load children", ""); + } + + public DiffErrorElement(@NotNull String message, @NotNull String description) { + myMessage = message; + myDescription = new JTextArea(description); + //myDescription.setBackground(new Color(0,0,0,0)); + myDescription.setEditable(false); + } + + + + @Override + public String getPath() { + return ""; + } + + @NotNull + @Override + public String getName() { + return myMessage; + } + + @Override + public long getSize() { + return -1; + } + + @Override + public long getTimeStamp() { + return -1; + } + + @Override + public boolean isContainer() { + return false; + } + + @Override + public DiffElement[] getChildren() throws IOException { + return EMPTY_ARRAY; + } + + @Override + public byte[] getContent() throws IOException { + return ArrayUtil.EMPTY_BYTE_ARRAY; + } + + @Override + public Object getValue() { + return null; + } + + @Override + public Icon getIcon() { + return Icons.ERROR_INTRODUCTION_ICON; + } + + @Override + public JComponent getViewComponent(Project project, @Nullable DiffElement target) { + return myDescription; + } +} diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java index 2f637bde1487..11ce50138c51 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DTree.java @@ -16,6 +16,7 @@ package com.intellij.openapi.diff.impl.dir; import com.intellij.ide.diff.DiffElement; +import com.intellij.ide.diff.DiffErrorElement; import com.intellij.ide.diff.DirDiffSettings; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.SortedList; @@ -27,6 +28,8 @@ import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import static com.intellij.openapi.diff.impl.dir.DType.ERROR; + /** * @author Konstantin Bulenkov */ @@ -143,7 +146,9 @@ public class DTree { for (DTree tree : getChildren()) { final DiffElement src = tree.getSource(); final DiffElement trg = tree.getTarget(); - if (src == null && trg != null) { + if (src instanceof DiffErrorElement || trg instanceof DiffErrorElement) { + tree.setType(ERROR); + } else if (src == null && trg != null) { tree.setType(DType.TARGET); } else if (src != null && trg == null) { tree.setType(DType.SOURCE); @@ -172,6 +177,10 @@ public class DTree { public void updateVisibility(DirDiffSettings settings) { if (children.isEmpty()) { + if (type == ERROR) { + myVisible = true; + return; + } if (type != DType.SEPARATOR && !"".equals(settings.getFilter())) { if (!settings.getFilterPattern().matcher(getName()).matches()) { myVisible = false; @@ -189,6 +198,7 @@ public class DTree { myVisible = settings.showNewOnTarget; break; case SEPARATOR: + case ERROR: myVisible = true; break; case CHANGED: diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DType.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DType.java index 5d94f557b4d0..6f0f0b28e716 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DType.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DType.java @@ -18,4 +18,4 @@ package com.intellij.openapi.diff.impl.dir; /** * @author Konstantin Bulenkov */ -public enum DType {SOURCE, TARGET, SEPARATOR, CHANGED, EQUAL} +public enum DType {SOURCE, TARGET, SEPARATOR, CHANGED, EQUAL, ERROR} diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java index 26693de2698a..094f01424db6 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -import static com.intellij.openapi.diff.impl.dir.DirDiffOperation.*; +import static com.intellij.openapi.diff.impl.dir.DirDiffOperation.COPY_TO; /** * @author Konstantin Bulenkov @@ -43,7 +43,10 @@ public class DirDiffElement { myTarget = target; myTargetLength = target == null || target.isContainer() ? -1 : target.getSize(); myName = name; - if (isSource()) { + if (type == DType.ERROR) { + myOperation = DirDiffOperation.NONE; + } + else if (isSource()) { myOperation = COPY_TO; } else if (isTarget()) { @@ -67,13 +70,18 @@ public class DirDiffElement { } private static String getLastModification(DiffElement file) { - return DateFormatUtil.formatDateTime(file.getTimeStamp()); + final long timeStamp = file.getTimeStamp(); + return timeStamp < 0 ? "" : DateFormatUtil.formatDateTime(timeStamp); } public static DirDiffElement createChange(@NotNull DiffElement source, @NotNull DiffElement target) { return new DirDiffElement(source, target, DType.CHANGED, source.getName()); } + public static DirDiffElement createError(@Nullable DiffElement source, @Nullable DiffElement target) { + return new DirDiffElement(source, target, DType.ERROR, source == null ? target.getName() : source.getName()); + } + public static DirDiffElement createSourceOnly(@NotNull DiffElement source) { return new DirDiffElement(source, null, DType.SOURCE, null); } @@ -109,7 +117,7 @@ public class DirDiffElement { @Nullable public String getSourceName() { return myType == DType.CHANGED || myType == DType.SOURCE || myType == DType.EQUAL - ? mySource.getName() : null; + ? mySource.getName() : mySource == null ? null : mySource.getName(); } @Nullable @@ -120,7 +128,7 @@ public class DirDiffElement { @Nullable public String getTargetName() { return myType == DType.CHANGED || myType == DType.TARGET || myType == DType.EQUAL - ? myTarget.getName() : null; + ? myTarget.getName() : myTarget == null ? null : myTarget.getName(); } @Nullable diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java index 1ad232916b0a..53414e53f839 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java @@ -26,7 +26,7 @@ import java.awt.*; * @author Konstantin Bulenkov */ public enum DirDiffOperation { - COPY_TO, COPY_FROM, MERGE, EQUAL; + COPY_TO, COPY_FROM, MERGE, EQUAL, NONE; public Icon getIcon() { switch (this) { @@ -34,6 +34,7 @@ public enum DirDiffOperation { case COPY_FROM: return IconLoader.getIcon("/vcs/arrow_left.png"); case MERGE: return IconLoader.getIcon("/vcs/not_equal.png"); case EQUAL: return IconLoader.getIcon("/vcs/equal.png"); + case NONE: } return EmptyIcon.create(16); } @@ -46,6 +47,7 @@ public enum DirDiffOperation { case MERGE: return FileStatus.COLOR_MODIFIED; case EQUAL: + case NONE: } return Color.BLACK; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java index 14403f264b01..fefcbf15d220 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java @@ -113,14 +113,20 @@ public class DirDiffPanel implements Disposable { } } else { - final DiffElement object = element.isSource() ? element.getSource() : element.getTarget(); + final DiffElement object; + if (element.getType() == DType.ERROR) { + object = element.getSource() == null ? element.getTarget() : element.getSource(); + } else { + object = element.isSource() ? element.getSource() : element.getTarget(); + } myViewComponent = object.getViewComponent(project, null); if (myViewComponent != null) { myCurrentElement = object; myDiffPanel.add(myViewComponent, BorderLayout.CENTER); DataManager.registerDataProvider(myDiffPanel, myCurrentElement.getDataProvider(project)); - myViewComponent.revalidate(); + myDiffPanel.revalidate(); + myDiffPanel.repaint(); } else { myDiffPanel.add(getErrorLabel(), BorderLayout.CENTER); myDiffPanel.revalidate(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java index 99e2906272d4..bdd260a2c1a4 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java @@ -246,6 +246,8 @@ public class DirDiffTableModel extends AbstractTableModel implements Disposable case EQUAL: elements.add(DirDiffElement.createEqual(child.getSource(), child.getTarget())); break; + case ERROR: + elements.add(DirDiffElement.createError(child.getSource(), child.getTarget())); } } } else {