blob: a67a6ad5af7127391d77f094d023c1dde61c6183 [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.diff.impl;
import com.intellij.codeStyle.CodeStyleFacade;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.diff.DiffContent;
import com.intellij.openapi.diff.DiffContentUtil;
import com.intellij.openapi.diff.DiffViewer;
import com.intellij.openapi.diff.impl.external.DiffManagerImpl;
import com.intellij.openapi.diff.impl.fragments.Fragment;
import com.intellij.openapi.diff.impl.fragments.LineFragment;
import com.intellij.openapi.diff.impl.string.DiffString;
import com.intellij.openapi.diff.impl.util.FocusDiffSide;
import com.intellij.openapi.diff.impl.util.TextDiffType;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.FrameWrapper;
import com.intellij.util.ImageLoader;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
public class DiffUtil {
private DiffUtil() {
}
public static void initDiffFrame(Project project, @NotNull FrameWrapper frameWrapper, @NotNull final DiffViewer diffPanel, final JComponent mainComponent) {
frameWrapper.setComponent(mainComponent);
frameWrapper.setProject(project);
frameWrapper.setImage(ImageLoader.loadFromResource("/diff/Diff.png"));
frameWrapper.setPreferredFocusedComponent(diffPanel.getPreferredFocusedComponent());
frameWrapper.closeOnEsc();
}
@Nullable
public static FocusDiffSide getFocusDiffSide(@NotNull DataContext dataContext) {
return FocusDiffSide.DATA_KEY.getData(dataContext);
}
@NotNull
public static DiffString[] convertToLines(@NotNull String text) {
return DiffString.create(text).tokenize();
}
@NotNull
public static FileType[] chooseContentTypes(@NotNull DiffContent[] contents) {
FileType commonType = FileTypes.PLAIN_TEXT;
for (DiffContent content : contents) {
FileType contentType = content.getContentType();
if (DiffContentUtil.isTextType(contentType)) commonType = contentType;
}
FileType[] result = new FileType[contents.length];
for (int i = 0; i < contents.length; i++) {
FileType contentType = contents[i].getContentType();
result[i] = DiffContentUtil.isTextType(contentType) ? contentType : commonType;
}
return result;
}
public static boolean isWritable(@NotNull DiffContent content) {
Document document = content.getDocument();
return document != null && document.isWritable();
}
public static EditorEx createEditor(Document document, Project project, boolean isViewer) {
return createEditor(document, project, isViewer, null);
}
public static EditorEx createEditor(Document document, Project project, boolean isViewer, @Nullable FileType fileType) {
EditorFactory factory = EditorFactory.getInstance();
EditorEx editor = (EditorEx)(isViewer ? factory.createViewer(document, project) : factory.createEditor(document, project));
editor.putUserData(DiffManagerImpl.EDITOR_IS_DIFF_KEY, Boolean.TRUE);
editor.setSoftWrapAppliancePlace(SoftWrapAppliancePlaces.VCS_DIFF);
editor.getGutterComponentEx().revalidateMarkup();
if (fileType != null && project != null && !project.isDisposed()) {
CodeStyleFacade codeStyleFacade = CodeStyleFacade.getInstance(project);
editor.getSettings().setTabSize(codeStyleFacade.getTabSize(fileType));
editor.getSettings().setUseTabCharacter(codeStyleFacade.useTabCharacter(fileType));
}
return editor;
}
public static void drawBoldDottedFramingLines(@NotNull Graphics2D g, int startX, int endX, int startY, int bottomY, @NotNull Color color) {
UIUtil.drawBoldDottedLine(g, startX, endX, startY, null, color, false);
UIUtil.drawBoldDottedLine(g, startX, endX, bottomY, null, color, false);
}
public static void drawDoubleShadowedLine(@NotNull Graphics2D g, int startX, int endX, int y, @NotNull Color color) {
UIUtil.drawLine(g, startX, y, endX, y, null, getFramingColor(color));
UIUtil.drawLine(g, startX, y + 1, endX, y + 1, null, color);
}
@Nullable
public static Color getFramingColor(@Nullable Color backgroundColor) {
return backgroundColor != null ? backgroundColor.darker() : null;
}
@NotNull
public static TextDiffType makeTextDiffType(@NotNull LineFragment fragment) {
TextDiffType type = TextDiffType.create(fragment.getType());
if (isInlineWrapper(fragment)) {
return TextDiffType.deriveInstanceForInlineWrapperFragment(type);
}
return type;
}
public static boolean isInlineWrapper(@NotNull Fragment fragment) {
return fragment instanceof LineFragment && ((LineFragment)fragment).getChildrenIterator() != null;
}
private static boolean isUnknownFileType(@NotNull DiffContent diffContent) {
return FileTypes.UNKNOWN.equals(diffContent.getContentType());
}
private static boolean isEmptyFileType(@NotNull DiffContent diffContent) {
return diffContent.getContentType() == null;
}
public static boolean oneIsUnknown(@Nullable DiffContent content1, @Nullable DiffContent content2) {
if (content1 == null && content2 == null) return true;
if (content1 != null && content2 != null) {
return isUnknownFileType(content1) || isUnknownFileType(content2) || (isEmptyFileType(content1) && isEmptyFileType(content2));
}
if (content1 != null) {
return isUnknownFileType(content1) || isEmptyFileType(content1);
}
else {
return isUnknownFileType(content2) || isEmptyFileType(content2);
}
}
}