/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.impl.gui.customcontrols.wizard;
import java.beans.*;
import java.util.*;
import javax.swing.*;
import net.java.sip.communicator.service.gui.*;
/**
* The model for the Wizard component, which tracks the text, icons, and
* enabled state of each of the buttons, as well as the current panel that
* is displayed. Note that the model, in its current form, is not intended
* to be sub-classed.
*
* @author Yana Stamcheva
*/
public class WizardModel
{
/**
* Identification string for the current panel.
*/
public static final String CURRENT_PAGE_PROPERTY
= "currentPageProperty";
/**
* Property identification String for the Back button's text
*/
public static final String BACK_BUTTON_TEXT_PROPERTY
= "backButtonTextProperty";
/**
* Property identification String for the Back button's icon
*/
public static final String BACK_BUTTON_ICON_PROPERTY
= "backButtonIconProperty";
/**
* Property identification String for the Back button's enabled state
*/
public static final String BACK_BUTTON_ENABLED_PROPERTY
= "backButtonEnabledProperty";
/**
* Property identification String for the Next button's text
*/
public static final String NEXT_FINISH_BUTTON_TEXT_PROPERTY
= "nextButtonTextProperty";
/**
* Property identification String for the Next button's icon
*/
public static final String NEXT_FINISH_BUTTON_ICON_PROPERTY
= "nextButtonIconProperty";
/**
* Property identification String for the Next button's enabled state
*/
public static final String NEXT_FINISH_BUTTON_ENABLED_PROPERTY
= "nextButtonEnabledProperty";
/**
* Property identification String for the Cancel button's text
*/
public static final String CANCEL_BUTTON_TEXT_PROPERTY
= "cancelButtonTextProperty";
/**
* Property identification String for the Cancel button's icon
*/
public static final String CANCEL_BUTTON_ICON_PROPERTY
= "cancelButtonIconProperty";
/**
* Property identification String for the Cancel button's enabled state
*/
public static final String CANCEL_BUTTON_ENABLED_PROPERTY
= "cancelButtonEnabledProperty";
private WizardPage currentPanel;
private final Map<Object, WizardPage> panelHashmap
= new HashMap<Object, WizardPage>();
private final Map<String, Object> buttonTextHashmap
= new HashMap<String, Object>();
private final Map<String, Icon> buttonIconHashmap
= new HashMap<String, Icon>();
private final Map<String, Boolean> buttonEnabledHashmap
= new HashMap<String, Boolean>();
private final PropertyChangeSupport propertyChangeSupport;
/**
* Default constructor.
*/
public WizardModel()
{
propertyChangeSupport = new PropertyChangeSupport(this);
}
/**
* Returns the currently displayed WizardPage.
* @return The currently displayed WizardPage
*/
WizardPage getCurrentWizardPage()
{
return currentPanel;
}
/**
* Registers the WizardPage in the model using the
* Object-identifier specified.
* @param id Object-based identifier
* @param page WizardPage that describes the panel
*/
void registerPage(Object id, WizardPage page)
{
panelHashmap.put(id, page);
}
/**
* Unregisters the <tt>WizardPage</tt> corresponding to the given id.
*
* @param id The id of the <tt>WizardPage</tt>.
*/
void unregisterPage(Object id)
{
panelHashmap.remove(id);
}
/**
* Returns the <tt>WizardPage</tt> corresponding to the given identifier.
* @param id The identifier of the page.
* @return the <tt>WizardPage</tt> corresponding to the given identifier.
*/
WizardPage getWizardPage(Object id)
{
return panelHashmap.get(id);
}
Iterator<Map.Entry<Object, WizardPage>> getAllPages()
{
return panelHashmap.entrySet().iterator();
}
/**
* Sets the current panel to that identified by the Object passed in.
* @param id Object-based panel identifier
* @return boolean indicating success or failure
*/
boolean setCurrentPanel(Object id)
{
// First, get the hashtable reference to the panel that should
// be displayed.
WizardPage nextPanel = panelHashmap.get(id);
// If we couldn't find the panel that should be displayed, return
// false.
if (nextPanel == null)
throw new WizardPanelNotFoundException();
WizardPage oldPanel = currentPanel;
currentPanel = nextPanel;
if (oldPanel != currentPanel)
{
firePropertyChange(CURRENT_PAGE_PROPERTY,
oldPanel, currentPanel);
}
return true;
}
/**
* Returns the text for the Back button.
* @return the text for the Back button.
*/
Object getBackButtonText()
{
return buttonTextHashmap.get(BACK_BUTTON_TEXT_PROPERTY);
}
/**
* Sets the text for the back button.
* @param newText The text to set.
*/
void setBackButtonText(Object newText)
{
Object oldText = getBackButtonText();
if (!newText.equals(oldText)) {
buttonTextHashmap.put(BACK_BUTTON_TEXT_PROPERTY, newText);
firePropertyChange(BACK_BUTTON_TEXT_PROPERTY, oldText, newText);
}
}
/**
* Returns the text for the Next/Finish button.
* @return the text for the Next/Finish button.
*/
Object getNextFinishButtonText()
{
return buttonTextHashmap.get(NEXT_FINISH_BUTTON_TEXT_PROPERTY);
}
void setNextFinishButtonText(Object newText)
{
Object oldText = getNextFinishButtonText();
if (!newText.equals(oldText))
{
buttonTextHashmap.put(NEXT_FINISH_BUTTON_TEXT_PROPERTY, newText);
firePropertyChange(NEXT_FINISH_BUTTON_TEXT_PROPERTY,
oldText, newText);
}
}
/**
* Returns the text for the Cancel button.
* @return the text for the Cancel button.
*/
Object getCancelButtonText()
{
return buttonTextHashmap.get(CANCEL_BUTTON_TEXT_PROPERTY);
}
/**
* Sets the text for the Cancel button.
* @param newText The text to set.
*/
void setCancelButtonText(Object newText)
{
Object oldText = getCancelButtonText();
if (!newText.equals(oldText)) {
buttonTextHashmap.put(CANCEL_BUTTON_TEXT_PROPERTY, newText);
firePropertyChange(CANCEL_BUTTON_TEXT_PROPERTY, oldText, newText);
}
}
/**
* Returns the icon for the Back button.
* @return the icon for the Back button.
*/
Icon getBackButtonIcon()
{
return buttonIconHashmap.get(BACK_BUTTON_ICON_PROPERTY);
}
/**
* Sets the icon for the Back button.
* @param newIcon The new icon to set.
*/
void setBackButtonIcon(Icon newIcon)
{
Object oldIcon = getBackButtonIcon();
if (!newIcon.equals(oldIcon))
{
buttonIconHashmap.put(BACK_BUTTON_ICON_PROPERTY, newIcon);
firePropertyChange(BACK_BUTTON_ICON_PROPERTY, oldIcon, newIcon);
}
}
/**
* Returns the icon for the Next/Finish button.
* @return the icon for the Next/Finish button.
*/
Icon getNextFinishButtonIcon()
{
return buttonIconHashmap.get(NEXT_FINISH_BUTTON_ICON_PROPERTY);
}
/**
* Sets the icon for the Next/Finish button.
* @param newIcon The new icon to set.
*/
public void setNextFinishButtonIcon(Icon newIcon)
{
Object oldIcon = getNextFinishButtonIcon();
if (!newIcon.equals(oldIcon)) {
buttonIconHashmap.put(NEXT_FINISH_BUTTON_ICON_PROPERTY, newIcon);
firePropertyChange(NEXT_FINISH_BUTTON_ICON_PROPERTY,
oldIcon, newIcon);
}
}
/**
* Returns the icon for the Cancel button.
* @return the icon for the Cancel button.
*/
Icon getCancelButtonIcon()
{
return buttonIconHashmap.get(CANCEL_BUTTON_ICON_PROPERTY);
}
/**
* Sets the icon for the Cancel button.
* @param newIcon The new icon to set.
*/
void setCancelButtonIcon(Icon newIcon)
{
Icon oldIcon = getCancelButtonIcon();
if (!newIcon.equals(oldIcon)) {
buttonIconHashmap.put(CANCEL_BUTTON_ICON_PROPERTY, newIcon);
firePropertyChange(CANCEL_BUTTON_ICON_PROPERTY, oldIcon, newIcon);
}
}
/**
* Checks if the Back button is enabled.
* @return <code>true</code> if the Back button is enabled,
* <code>false</code> otherwise.
*/
Boolean getBackButtonEnabled()
{
return buttonEnabledHashmap.get(BACK_BUTTON_ENABLED_PROPERTY);
}
/**
* Enables or disables the Back button.
* @param enabled <code>true</code> to enable the Back button,
* <code>false</code> to disable it.
*/
void setBackButtonEnabled(boolean enabled)
{
Boolean newValue = enabled;
Boolean oldValue = getBackButtonEnabled();
if (!newValue.equals(oldValue))
{
buttonEnabledHashmap.put(BACK_BUTTON_ENABLED_PROPERTY, newValue);
firePropertyChange(BACK_BUTTON_ENABLED_PROPERTY,
oldValue, newValue);
}
}
/**
* Checks if the Next/Finish button is enabled.
* @return <code>true</code> if the Next/Finish button is enabled,
* <code>false</code> otherwise.
*/
Boolean getNextFinishButtonEnabled()
{
return buttonEnabledHashmap.get(NEXT_FINISH_BUTTON_ENABLED_PROPERTY);
}
/**
* Enables or disables the Next/Finish button.
* @param enabled <code>true</code> to enable the Next/Finish button,
* <code>false</code> to disable it.
*/
void setNextFinishButtonEnabled(boolean enabled)
{
Boolean newValue = enabled;
Boolean oldValue = getNextFinishButtonEnabled();
if (!newValue.equals(oldValue))
{
buttonEnabledHashmap.put(
NEXT_FINISH_BUTTON_ENABLED_PROPERTY, newValue);
firePropertyChange(NEXT_FINISH_BUTTON_ENABLED_PROPERTY,
oldValue, newValue);
}
}
/**
* Checks if the Cancel button is enabled.
* @return <code>true</code> if the Cancel button is enabled,
* <code>false</code> otherwise.
*/
Boolean getCancelButtonEnabled()
{
return buttonEnabledHashmap.get(CANCEL_BUTTON_ENABLED_PROPERTY);
}
/**
* Enables or disables the Cancel button.
* @param enabled <code>true</code> to enable the Cancel button,
* <code>false</code> to disable it.
*/
void setCancelButtonEnabled(boolean enabled)
{
Boolean newValue = enabled;
Boolean oldValue = getCancelButtonEnabled();
if (!newValue.equals(oldValue))
{
buttonEnabledHashmap.put(CANCEL_BUTTON_ENABLED_PROPERTY, newValue);
firePropertyChange(CANCEL_BUTTON_ENABLED_PROPERTY,
oldValue, newValue);
}
}
/**
* Adds a <tt>PropertyChangeListener</tt>
* @param p The <tt>PropertyChangeListener</tt> to add.
*/
public void addPropertyChangeListener(PropertyChangeListener p)
{
propertyChangeSupport.addPropertyChangeListener(p);
}
/**
* Removes a <tt>PropertyChangeListener</tt>
* @param p The <tt>PropertyChangeListener</tt> to remove.
*/
public void removePropertyChangeListener(PropertyChangeListener p)
{
propertyChangeSupport.removePropertyChangeListener(p);
}
/**
* Informs all<tt>PropertyChangeListener</tt>s that the a given property
* has changed.
* @param propertyName The name of the property.
* @param oldValue The old property value.
* @param newValue The new property value.
*/
protected void firePropertyChange(String propertyName,
Object oldValue, Object newValue)
{
propertyChangeSupport.firePropertyChange(propertyName,
oldValue, newValue);
}
}