diff: add annotate action to diff viewers
[idea/community.git] / platform / diff-impl / src / com / intellij / diff / tools / ErrorDiffTool.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.diff.tools;
17
18 import com.intellij.diff.DiffContext;
19 import com.intellij.diff.DiffContextEx;
20 import com.intellij.diff.FrameDiffTool;
21 import com.intellij.diff.contents.DiffContent;
22 import com.intellij.diff.contents.FileContent;
23 import com.intellij.diff.requests.*;
24 import com.intellij.diff.util.DiffUtil;
25 import com.intellij.openapi.application.ApplicationManager;
26 import com.intellij.openapi.application.ModalityState;
27 import com.intellij.openapi.fileTypes.FileTypeManager;
28 import com.intellij.openapi.fileTypes.FileTypes;
29 import com.intellij.openapi.fileTypes.UnknownFileType;
30 import com.intellij.openapi.vfs.VirtualFile;
31 import com.intellij.util.ui.JBUI;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34
35 import javax.swing.*;
36 import java.util.List;
37
38 public class ErrorDiffTool implements FrameDiffTool {
39   public static final ErrorDiffTool INSTANCE = new ErrorDiffTool();
40
41   @NotNull
42   @Override
43   public DiffViewer createComponent(@NotNull DiffContext context, @NotNull DiffRequest request) {
44     return new MyViewer(context, request);
45   }
46
47   @Override
48   public boolean canShow(@NotNull DiffContext context, @NotNull DiffRequest request) {
49     return true;
50   }
51
52   @NotNull
53   @Override
54   public String getName() {
55     return "Error viewer";
56   }
57
58   private static class MyViewer implements DiffViewer {
59     @NotNull private final DiffContext myContext;
60     @NotNull private final DiffRequest myRequest;
61
62     @NotNull private final JPanel myPanel;
63
64     public MyViewer(@NotNull DiffContext context, @NotNull DiffRequest request) {
65       myContext = context;
66       myRequest = request;
67
68       myPanel = JBUI.Panels.simplePanel(createComponent(request));
69     }
70
71     @NotNull
72     private JComponent createComponent(@NotNull DiffRequest request) {
73       if (request instanceof MessageDiffRequest) {
74         // TODO: explain some of ErrorDiffRequest exceptions ?
75         String message = ((MessageDiffRequest)request).getMessage();
76         return DiffUtil.createMessagePanel(message);
77       }
78       if (request instanceof ComponentDiffRequest) {
79         return ((ComponentDiffRequest)request).getComponent(myContext);
80       }
81       if (request instanceof ContentDiffRequest) {
82         List<DiffContent> contents = ((ContentDiffRequest)request).getContents();
83         for (final DiffContent content : contents) {
84           if (content instanceof FileContent && FileTypes.UNKNOWN.equals(content.getContentType())) {
85             final VirtualFile file = ((FileContent)content).getFile();
86
87             UnknownFileTypeDiffRequest unknownFileTypeRequest = new UnknownFileTypeDiffRequest(file, myRequest.getTitle());
88             return unknownFileTypeRequest.getComponent(myContext);
89           }
90         }
91       }
92
93       return DiffUtil.createMessagePanel("Can't show diff");
94     }
95
96     @NotNull
97     @Override
98     public JComponent getComponent() {
99       return myPanel;
100     }
101
102     @Nullable
103     @Override
104     public JComponent getPreferredFocusedComponent() {
105       return null;
106     }
107
108     @NotNull
109     @Override
110     public ToolbarComponents init() {
111       if (myRequest instanceof UnknownFileTypeDiffRequest) {
112         String fileName = ((UnknownFileTypeDiffRequest)myRequest).getFileName();
113         if (fileName != null && FileTypeManager.getInstance().getFileTypeByFileName(fileName) != UnknownFileType.INSTANCE) {
114           // FileType was assigned elsewhere (ex: by other UnknownFileTypeDiffRequest). We should reload request.
115           if (myContext instanceof DiffContextEx) {
116             ApplicationManager.getApplication().invokeLater(new Runnable() {
117               @Override
118               public void run() {
119                 ((DiffContextEx)myContext).reloadDiffRequest();
120               }
121             }, ModalityState.current());
122           }
123         }
124       }
125
126       return new ToolbarComponents();
127     }
128
129     @Override
130     public void dispose() {
131     }
132   }
133 }