/**
* Copyright (C) 2017 Jan Schäfer (jansch@users.sourceforge.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jskat.data;
import java.awt.Dimension;
import java.awt.Point;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Properties;
import org.jskat.data.SkatTableOptions.ContraCallingTime;
import org.jskat.data.SkatTableOptions.RamschSkatOwner;
import org.jskat.data.SkatTableOptions.RuleSet;
import org.jskat.data.SkatTableOptions.SavePath;
import org.jskat.gui.img.CardSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Holds all options of JSkat.
*/
public final class JSkatOptions {
private final static String PROPERTIES_FILENAME = "jskat.properties"; //$NON-NLS-1$
/**
* Languages supported by JSkat.
*/
public enum SupportedLanguage {
/**
* English.
*/
ENGLISH,
/**
* German.
*/
GERMAN;
}
public enum Option {
/**
* Language for the GUI
*/
LANGUAGE(SupportedLanguage.class),
/**
* Save path for properties file and log file
*/
SAVE_PATH(String.class),
/**
* Properties file and log file are saved in working directory
*/
SAVE_IN_WORKING_DIRECTORY(Boolean.class),
/**
* JSkat checks the website for a new version on start up
*/
CHECK_FOR_NEW_VERSION_AT_START_UP(Boolean.class),
/**
* JSkat shows tips at start up
*/
SHOW_TIPS_AT_START_UP(Boolean.class),
/**
* Cheat/Debug mode, e.g. all cards can be seen
*/
CHEAT_DEBUG_MODE(Boolean.class),
/**
* Card set
*/
CARD_SET(CardSet.class),
/**
* Maximum players on a table
*/
MAX_PLAYER_COUNT(Integer.class),
/**
* Web address of the ISS
*/
ISS_ADDRESS(String.class),
/**
* Network port of the ISS
*/
ISS_PORT(Integer.class),
/**
* Rule set
*/
RULES(RuleSet.class),
/**
* Allow contra/re calling
*/
PLAY_CONTRA(Boolean.class, RULES),
/**
* Time of Contra/Re calling
*/
CONTRA_CALLING_TIME(ContraCallingTime.class, PLAY_CONTRA),
/**
* Contra/Re calling is only allowed if the player has at least bid 18
*/
CONTRA_AFTER_BID_18(Boolean.class, PLAY_CONTRA),
/**
* Play bock games
*/
PLAY_BOCK(Boolean.class, RULES),
/**
* Bock event: all players passed, no bid
*/
BOCK_EVENT_NO_BID(Boolean.class, PLAY_BOCK),
/**
* Bock event: Contra/Re was called
*/
BOCK_EVENT_CONTRA_RE_CALLED(Boolean.class, PLAY_BOCK),
/**
* Bock event: Declarer lost a game after contra was called
*/
BOCK_EVENT_LOST_AFTER_CONTRA(Boolean.class, PLAY_BOCK),
/**
* Bock event: Declarer lost a grand game
*/
BOCK_EVENT_LOST_GRAND(Boolean.class, PLAY_BOCK),
/**
* Bock event: Declarer lost a game with 60 points
*/
BOCK_EVENT_LOST_WITH_60(Boolean.class, PLAY_BOCK),
/**
* Bock event: One player has X00 points, where X is 1..9
*/
BOCK_EVENT_MULTIPLE_OF_HUNDRED_SCORE(Boolean.class, PLAY_BOCK),
/**
* Play ramsch games
*/
PLAY_RAMSCH(Boolean.class, RULES),
/**
* Ramsch event: all players passed, no bid
*/
RAMSCH_EVENT_NO_BID(Boolean.class, PLAY_RAMSCH),
/**
* Ramsch event: play ramsch after a round of bock games
*/
RAMSCH_EVENT_RAMSCH_AFTER_BOCK(Boolean.class, PLAY_RAMSCH),
/**
* Player, who gets the skat in a ramsch game
*/
RAMSCH_SKAT_OWNER(RamschSkatOwner.class, PLAY_RAMSCH),
/**
* Play Schieberamsch
*/
SCHIEBERAMSCH(Boolean.class, PLAY_RAMSCH),
/**
* Allow jacks to discard in Schieberamsch games
*/
SCHIEBERAMSCH_JACKS_IN_SKAT(Boolean.class, SCHIEBERAMSCH),
/**
* It is allowed to play Grand hand instead of a ramsch game
*/
RAMSCH_GRAND_HAND_POSSIBLE(Boolean.class),
/**
* Allow playing of revolution (not used a.t.m.)
*/
PLAY_REVOLUTION(Boolean.class),
/**
* Waiting time after finishing a trick
*/
WAIT_TIME_AFTER_TRICK(Integer.class),
/**
* Hide toolbar
*/
HIDE_TOOLBAR(Boolean.class),
/**
* X-Position of main frame on screen
*/
MAIN_FRAME_X_POSITION(Integer.class),
/**
* Y-Position of main frame on screen
*/
MAIN_FRAME_Y_POSITION(Integer.class),
/**
* Width of main frame
*/
MAIN_FRAME_WIDTH(Integer.class),
/**
* Height of main frame
*/
MAIN_FRAME_HEIGHT(Integer.class);
public final Class clazz;
public final Option parent = null;
private Option(Class clazz) {
this.clazz = clazz;
}
private Option(Class clazz, Option parent) {
this.clazz = clazz;
}
/**
* Gets the enum name as property key.<br>
* Calls name(), converts everything to lower case and replaces all
* occurences of "_[a-z]" to "[A-Z]"
*
* @return Property name of the enum
*/
public String propertyName() {
String result = name().toLowerCase();
while (result.contains("_")) {
int startIndex = result.indexOf('_');
String search = result.substring(startIndex, startIndex + 2);
String replace = search.substring(1).toUpperCase();
result = result.replace(search, replace);
}
return result;
}
/**
* Gets the enum name from a property key.<br>
* Inserts a '_' before each capital letter or number.
*
* @param property
* Property
* @return Enum
*/
public static Option valueOfProperty(String property) {
String result = property.replaceAll("[A-Z]|[0-9]+", "_$0");
return Option.valueOf(result.toUpperCase());
}
}
/**
* Logger.
*/
private static Logger log = LoggerFactory.getLogger(JSkatOptions.class);
/**
* Instance for options.
*/
private static JSkatOptions optionsInstance = null;
/**
* Save path resolver
*/
private final SavePathResolver savePathResolver;
/**
* Returns the instance of the singleton JSkatOptions.<br>
* This method must be called at the very beginning.
*
* @param savePathResolver
* Resolver for save path
* @return Options
*/
public static JSkatOptions instance(final SavePathResolver savePathResolver) {
if (optionsInstance == null) {
optionsInstance = new JSkatOptions(savePathResolver);
}
return optionsInstance;
}
/**
* Returns the instance of the singleton {@link JSkatOptions}<br>
* This methods throws a {@link IllegalStateException} if
* {@link #instance(SavePathResolver)} was not called before
*
* @return Options
*/
static public JSkatOptions instance() {
if (optionsInstance == null) {
throw new IllegalStateException("Options not intialized, yet."); //$NON-NLS-1$
}
return optionsInstance;
}
private final Properties options = new Properties();
/** Creates a new instance of JSkatOptions */
private JSkatOptions(final SavePathResolver savePathResolver) {
this.savePathResolver = savePathResolver;
setDefaultProperties();
try {
loadOptions();
} catch (FileNotFoundException e) {
log.debug("No properties file found. Using standard values."); //$NON-NLS-1$
} catch (IOException e) {
log.warn("Could not load properties: " + e.getClass() + ": " //$NON-NLS-1$ //$NON-NLS-2$
+ e.getMessage());
}
}
/**
* Getter for property cardFace
*
* @return Value of property cardFace
*/
public CardSet getCardSet() {
return CardSet.valueOf(get(Option.CARD_SET));
}
/**
* Getter for property language.
*
* @return Value of property language.
*/
public SupportedLanguage getLanguage() {
return SupportedLanguage.valueOf(get(Option.LANGUAGE));
}
/**
* Gets the maximum number of players allowed in a skat series
*
* @return Maximum number
*/
public Integer getMaxPlayerCount() {
return getInteger(Option.MAX_PLAYER_COUNT);
}
/**
* Getter for property ramschSkatOwner.
*
* @return Value of property ramschSkatOwner.
*/
public RamschSkatOwner getRamschSkatOwner() {
return RamschSkatOwner.valueOf(get(Option.RAMSCH_SKAT_OWNER));
}
/**
* Getter for property rules.
*
* @return Value of property rules.
*/
public RuleSet getRules() {
return RuleSet.valueOf(get(Option.RULES));
}
/**
* Getter for property savePath.
*
* @return Value of property savePath.
*/
public String getSavePath() {
switch (getSavePathInternal()) {
case USER_HOME:
return savePathResolver.getDefaultSavePath();
case WORKING_DIRECTORY:
return savePathResolver.getCurrentWorkingDirectory();
}
return null;
}
public SavePath getSavePathInternal() {
return SavePath.valueOf(get(Option.SAVE_PATH));
}
public Integer getWaitTimeAfterTrick() {
return getInteger(Option.WAIT_TIME_AFTER_TRICK);
}
public Dimension getMainFrameSize() {
return new Dimension(getInteger(Option.MAIN_FRAME_WIDTH), getInteger(Option.MAIN_FRAME_HEIGHT));
}
public void setMainFrameWidth(Integer width) {
setOption(Option.MAIN_FRAME_WIDTH, width);
}
public void setMainFrameHeight(Integer height) {
setOption(Option.MAIN_FRAME_HEIGHT, height);
}
public Point getMainFramePosition() {
return new Point(getInteger(Option.MAIN_FRAME_X_POSITION), getInteger(Option.MAIN_FRAME_Y_POSITION));
}
public void setMainFrameXPosition(Integer xPosition) {
setOption(Option.MAIN_FRAME_X_POSITION, xPosition);
}
public void setMainFrameYPosition(Integer yPosition) {
setOption(Option.MAIN_FRAME_Y_POSITION, yPosition);
}
public void setWaitTimeAfterTrick(Integer waitTime) {
setOption(Option.WAIT_TIME_AFTER_TRICK, waitTime);
}
public Boolean isHideToolbar() {
return getBoolean(Option.HIDE_TOOLBAR);
}
public void setHideToolbar(Boolean isHideToolbar) {
setOption(Option.HIDE_TOOLBAR, isHideToolbar);
}
/**
* Gets the current skat table options
*
* @return The current skat table options
*/
public SkatTableOptions getSkatTableOptions() {
SkatTableOptions result = new SkatTableOptions();
result.setMaxPlayerCount(getMaxPlayerCount());
result.setPlayBock(isPlayBock());
result.setBockEventContraReAnnounced(isBockEventContraReCalled());
result.setBockEventLostAfterContra(isBockEventLostAfterContra());
result.setBockEventLostGrand(isBockEventLostGrand());
result.setBockEventLostWith60(isBockEventLostWith60());
result.setBockEventMultipleOfHundredScore(isBockEventMultipleOfHundredScore());
result.setPlayContra(isPlayContra());
result.setPlayRamsch(isPlayRamsch());
result.setPlayRevolution(isPlayRevolution());
return result;
}
public Boolean isBockEventAllPlayersPassed() {
return isBockEventAllPlayersPassed(true);
}
public Boolean isBockEventAllPlayersPassed(boolean checkParentOption) {
return getBooleanWithParentCheck(Option.BOCK_EVENT_NO_BID, checkParentOption, isPlayBock(checkParentOption));
}
/**
* Getter for property bockEventContraReAnnounced
*
* @return Value of property bockEventConOptiontraReAnnounced
*/
public Boolean isBockEventContraReCalled() {
return isBockEventContraReCalled(true);
}
public Boolean isBockEventContraReCalled(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.BOCK_EVENT_CONTRA_RE_CALLED, checkParentOption,
isPlayBock(checkParentOption));
}
/**
* Getter for property bockEventLostAfterContra
*
* @return Value of property bockEventLostAfterContra
*/
public Boolean isBockEventLostAfterContra() {
return isBockEventLostAfterContra(true);
}
public Boolean isBockEventLostAfterContra(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.BOCK_EVENT_LOST_AFTER_CONTRA, checkParentOption,
isPlayBock(checkParentOption));
}
/**
* Getter for property bockEventLostGrand
*
* @return Value of property bockEventLostGrand
*/
public Boolean isBockEventLostGrand() {
return isBockEventLostGrand(true);
}
public Boolean isBockEventLostGrand(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.BOCK_EVENT_LOST_GRAND, checkParentOption,
isPlayBock(checkParentOption));
}
/**
* Getter for property bockEventLostWith60
*
* @return Value of property bockEventLostWith60
*/
public Boolean isBockEventLostWith60() {
return isBockEventLostWith60(true);
}
public Boolean isBockEventLostWith60(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.BOCK_EVENT_LOST_WITH_60, checkParentOption,
isPlayBock(checkParentOption));
}
/**
* Getter for property bockEventPlayerHasX00Points
*
* @return Value of property bockEventPlayerHasX00Points
*/
public Boolean isBockEventMultipleOfHundredScore() {
return isBockEventMultipleOfHundredScore(true);
}
/**
* Checks whether a player score of a multiple of hundred is a bock event.
*
* @param checkParentOption
* <code>true</code>, if the parent option should be checked
* @return <code>true</code>, if the player score of a multiple of hundred
* is a bock event
*/
public Boolean isBockEventMultipleOfHundredScore(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.BOCK_EVENT_MULTIPLE_OF_HUNDRED_SCORE, checkParentOption,
isPlayBock(checkParentOption));
}
/**
* Checks whether at least a bid of 18 has to be done to say contra
*
* @return TRUE, if the check succeeds
*/
public Boolean isContraAfterBid18() {
return isContraAfterBid18(true);
}
/**
* Checks whether at least a bid of 18 has to be done to say contra
*
* @param checkParentOption
* TRUE, if the parent option must be true too
* @return TRUE, if the check succeeds
*/
public Boolean isContraAfterBid18(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.CONTRA_AFTER_BID_18, checkParentOption,
isPlayContra(checkParentOption));
}
/**
* Getter for property cheatDebugMode.
*
* @return Value of property cheatDebugMode.
*/
public Boolean isCheatDebugMode() {
return getBoolean(Option.CHEAT_DEBUG_MODE);
}
/**
* Getter for property playBock.
*
* @return Value of property playBock.
*/
public Boolean isPlayBock() {
return isPlayBock(true);
}
/**
* Getter for property playBock.
*
* @param checkParentOption
* TRUE, if the parent option must be true too
* @return Value of property playBock.
*/
public Boolean isPlayBock(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.PLAY_BOCK, checkParentOption, RuleSet.PUB.equals(getRules()));
}
private Boolean getBooleanWithParentCheck(final Option option, final boolean checkParentOption,
final boolean parentOptionActivated) {
Boolean result = getBoolean(option);
if (checkParentOption) {
if (!parentOptionActivated) {
result = Boolean.FALSE;
}
}
return result;
}
/**
* Getter for property playKontra.
*
* @return Value of property playKontra.
*/
public Boolean isPlayContra() {
return isPlayContra(true);
}
/**
* Getter for property playKontra.
*
* @param checkParentOption
* TRUE, if the parent option must be true too
* @return Value of property playKontra.
*/
public Boolean isPlayContra(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.PLAY_CONTRA, checkParentOption, RuleSet.PUB.equals(getRules()));
}
/**
* Getter for property playRamsch.
*
* @return Value of property playRamsch.
*/
public Boolean isPlayRamsch() {
return isPlayRamsch(true);
}
/**
* Checks whether Ramsch should be played
*
* @param checkParentOption
* TRUE, if parent option should be checked too
* @return TRUE, if Ramsch should be played
*/
public Boolean isPlayRamsch(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.PLAY_RAMSCH, checkParentOption, RuleSet.PUB.equals(getRules()));
}
/**
* Getter for property playRevolution.
*
* @return Value of property playRevolution.
*/
public Boolean isPlayRevolution() {
return getBoolean(Option.PLAY_REVOLUTION);
}
public Boolean isPlayRevolution(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.PLAY_REVOLUTION, checkParentOption, RuleSet.PUB.equals(getRules()));
}
/**
* Getter for property ramschEventNoBid
*
* @return Value of property ramschEventNoBid
*/
public Boolean isRamschEventNoBid() {
return isRamschEventNoBid(true);
}
public Boolean isRamschEventNoBid(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.RAMSCH_EVENT_NO_BID, checkParentOption,
isPlayRamsch(checkParentOption));
}
/**
* Getter for property ramschEventRamschAfterBock
*
* @return Value of property ramschEventRamschAfterBock
*/
public Boolean isRamschEventRamschAfterBock() {
return isRamschEventRamschAfterBock(true);
}
public Boolean isRamschEventRamschAfterBock(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.RAMSCH_EVENT_RAMSCH_AFTER_BOCK, checkParentOption,
isPlayRamsch(checkParentOption));
}
/**
* Getter for property ramschGrandHandPossible
*
* @return Value of property ramschGrandHandPossible
*/
public Boolean isRamschGrandHandPossible() {
return getBoolean(Option.RAMSCH_GRAND_HAND_POSSIBLE);
}
/**
* Getter for property schieberRamsch
*
* @return Value of property schieberRamsch
*/
public Boolean isSchieberamsch() {
return isSchieberamsch(true);
}
public Boolean isSchieberamsch(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.SCHIEBERAMSCH, checkParentOption, isPlayRamsch(checkParentOption));
}
/**
* Getter for property schieberRamschJacksInSkat
*
* @return Value of property schieberRamschJacksInSkat
*/
public Boolean isSchieberamschJacksInSkat() {
return isSchieberamschJacksInSkat(true);
}
public Boolean isSchieberamschJacksInSkat(final boolean checkParentOption) {
return getBooleanWithParentCheck(Option.SCHIEBERAMSCH_JACKS_IN_SKAT, checkParentOption,
isSchieberamsch(checkParentOption));
}
public Boolean isShowTipsOnStartUp() {
return getBoolean(Option.SHOW_TIPS_AT_START_UP);
}
/**
* Saves the options to a file .jskat in user home
*/
public void saveJSkatProperties() {
FileWriter writer = null;
try {
writer = new FileWriter(getSavePath() + PROPERTIES_FILENAME);
options.store(writer, "JSkat options"); //$NON-NLS-1$
writer.close();
log.debug("Saved options with rules: " + getRules()); //$NON-NLS-1$
} catch (FileNotFoundException e1) {
log.warn("No properties file found. Saving of JSkat options failed."); //$NON-NLS-1$
} catch (IOException e) {
log.warn("Saving of JSkat options failed."); //$NON-NLS-1$
log.warn(e.toString());
}
}
public void setBockEventNoBid(Boolean bockEventAllPlayersPassed) {
setOption(Option.BOCK_EVENT_NO_BID, bockEventAllPlayersPassed);
}
/**
* Setter for property bockEventContraReAnnounced
*
* @param bockEventContraReCalled
* New value of property bockEventContraReAnnounced
*/
public void setBockEventContraReCalled(final Boolean bockEventContraReCalled) {
setOption(Option.BOCK_EVENT_CONTRA_RE_CALLED, bockEventContraReCalled);
}
/**
* Setter for property bockEventLostAfterContra
*
* @param bockEventLostAfterContra
* New value of property bockEventLostAfterContra
*/
public void setBockEventLostAfterContra(final Boolean bockEventLostAfterContra) {
setOption(Option.BOCK_EVENT_LOST_AFTER_CONTRA, bockEventLostAfterContra);
}
/**
* Setter for property bockEventLostGrand
*
* @param bockEventLostGrand
* New value of property bockEventLostGrand
*/
public void setBockEventLostGrand(final Boolean bockEventLostGrand) {
setOption(Option.BOCK_EVENT_LOST_GRAND, bockEventLostGrand);
}
/**
* Setter for property bockEventLostWith60
*
* @param bockEventLostWith60
* New value of property bockEventLostWith60
*/
public void setBockEventLostWith60(final Boolean bockEventLostWith60) {
setOption(Option.BOCK_EVENT_LOST_WITH_60, bockEventLostWith60);
}
/**
* Setter for property bockEventPlayerHasX00Points
*
* @param bockEventMultipleOfHundredScore
* New value of property bockEventPlayerHasX00Points
*/
public void setBockEventMultipleOfHundredScore(final Boolean bockEventMultipleOfHundredScore) {
setOption(Option.BOCK_EVENT_MULTIPLE_OF_HUNDRED_SCORE, bockEventMultipleOfHundredScore);
}
/**
* Sets the flag for bid at least 18 to say contra
*
* @param contraAfterBid18
* TRUE, if at least a bid of 18 is needed for the right to say
* contra
*/
public void setContraAfterBid18(final Boolean contraAfterBid18) {
setOption(Option.CONTRA_AFTER_BID_18, contraAfterBid18);
}
/**
* Setter for property card set.
*
* @param cardSet
* Card set
*/
public void setCardSet(final CardSet cardSet) {
setOption(Option.CARD_SET, cardSet);
}
/**
* Setter for property cheatDebugMode.
*
* @param isCheatDebugMode
* New value of property cheatDebugMode.
*/
public void setCheatDebugMode(final Boolean isCheatDebugMode) {
setOption(Option.CHEAT_DEBUG_MODE, isCheatDebugMode);
}
/**
* Sets the flag for checking for a new version of JSkat at start up
*
* @param isCheckForNewVersionAtStartUp
* TRUE, if the check should be performed at start up
*/
public void setCheckForNewVersionAtStartUp(final Boolean isCheckForNewVersionAtStartUp) {
setOption(Option.CHECK_FOR_NEW_VERSION_AT_START_UP, isCheckForNewVersionAtStartUp);
}
/**
* Sets the address of the ISS
*
* @param address
* Address
*/
public void setIssAddress(final String address) {
setOption(Option.ISS_ADDRESS, address);
}
/**
* Sets the port of the ISS
*
* @param port
* Port
*/
public void setIssPort(final Integer port) {
setOption(Option.ISS_PORT, port);
}
/**
* Setter for property language.
*
* @param language
* New value of property language.
*/
public void setLanguage(final SupportedLanguage language) {
setOption(Option.LANGUAGE, language);
}
/**
* Sets the maximum number of players in a skat series
*
* @param count
* Maximumn number
*/
public void setMaxPlayerCount(final Integer count) {
setOption(Option.MAX_PLAYER_COUNT, count);
}
/**
* Setter for property playBock.
*
* @param playBock
* New value of property playBock.
*/
public void setPlayBock(final Boolean playBock) {
setOption(Option.PLAY_BOCK, playBock);
}
/**
* Setter for property playKontra.
*
* @param playContra
* New value of property playKontra.
*/
public void setPlayContra(final Boolean playContra) {
setOption(Option.PLAY_CONTRA, playContra);
}
/**
* Setter for property playRamsch.
*
* @param playRamsch
* New value of property playRamsch.
*/
public void setPlayRamsch(final Boolean playRamsch) {
setOption(Option.PLAY_RAMSCH, playRamsch);
}
/**
* Setter for property playRevolution.
*
* @param playRevolution
* New value of property playRevolution.
*/
public void setPlayRevolution(final Boolean playRevolution) {
setOption(Option.PLAY_REVOLUTION, playRevolution);
}
/**
* Setter for property ramschEventNoBid
*
* @param ramschEventNoBid
* New value of property ramschEventNoBid
*/
public void setRamschEventNoBid(final Boolean ramschEventNoBid) {
setOption(Option.RAMSCH_EVENT_NO_BID, ramschEventNoBid);
}
/**
* Setter for property ramschEventRamschAfterBock
*
* @param ramschEventRamschAfterBock
* New value of property ramschEventRamschAfterBock
*/
public void setRamschEventRamschAfterBock(final Boolean ramschEventRamschAfterBock) {
setOption(Option.RAMSCH_EVENT_RAMSCH_AFTER_BOCK, ramschEventRamschAfterBock);
}
/**
* Setter for property ramschGrandHandPossible
*
* @param ramschGrandHandPossible
* New value of property ramschGrandHandPossible
*/
public void setRamschGrandHandPossible(final Boolean ramschGrandHandPossible) {
setOption(Option.RAMSCH_GRAND_HAND_POSSIBLE, ramschGrandHandPossible);
}
/**
* Setter for property ramschSkat.
*
* @param ramschSkat
* Owner of the skat after the ramsch game
*/
public void setRamschSkatOwner(final RamschSkatOwner ramschSkat) {
setOption(Option.RAMSCH_SKAT_OWNER, ramschSkat);
}
/**
* Setter for property rules.
*
* @param ruleSet
* New value of property rules.
*/
public void setRules(final RuleSet ruleSet) {
setOption(Option.RULES, ruleSet.name());
}
/**
* Setter for property savePath.
*
* @param savePath
* New value of property savePath.
*/
public void setSavePath(final SavePath savePath) {
setOption(Option.SAVE_PATH, savePath.name());
}
/**
* Setter for property schieberRamsch
*
* @param schieberRamsch
* New value of property schieberRamsch
*/
public void setSchieberRamsch(final Boolean schieberRamsch) {
setOption(Option.SCHIEBERAMSCH, schieberRamsch);
}
/**
* Setter for property schieberRamschJacksInSkat
*
* @param schieberRamschJacksInSkat
* New value of property schieberRamschJacksInSkat
*/
public void setSchieberRamschJacksInSkat(final Boolean schieberRamschJacksInSkat) {
setOption(Option.SCHIEBERAMSCH_JACKS_IN_SKAT, schieberRamschJacksInSkat);
}
private static SupportedLanguage getDefaultLanguage() {
SupportedLanguage result = SupportedLanguage.ENGLISH;
if (Locale.getDefault().getLanguage().equals(Locale.GERMAN.getLanguage())) {
result = SupportedLanguage.GERMAN;
}
return result;
}
private void loadOptions() throws IOException {
FileInputStream stream = null;
try {
stream = new FileInputStream(savePathResolver.getCurrentWorkingDirectory() + PROPERTIES_FILENAME);
setSavePath(SavePath.WORKING_DIRECTORY);
} catch (FileNotFoundException e) {
stream = new FileInputStream(savePathResolver.getDefaultSavePath() + PROPERTIES_FILENAME);
setSavePath(SavePath.USER_HOME);
}
Properties loadedOptions = new Properties();
loadedOptions.load(stream);
Enumeration<Object> props = loadedOptions.keys();
String property;
String value;
while (props.hasMoreElements()) {
property = (String) props.nextElement();
value = loadedOptions.getProperty(property);
Option option = null;
try {
option = Option.valueOfProperty(property);
} catch (IllegalArgumentException e) {
log.error("Unknown option " + property + " with value " + value); //$NON-NLS-1$ //$NON-NLS-2$
// handle obsolete or renamed options
if ("ramschSkat".equals(property)) { //$NON-NLS-1$
option = Option.RAMSCH_SKAT_OWNER;
}
}
if (option == null) {
continue;
}
parseAndSetOptionValue(option, value);
}
}
private void parseAndSetOptionValue(final Option option, final String value) {
switch (option) {
case BOCK_EVENT_CONTRA_RE_CALLED:
setBockEventContraReCalled(Boolean.valueOf(value));
break;
case BOCK_EVENT_LOST_AFTER_CONTRA:
setBockEventLostAfterContra(Boolean.valueOf(value));
break;
case BOCK_EVENT_LOST_GRAND:
setBockEventLostGrand(Boolean.valueOf(value));
break;
case BOCK_EVENT_LOST_WITH_60:
setBockEventLostWith60(Boolean.valueOf(value));
break;
case BOCK_EVENT_MULTIPLE_OF_HUNDRED_SCORE:
setBockEventMultipleOfHundredScore(Boolean.valueOf(value));
break;
case BOCK_EVENT_NO_BID:
setBockEventNoBid(Boolean.valueOf(value));
break;
case CARD_SET:
try {
setCardSet(CardSet.valueOf(value));
} catch (IllegalArgumentException e) {
// parsing of older options failed
logEnumParseError(option, getCardSet().name());
}
break;
case CHEAT_DEBUG_MODE:
setCheatDebugMode(Boolean.valueOf(value));
break;
case CHECK_FOR_NEW_VERSION_AT_START_UP:
setCheckForNewVersionAtStartUp(Boolean.valueOf(value));
break;
case CONTRA_AFTER_BID_18:
setContraAfterBid18(Boolean.valueOf(value));
break;
case ISS_ADDRESS:
setIssAddress(value);
break;
case ISS_PORT:
setIssPort(Integer.valueOf(value));
break;
case LANGUAGE:
try {
setLanguage(SupportedLanguage.valueOf(value));
} catch (IllegalArgumentException e) {
// parsing of older options failed
logEnumParseError(option, getLanguage().name());
}
break;
case MAX_PLAYER_COUNT:
setMaxPlayerCount(Integer.valueOf(value));
break;
case PLAY_BOCK:
setPlayBock(Boolean.valueOf(value));
break;
case PLAY_CONTRA:
setPlayContra(Boolean.valueOf(value));
break;
case PLAY_RAMSCH:
setPlayRamsch(Boolean.valueOf(value));
break;
case PLAY_REVOLUTION:
setPlayRevolution(Boolean.valueOf(value));
break;
case RAMSCH_EVENT_NO_BID:
setRamschEventNoBid(Boolean.valueOf(value));
break;
case RAMSCH_EVENT_RAMSCH_AFTER_BOCK:
setRamschEventRamschAfterBock(Boolean.valueOf(value));
break;
case RAMSCH_GRAND_HAND_POSSIBLE:
setRamschGrandHandPossible(Boolean.valueOf(value));
break;
case RAMSCH_SKAT_OWNER:
try {
setRamschSkatOwner(RamschSkatOwner.valueOf(value));
} catch (IllegalArgumentException e) {
// parsing of older options failed
logEnumParseError(option, getRamschSkatOwner().name());
}
break;
case RULES:
try {
setRules(RuleSet.valueOf(value));
} catch (IllegalArgumentException e) {
// parsing of older options failed
logEnumParseError(option, getRules().name());
}
break;
case SCHIEBERAMSCH:
setSchieberRamsch(Boolean.valueOf(value));
break;
case SCHIEBERAMSCH_JACKS_IN_SKAT:
setSchieberRamschJacksInSkat(Boolean.valueOf(value));
break;
case SHOW_TIPS_AT_START_UP:
setShowTipsAtStartUp(Boolean.valueOf(value));
break;
case WAIT_TIME_AFTER_TRICK:
setWaitTimeAfterTrick(Integer.valueOf(value));
break;
case HIDE_TOOLBAR:
setHideToolbar(Boolean.valueOf(value));
break;
case MAIN_FRAME_WIDTH:
setMainFrameWidth(Integer.valueOf(value));
break;
case MAIN_FRAME_HEIGHT:
setMainFrameHeight(Integer.valueOf(value));
break;
case MAIN_FRAME_X_POSITION:
setMainFrameXPosition(Integer.valueOf(value));
break;
case MAIN_FRAME_Y_POSITION:
setMainFrameYPosition(Integer.valueOf(value));
break;
}
}
private static void logEnumParseError(final Option option, final String defaultValue) {
log.warn("Parsing of option " + option.name() + " failed. Using default value: " + defaultValue); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Gets the language code for the language
*
* @return Language code
*/
public String getI18NCode() {
String result = "en"; //$NON-NLS-1$
if (SupportedLanguage.GERMAN.equals(getLanguage())) {
result = "de"; //$NON-NLS-1$
}
return result;
}
private void setOption(Option option, Boolean value) {
options.setProperty(option.propertyName(), value.toString());
}
private void setOption(Option option, CardSet value) {
options.setProperty(option.propertyName(), value.name());
}
private void setOption(Option option, Integer value) {
options.setProperty(option.propertyName(), value.toString());
}
private void setOption(Option option, RamschSkatOwner value) {
options.setProperty(option.propertyName(), value.name());
}
private void setOption(Option option, SavePath value) {
options.setProperty(option.propertyName(), value.name());
}
private void setOption(Option option, String value) {
options.setProperty(option.propertyName(), value);
}
private void setOption(Option option, SupportedLanguage value) {
options.setProperty(option.propertyName(), value.name());
}
private void setOption(Option option, RuleSet ruleSet) {
options.setProperty(option.propertyName(), ruleSet.name());
}
private void setOption(Option option, ContraCallingTime value) {
options.setProperty(option.propertyName(), value.name());
}
/**
* Sets the standard properties
*
*/
void setDefaultProperties() {
setOption(Option.HIDE_TOOLBAR, Boolean.FALSE);
setOption(Option.SHOW_TIPS_AT_START_UP, Boolean.TRUE);
setOption(Option.CHECK_FOR_NEW_VERSION_AT_START_UP, Boolean.FALSE);
setOption(Option.LANGUAGE, getDefaultLanguage());
setOption(Option.SAVE_PATH, SavePath.USER_HOME);
setOption(Option.CARD_SET, CardSet.ISS_TOURNAMENT);
setOption(Option.CHEAT_DEBUG_MODE, Boolean.FALSE);
setOption(Option.MAX_PLAYER_COUNT, 3);
setOption(Option.RULES, RuleSet.ISPA);
setOption(Option.PLAY_CONTRA, Boolean.TRUE);
setOption(Option.CONTRA_CALLING_TIME, ContraCallingTime.BEFORE_FIRST_CARD);
setOption(Option.CONTRA_AFTER_BID_18, Boolean.TRUE);
setOption(Option.PLAY_BOCK, Boolean.TRUE);
setOption(Option.BOCK_EVENT_LOST_GRAND, Boolean.TRUE);
setOption(Option.BOCK_EVENT_LOST_WITH_60, Boolean.TRUE);
setOption(Option.BOCK_EVENT_LOST_AFTER_CONTRA, Boolean.TRUE);
setOption(Option.BOCK_EVENT_CONTRA_RE_CALLED, Boolean.FALSE);
setOption(Option.BOCK_EVENT_MULTIPLE_OF_HUNDRED_SCORE, Boolean.FALSE);
setOption(Option.BOCK_EVENT_NO_BID, Boolean.FALSE);
setOption(Option.PLAY_RAMSCH, Boolean.TRUE);
setOption(Option.RAMSCH_EVENT_NO_BID, Boolean.TRUE);
setOption(Option.RAMSCH_EVENT_RAMSCH_AFTER_BOCK, Boolean.FALSE);
setOption(Option.RAMSCH_SKAT_OWNER, RamschSkatOwner.LAST_TRICK);
setOption(Option.SCHIEBERAMSCH, Boolean.TRUE);
setOption(Option.SCHIEBERAMSCH_JACKS_IN_SKAT, Boolean.FALSE);
setOption(Option.RAMSCH_GRAND_HAND_POSSIBLE, Boolean.TRUE);
setOption(Option.PLAY_REVOLUTION, Boolean.FALSE);
setOption(Option.ISS_ADDRESS, "skatgame.net"); //$NON-NLS-1$
setOption(Option.ISS_PORT, Integer.valueOf(7000));
setOption(Option.WAIT_TIME_AFTER_TRICK, Integer.valueOf(0));
setOption(Option.MAIN_FRAME_X_POSITION, Integer.MIN_VALUE);
setOption(Option.MAIN_FRAME_Y_POSITION, Integer.MIN_VALUE);
setOption(Option.MAIN_FRAME_WIDTH, Integer.MIN_VALUE);
setOption(Option.MAIN_FRAME_HEIGHT, Integer.MIN_VALUE);
}
/**
* Sets the flag for showing the welcome dialog with first steps at startup
*
* @param isShowTips
* TRUE, if first steps should be shown
*/
public void setShowTipsAtStartUp(final Boolean isShowTips) {
setOption(Option.SHOW_TIPS_AT_START_UP, isShowTips);
}
/**
* Gets any option as {@link String}
*
* @param option
* Option
* @return Value
*/
public String get(Option option) {
return getProperty(option);
}
/**
* Gets an option of type {@link String}
*
* @param option
* Option
* @return Value
*/
public String getString(Option option) {
if (option.clazz != String.class) {
throw new IllegalArgumentException("Option " + option + " is not a string option.");
}
return getProperty(option);
}
private String getProperty(Option option) {
return options.getProperty(option.propertyName());
}
/**
* Gets an option of type {@link Boolean}
*
* @param option
* Option
* @return Value
*/
public final Boolean getBoolean(final Option option) {
if (option.clazz != Boolean.class) {
throw new IllegalArgumentException("Option " + option + " is not a boolean option.");
}
return Boolean.valueOf(getProperty(option));
}
/**
* Gets an option of type {@link Integer}
*
* @param option
* Option
* @return Value
*/
public final Integer getInteger(final Option option) {
if (option.clazz != Integer.class) {
throw new IllegalArgumentException("Option " + option + " is not an integer option.");
}
return Integer.valueOf(getProperty(option));
}
/**
* Gets the time when contra calling is allowed.
*
* @return Time when contra calling is allowed
*/
public ContraCallingTime getContraCallingTime() {
return ContraCallingTime.valueOf(get(Option.CONTRA_CALLING_TIME));
}
/**
* Resets the options to default
*/
public void resetToDefault() {
setDefaultProperties();
}
public void setMainFrameSize(Dimension size) {
setOption(Option.MAIN_FRAME_WIDTH, (int) size.getWidth());
setOption(Option.MAIN_FRAME_HEIGHT, (int) size.getHeight());
}
public void setMainFramePosition(Point locationOnScreen) {
setOption(Option.MAIN_FRAME_X_POSITION, locationOnScreen.x);
setOption(Option.MAIN_FRAME_Y_POSITION, locationOnScreen.y);
}
}