package com.limegroup.gnutella.gui.options;
import java.io.IOException;
import javax.swing.JDialog;
import com.limegroup.gnutella.gui.GUIMediator;
import com.limegroup.gnutella.gui.themes.ThemeMediator;
import com.limegroup.gnutella.gui.themes.ThemeObserver;
import com.limegroup.gnutella.settings.SettingsHandler;
/**
* This class acts as a mediator for the different components of the options
* window. This class maintains references to the
* <tt>OptionsTreeManager</tt> and <tt>OptionsPaneManager</tt>, the two
* primary classes that it delegates to.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
public final class OptionsMediator implements ThemeObserver {
/**
* Constant for the key for the root node in the tree.
*/
public final static String ROOT_NODE_KEY = "OPTIONS_ROOT_NODE";
/**
* Singleton constant for easy access to the options mediator.
*/
private final static OptionsMediator INSTANCE =
new OptionsMediator();
/**
* Constant for the class that manages the current options pane
* displayed to the user. (It is fine to construct this here since
* they do not reference this class.)
*/
private static OptionsPaneManager _paneManager = null;
/**
* Constant for the class that manages the current options tree
* displayed to the user. (It is fine to construct this here since
* they do not reference this class.)
*/
private static OptionsTreeManager _treeManager = null;
/**
* Class that handles constructing all of the elements of the options
* windows.
*/
private static OptionsConstructor _constructor = null;
/**
* Singleton accessor for this class.
*
* @return the <tt>OptionsMediator</tt> instance
*/
public static synchronized OptionsMediator instance() {
return INSTANCE;
}
/**
* Private constructor to ensure that this class cannot be constructed
* from another class. The constructor does very little to alleviate
* construction conflicts with classes that may use the mediator.
*/
private OptionsMediator() {
GUIMediator.setSplashScreenString(
GUIMediator.getStringResource("SPLASH_STATUS_OPTIONS_WINDOW"));
ThemeMediator.addThemeObserver(this);
}
/**
* Makes the options window either visible or not visible depending
* on the boolean argument.
*
* @param visible <tt>boolean</tt> value specifying whether the
* options window should be made visible or not visible
*/
public final void setOptionsVisible(boolean visible) {
setOptionsVisible(visible, null);
}
/**
* Makes the options window either visible or not visible depending
* on the boolean argument.
*
* @param visible <tt>boolean</tt> value specifying whether the
* options window should be made visible or not visible
* @param key the unique identifying key of the panel to show
*/
public final void setOptionsVisible(boolean visible, final String key) {
if(_constructor == null) {
if(!visible)
return;
updateTheme();
}
_paneManager.initOptions();
_constructor.setOptionsVisible(visible, key);
}
/**
* Basically the inverse operation to {@link #updateTheme()}.
* <p>
* Is called from OptionsConstructor when the dialog is disposed.
*
*/
final void disposeOptions() {
_constructor = null;
_paneManager = null;
_treeManager = null;
}
/** Returns true if the Options Box is visible.
* @return true if the Options Box is visible.
*/
public final boolean isOptionsVisible() {
if(_constructor == null)
return false;
return _constructor.isOptionsVisible();
}
/**
* Handles the selection of a new panel as the currently visible panel.
*
* @param key the unique identifying key of the panel to show
*/
public final void handleSelection(final String key) {
_paneManager.show(key);
}
/**
* Sets the Options selection to the given key.
*/
public final void setSelection(final String key) {
// set value in tree
_treeManager.setSelection(key);
}
/**
* Applies the current settings in the options windows, storing them
* to disk. This method delegates to the <tt>OptionsPaneManager</tt>.
*
* @throws IOException if the options could not be fully applied
*/
public final void applyOptions() throws IOException {
_paneManager.applyOptions();
SettingsHandler.save();
}
/**
* Determines if any of the settings are dirty.
*/
public final boolean isDirty() {
if (_paneManager == null)
return false;
return _paneManager.isDirty();
}
/**
* Reverts options to their defaults.
*/
public final void revertOptions() {
SettingsHandler.revertToDefault();
GUIMediator.showMessage("OPTIONS_RESTART_REQUIRED");
}
/**
* Returns the main <tt>JDialog</tt> instance for the options window,
* allowing other components to position themselves accordingly.
*
* @return the main options <tt>JDialog</tt> window
*/
public JDialog getMainOptionsComponent() {
if (_constructor == null)
updateTheme();
return _constructor.getMainOptionsComponent();
}
// Implements ThemeObserver interface
public void updateTheme() {
_paneManager = new OptionsPaneManager();
_treeManager = new OptionsTreeManager();
_constructor = new OptionsConstructor(_treeManager,
_paneManager);
}
}