| /* |
| * 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.formatting; |
| |
| import com.intellij.openapi.editor.Document; |
| import com.intellij.psi.codeStyle.CommonCodeStyleSettings; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * Stands for block alignment strategy (e.g. we may want to use different strategies for the different |
| * {@link Alignment.Anchor alignment acnhors}). |
| * |
| * @author Denis Zhdanov |
| * @since 4/28/11 3:55 PM |
| */ |
| public interface BlockAlignmentProcessor { |
| |
| enum Result { |
| |
| /** |
| * This value should be used to indicate that alignment of the target block can't be performed because it doesn't have |
| * a counterparty (e.g. we want to align two blocks and this value is returned after processing the first of them). |
| */ |
| TARGET_BLOCK_PROCESSED_NOT_ALIGNED, |
| |
| /** Alignment is performed for the target block. */ |
| TARGET_BLOCK_ALIGNED, |
| |
| /** Already processed block was realigned because of {@link AlignmentImpl#isAllowBackwardShift() backward alignment}. */ |
| BACKWARD_BLOCK_ALIGNED, |
| |
| /** Detected that backward alignment dependency graph is cycled. */ |
| RECURSION_DETECTED, |
| |
| /** |
| * It was necessary to align already processed block because of {@link AlignmentImpl#isAllowBackwardShift() backward alignment} |
| * but that can't be done (e.g. that backward block {@link AbstractBlockWrapper#getWhiteSpace() white space} is read-only). |
| */ |
| UNABLE_TO_ALIGN_BACKWARD_BLOCK |
| } |
| |
| /** |
| * Asks current processor to perform alignment processing for the parameters encapsulated at the given context. |
| * |
| * @param context target parameters holder |
| * @return processing result |
| */ |
| Result applyAlignment(@NotNull Context context); |
| |
| class Context { |
| |
| @NotNull public final Document document; |
| @NotNull public final AlignmentImpl alignment; |
| @NotNull public final LeafBlockWrapper targetBlock; |
| @NotNull public final Map<AbstractBlockWrapper, Set<AbstractBlockWrapper>> alignmentMappings; |
| @NotNull public final Map<LeafBlockWrapper, Set<LeafBlockWrapper>> backwardShiftedAlignedBlocks; |
| @NotNull public final CommonCodeStyleSettings.IndentOptions indentOptions; |
| |
| public Context(@NotNull Document document, |
| @NotNull AlignmentImpl alignment, |
| @NotNull LeafBlockWrapper targetBlock, |
| @NotNull Map<AbstractBlockWrapper, Set<AbstractBlockWrapper>> alignmentMappings, |
| @NotNull Map<LeafBlockWrapper, Set<LeafBlockWrapper>> backwardShiftedAlignedBlocks, |
| @NotNull CommonCodeStyleSettings.IndentOptions indentOptions) |
| { |
| this.document = document; |
| this.alignment = alignment; |
| this.targetBlock = targetBlock; |
| this.alignmentMappings = alignmentMappings; |
| this.backwardShiftedAlignedBlocks = backwardShiftedAlignedBlocks; |
| this.indentOptions = indentOptions; |
| } |
| } |
| } |