throw new IllegalStateException();
}
this.possibleValuesService = property.service( PossibleValuesService.class );
this.possibleValuesServiceListener = new Listener()
{
@Override
public void handle( final Event event )
{
CheckBoxListPropertyEditorPresentation.this.tableViewer.refresh();
}
};
this.possibleValuesService.attach( this.possibleValuesServiceListener );
// Create Controls
final Composite mainComposite = createMainComposite( parent );
mainComposite.setLayout( glspacing( glayout( 2, 0, 0 ), 2 ) );
final PropertyEditorAssistDecorator decorator = createDecorator( mainComposite );
decorator.control().setLayoutData( gdvalign( gd(), SWT.TOP ) );
// Setting the whint in the following code is a hacky workaround for the problem
// tracked by the following JFace bug:
//
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=215997
//
final Composite tableComposite = new Composite( mainComposite, SWT.NONE );
tableComposite.setLayoutData( gdwhint( gdfill(), 1 ) );
final TableColumnLayout tableColumnLayout = new TableColumnLayout();
tableComposite.setLayout( tableColumnLayout );
this.tableViewer = CheckboxTableViewer.newCheckList( tableComposite, SWT.BORDER | SWT.FULL_SELECTION );
this.table = this.tableViewer.getTable();
final TableViewerColumn viewerColumn = new TableViewerColumn( this.tableViewer, SWT.NONE );
final TableColumn column = viewerColumn.getColumn();
column.setText( this.memberProperty.getLabel( false, CapitalizationType.TITLE_STYLE, false ) );
tableColumnLayout.setColumnData( column, new ColumnWeightData( 1, 100, true ) );
decorator.addEditorControl( mainComposite );
suppressDashedTableEntryBorder( this.table );
// Bind to Model
final ColumnSortComparator comparator = new ColumnSortComparator()
{
@Override
protected String convertToString( final Object obj )
{
return ( (Entry) obj ).value;
}
};
final IStructuredContentProvider contentProvider = new IStructuredContentProvider()
{
private List<Entry> entries = new ArrayList<Entry>();
public Object[] getElements( final Object input )
{
if( this.entries != null )
{
for( Entry entry : this.entries )
{
entry.dispose();
}
this.entries = null;
}
final Map<String,LinkedList<Element>> valueToElements = new HashMap<String,LinkedList<Element>>();
for( final Element element : property() )
{
final String value = readMemberProperty( element );
LinkedList<Element> elements = valueToElements.get( value );
if( elements == null )
{
elements = new LinkedList<Element>();
valueToElements.put( value, elements );
}
elements.add( element );
}
this.entries = new ArrayList<Entry>();
Set<String> possibleValues;
try
{
possibleValues = CheckBoxListPropertyEditorPresentation.this.possibleValuesService.values();
}
catch( Exception e )
{
Sapphire.service( LoggingService.class ).log( e );
possibleValues = SetFactory.empty();
}
for( String value : possibleValues )
{
final Entry entry;
final LinkedList<Element> elements = valueToElements.get( value );
if( elements == null )
{
entry = new Entry( value, null );
}
else
{
final Element element = elements.remove();
if( elements.isEmpty() )
{
valueToElements.remove( value );
}
entry = new Entry( value, element );
}
this.entries.add( entry );
}
for( Map.Entry<String,LinkedList<Element>> entry : valueToElements.entrySet() )
{
final String value = entry.getKey();
for( Element element : entry.getValue() )
{
this.entries.add( new Entry( value, element ) );
}
}
return this.entries.toArray();
}
public void dispose()
{
for( Entry entry : this.entries )
{
entry.dispose();
}
this.entries = null;
}
public void inputChanged( final Viewer viewer,
final Object oldInput,
final Object newInput )
{
}
};
this.tableViewer.setContentProvider( contentProvider );
final ColumnLabelProvider labelProvider = new ColumnLabelProvider()
{
@Override
public String getText( final Object element )
{
return ( (Entry) element ).label();
}
@Override
public Image getImage( final Object element )
{
return ( (Entry) element ).image();
}
@Override
public Color getForeground( final Object element )
{
return ( (Entry) element ).foreground();
}
};
viewerColumn.setLabelProvider( labelProvider );
final ICheckStateProvider checkStateProvider = new ICheckStateProvider()
{
public boolean isChecked( final Object element )
{
return ( (Entry) element ).selected();
}
public boolean isGrayed( final Object element )
{
return false;
}
};
this.tableViewer.setCheckStateProvider( checkStateProvider );
if( part.getRenderingHint( PropertyEditorDef.HINT_SHOW_HEADER, true ) == true )
{
this.table.setHeaderVisible( true );
makeTableSortable
(
this.tableViewer,
Collections.<TableColumn,Comparator<Object>>singletonMap( column, comparator ),
CheckBoxListPropertyEditorPresentation.this.possibleValuesService.ordered() ? null : column
);
}
final ListSelectionService selectionService = part.service( ListSelectionService.class );
this.tableViewer.addSelectionChangedListener
(
new ISelectionChangedListener()
{
public void selectionChanged( final SelectionChangedEvent event )
{
selectionService.select( getSelectedElements() );
}
}
);
final Listener selectionServiceListener = new FilteredListener<ListSelectionChangedEvent>()
{
@Override
protected void handleTypedEvent( final ListSelectionChangedEvent event )
{
setSelectedElements( event.after() );