package org.limewire.ui.swing.options;
import java.awt.Color;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;
import net.miginfocom.swing.MigLayout;
/**
* Abstract Option panel for initializing and saving the options within the
* panel. When constructing a specific instance of the class, make sure the option tab item
* which may hold the panel is specifically set.
*
* @see #setOptionTabItem(OptionTabItem)
*/
public abstract class OptionPanel extends JPanel {
/**
* This class keeps track of the results of an option panel when applied.
*/
public static class ApplyOptionResult {
private boolean restartRequired = false;
/**
* Assume by default operation will be always be successful. This is
* required, otherwise, {@link #updateSuccessful(boolean)} will not correctly work
*/
private boolean successful = true;
/**
* Configures the result of options applied
*
* @param restartReq <code>true</code> if restart is required
* @param isSuccess <code>true</code> if options were successfully
* applied
*/
ApplyOptionResult(final boolean restartReq, final boolean isSuccess) {
updateRestart(restartReq);
updateSuccessful(isSuccess);
}
public void applyResult(final ApplyOptionResult applyOptions) {
updateRestart(applyOptions.isRestartRequired());
updateSuccessful(applyOptions.isSuccessful());
}
public boolean isRestartRequired() {
return restartRequired;
}
public boolean isSuccessful() {
return successful;
}
public void updateRestart(final boolean restartRequired) {
this.restartRequired = isRestartRequired() || restartRequired;
}
public void updateSuccessful(final boolean successful) {
this.successful = isSuccessful() && successful;
}
}
/** The tab item which holds this option panel **/
private OptionTabItem optionTabItem = null;
public OptionPanel() {
}
public OptionPanel(final String title) {
setBorder(BorderFactory.createTitledBorder(null, title,
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION,
new Font("Dialog", Font.BOLD, 12), new Color(0x313131)));
setLayout(new MigLayout("insets 4, fill, nogrid"));
setOpaque(false);
}
/**
* Initializes the options for this panel. Listeners should not be attached
* in this method. It will be called multiple times as the options dialog is
* brought up. To prevent memory leaks or recreating the same components
* this method should only setup the options and rearrange components as
* necessary. More heavy weight tasks that should only be done once should
* be done in the constructor.
*/
public abstract void initOptions();
abstract ApplyOptionResult applyOptions();
abstract boolean hasChanged();
/**
* Sets the parent tab which holds this option panel The panel may use the
* tab item to flip the panel, making it the active visible panel.
*
* @param tab the parent option tab
* @see OptionsDialog
*/
void setOptionTabItem(OptionTabItem tab) {
this.optionTabItem = tab;
}
OptionTabItem getOptionTabItem(){
return this.optionTabItem;
}
}