/* * Copyright (c) 2009, Paul Merlin. All Rights Reserved. * * 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 org.swing.on.steroids.wizard.swing; import com.google.inject.Inject; import java.awt.Component; import java.awt.EventQueue; import java.awt.Frame; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.swing.on.steroids.views.handlers.HasButtonBehavior; import org.swing.on.steroids.swing.BaseSwingFrameView; import org.swing.on.steroids.swing.SwingWrappersFactory; import org.swing.on.steroids.swing.helpers.SwingHelper; import org.swing.on.steroids.swing.notifications.FrameTitleHasStringValue; import org.swing.on.steroids.views.values.HasValue; import org.swing.on.steroids.wizard.model.WizardModel; import org.swing.on.steroids.wizard.model.WizardPageID; import org.swing.on.steroids.wizard.views.WizardBlockingView; import org.swing.on.steroids.wizard.views.WizardPageView; import org.swing.on.steroids.wizard.views.WizardView; import org.swing.on.steroids.wizard.swing.components.SwingWizardBlockingGlassPane; import org.swing.on.steroids.wizard.swing.components.SwingWizardButtonBarPanel; import org.swing.on.steroids.wizard.swing.components.SwingWizardFrame; import org.swing.on.steroids.wizard.swing.components.SwingWizardPagesStackPanel; import org.swing.on.steroids.wizard.swing.components.SwingWizardStepsPanel; /** * @author Paul Merlin */ public class SwingWizardView<M extends WizardModel> extends BaseSwingFrameView implements WizardView<M> { private SwingWizardFrame delegate; private SwingWizardBlockingGlassPane blockingGlassPane; private HasValue<String> wizardTitle; private SwingWizardStepsPanel stepsPanel; private final List<String> steps = new ArrayList<String>(); private String currentStep; private SwingWizardPagesStackPanel pagesStackPanel; private final List<WizardPageView> pageViewsArray = new ArrayList<WizardPageView>(); private final Map<WizardPageID, WizardPageView> pageViews = new HashMap<WizardPageID, WizardPageView>(); private WizardPageView currentPageView; private SwingWizardButtonBarPanel buttonBarPanel; private HasButtonBehavior cancel; private HasButtonBehavior previous; private HasButtonBehavior next; private HasButtonBehavior finish; @Inject public SwingWizardView( final SwingWrappersFactory swingWrappersFactory ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { delegate = new SwingWizardFrame(); blockingGlassPane = new SwingWizardBlockingGlassPane(); wizardTitle = new FrameTitleHasStringValue( delegate ); stepsPanel = new SwingWizardStepsPanel(); pagesStackPanel = new SwingWizardPagesStackPanel(); buttonBarPanel = new SwingWizardButtonBarPanel(); cancel = swingWrappersFactory.createJButtonHasButtonBehavior( buttonBarPanel.cancel() ); previous = swingWrappersFactory.createJButtonHasButtonBehavior( buttonBarPanel.previous() ); next = swingWrappersFactory.createJButtonHasButtonBehavior( buttonBarPanel.next() ); finish = swingWrappersFactory.createJButtonHasButtonBehavior( buttonBarPanel.finish() ); delegate.setGlassPane( blockingGlassPane ); delegate.setButtonBarComponent( buttonBarPanel ); delegate.setStepsComponent( stepsPanel ); delegate.setPagesStackComponent( pagesStackPanel ); } } ); } @Override public HasValue<String> title() { return wizardTitle; } @Override public void setSteps( final Iterable<String> titles ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { steps.clear(); stepsPanel.clearSteps(); for ( String eachTitle : titles ) { steps.add( eachTitle ); stepsPanel.addStep( eachTitle ); } } } ); } @Override public void addStep( final String title ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { if ( steps.isEmpty() || !steps.get( steps.size() - 1 ).equals( title ) ) { steps.add( title ); stepsPanel.addStep( title ); } } } ); } @Override public void setCurrentStep( final String title ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { if ( !steps.contains( title ) ) { throw new IllegalArgumentException( "Unknown step: " + title ); } currentStep = title; stepsPanel.setCurrent( steps.indexOf( currentStep ) ); } } ); } @Override public void addPageView( final WizardPageID wizardPageID, final WizardPageView pageView ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { if ( pageViewsArray.contains( pageView ) ) { throw new IllegalStateException( "Page view already added" ); } pageViewsArray.add( pageView ); pageViews.put( wizardPageID, pageView ); } } ); } @Override public void showPage( final WizardPageID wizardPageID ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { currentPageView = pageViews.get( wizardPageID ); pagesStackPanel.setPageComponent( ( Component ) currentPageView.uiComponent() ); } } ); } @Override public void showBlockingView( final WizardBlockingView blockingView ) { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { blockingGlassPane.setBlockingComponent( ( Component ) blockingView.uiComponent() ); blockingGlassPane.setVisible( true ); } } ); } @Override public void removeBlockingView() { SwingHelper.invokeAndWait( new Runnable() { @Override public void run() { blockingGlassPane.setVisible( false ); } } ); } @Override public HasButtonBehavior cancelButton() { return cancel; } @Override public HasButtonBehavior previousButton() { return previous; } @Override public HasButtonBehavior nextButton() { return next; } @Override public HasButtonBehavior finishButton() { return finish; } @Override protected Frame delegate() { return delegate; } }