/****************************************************************************** * Copyright (c) 2016 Oracle * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Konstantin Komissarchik - initial implementation and ongoing maintenance * Ling Hao - [bugzilla 329114] rewrite context help binding feature ******************************************************************************/ package org.eclipse.sapphire.ui.forms.swt; import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdfill; import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.glayout; import static org.eclipse.sapphire.ui.forms.swt.SwtUtil.toImageDescriptor; import org.eclipse.help.IContext; import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.jface.wizard.IWizardContainer2; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.sapphire.Disposable; import org.eclipse.sapphire.Event; import org.eclipse.sapphire.Listener; import org.eclipse.sapphire.modeling.Status; import org.eclipse.sapphire.ui.PartValidationEvent; import org.eclipse.sapphire.ui.Presentation; import org.eclipse.sapphire.ui.SapphirePart; import org.eclipse.sapphire.ui.SapphirePart.DescriptionChangedEvent; import org.eclipse.sapphire.ui.SapphirePart.LabelChangedEvent; import org.eclipse.sapphire.ui.def.ISapphireDocumentation; import org.eclipse.sapphire.ui.def.ISapphireDocumentationDef; import org.eclipse.sapphire.ui.def.ISapphireDocumentationRef; import org.eclipse.sapphire.ui.forms.WizardPagePart; import org.eclipse.sapphire.ui.forms.swt.internal.CompositePresentation; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.PlatformUI; /** * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> */ public class SapphireWizardPage extends WizardPage implements Disposable { private final WizardPagePart part; private final Listener listener; public SapphireWizardPage( final WizardPagePart part ) { super( part.definition().getId().content() ); this.part = part; setTitle( this.part.getLabel() ); setDescription( this.part.getDescription() ); this.listener = new Listener() { @Override public void handle( final Event event ) { if( event instanceof SapphirePart.ImageChangedEvent ) { refreshImage(); } else if( event instanceof PartValidationEvent ) { refreshValidation(); } else if( event instanceof LabelChangedEvent ) { refreshTitle(); } else if( event instanceof DescriptionChangedEvent ) { refreshDescription(); } } }; this.part.attach( this.listener ); refreshImage(); refreshValidation(); } public void createControl( final Composite parent ) { final Composite composite = new Composite( parent, SWT.NONE ); composite.setLayoutData( gdfill() ); composite.setLayout( glayout( 1, 0, 0 ) ); final Composite innerComposite = new Composite( composite, SWT.NONE ); innerComposite.setLayout( glayout( 2, 0, 0 ) ); innerComposite.setLayoutData( gdfill() ); final Presentation presentation = new CompositePresentation( this.part, null, innerComposite ) { @Override public void layout() { super.layout(); final IWizardContainer container = getContainer(); if( container instanceof IWizardContainer2 ) { ( (IWizardContainer2) container ).updateSize(); } } }; presentation.render(); final ISapphireDocumentation doc = this.part.definition().getDocumentation().content(); if( doc != null ) { ISapphireDocumentationDef docdef = null; if( doc instanceof ISapphireDocumentationDef ) { docdef = (ISapphireDocumentationDef) doc; } else { docdef = ( (ISapphireDocumentationRef) doc ).resolve(); } if( docdef != null ) { HelpSystem.setHelp( composite, docdef ); } } setControl( composite ); } public final void performHelp() { final IContext documentationContext = this.part.getDocumentationContext(); if ( documentationContext != null ) { PlatformUI.getWorkbench().getHelpSystem().displayHelp( documentationContext ); } } @Override public void setVisible( final boolean visible ) { super.setVisible( visible ); if( visible ) { final String initialFocusProperty = this.part.definition().getInitialFocus().content(); if( initialFocusProperty != null ) { this.part.setFocus( initialFocusProperty ); } else { this.part.setFocus(); } } } private final void refreshImage() { setImageDescriptor( toImageDescriptor( this.part.getImage() ) ); } private final void refreshTitle() { setTitle( this.part.getLabel() ); } private final void refreshDescription() { setDescription( this.part.getDescription() ); } private final void refreshValidation() { final Status st = this.part.validation(); if( st.severity() == Status.Severity.ERROR ) { setMessage( st.message(), ERROR ); setPageComplete( false ); } else if( st.severity() == Status.Severity.WARNING ) { setMessage( st.message(), WARNING ); setPageComplete( true ); } else { setMessage( null ); setPageComplete( true ); } } @Override public void dispose() { super.dispose(); this.part.detach( this.listener ); } }