/*******************************************************************************
* Copyright (c) 2009 BestSolution.at and others.
* 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:
* Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.examples.library.databinding.stock.dialog;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.property.value.IValueProperty;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.databinding.edit.properties.EMFEditProperties;
import org.eclipse.emf.databinding.edit.properties.IEMFEditValueProperty;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.example.library.service.ISavePoint;
import org.eclipse.emf.example.library.service.ISavePointEditingDomain;
import org.eclipse.emf.examples.extlibrary.Book;
import org.eclipse.emf.examples.extlibrary.BookCategory;
import org.eclipse.emf.examples.extlibrary.EXTLibraryPackage;
import org.eclipse.emf.examples.extlibrary.Library;
import org.eclipse.emf.examples.extlibrary.Writer;
import org.eclipse.emf.examples.library.databinding.common.converter.DateToStringConverter;
import org.eclipse.emf.examples.library.databinding.tokenviewer.TokenViewer;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class BookDialog extends TitleAreaDialog {
private Book book;
private Library library;
private ISavePointEditingDomain domain;
private ISavePoint savePoint;
public BookDialog(Shell parentShell, ISavePointEditingDomain domain, Library library,
Book book) {
super(parentShell);
this.book = book;
this.library = library;
this.domain = domain;
}
@Override
protected Point getInitialSize() {
return new Point(500,super.getInitialSize().y);
}
@Override
public int open() {
savePoint = domain.addSavePoint(EcoreUtil.generateUUID());
return super.open();
}
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
getShell().setText("Edit Book");
setTitle("Edit the book");
setMessage("Edit the data of the book with the form below and press ok when done or cancel to undo all modifications.");
Composite comp = new Composite(container, SWT.NONE);
comp.setLayoutData(new GridData(GridData.FILL_BOTH));
comp.setLayout(new GridLayout(2, false));
DataBindingContext dbc = new DataBindingContext();
/*
* Title
*/
Label l = new Label(comp, SWT.NONE);
l.setText("Title");
Text t = new Text(comp, SWT.BORDER);
t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
IValueProperty uProp = WidgetProperties.text(SWT.Modify);
IEMFEditValueProperty mProp = EMFEditProperties.value(domain,
EXTLibraryPackage.Literals.BOOK__TITLE);
dbc.bindValue(SWTObservables.observeDelayedValue(400,
(ISWTObservableValue) uProp.observe(t)), mProp.observe(book));
/*
* Publication Date
*/
l = new Label(comp, SWT.NONE);
l.setText("Publication Date");
t = new Text(comp, SWT.BORDER);
t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mProp = EMFEditProperties.value(domain,
EXTLibraryPackage.Literals.ITEM__PUBLICATION_DATE);
dbc.bindValue(SWTObservables.observeDelayedValue(400,
(ISWTObservableValue) uProp.observe(t)), mProp.observe(book),
new UpdateValueStrategy(), new UpdateValueStrategy()
.setConverter(new DateToStringConverter()));
/*
* Copies
*/
l = new Label(comp, SWT.NONE);
l.setText("Copies");
t = new Text(comp, SWT.BORDER);
t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mProp = EMFEditProperties.value(domain,
EXTLibraryPackage.Literals.LENDABLE__COPIES);
dbc.bindValue(SWTObservables.observeDelayedValue(400,
(ISWTObservableValue) uProp.observe(t)), mProp.observe(book));
/*
* Pages
*/
l = new Label(comp, SWT.NONE);
l.setText("Pages");
t = new Text(comp, SWT.BORDER);
t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
mProp = EMFEditProperties.value(domain,
EXTLibraryPackage.Literals.BOOK__PAGES);
dbc.bindValue(SWTObservables.observeDelayedValue(400,
(ISWTObservableValue) uProp.observe(t)), mProp.observe(book));
/*
* Category
*/
l = new Label(comp, SWT.NONE);
l.setText("Category");
ComboViewer categoryViewer = new ComboViewer(comp, SWT.BORDER);
categoryViewer.setContentProvider(new ArrayContentProvider());
categoryViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
switch ((BookCategory) element) {
case BIOGRAPHY_LITERAL:
return "Biographie";
case MYSTERY_LITERAL:
return "Mystery";
case SCIENCE_FICTION_LITERAL:
return "Science Fiction";
default:
return "";
}
}
});
categoryViewer.getCombo().setLayoutData(
new GridData(GridData.FILL_HORIZONTAL));
categoryViewer.setInput(new BookCategory[] {
BookCategory.BIOGRAPHY_LITERAL, BookCategory.MYSTERY_LITERAL,
BookCategory.SCIENCE_FICTION_LITERAL });
IValueProperty selectionProp = ViewerProperties.singleSelection();
mProp = EMFEditProperties.value(domain,
EXTLibraryPackage.Literals.BOOK__CATEGORY);
dbc.bindValue(selectionProp.observe(categoryViewer), mProp
.observe(book));
/*
* Author
*/
l = new Label(comp, SWT.NONE);
l.setText("Author");
TokenViewer authorViewer = new TokenViewer(comp);
authorViewer.getControl().setLayoutData(
new GridData(GridData.FILL_HORIZONTAL));
authorViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
Writer w = (Writer) element;
return w.getLastName() + ", " + w.getFirstName();
}
});
authorViewer.setContentProvider(new ArrayContentProvider());
authorViewer.setInput(EMFEditObservables.observeList(
Realm.getDefault(), domain, library,
EXTLibraryPackage.Literals.LIBRARY__WRITERS));
mProp = EMFEditProperties.value(domain,
EXTLibraryPackage.Literals.BOOK__AUTHOR);
dbc.bindValue(selectionProp.observe(authorViewer), mProp.observe(book));
return container;
}
@Override
protected void okPressed() {
savePoint.dispose();
super.okPressed();
}
@Override
protected void cancelPressed() {
if( savePoint.canRollback() ) {
savePoint.rollback();
super.cancelPressed();
} else {
MessageDialog.openInformation(getShell(), "Rollback failed", "An error occurred while rolling back to the save point!");
}
}
}