package com.scrivenvar.preferences;
import com.dlsc.formsfx.model.structure.StringField;
import com.dlsc.preferencesfx.PreferencesFx;
import com.dlsc.preferencesfx.model.Category;
import com.dlsc.preferencesfx.model.Group;
import com.dlsc.preferencesfx.model.Setting;
import com.scrivenvar.Services;
import com.scrivenvar.service.Settings;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
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 final Settings SETTINGS = Services.load( Settings.class );
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 PreferencesFx mPreferencesFx;
public UserPreferences() {
mPropRDirectory = simpleFile( USER_DIRECTORY );
mPropRScript = new SimpleStringProperty( "" );
mPropImagesDirectory = simpleFile( USER_DIRECTORY );
mPropImagesOrder = new SimpleStringProperty( PERSIST_IMAGES_DEFAULT );
mPropDefinitionPath = simpleFile( getSetting(
"file.definition.default", "variables.yaml" )
);
mRDelimiterBegan = new SimpleStringProperty( R_DELIMITER_BEGAN_DEFAULT );
mRDelimiterEnded = new SimpleStringProperty( R_DELIMITER_ENDED_DEFAULT );
mPreferencesFx = createPreferencesFx();
}
public void show() {
mPreferencesFx.show( false );
}
public void save() {
mPreferencesFx.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 )
)
)
);
}
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 ) );
}
@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 ObjectProperty<File> rDirectoryProperty() {
return mPropRDirectory;
}
public File getRDirectory() {
return rDirectoryProperty().getValue();
}
private 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();
}
}