/*
* 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.awt.event.*;
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.gui.*;
/**
* This class is responsible for reacting to events generated by pushing any
* of the three buttons, 'Next', 'Previous', and 'Cancel.' Based on what
* button is pressed, the controller will update the model to show a new panel
* and reset the state of the buttons as necessary.
*
* @author Yana Stamcheva
*/
public class WizardController implements ActionListener
{
private Wizard wizard;
/**
* This constructor accepts a reference to the Wizard component that created
* it, which it uses to update the button components and access the
* WizardModel.
* @param w A callback to the Wizard component that created this controller.
*/
public WizardController(Wizard w) {
wizard = w;
}
/**
* Calling method for the action listener interface. This class listens for
* actions performed by the buttons in the Wizard class, and calls methods
* below to determine the correct course of action.
* @param evt The ActionEvent that occurred.
*/
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getActionCommand().equals(
Wizard.CANCEL_BUTTON_ACTION_COMMAND))
cancelButtonPressed();
else if (evt.getActionCommand().equals(
Wizard.BACK_BUTTON_ACTION_COMMAND))
backButtonPressed();
else if (evt.getActionCommand().equals(
Wizard.NEXT_BUTTON_ACTION_COMMAND))
nextButtonPressed();
}
/**
* Closes the wizard by specifying the appropriate return code, when user
* has pressed the "Cancel" button.
*/
private void cancelButtonPressed() {
wizard.close(Wizard.CANCEL_RETURN_CODE);
}
/**
* If it is a finishable panel, closes the dialog. Otherwise, gets the
* ID that the current panel identifies as the next panel, and displays
* the panel that it's identifying.
*/
private void nextButtonPressed()
{
wizard.startCommittingPage();
new Thread(new PageCommitThread()).start();
}
/**
* Gets the descriptor that the current panel identifies as the previous
* panel, and displays the panel that it's identifying.
*/
private void backButtonPressed() {
WizardModel model = wizard.getModel();
WizardPage page = model.getCurrentWizardPage();
page.pageBack();
Object backPageIdentifier = page.getBackPageIdentifier();
wizard.setCurrentPage(backPageIdentifier);
}
/**
* Resets the buttons to support the original panel rules, including
* whether the next or back buttons are enabled or disabled, or if
* the panel is finish-able. If the panel in question has another panel
* behind it, enables the back button. Otherwise, disables it. If the
* panel in question has one or more panels in front of it, enables the
* next button. Otherwise, disables it.
*/
void resetButtonsToPanelRules()
{
WizardModel model = wizard.getModel();
WizardPage page = model.getCurrentWizardPage();
model.setCancelButtonText(wizard.getCancelButtonDefaultText());
Object backPageIdentifier = page.getBackPageIdentifier();
model.setBackButtonEnabled(
(backPageIdentifier != null)
&& !WizardPage.DEFAULT_PAGE_IDENTIFIER.equals(backPageIdentifier));
model.setBackButtonText(wizard.getBackButtonDefaultText());
model.setNextFinishButtonEnabled(page.getNextPageIdentifier() != null);
if (page.getNextPageIdentifier().equals(
WizardPage.FINISH_PAGE_IDENTIFIER)) {
model.setNextFinishButtonText(wizard.getFinishButtonDefaultText());
} else {
model.setNextFinishButtonText(wizard.getNextButtonDefaultText());
}
}
/**
* Runs committing page in new thread to avoid blocking UI thread.
*/
private class PageCommitThread
implements Runnable
{
/**
* Commits wizard page.
*/
public void run()
{
WizardModel model = wizard.getModel();
final WizardPage page = model.getCurrentWizardPage();
try
{
page.commitPage();
}
catch (Exception ex)
{
wizard.stopCommittingPage();
//lots of things may fail on page next, like for example parameter
//validation or account initialization. If this is what happened here
//just show an error and leave everything on the same page so that
//the user would have the chance to correct errors.
new ErrorDialog(
null,
GuiActivator.getResources().getI18NString(
"service.gui.ERROR"),
ex.getMessage(),
ex)
.showDialog();
return;
}
wizard.stopCommittingPage();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Object nextPageIdentifier = page.getNextPageIdentifier();
if (nextPageIdentifier
.equals(WizardPage.FINISH_PAGE_IDENTIFIER))
{
wizard.close(Wizard.FINISH_RETURN_CODE);
}
else
{
wizard.setCurrentPage(nextPageIdentifier);
}
}
});
}
}
}