package com.scrivenvar.preferences;
import com.dlsc.formsfx.model.structure.StringField;
import com.dlsc.preferencesfx.PreferencesFx;
import com.dlsc.preferencesfx.PreferencesFxEvent;
import com.dlsc.preferencesfx.model.Category;
import com.dlsc.preferencesfx.model.Group;
import com.dlsc.preferencesfx.model.Setting;
import javafx.beans.property.*;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.Label;
import java.io.File;
import java.nio.file.Path;
import static com.scrivenvar.Constants.*;
import static com.scrivenvar.Messages.get;
public class UserPreferences {
private static class UserPreferencesContainer {
private static final UserPreferences INSTANCE = new UserPreferences();
}
public static UserPreferences getInstance() {
return UserPreferencesContainer.INSTANCE;
}
private final PreferencesFx mPreferencesFx;
private final ObjectProperty<File> mPropRDirectory;
private final StringProperty mPropRScript;
private final ObjectProperty<File> mPropImagesDirectory;
private final StringProperty mPropImagesOrder;
private final ObjectProperty<File> mPropDefinitionPath;
private final StringProperty mRDelimiterBegan;
private final StringProperty mRDelimiterEnded;
private final StringProperty mDefDelimiterBegan;
private final StringProperty mDefDelimiterEnded;
private final IntegerProperty mPropFontsSizeEditor;
private UserPreferences() {
mPropRDirectory = simpleFile( USER_DIRECTORY );
mPropRScript = new SimpleStringProperty( "" );
mPropImagesDirectory = simpleFile( USER_DIRECTORY );
mPropImagesOrder = new SimpleStringProperty( PERSIST_IMAGES_DEFAULT );
mPropDefinitionPath = simpleFile(
getSetting( "file.definition.default", DEFINITION_NAME )
);
mDefDelimiterBegan = new SimpleStringProperty( DEF_DELIM_BEGAN_DEFAULT );
mDefDelimiterEnded = new SimpleStringProperty( DEF_DELIM_ENDED_DEFAULT );
mRDelimiterBegan = new SimpleStringProperty( R_DELIM_BEGAN_DEFAULT );
mRDelimiterEnded = new SimpleStringProperty( R_DELIM_ENDED_DEFAULT );
mPropFontsSizeEditor = new SimpleIntegerProperty( (int) FONT_SIZE_EDITOR );
mPreferencesFx = createPreferencesFx();
}
public void show() {
getPreferencesFx().show( false );
}
public void save() {
getPreferencesFx().saveSettings();
}
@SuppressWarnings("unchecked")
private PreferencesFx createPreferencesFx() {
final Setting<StringField, StringProperty> scriptSetting =
Setting.of( "Script", mPropRScript );
final StringField field = scriptSetting.getElement();
field.multiline( true );
return PreferencesFx.of(
UserPreferences.class,
Category.of(
get( "Preferences.r" ),
Group.of(
get( "Preferences.r.directory" ),
Setting.of( label( "Preferences.r.directory.desc", false ) ),
Setting.of( "Directory", mPropRDirectory, true )
),
Group.of(
get( "Preferences.r.script" ),
Setting.of( label( "Preferences.r.script.desc" ) ),
scriptSetting
),
Group.of(
get( "Preferences.r.delimiter.began" ),
Setting.of( label( "Preferences.r.delimiter.began.desc" ) ),
Setting.of( "Opening", mRDelimiterBegan )
),
Group.of(
get( "Preferences.r.delimiter.ended" ),
Setting.of( label( "Preferences.r.delimiter.ended.desc" ) ),
Setting.of( "Closing", mRDelimiterEnded )
)
),
Category.of(
get( "Preferences.images" ),
Group.of(
get( "Preferences.images.directory" ),
Setting.of( label( "Preferences.images.directory.desc" ) ),
Setting.of( "Directory", mPropImagesDirectory, true )
),
Group.of(
get( "Preferences.images.suffixes" ),
Setting.of( label( "Preferences.images.suffixes.desc" ) ),
Setting.of( "Extensions", mPropImagesOrder )
)
),
Category.of(
get( "Preferences.definitions" ),
Group.of(
get( "Preferences.definitions.path" ),
Setting.of( label( "Preferences.definitions.path.desc" ) ),
Setting.of( "Path", mPropDefinitionPath, false )
),
Group.of(
get( "Preferences.definitions.delimiter.began" ),
Setting.of( label(
"Preferences.definitions.delimiter.began.desc" ) ),
Setting.of( "Opening", mDefDelimiterBegan )
),
Group.of(
get( "Preferences.definitions.delimiter.ended" ),
Setting.of( label(
"Preferences.definitions.delimiter.ended.desc" ) ),
Setting.of( "Closing", mDefDelimiterEnded )
)
),
Category.of(
get( "Preferences.fonts" ),
Group.of(
get( "Preferences.fonts.size_editor" ),
Setting.of( label( "Preferences.fonts.size_editor.desc" ) ),
Setting.of( "Points", mPropFontsSizeEditor )
)
)
).instantPersistent( false );
}
private SimpleObjectProperty<File> simpleFile( final String path ) {
return new SimpleObjectProperty<>( new File( path ) );
}
private Node label( final String key ) {
return new Label( get( key, true ) );
}
@SuppressWarnings("SameParameterValue")
private Node label( final String key, final boolean interpolate ) {
return new Label( get( key, interpolate ) );
}
public void addSaveEventHandler(
final EventHandler<? super PreferencesFxEvent> eventHandler ) {
final var eventType = PreferencesFxEvent.EVENT_PREFERENCES_SAVED;
getPreferencesFx().addEventHandler( eventType, eventHandler );
}
@SuppressWarnings("SameParameterValue")
private String getSetting( final String key, final String value ) {
return SETTINGS.getSetting( key, value );
}
public ObjectProperty<File> definitionPathProperty() {
return mPropDefinitionPath;
}
public Path getDefinitionPath() {
return definitionPathProperty().getValue().toPath();
}
private StringProperty defDelimiterBegan() {
return mDefDelimiterBegan;
}
public String getDefDelimiterBegan() {
return defDelimiterBegan().get();
}
private StringProperty defDelimiterEnded() {
return mDefDelimiterEnded;
}
public String getDefDelimiterEnded() {
return defDelimiterEnded().get();
}
public ObjectProperty<File> rDirectoryProperty() {
return mPropRDirectory;
}
public File getRDirectory() {
return rDirectoryProperty().getValue();
}
public StringProperty rScriptProperty() {
return mPropRScript;
}
public String getRScript() {
return rScriptProperty().getValue();
}
private StringProperty rDelimiterBegan() {
return mRDelimiterBegan;
}
public String getRDelimiterBegan() {
return rDelimiterBegan().get();
}
private StringProperty rDelimiterEnded() {
return mRDelimiterEnded;
}
public String getRDelimiterEnded() {
return rDelimiterEnded().get();
}
private ObjectProperty<File> imagesDirectoryProperty() {
return mPropImagesDirectory;
}
public File getImagesDirectory() {
return imagesDirectoryProperty().getValue();
}
private StringProperty imagesOrderProperty() {
return mPropImagesOrder;
}
public String getImagesOrder() {
return imagesOrderProperty().getValue();
}
public IntegerProperty fontsSizeEditorProperty() {
return mPropFontsSizeEditor;
}
public int getFontsSizeEditor() {
return mPropFontsSizeEditor.intValue();
}
private PreferencesFx getPreferencesFx() {
return mPreferencesFx;
}
}