/*=============================================================================# # Copyright (c) 2012-2016 Stephan Wahlbrink (WalWare.de) and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # # Contributors: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.docmlet.tex.core; import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.locks.Lock; import de.walware.ecommons.preferences.AbstractPreferencesModelObject; import de.walware.ecommons.preferences.core.IPreferenceAccess; import de.walware.ecommons.preferences.core.Preference; import de.walware.ecommons.preferences.core.Preference.BooleanPref; import de.walware.ecommons.preferences.core.Preference.EnumPref; import de.walware.ecommons.preferences.core.Preference.IntPref; import de.walware.ecommons.preferences.core.Preference.StringSetPref; import de.walware.ecommons.text.IIndentSettings; /** * Settings for style of R code. */ public class TexCodeStyleSettings extends AbstractPreferencesModelObject implements IIndentSettings { public static final String QUALIFIER = TexCore.PLUGIN_ID + "/codestyle/tex"; //$NON-NLS-1$ public static final String INDENT_GROUP_ID = "tex/tex.codestyle/indent"; //$NON-NLS-1$ public static final String[] ALL_GROUP_IDS = new String[] { INDENT_GROUP_ID }; public static final IntPref TAB_SIZE_PREF = new IntPref( QUALIFIER, "Tab.size"); //$NON-NLS-1$ public static final EnumPref<IndentationType> INDENT_DEFAULT_TYPE_PREF = new EnumPref<>( QUALIFIER, "Indent.type", IndentationType.class); //$NON-NLS-1$ public static final IntPref INDENT_SPACES_COUNT_PREF = new IntPref( QUALIFIER, "Indent.Level.spaces_count"); //$NON-NLS-1$ public static final BooleanPref REPLACE_CONVERSATIVE_PREF = new BooleanPref( QUALIFIER, "Indent.ReplaceConservativ.enabled"); //$NON-NLS-1$ public static final BooleanPref REPLACE_TABS_WITH_SPACES_PREF = new BooleanPref( QUALIFIER, "Indent.ReplaceOtherTabs.enabled"); //$NON-NLS-1$ public static final Preference<Integer> WRAP_LINE_WIDTH_PREF = new IntPref( QUALIFIER, "Wrap.LineWidth.max"); //$NON-NLS-1$ public static final IntPref INDENT_BLOCK_DEPTH_PREF = new IntPref( QUALIFIER, "IndentBlockDepth.level"); //$NON-NLS-1$ public static final String INDENT_BLOCK_DEPTH_PROP = "indentBlockDepth"; //$NON-NLS-1$ public static final IntPref INDENT_ENV_DEPTH_PREF = new IntPref( QUALIFIER, "IndentEnvDepth.level"); //$NON-NLS-1$ public static final String INDENT_ENV_DEPTH_PROP = "indentEnvDepth"; //$NON-NLS-1$ public static final Preference<Set<String>> INDENT_ENV_LABELS_PREF = new StringSetPref( QUALIFIER, "IndentEnvFor.labels"); //$NON-NLS-1$ public static final String INDENT_ENV_LABELS_PROP = "indentEnvLabels"; //$NON-NLS-1$ private int fTabSize; private IndentationType fIndentDefaultType; private int fIndentSpacesCount; private boolean fReplaceOtherTabsWithSpaces; private boolean fReplaceConservative; private int fLineWidth; private int fIndentBlockDepth; private int fIndentEnvDepth; private Set<String> fIndentEnvLabels; /** * Creates an instance with default settings. */ public TexCodeStyleSettings(final int mode) { if (mode >= 1) { installLock(); } loadDefaults(); resetDirty(); } @Override public String[] getNodeQualifiers() { return new String[] { QUALIFIER }; } @Override public void loadDefaults() { setTabSize(4); setIndentDefaultType(IndentationType.SPACES); setIndentSpacesCount(2); setReplaceConservative(false); setReplaceOtherTabsWithSpaces(false); setLineWidth(80); setIndentBlockDepth(1); setIndentEnvDepth(1); setIndentEnvLabels(new HashSet<>(Arrays.asList(new String[] { "itemize", "enumerate", "description", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ }))); } @Override public void load(final IPreferenceAccess prefs) { setTabSize(prefs.getPreferenceValue(TAB_SIZE_PREF)); setIndentDefaultType(prefs.getPreferenceValue(INDENT_DEFAULT_TYPE_PREF)); setIndentSpacesCount(prefs.getPreferenceValue(INDENT_SPACES_COUNT_PREF)); setReplaceConservative(prefs.getPreferenceValue(REPLACE_CONVERSATIVE_PREF)); setReplaceOtherTabsWithSpaces(prefs.getPreferenceValue(REPLACE_TABS_WITH_SPACES_PREF)); setLineWidth(prefs.getPreferenceValue(WRAP_LINE_WIDTH_PREF)); setIndentBlockDepth(prefs.getPreferenceValue(INDENT_BLOCK_DEPTH_PREF)); setIndentEnvDepth(prefs.getPreferenceValue(INDENT_ENV_DEPTH_PREF)); setIndentEnvLabels(prefs.getPreferenceValue(INDENT_ENV_LABELS_PREF)); } public void load(final TexCodeStyleSettings source) { final Lock writeLock = getWriteLock(); final Lock sourceLock = source.getReadLock(); try { sourceLock.lock(); writeLock.lock(); setTabSize(source.fTabSize); setIndentDefaultType(source.fIndentDefaultType); setIndentSpacesCount(source.fIndentSpacesCount); setReplaceConservative(source.fReplaceConservative); setReplaceOtherTabsWithSpaces(source.fReplaceOtherTabsWithSpaces); setIndentBlockDepth(source.fIndentBlockDepth); setIndentEnvDepth(source.fIndentEnvDepth); setIndentEnvLabels(source.fIndentEnvLabels); } finally { sourceLock.unlock(); writeLock.unlock(); } } @Override public Map<Preference<?>, Object> deliverToPreferencesMap(final Map<Preference<?>, Object> map) { map.put(TAB_SIZE_PREF, getTabSize()); map.put(INDENT_DEFAULT_TYPE_PREF, getIndentDefaultType()); map.put(INDENT_SPACES_COUNT_PREF, getIndentSpacesCount()); map.put(REPLACE_CONVERSATIVE_PREF, getReplaceConservative()); map.put(REPLACE_TABS_WITH_SPACES_PREF, getReplaceOtherTabsWithSpaces()); map.put(WRAP_LINE_WIDTH_PREF, getLineWidth()); map.put(INDENT_BLOCK_DEPTH_PREF, getIndentBlockDepth()); map.put(INDENT_ENV_DEPTH_PREF, getIndentEnvDepth()); map.put(INDENT_ENV_LABELS_PREF, getIndentEnvLabels()); return map; } /*[ Properties ]===============================================================*/ public void setTabSize(final int size) { final int oldValue = fTabSize; fTabSize = size; firePropertyChange(TAB_SIZE_PROP, oldValue, size); } @Override public int getTabSize() { return fTabSize; } public void setIndentDefaultType(final IndentationType type) { final IndentationType oldValue = fIndentDefaultType; fIndentDefaultType = type; firePropertyChange(INDENT_DEFAULT_TYPE_PROP, oldValue, type); } @Override public IndentationType getIndentDefaultType() { return fIndentDefaultType; } public void setIndentSpacesCount(final int count) { final int oldValue = fIndentSpacesCount; fIndentSpacesCount = count; firePropertyChange(INDENT_SPACES_COUNT_PROP, oldValue, count); } @Override public int getIndentSpacesCount() { return fIndentSpacesCount; } public void setReplaceConservative(final boolean enable) { final boolean oldValue = fReplaceConservative; fReplaceConservative = enable; firePropertyChange(REPLACE_CONSERVATIVE_PROP, oldValue, enable); } @Override public boolean getReplaceConservative() { return fReplaceConservative; } public void setReplaceOtherTabsWithSpaces(final boolean enable) { final boolean oldValue = fReplaceOtherTabsWithSpaces; fReplaceOtherTabsWithSpaces = enable; firePropertyChange(REPLACE_TABS_WITH_SPACES_PROP, oldValue, getReplaceOtherTabsWithSpaces()); } @Override public boolean getReplaceOtherTabsWithSpaces() { return fReplaceOtherTabsWithSpaces; } public void setLineWidth(final int max) { final boolean oldValue = fReplaceOtherTabsWithSpaces; fLineWidth = max; firePropertyChange(WRAP_LINE_WIDTH_PROP, oldValue, max); } @Override public int getLineWidth() { return fLineWidth; } public final void setIndentBlockDepth(final int depth) { final int oldValue = fIndentBlockDepth; fIndentBlockDepth = depth; firePropertyChange(INDENT_BLOCK_DEPTH_PROP, oldValue, depth); } public final int getIndentBlockDepth() { return fIndentBlockDepth; } public final void setIndentEnvDepth(final int depth) { final int oldValue = fIndentEnvDepth; fIndentEnvDepth = depth; firePropertyChange(INDENT_ENV_DEPTH_PROP, oldValue, depth); } public final int getIndentEnvDepth() { return fIndentEnvDepth; } public void setIndentEnvLabels(final Set<String> labels) { fIndentEnvLabels = labels; } public Set<String> getIndentEnvLabels() { return fIndentEnvLabels; } }