package org.objectstyle.wolips.preferences;
import java.util.List;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Table;
import org.eclipse.swt.widgets.TableItem;
import org.objectstyle.wolips.baseforuiplugins.utils.ListContentProvider;
public abstract class TableViewerSupport {
private Composite control;
private TableViewer viewer;
private Button buttonAdd;
private Button buttonEdit;
private Button buttonRemove;
private List model;
public TableViewerSupport(List model, Composite parent){
this.model = model;
initComponents(parent);
}
public Control getControl(){
return this.control;
}
private void initComponents(Composite parent){
this.control = new Composite(parent, SWT.NONE);
this.control.setLayout(new GridLayout(2, false));
viewer = new TableViewer(control, SWT.MULTI|SWT.FULL_SELECTION|SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL);
Table table = viewer.getTable();
GridData tableLayoutData = new GridData(GridData.FILL_BOTH);
tableLayoutData.heightHint = 200;
table.setLayoutData(tableLayoutData);
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent evt){
TableItem[] items = viewer.getTable().getSelection();
boolean enable = false;
if(items.length > 0){
String path = items[0].getText(1);
if(!path.equals("[Default]")){
enable = true;
}
}
buttonEdit.setEnabled(enable);
buttonRemove.setEnabled(enable);
}
});
initTableViewer(viewer);
// create buttons
Composite buttons = new Composite(control,SWT.NONE);
buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
GridLayout layout = new GridLayout();
layout.marginBottom = 0;
layout.marginHeight = 0;
layout.marginLeft = 0;
layout.marginRight = 0;
layout.marginHeight = 0;
layout.marginWidth = 0;
buttons.setLayout(layout);
buttonAdd = new Button(buttons,SWT.PUSH);
buttonAdd.setText("Add");
buttonAdd.setLayoutData(createButtonGridData());
buttonAdd.addSelectionListener(
new SelectionAdapter(){
public void widgetSelected(SelectionEvent evt){
Object obj = doAdd();
if(obj!=null){
model.add(obj);
viewer.refresh();
}
}
});
buttonEdit = new Button(buttons,SWT.PUSH);
buttonEdit.setText("Edit");
buttonEdit.setLayoutData(createButtonGridData());
buttonEdit.setEnabled(false);
buttonEdit.addSelectionListener(
new SelectionAdapter(){
public void widgetSelected(SelectionEvent evt){
IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
doEdit(sel.getFirstElement());
viewer.refresh();
}
});
buttonRemove = new Button(buttons,SWT.PUSH);
buttonRemove.setText("Remove");
buttonRemove.setLayoutData(createButtonGridData());
buttonRemove.setEnabled(false);
buttonRemove.addSelectionListener(
new SelectionAdapter(){
public void widgetSelected(SelectionEvent evt){
IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
doRemove(sel.toList());
viewer.refresh();
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener(){
public void selectionChanged(SelectionChangedEvent event){
IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
if(sel==null || sel.getFirstElement()==null){
buttonEdit.setEnabled(false);
buttonRemove.setEnabled(false);
} else {
buttonEdit.setEnabled(true);
buttonRemove.setEnabled(true);
}
}
});
viewer.setContentProvider(new ListContentProvider());
viewer.setLabelProvider(createLabelProvider());
viewer.setInput(model);
}
protected abstract void initTableViewer(TableViewer tableViewer);
protected abstract Object doAdd();
protected abstract void doEdit(Object obj);
protected void doRemove(List objList){
model.removeAll(objList);
}
protected abstract ITableLabelProvider createLabelProvider();
public Object getModel(){
return this.model;
}
public TableViewer getTableViewer(){
return this.viewer;
}
/**
* Create LayoutData for "add", "edit" and "remove" buttons.
* @return GridData
*/
private static GridData createButtonGridData(){
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 100;
return gd;
}
}