package com.limegroup.gnutella.gui.init;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.border.Border;
import com.limegroup.gnutella.gui.BoxPanel;
import com.limegroup.gnutella.gui.GUIMediator;
import com.limegroup.gnutella.gui.URLLabel;
/**
* This abstract class creates a <tt>JPanel</tt> that uses
* <tt>BoxLayout</tt> for setup windows. It defines many of the
* basic accessor and mutator methods required by subclasses.
*/
//2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678|
abstract class SetupWindow extends JPanel {
/**
* The width of the setup window.
*/
public static final int SETUP_WIDTH = 500;
/**
* The height of the setup window.
*/
public static final int SETUP_HEIGHT = 300;
/**
* Margin for the outside of the setup panel.
*/
public static final int MARGIN = 10;
/**
* Margin for the left side of the setup window.
*/
private final int SETUP_LEFT_MARGIN = 20;
/**
* Constant for the inner panel of a <tt>SetupWindow</tt>.
*/
private final JPanel INNER_PANEL = new BoxPanel(BoxPanel.Y_AXIS);;
/**
* Variable for the name of this window for use with <tt>CardLayout</tt>.
*/
private String _key;
/**
* Variable for the key of the label to display.
*/
private String _labelKey;
/**
* Variable for the caption for the window.
*/
private String _name;
/** Variable for the URL where more info exists. Null if none. */
private String _moreInfoURL;
/**
* Variable for the next window in the sequence.
*/
private SetupWindow _next;
/**
* Variable for the previous window in the sequence.
*/
private SetupWindow _previous;
/**
* Constant handle to the setup manager mediator class.
*/
protected final SetupManager _manager;
/**
* Creates a new setup window with the specified label.
*
* @param key the title of the window for use with <tt>CardLayout</tt>
* and for use in obtaining the locale-specific caption for this
* window
* @param labelKey the key for locale-specific label to be displayed
* in the window
*/
SetupWindow(final SetupManager manager, final String key,
final String labelKey) {
this(manager, key, labelKey, null);
}
/**
* Creates a new setup window with the specified label.
*
* @param key the title of the window for use with <tt>CardLayout</tt>
* and for use in obtaining the locale-specific caption for this
* window
* @param labelKey the key for locale-specific label to be displayed
* in the window
* @param String where more info about this option exists
*/
SetupWindow(SetupManager manager, String key, String labelKey, String moreInfoURL) {
_manager = manager;
_key = key;
_labelKey = labelKey;
_moreInfoURL = moreInfoURL;
}
protected void createWindow() {
removeAll();
INNER_PANEL.removeAll();
_name = GUIMediator.getStringResource(_key);
BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS);
setLayout(layout);
Border border =
BorderFactory.createEmptyBorder(MARGIN * 2,
MARGIN,
MARGIN,
MARGIN);
Border innerBorder =
BorderFactory.createEmptyBorder(0,
SETUP_LEFT_MARGIN,
0,
0);
setBorder(border);
INNER_PANEL.setBorder(innerBorder);
int totalMargin = MARGIN * 2;
Dimension size = new Dimension(SETUP_WIDTH - totalMargin, SETUP_HEIGHT - totalMargin);
setPreferredSize(size);
SetupLabel setupLabel = new SetupLabel(_labelKey);
add(setupLabel);
if(_moreInfoURL != null) {
JPanel panel = new BoxPanel(BoxPanel.X_AXIS);
panel.add(new URLLabel(_moreInfoURL, GUIMediator.getStringResource("SETUP_MORE_INFO")));
panel.add(Box.createHorizontalGlue());
panel.setBorder(BorderFactory.createEmptyBorder(0, MARGIN-4, MARGIN*2, 0));
add(panel);
}
add(INNER_PANEL);
}
/**
* Accessor for the name of the panel
*
* @return the unique identifying name for this panel
*/
public String getName() {return _name;}
/**
* Accessor for the unique identifying key of the window
* in the <tt>CardLayout</tt>.
*
* @return the unique identifying key for the window.
*/
public String getKey() {return _key;}
/**
* Mutator for the labelKey.
*/
protected void setLabelKey(String newKey) {
_labelKey = newKey;
}
/**
* Accessor for the next panel in the sequence.
*
* @return the next window in the sequence
*/
public SetupWindow getNext() {return _next;}
/**
* Accessor for the previous panel in the sequence.
*
* @return the previous window in the sequence
*/
public SetupWindow getPrevious() {return _previous;}
/**
* Sets the next SetupWindow in the sequence.
*
* @param previous the window to set as the previous window
*/
public void setNext(SetupWindow next) {_next = next;}
/**
* Sets the previous SetupWindow in the sequence.
*
* @param previous the window to set as the previous window
*/
public void setPrevious(SetupWindow previous) {_previous = previous;}
/**
* Called each time this window is opened.
*/
public void handleWindowOpeningEvent() {
createWindow();
if( _next == this )
_manager.goToFinishButtons();
else if ( _previous == this )
_manager.goToNextButtons();
else
_manager.goToStandardButtons();
}
/**
* Applies the settings currently set in this window.
*
* @throws ApplySettingsException if there was a problem applying the
* settings
*/
public void applySettings() throws ApplySettingsException {}
/**
* Adds a component to the inner panel of the window.
*
* @param setupComponent the <tt>Component</tt> to add to this window
*/
protected void addSetupComponent(Component setupComponent) {
INNER_PANEL.add(setupComponent);
}
}