/*
* Copyright 2000-2016 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.tools.util.base;
import com.intellij.diff.util.DiffPlaces;
import com.intellij.diff.util.DiffUtil;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.util.Key;
import com.intellij.util.xmlb.annotations.MapAnnotation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
import java.util.TreeMap;
@State(
name = "TextDiffSettings",
storages = @Storage(file = DiffUtil.DIFF_CONFIG)
)
public class TextDiffSettingsHolder implements PersistentStateComponent<TextDiffSettingsHolder.State> {
public static final Key<TextDiffSettings> KEY = Key.create("TextDiffSettings");
public static final int[] CONTEXT_RANGE_MODES = {1, 2, 4, 8, -1};
public static final String[] CONTEXT_RANGE_MODE_LABELS = {"1", "2", "4", "8", "Disable"};
private final static class SharedSettings {
// Fragments settings
public int CONTEXT_RANGE = 4;
public boolean MERGE_AUTO_APPLY_NON_CONFLICTED_CHANGES = false;
}
private static class PlaceSettings {
// Diff settings
public HighlightPolicy HIGHLIGHT_POLICY = HighlightPolicy.BY_WORD;
public IgnorePolicy IGNORE_POLICY = IgnorePolicy.DEFAULT;
// Presentation settings
public boolean ENABLE_SYNC_SCROLL = true;
// Editor settings
public boolean SHOW_WHITESPACES = false;
public boolean SHOW_LINE_NUMBERS = true;
public boolean SHOW_INDENT_LINES = false;
public boolean USE_SOFT_WRAPS = false;
public HighlightingLevel HIGHLIGHTING_LEVEL = HighlightingLevel.INSPECTIONS;
public boolean READ_ONLY_LOCK = true;
// Fragments settings
public boolean EXPAND_BY_DEFAULT = true;
}
public static class TextDiffSettings {
@NotNull public SharedSettings SHARED_SETTINGS = new SharedSettings();
@NotNull public PlaceSettings PLACE_SETTINGS = new PlaceSettings();
public TextDiffSettings() {
}
public TextDiffSettings(@NotNull SharedSettings SHARED_SETTINGS,
@NotNull PlaceSettings PLACE_SETTINGS) {
this.SHARED_SETTINGS = SHARED_SETTINGS;
this.PLACE_SETTINGS = PLACE_SETTINGS;
}
// Presentation settings
public boolean isEnableSyncScroll() {
return PLACE_SETTINGS.ENABLE_SYNC_SCROLL;
}
public void setEnableSyncScroll(boolean value) {
PLACE_SETTINGS.ENABLE_SYNC_SCROLL = value;
}
// Diff settings
@NotNull
public HighlightPolicy getHighlightPolicy() {
return PLACE_SETTINGS.HIGHLIGHT_POLICY;
}
public void setHighlightPolicy(@NotNull HighlightPolicy value) {
PLACE_SETTINGS.HIGHLIGHT_POLICY = value;
}
@NotNull
public IgnorePolicy getIgnorePolicy() {
return PLACE_SETTINGS.IGNORE_POLICY;
}
public void setIgnorePolicy(@NotNull IgnorePolicy policy) {
PLACE_SETTINGS.IGNORE_POLICY = policy;
}
//
// Merge
//
public boolean isAutoApplyNonConflictedChanges() {
return SHARED_SETTINGS.MERGE_AUTO_APPLY_NON_CONFLICTED_CHANGES;
}
public void setAutoApplyNonConflictedChanges(boolean value) {
SHARED_SETTINGS.MERGE_AUTO_APPLY_NON_CONFLICTED_CHANGES = value;
}
// Editor settings
public boolean isShowLineNumbers() {
return PLACE_SETTINGS.SHOW_LINE_NUMBERS;
}
public void setShowLineNumbers(boolean state) {
PLACE_SETTINGS.SHOW_LINE_NUMBERS = state;
}
public boolean isShowWhitespaces() {
return PLACE_SETTINGS.SHOW_WHITESPACES;
}
public void setShowWhiteSpaces(boolean state) {
PLACE_SETTINGS.SHOW_WHITESPACES = state;
}
public boolean isShowIndentLines() {
return PLACE_SETTINGS.SHOW_INDENT_LINES;
}
public void setShowIndentLines(boolean state) {
PLACE_SETTINGS.SHOW_INDENT_LINES = state;
}
public boolean isUseSoftWraps() {
return PLACE_SETTINGS.USE_SOFT_WRAPS;
}
public void setUseSoftWraps(boolean state) {
PLACE_SETTINGS.USE_SOFT_WRAPS = state;
}
@NotNull
public HighlightingLevel getHighlightingLevel() {
return PLACE_SETTINGS.HIGHLIGHTING_LEVEL;
}
public void setHighlightingLevel(@NotNull HighlightingLevel state) {
PLACE_SETTINGS.HIGHLIGHTING_LEVEL = state;
}
public int getContextRange() {
return SHARED_SETTINGS.CONTEXT_RANGE;
}
public void setContextRange(int value) {
SHARED_SETTINGS.CONTEXT_RANGE = value;
}
public boolean isExpandByDefault() {
return PLACE_SETTINGS.EXPAND_BY_DEFAULT;
}
public void setExpandByDefault(boolean value) {
PLACE_SETTINGS.EXPAND_BY_DEFAULT = value;
}
public boolean isReadOnlyLock() {
return PLACE_SETTINGS.READ_ONLY_LOCK;
}
public void setReadOnlyLock(boolean state) {
PLACE_SETTINGS.READ_ONLY_LOCK = state;
}
//
// Impl
//
@NotNull
public static TextDiffSettings getSettings() {
return getSettings(null);
}
@NotNull
public static TextDiffSettings getSettings(@Nullable String place) {
return getInstance().getSettings(place);
}
}
@NotNull
public TextDiffSettings getSettings(@Nullable String place) {
if (place == null) place = DiffPlaces.DEFAULT;
PlaceSettings placeSettings = myState.PLACES_MAP.get(place);
if (placeSettings == null) {
placeSettings = new PlaceSettings();
myState.PLACES_MAP.put(place, placeSettings);
}
return new TextDiffSettings(myState.SHARED_SETTINGS, placeSettings);
}
public static class State {
@MapAnnotation(surroundWithTag = false, surroundKeyWithTag = false, surroundValueWithTag = false)
public Map<String, PlaceSettings> PLACES_MAP = getDefaultPlaceSettings();
public SharedSettings SHARED_SETTINGS = new SharedSettings();
}
private State myState = new State();
@NotNull
@Override
public State getState() {
return myState;
}
@Override
public void loadState(State state) {
myState = state;
}
public static TextDiffSettingsHolder getInstance() {
return ServiceManager.getService(TextDiffSettingsHolder.class);
}
@NotNull
public static Map<String, PlaceSettings> getDefaultPlaceSettings() {
Map<String, PlaceSettings> map = new TreeMap<>();
PlaceSettings changes = new PlaceSettings();
changes.EXPAND_BY_DEFAULT = false;
PlaceSettings commit = new PlaceSettings();
commit.EXPAND_BY_DEFAULT = false;
map.put(DiffPlaces.DEFAULT, new PlaceSettings());
map.put(DiffPlaces.CHANGES_VIEW, changes);
map.put(DiffPlaces.COMMIT_DIALOG, commit);
return map;
}
}