/*
* This file is part of the Illarion project.
*
* Copyright © 2015 - Illarion e.V.
*
* Illarion is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Illarion is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package illarion.common.config.entries;
import illarion.common.config.Config;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.nio.file.Path;
import java.util.Objects;
/**
* This is a configuration entry that is used to set a file select entry in the configuration. It will display a
* short text field along with a button to search for the file. The default search directory will be the home directory
* of the user.
*
* @author Martin Karing <nitram@illarion.org>
*/
public final class FileEntry implements ConfigEntry {
/**
* The configuration that is controlled by this text entry.
*/
@Nullable
private Config cfg;
/**
* The key in the configuration that is handled by this configuration.
*/
@Nonnull
private final String configEntry;
/**
* The directory that is displayed by default.
*/
@Nonnull
private final String dir;
/**
* The description of the select able files displayed in the file open
* dialog.
*/
@Nonnull
private final String fileDesc;
/**
* The list of file names that are allowed to be selected
*/
@Nonnull
private final String fileEndings;
/**
* The name of the file that is created using this dialog.
*/
@Nonnull
private final String name;
/**
* Create a new configuration entry that is handled by this entry.
*
* @param entry the configuration key that is handled by this file entry
* @param allowedFileEndings the list of file endings that are allowed as files to be chosen, as separator a
* semicolon is used
* @param fileDescription the description displayed of the files to be selected
* @param defaultDir the default directory that is opened in case no file is selected
* @param defaultName the default name of the file to be created using this file entry
*/
public FileEntry(
@Nonnull String entry,
@Nonnull String allowedFileEndings,
@Nonnull String fileDescription,
@Nullable String defaultDir,
@Nonnull String defaultName) {
configEntry = entry;
fileEndings = allowedFileEndings;
fileDesc = fileDescription;
dir = (defaultDir == null) ? Objects.requireNonNull(System.getProperty("user.home")) : defaultDir;
name = defaultName;
}
/**
* Get the directory that is displayed by default.
*
* @return the directory displayed by default
*/
@Nonnull
public String getDefaultDir() {
return dir;
}
/**
* Get the file description that is displayed in the file dialog.
*
* @return the file description of the dialog
*/
@Nonnull
public String getFileDesc() {
return fileDesc;
}
/**
* Get the list of file endings allowed to be used in this file chooser.
*
* @return the list of file entries
*/
@Nonnull
public String getFileEndings() {
return fileEndings;
}
/**
* Get the default name of the file to be created.
*
* @return the default name of the file to be created
*/
@Nonnull
public String getName() {
return name;
}
/**
* Get the value set in the configuration for this text entry.
*
* @return the configuration stored for this text entry
*/
@Nullable
public Path getValue() {
if (cfg == null) {
throw new IllegalStateException("Reference to configurations system is missing.");
}
return cfg.getPath(configEntry);
}
/**
* Set the configuration handled by this configuration entry.
*
* @param config the configuration that is supposed to be handled by this
* configuration entry
*/
@Override
public void setConfig(@Nonnull Config config) {
cfg = config;
}
/**
* Set the new value of the configuration entry that is controlled by this.
*
* @param newValue the new configuration value
*/
public void setValue(@Nonnull Path newValue) {
if (cfg == null) {
throw new IllegalStateException("Reference to configurations system is missing.");
}
cfg.set(configEntry, newValue);
}
}