/***************************************************************************** * Copyright (c) 2015, 2016 CEA LIST. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation * *****************************************************************************/ package org.eclipse.nebula.widgets.richtext.example; import java.io.File; import java.net.URL; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckboxCellEditor; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ComboBoxViewerCellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.nebula.widgets.richtext.RichTextCellEditor; import org.eclipse.nebula.widgets.richtext.RichTextCellLabelProvider; import org.eclipse.nebula.widgets.richtext.RichTextEditorConfiguration; import org.eclipse.nebula.widgets.richtext.toolbar.ToolbarButton; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class JFaceViewerIntegrationExample { public static void main(String[] args) { Display display = new Display(); final Shell shell = new Shell(display); shell.setText("Rich Text Editor JFace viewer integration example"); shell.setSize(800, 600); shell.setLayout(new GridLayout(1, true)); JFaceViewerIntegrationExample example = new JFaceViewerIntegrationExample(); example.createControls(shell); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public void createControls(Composite parent) { parent.setLayout(new FillLayout(SWT.VERTICAL)); final TableViewer viewer = new TableViewer(parent, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); viewer.setContentProvider(new ArrayContentProvider()); viewer.getTable().setHeaderVisible(true); viewer.getTable().setLinesVisible(true); TableViewerColumn firstnameColumn = new TableViewerColumn(viewer, SWT.NONE); firstnameColumn.getColumn().setText("Firstname"); firstnameColumn.getColumn().setWidth(100); firstnameColumn.setLabelProvider(new FirstNameLabelProvider()); firstnameColumn.setEditingSupport(new FirstNameEditingSupport(viewer)); TableViewerColumn lastnameColumn = new TableViewerColumn(viewer, SWT.NONE); lastnameColumn.getColumn().setText("Lastname"); lastnameColumn.getColumn().setWidth(100); // lastnameColumn.setLabelProvider(new LastNameLabelProvider()); lastnameColumn.setLabelProvider(new RichTextCellLabelProvider<Person>(viewer.getControl()) { @Override public String getRichText(Person element) { if (element.getLastName().equals("Simpson")) { return "<em>" + element.getLastName() + "</em>"; } else if (element.getLastName().equals("Smithers")) { return "<span style=\"background-color:rgb(255, 0, 0)\"><strong><s><u>" + element.getLastName() + "</u></s></strong></span>"; } return element.getLastName(); } }); lastnameColumn.setEditingSupport(new LastNameEditingSupport(viewer)); TableViewerColumn marriedColumn = new TableViewerColumn(viewer, SWT.NONE); marriedColumn.getColumn().setText("Married"); marriedColumn.getColumn().setWidth(60); marriedColumn.setLabelProvider(new MarriedLabelProvider()); marriedColumn.setEditingSupport(new MarriedEditingSupport(viewer)); TableViewerColumn genderColumn = new TableViewerColumn(viewer, SWT.NONE); genderColumn.getColumn().setText("Gender"); genderColumn.getColumn().setWidth(80); genderColumn.setLabelProvider(new GenderLabelProvider()); genderColumn.setEditingSupport(new GenderEditingSupport(viewer)); TableViewerColumn descColumn = new TableViewerColumn(viewer, SWT.NONE); descColumn.getColumn().setText("Description"); descColumn.getColumn().setWidth(200); // descColumn.setLabelProvider(new DescriptionLabelProvider()); descColumn.setLabelProvider(new RichTextCellLabelProvider<Person>(viewer.getControl()) { @Override public String getRichText(Person element) { return element.getDescription(); } }); descColumn.setEditingSupport(new DescriptionEditingSupport(viewer)); viewer.setInput(PersonService.getPersons(10)); // add a tree TreeViewer treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); treeViewer.setContentProvider(new TreeViewerContentProvider()); treeViewer.setLabelProvider(new RichTextCellLabelProvider<File>(treeViewer.getControl()) { @Override public String getRichText(File file) { String name = file.getName(); String result = name.isEmpty() ? file.getPath() : name; if (file.isDirectory()) { result = "<strong><u>" + result + "</u></strong>"; } return result; } }); treeViewer.setInput(File.listRoots()); } class FirstNameLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { Person element = (Person) cell.getElement(); cell.setText(element.getFirstName()); super.update(cell); } } class FirstNameEditingSupport extends EditingSupport { public FirstNameEditingSupport(ColumnViewer viewer) { super(viewer); } @Override protected CellEditor getCellEditor(Object element) { return new TextCellEditor((Composite) getViewer().getControl()); } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { return ((Person) element).getFirstName(); } @Override protected void setValue(Object element, Object value) { ((Person) element).setFirstName(String.valueOf(value)); getViewer().update(element, null); } } class LastNameLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { Person element = (Person) cell.getElement(); cell.setText(element.getLastName()); super.update(cell); } } class LastNameEditingSupport extends EditingSupport { public LastNameEditingSupport(ColumnViewer viewer) { super(viewer); } @Override protected CellEditor getCellEditor(Object element) { return new TextCellEditor((Composite) getViewer().getControl()); } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { return ((Person) element).getLastName(); } @Override protected void setValue(Object element, Object value) { ((Person) element).setLastName(String.valueOf(value)); getViewer().update(element, null); } } class GenderLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { Person element = (Person) cell.getElement(); cell.setText(element.getGender().toString()); super.update(cell); } } class GenderEditingSupport extends EditingSupport { private ComboBoxViewerCellEditor cellEditor; public GenderEditingSupport(ColumnViewer viewer) { super(viewer); cellEditor = new ComboBoxViewerCellEditor((Composite) getViewer().getControl(), SWT.READ_ONLY); cellEditor.setLabelProvider(new LabelProvider()); cellEditor.setContentProvider(new ArrayContentProvider()); cellEditor.setInput(Person.Gender.values()); } @Override protected CellEditor getCellEditor(Object element) { return cellEditor; } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { return ((Person) element).getGender(); } @Override protected void setValue(Object element, Object value) { ((Person) element).setGender((Person.Gender) value); getViewer().update(element, null); } } class MarriedLabelProvider extends StyledCellLabelProvider { private final Image uncheckedImg; private final Image checkedImg; public MarriedLabelProvider() { LocalResourceManager resourceMgr = new LocalResourceManager(JFaceResources.getResources()); URL checked = JFaceViewerIntegrationExample.class.getResource("images/checked.gif"); URL unchecked = JFaceViewerIntegrationExample.class.getResource("images/unchecked.gif"); this.checkedImg = resourceMgr.createImage(ImageDescriptor.createFromURL(checked)); this.uncheckedImg = resourceMgr.createImage(ImageDescriptor.createFromURL(unchecked)); } @Override public void update(ViewerCell cell) { if (((Person) cell.getElement()).isMarried()) { cell.setImage(checkedImg); } else { cell.setImage(uncheckedImg); } } } class MarriedEditingSupport extends EditingSupport { public MarriedEditingSupport(ColumnViewer viewer) { super(viewer); } @Override protected CellEditor getCellEditor(Object element) { return new CheckboxCellEditor((Composite) getViewer().getControl(), SWT.CHECK); } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { return ((Person) element).isMarried(); } @Override protected void setValue(Object element, Object value) { ((Person) element).setMarried((Boolean) value); getViewer().update(element, null); } } class DescriptionLabelProvider extends StyledCellLabelProvider { @Override public void update(ViewerCell cell) { Person element = (Person) cell.getElement(); cell.setText(element.getDescription()); super.update(cell); } } class DescriptionEditingSupport extends EditingSupport { public DescriptionEditingSupport(ColumnViewer viewer) { super(viewer); } @Override protected CellEditor getCellEditor(Object element) { RichTextEditorConfiguration config = new RichTextEditorConfiguration(); config.setToolbarCollapsible(true); config.setToolbarInitialExpanded(false); final RichTextCellEditor editor = new RichTextCellEditor((Composite) getViewer().getControl(), config, SWT.RESIZE | SWT.MIN); editor.getRichTextEditor().addToolbarButton(new ToolbarButton("addContentButton", "addContentCommand", "Add content", "other", JFaceViewerIntegrationExample.class.getResource("images/debug_exc.gif")) { @Override public Object execute() { editor.getRichTextEditor().insertHTML("<em>Dynamically added content</em>"); return null; } }); return editor; } @Override protected boolean canEdit(Object element) { return true; } @Override protected Object getValue(Object element) { return ((Person) element).getDescription(); } @Override protected void setValue(Object element, Object value) { ((Person) element).setDescription(String.valueOf(value)); getViewer().update(element, null); } } static class TreeViewerContentProvider implements ITreeContentProvider { @Override public void inputChanged(Viewer v, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public Object[] getElements(Object inputElement) { return (File[]) inputElement; } @Override public Object[] getChildren(Object parentElement) { File file = (File) parentElement; return file.listFiles(); } @Override public Object getParent(Object element) { File file = (File) element; return file.getParentFile(); } @Override public boolean hasChildren(Object element) { File file = (File) element; if (file.isDirectory()) { return true; } return false; } } }