package de.tutorials;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Observable;
import java.util.Observer;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
public class Demo {
private static final Display display = new Display();
private Shell shell = null;
private TableViewer tableViewer = null;
private DatenModell model = new DatenModell();
public Demo() {
dispatch();
}
private void dispatch() {
getShell().open();
while(! getShell().isDisposed()) {
if(!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
private Shell getShell() {
if(shell == null) {
shell = new Shell(display);
shell.setLayout(new FillLayout());
getTableViewer();
}
return shell;
}
private TableViewer getTableViewer() {
if (tableViewer == null) {
tableViewer = new TableViewer(getShell(),SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
tableViewer.setLabelProvider(new MyTableLabelProvider());
tableViewer.setContentProvider(new MyContentProvider());
tableViewer.setInput(model);
}
return tableViewer;
}
public static void main(String[] args) {
new Demo();
}
class MultiCheckBoxCellEditor extends CellEditor {
private Button bit0;
private Button bit1;
private Button bit2;
private Button bit3;
private BitSet bitFeld = null;
public MultiCheckBoxCellEditor() {
super();
}
public MultiCheckBoxCellEditor(Composite parent, int style) {
super(parent, style);
}
public MultiCheckBoxCellEditor(Composite parent) {
super(parent);
}
@Override
protected Control createControl(Composite composite) {
if(bitFeld ==null) bitFeld = new BitSet();
Composite retval = new Composite(composite,SWT.NONE);
retval.setLayout(new RowLayout());
bit0 = new Button(retval,SWT.CHECK);
bit0.setText("bit 0");
bit0.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
bitFeld.set(0, bit0.getSelection());
}
});
bit1 = new Button(retval,SWT.CHECK);
bit1.setText("bit 1");
bit1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
bitFeld.set(1, bit1.getSelection());
}
});
bit2 = new Button(retval,SWT.CHECK);
bit2.setText("bit 2");
bit2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
bitFeld.set(2, bit2.getSelection());
}
});
bit3 = new Button(retval,SWT.CHECK);
bit3.setText("bit 3");
bit3.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
bitFeld.set(3, bit3.getSelection());
}
});
return retval;
}
@Override
protected Object doGetValue() {
return bitFeld;
}
@Override
protected void doSetFocus() {
}
@Override
protected void doSetValue(Object object) {
this.bitFeld = (BitSet) object;
bit0.setSelection(bitFeld.get(0));
bit1.setSelection(bitFeld.get(1));
bit2.setSelection(bitFeld.get(2));
bit3.setSelection(bitFeld.get(3));
}
}
class MyCellModifier implements ICellModifier {
@Override
public boolean canModify(Object arg0, String arg1) {
return true;
}
@Override
public Object getValue(Object element, String property) {
DatenKlasse datenKlasse = (DatenKlasse) element;
if(property .equalsIgnoreCase("BitFeld"))
return datenKlasse.getFlags();
else
return datenKlasse.getLabel();
}
@Override
public void modify(Object element, String property, Object value) {
DatenKlasse datenKlasse = (DatenKlasse)((TableItem) element).getData();
if(property .equalsIgnoreCase("BitFeld"))
datenKlasse.setFlags((BitSet) value);
else
datenKlasse.setLabel((String) value);
}
}
class MyTableLabelProvider extends LabelProvider implements ITableLabelProvider {
private String [] columnNames = {"BitFeld","Label"};
private int [] columnAligments = {SWT.CENTER, SWT.LEFT};
private int [] columnWidth = {400,200};
public MyTableLabelProvider() {
Table table = getTableViewer().getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
for(int i = 0; i < columnAligments.length; i++) {
TableColumn column = new TableColumn(table,columnAligments[i]);
column.setText(columnNames[i]);
column.setWidth(columnWidth[i]);
}
table.addListener(SWT.MeasureItem, new Listener(){
public void handleEvent(Event event) {
event.height = event.gc.getFontMetrics().getHeight() *2;
}
});
getTableViewer().setColumnProperties(columnNames);
MultiCheckBoxCellEditor multiCheckBoxCellEditor = new MultiCheckBoxCellEditor(table);
TextCellEditor textCellEditor = new TextCellEditor(table);
getTableViewer().setCellEditors(new CellEditor[]{multiCheckBoxCellEditor,textCellEditor});
getTableViewer().setCellModifier(new MyCellModifier());
}
@Override
public Image getColumnImage(Object arg0, int arg1) {
return null;
}
@Override
public String getColumnText(Object datensatz, int spalte) {
if(spalte == 0)
return "" + ((DatenKlasse) datensatz).getFlagsToString();
else
return ((DatenKlasse) datensatz).getLabel();
}
}
class MyContentProvider implements IStructuredContentProvider, Observer {
private TableViewer tableViewer;
@Override
public Object[] getElements(Object arg0) {
return model.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldSource, Object newSource) {
this.tableViewer = (TableViewer) viewer;
if(oldSource != null){
((DatenModell) oldSource).deleteObserver(this);
}
if(newSource != null){
((DatenModell) newSource).addObserver(this);
}
}
@Override
public void update(Observable o, Object arg) {
tableViewer.refresh();
}
}
class DatenModell extends Observable implements Observer{
private ArrayList<DatenKlasse> daten = new ArrayList<DatenKlasse>();
public DatenModell() {
add(new DatenKlasse(new BitSet(4), "test1"));
add(new DatenKlasse(new BitSet(4), "test2"));
add(new DatenKlasse(new BitSet(4), "test3"));
add(new DatenKlasse(new BitSet(4), "test4"));
add(new DatenKlasse(new BitSet(4),"test5"));
}
public void add(DatenKlasse datenKlasse) {
datenKlasse.addObserver(this);
daten.add(datenKlasse);
fireEvent();
}
public void remove(DatenKlasse datenKlasse) {
datenKlasse.deleteObserver(this);
daten.remove(datenKlasse);
fireEvent();
}
public Object[] toArray() {
return daten.toArray();
}
public String toString() {
return daten.toString();
}
@Override
public void update(Observable arg0, Object arg1) {
fireEvent();
}
private void fireEvent() {
setChanged();
notifyObservers();
}
}
class DatenKlasse extends Observable{
private BitSet flags = new BitSet();
private String label = "";
public DatenKlasse() {
this(new BitSet(4),"");
}
public DatenKlasse(BitSet flags, String label) {
super();
this.flags = flags;
this.label = label;
}
public BitSet getFlags() {
return flags;
}
public void setFlags(BitSet flags) {
this.flags = flags;
fireEvent();
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
fireEvent();
}
public String getFlagsToString(){
StringBuilder builder = new StringBuilder();
boolean flag = false;
if (flags.get(0)){
builder.append("Bit 0");
flag = true;
}
if (flags.get(1)){
if(flag)
builder.append(",");
builder.append("Bit 1");
flag = true;
}
if (flags.get(2)){
if(flag)
builder.append(",");
builder.append("Bit 2");
flag = true;
}
if (flags.get(3)){
if(flag)
builder.append(",");
builder.append("Bit 3");
flag = true;
}
if(builder.length() == 0)
builder.append("Keine Bits gesetzt.");
return builder.toString();
}
private void fireEvent() {
setChanged();
notifyObservers();
}
}
}