Java tutorial
/******************************************************************************* * Copyright (c) May 16, 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.nf4; import java.util.Date; 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.EMFProperties; import org.eclipse.emf.databinding.IEMFListProperty; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.wb.swt.TableViewerColumnSorter; import com.netxforge.base.NonModelUtils; import com.netxforge.netxstudio.generics.CommitLogEntry; import com.netxforge.netxstudio.generics.GenericsPackage; import com.netxforge.netxstudio.generics.Person; import com.netxforge.netxstudio.screens.AbstractScreen; import com.netxforge.netxstudio.screens.editing.tables.CDOElementComparer; import com.netxforge.screens.editing.base.IDataScreenInjection; import com.netxforge.screens.editing.base.ScreenUtil; /** * @author Christophe Bouhier christophe.bouhier@netxforge.com * */ public class UserActivity extends AbstractScreen implements IDataScreenInjection { private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); private Table table; public UserActivity(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)); frmActivities = toolkit.createForm(this); frmActivities.setSeparatorVisible(true); toolkit.paintBordersFor(frmActivities); frmActivities.setText(""); frmActivities.getBody().setLayout(new FormLayout()); Section sctnInfo = toolkit.createSection(frmActivities.getBody(), Section.EXPANDED | Section.TITLE_BAR); FormData fd_sctnInfo = new FormData(); fd_sctnInfo.top = new FormAttachment(frmActivities.getBody(), 12); fd_sctnInfo.bottom = new FormAttachment(100, -12); fd_sctnInfo.right = new FormAttachment(100, -12); fd_sctnInfo.left = new FormAttachment(0, 12); sctnInfo.setLayoutData(fd_sctnInfo); toolkit.paintBordersFor(sctnInfo); sctnInfo.setText("Activities"); Composite composite_1 = toolkit.createComposite(sctnInfo, SWT.NONE); toolkit.paintBordersFor(composite_1); sctnInfo.setClient(composite_1); GridLayout gl_composite_1 = new GridLayout(1, false); gl_composite_1.horizontalSpacing = 8; composite_1.setLayout(gl_composite_1); tableViewer = new TableViewer(composite_1, SWT.BORDER | SWT.VIRTUAL | SWT.FULL_SELECTION | SWT.MULTI); tableViewer.setUseHashlookup(true); tableViewer.setComparer(new CDOElementComparer()); table = tableViewer.getTable(); table.setLinesVisible(true); table.setHeaderVisible(true); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); toolkit.paintBordersFor(table); TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnNewColumn = tableViewerColumn.getColumn(); tblclmnNewColumn.setWidth(150); tblclmnNewColumn.setText("Date / Time"); TableViewerColumnSorter dateTimeColumnSorter = new TableViewerColumnSorter(tableViewerColumn) { protected int doCompare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof CommitLogEntry && e2 instanceof CommitLogEntry) { CommitLogEntry re1 = (CommitLogEntry) e1; CommitLogEntry re2 = (CommitLogEntry) e2; if (re1.eIsSet(GenericsPackage.Literals.COMMIT_LOG_ENTRY__TIME_STAMP) && re2.eIsSet(GenericsPackage.Literals.COMMIT_LOG_ENTRY__TIME_STAMP)) return Long.valueOf(re2.getTimeStamp().toGregorianCalendar().getTimeInMillis()).compareTo( Long.valueOf(re1.getTimeStamp().toGregorianCalendar().getTimeInMillis())); } return 0; } }; dateTimeColumnSorter.setSorter(TableViewerColumnSorter.ASC); TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnObject = tableViewerColumn_1.getColumn(); tblclmnObject.setWidth(200); tblclmnObject.setText("Object"); TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnActivity = tableViewerColumn_2.getColumn(); tblclmnActivity.setWidth(114); tblclmnActivity.setText("Activity"); TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(tableViewer, SWT.NONE); TableColumn tblclmnData = tableViewerColumn_3.getColumn(); tblclmnData.setWidth(100); tblclmnData.setText("Data"); } /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.screens.editing.selector.IScreen#getOperation() */ public int getOperation() { return ScreenUtil.OPERATION_READ_ONLY; } private Resource commitEntries; private TableViewer tableViewer; private Form frmActivities; /* * (non-Javadoc) * * @see * com.netxforge.netxstudio.data.IDataScreenInjection#injectData(java.lang * .Object, java.lang.Object) */ public void injectData(Object owner, Object object) { if (object instanceof Person) { Person user = (Person) object; String userID = user.getLogin(); buildUI(); getScreenForm().setText("User: " + userID); commitEntries = getCDOEditingService().getCDOData().getCommitInfoResource(userID); } else { throw new java.lang.IllegalArgumentException(); } this.initDataBindings_(); } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.data.IDataScreenInjection#addData() */ public void addData() { throw new java.lang.UnsupportedOperationException(); } public EMFDataBindingContext initDataBindings_() { EMFDataBindingContext bindingContext = new EMFDataBindingContext(); ObservableListContentProvider listContentProvider = new ObservableListContentProvider(); tableViewer.setContentProvider(listContentProvider); IObservableMap[] observeMaps = EMFObservables.observeMaps(listContentProvider.getKnownElements(), new EStructuralFeature[] { GenericsPackage.Literals.COMMIT_LOG_ENTRY__TIME_STAMP, GenericsPackage.Literals.COMMIT_LOG_ENTRY__OBJECT_ID, GenericsPackage.Literals.COMMIT_LOG_ENTRY__ACTION, GenericsPackage.Literals.COMMIT_LOG_ENTRY__CHANGE }); tableViewer.setLabelProvider(new CommitObservableMapLabelProvider(observeMaps)); // Cool, observer the whole resource. IEMFListProperty l = EMFProperties.resource(); tableViewer.setInput(l.observe(commitEntries)); return bindingContext; } class CommitObservableMapLabelProvider extends ObservableMapLabelProvider { public CommitObservableMapLabelProvider(IObservableMap[] attributeMaps) { super(attributeMaps); } public CommitObservableMapLabelProvider(IObservableMap attributeMap) { super(attributeMap); } @Override public String getText(Object element) { ((EObject) element).eContainmentFeature(); return super.getText(element); } @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof CommitLogEntry) { CommitLogEntry cle = (CommitLogEntry) element; switch (columnIndex) { case 0: { if (cle.eIsSet(GenericsPackage.Literals.COMMIT_LOG_ENTRY__TIME_STAMP)) { Date d = NonModelUtils.fromXMLDate(cle.getTimeStamp()); return NonModelUtils.date(d) + " @ " + NonModelUtils.time(d); } } case 1: { } break; } } return super.getColumnText(element, columnIndex); } } /* * (non-Javadoc) * * @see org.eclipse.emf.common.ui.viewer.IViewerProvider#getViewer() */ public Viewer getViewer() { return tableViewer; } /* * (non-Javadoc) * * @see com.netxforge.netxstudio.screens.editing.selector.IScreen#isValid() */ public boolean isValid() { return true; } public Form getScreenForm() { return frmActivities; } public String getScreenName() { return "Activity"; } }