| /* |
| * 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.processing; |
| |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.diff.ex.DiffFragment; |
| import com.intellij.openapi.diff.impl.highlighting.FragmentSide; |
| import com.intellij.openapi.diff.impl.string.DiffString; |
| import com.intellij.openapi.util.text.StringUtil; |
| |
| class PreferWholeLines implements DiffCorrection { |
| private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.processing.PreferWholeLines"); |
| public static final DiffCorrection INSTANCE = new PreferWholeLines(); |
| |
| public DiffFragment[] correct(DiffFragment[] fragments) { |
| for (int i = 1; i < fragments.length - 1; i++) { |
| DiffFragment fragment = fragments[i]; |
| if (!fragment.isOneSide()) continue; |
| DiffFragment nextFragment = fragments[i + 1]; |
| FragmentSide side = FragmentSide.chooseSide(fragment); |
| |
| DiffString fragmentText = side.getText(fragment); |
| DiffString otherNextFragmentText = side.getOtherText(nextFragment); |
| DiffString nextFragmentText = side.getText(nextFragment); |
| |
| if (nextFragment.isOneSide()) { |
| LOG.error("<" + fragmentText + "> <" + otherNextFragmentText + ">"); |
| } |
| if (StringUtil.startsWithChar(fragmentText, '\n') && |
| StringUtil.startsWithChar(nextFragmentText, '\n') && |
| StringUtil.startsWithChar(otherNextFragmentText, '\n')) { |
| |
| DiffFragment previous = fragments[i - 1]; |
| DiffString previousText = side.getText(previous); |
| DiffString otherPreciousText = side.getOtherText(previous); |
| |
| assert previous != null; |
| assert previousText != null; |
| assert otherPreciousText != null; |
| assert fragmentText != null; |
| assert nextFragmentText != null; |
| assert otherNextFragmentText != null; |
| |
| previous = side.createFragment(previousText.append('\n'), otherPreciousText.append('\n'), previous.isModified()); |
| fragments[i - 1] = previous; |
| fragment = side.createFragment(fragmentText.substring(1).append('\n'), side.getOtherText(fragment), fragment.isModified()); |
| fragments[i] = fragment; |
| nextFragment = side.createFragment(nextFragmentText.substring(1), otherNextFragmentText.substring(1), nextFragment.isModified()); |
| fragments[i + 1] = nextFragment; |
| } |
| } |
| return fragments; |
| } |
| } |