blob: 87914f151df330daa5ca4f2231f89ee9a6ddd87b [file] [log] [blame]
/*
* 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.ExportableComponent;
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.InvalidDataException;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.psi.PsiBundle;
import com.intellij.psi.codeStyle.CodeStyleScheme;
import com.intellij.psi.codeStyle.CodeStyleSchemes;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.Parent;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.Collection;
/**
* @author MYakovlev
* Date: Jul 16, 2002
*/
public abstract class CodeStyleSchemesImpl extends CodeStyleSchemes implements ExportableComponent {
@NonNls public static final String DEFAULT_SCHEME_NAME = "Default";
public String CURRENT_SCHEME_NAME = DEFAULT_SCHEME_NAME;
private boolean myIsInitialized = false;
@NonNls static final String CODE_STYLES_DIRECTORY = "codestyles";
private final SchemesManager<CodeStyleScheme, CodeStyleSchemeImpl> mySchemesManager;
@NonNls private static final String FILE_SPEC = StoragePathMacros.ROOT_CONFIG + "/" + CODE_STYLES_DIRECTORY;
public CodeStyleSchemesImpl(SchemesManagerFactory schemesManagerFactory) {
SchemeProcessor<CodeStyleSchemeImpl> processor = new BaseSchemeProcessor<CodeStyleSchemeImpl>() {
@Override
public CodeStyleSchemeImpl readScheme(@NotNull final Document schemeContent) throws IOException, JDOMException, InvalidDataException {
return CodeStyleSchemeImpl.readScheme(schemeContent);
}
@Override
public Parent 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(FILE_SPEC, processor, RoamingType.PER_USER);
init();
addScheme(new CodeStyleSchemeImpl(DEFAULT_SCHEME_NAME, true, null));
setCurrentScheme(getDefaultScheme());
}
@Override
public CodeStyleScheme[] getSchemes() {
final 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);
}
@Override
public CodeStyleScheme findSchemeByName(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();
}
@Override
@NotNull
public String getPresentableName() {
return PsiBundle.message("codestyle.export.display.name");
}
public SchemesManager<CodeStyleScheme, CodeStyleSchemeImpl> getSchemesManager() {
return mySchemesManager;
}
}