/******************************************************************************
* Copyright (c) 2013 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
*
******************************************************************************/
package com.liferay.ide.project.ui.wizard;
import static org.eclipse.sapphire.ui.forms.PropertyEditorPart.DATA_BINDING;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gd;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdhfill;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdhindent;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdhspan;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdvalign;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.gdvindent;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.glayout;
import static org.eclipse.sapphire.ui.forms.swt.GridLayoutUtil.glspacing;
import org.eclipse.sapphire.modeling.CapitalizationType;
import org.eclipse.sapphire.ui.SapphirePart.LabelChangedEvent;
import org.eclipse.sapphire.ui.assist.internal.PropertyEditorAssistDecorator;
import org.eclipse.sapphire.ui.forms.FormComponentPart;
import org.eclipse.sapphire.ui.forms.PropertyEditorPart;
import org.eclipse.sapphire.ui.forms.swt.RadioButtonsGroup;
import org.eclipse.sapphire.ui.forms.swt.SwtPresentation;
import org.eclipse.sapphire.ui.forms.swt.ValuePropertyEditorPresentation;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
/**
* @author Gregory Amerson
*/
@SuppressWarnings( "restriction" )
public final class PossibleValuesRadioPropertyEditorPresentation<T> extends ValuePropertyEditorPresentation
{
private RadioButtonsGroup control;
public PossibleValuesRadioPropertyEditorPresentation(
FormComponentPart part, SwtPresentation parent, Composite composite )
{
super( part, parent, composite );
}
@Override
protected void createContents( final Composite parent )
{
final PropertyEditorPart part = part();
final boolean showLabel = part.label() != null;
final int leftMargin = part.getMarginLeft();
PropertyEditorAssistDecorator decorator = null;
final Composite composite = createMainComposite
(
parent,
new CreateMainCompositeDelegate( part )
{
@Override
public boolean getShowLabel()
{
return false;
}
@Override
public boolean getSpanBothColumns()
{
return true;
}
}
);
composite.setLayout( glspacing( glayout( 2, 0, 0 ), 2, 5 ) );
decorator = createDecorator( composite );
decorator.addEditorControl( composite );
if( showLabel )
{
decorator.control().setLayoutData( gdvalign( gd(), SWT.CENTER ) );
final Label label = new Label( composite, SWT.WRAP );
label.setLayoutData( gd() );
final Runnable updateLabelOp = new Runnable()
{
public void run()
{
label.setText( part.label( CapitalizationType.FIRST_WORD_ONLY, true ) );
}
};
final org.eclipse.sapphire.Listener listener = new org.eclipse.sapphire.Listener()
{
@Override
public void handle( final org.eclipse.sapphire.Event event )
{
if( event instanceof LabelChangedEvent )
{
updateLabelOp.run();
PossibleValuesRadioPropertyEditorPresentation.this.layout();
}
}
};
part.attach( listener );
updateLabelOp.run();
label.addDisposeListener
(
new DisposeListener()
{
public void widgetDisposed( final DisposeEvent event )
{
part.detach( listener );
}
}
);
decorator.addEditorControl( label );
}
else
{
decorator.control().setLayoutData( gdvindent( gdvalign( gd(), SWT.TOP ), 4 ) );
}
this.control = new RadioButtonsGroup( composite, true );
if( showLabel )
{
this.control.setLayoutData( gdhindent( gdhspan( gdhfill(), 2 ), leftMargin + 20 ) );
}
else
{
this.control.setLayoutData( gdhfill() );
}
this.binding = new PossibleValuesRadioButtonsGroupBinding<T>( this, (RadioButtonsGroup) this.control );
this.control.setData( DATA_BINDING, this.binding );
decorator.addEditorControl( this.control, true );
addControl( this.control );
}
@Override
protected void handleFocusReceivedEvent()
{
this.control.setFocus();
}
}