package krasa.formatter.settings;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import krasa.formatter.plugin.Notifier;
import krasa.formatter.utils.ProjectUtils;
import krasa.formatter.utils.StringUtils;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.Project;
import com.intellij.util.xmlb.XmlSerializerUtil;
/**
* @author Vojtech Krasa
*/
@State(name = "EclipseCodeFormatterSettings", storages = { @Storage(id = "EclipseCodeFormatterSettings", file = "$APP_CONFIG$/eclipseCodeFormatter.xml") })
public class GlobalSettings implements ApplicationComponent, PersistentStateComponent<GlobalSettings>,
ExportableApplicationComponent {
private List<Settings> settingsList = new ArrayList<Settings>();
private List<Long> deletedSettingsId = new ArrayList<Long>();
public static GlobalSettings getInstance() {
return ApplicationManager.getApplication().getComponent(GlobalSettings.class);
}
@Override
public GlobalSettings getState() {
return this;
}
@Override
public void loadState(GlobalSettings state) {
XmlSerializerUtil.copyBean(state, this);
}
public List<Settings> getSettingsList() {
return settingsList;
}
public void setSettingsList(List<Settings> settingsList) {
this.settingsList = settingsList;
}
public Settings newSettings() {
String name = StringUtils.generateName(settingsList, 1, "new");
Settings aNew = new Settings(generateId(), name);
settingsList.add(aNew);
return aNew;
}
public Settings copySettings(Settings settings) {
Settings newSettings = new Settings();
XmlSerializerUtil.copyBean(settings, newSettings);
newSettings.setName(settings.getName() + " copy");
newSettings.setId(generateId());
newSettings.setDefaultSettings(false);
settingsList.add(newSettings);
return newSettings;
}
public Settings clone(Settings settings) {
Settings newSettings = new Settings();
XmlSerializerUtil.copyBean(settings, newSettings);
return newSettings;
}
public void updateSettings(Settings settings, Project project) {
if (settings.getId() == null) {
addToGlobalSettings(settings, project);
} else {
for (Settings settings1 : settingsList) {
if (settings1.getId().equals(settings.getId())) {
XmlSerializerUtil.copyBean(settings, settings1);
}
}
}
}
private void addToGlobalSettings(Settings newSettings, Project project) {
if (newSettings.getId() == null) {
newSettings.setId(generateId());
}
if (newSettings.getName() == null) {
String name = StringUtils.generateName(settingsList, 1, project.getName(), project.getName());
newSettings.setName(name);
}
settingsList.add(newSettings);
}
private Long generateId() {
long newId = new Date().getTime();
for (Settings settings : settingsList) {
if (settings.getId().equals(newId)) {
newId = generateId();
}
}
return newId;
}
@NotNull
public Settings getSettings(@NotNull Settings state, @NotNull Project project) {
Settings.Formatter formatter = state.getFormatter();
Settings clone = clone(getSettingsFromGlobal(state, project));
if (!state.isNotSaved()) {
clone.setFormatter(formatter);
}
return clone;
}
private Settings getSettingsFromGlobal(Settings state, Project project) {
if (state.isNotSaved()) {
// Settings duplicateSettings = getDuplicateSettings(state);
if (isSameAsDefault(state)) {
return getDefaultSettings();
}
addToGlobalSettings(state, project);
return state;
} else {
for (Settings settings : settingsList) {
if (settings.getId().equals(state.getId())) {
return settings;
}
}
for (Settings settings : settingsList) {
if (settings.getName().equals(state.getName())) {
return settings;
}
}
if (deletedSettingsId.contains(state.getId())) {
Settings defaultSettings = getDefaultSettings();
Notifier.notifyDeletedSettings(project);
return defaultSettings;
}
addToGlobalSettings(state, project);
return state;
}
}
private boolean isSameAsDefault(Settings state) {
return new Settings().equalsContent(state) || getDefaultSettings().equalsContent(state);
}
public Settings getDefaultSettings() {
for (Settings settings : settingsList) {
if (settings.isDefaultSettings()) {
return settings;
}
}
Settings aDefault = createDefaultSettings();
settingsList.add(aDefault);
return aDefault;
}
private Settings createDefaultSettings() {
String name = StringUtils.generateName(settingsList, 1, "default");
Settings aDefault = new Settings(generateId(), name);
aDefault.setDefaultSettings(true);
return aDefault;
}
@Override
public void initComponent() {
}
@Override
public void disposeComponent() {
}
@NotNull
@Override
public String getComponentName() {
return "EclipseCodeFormatterGlobalSettings";
}
@NotNull
@Override
public File[] getExportFiles() {
return new File[] { PathManager.getOptionsFile("eclipseCodeFormatter") };
}
@NotNull
@Override
public String getPresentableName() {
return "Eclipse Code Formatter";
}
public void delete(Settings settings, Project project) {
settingsList.remove(settings);
deletedSettingsId.add(settings.getId());
Settings defaultSettings = getDefaultSettings();// to create default setting when it was deleted
ProjectUtils.notifyProjectsWhichUsesThisSettings(settings, project, defaultSettings);
}
}