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.f2; 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.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.IEMFListProperty; import org.eclipse.emf.databinding.edit.EMFEditProperties; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IMemento; 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.library.LibraryFactory; import com.netxforge.netxstudio.library.Tolerance; 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.editing.util.CDOMementoUtil; 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; import com.netxforge.screens.editing.base.util.MementoUtil; /** * @author Christophe Bouhier christophe.bouhier@netxforge.com * */ public class Tolerances extends AbstractScreen implements IDataServiceInjection { private static final String MEM_KEY_TOLERANCE_SELECTION_TABLE = "MEM_KEY_TOLERANCE_SELECTION_TABLE"; private static final String MEM_KEY_TOLERANCE_COLUMNS_TABLE = "MEM_KEY_TOLERANCE_COLUMNS_TABLE"; protected static final int PAGE_SIZE = 64; private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Text txtFilterText; private Table table; private TableViewer toleranceTblViewer; @SuppressWarnings("unused") private DataBindingContext bindingContext; private Form frmTolerances; private ObservableListContentProvider listContentProvider; private Resource toleranceResource; /** * Create the composite. * * @param parent * @param style */ public Tolerances(Composite parent, int style) { super(parent, style); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { toolkit.dispose(); } }); toolkit.adapt(this); toolkit.paintBordersFor(this); } private void buildUI() { setLayout(new FillLayout(SWT.HORIZONTAL)); // Readonlyness. boolean readonly = ScreenUtil.isReadOnlyOperation(this.getOperation()); int widgetStyle = readonly ? SWT.READ_ONLY : SWT.NONE; frmTolerances = toolkit.createForm(this); frmTolerances.setSeparatorVisible(true); toolkit.paintBordersFor(frmTolerances); frmTolerances.setText(getOperationText() + "Tolerances"); frmTolerances.getBody().setLayout(new GridLayout(3, false)); Label lblFilterLabel = toolkit.createLabel(frmTolerances.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(frmTolerances.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) { toleranceTblViewer.refresh(); ViewerFilter[] filters = toleranceTblViewer.getFilters(); for (ViewerFilter viewerFilter : filters) { if (viewerFilter instanceof ISearchFilter) { ((ISearchFilter) viewerFilter).setSearchText(txtFilterText.getText()); } } } }); // Conditional widget. if (!readonly) { ImageHyperlink mghprlnkNew = toolkit.createImageHyperlink(frmTolerances.getBody(), SWT.NONE); mghprlnkNew.addHyperlinkListener(new IHyperlinkListener() { public void linkActivated(HyperlinkEvent e) { NewEditTolerance toleranceScreen = new NewEditTolerance(screenService.getScreenContainer(), SWT.NONE); toleranceScreen.setOperation(ScreenUtil.OPERATION_NEW); toleranceScreen.setScreenService(screenService); Tolerance tolerance = LibraryFactory.eINSTANCE.createTolerance(); toleranceScreen.injectData(toleranceResource, tolerance); screenService.setActiveScreen(toleranceScreen); } 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/Threshold_E.png")); mghprlnkNew.setBounds(0, 0, 114, 17); toolkit.paintBordersFor(mghprlnkNew); mghprlnkNew.setText("New"); } toleranceTblViewer = new TableViewer(frmTolerances.getBody(), SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.VIRTUAL | widgetStyle); toleranceTblViewer.setComparer(new CDOElementComparer()); toleranceTblViewer.setUseHashlookup(true); table = toleranceTblViewer.getTable(); table.addListener(SWT.SetData, new Listener() { public void handleEvent(Event event) { TableItem item = (TableItem) event.item; int index = table.indexOf(item); int start = index / PAGE_SIZE * PAGE_SIZE; int end = Math.min(start + PAGE_SIZE, table.getItemCount()); System.out.println("SWT.SetData i=" + index + ", s=" + start + ", e=" + end); } }); table.setLinesVisible(true); table.setHeaderVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1)); toolkit.paintBordersFor(table); toleranceTblViewer.addFilter(new CDOSearchFilter()); } /** * */ public void buildColumns() { TableViewerColumn tableViewerColumn = new TableViewerColumn(toleranceTblViewer, SWT.NONE); TableColumn tblclmnName = tableViewerColumn.getColumn(); tblclmnName.setWidth(143); tblclmnName.setText("Name"); TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(toleranceTblViewer, SWT.NONE); TableColumn tblclmnOwnedBy = tableViewerColumn_1.getColumn(); tblclmnOwnedBy.setWidth(100); tblclmnOwnedBy.setText("Level"); TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(toleranceTblViewer, SWT.NONE); TableColumn tblclmnExpression = tableViewerColumn_2.getColumn(); tblclmnExpression.setWidth(250); tblclmnExpression.setText("Expression"); } /** * Wrap in an action, to contribute to a menu manager. * * @author Christophe Bouhier * */ class EditToleranceAction extends Action { public EditToleranceAction(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) { NewEditTolerance toleranceScreen = new NewEditTolerance(screenService.getScreenContainer(), SWT.NONE); toleranceScreen.setOperation(getOperation()); toleranceScreen.setScreenService(screenService); toleranceScreen.injectData(toleranceResource, o); screenService.setActiveScreen(toleranceScreen); } } } } } public TableViewer getTableViewerWidget() { return toleranceTblViewer; } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.data.IDataServiceInjection#injectData() */ public void injectData() { if (toleranceResource instanceof CDOResource) { CDOResource tolResource = (CDOResource) toleranceResource; tolResource.cdoPrefetch(CDORevision.DEPTH_INFINITE); } buildUI(); initDataBindings_(); } public EMFDataBindingContext initDataBindings_() { listContentProvider = new ObservableListContentProvider(); toleranceTblViewer.setContentProvider(listContentProvider); toleranceTblViewer.setLabelProvider(new ToleranceObservableMapLabelProvider(new IObservableMap[] {})); IEMFListProperty l = EMFEditProperties.resource(editingService.getEditingDomain()); IObservableList toleranceObservableList = l.observe(toleranceResource); // obm.addObservable(toleranceObservableList); toleranceTblViewer.setInput(toleranceObservableList); 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.frmTolerances; } private final List<IAction> actions = Lists.newArrayList(); @Override public IAction[] getActions() { if (actions.isEmpty()) { String actionText = ScreenUtil.isReadOnlyOperation(getOperation()) ? "View" : "Edit"; actions.add(new EditToleranceAction(actionText + "...")); } return actions.toArray(new IAction[actions.size()]); } @Override public String getScreenName() { return "Tolerances"; } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.AbstractScreenImpl#saveState(org.eclipse * .ui.IMemento) */ @Override public void saveState(IMemento memento) { // sash state vertical. CDOMementoUtil.rememberStructuredViewerSelection(memento, toleranceTblViewer, MEM_KEY_TOLERANCE_SELECTION_TABLE); MementoUtil.rememberStructuredViewerColumns(memento, toleranceTblViewer, MEM_KEY_TOLERANCE_COLUMNS_TABLE); } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.AbstractScreenImpl#init(org.eclipse. * ui.IMemento) */ @Override public void restoreState(IMemento memento) { if (memento != null && toleranceResource != null) { CDOMementoUtil.retrieveStructuredViewerSelection(memento, toleranceTblViewer, MEM_KEY_TOLERANCE_SELECTION_TABLE, ((CDOResource) toleranceResource).cdoView()); MementoUtil.retrieveStructuredViewerColumns(memento, toleranceTblViewer, MEM_KEY_TOLERANCE_COLUMNS_TABLE); } } }