/******************************************************************************* * Copyright (c) 2009 Marty Jones * 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: * Marty Jones <martybjones@gmail.com> - initial API and implementation *******************************************************************************/ package org.eclipse.nebula.snippets.tablecombo.viewer; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import javax.swing.plaf.multi.MultiSliderUI; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableColorProvider; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.nebula.jface.tablecomboviewer.TableComboViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.nebula.snippets.tablecombo.Model; import org.eclipse.nebula.snippets.tablecombo.TableComboSnippet1; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Shows basic features of TableComboViewer * */ public class TableComboViewerSnippet1 { private static Font boldFont; private static Image testImage; private static Image test2Image; private static Image test3Image; private static Color grey; private static Color darkRed; private static Color darkBlue; private static Color darkGreen; private static List modelList; private static List multiSelectionList; private static Text listenerResults; private static Group listenerGroup; /** * @param args */ public static void main(String[] args) { // get display. Display display = new Display (); // create bold and italic font. boldFont = new Font(display,"Arial",8, SWT.BOLD | SWT.ITALIC); // create images testImage = ImageDescriptor.createFromFile(TableComboSnippet1.class, "in_ec_ov_success_16x16.gif").createImage(); test2Image = ImageDescriptor.createFromFile(TableComboSnippet1.class, "in_ec_ov_warning_16x16.gif").createImage(); test3Image = ImageDescriptor.createFromFile(TableComboSnippet1.class, "invalid_build_tool_16x16.gif").createImage(); // create colors darkRed = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED); darkBlue = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_BLUE); darkGreen = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN); grey = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY); // load the model list. modelList = loadModel(); // create list for multi selection example multiSelectionList = new ArrayList(); // create a new shell. Shell shell = new Shell (display); shell.setText("TableComboViewer Snippet 1"); shell.setSize(500, 400); shell.setLayout(new GridLayout()); // create group Group group = new Group(shell, SWT.NONE); group.setLayout(new GridLayout(2, false)); group.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false)); group.setText("Sample Group"); // create group listenerGroup = new Group(shell, SWT.NONE); listenerGroup.setLayout(new GridLayout(1, false)); listenerGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); listenerGroup.setText("Listener Results"); listenerResults = new Text(listenerGroup, SWT.BORDER | SWT.MULTI); GridData gd = new GridData(SWT.FILL, SWT.DEFAULT, true, false); gd.heightHint = 30; listenerResults.setLayoutData(gd); //////////////////////////////////////////////////////////////////////// // Sample #1 //////////////////////////////////////////////////////////////////////// Label label = new Label(group, SWT.NONE); label.setText("Single Column (Mimics Normal Combo Field):"); // create TableCombo TableComboViewer tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new SingleItemLabelProvider()); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample1")); //////////////////////////////////////////////////////////////////////// // Sample #2 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("Single Column (With Images):"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new SingleImageItemLabelProvider()); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample2")); //////////////////////////////////////////////////////////////////////// // Sample #3 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("Two Columns:"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new MultipleLabelProvider()); // tell the TableCombo that I want 2 blank columns auto sized. tcv.getTableCombo().defineColumns(2); // set which column index will be used to display the selected item. tcv.getTableCombo().setDisplayColumnIndex(1); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample3")); //////////////////////////////////////////////////////////////////////// // Sample #4 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("Two Columns (With Colors && Fonts):"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); tcv.getTableCombo().setVisibleItemCount(10); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new MultipleColorLabelProvider()); // tell the TableCombo that I want 2 blank columns auto sized. tcv.getTableCombo().defineColumns(2); // set which column index will be used to display the selected item. tcv.getTableCombo().setDisplayColumnIndex(1); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample4")); //////////////////////////////////////////////////////////////////////// // Sample #5 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("Three Columns (With Colors && Fonts && Header):"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); tcv.getTableCombo().setShowTableHeader(true); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new ThreeLabelProvider()); // tell the TableCombo that I want 3 columns autosized with the following column headers. tcv.getTableCombo().defineColumns(new String[] { "Id", "Description", "Computed"}); // set which column index will be used to display the selected item. tcv.getTableCombo().setDisplayColumnIndex(2); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample5")); //////////////////////////////////////////////////////////////////////// // Sample #6 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("Three Columns (First Column, Fixed Width):"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); tcv.getTableCombo().setShowTableHeader(true); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new ThreeLabelProvider()); // tell the TableCombo that I want 3 columns autosized with the following column headers. tcv.getTableCombo().defineColumns(new String[] { "Id", "Description", "Computed"}, new int[] { 50 , SWT.DEFAULT, SWT.DEFAULT}); // set which column index will be used to display the selected item. tcv.getTableCombo().setDisplayColumnIndex(2); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample6")); //////////////////////////////////////////////////////////////////////// // Sample #7 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("Three Columns (With Table Width 75%):"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); tcv.getTableCombo().setShowTableHeader(true); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new ThreeLabelProvider()); // tell the TableCombo that I want 3 columns autosized with the following column headers. tcv.getTableCombo().defineColumns(new String[] { "Id", "Description", "Computed"}); // set which column index will be used to display the selected item. tcv.getTableCombo().setDisplayColumnIndex(2); // set the table width percentage to 75% tcv.getTableCombo().setTableWidthPercentage(75); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new ItemSelected("Sample7")); //////////////////////////////////////////////////////////////////////// // Sample #8 //////////////////////////////////////////////////////////////////////// // create label label = new Label(group, SWT.NONE); label.setText("MultiSelection (Keep Pupup Open):"); // create TableCombo tcv = new TableComboViewer(group, SWT.READ_ONLY | SWT.BORDER); tcv.getTableCombo().setLayoutData(new GridData(125, SWT.DEFAULT)); tcv.getTableCombo().setShowTableHeader(true); // set the content provider tcv.setContentProvider(ArrayContentProvider.getInstance()); // set the label provider tcv.setLabelProvider(new MultiSelectionLabelProvider()); // tell the TableCombo that I want 3 columns autosized with the following column headers. tcv.getTableCombo().defineColumns(new String[] { "Id", "Description", "Computed" }); // do not allow editable tcv.getTableCombo().setEditable(false); // keep popup open after selection tcv.getTableCombo().setClosePopupAfterSelection(false); // load the data tcv.setInput(modelList); // add listener tcv.addSelectionChangedListener(new MultiItemSelected("Sample8")); shell.open(); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } // dispose of the font boldFont.dispose(); display.dispose (); } private static class SingleItemLabelProvider extends LabelProvider implements ITableLabelProvider { /** * We return null, because we don't support images yet. * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage (Object element, int columnIndex) { return null; } /** * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText (Object element, int columnIndex) { Model item = (Model)element; switch (columnIndex) { case 0: return item.getDescription(); } return ""; } } private static class SingleImageItemLabelProvider extends LabelProvider implements ITableLabelProvider { /** * We return null, because we don't support images yet. * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage (Object element, int columnIndex) { Model item = (Model)element; if (columnIndex == 0) { int itemId = item.getId(); if (itemId == 1 || itemId == 7 || itemId == 13 || itemId == 19) { return testImage; } else if (itemId == 3 || itemId == 9 || itemId == 15) { return test2Image; } else if (itemId == 5 || itemId == 11 || itemId == 17) { return test3Image; } } return null; } /** * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText (Object element, int columnIndex) { Model item = (Model)element; switch (columnIndex) { case 0: return item.getDescription(); } return ""; } } private static class MultipleLabelProvider extends LabelProvider implements ITableLabelProvider { /** * We return null, because we don't support images yet. * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage (Object element, int columnIndex) { return null; } /** * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText (Object element, int columnIndex) { Model model = (Model)element; switch (columnIndex) { case 0: return String.valueOf(model.getId()); case 1: return model.getDescription(); } return ""; } } private static class ThreeLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider, ITableFontProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage (Object element, int columnIndex) { return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText (Object element, int columnIndex) { Model model = (Model)element; switch (columnIndex) { case 0: return String.valueOf(model.getId()); case 1: return model.getDescription(); case 2: return model.getId() + " - " + model.getDescription(); } return ""; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int) */ public Color getBackground(Object arg0, int arg1) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang.Object, int) */ public Color getForeground(Object element, int columnIndex) { Model item = (Model)element; if (item.getId() == 1 || item.getId() == 15) { return darkRed; } else if (item.getId() == 5 || item.getId() == 20) { return darkBlue; } else if (item.getId() == 10) { return darkGreen; } else { return null; } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int) */ public Font getFont(Object element, int index) { Model item = (Model)element; if (item.getId() == 1 || item.getId() == 15) { return boldFont; } else if (item.getId() == 5 || item.getId() == 20) { return boldFont; } else if (item.getId() == 10) { return boldFont; } else { return null; } } } private static class MultiSelectionLabelProvider extends ThreeLabelProvider { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int) */ public Color getBackground(Object element, int columnIndex) { if (isSelected(element)) { return grey; } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang.Object, int) */ public Color getForeground(Object element, int columnIndex) { return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int) */ public Font getFont(Object element, int index) { return null; } private boolean isSelected(Object element) { Model item = (Model) element; return multiSelectionList.contains(Integer.valueOf(item.getId())); } } private static class MultipleColorLabelProvider extends LabelProvider implements ITableLabelProvider, ITableColorProvider, ITableFontProvider { /** * We return null, because we don't support images yet. * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int) */ public Image getColumnImage (Object element, int columnIndex) { return null; } /** * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int) */ public String getColumnText (Object element, int columnIndex) { Model model = (Model)element; switch (columnIndex) { case 0: return String.valueOf(model.getId()); case 1: return model.getDescription(); } return ""; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableColorProvider#getBackground(java.lang.Object, int) */ public Color getBackground(Object element, int columnIndex) { return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableColorProvider#getForeground(java.lang.Object, int) */ public Color getForeground(Object element, int columnIndex) { Model item = (Model)element; if (item.getId() == 1 || item.getId() == 15) { return darkRed; } else if (item.getId() == 5 || item.getId() == 20) { return darkBlue; } else if (item.getId() == 10) { return darkGreen; } else { return null; } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITableFontProvider#getFont(java.lang.Object, int) */ public Font getFont(Object element, int index) { Model item = (Model)element; if (item.getId() == 1 || item.getId() == 15 || item.getId() == 5 || item.getId() == 20 || item.getId() == 10) { return boldFont; } else { return null; } } } /** * load the Model data. * @return */ private static List loadModel() { List items = new ArrayList(); items.add(new Model(1, "One")); items.add(new Model(2, "Two")); items.add(new Model(3, "Three")); items.add(new Model(4, "Four")); items.add(new Model(5, "Five")); items.add(new Model(6, "Six")); items.add(new Model(7, "Seven")); items.add(new Model(8, "Eight")); items.add(new Model(9, "Nine")); items.add(new Model(10, "Ten")); items.add(new Model(11, "Eleven")); items.add(new Model(12, "Twelve")); items.add(new Model(13, "Thirteen")); items.add(new Model(14, "Fourteen")); items.add(new Model(15, "Fiveteen")); items.add(new Model(16, "Sixteen")); items.add(new Model(17, "Seventeen")); items.add(new Model(18, "Eighteen")); items.add(new Model(19, "Nineteen")); items.add(new Model(20, "Twenty")); return items; } private static class ItemSelected implements ISelectionChangedListener { private String text; public ItemSelected(String text) { this.text = text; } public void selectionChanged(SelectionChangedEvent event) { Model model = (Model)((IStructuredSelection)event.getSelection()).getFirstElement(); listenerGroup.setText("Listener Results - (" + text + ")"); listenerResults.setText(model.toString()); } } private static class MultiItemSelected implements ISelectionChangedListener { private String text; public MultiItemSelected(String text) { this.text = text; } public void selectionChanged(SelectionChangedEvent event) { listenerGroup.setText("Listener Results - (" + text + ")"); Model model = (Model) ((IStructuredSelection) event.getSelection()).getFirstElement(); toggleSelection(model); String selectionText = getSelectionText(); listenerResults.setText(selectionText); TableComboViewer viewer = ((TableComboViewer) event.getSource()); viewer.getTableCombo().setText(selectionText); viewer.update(model, null); } private void toggleSelection(Model model) { Integer boxedID = Integer.valueOf(model.getId()); if (multiSelectionList.contains(boxedID)) { multiSelectionList.remove(boxedID); } else { multiSelectionList.add(boxedID); Collections.sort(multiSelectionList); } } private String getSelectionText() { Iterator it = multiSelectionList.iterator(); String selectionText = ""; if (it.hasNext()) { selectionText += it.next(); } while (it.hasNext()) { selectionText += ", " + it.next(); } return selectionText; } } }