/* * Copyright 2000-2015 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.diff.comparison; import com.intellij.diff.fragments.DiffFragment; import com.intellij.diff.fragments.LineFragment; import com.intellij.diff.fragments.MergeLineFragment; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.progress.ProgressIndicator; import org.jetbrains.annotations.NotNull; import java.util.List; /** * Class for the text comparison * CharSequences should to have '\n' as line separator * <p/> * It's good idea not to compare String due to expensive subSequence() implementation. Use CharSequenceSubSequence. */ public abstract class ComparisonManager { @NotNull public static ComparisonManager getInstance() { return ServiceManager.getService(ComparisonManager.class); } /** * Compare two texts by-line */ @NotNull public abstract List<LineFragment> compareLines(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy, @NotNull ProgressIndicator indicator) throws DiffTooBigException; /** * Compare two texts by-line and then compare changed fragments by-word */ @NotNull public abstract List<LineFragment> compareLinesInner(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy, @NotNull ProgressIndicator indicator) throws DiffTooBigException; @NotNull @Deprecated public abstract List<LineFragment> compareLinesInner(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull List<LineFragment> lineFragments, @NotNull ComparisonPolicy policy, @NotNull ProgressIndicator indicator) throws DiffTooBigException; /** * Compare three texts by-line (LEFT - BASE - RIGHT) */ @NotNull public abstract List<MergeLineFragment> compareLines(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull CharSequence text3, @NotNull ComparisonPolicy policy, @NotNull ProgressIndicator indicator) throws DiffTooBigException; /** * Compare two texts by-word */ @NotNull public abstract List<DiffFragment> compareWords(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy, @NotNull ProgressIndicator indicator) throws DiffTooBigException; /** * Compare two texts by-char */ @NotNull public abstract List<DiffFragment> compareChars(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy, @NotNull ProgressIndicator indicator) throws DiffTooBigException; /** * Check if two texts are equal using ComparisonPolicy */ public abstract boolean isEquals(@NotNull CharSequence text1, @NotNull CharSequence text2, @NotNull ComparisonPolicy policy); // // Post process line fragments // /** * compareLinesInner() comparison can produce adjustment line chunks. This method allows to squash shem. * * ex: "A\nB" vs "A X\nB Y" will result to two LineFragments: [0, 1) - [0, 1) and [1, 2) - [1, 2) * squash will produce a single fragment: [0, 2) - [0, 2) */ @NotNull public abstract List<LineFragment> squash(@NotNull List<LineFragment> oldFragments); /** * @see #squash * @param trim - if leading/trailing LineFragments with equal contents should be skipped */ @NotNull public abstract List<LineFragment> processBlocks(@NotNull List<LineFragment> oldFragments, @NotNull final CharSequence text1, @NotNull final CharSequence text2, @NotNull final ComparisonPolicy policy, final boolean squash, final boolean trim); }