Home » Eclipse Projects » JFace » Model refactoring and data Binding
Model refactoring and data Binding [message #515432] |
Thu, 18 February 2010 18:20 |
Mauro Condarelli Messages: 428 Registered: September 2009 |
Senior Member |
|
|
Hi,
I wanted to refactor my model:
several nodes have a bunch of fields that are equivalent:
public interface Book extends EObject {
World getWorld();
Project getProject();
EList<Actor> getActor();
EList<Chapter> getChapter();
EList<Location> getLocation();
EList<Item> getItem();
String getTitle();
boolean isUnused();
TimeEvent getTime();
String getDesc();
String getContent();
Chronology getChronology();
Image getImage();
}
public interface Chapter extends EObject {
Book getBook();
EList<Actor> getActor();
EList<Scene> getScene();
boolean isSectionStart();
String getTitle();
boolean isUnused();
String getDesc();
String getContent();
Chronology getChronology();
Image getImage();
}
public interface Item extends EObject {
Actor getOwner();
String getTitle();
boolean isUnused();
String getDesc();
String getContent();
Chronology getChronology();
Image getImage();
}
.... etc. etc.
I wanted to refactor like this:
public interface IBase extends EObject {
String getTitle();
boolean isUnused();
String getDesc();
String getContent();
Chronology getChronology();
Image getImage();
}
public interface Book extends IBase {
World getWorld();
Project getProject();
EList<Actor> getActor();
EList<Chapter> getChapter();
EList<Location> getLocation();
EList<Item> getItem();
}
public interface Chapter extends IBase {
Book getBook();
EList<Actor> getActor();
EList<Scene> getScene();
boolean isSectionStart();
}
public interface Item extends IBase {
Actor getOwner();
}
EMF is happy and generates the right code, but Databinding isn't!
I had things like:
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue txtTitleObserveTextObserveWidget =
SWTObservables.observeText(txtTitle, SWT.Modify);
IObservableValue bookTitleObserveValue =
EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
Literals.CHAPTER__TITLE);
bindingContext.bindValue(txtTitleObserveTextObserveWidget,
bookTitleObserveValue, null, null);
//
IObservableValue txtDescObserveTextObserveWidget =
SWTObservables.observeText(txtDesc, SWT.Modify);
IObservableValue bookDescObserveValue =
EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
Literals.CHAPTER__DESC);
bindingContext.bindValue(txtDescObserveTextObserveWidget,
bookDescObserveValue, null, null);
//
ObservableListContentProvider listContentProvider = new
ObservableListContentProvider();
tViewer.setContentProvider(listContentProvider);
//
IObservableMap[] observeMaps =
EMFObservables.observeMaps(listContentProvider.getKnownEleme nts(), new
EStructuralFeature[]{Literals.SCENE__TITLE, Literals.SCENE__GOAL,
Literals.SCENE__DESC});
tViewer.setLabelProvider(new
ObservableMapLabelProvider(observeMaps));
//
IObservableList bookChapterObserveList =
EMFObservables.observeDetailList(Realm.getDefault(), observableChapter,
Literals.CHAPTER__SCENE);
tViewer.setInput(bookChapterObserveList);
//
return bindingContext;
}
This has errors because Literals.CHAPTER__TITLE, Literals.CHAPTER__DESC,
Literals.SCENE__TITLE, Literals.SCENE__DESC do not exist anymore.
I tried changing the above to:
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue txtTitleObserveTextObserveWidget =
SWTObservables.observeText(txtTitle, SWT.Modify);
IObservableValue bookTitleObserveValue =
EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
Literals.IBASE__TITLE);
bindingContext.bindValue(txtTitleObserveTextObserveWidget,
bookTitleObserveValue, null, null);
//
IObservableValue txtDescObserveTextObserveWidget =
SWTObservables.observeText(txtDesc, SWT.Modify);
IObservableValue bookDescObserveValue =
EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
Literals.IBASE__DESC);
bindingContext.bindValue(txtDescObserveTextObserveWidget,
bookDescObserveValue, null, null);
//
ObservableListContentProvider listContentProvider = new
ObservableListContentProvider();
tViewer.setContentProvider(listContentProvider);
//
IObservableMap[] observeMaps =
EMFObservables.observeMaps(listContentProvider.getKnownEleme nts(), new
EStructuralFeature[]{Literals.IBASE__TITLE, Literals.SCENE__GOAL,
Literals.IBASE__DESC});
tViewer.setLabelProvider(new
ObservableMapLabelProvider(observeMaps));
//
IObservableList bookChapterObserveList =
EMFObservables.observeDetailList(Realm.getDefault(), observableChapter,
Literals.CHAPTER__SCENE);
tViewer.setInput(bookChapterObserveList);
//
return bindingContext;
}
It compiles, but it does not run:
org.eclipse.core.runtime.AssertionFailedException: unknown saveable:
org.eclipse.ui.internal.DefaultSaveable@1a73d30 from part:
org.eclipse.ui.internal.ErrorEditorPart@1a73d30
at org.eclipse.ui.internal.SaveablesList.logWarning(SaveablesLi st.java:187)
at org.eclipse.ui.internal.SaveablesList.addModel(SaveablesList .java:117)
at org.eclipse.ui.internal.SaveablesList.addModels(SaveablesLis t.java:289)
at org.eclipse.ui.internal.SaveablesList.postOpen(SaveablesList .java:684)
at org.eclipse.ui.internal.PartList.partOpened(PartList.java:23 4)
at org.eclipse.ui.internal.PartList.access$0(PartList.java:210)
....
I'm not surprised it doesn't run. Some information is lost in the
translation (.e.g.: the oserveMaps() cannot know if it should observe a
BOOK__TITLE or a SCENE_TITLE), but I can' see how add it back.
Any suggestion is VERY welcome.
Regards
Mauro
P.S.: which is the right group for this kind of questions? Should I keep
cross-posting?
Cheers!
Mauro
|
|
|
Re: Model refactoring and data Binding [message #515433 is a reply to message #515432] |
Thu, 18 February 2010 18:33 |
Thomas Schindl Messages: 6651 Registered: July 2009 |
Senior Member |
|
|
Sorry but the exception you show doesn't has any Databinding in it.
Tom
Am 18.02.10 19:20, schrieb Mauro Condarelli:
> Hi,
> I wanted to refactor my model:
> several nodes have a bunch of fields that are equivalent:
>
> public interface Book extends EObject {
> World getWorld();
> Project getProject();
> EList<Actor> getActor();
> EList<Chapter> getChapter();
> EList<Location> getLocation();
> EList<Item> getItem();
> String getTitle();
> boolean isUnused();
> TimeEvent getTime();
> String getDesc();
> String getContent();
> Chronology getChronology();
> Image getImage();
> }
> public interface Chapter extends EObject {
> Book getBook();
> EList<Actor> getActor();
> EList<Scene> getScene();
> boolean isSectionStart();
> String getTitle();
> boolean isUnused();
> String getDesc();
> String getContent();
> Chronology getChronology();
> Image getImage();
> }
> public interface Item extends EObject {
> Actor getOwner();
> String getTitle();
> boolean isUnused();
> String getDesc();
> String getContent();
> Chronology getChronology();
> Image getImage();
> }
> ... etc. etc.
>
> I wanted to refactor like this:
>
> public interface IBase extends EObject {
> String getTitle();
> boolean isUnused();
> String getDesc();
> String getContent();
> Chronology getChronology();
> Image getImage();
> }
> public interface Book extends IBase {
> World getWorld();
> Project getProject();
> EList<Actor> getActor();
> EList<Chapter> getChapter();
> EList<Location> getLocation();
> EList<Item> getItem();
> }
> public interface Chapter extends IBase {
> Book getBook();
> EList<Actor> getActor();
> EList<Scene> getScene();
> boolean isSectionStart();
> }
> public interface Item extends IBase {
> Actor getOwner();
> }
>
> EMF is happy and generates the right code, but Databinding isn't!
>
> I had things like:
>
> protected DataBindingContext initDataBindings() {
> DataBindingContext bindingContext = new DataBindingContext();
> //
> IObservableValue txtTitleObserveTextObserveWidget =
> SWTObservables.observeText(txtTitle, SWT.Modify);
> IObservableValue bookTitleObserveValue =
> EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
> Literals.CHAPTER__TITLE);
> bindingContext.bindValue(txtTitleObserveTextObserveWidget,
> bookTitleObserveValue, null, null);
> //
> IObservableValue txtDescObserveTextObserveWidget =
> SWTObservables.observeText(txtDesc, SWT.Modify);
> IObservableValue bookDescObserveValue =
> EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
> Literals.CHAPTER__DESC);
> bindingContext.bindValue(txtDescObserveTextObserveWidget,
> bookDescObserveValue, null, null);
> //
> ObservableListContentProvider listContentProvider = new
> ObservableListContentProvider();
> tViewer.setContentProvider(listContentProvider);
> //
> IObservableMap[] observeMaps =
> EMFObservables.observeMaps(listContentProvider.getKnownEleme nts(), new
> EStructuralFeature[]{Literals.SCENE__TITLE, Literals.SCENE__GOAL,
> Literals.SCENE__DESC});
> tViewer.setLabelProvider(new
> ObservableMapLabelProvider(observeMaps));
> //
> IObservableList bookChapterObserveList =
> EMFObservables.observeDetailList(Realm.getDefault(), observableChapter,
> Literals.CHAPTER__SCENE);
> tViewer.setInput(bookChapterObserveList);
> //
> return bindingContext;
> }
>
> This has errors because Literals.CHAPTER__TITLE, Literals.CHAPTER__DESC,
> Literals.SCENE__TITLE, Literals.SCENE__DESC do not exist anymore.
>
> I tried changing the above to:
>
> protected DataBindingContext initDataBindings() {
> DataBindingContext bindingContext = new DataBindingContext();
> //
> IObservableValue txtTitleObserveTextObserveWidget =
> SWTObservables.observeText(txtTitle, SWT.Modify);
> IObservableValue bookTitleObserveValue =
> EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
> Literals.IBASE__TITLE);
> bindingContext.bindValue(txtTitleObserveTextObserveWidget,
> bookTitleObserveValue, null, null);
> //
> IObservableValue txtDescObserveTextObserveWidget =
> SWTObservables.observeText(txtDesc, SWT.Modify);
> IObservableValue bookDescObserveValue =
> EMFObservables.observeDetailValue(Realm.getDefault(), observableChapter,
> Literals.IBASE__DESC);
> bindingContext.bindValue(txtDescObserveTextObserveWidget,
> bookDescObserveValue, null, null);
> //
> ObservableListContentProvider listContentProvider = new
> ObservableListContentProvider();
> tViewer.setContentProvider(listContentProvider);
> //
> IObservableMap[] observeMaps =
> EMFObservables.observeMaps(listContentProvider.getKnownEleme nts(), new
> EStructuralFeature[]{Literals.IBASE__TITLE, Literals.SCENE__GOAL,
> Literals.IBASE__DESC});
> tViewer.setLabelProvider(new
> ObservableMapLabelProvider(observeMaps));
> //
> IObservableList bookChapterObserveList =
> EMFObservables.observeDetailList(Realm.getDefault(), observableChapter,
> Literals.CHAPTER__SCENE);
> tViewer.setInput(bookChapterObserveList);
> //
> return bindingContext;
> }
>
> It compiles, but it does not run:
>
> org.eclipse.core.runtime.AssertionFailedException: unknown saveable:
> org.eclipse.ui.internal.DefaultSaveable@1a73d30 from part:
> org.eclipse.ui.internal.ErrorEditorPart@1a73d30
> at
> org.eclipse.ui.internal.SaveablesList.logWarning(SaveablesLi st.java:187)
> at
> org.eclipse.ui.internal.SaveablesList.addModel(SaveablesList .java:117)
> at
> org.eclipse.ui.internal.SaveablesList.addModels(SaveablesLis t.java:289)
> at
> org.eclipse.ui.internal.SaveablesList.postOpen(SaveablesList .java:684)
> at org.eclipse.ui.internal.PartList.partOpened(PartList.java:23 4)
> at org.eclipse.ui.internal.PartList.access$0(PartList.java:210)
> ...
>
> I'm not surprised it doesn't run. Some information is lost in the
> translation (.e.g.: the oserveMaps() cannot know if it should observe a
> BOOK__TITLE or a SCENE_TITLE), but I can' see how add it back.
>
> Any suggestion is VERY welcome.
>
> Regards
> Mauro
>
> P.S.: which is the right group for this kind of questions? Should I keep
> cross-posting?
>
> Cheers!
> Mauro
|
|
| | | |
Goto Forum:
Current Time: Sat Apr 20 00:15:02 GMT 2024
Powered by FUDForum. Page generated in 0.03746 seconds
|