blob: 115db170f617a5cd9aa4b9b3ad81f59a044dd455 [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.incrementalMerge;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.diff.impl.highlighting.FragmentSide;
import com.intellij.openapi.editor.ex.DocumentEx;
import com.intellij.openapi.util.TextRange;
import org.jetbrains.annotations.NotNull;
class SimpleChange extends Change implements DiffRangeMarker.RangeInvalidListener{
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.diff.impl.incrementalMerge.Change");
private ChangeType myType;
private final SimpleChangeSide[] mySides;
private final ChangeList myChangeList;
public SimpleChange(@NotNull ChangeType type, @NotNull TextRange range1, @NotNull TextRange range2, @NotNull ChangeList changeList) {
mySides = new SimpleChangeSide[]{ createSide(changeList, range1, FragmentSide.SIDE1),
createSide(changeList, range2, FragmentSide.SIDE2)};
myType = type;
myChangeList = changeList;
}
private SimpleChangeSide createSide(@NotNull ChangeList changeList, @NotNull TextRange range1, @NotNull FragmentSide side) {
return new SimpleChangeSide(side, new DiffRangeMarker((DocumentEx)changeList.getDocument(side), range1, this));
}
/**
* Changes the given Side of a Change to a new text range.
* @param sideToChange Side to be changed.
* @param newRange New change range.
*/
@Override
protected void changeSide(@NotNull ChangeSide sideToChange, @NotNull DiffRangeMarker newRange) {
for (int i = 0; i < mySides.length; i++) {
SimpleChangeSide side = mySides[i];
if (side.equals(sideToChange)) {
mySides[i] = new SimpleChangeSide(sideToChange, newRange);
break;
}
}
}
protected void removeFromList() {
myChangeList.remove(this);
}
@NotNull
public ChangeSide getChangeSide(@NotNull FragmentSide side) {
return mySides[side.getIndex()];
}
public ChangeType getType() {
return myType;
}
public ChangeList getChangeList() {
return myChangeList;
}
@Override
public void onApplied() {
myType = ChangeType.deriveApplied(myType);
for (SimpleChangeSide side : mySides) {
ChangeHighlighterHolder highlighterHolder = side.getHighlighterHolder();
highlighterHolder.setActions(new AnAction[0]);
highlighterHolder.updateHighlighter(side, myType);
}
myChangeList.apply(this);
}
public void onRemovedFromList() {
for (int i = 0; i < mySides.length; i++) {
SimpleChangeSide side = mySides[i];
side.getRange().removeListener(this);
side.getHighlighterHolder().removeHighlighters();
mySides[i] = null;
}
}
public boolean isValid() {
LOG.assertTrue((mySides[0] == null) == (mySides[1] == null));
return mySides[0] != null;
}
public void onRangeInvalidated() {
myChangeList.remove(this);
}
public static Change fromRanges(@NotNull TextRange baseRange, @NotNull TextRange versionRange, @NotNull ChangeList changeList) {
ChangeType type = ChangeType.fromRanges(baseRange, versionRange);
return new SimpleChange(type, baseRange, versionRange, changeList);
}
}