litesoft
@ 939
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
package org.litesoft.mgwt.client.widgets; import org.litesoft.commonfoundation.annotations.*; import org.litesoft.commonfoundation.typeutils.Objects; import org.litesoft.core.util.*; import org.litesoft.core.util.externalization.*; import com.google.gwt.event.logical.shared.*; import com.google.gwt.user.client.*; import com.google.gwt.user.client.ui.*; import com.googlecode.mgwt.ui.client.widget.*; import java.util.*; public class RadioGroup<T> implements TakesValue<T> { protected final E13nResolver mResolver; private final SelectedListener<T> mSelectedListener; private final List<MRadioButton> mRadioButtons = new ArrayList<MRadioButton>(); private final List<T> mOptions = new ArrayList<T>(); private final String mGroupID = HTMLPanel.createUniqueId(); private int mFirstEnabled = -1; public RadioGroup( @NotNull E13nResolver pResolver, @Nullable SelectedListener<T> pSelectedListener ) { mResolver = pResolver; mSelectedListener = pSelectedListener; } public MRadioButton addOption( @NotNull final T pOption ) { MRadioButton zRB = new MRadioButton( mGroupID ); mRadioButtons.add( zRB ); mOptions.add( pOption ); zRB.setText( DisplayObject.resolve( mResolver, pOption ) ); if ( !isSelectable( pOption ) ) { zRB.setEnabled( false ); } else { if ( mFirstEnabled == -1 ) { mFirstEnabled = mRadioButtons.size() - 1; zRB.setValue( true ); } zRB.addValueChangeHandler( new ValueChangeHandler<Boolean>() { @Override public void onValueChange( ValueChangeEvent<Boolean> event ) { if ( pOption instanceof Runnable ) { ((Runnable) pOption).run(); } else if ( mSelectedListener != null ) { mSelectedListener.selected( pOption ); } } } ); } return zRB; } @Override public T getValue() { int i = mRadioButtons.size(); while ( --i > mFirstEnabled ) { if ( Boolean.TRUE.equals( mRadioButtons.get( i ).getValue() ) ) { return mOptions.get( i ); } } return (mFirstEnabled > -1) ? mOptions.get( mFirstEnabled ) : null; } @Override public void setValue( T value ) { for ( int i = 0; i < mOptions.size(); i++ ) { if ( Objects.areNonArraysEqual( value, mOptions.get( i ) ) ) { setIndex( i ); return; } } setIndex( mFirstEnabled ); } protected void setIndex( int pIndex ) { if ( (0 <= pIndex) && (pIndex < mRadioButtons.size()) ) { mRadioButtons.get( pIndex ).setValue( true ); } } protected boolean isSelectable( T pOption ) { return !(pOption instanceof Selectable) || ((Selectable) pOption).isSelectable(); } } |