blob: 5d4aa1c801d2c13edcec705dac69abda70d12e69 [file] [log] [blame]
/*
* Copyright 2000-2011 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.codeInsight.CodeInsightBundle;
import com.intellij.psi.codeStyle.CodeStyleSettings;
import org.jetbrains.annotations.NotNull;
import java.util.EnumSet;
import java.util.Set;
/**
* Enumerates formatting processing states.
*
* @author Denis Zhdanov
* @since 2/10/11 2:50 PM
*/
public enum FormattingStateId {
/**
* Corresponds to {@link InitialInfoBuilder#buildFrom(Block, int, CompositeBlockWrapper, WrapImpl, Block, boolean)}.
* <p/>
* I.e. the first thing formatter does retrieval of all {@link Block code blocks} from target {@link FormattingModel model}
* and wrapping them in order to be able to store information about modified white spaces. That processing may trigger
* blocks construction because most of our formatting models do that lazily, i.e. they define the
* {@link FormattingModel#getRootBlock() root block} and build its sub-blocks only on the {@link Block#getSubBlocks() first request}.
*/
WRAPPING_BLOCKS(2),
/**
* This element corresponds to the state when formatter sequentially processes {@link AbstractBlockWrapper wrapped code blocks}
* and modifies their {@link WhiteSpace white spaces} according to the current {@link CodeStyleSettings code style settings}.
*/
PROCESSING_BLOCKS(1),
/**
* This element corresponds to formatting phase when all {@link AbstractBlockWrapper wrapped code blocks} are processed and it's
* time to apply the changes to the underlying document.
*/
APPLYING_CHANGES(10);
private final String myDescription;
private final double myWeight;
FormattingStateId(double weight) {
myWeight = weight;
myDescription = CodeInsightBundle.message("progress.reformat.stage." + toString().replace('_', '.').toLowerCase());
}
/**
* @return human-readable textual description of the current state id
*/
public String getDescription() {
return myDescription;
}
/**
* @return <code>'weight'</code> of the current state. Basically, it's assumed that every processing iteration of the state
* with greater weight is executed longer that processing iteration of the state with the lower weight
*/
public double getProgressWeight() {
return myWeight;
}
/**
* @return collection of formatting states that are assumed to be executed prior to the current one
*/
@NotNull
public Set<FormattingStateId> getPreviousStates() {
Set<FormattingStateId> result = EnumSet.noneOf(FormattingStateId.class);
for (FormattingStateId state : values()) {
if (state == this) {
break;
}
result.add(state);
}
return result;
}
}