package com.limegroup.gnutella.gui.options;
import java.awt.Container;
import java.io.IOException;
import java.util.ArrayList;
import com.limegroup.gnutella.gui.BoxPanel;
import com.limegroup.gnutella.gui.options.panes.PaneItem;
/**
* This class provides a skeletal implementation of the <tt>OptionsPane</tt>
* interface, providing common functionality to its subclasses.<p>
*
* It contains an <tt>ArrayList</tt> of <tt>PaneItem</tt> instances to
* forward any request to apply the current options.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
final class OptionsPaneImpl implements OptionsPane {
/**
* Constant for the <tt>Container</tt> that elements are added to. This
* is implemented as a <tt>BoxPanel</tt>.
*/
private final Container CONTAINER = new BoxPanel();
/**
* Constant for the <tt>ArrayList</tt> that contains all of the
* <tt>PaneItem</tt> instances associated with this panel.
*/
private final ArrayList PANE_ITEMS_LIST = new ArrayList();
/**
* <tt>String</tt> for the name of this panel. This name is used as the
* key for identifying this panel in the <tt>CardLayout</tt>.
*/
private String _name;
/**
* This sole constructor overrides the the public accessibility of the
* default constructor and is usually called implicitly by subclasses.
*
* @param name the unique identifying name of this
* <tt>AbstractOptionsPane</tt>
*/
OptionsPaneImpl(final String name) {
_name = name;
}
/**
* Implements the OptionsPane interface.<p>
*
* Returns the name associated with this <tt>OptionsPane</tt>.
*
* @return the name associated with this <tt>OptionsPane</tt>
*/
public String getName() {
return _name;
}
/**
* Implements the OptionsPane interface.<p>
*
* Returns the <tt>Container</tt> instance associated with this
* <tt>OptionsPane</tt>.
*
* @return the <tt>Container</tt> associated with this <tt>OptionsPane</tt>
*/
public Container getContainer() {
return CONTAINER;
}
/**
* Implements the OptionsPane interface.<p>
*
* Sets the options for each <tt>PaneItem</tt> instance in the
* <tt>ArrayList</tt> of <tt>PaneItem</tt>s when the window is shown.
*/
public void initOptions() {
for(int i=0, size = PANE_ITEMS_LIST.size(); i<size; i++) {
PaneItem currentItem = (PaneItem)PANE_ITEMS_LIST.get(i);
currentItem.initOptions();
}
}
/**
* Implements the OptionsPane interface.<p>
*
* Applies the currently selected options to the <tt>ArrayList</tt> of
* <tt>PaneItem</tt> instances that have been added to this panel.
*
* @return <code>true</code> if one the changed settings requires a restart
* of the application.
* @throws IOException if the options could not be fully applied
*/
public boolean applyOptions() throws IOException {
boolean restartRequired = false;
for(int i=0, size = PANE_ITEMS_LIST.size(); i<size; i++) {
PaneItem currentItem = (PaneItem)PANE_ITEMS_LIST.get(i);
restartRequired |= currentItem.applyOptions();
}
return restartRequired;
}
/**
* Determines if any of the panes stored within this OptionPane
* require saving.
*/
public boolean isDirty() {
for(int i = 0, size = PANE_ITEMS_LIST.size(); i < size; i++) {
PaneItem currentItem = (PaneItem)PANE_ITEMS_LIST.get(i);
if(currentItem.isDirty())
return true;
}
return false;
}
/**
* Add the <tt>Container</tt>s of the <tt>PaneItem</tt> object to the
* <tt>OptionsPane</tt> and also <i>registers</i> that pane
* with this class, which means that it is added to the <tt>ArrayList</tt>
* of contained <tt>PaneItem</tt> instances.
*
* @param item the <tt>PaneItem</tt> instance to add
*/
public final void add(PaneItem item) {
PANE_ITEMS_LIST.add(item);
CONTAINER.add(item.getContainer());
}
}