/* * Copyright 2000-2012 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.ex; import com.intellij.diff.DiffContentFactory; import com.intellij.diff.DiffManager; import com.intellij.diff.actions.DocumentFragmentContent; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.DocumentContent; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.requests.SimpleDiffRequest; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.ex.ActionUtil; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import consulo.annotations.RequiredDispatchThread; public class ShowLineStatusRangeDiffAction extends BaseLineStatusRangeAction { public ShowLineStatusRangeDiffAction(@NotNull LineStatusTracker lineStatusTracker, @NotNull Range range, @Nullable Editor editor) { super(lineStatusTracker, range); ActionUtil.copyFrom(this, "ChangesView.Diff"); } @Override public boolean isEnabled() { return true; } @RequiredDispatchThread @Override public void actionPerformed(final AnActionEvent e) { DiffManager.getInstance().showDiff(e.getProject(), createDiffData()); } private DiffRequest createDiffData() { Range range = expand(myRange, myLineStatusTracker.getDocument(), myLineStatusTracker.getVcsDocument()); DiffContent vcsContent = createDiffContent(myLineStatusTracker.getVcsDocument(), myLineStatusTracker.getVcsTextRange(range), null); DiffContent currentContent = createDiffContent(myLineStatusTracker.getDocument(), myLineStatusTracker.getCurrentTextRange(range), myLineStatusTracker.getVirtualFile()); return new SimpleDiffRequest(VcsBundle.message("dialog.title.diff.for.range"), vcsContent, currentContent, VcsBundle.message("diff.content.title.up.to.date"), VcsBundle.message("diff.content.title.current.range") ); } @NotNull private DiffContent createDiffContent(@NotNull Document document, @NotNull TextRange textRange, @Nullable VirtualFile file) { final Project project = myLineStatusTracker.getProject(); DocumentContent content = DiffContentFactory.getInstance().create(project, document, file); return new DocumentFragmentContent(project, content, textRange); } @NotNull private static Range expand(@NotNull Range range, @NotNull Document document, @NotNull Document uDocument) { boolean canExpandBefore = range.getLine1() != 0 && range.getVcsLine1() != 0; boolean canExpandAfter = range.getLine2() < document.getLineCount() && range.getVcsLine2() < uDocument.getLineCount(); int offset1 = range.getLine1() - (canExpandBefore ? 1 : 0); int uOffset1 = range.getVcsLine1() - (canExpandBefore ? 1 : 0); int offset2 = range.getLine2() + (canExpandAfter ? 1 : 0); int uOffset2 = range.getVcsLine2() + (canExpandAfter ? 1 : 0); return new Range(offset1, offset2, uOffset1, uOffset2); } }