/***************************************************************************** * This file is part of Rinzo * * Author: Claudio Cancinos * WWW: https://sourceforge.net/projects/editorxml * Copyright (C): 2008, Claudio Cancinos * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; If not, see <http://www.gnu.org/licenses/> ****************************************************************************/ package ar.com.tadp.xml.rinzo.jdt.preferences; import java.util.List; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; 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.jface.viewers.Viewer; 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; /** * Generalization of a CRUD displaying elements in a TableViewer. * * @author ccancinos */ public abstract class TableViewerSupport<T> { private Composite control; private TableViewer viewer; private Button buttonAdd; private Button buttonEdit; private Button buttonRemove; private List<T> model; public TableViewerSupport(List<T> 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(); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setHeaderVisible(true); table.setLinesVisible(true); table.addSelectionListener(new SelectionAdapter(){ @Override 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(){ @Override public void widgetSelected(SelectionEvent evt){ T 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(){ @Override public void widgetSelected(SelectionEvent evt){ IStructuredSelection sel = (IStructuredSelection)viewer.getSelection(); @SuppressWarnings("unchecked") T obj = (T) sel.getFirstElement(); doEdit(obj); viewer.refresh(); } }); buttonRemove = new Button(buttons,SWT.PUSH); buttonRemove.setText("Remove"); buttonRemove.setLayoutData(createButtonGridData()); buttonRemove.setEnabled(false); buttonRemove.addSelectionListener( new SelectionAdapter(){ @Override public void widgetSelected(SelectionEvent evt){ IStructuredSelection sel = (IStructuredSelection)viewer.getSelection(); @SuppressWarnings("unchecked") List<T> list = (List<T>) sel.toList(); doRemove(list); 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 viewer); protected abstract T doAdd(); protected abstract void doEdit(T obj); protected void doRemove(List<T> objList){ model.removeAll(objList); } protected abstract ITableLabelProvider createLabelProvider(); public List<T> 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; } @SuppressWarnings("rawtypes") public static class ListContentProvider implements IStructuredContentProvider { List content; public ListContentProvider() { } public Object[] getElements(Object input) { if (content != null && content == input) return content.toArray(); return new Object[0]; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { content = (newInput instanceof List) ? (List)newInput : null; } public void dispose() { } public boolean isDeleted(Object o) { return content != null && !content.contains(o); } } }