package com.baselet.control.config.handler;
import java.awt.Frame;
import java.awt.Point;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import com.baselet.control.basics.geom.Dimension;
import com.baselet.control.config.Config;
import com.baselet.control.config.ConfigClassGen;
import com.baselet.control.config.ConfigMail;
import com.baselet.control.config.SharedConfig;
import com.baselet.control.enums.Program;
import com.baselet.control.enums.generator.FieldOptions;
import com.baselet.control.enums.generator.MethodOptions;
import com.baselet.control.enums.generator.SignatureOptions;
import com.baselet.control.enums.generator.SortOptions;
import com.baselet.control.util.Path;
import com.baselet.control.util.RecentlyUsedFilesList;
import com.baselet.gui.BaseGUI;
public class ConfigHandler {
private static final String PROGRAM_VERSION = "program_version";
private static final String PROPERTIES_PANEL_FONTSIZE = "properties_panel_fontsize";
private static final String DEFAULT_FONTSIZE = "default_fontsize";
private static final String DEFAULT_FONTFAMILY = "default_fontfamily";
private static final String SHOW_STICKINGPOLYGON = "show_stickingpolygon";
private static final String SHOW_GRID = "show_grid";
private static final String ENABLE_CUSTOM_ELEMENTS = "enable_custom_elements";
private static final String UI_MANAGER = "ui_manager";
private static final String PRINT_PADDING = "print_padding";
private static final String PDF_EXPORT_FONT = "pdf_export_font";
private static final String PDF_EXPORT_FONT_BOLD = "pdf_export_font_bold";
private static final String PDF_EXPORT_FONT_ITALIC = "pdf_export_font_italic";
private static final String PDF_EXPORT_FONT_BOLDITALIC = "pdf_export_font_bolditalic";
private static final String CHECK_FOR_UPDATES = "check_for_updates";
private static final String OPEN_FILE_HOME = "open_file_home";
private static final String SAVE_FILE_HOME = "save_file_home";
private static final String DEV_MODE = "dev_mode";
private static final String LAST_USED_PALETTE = "last_used_palette";
private static final String MAIN_SPLIT_POSITION = "main_split_position";
private static final String RIGHT_SPLIT_POSITION = "right_split_position";
private static final String START_MAXIMIZED = "start_maximized";
private static final String MAIL_SPLIT_POSITION = "mail_split_position";
private static final String PROGRAM_SIZE = "program_size";
private static final String PROGRAM_LOCATION = "program_location";
private static final String RECENT_FILES = "recent_files";
private static final String MAIL_SMTP = "mail_smtp";
private static final String MAIL_SMTP_AUTH = "mail_smtp_auth";
private static final String MAIL_SMTP_USER = "mail_smtp_user";
private static final String MAIL_SMTP_PW_STORE = "mail_smtp_pw_store";
private static final String MAIL_SMTP_PW = "mail_smtp_pw";
private static final String MAIL_FROM = "mail_from";
private static final String MAIL_TO = "mail_to";
private static final String MAIL_CC = "mail_cc";
private static final String MAIL_BCC = "mail_bcc";
private static final String MAIL_XML = "mail_xml";
private static final String MAIL_GIF = "mail_gif";
private static final String MAIL_PDF = "mail_pdf";
private static final String GENERATE_CLASS_PACKAGE = "generate_class_package";
private static final String GENERATE_CLASS_FIELDS = "generate_class_fields";
private static final String GENERATE_CLASS_METHODS = "generate_class_methods";
private static final String GENERATE_CLASS_SIGNATURES = "generate_class_signatures";
private static final String GENERATE_CLASS_SORTINGS = "generate_class_sortings";
public static void loadConfig() {
Properties props = loadProperties();
if (props.isEmpty()) {
return;
}
Config cfg = Config.getInstance();
cfg.setProgramVersion(getStringProperty(props, PROGRAM_VERSION, Program.getInstance().getVersion()));
cfg.setDefaultFontsize(getIntProperty(props, DEFAULT_FONTSIZE, cfg.getDefaultFontsize()));
cfg.setPropertiesPanelFontsize(getIntProperty(props, PROPERTIES_PANEL_FONTSIZE, cfg.getPropertiesPanelFontsize()));
cfg.setDefaultFontFamily(getStringProperty(props, DEFAULT_FONTFAMILY, cfg.getDefaultFontFamily()));
SharedConfig.getInstance().setShow_stickingpolygon(getBoolProperty(props, SHOW_STICKINGPOLYGON, SharedConfig.getInstance().isShow_stickingpolygon()));
cfg.setShow_grid(getBoolProperty(props, SHOW_GRID, cfg.isShow_grid()));
cfg.setEnable_custom_elements(getBoolProperty(props, ENABLE_CUSTOM_ELEMENTS, cfg.isEnable_custom_elements()));
cfg.setUiManager(getStringProperty(props, UI_MANAGER, cfg.getUiManager()));
cfg.setPrintPadding(getIntProperty(props, PRINT_PADDING, cfg.getPrintPadding()));
cfg.setPdfExportFont(getStringProperty(props, PDF_EXPORT_FONT, cfg.getPdfExportFont()));
cfg.setPdfExportFontBold(getStringProperty(props, PDF_EXPORT_FONT_BOLD, cfg.getPdfExportFontBold()));
cfg.setPdfExportFontItalic(getStringProperty(props, PDF_EXPORT_FONT_ITALIC, cfg.getPdfExportFontItalic()));
cfg.setPdfExportFontBoldItalic(getStringProperty(props, PDF_EXPORT_FONT_BOLDITALIC, cfg.getPdfExportFontBoldItalic()));
cfg.setCheckForUpdates(getBoolProperty(props, CHECK_FOR_UPDATES, cfg.isCheckForUpdates()));
cfg.setOpenFileHome(getStringProperty(props, OPEN_FILE_HOME, cfg.getOpenFileHome()));
cfg.setSaveFileHome(getStringProperty(props, SAVE_FILE_HOME, cfg.getSaveFileHome()));
SharedConfig.getInstance().setDev_mode(getBoolProperty(props, DEV_MODE, SharedConfig.getInstance().isDev_mode()));
cfg.setLastUsedPalette(getStringProperty(props, LAST_USED_PALETTE, cfg.getLastUsedPalette()));
cfg.setMain_split_position(getIntProperty(props, MAIN_SPLIT_POSITION, cfg.getMain_split_position()));
cfg.setRight_split_position(getIntProperty(props, RIGHT_SPLIT_POSITION, cfg.getRight_split_position()));
cfg.setMail_split_position(getIntProperty(props, MAIL_SPLIT_POSITION, cfg.getMail_split_position()));
cfg.setStart_maximized(getBoolProperty(props, START_MAXIMIZED, cfg.isStart_maximized()));
// In case of start_maximized=true we don't store any size or location information
if (!cfg.isStart_maximized()) {
cfg.setProgram_size(getDimensionProperty(props, PROGRAM_SIZE, cfg.getProgram_size()));
cfg.setProgram_location(getPointProperty(props, PROGRAM_LOCATION, cfg.getProgram_location()));
}
String recentFiles = props.getProperty(RECENT_FILES);
if (recentFiles != null) {
RecentlyUsedFilesList.getInstance().addAll(Arrays.asList(props.getProperty(RECENT_FILES).split("\\|")));
}
/* Mail */
ConfigMail cfgMail = ConfigMail.getInstance();
cfgMail.setMail_smtp(getStringProperty(props, MAIL_SMTP, cfgMail.getMail_smtp()));
cfgMail.setMail_smtp_auth(getBoolProperty(props, MAIL_SMTP_AUTH, cfgMail.isMail_smtp_auth()));
cfgMail.setMail_smtp_user(getStringProperty(props, MAIL_SMTP_USER, cfgMail.getMail_smtp_user()));
cfgMail.setMail_smtp_pw_store(getBoolProperty(props, MAIL_SMTP_PW_STORE, cfgMail.isMail_smtp_pw_store()));
cfgMail.setMail_smtp_pw(getStringProperty(props, MAIL_SMTP_PW, cfgMail.getMail_smtp_pw()));
cfgMail.setMail_from(getStringProperty(props, MAIL_FROM, cfgMail.getMail_from()));
cfgMail.setMail_to(getStringProperty(props, MAIL_TO, cfgMail.getMail_to()));
cfgMail.setMail_cc(getStringProperty(props, MAIL_CC, cfgMail.getMail_cc()));
cfgMail.setMail_bcc(getStringProperty(props, MAIL_BCC, cfgMail.getMail_bcc()));
cfgMail.setMail_xml(getBoolProperty(props, MAIL_XML, cfgMail.isMail_xml()));
cfgMail.setMail_gif(getBoolProperty(props, MAIL_GIF, cfgMail.isMail_gif()));
cfgMail.setMail_pdf(getBoolProperty(props, MAIL_PDF, cfgMail.isMail_pdf()));
/* Generate Class Element Options */
ConfigClassGen genCfg = ConfigClassGen.getInstance();
genCfg.setGenerateClassPackage(getBoolProperty(props, GENERATE_CLASS_PACKAGE, genCfg.isGenerateClassPackage()));
genCfg.setGenerateClassFields(FieldOptions.getEnum(getStringProperty(props, GENERATE_CLASS_FIELDS, genCfg.getGenerateClassFields().toString())));
genCfg.setGenerateClassMethods(MethodOptions.getEnum(getStringProperty(props, GENERATE_CLASS_METHODS, genCfg.getGenerateClassMethods().toString())));
genCfg.setGenerateClassSignatures(SignatureOptions.getEnum(getStringProperty(props, GENERATE_CLASS_SIGNATURES, genCfg.getGenerateClassSignatures().toString())));
genCfg.setGenerateClassSortings(SortOptions.getEnum(getStringProperty(props, GENERATE_CLASS_SORTINGS, genCfg.getGenerateClassSortings().toString())));
}
public static void saveConfig(BaseGUI gui) {
try {
Path.safeDeleteFile(new File(Path.legacyConfig()), false); // delete legacy cfg file if it exists and replace it with osConform one
File configfile = new File(Path.osConformConfig());
Path.safeDeleteFile(configfile, false);
Path.safeCreateFile(configfile, false);
Config cfg = Config.getInstance();
Properties props = new Properties();
props.setProperty(PROGRAM_VERSION, Program.getInstance().getVersion());
props.setProperty(DEFAULT_FONTSIZE, Integer.toString(cfg.getDefaultFontsize()));
props.setProperty(PROPERTIES_PANEL_FONTSIZE, Integer.toString(cfg.getPropertiesPanelFontsize()));
props.setProperty(DEFAULT_FONTFAMILY, cfg.getDefaultFontFamily());
props.setProperty(SHOW_STICKINGPOLYGON, Boolean.toString(SharedConfig.getInstance().isShow_stickingpolygon()));
props.setProperty(SHOW_GRID, Boolean.toString(cfg.isShow_grid()));
props.setProperty(ENABLE_CUSTOM_ELEMENTS, Boolean.toString(cfg.isEnable_custom_elements()));
props.setProperty(UI_MANAGER, cfg.getUiManager());
props.setProperty(PRINT_PADDING, Integer.toString(cfg.getPrintPadding()));
props.setProperty(PDF_EXPORT_FONT, cfg.getPdfExportFont());
props.setProperty(PDF_EXPORT_FONT_BOLD, cfg.getPdfExportFontBold());
props.setProperty(PDF_EXPORT_FONT_ITALIC, cfg.getPdfExportFontItalic());
props.setProperty(PDF_EXPORT_FONT_BOLDITALIC, cfg.getPdfExportFontBoldItalic());
props.setProperty(CHECK_FOR_UPDATES, Boolean.toString(cfg.isCheckForUpdates()));
props.setProperty(OPEN_FILE_HOME, cfg.getOpenFileHome());
props.setProperty(SAVE_FILE_HOME, cfg.getSaveFileHome());
props.setProperty(DEV_MODE, Boolean.toString(SharedConfig.getInstance().isDev_mode()));
props.setProperty(LAST_USED_PALETTE, cfg.getLastUsedPalette());
props.setProperty(MAIN_SPLIT_POSITION, Integer.toString(gui.getMainSplitPosition()));
props.setProperty(RIGHT_SPLIT_POSITION, Integer.toString(gui.getRightSplitPosition()));
props.setProperty(MAIL_SPLIT_POSITION, Integer.toString(gui.getMailSplitPosition()));
if (gui.saveWindowSizeInConfig()) {
// If the window is maximized in any direction this fact is written in the cfg
Frame topContainer = gui.getMainFrame();
if ((topContainer.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
props.setProperty(START_MAXIMIZED, "true");
} // Otherwise the size and the location is written in the cfg
else {
props.setProperty(START_MAXIMIZED, "false");
props.setProperty(PROGRAM_SIZE, topContainer.getSize().width + "," + topContainer.getSize().height);
props.setProperty(PROGRAM_LOCATION, topContainer.getLocation().x + "," + topContainer.getLocation().y);
}
}
if (!RecentlyUsedFilesList.getInstance().isEmpty()) {
StringBuilder sb = new StringBuilder("");
for (String recentFile : RecentlyUsedFilesList.getInstance()) {
sb.append(recentFile).append("|");
}
sb.setLength(sb.length() - 1);
props.setProperty(RECENT_FILES, sb.toString());
}
/* MAIL */
ConfigMail cfgMail = ConfigMail.getInstance();
if (!cfgMail.getMail_smtp().isEmpty()) {
props.setProperty(MAIL_SMTP, cfgMail.getMail_smtp());
}
props.setProperty(MAIL_SMTP_AUTH, Boolean.toString(cfgMail.isMail_smtp_auth()));
if (!cfgMail.getMail_smtp_user().isEmpty()) {
props.setProperty(MAIL_SMTP_USER, cfgMail.getMail_smtp_user());
}
props.setProperty(MAIL_SMTP_PW_STORE, Boolean.toString(cfgMail.isMail_smtp_pw_store()));
if (!cfgMail.getMail_smtp_pw().isEmpty()) {
props.setProperty(MAIL_SMTP_PW, cfgMail.getMail_smtp_pw());
}
if (!cfgMail.getMail_from().isEmpty()) {
props.setProperty(MAIL_FROM, cfgMail.getMail_from());
}
if (!cfgMail.getMail_to().isEmpty()) {
props.setProperty(MAIL_TO, cfgMail.getMail_to());
}
if (!cfgMail.getMail_cc().isEmpty()) {
props.setProperty(MAIL_CC, cfgMail.getMail_cc());
}
if (!cfgMail.getMail_bcc().isEmpty()) {
props.setProperty(MAIL_BCC, cfgMail.getMail_bcc());
}
props.setProperty(MAIL_XML, Boolean.toString(cfgMail.isMail_xml()));
props.setProperty(MAIL_GIF, Boolean.toString(cfgMail.isMail_gif()));
props.setProperty(MAIL_PDF, Boolean.toString(cfgMail.isMail_pdf()));
/* Generate Class Element Options */
ConfigClassGen genCfg = ConfigClassGen.getInstance();
props.setProperty(GENERATE_CLASS_PACKAGE, Boolean.toString(genCfg.isGenerateClassPackage()));
props.setProperty(GENERATE_CLASS_FIELDS, genCfg.getGenerateClassFields().toString());
props.setProperty(GENERATE_CLASS_METHODS, genCfg.getGenerateClassMethods().toString());
props.setProperty(GENERATE_CLASS_SIGNATURES, genCfg.getGenerateClassSignatures().toString());
props.setProperty(GENERATE_CLASS_SORTINGS, genCfg.getGenerateClassSortings().toString());
FileOutputStream outStream = new FileOutputStream(configfile);
try {
props.store(outStream, null);
} finally {
outStream.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
private static Properties loadProperties() {
Properties result = new Properties();
if (Path.hasOsConformConfig()) {
result = loadPropertiesFromFile(Path.osConformConfig());
}
else if (Path.hasLegacyConfig()) {
result = loadPropertiesFromFile(Path.legacyConfig());
}
return result;
}
private static Properties loadPropertiesFromFile(String filePath) {
Properties result = new Properties();
try {
FileInputStream inputStream = new FileInputStream(filePath);
try {
result.load(inputStream);
} finally {
inputStream.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
private static int getIntProperty(Properties props, String key, int defaultValue) {
String result = props.getProperty(key);
if (result != null) {
try {
return Integer.parseInt(result);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
return defaultValue;
}
private static boolean getBoolProperty(Properties props, String key, boolean defaultValue) {
String result = props.getProperty(key);
if (result != null) {
return Boolean.parseBoolean(result);
}
return defaultValue;
}
private static String getStringProperty(Properties props, String key, String defaultValue) {
return props.getProperty(key, defaultValue);
}
private static Dimension getDimensionProperty(Properties props, String key, Dimension defaultValue) {
String result = props.getProperty(key);
if (result != null) {
try {
int x = Integer.parseInt(result.substring(0, result.indexOf(",")));
int y = Integer.parseInt(result.substring(result.indexOf(",") + 1));
return new Dimension(x, y);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
return defaultValue;
}
private static Point getPointProperty(Properties props, String key, Point defaultValue) {
String result = props.getProperty(key);
if (result != null) {
try {
int x = Integer.parseInt(result.substring(0, result.indexOf(",")));
int y = Integer.parseInt(result.substring(result.indexOf(",") + 1));
return new Point(x, y);
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
return defaultValue;
}
}