/******************************************************************************* * Copyright (c) 2013 RelationWare, Benno Luthiger * 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: * RelationWare, Benno Luthiger ******************************************************************************/ package org.ripla.rap.demo.widgets.views; import java.util.List; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.rap.widget.ckedit.CkEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Text; import org.ripla.interfaces.IMessages; import org.ripla.rap.demo.widgets.Activator; import org.ripla.rap.demo.widgets.data.Countries; import org.ripla.rap.demo.widgets.data.CountryBean; import org.ripla.rap.util.GridLayoutHelper; /** * The view to display the RAP input widgets. * * @author Luthiger */ @SuppressWarnings("serial") public class InputWidgetsView extends AbstractWidgetsView { private static final int WIDTH_FIELD = 300; private static final int WIDTH_AREA = 500; private static final int FILTER_WIDTH = 300; private static final int FILTER_HEIGHT = 400; private final CountriesFilter viewerFilter; private final TableViewer viewer; private List<CountryBean> countries; /** * InputWidgetsView constructor. * * @param inParent * {@link Composite} */ public InputWidgetsView(final Composite inParent) { super(inParent); final IMessages lMessages = Activator.getMessages(); viewerFilter = new CountriesFilter(); createTitle(lMessages.getMessage("widgets.title.page.input")); final Composite lColumns = new Composite(this, SWT.NONE); final GridLayout lLayout = new GridLayout(3, false); lLayout.marginWidth = 0; lColumns.setLayout(lLayout); final Composite lCol1 = createColumns(lColumns); final Composite lCol2 = createColumns(lColumns); final Composite lCol3 = createColumns(lColumns); lCol3.setLayoutData(GridLayoutHelper.createFillLayoutData()); // classic input fields createSubTitle(lCol1, lMessages.getMessage("widgets.input.subtitle.input.normal")); final Text lTextField = new Text(lCol1, SWT.SINGLE | SWT.BORDER); lTextField.setLayoutData(createHorzFillData(WIDTH_FIELD)); createSubTitle(lCol1, lMessages.getMessage("widgets.input.subtitle.input.prompt")); final Text lTextField2 = new Text(lCol1, SWT.SINGLE | SWT.BORDER); lTextField2.setLayoutData(createHorzFillData(WIDTH_FIELD)); lTextField2.setMessage(lMessages .getMessage("widgets.input.input.prompt")); createSubTitle(lCol1, lMessages.getMessage("widgets.input.subtitle.input.password")); final Text lPassword = new Text(lCol1, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD); lPassword.setLayoutData(createHorzFillData(WIDTH_FIELD)); createSubTitle(lCol1, lMessages.getMessage("widgets.input.subtitle.date")); new DateTime(lCol1, SWT.DATE | SWT.BORDER | SWT.DROP_DOWN | SWT.MEDIUM); // text areas createSubTitle(lCol2, lMessages.getMessage("widgets.input.subtitle.text.area")); final Text lArea = new Text(lCol2, SWT.MULTI | SWT.BORDER); GridData lLayoutData = createHorzFillData(WIDTH_AREA); lLayoutData.heightHint = 120; lArea.setLayoutData(lLayoutData); createSubTitle(lCol2, lMessages.getMessage("widgets.input.subtitle.rich.text")); final CkEditor lEditor = new CkEditor(lCol2, SWT.BORDER); lLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true); lLayoutData.heightHint = 250; lEditor.setLayoutData(lLayoutData); lEditor.setBackground(new Color(inParent.getDisplay(), 247, 247, 247)); // text input with filter createSubTitle(lCol3, lMessages.getMessage("widgets.input.subtitle.input.filter")); createTableFilter(lCol3); viewer = createTableViewer(lCol3); } private Text createTableFilter(final Composite inParent) { final Text outFilter = new Text(inParent, SWT.BORDER); outFilter.setLayoutData(createHorzFillData(FILTER_WIDTH)); outFilter.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent inEvent) { final Text text = (Text) inEvent.widget; viewerFilter.setText(text.getText()); viewer.refresh(); } }); outFilter.addKeyListener(new KeyAdapter() { @Override public void keyPressed(final KeyEvent inEvent) { if (inEvent.keyCode == 13 || inEvent.keyCode == SWT.ESC || inEvent.keyCode == SWT.ARROW_DOWN) { handleSelection(inEvent.keyCode == SWT.ARROW_DOWN); viewer.getTable().forceFocus(); } } }); return outFilter; } private void handleSelection(final boolean inReset) { if (viewer.getTable().getItemCount() > 0) { if (inReset || viewer.getSelection().isEmpty()) { viewer.getTable().select(0); } final int lIndex = viewer.getTable().getSelectionIndex(); // NOTE : setSelection needed as it also sets focus index and // scrolls viewer.getTable().setSelection(lIndex); } } private TableViewer createTableViewer(final Composite inParent) { countries = Countries.getCountries(); final TableViewer outViewer = new TableViewer(inParent, SWT.BORDER); final GridData lLayoutData = GridLayoutHelper.createFillLayoutData(); lLayoutData.heightHint = FILTER_HEIGHT; outViewer.getTable().setLayoutData(lLayoutData); ColumnViewerToolTipSupport.enableFor(outViewer); outViewer.setUseHashlookup(true); outViewer.setContentProvider(new CountryContentProvider()); outViewer.setLabelProvider(new CountryLabelProvider()); outViewer.getTable().setHeaderVisible(false); outViewer.getTable().setLinesVisible(true); outViewer.getTable().getLayoutData(); outViewer.setInput(countries); outViewer.addFilter(viewerFilter); return outViewer; } private GridData createHorzFillData(final int inWidth) { final GridData out = new GridData(SWT.FILL, SWT.TOP, true, false); out.minimumWidth = inWidth; return out; } // --- private static final class CountriesFilter extends ViewerFilter { private String text; public void setText(final String inString) { this.text = inString; } @Override public boolean select(final Viewer inViewer, final Object inParentElement, final Object inCountry) { boolean outResult = true; final CountryBean lCountry = (CountryBean) inCountry; if (text != null && text.length() > 0) { final String lLowerCaseText = text.toLowerCase(); final String lCountryName = lCountry.getName().toLowerCase(); outResult = lCountryName.indexOf(lLowerCaseText) != -1; } return outResult; } @Override public boolean isFilterProperty(final Object element, final String prop) { return true; } } private final static class CountryContentProvider implements IStructuredContentProvider { Object[] providedCountries; @Override public Object[] getElements(final Object inInputElement) { return providedCountries; } @SuppressWarnings("unchecked") @Override public void inputChanged(final Viewer inViewer, final Object inOldInput, final Object inNewInput) { if (inNewInput == null) { providedCountries = new Object[0]; } else { providedCountries = ((List<CountryBean>) inNewInput).toArray(); } } @Override public void dispose() { // do nothing } } private final static class CountryLabelProvider extends CellLabelProvider { @Override public void update(final ViewerCell inCell) { final CountryBean lCountry = (CountryBean) inCell.getElement(); inCell.setText(lCountry.getName()); } } }