/******************************************************************************
* Copyright (c) 2016 Oracle and Other Contributors
* 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 - [329114] rewrite context help binding feature
* Greg Amerson - [343972] Support image in editor page header
******************************************************************************/
package org.eclipse.sapphire.ui.forms.swt;
import static org.eclipse.sapphire.ui.forms.swt.SwtUtil.toImageDescriptor;
import java.util.Collections;
import org.eclipse.sapphire.Element;
import org.eclipse.sapphire.Event;
import org.eclipse.sapphire.ImageData;
import org.eclipse.sapphire.Listener;
import org.eclipse.sapphire.modeling.CapitalizationType;
import org.eclipse.sapphire.modeling.localization.LabelTransformer;
import org.eclipse.sapphire.ui.SapphireEditor;
import org.eclipse.sapphire.ui.SapphireEditorPagePart;
import org.eclipse.sapphire.ui.SapphireEditorPagePart.PageHeaderImageEvent;
import org.eclipse.sapphire.ui.SapphireEditorPagePart.PageHeaderTextEvent;
import org.eclipse.sapphire.ui.SapphirePart;
import org.eclipse.sapphire.ui.def.DefinitionLoader;
import org.eclipse.sapphire.ui.def.EditorPageDef;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.ScrolledForm;
/**
* @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a>
*/
public abstract class SapphireEditorFormPage extends FormPage implements EditorPagePresentation
{
private final SapphireEditor editor;
private Element element;
private DefinitionLoader.Reference<EditorPageDef> definition;
private SapphireEditorPagePart part;
public SapphireEditorFormPage( final SapphireEditor editor,
final Element element,
final DefinitionLoader.Reference<EditorPageDef> definition )
{
super( editor, null, null );
if( element == null )
{
throw new IllegalArgumentException();
}
if( definition == null )
{
throw new IllegalArgumentException();
}
this.editor = editor;
this.element = element;
this.definition = definition;
this.part = (SapphireEditorPagePart) SapphirePart.create( editor, this.element, this.definition.resolve(), Collections.<String,String>emptyMap() );
this.part.attach
(
new Listener()
{
@Override
public void handle( final Event event )
{
if( event instanceof PageHeaderTextEvent )
{
refreshPageHeaderText();
}
else if( event instanceof PageHeaderImageEvent )
{
refreshPageHeaderImage();
}
}
}
);
}
public final SapphireEditor getEditor()
{
return this.editor;
}
public SapphireEditorPagePart getPart()
{
return this.part;
}
public final Element getModelElement()
{
return this.part.getModelElement();
}
@Override
public void createPartControl( final Composite parent )
{
super.createPartControl( parent );
refreshPageHeaderText();
refreshPageHeaderImage();
}
private final void refreshPageHeaderText()
{
if( getManagedForm() != null )
{
final ScrolledForm form = getManagedForm().getForm();
form.setText( LabelTransformer.transform( this.part.getPageHeaderText(), CapitalizationType.TITLE_STYLE, false ) );
}
}
private final void refreshPageHeaderImage()
{
if( getManagedForm() != null )
{
final ScrolledForm form = getManagedForm().getForm();
final Image oldImage = form.getImage();
if( oldImage != null )
{
oldImage.dispose();
}
final ImageData newImageData = this.part.getPageHeaderImage();
if( newImageData == null )
{
form.setImage( null );
}
else
{
form.setImage( toImageDescriptor( newImageData ).createImage() );
}
}
}
@Override
public void dispose()
{
super.dispose();
if( getManagedForm() != null )
{
final Image image = getManagedForm().getForm().getImage();
if( image != null )
{
image.dispose();
}
}
this.element = null;
this.part.dispose();
this.part = null;
this.definition.dispose();
this.definition = null;
}
public abstract String getId();
}