// Copyright (c) 2003-2005 by Leif Frenzel - see http://leiffrenzel.de
package net.sf.eclipsefp.haskell.ui.properties.viewerpart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
public abstract class SharedPart {
private boolean enabled;
private final String[] buttonLabels;
private Control[] controls;
private Composite buttonContainer;
public SharedPart( final String[] buttonLabels ) {
this.buttonLabels = buttonLabels;
enabled = true;
}
public void setButtonEnabled( final int index, final boolean enabled ) {
if( controls != null && index >= 0 && controls.length > index ) {
Control c = controls[ index ];
if( c instanceof Button ) {
c.setEnabled( enabled );
}
}
}
public void createControl( final Composite parent,
final int style,
final int span ) {
createMainControl( parent, style, span - 1 );
if( buttonLabels != null && buttonLabels.length > 0 ) {
buttonContainer = new Composite( parent, SWT.NULL );
GridData gd = new GridData( GridData.FILL_VERTICAL );
buttonContainer.setLayoutData( gd );
buttonContainer.setLayout( createButtonsLayout() );
controls = new Control[ buttonLabels.length ];
SelectionHandler listener = new SelectionHandler( this );
for( int i = 0; i < buttonLabels.length; i++ ) {
String label = buttonLabels[ i ];
if( label != null ) {
Button button = createButton( buttonContainer, label, i );
button.addSelectionListener( listener );
controls[ i ] = button;
} else {
createEmptySpace( buttonContainer, 1 );
}
}
}
}
// template methods
///////////////////
protected abstract void createMainControl( Composite parent,
int style,
int span );
protected abstract void buttonSelected( Button button, int index );
protected abstract void createMainLabel( Composite parent, int span );
protected Button createButton( final Composite parent,
final String label,
final int index ) {
Button button = new Button( parent, SWT.PUSH );
button.setText( label );
GridData gd = new GridData( GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_BEGINNING );
button.setLayoutData( gd );
button.setData( new Integer( index ) );
return button;
}
protected void updateEnabledState() {
for( int i = 0; i < controls.length; i++ ) {
Control c = controls[ i ];
if( c instanceof Button ) {
c.setEnabled( isEnabled() );
}
}
}
// helping methods
//////////////////
private GridLayout createButtonsLayout() {
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
return layout;
}
protected Label createEmptySpace( final Composite parent, final int span ) {
Label label = new Label( parent, SWT.NULL );
GridData gd = new GridData( GridData.VERTICAL_ALIGN_BEGINNING );
gd.horizontalSpan = span;
gd.widthHint = 0;
gd.heightHint = 0;
label.setLayoutData( gd );
return label;
}
// attribute getters and setters
////////////////////////////////
public void setEnabled( final boolean enabled ) {
if( enabled != this.enabled ) {
this.enabled = enabled;
updateEnabledState();
}
}
public boolean isEnabled() {
return enabled;
}
// inner classes
////////////////
private class SelectionHandler implements SelectionListener {
private final SharedPart part;
private SelectionHandler( final SharedPart part ) {
this.part = part;
}
@Override
public void widgetSelected( final SelectionEvent e ) {
buttonSelected( e );
}
@Override
public void widgetDefaultSelected( final SelectionEvent e ) {
buttonSelected( e );
}
private void buttonSelected( final SelectionEvent e ) {
Integer index = ( Integer )e.widget.getData();
part.buttonSelected( ( Button )e.widget, index.intValue() );
}
}
}