package com.github.setial.intellijjavadocs.configuration.impl;
import com.github.setial.intellijjavadocs.configuration.JavaDocConfiguration;
import com.github.setial.intellijjavadocs.exception.SetupTemplateException;
import com.github.setial.intellijjavadocs.model.settings.JavaDocSettings;
import com.github.setial.intellijjavadocs.model.settings.Level;
import com.github.setial.intellijjavadocs.model.settings.Mode;
import com.github.setial.intellijjavadocs.model.settings.Visibility;
import com.github.setial.intellijjavadocs.template.DocTemplateManager;
import com.github.setial.intellijjavadocs.ui.settings.ConfigPanel;
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.components.StoragePathMacros;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.ui.Messages;
import org.jdom.Element;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.JComponent;
import java.util.HashSet;
import java.util.Set;
/**
* The type Java doc configuration impl.
*
* @author Sergey Timofiychuk
*/
@State(
name = JavaDocConfiguration.COMPONENT_NAME,
storages = {
@Storage(
id = "other",
file = StoragePathMacros.APP_CONFIG + "/intellij-javadocs.xml"
)
}
)
public class JavaDocConfigurationImpl implements JavaDocConfiguration, Configurable,
PersistentStateComponent<Element> {
private static final Logger LOGGER = Logger.getInstance(JavaDocConfigurationImpl.class);
private JavaDocSettings settings;
private ConfigPanel configPanel;
private DocTemplateManager templateManager;
private boolean loadedStoredConfig = false;
/**
* Instantiates a new Java doc configuration object.
*/
public JavaDocConfigurationImpl() {
templateManager = ServiceManager.getService(DocTemplateManager.class);
}
@Override
public void initComponent() {
}
@Override
public void disposeComponent() {
}
@Nls
@Override
public String getDisplayName() {
return "JavaDoc";
}
@Nullable
@Override
public String getHelpTopic() {
return null;
}
@NotNull
@Override
public String getComponentName() {
return COMPONENT_NAME;
}
@Nullable
@Override
public JComponent createComponent() {
if (configPanel == null) {
configPanel = new ConfigPanel(getSettings());
}
reset();
return configPanel;
}
@Override
public boolean isModified() {
return configPanel.isModified();
}
@Override
public void apply() throws ConfigurationException {
configPanel.apply();
setupTemplates();
}
@Override
public void reset() {
configPanel.reset();
}
@Override
public void disposeUIResources() {
configPanel.disposeUIResources();
configPanel = null;
}
@Override
public JavaDocSettings getConfiguration() {
JavaDocSettings result;
try {
result = (JavaDocSettings) getSettings().clone();
} catch (Exception e) {
// return null if cannot clone object
result = null;
}
return result;
}
@Nullable
@Override
public Element getState() {
Element root = new Element("JAVA_DOC_SETTINGS_PLUGIN");
if (settings != null) {
settings.addToDom(root);
loadedStoredConfig = true;
}
return root;
}
@Override
public void loadState(Element javaDocSettings) {
settings = new JavaDocSettings(javaDocSettings);
setupTemplates();
loadedStoredConfig = true;
}
private JavaDocSettings getSettings() {
if (!loadedStoredConfig) {
// setup default values
settings = new JavaDocSettings();
Set<Level> levels = new HashSet<Level>();
levels.add(Level.TYPE);
levels.add(Level.METHOD);
levels.add(Level.FIELD);
Set<Visibility> visibilities = new HashSet<Visibility>();
visibilities.add(Visibility.PUBLIC);
visibilities.add(Visibility.PROTECTED);
visibilities.add(Visibility.DEFAULT);
settings.getGeneralSettings().setOverriddenMethods(false);
settings.getGeneralSettings().setSplittedClassName(true);
settings.getGeneralSettings().setMode(Mode.UPDATE);
settings.getGeneralSettings().setLevels(levels);
settings.getGeneralSettings().setVisibilities(visibilities);
settings.getTemplateSettings().setClassTemplates(templateManager.getClassTemplates());
settings.getTemplateSettings().setConstructorTemplates(templateManager.getConstructorTemplates());
settings.getTemplateSettings().setMethodTemplates(templateManager.getMethodTemplates());
settings.getTemplateSettings().setFieldTemplates(templateManager.getFieldTemplates());
}
return settings;
}
private void setupTemplates() {
try {
templateManager.setClassTemplates(settings.getTemplateSettings().getClassTemplates());
templateManager.setConstructorTemplates(settings.getTemplateSettings().getConstructorTemplates());
templateManager.setMethodTemplates(settings.getTemplateSettings().getMethodTemplates());
templateManager.setFieldTemplates(settings.getTemplateSettings().getFieldTemplates());
} catch (SetupTemplateException e) {
LOGGER.error(e);
Messages.showErrorDialog("Javadocs plugin is not available, cause: " + e.getMessage(), "Javadocs plugin");
}
}
}