Java tutorial
/******************************************************************************* * Copyright (c) May 9, 2011 NetXForge. * * 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 3 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/> * * Contributors: * Christophe Bouhier - initial API and implementation and/or initial documentation *******************************************************************************/ package com.netxforge.netxstudio.screens.f3; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.EMFObservables; import org.eclipse.emf.databinding.IEMFListProperty; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.wb.swt.ResourceManager; import com.google.common.collect.Lists; import com.netxforge.netxstudio.generics.GenericsPackage; import com.netxforge.netxstudio.operators.Operator; import com.netxforge.netxstudio.operators.OperatorsFactory; import com.netxforge.netxstudio.operators.OperatorsPackage; import com.netxforge.netxstudio.screens.AbstractScreen; import com.netxforge.netxstudio.screens.editing.filter.CDOSearchFilter; import com.netxforge.netxstudio.screens.editing.tables.CDOElementComparer; import com.netxforge.netxstudio.screens.f2.support.ToleranceObservableMapLabelProvider; import com.netxforge.screens.editing.base.IDataServiceInjection; import com.netxforge.screens.editing.base.ScreenUtil; import com.netxforge.screens.editing.base.filter.ISearchFilter; /** * @author Christophe Bouhier christophe.bouhier@netxforge.com * */ public class Operators extends AbstractScreen implements IDataServiceInjection { private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Text txtFilterText; private Table table; private TableViewer tableViewer; @SuppressWarnings("unused") private DataBindingContext bindingContext; private Form frmOperators; // private ObservablesManager mgr; private ObservableListContentProvider listContentProvider; private Resource operatorResource; private TableColumn tblclmnWebsite; private TableViewerColumn tableViewerColumn_1; private TableColumn tblclmnShortname; private TableViewerColumn tableViewerColumn_2; /** * Create the composite. * * @param parent * @param style */ public Operators(Composite parent, int style) { super(parent, style); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { toolkit.dispose(); } }); toolkit.adapt(this); toolkit.paintBordersFor(this); } /** * Wrap in an action, to contribute to a menu manager. * * @author Christophe Bouhier * */ class EditOperatorAction extends Action { public EditOperatorAction(String text) { super(text); } @Override public void run() { super.run(); if (screenService != null) { ISelection selection = getTableViewerWidget().getSelection(); if (selection instanceof IStructuredSelection) { Object o = ((IStructuredSelection) selection).getFirstElement(); if (o != null) { NewEditOperator vendorScreen = new NewEditOperator(screenService.getScreenContainer(), SWT.NONE); vendorScreen.setOperation(getOperation()); vendorScreen.setScreenService(screenService); vendorScreen.injectData(operatorResource, o); screenService.setActiveScreen(vendorScreen); } } } } } public TableViewer getTableViewerWidget() { return tableViewer; } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData() */ public void injectData() { operatorResource = editingService.getData(OperatorsPackage.Literals.OPERATOR); buildUI(); bindingContext = initDataBindings_(); } private void buildUI() { setLayout(new FillLayout(SWT.HORIZONTAL)); // Readonlyness. boolean readonly = ScreenUtil.isReadOnlyOperation(this.getOperation()); String actionText = readonly ? "View: " : "Edit: "; int widgetStyle = readonly ? SWT.READ_ONLY : SWT.NONE; frmOperators = toolkit.createForm(this); frmOperators.setSeparatorVisible(true); toolkit.paintBordersFor(frmOperators); frmOperators.setText(actionText + "Operators"); frmOperators.getBody().setLayout(new GridLayout(3, false)); Label lblFilterLabel = toolkit.createLabel(frmOperators.getBody(), "Filter:", SWT.NONE); GridData gd_lblFilterLabel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_lblFilterLabel.widthHint = 36; lblFilterLabel.setLayoutData(gd_lblFilterLabel); txtFilterText = toolkit.createText(frmOperators.getBody(), "New Text", SWT.H_SCROLL | SWT.SEARCH | SWT.CANCEL); txtFilterText.setText(""); GridData gd_txtFilterText = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1); gd_txtFilterText.widthHint = 200; txtFilterText.setLayoutData(gd_txtFilterText); txtFilterText.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent ke) { ViewerFilter[] filters = tableViewer.getFilters(); for (ViewerFilter viewerFilter : filters) { if (viewerFilter instanceof ISearchFilter) { ((ISearchFilter) viewerFilter).setSearchText(txtFilterText.getText()); } } tableViewer.refresh(); } }); // Conditional widget. if (!readonly) { ImageHyperlink mghprlnkNew = toolkit.createImageHyperlink(frmOperators.getBody(), SWT.NONE); mghprlnkNew.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { NewEditOperator operatorScreen = new NewEditOperator(screenService.getScreenContainer(), SWT.NONE); operatorScreen.setOperation(ScreenUtil.OPERATION_NEW); operatorScreen.setScreenService(screenService); Operator newOperator = OperatorsFactory.eINSTANCE.createOperator(); operatorScreen.injectData(operatorResource, newOperator); screenService.setActiveScreen(operatorScreen); } public void linkEntered(HyperlinkEvent e) { } public void linkExited(HyperlinkEvent e) { } }); mghprlnkNew.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); mghprlnkNew.setImage(ResourceManager.getPluginImage("com.netxforge.netxstudio.models.edit", "icons/full/ctool16/Company_E.png")); mghprlnkNew.setBounds(0, 0, 114, 17); toolkit.paintBordersFor(mghprlnkNew); mghprlnkNew.setText("New"); } tableViewer = new TableViewer(frmOperators.getBody(), SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | widgetStyle); tableViewer.setComparer(new CDOElementComparer()); table = tableViewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 2)); toolkit.paintBordersFor(table); TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnName = tableViewerColumn.getColumn(); tblclmnName.setWidth(144); tblclmnName.setText("Name"); tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE); tblclmnShortname = tableViewerColumn_2.getColumn(); tblclmnShortname.setWidth(100); tblclmnShortname.setText("Short Name"); tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE); tblclmnWebsite = tableViewerColumn_1.getColumn(); tblclmnWebsite.setWidth(169); tblclmnWebsite.setText("Website"); tableViewer.addFilter(new CDOSearchFilter()); } public EMFDataBindingContext initDataBindings_() { listContentProvider = new ObservableListContentProvider(); tableViewer.setContentProvider(listContentProvider); IObservableMap[] observeMaps = EMFObservables.observeMaps(listContentProvider.getKnownElements(), new EStructuralFeature[] { GenericsPackage.Literals.COMPANY__NAME, GenericsPackage.Literals.COMPANY__SHORT_NAME, GenericsPackage.Literals.COMPANY__WEBSITE }); tableViewer.setLabelProvider(new ToleranceObservableMapLabelProvider(observeMaps)); IEMFListProperty resourceProperty = EMFEditProperties.resource(editingService.getEditingDomain()); IObservableList operatorsObservableList = resourceProperty.observe(operatorResource); tableViewer.setInput(operatorsObservableList); EMFDataBindingContext bindingContext = new EMFDataBindingContext(); return bindingContext; } /* * (non-Javadoc) * * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer() */ public Viewer getViewer() { return this.getTableViewerWidget(); } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid() */ public boolean isValid() { return true; } public Form getScreenForm() { return this.frmOperators; } private final List<IAction> actions = Lists.newArrayList(); @Override public IAction[] getActions() { // Lazy init. if (actions.isEmpty()) { String actionText = ScreenUtil.isReadOnlyOperation(getOperation()) ? "View" : "Edit"; actions.add(new EditOperatorAction(actionText + "...")); } return actions.toArray(new IAction[actions.size()]); } @Override public String getScreenName() { return "Operators"; } }