/*
* Copyright 2000-2014 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.psi.impl.source.codeStyle;
import com.intellij.openapi.components.RoamingType;
import com.intellij.openapi.components.StoragePathMacros;
import com.intellij.openapi.options.BaseSchemeProcessor;
import com.intellij.openapi.options.SchemeProcessor;
import com.intellij.openapi.options.SchemesManager;
import com.intellij.openapi.options.SchemesManagerFactory;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.codeStyle.CodeStyleScheme;
import com.intellij.psi.codeStyle.CodeStyleSchemes;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
public abstract class CodeStyleSchemesImpl extends CodeStyleSchemes {
@NonNls public static final String DEFAULT_SCHEME_NAME = "Default";
@SuppressWarnings("SpellCheckingInspection")
static final String CODE_STYLES_DIR_PATH = StoragePathMacros.ROOT_CONFIG + "/codestyles";
public String CURRENT_SCHEME_NAME = DEFAULT_SCHEME_NAME;
private boolean myIsInitialized = false;
private final SchemesManager<CodeStyleScheme, CodeStyleSchemeImpl> mySchemesManager;
public CodeStyleSchemesImpl(SchemesManagerFactory schemesManagerFactory) {
SchemeProcessor<CodeStyleSchemeImpl> processor = new BaseSchemeProcessor<CodeStyleSchemeImpl>() {
@NotNull
@Override
public CodeStyleSchemeImpl readScheme(@NotNull Element element) {
return CodeStyleSchemeImpl.readScheme(element);
}
@Override
public Element writeScheme(@NotNull final CodeStyleSchemeImpl scheme) throws WriteExternalException {
return scheme.saveToDocument();
}
@Override
public boolean shouldBeSaved(@NotNull final CodeStyleSchemeImpl scheme) {
return !scheme.isDefault();
}
@Override
public void initScheme(@NotNull final CodeStyleSchemeImpl scheme) {
scheme.init(CodeStyleSchemesImpl.this);
}
};
mySchemesManager = schemesManagerFactory.createSchemesManager(CODE_STYLES_DIR_PATH, processor, RoamingType.PER_USER);
init();
addScheme(new CodeStyleSchemeImpl(DEFAULT_SCHEME_NAME, true, null));
setCurrentScheme(getDefaultScheme());
}
@Override
public CodeStyleScheme[] getSchemes() {
Collection<CodeStyleScheme> schemes = mySchemesManager.getAllSchemes();
return schemes.toArray(new CodeStyleScheme[schemes.size()]);
}
@Override
public CodeStyleScheme getCurrentScheme() {
return mySchemesManager.getCurrentScheme();
}
@Override
public void setCurrentScheme(CodeStyleScheme scheme) {
String schemeName = scheme == null ? null : scheme.getName();
mySchemesManager.setCurrentSchemeName(schemeName);
CURRENT_SCHEME_NAME = schemeName;
}
@SuppressWarnings("ForLoopThatDoesntUseLoopVariable")
@Override
public CodeStyleScheme createNewScheme(String preferredName, CodeStyleScheme parentScheme) {
String name;
if (preferredName == null) {
if (parentScheme == null) throw new IllegalArgumentException("parentScheme must not be null");
// Generate using parent name
name = null;
for (int i = 1; name == null; i++) {
String currName = parentScheme.getName() + " (" + i + ")";
if (findSchemeByName(currName) == null) {
name = currName;
}
}
}
else {
name = null;
for (int i = 0; name == null; i++) {
String currName = i == 0 ? preferredName : preferredName + " (" + i + ")";
if (findSchemeByName(currName) == null) {
name = currName;
}
}
}
return new CodeStyleSchemeImpl(name, false, parentScheme);
}
@Override
public void deleteScheme(CodeStyleScheme scheme) {
if (scheme.isDefault()) {
throw new IllegalArgumentException("Unable to delete default scheme!");
}
CodeStyleSchemeImpl currScheme = (CodeStyleSchemeImpl)getCurrentScheme();
if (currScheme == scheme) {
CodeStyleScheme newCurrentScheme = getDefaultScheme();
if (newCurrentScheme == null) {
throw new IllegalStateException("Unable to load default scheme!");
}
setCurrentScheme(newCurrentScheme);
}
mySchemesManager.removeScheme(scheme);
}
@Override
public CodeStyleScheme getDefaultScheme() {
return findSchemeByName(DEFAULT_SCHEME_NAME);
}
@Nullable
@Override
public CodeStyleScheme findSchemeByName(@NotNull String name) {
return mySchemesManager.findSchemeByName(name);
}
@Override
public void addScheme(CodeStyleScheme scheme) {
mySchemesManager.addNewScheme(scheme, true);
}
protected void init() {
if (myIsInitialized) return;
myIsInitialized = true;
mySchemesManager.loadSchemes();
}
public SchemesManager<CodeStyleScheme, CodeStyleSchemeImpl> getSchemesManager() {
return mySchemesManager;
}
}