/** * Copyright (c) 2009 Bestsolution.at and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Tom Schindl<tom.schindl@bestsolution.at> - Initial API and implementation */ package org.eclipse.emf.example.databinding.project.ui.rcp.views; import java.util.Calendar; import java.util.Collection; import java.util.Date; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.ObservablesManager; import org.eclipse.core.databinding.conversion.Converter; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.property.list.IListProperty; import org.eclipse.core.databinding.property.value.IValueProperty; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; 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.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.ui.IViewSite; import org.eclipse.emf.databinding.EMFUpdateValueStrategy; import org.eclipse.emf.databinding.FeaturePath; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.example.databinding.project.ui.rcp.Activator; import org.eclipse.emf.example.databinding.project.ui.rcp.databinding.GenericMapCellLabelProvider; import org.eclipse.emf.examples.databinding.project.core.model.project.CommitterShip; import org.eclipse.emf.examples.databinding.project.core.model.project.ProjectPackage; /** * Part showing the current committers */ public class ProjectCommittersPart { private static final String END_DATE_PROPERTY = "enddate"; /** * Create a new part * @param site the site * @param folder the folder where shown * @param ctx the databinding context * @param editingDomain the editing domain to make changes * @param manager manager for observables to avoid leaks * @param master the master observable */ public ProjectCommittersPart( IViewSite site, CTabFolder folder, DataBindingContext ctx, EditingDomain editingDomain, ObservablesManager manager, IObservableValue master) { init(site, folder, ctx, editingDomain, master); } private void init(IViewSite site, CTabFolder folder, DataBindingContext ctx, EditingDomain editingDomain, IObservableValue master) { final TableViewer viewer = new TableViewer(folder, SWT.FULL_SELECTION); { IValueProperty prop = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.PROJECT__COMMITTERS); CTabItem item = new CTabItem(folder, SWT.NONE); item.setControl(viewer.getControl()); ctx.bindValue( WidgetProperties.text().observe(item), prop.observeDetail(master), new EMFUpdateValueStrategy(), new EMFUpdateValueStrategy().setConverter(new LengthConverter())); } folder.setSelection(0); viewer.getTable().setHeaderVisible(true); ObservableListContentProvider cp = new ObservableListContentProvider(); { IObservableMap[] attributeMap = new IObservableMap [2]; attributeMap[0] = EMFEditProperties.value( editingDomain, FeaturePath.fromList(ProjectPackage.Literals.COMMITTER_SHIP__PERSON, ProjectPackage.Literals.PERSON__LASTNAME)).observeDetail( cp.getKnownElements()); attributeMap[1] = EMFEditProperties.value( editingDomain, FeaturePath.fromList(ProjectPackage.Literals.COMMITTER_SHIP__PERSON, ProjectPackage.Literals.PERSON__FIRSTNAME)).observeDetail( cp.getKnownElements()); TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.getColumn().setText("Name"); column.getColumn().setWidth(150); column.setLabelProvider(new GenericMapCellLabelProvider("{0}, {1}", attributeMap)); } { IObservableMap attributeMap = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTER_SHIP__START).observeDetail( cp.getKnownElements()); TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.getColumn().setText("Start"); column.getColumn().setWidth(100); column.setLabelProvider(new GenericMapCellLabelProvider("{0,date,short}", attributeMap)); } { IObservableMap attributeMap = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTER_SHIP__END).observeDetail( cp.getKnownElements()); TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE); column.getColumn().setText("End"); column.getColumn().setWidth(100); column.setLabelProvider(new GenericMapCellLabelProvider("{0,date,short}", attributeMap)); } IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PROJECT__COMMITTERS); viewer.setContentProvider(cp); viewer.setInput(prop.observeDetail(master)); MenuManager mgr = new MenuManager(); mgr.add(new Action("Hide historic committers", IAction.AS_CHECK_BOX) { @Override public void run() { if (isChecked()) { viewer.addFilter(new ViewerFilterImpl()); } else { viewer.setFilters(new ViewerFilter [0]); } } }); viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl())); site.registerContextMenu(Activator.PLUGIN_ID + ".committers", mgr, viewer); } private class LengthConverter extends Converter { public LengthConverter() { super(Collection.class, String.class); } public Object convert(Object fromObject) { return "Committers (" + (fromObject != null ? ((Collection< ? >)fromObject).size() : "0") + ")"; } } private class ViewerFilterImpl extends ViewerFilter { @Override public boolean isFilterProperty(Object element, String property) { if (property != null && property == END_DATE_PROPERTY) { return true; } return super.isFilterProperty(element, property); } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { Date enddate = ((CommitterShip)element).getEnd(); if (enddate == null || enddate.getTime() > Calendar.getInstance().getTimeInMillis()) { return true; } return false; } } /** * Release all allocated resources */ public void dispose() { // Ignore } }