<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1759528437624391151</id><updated>2011-09-06T05:58:06.642-06:00</updated><category term='qseclipse'/><category term='port flex eclipse databinding'/><category term='yahoo'/><category term='wiki'/><category term='emf'/><category term='BeansObservables'/><category term='bugs'/><category term='BoF'/><category term='eclipseCon'/><category term='PojoObservables'/><category term='observables'/><category term='pipeline'/><category term='jface'/><category term='3.2'/><category term='api'/><category term='pipe'/><category term='quicksilver'/><category term='validation'/><category term='bindings'/><category term='properties'/><category term='presentation model'/><category term='eclipsepedia'/><category term='duplexing'/><category term='newsgroup'/><category term='compatibility'/><category term='diagram'/><category term='data structures'/><category term='JavaBeans'/><category term='multiselect'/><category term='WritableValue'/><category term='bindspec'/><category term='databinding'/><category term='selection'/><category term='search'/><category term='master detail'/><category term='unit testing'/><category term='conformance tests'/><category term='bugzilla'/><category term='provisional API'/><category term='viewers'/><title type='text'>fireChangeEvent()</title><subtitle type='html'>Recent developments in the JFace Data Binding project.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-2978583799469292489</id><published>2010-09-02T00:28:00.007-06:00</published><updated>2010-09-02T03:14:03.855-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='port flex eclipse databinding'/><title type='text'>A new direction for bindings?</title><content type='html'>&lt;p&gt;I'm happy to report that I've been given company approval to port the relevant components of our Flex data binding library back to Eclipse Data Binding.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I haven't started the actual port yet--there are still some concepts on the Flex side that are not a perfect match to Java and existing idioms in Eclipse Data Binding. You'll see what I mean.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To avoid conflating the port to Java with the general API I'm going to just present what the Flex API looks like.&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Bind.from(source, "foo")&lt;br /&gt;      .to(target, "bar");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This binding watches the source.foo property, and writes the new value to target.bar each time a change it detected. Now add some validation and conversion magic:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Bind.from(source, "foo")&lt;br /&gt;      .validate(Validators.stringToNumber)&lt;br /&gt;      .convert(Converters.stringToNumber)&lt;br /&gt;      .validate(Validators.greaterEqual(0))&lt;br /&gt;      .validate(Validators.lessThan(10))&lt;br /&gt;      .to(target, "bar");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Here we've added several additional steps in the pipeline.&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt; After source.foo changes, we first validate that the string can be converted to a number. If so the pipeline continues to the next step, and terminates otherwise.&lt;br /&gt;&lt;li&gt; Next we convert the string to a number&lt;br /&gt;&lt;li&gt; Now validate that the number is greater than or equal to zero. If so the pipeline continues to the next step, and terminates otherwise.&lt;br /&gt;&lt;li&gt; Now validate that the number is less than 10. If so the pipeline continues and the number, now verified to be in the range [0,10), is written to target.bar.&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;Now suppose our binding is misbehaving somehow, and we want to troubleshoot. We can add logging steps to the pipeline in between the other steps so we can see exactly what is going on:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Bind.from(source, "foo")&lt;br /&gt;      .log(LogEventLeven.INFO, "source.foo == {0}")&lt;br /&gt;      .log(LogEventLeven.INFO, "validate {0} is a number")&lt;br /&gt;      .validate(Validators.stringToNumber)&lt;br /&gt;      .log(LogEventLeven.INFO, "convert {0} to a number")&lt;br /&gt;      .convert(Converters.stringToNumber)&lt;br /&gt;      .log(LogEventLeven.INFO, "validate {0} &gt;= 0")&lt;br /&gt;      .validate(Validators.greaterEqual(0))&lt;br /&gt;      .log(LogEventLeven.INFO, "validate {0} &lt;&gt;&lt;br /&gt;      .validate(Validators.lessThan(10))&lt;br /&gt;      .log(LogEventLeven.INFO, "set target.bar = {0}")&lt;br /&gt;      .to(target, "bar");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;(In Flex, string formatting is done with {n} format instead of the %s syntax which Java inherited from C. The log statement passes the values in the pipeline as additional arguments which you can reference in log statements.)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;These log steps are a real lifesaver for tracking down and squashing bugs in your binding code.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;If you've already worked with Eclipse Data Binding you may have noticed something else: you are no longer constrained to the standard data-binding pipeline. You are free to add steps in the pipeline wherever you like and in any order you like.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Next up is two-way bindings. The bind class provides a twoWay method which connects two bindings to the other one's starting point:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Bind.twoWay(&lt;br /&gt;      Bind.from(source, "foo"),&lt;br /&gt;      Bind.from(target, "bar") );&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;is equivalent to:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  var lock:Lock = new Lock();&lt;br /&gt;  Bind.from(source, "foo")&lt;br /&gt;      .lock(lock)&lt;br /&gt;      .to(target, "bar");&lt;br /&gt;  Bind.from(target, "bar")&lt;br /&gt;      .lock(lock)&lt;br /&gt;      .to(target, "foo");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Notice that each binding has a "lock" step in the pipeline. Only one binding can hold a lock at a time. This solves the common infinite loop problem:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt; source.foo changes. binding one executes, writing the value to target.bar&lt;br /&gt;&lt;li&gt; target.bar changes. binding two executes, writing the value to source.foo&lt;br /&gt;&lt;li&gt; source.foo changes. binding one executes, writing the value to target.bar&lt;br /&gt;&lt;li&gt; ...&lt;br /&gt;&lt;li&gt; stack overflow!&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;Since only one binding can hold the lock at a time, this is what happens instead:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt; source.foo changes. binding one acquires the lock and executes, writing the value to target.bar&lt;br /&gt;&lt;li&gt; target.bar changes. binding two attempts to acquire the lock but it is already acquired. binding two aborts.&lt;br /&gt;&lt;li&gt; binding one releases the lock&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;You should never add the same lock more than once to a single binding, since that would guarantee that the binding will never run.&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Two-way bindings can use validations, conversions, logging, locks etc just like regular one-way bindings (since two-way bindings are just two one-way bindings wired up to eachother):&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Bind.twoWay(&lt;br /&gt;      Bind.from(person, "birthDate")&lt;br /&gt;          .convert(Converters.dateToString(dateFormat))&lt;br /&gt;      Bind.from(heightText, "text")&lt;br /&gt;          .validate(Validators.stringToDate(dateFormat))&lt;br /&gt;          .convert(Converters.stringToDate(dateFormat))&lt;br /&gt;          .validate(Validators.lessEqual(now))&lt;br /&gt;      );&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;We usually leave out the validations in the model-to-UI bindings. It's usually only important to apply validations when you're copying data back from the UI to the model, to make sure domain constraints are satisfied, such as ensuring that a birth date occurred in the past.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;And now for my favorite part: binding from multiple sources, to multiple destinations. Raise your hand if you have ever had to wire up a UI form like this:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Is there a foo? (o) Yes  ( ) No &lt;-- fooRadioGroup&lt;br /&gt;&lt;br /&gt;  Enter bar: ____________________ &lt;-- barText&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Requirements:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt; fooRadioGroup.selectedItem is bound to model.foo (a boolean)&lt;br /&gt;&lt;li&gt; barText.text is bound to model.bar (a string)&lt;br /&gt;&lt;li&gt; barText must be enabled iff fooRadioGroup selection is Yes.&lt;br /&gt;&lt;li&gt; When the user clicks "No," set model.bar to null but do not clear the text box. If the user clicks "Yes" again, set model.bar back to the contents of barText&lt;br /&gt;&lt;/ol&gt;&lt;p&gt;Requirements 1 and 3 are easy:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  var fooLock:Lock = new Lock();&lt;br /&gt;  Bind.twoWay(&lt;br /&gt;      Bind.from(model, "foo"),&lt;br /&gt;      Bind.from(fooRadioGroup, "selectedItem"),&lt;br /&gt;      fooLock); // explicitly provide the lock, see more below&lt;br /&gt;&lt;br /&gt;  Bind.from(fooRadioGroup, "selectedItem")&lt;br /&gt;      .to(barText, "enabled");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Requirements 2 and 4 are kind of related to eachother. The model-to-UI binding is simple enough: just write the value straight across:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  var barLock:Lock = new Lock();&lt;br /&gt;  Bind.from(model, "bar")&lt;br /&gt;      .lock(barLock)&lt;br /&gt;      .to(barText, "text");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;However the inverse binding (UI-to-model) must also take fooRadioGroup.selectedItem into account to decide whether to write back barText.text (if Yes is selected) or null (if No is selected).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Bind class has another trick up its sleeve:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  Bind.fromAll(&lt;br /&gt;&lt;br /&gt;      Bind.from(fooRadioGroup, "selectedItem")&lt;br /&gt;          .lock(fooLock),&lt;br /&gt;&lt;br /&gt;      Bind.from(barText, "text")&lt;br /&gt;&lt;br /&gt;      )&lt;br /&gt;      .lock(barLock)&lt;br /&gt;      .convert(function(foo:Boolean, bar:String):String {&lt;br /&gt;        return foo ? bar : null;&lt;br /&gt;      })&lt;br /&gt;      .to(model, "bar");&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Look closely. The binding pipelines that we pass to fromAll(...) become the arguments, in the order they are provided, to the converter and validator functions further down the pipeline. The first pipeline is from fooRadioGroup.selectedItem and therefore that boolean value is the first argument to the converter. Likewise, the barText.text pipeline is provided second, so that string value becomes the second argument to the converter.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The converter takes multiple values but returns only a single value. This is where those values get coalesced into a single value that we can write to the model--in this case, a String value or null.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The outer pipeline adds a locking step on barLock, which is expected since we need to prevent infinite loops between the last two pipelines. However we are also locking on fooLock, on the first of the inner pipelines. We had a problem with our bindings overwriting values in the UI depending on the order things were initialized.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It turned out that without that lock, if a new model object was set, then the foo binding would fire first. Thus model.foo was copied to fooRadioGroup.selectedItem. But that would trigger our last binding to execute, so if the new foo value was false, then the last binding would override anything in the text box and set null on the model.bar field, before the model.bar =&gt; barText.text binding had a chance to execute!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A good rule of thumb is that any time you need to bind from multiple sources, you should make sure to create a lock to share between all the bindings to relate to the same field in the model.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Obviously there are several concepts that will have to be adapted to work elegantly with our existing APIs. Realms are a missing piece (Flex is single-threaded so we didn't even have to consider it). Also we would want to try to retrofit the existing binding classes to use this new API transparently, like we did with the transition from custom observables to custom properties.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So there you have it. This is my current vision of what Eclipse Data Binding should evolve toward.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Comments?&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-2978583799469292489?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/2978583799469292489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=2978583799469292489' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2978583799469292489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2978583799469292489'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2010/09/new-direction-for-bindings.html' title='A new direction for bindings?'/><author><name>Matthew Hall</name><uri>http://www.blogger.com/profile/15193859932143053469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-2618219394871551680</id><published>2010-08-11T23:38:00.002-06:00</published><updated>2010-08-12T00:15:28.693-06:00</updated><title type='text'>Back in the Saddle</title><content type='html'>I've been away (and neglecting Eclipse DataBinding) for a long time now.  I want to offer my sincere apologies to any and all who've been affected by my lack of attention.&lt;br /&gt;&lt;br /&gt;Now that I've settled back into my old routine, I have a new problem.  There is a mountain of new / updated bugs in Bugzilla and not enough free time to catch up on all of them.  Please help me prioritize by pinging the tasks important to you!  Vote, comment, post patches, whatever you have time for--just let me know where the pain points are.&lt;br /&gt;&lt;br /&gt;About the time I disappeared from Eclipse, I started a new job at Overstock.com and it's really an awesome place to work.  We're always looking to hire new programmers, so send me a line if you're looking for something new.&lt;br /&gt;&lt;br /&gt;While at Overstock I've been doing some Flex development, and (surprise!) working on a data binding library in Flex.  Yes, technically Flex already has declarative data binding baked in.  What I'm working on brings data binding to the ActionScript side, and gives you full support over the binding pipeline: conversions, validations (sound familiar?), synchronized access, one- and two-way bindings, bindings from multiple sources and coalescing the values together.  It's really cool.&lt;br /&gt;&lt;br /&gt;This work in Flex has been a golden opportunity to make a fresh start and use the lessons learned from Eclipse DataBinding.  Pending company approval I hope to port all that goodness back to Java sometime soon.  Stay tuned.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Disclaimer: Opinions are my own and do not reflect or represent my employer.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-2618219394871551680?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/2618219394871551680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=2618219394871551680' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2618219394871551680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2618219394871551680'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2010/08/back-in-saddle.html' title='Back in the Saddle'/><author><name>Matthew Hall</name><uri>http://www.blogger.com/profile/15193859932143053469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-8652730064133889006</id><published>2009-02-12T09:27:00.015-07:00</published><updated>2009-02-14T13:30:36.931-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewers'/><category scheme='http://www.blogger.com/atom/ns#' term='properties'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>Bind a viewer in one statement with ViewerSupport</title><content type='html'>We've added the ViewerSupport class to simplify setting up viewers (including tree viewers), usually in just one statement.&lt;br /&gt;&lt;br /&gt;Before:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ObservableListContentProvider contentProvider =&lt;br /&gt;    new ObservableListContentProvider();&lt;br /&gt;viewer.setContentProvider( contentProvider );&lt;br /&gt;viewer.setLabelProvider(&lt;br /&gt;    new ObservableMapLabelProvider(&lt;br /&gt;      BeansObservables.observeMaps(&lt;br /&gt;        contentProvider.getKnownElements(),&lt;br /&gt;        new String[] {&lt;br /&gt;          "title", "releaseDate", "director", "writer" } ) ) );&lt;br /&gt;viewer.setInput(BeansObservables.observeList(model, "movies"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ViewerSupport.bind(&lt;br /&gt;    viewer,&lt;br /&gt;    BeansObservables.observeList(model, "movies"),&lt;br /&gt;    BeanProperties.values(new String[] {&lt;br /&gt;      "title", "releaseDate", "director", "writer" } ) );&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-8652730064133889006?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/8652730064133889006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=8652730064133889006' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/8652730064133889006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/8652730064133889006'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2009/02/bind-viewer-in-one-statement-with.html' title='Bind a viewer in one statement with ViewerSupport'/><author><name>Matthew Hall</name><uri>http://www.blogger.com/profile/15193859932143053469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-2921170528961129721</id><published>2009-02-12T00:09:00.030-07:00</published><updated>2009-02-12T09:33:20.440-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='duplexing'/><category scheme='http://www.blogger.com/atom/ns#' term='multiselect'/><category scheme='http://www.blogger.com/atom/ns#' term='observables'/><title type='text'>Master-detail editing with multiple selection</title><content type='html'>A few weeks ago we released DuplexingObservableValue.  This class, among other things, helps make possible master-detail editing on a multiple selection:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_H_VwLOIjZ1w/SZPRL7TldwI/AAAAAAAAAAk/LpJYYxbbwHU/s1600-h/DuplexingObservableValue_frame1.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 400px; height: 236px;" src="http://2.bp.blogspot.com/_H_VwLOIjZ1w/SZPRL7TldwI/AAAAAAAAAAk/LpJYYxbbwHU/s400/DuplexingObservableValue_frame1.JPG" alt="" id="BLOGGER_PHOTO_ID_5301811189173810946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Because the selected movies have the same director and same writer, those values are displayed in the master-detail fields at the bottom.  However, since they have different titles and release dates, those fields use a stand-in "multi value" instead.&lt;/p&gt;&lt;p&gt;Editing the release date field simultaneously changes the release date of all movies in the selection.&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_H_VwLOIjZ1w/SZPY22eUJcI/AAAAAAAAAAs/LEtrHBp2gFI/s1600-h/DuplexingObservableValue_frame2.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; align: left; cursor: pointer; width: 400px; height: 236px;" src="http://1.bp.blogspot.com/_H_VwLOIjZ1w/SZPY22eUJcI/AAAAAAAAAAs/LEtrHBp2gFI/s400/DuplexingObservableValue_frame2.JPG" alt="" id="BLOGGER_PHOTO_ID_5301819623192405442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Here's the code that was used to hook up the detail fields to the multi-selection of the viewer:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;IObservableList selections = ViewerProperties.multipleSelection()&lt;br /&gt; .observe(viewer);&lt;br /&gt;&lt;br /&gt;dbc.bindValue(&lt;br /&gt; WidgetProperties.text(SWT.Modify).observe(title),&lt;br /&gt; DuplexingObservableValue.withDefaults(&lt;br /&gt;     BeanProperties.value("title").observeDetail(selections),&lt;br /&gt;     "", "&amp;lt;Multiple titles&amp;gt;"));&lt;br /&gt;&lt;br /&gt;dbc.bindValue(&lt;br /&gt; WidgetProperties.text(SWT.Modify).observe(releaseDate),&lt;br /&gt; DuplexingObservableValue.withDefaults(&lt;br /&gt;     BeanProperties.value("releaseDate").observeDetail(selections),&lt;br /&gt;     "", "&amp;lt;Multiple dates&amp;gt;"));&lt;br /&gt;&lt;br /&gt;dbc.bindValue(&lt;br /&gt; WidgetProperties.text(SWT.Modify).observe(director),&lt;br /&gt; DuplexingObservableValue.withDefaults(&lt;br /&gt;     BeanProperties.value("director").observeDetail(selections),&lt;br /&gt;     "", "&amp;lt;Multiple directors&amp;gt;"));&lt;br /&gt;&lt;br /&gt;dbc.bindValue(&lt;br /&gt; WidgetProperties.text(SWT.Modify).observe(writer),&lt;br /&gt; DuplexingObservableValue.withDefaults(&lt;br /&gt;     BeanProperties.value("writer").observeDetail(selections),&lt;br /&gt;     "", "&amp;lt;Multiple writers&amp;gt;"));&lt;br /&gt;&lt;/pre&gt;See the full code listing for this snippet &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet028DuplexingObservableValue.java?view=markup"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Disclaimer: The method DuplexingObservableValue.withDefaults() was added &lt;span style="font-style:italic;"&gt;after&lt;/span&gt; the 3.5M5 milestone, so in order to use it you need to check out the databinding projects from CVS HEAD, or be using a more recent integration build.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-2921170528961129721?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/2921170528961129721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=2921170528961129721' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2921170528961129721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2921170528961129721'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2009/02/master-detail-editing-with-multiple.html' title='Master-detail editing with multiple selection'/><author><name>Matthew Hall</name><uri>http://www.blogger.com/profile/15193859932143053469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_H_VwLOIjZ1w/SZPRL7TldwI/AAAAAAAAAAk/LpJYYxbbwHU/s72-c/DuplexingObservableValue_frame1.JPG' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-4272859024399389336</id><published>2009-02-03T15:21:00.029-07:00</published><updated>2009-02-03T17:48:05.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='observables'/><category scheme='http://www.blogger.com/atom/ns#' term='properties'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>Introducing the Properties API</title><content type='html'>Observables are hard to implement.  There are a handful of rules, guidelines and corner cases that observables implementors must pay attention to for data binding to work properly.  Observables must call ObservableTracker.getterCalled() for things like ComputedValue or MultiValidator to work; observables must ensure that all invocations are made from within the realm; a ChangeEvent must be fired &lt;span style="font-style: italic;"&gt;before&lt;/span&gt; ValueChangeEvent; the list goes on.  To an extent we've been able to isolate these concerns within the framework, but over time I couldn't help noticing that many of our observables followed a template--a lengthy, complicated one.&lt;br /&gt;&lt;br /&gt;In June 2008 I stumbled across &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=194734"&gt;bug 194734&lt;/a&gt; and I thought Tom was on to something.  I started working on a prototype, which we've been evolving and refining for the past six months.  I'm very pleased with the result, and if you've tried implementing your own observables before, I think you will be too.&lt;br /&gt;&lt;br /&gt;There are four types of properties: IValueProperty, IListProperty, ISetProperty and IMapProperty.  Properties serve two main purposes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;They act as convenient, portable observable factories for a particular  property. &lt;/li&gt;&lt;li&gt;They act as strategy objects for the observables they create.  That is, the observables use the properties to access, modify, and listen to the property source object.&lt;/li&gt;&lt;/ul&gt;Suppose you want to observe the "name" property of a bean object:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Person person = new Person("Joe");&lt;br /&gt;IValueProperty nameProperty = BeanProperties.value("name");&lt;br /&gt;IObservableValue personName =&lt;br /&gt;  nameProperty.observe(person);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;One of the strengths of properties is how easy it is to combine them to observe nested attributes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IListProperty childrenProperty = BeanProperties.list("children");&lt;br /&gt;IValueProperty nameProperty = BeanProperties.value("name");&lt;br /&gt;IObservableList namesOfChildren =&lt;br /&gt;  childrenProperty.values(nameProperty).observe(person);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;or, a shorter version:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IObservableList namesOfChildren = BeanProperties&lt;br /&gt;  .list("children").values("name").observe(person);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Properties are reusable:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IValueProperty selection = WidgetProperties.selection();&lt;br /&gt;IObservableValue buttonSelection = selection.observe(button);&lt;br /&gt;IObservableValue comboSelection = selection.observe(combo);&lt;br /&gt;IObservableValue spinnerSelection = selection.observe(spinner);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But most importantly, they are easy to implement.  Let's close with a real-world example:&lt;br /&gt;&lt;br /&gt;DataBinding does not come with built-in support for observing the selection of a DateTime widget (see &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=169876#c22"&gt;bug 169876&lt;/a&gt; for an explanation why).  However a useful use case is to observe the date portion (year+month+day) and set the time of day to midnight.&lt;br /&gt;&lt;br /&gt;The following is a complete property implementation for the DateTime#selection property, that you are free to use in your own projects:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class DateTimeSelectionProperty extends SimpleValueProperty {&lt;br /&gt;  public Object getValueType() {&lt;br /&gt;      return Date.class;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // One calendar per thread to preserve thread-safety&lt;br /&gt;  private static final ThreadLocal calendar =&lt;br /&gt;      new ThreadLocal() {&lt;br /&gt;          protected Object initialValue() {&lt;br /&gt;              return Calendar.getInstance();&lt;br /&gt;          }&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;  protected Object doGetValue(Object source) {&lt;br /&gt;      Calendar cal = (Calendar) calendar.get();&lt;br /&gt;&lt;br /&gt;      DateTime dateTime = (DateTime) source;&lt;br /&gt;      cal.clear();&lt;br /&gt;      cal.set(dateTime.getYear(), dateTime.getMonth(),&lt;br /&gt;          dateTime.getDay());&lt;br /&gt;      return cal.getTime();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected void doSetValue(Object source, Object value) {&lt;br /&gt;      Calendar cal = (Calendar) calendar.get();&lt;br /&gt;      cal.setTime((Date) value);&lt;br /&gt;&lt;br /&gt;      DateTime dateTime = (DateTime) source;&lt;br /&gt;      dateTime.setYear(cal.get(Calendar.YEAR));&lt;br /&gt;      dateTime.setMonth(cal.get(Calendar.MONTH));&lt;br /&gt;      dateTime.setDay(cal.get(Calendar.DAY_OF_MONTH));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public INativePropertyListener adaptListener(&lt;br /&gt;          ISimplePropertyListener listener) {&lt;br /&gt;      return new WidgetListener(listener);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private class WidgetListener implements INativePropertyListener,&lt;br /&gt;          Listener {&lt;br /&gt;      private final ISimplePropertyListener listener;&lt;br /&gt;&lt;br /&gt;      protected WidgetListener(ISimplePropertyListener listener) {&lt;br /&gt;          this.listener = listener;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      public void handleEvent(Event event) {&lt;br /&gt;          listener.handlePropertyChange(&lt;br /&gt;              new SimplePropertyEvent(event.widget,&lt;br /&gt;                  DateTimeSelectionProperty.this, null));&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected void doAddListener(Object source,&lt;br /&gt;          INativePropertyListener listener) {&lt;br /&gt;      ((DateTime) source).addListener(&lt;br /&gt;          SWT.Selection, (Listener) listener);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected void doRemoveListener(Object source,&lt;br /&gt;          INativePropertyListener listener) {&lt;br /&gt;      ((DateTime) source).removeListener(&lt;br /&gt;          SWT.Selection, (Listener) listener);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public IObservableValue observe(Object source) {&lt;br /&gt;      // For widgets, we want the display realm instead of&lt;br /&gt;      // Realm.getDefault()&lt;br /&gt;      Realm realm = SWTObservables.getRealm(&lt;br /&gt;          ((Widget) source).getDisplay());&lt;br /&gt;      return observe(realm, source);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we can observe the selection of a DateTime:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IObservableValue selection =&lt;br /&gt;   new DateTimeSelectionProperty().observe(dateTime);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Today we released WidgetValueProperty as public API, but did not make it in time for M5.  However in the future (starting in the next integration build), implementing properties for widgets will be much simpler:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Omit the adaptListener, doAddListener, and doRemoveListener methods&lt;br /&gt;&lt;li&gt;Omit the WidgetListener class&lt;br /&gt;&lt;li&gt;Omit the observe() method&lt;br /&gt;&lt;li&gt;Add a no-arg constructor with a call to super(eventType) in the constructor.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;In the example the constructor would call "super(SWT.Selection)".  As long as the the widget supports untyped listeners, WidgetValueProperty will handle the listener parts for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-4272859024399389336?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/4272859024399389336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=4272859024399389336' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4272859024399389336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4272859024399389336'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2009/02/introducing-properties-api.html' title='Introducing the Properties API'/><author><name>Matthew Hall</name><uri>http://www.blogger.com/profile/15193859932143053469</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-1250202945548272222</id><published>2009-01-30T13:18:00.007-07:00</published><updated>2009-01-30T13:52:18.700-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='observables'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>Watch this guy: Angelo Zerr</title><content type='html'>A couple of months ago, Angelo Zerr contacted me out of the blue and asked for feedback on a project he had worked on called "DOM Binding".  I was pretty busy at that time and put it on my "someday maybe" list, but he kept pinging me about it and even contributed his code in a Bugzilla so I decided to take a look. Even then, I thought "yeah, w3c DOM stuff, what could be more boring".&lt;br /&gt;&lt;br /&gt;Until I ran the small demo app he had written.&lt;br /&gt;&lt;br /&gt;I was excited and impressed by this demo app and with how little code it implemented bi-directional synchronization between a forms-based UI and data in XML form. Quite a mouthful, I know, but imagine you had to write one of the editors provided by PDE: some random XML file format cooked up by someone else, which is to be presented in a nice form-based UI through which mere mortals can edit the data. At the same time, the editor should allow experts to view and change the XML text itself, such that any changes get reflected in the UI.&lt;br /&gt;&lt;br /&gt;I had always assumed that implementing this would be a major pain in the neck - you would probably write a bunch of Java classes that would be the in-memory representation of the XML data, call the verbose w3c DOM API to get the data into your Java objects, write UI code for editing the Java objects, and sprinkle in code that keeps everything in sync. Lots of repetitive code, with many opportunities to make small mistakes that would be hard to find or debug.&lt;br /&gt;&lt;br /&gt;Enter Angelo - he took the Eclipse &lt;a href="http://wiki.eclipse.org/JFace_Data_Binding"&gt;data binding framework&lt;/a&gt; and implemented &lt;a href="http://wiki.eclipse.org/JFace_Data_Binding/Observable"&gt;observables&lt;/a&gt; that work against w3c DOM nodes directly, resulting in suprisingly concise code. This is one of those things that you have to see in action to "get" it, an ideal topic for a screencast.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Last night, I decided to learn how to make screencasts by using this as a warm-up exercise. The result turned out pretty amateurish. I apologize for all the "erm"s and that you can hear me breathe, but I think it's still worth watching. &lt;a href="http://archive.eclipse.org/eclipse/screencasts/incubator/dom-binding.html"&gt;Click to watch the screencast&lt;/a&gt; (five minutes, 7 MB).&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Btw - Angelo, congratulations on &lt;a href="http://dev.eclipse.org/mhonarc/lists/e4-dev/msg00469.html"&gt;becoming an e4 committer&lt;/a&gt;!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-1250202945548272222?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/1250202945548272222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=1250202945548272222' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1250202945548272222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1250202945548272222'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2009/01/watch-this-guy-angelo-zerr.html' title='Watch this guy: Angelo Zerr'/><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_9mAUrmH9eMo/S2pFE-Qnx4I/AAAAAAAADN0/bMKtws1dQW8/S220/bokowski.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-1377919965346343445</id><published>2008-02-27T10:01:00.002-07:00</published><updated>2008-02-27T10:13:34.818-07:00</updated><title type='text'>UI programming BoF at EclipseCon?</title><content type='html'>Better late than never, I submitted a &lt;a href="https://eclipsecon.greenmeetingsystems.com/submissions/view/601"&gt;BoF proposal&lt;/a&gt; today. Comments and suggestions welcome:&lt;br /&gt;&lt;h2&gt;UI Component Programming Best Practices&lt;/h2&gt;&lt;a href="https://eclipsecon.greenmeetingsystems.com/submissions/view/601"&gt;This BoF&lt;/a&gt; is about sharing best practices for programming of user interface components. With "component" we mean a piece of code that implements the inner parts of dialogs, wizard pages, views, or editors.&lt;br /&gt;&lt;br /&gt;How do we program user interface components today? How could it be made easier, less error-prone, and less complex? Topics discussed in this BoF may include &lt;a href="http://www.eclipse.org/swt"&gt;SWT&lt;/a&gt;, &lt;a href="http://www.eclipse.org/nebula"&gt;Nebula&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/JFace"&gt;JFace&lt;/a&gt;, &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=38109"&gt;declarative UIs&lt;/a&gt;, &lt;a href="http://wiki.eclipse.org/index.php/JFace_Data_Binding"&gt;data binding&lt;/a&gt;, and techniques for &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=46"&gt;ensuring&lt;/a&gt; &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=238"&gt;testability&lt;/a&gt; of &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=254"&gt;UI&lt;/a&gt; &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=440"&gt;components&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Programming of user interfaces at the level of RCP or the Workbench (where you assemble UI components into plug-ins and applications) are out of scope for this BoF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-1377919965346343445?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/1377919965346343445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=1377919965346343445' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1377919965346343445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1377919965346343445'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2008/02/ui-programming-bof-at-eclipsecon.html' title='UI programming BoF at EclipseCon?'/><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_9mAUrmH9eMo/S2pFE-Qnx4I/AAAAAAAADN0/bMKtws1dQW8/S220/bokowski.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-1139560483058451480</id><published>2007-12-06T12:06:00.000-07:00</published><updated>2007-12-07T14:26:04.839-07:00</updated><title type='text'>Looking for feedback: nested attributes in tables</title><content type='html'>Data binding makes it relatively easy to set up a table displaying 'live' data. You don't have to implement any listeners yourself. The first step is to use ObservableListContentProvider or ObservableSetContentProvider, and an observable set or list as the viewer's input. Then you can use ObservableMapLabelProvider to define the columns in your table.&lt;br /&gt;&lt;br /&gt;But what about nested attributes in a table? For example, if you are writing a genealogy application, you would want to display the father's and mother's name in a table like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9mAUrmH9eMo/R1hLvhAHBXI/AAAAAAAAAXs/fDRlh4i5puk/s1600-h/donaldduck.PNG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_9mAUrmH9eMo/R1hLvhAHBXI/AAAAAAAAAXs/fDRlh4i5puk/s400/donaldduck.PNG" alt="" id="BLOGGER_PHOTO_ID_5140942254328186226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;The 'tricky' part of this is that the cells for Mother and Father need to update on two conditions - when the name of a father or mother changes, or when the parent relationship between two persons changes.&lt;br /&gt;&lt;br /&gt;I have a patch that implements this and a new snippet, and am looking for feedback. See &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196785"&gt;bug 196785&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note that this is only the low-level machinery; we have some thoughts about making this easer to set up in &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=144260"&gt;bug 144260&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-1139560483058451480?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/1139560483058451480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=1139560483058451480' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1139560483058451480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1139560483058451480'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/12/looking-for-feedback-nested-attributes.html' title='Looking for feedback: nested attributes in tables'/><author><name>Boris Bokowski</name><uri>http://www.blogger.com/profile/06344587055927544695</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_9mAUrmH9eMo/S2pFE-Qnx4I/AAAAAAAADN0/bMKtws1dQW8/S220/bokowski.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9mAUrmH9eMo/R1hLvhAHBXI/AAAAAAAAAXs/fDRlh4i5puk/s72-c/donaldduck.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-1137510546125204164</id><published>2007-10-31T21:29:00.000-06:00</published><updated>2007-11-01T08:24:23.608-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PojoObservables'/><category scheme='http://www.blogger.com/atom/ns#' term='BeansObservables'/><title type='text'>Getting rid of those pesky "Could not attach listener to " log messages</title><content type='html'>If you've ever received...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Could not attach listener to org.eclipse.jface.examples.databinding.snippets.Snippet000HelloWorld$Person@92668c&lt;br /&gt;java.lang.NoSuchMethodException: org.eclipse.jface.examples.databinding.snippets.Snippet000HelloWorld$Person.addPropertyChangeListener(java.beans.PropertyChangeListener)&lt;br /&gt; at java.lang.Class.getMethod(Class.java:986)&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;and then asked...&lt;br /&gt;&lt;blockquote&gt;"Why is this exception being logged?"&lt;/blockquote&gt;&lt;br /&gt;and we said...&lt;br /&gt;&lt;blockquote&gt;"Because your object is not a Bean."&lt;/blockquote&gt;&lt;br /&gt;and you said...&lt;br /&gt;&lt;blockquote&gt;"Correct.  But I don't want that logged."&lt;/blockquote&gt;&lt;br /&gt;and we said...&lt;br /&gt;&lt;blockquote&gt;"Well, if it's not a Bean then BeanObservables might not be the correct thing for you."&lt;/blockquote&gt;&lt;br /&gt;and you said...&lt;br /&gt;&lt;blockquote&gt;"So what is the correct thing for me?"&lt;/blockquote&gt;&lt;br /&gt;and we said...&lt;br /&gt;&lt;blockquote&gt;"It doesn't exist.  Roll your own."&lt;/blockquote&gt;&lt;br /&gt;and you said...&lt;br /&gt;&lt;blockquote&gt;"!@#$%^%@#$%!"&lt;/blockquote&gt;&lt;br /&gt;We heard your cries and created &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.core.databinding.beans/src/org/eclipse/core/databinding/beans/PojoObservables.java?view=markup"&gt;PojoObservables&lt;/a&gt;.  It does everything that &lt;code&gt;BeansObservables&lt;/code&gt; does except that it doesn't register &lt;code&gt;PropertyChangeListener&lt;/code&gt;s.  As a result it won't respond to changes in the POJO but it provides IObservable* implementations to be used in  &lt;code&gt;Binding&lt;/code&gt;s.  It makes its first appearance in 3.4M3 as a result of bug &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=198201"&gt;198201&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-1137510546125204164?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/1137510546125204164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=1137510546125204164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1137510546125204164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1137510546125204164'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/10/getting-rid-of-those-pesky-could-not.html' title='Getting rid of those pesky &quot;Could not attach listener to &quot; log messages'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-9084909276803936204</id><published>2007-09-30T17:36:00.001-06:00</published><updated>2007-09-30T17:37:01.501-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conformance tests'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><title type='text'>JFace Data Binding Conformance Tests</title><content type='html'>I'm a bit of a test junky.  I don't necessarily enjoy writing them but I can't do without them.  They're a necessity and I consider a team's attitude toward unit testing a metric of assessing a project's health.  One of my post 1.0 ambitions was to create a solid testing infrastructure to ease the burden of writing tests for JDB and to not start over every time a new observable is written.  Another part of this was that I wanted to expose the infrastructure to our consumers so that you don't have to duplicate the some of the tediousness we have gone through in order to ensure the proper behavior of our implementations.&lt;br /&gt;&lt;br /&gt;As a result &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.tests.databinding.conformance/"&gt;org.eclipse.jface.tests.databinding.conformance&lt;/a&gt; has been created.  An introduction of the ideas and how to consume the project can be found on the Eclipse Wiki at &lt;a href="http://wiki.eclipse.org/JFace_Data_Binding/Conformance_Tests"&gt;JFace Data Binding/Conformance Tests&lt;/a&gt;.  The main idea is that you provide a delegate that allows us to interact with your observable.  You then select the TestCases to run and we will handle the rest.  The conformance tests are JUnit3 based and should integrate into any existing JUnit testing framework.  The project should be considered alpha and 1.0 is tentatively scheduled to be released with &lt;a href="http://wiki.eclipse.org/Ganymede"&gt;Eclipse 3.4&lt;/a&gt;.  Any and all feedback is welcome.&lt;br /&gt;&lt;br /&gt;Happy testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-9084909276803936204?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/9084909276803936204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=9084909276803936204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9084909276803936204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9084909276803936204'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/09/jface-data-binding-conformance-tests.html' title='JFace Data Binding Conformance Tests'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-5720295199633855567</id><published>2007-08-21T19:40:00.001-06:00</published><updated>2007-08-21T20:44:42.401-06:00</updated><title type='text'>Post 3.3 and 3.4M1 Conversations</title><content type='html'>It took us on JFace Data Binding a little while to get going again after our 1.0 release because of all the normal reasons: the Europa release, summer vacations, and a rare debilitating ear infection.  But things have been pretty active recently in the world of JFace Data Binding and I figured I'd blog a bit about a few of the current conversations.&lt;br /&gt;&lt;dl&gt;&lt;br /&gt; &lt;dt&gt;3.3.1 maintenance fixes&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;We haven't seen many issues with the 1.0 release but if you run into any please log them as soon as possible.  If you have logged one that you think should go into 3.3.1 ping us again on the bug with a comment saying you think it should go in 3.3.1.(&lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=%5BDataBinding%5D&amp;classification=Eclipse&amp;product=Platform&amp;component=UI&amp;target_milestone=3.3.1&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=allwords&amp;keywords=&amp;emailtype1=substring&amp;email1=&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0="&gt;bugzilla query&lt;/a&gt;)&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;Support for converting and validating Java 5 data types&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;One of the limitations of the 1.0 release is that org.eclipse.core.databinding can only depend upon types found in the &lt;a href="http://java.sun.com/products/cdc/reference/cdc_packages.pdf"&gt;CDC 1.0&lt;/a&gt;.  Because of this we only provide default support for types found in the CDC.  This is less than ideal for those of us who are developing against &amp;gt;= Java 5 JDK.  If you have added support in your own code for these types and would like to see them in the JDB core feel free to log enhancement requests (with patches!) or reopen existing ones so that we can get everything we can in for 3.4.(&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=197798"&gt;bug 197798&lt;/a&gt;)&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;Simplify API to observe nested attributes&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;The master detail APIs work well but could use some simplification.(&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=196785"&gt;bug 196785&lt;/a&gt;)&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;Creation of conformance tests&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;In order to speed up and raise the quality of development of observables we're planning on exposing conformance tests.  These will be public and in their own plug-in so that whether you're writing an observable for your own object or contributing to JDB you'll have a suite of ready made tests to run. These tests will assert that any observable conforms to the defined contract. (&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=182059"&gt;bug 182059&lt;/a&gt;)&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-5720295199633855567?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/5720295199633855567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=5720295199633855567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/5720295199633855567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/5720295199633855567'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/08/post-33-and-34m1-conversations.html' title='Post 3.3 and 3.4M1 Conversations'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-6593489826098990029</id><published>2007-08-21T19:24:00.000-06:00</published><updated>2007-08-21T19:37:22.646-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='viewers'/><category scheme='http://www.blogger.com/atom/ns#' term='selection'/><title type='text'>Observe Multiple Selections of Viewers</title><content type='html'>Thanks to Peter Centgraf and Boris we now have the ability to &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124683"&gt;observe multiple selections in Viewers&lt;/a&gt;.  To take it for a test drive check out org.eclipse.jface.databinding from HEAD and take a look at &lt;code&gt;ViewersObservables.observeMultiSelection(ISelectionProvider selectionProvider)&lt;/code&gt;.  Technically you can observe the selection of any ISelectionProvider with the API, not just Viewers.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=124683"&gt;bug 124683&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-6593489826098990029?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/6593489826098990029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=6593489826098990029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6593489826098990029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6593489826098990029'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/08/observe-multiple-selections-of-viewers.html' title='Observe Multiple Selections of Viewers'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-9014390444965254732</id><published>2007-07-29T11:47:00.000-06:00</published><updated>2007-07-29T12:25:16.663-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugzilla'/><category scheme='http://www.blogger.com/atom/ns#' term='bugs'/><category scheme='http://www.blogger.com/atom/ns#' term='newsgroup'/><title type='text'>See a bug, log a bug</title><content type='html'>A little word of advice to anyone who thinks they have found a bug in JFace Data Binding.  After performing due diligence and the behavior seems to be incorrect, disagrees with the documentation, etc. log a bug.  For some there's a tendency to post to the newsgroup with "Is this a bug?" somewhere in the message.  This is OK to do but it's not necessary.  If you think you have found a bug go ahead and log it to bugzilla.  If it ends up not being a bug we'll close it as WONTFIX or INVALID, depending upon what is appropriate.  This is actually easier on us, the committers and contributors, as we don't have to monitor multiple outlets for bugs.  If you still aren't comfortable with going directly to bugzilla go ahead and post to the newsgroup.  But if there is no answer for a day or two go ahead and log it to bugzilla.&lt;br /&gt;&lt;br /&gt;Also don't take a resolution of INVALID or WONTFIX as a slap in the face or as anyone saying "you shouldn't have logged this".  These are perfectly valid resolutions and are an acceptable way to declare that we disagree with the assertion or that our library is not the appropriate place for the functionality.  Basically don't allow these resolutions to keep you from logging other bugs.  There is never a negative tone attached to a resolution.  If we think that the question should have initially gone to the newsgroup we'll say so.  Don't get me wrong, bugzilla is not the newsgroup.  You should ask "how do I?" sort of questions there.  But if you have found a bug don't hesitate to log it to bugzilla.&lt;br /&gt;&lt;br /&gt;Keep up the bug reports, enhancement requests, newsgroup posts, and feedback.  We appreciate every bit of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-9014390444965254732?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/9014390444965254732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=9014390444965254732' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9014390444965254732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9014390444965254732'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/07/see-bug-log-bug.html' title='See a bug, log a bug'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-6562943393699683920</id><published>2007-06-24T16:40:00.000-06:00</published><updated>2007-06-24T16:50:39.949-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qseclipse'/><title type='text'>QSEclipse Blog</title><content type='html'>I created a &lt;a href="http://qseclipse.blogspot.com"&gt;blog&lt;/a&gt; for &lt;a href="http://code.google.com/p/qseclipse/"&gt;QSEclipse&lt;/a&gt; so that I don't end up creating off topic posts here... after this one.  I'm not working on the project often but when something frustrates me enough I just can't help myself.  When I make releases I'll post to the blog and also try to blog about anything I think is relevant in its development since the &lt;a href="http://quicksilver.blacktree.com/"&gt;Quicksilver&lt;/a&gt; APIs are largely undocumented and is not open source.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://qseclipse.blogspot.com"&gt;QSEclipse Blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-6562943393699683920?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/6562943393699683920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=6562943393699683920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6562943393699683920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6562943393699683920'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/06/qseclipse-blog.html' title='QSEclipse Blog'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-5237799499739221569</id><published>2007-03-29T08:34:00.000-06:00</published><updated>2007-03-29T08:43:23.372-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emf'/><title type='text'>EMF Observable Support</title><content type='html'>One of the recurring requests is for JFace Data Binding &lt;code&gt;IObservable&lt;/code&gt; implementations for &lt;a href="http://www.eclipse.org/modeling/emf/?project=emf"&gt;EMF&lt;/a&gt;.  A lot of folks out there use EMF for their model and would like to hook that up with all the binding goodness of JFace Data Binding.  If you have that itch you might want to follow &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=75625"&gt;bug 75625&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Review JFace's data binding design to determine how best to exploit it&lt;br /&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=75625"&gt;https://bugs.eclipse.org/bugs/show_bug.cgi?id=75625&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-5237799499739221569?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/5237799499739221569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=5237799499739221569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/5237799499739221569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/5237799499739221569'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/03/emf-observable-support.html' title='EMF Observable Support'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-636826116084199508</id><published>2007-03-26T09:21:00.000-06:00</published><updated>2007-03-29T08:44:05.162-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><title type='text'>3.3M6 JFace Data Binding API Changes</title><content type='html'>3.3M6 was the API freeze and JFace Data Binding had a few changes in regards to API that were necessary for 1.0.  All API changes can be found with &lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=%5BDataBinding%5D&amp;classification=Eclipse&amp;product=Platform&amp;component=UI&amp;target_milestone=3.3+M6&amp;long_desc_type=allwordssubstr&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=allwords&amp;keywords=api&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;bug_status=RESOLVED&amp;bug_status=VERIFIED&amp;bug_status=CLOSED&amp;emailtype1=substring&amp;email1=&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0="&gt;this query&lt;/a&gt;.  The most dramatic changes can be found in bugs &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=175840"&gt;175840&lt;/a&gt; and &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=177463"&gt;177463&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;175840 - [DataBinding] Remove BindingListener/BindingEvent from the API&lt;/h3&gt;&lt;br /&gt;The title doesn't quite do this justice.  The change that will effect most consumers is that we removed &lt;code&gt;BindSpec&lt;/code&gt; and the configuration of bindings has changes because of this.  We have introduced 2 new classes to replace &lt;code&gt;BindSpec&lt;/code&gt;: &lt;code&gt;UpdateValueStrategy&lt;/code&gt; and &lt;code&gt;UpdateListStrategy&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;177463 - [DataBinding] SWT Observable API additions&lt;/h3&gt;&lt;br /&gt;The essence of this change is that all &lt;code&gt;SWTObservables.observe*(...)&lt;/code&gt; methods are now untyped meaning they all accept a type of &lt;code&gt;Control&lt;/code&gt;.  This was done in anticipation of supporting multiple SWT versions.  If we were to put the latest and greatest widgets in the method signatures it would prohibit us from using this class with Eclipse 3.2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-636826116084199508?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/636826116084199508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=636826116084199508' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/636826116084199508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/636826116084199508'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/03/33m6-jface-data-binding-api-changes.html' title='3.3M6 JFace Data Binding API Changes'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-7241802375216267096</id><published>2007-03-02T21:51:00.000-07:00</published><updated>2007-03-29T09:44:04.962-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='pipe'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipsepedia'/><title type='text'>Monitoring JFace Data Binding Wiki Changes</title><content type='html'>Since Eclipsepedia is publishing &lt;a href="http://fire-change-event.blogspot.com/2007/03/eclipsepedia-recent-changes-feed.html"&gt;recent changes&lt;/a&gt; I threw together a quick &lt;a href="http://pipes.yahoo.com/"&gt;Yahoo Pipe&lt;/a&gt; to monitor changes to the &lt;a href="http://pipes.yahoo.com/pipes/NqbGZUHJ2xGL_FS6zKky6g/"&gt;JFace Data Binding articles&lt;/a&gt;.  Our wiki documentation is going to be changing quite a bit and hopefully soon.  If interested this is one way to keep track of those changes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pipes.yahoo.com/pipes/NqbGZUHJ2xGL_FS6zKky6g/"&gt;JFace Data Binding Wiki Changes&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Update: This isn't working at the moment.  When I can find some time I'll update the pipe.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-7241802375216267096?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/7241802375216267096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=7241802375216267096' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/7241802375216267096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/7241802375216267096'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/03/monitoring-jface-data-binding-wiki.html' title='Monitoring JFace Data Binding Wiki Changes'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-1434042388123447772</id><published>2007-03-02T18:35:00.000-07:00</published><updated>2007-03-02T22:37:24.615-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipsepedia'/><title type='text'>Eclipsepedia Recent Changes Feed</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_bpRC_X5DJc8/RejRRURswKI/AAAAAAAAAAY/VFLoSGvhWyM/s1600-h/Picture+2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_bpRC_X5DJc8/RejRRURswKI/AAAAAAAAAAY/VFLoSGvhWyM/s320/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5037506278644826274" /&gt;&lt;/a&gt;&lt;br /&gt;My thanks go out to whoever got this working.  When this popped up in NetNewsWire it made my day.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.eclipse.org"&gt;Eclipsepedia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wiki.eclipse.org/index.php/Special:Recentchanges"&gt;Eclipsepedia Recent Changes&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-1434042388123447772?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/1434042388123447772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=1434042388123447772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1434042388123447772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1434042388123447772'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/03/eclipsepedia-recent-changes-feed.html' title='Eclipsepedia Recent Changes Feed'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bpRC_X5DJc8/RejRRURswKI/AAAAAAAAAAY/VFLoSGvhWyM/s72-c/Picture+2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-876252075544530211</id><published>2007-02-19T22:29:00.000-07:00</published><updated>2007-02-19T22:55:18.285-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='qseclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='quicksilver'/><title type='text'>Quicksilver + Eclipse = QSEclipse</title><content type='html'>This is an off topic post as it has nothing to do with Data Binding so I'll keep it short...&lt;br /&gt;&lt;br /&gt;In my spare spare time I've been hacking on a &lt;a href="http://quicksilver.blacktree.com/"&gt;Quicksilver&lt;/a&gt; plugin to make it aware of Eclipse workspaces.  If you're into Quicksilver and would like to learn more about the plugin head on over to the &lt;a href="http://code.google.com/p/qseclipse/"&gt;qseclipse project&lt;/a&gt; on Google Code.  I consider it alpha but it works.  Direct any feedback to the &lt;a href="http://groups.google.com/group/qseclipse"&gt;qseclipse Google group&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-876252075544530211?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/876252075544530211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=876252075544530211' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/876252075544530211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/876252075544530211'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/02/quicksilver-eclipse-qseclipse.html' title='Quicksilver + Eclipse = QSEclipse'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-8026866154313746355</id><published>2007-02-19T01:11:00.000-07:00</published><updated>2007-02-19T01:24:58.283-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BeansObservables'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaBeans'/><title type='text'>BeansObservables and registering for PropertyChangeEvents</title><content type='html'>In the past we've been a bit inconsistent about how &lt;code&gt;BeansObservables&lt;/code&gt; registered for &lt;code&gt;PropertyChangeEvent&lt;/code&gt;s.  In some cases we'd look for the &lt;code&gt;addPropertyChangeListener(...)&lt;/code&gt; method that accepted the name of the property and in others cases we didn't.  In order to ensure that your bean worked in all scenarios you had to implement both.  As of this weekend we now abide by the &lt;a href="http://java.sun.com/products/javabeans/docs/spec.html"&gt;bean spec&lt;/a&gt; (see section 7.4.1 and 7.4.5) in all cases.  We look for the optional, with name, version first but fall back to the unnamed version if it is not found.  Also if neither is found a warning is logged with the intention of making issues easier to debug.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-8026866154313746355?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/8026866154313746355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=8026866154313746355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/8026866154313746355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/8026866154313746355'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/02/beansobservables-and-registering-for.html' title='BeansObservables and registering for PropertyChangeEvents'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-9000122444800575317</id><published>2007-02-13T21:14:00.000-07:00</published><updated>2007-02-19T01:26:17.193-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BoF'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipseCon'/><title type='text'>EclipseCon Data Binding BoF</title><content type='html'>There's a &lt;a href="http://eclipsezilla.eclipsecon.org/show_bug.cgi?id=4254"&gt;BoF proposal&lt;/a&gt; for Data Binding at EclipseCon.  If you'd like to attend head on over and comment so that we can know how many to expect.  Hope to see you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-9000122444800575317?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/9000122444800575317/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=9000122444800575317' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9000122444800575317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9000122444800575317'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/02/eclipsecon-data-binding-bof.html' title='EclipseCon Data Binding BoF'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-3737361481128671637</id><published>2007-02-11T15:27:00.000-07:00</published><updated>2007-01-29T07:54:18.388-07:00</updated><title type='text'>Upgrading to JFace Data Binding 3.3M5 Gotcha</title><content type='html'>There shouldn't be many API changes in Eclipse 3.3M5 that won't be obvious when you upgrade (just look for the red Xs).  But there was a change in the number and sometimes order of parameters in the &lt;code&gt;WritableValue&lt;/code&gt;, &lt;code&gt;WritableSet&lt;/code&gt;, and &lt;code&gt;WritableList&lt;/code&gt; constructors.  If you're using any of these classes it would be wise to do a quick search to ensure that what you're passing is what we're expecting.  The parameters to the constructors are untyped so the compiler won't be able to catch all of these changes.&lt;br /&gt;&lt;br /&gt;At the moment we only have one API change planned that we feel still needs to happen before we hit 1.0 and it will hopefully occur in the beginning of M6 development.  We're getting close to 1.0 so if you have any issues/complaints/thorns in your side, any at all, please let us know.  We take a lot of pride in this and want to make sure that we're starting off on the right foot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-3737361481128671637?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/3737361481128671637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=3737361481128671637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/3737361481128671637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/3737361481128671637'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/02/upgrading-to-jface-data-binding-33m5.html' title='Upgrading to JFace Data Binding 3.3M5 Gotcha'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-3290119371530721940</id><published>2007-01-20T10:44:00.000-07:00</published><updated>2007-01-20T18:15:39.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pipeline'/><category scheme='http://www.blogger.com/atom/ns#' term='validation'/><title type='text'>Data Binding Validation Story</title><content type='html'>In preparation for the 1.0 release the validation story has changed.  Previously for a target observable value change the pipeline was:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_GET&lt;/code&gt; - retrieve target value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_VALIDATE&lt;/code&gt; - validate target value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_CONVERT&lt;/code&gt; - convert target value to model type&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_BUSINESS_VALIDATE&lt;/code&gt; - validate converted value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_CHANGE&lt;/code&gt; - set converted value on model&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Validation occurred during &lt;code&gt;PIPELINE_AFTER_VALIDATE&lt;/code&gt; and &lt;code&gt;PIPELINE_AFTER_BUSINESS_VALIDATE&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;The pipeline for value bindings has become:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_GET&lt;/code&gt; - retrieve target value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_CONVERT&lt;/code&gt; - convert target value&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;&lt;code&gt;BindingEvent.PIPELINE_BEFORE_CHANGE&lt;/code&gt;&lt;/em&gt; - a placeholder for expensive validation&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;BindingEvent.PIPELINE_AFTER_CHANGE&lt;/code&gt; - set on model&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Validators can now be registered for any position, multiples can be registered for a single position, and validation can occur on model to target changes as well as target to model.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Policies&lt;/h3&gt;&lt;br /&gt;Policies are the way to define when the model is to be updated.  The currently supported policies are &lt;code&gt;BindSpec.POLICY_AUTOMATIC&lt;/code&gt; and &lt;code&gt;BindSpec.POLICY_EXPLICIT&lt;/code&gt;.  A common need in dialogs is the ability to defer updating of a model until the user selects OK/Apply.  Previously in order to accomplish this you had to create a temporary model to bind to the UI so that it wouldn't update the live model.  Now you can specify &lt;code&gt;BindSpec.POLICY_EXPLICIT&lt;/code&gt; for the update policy via the &lt;code&gt;BindSpec&lt;/code&gt; and control when the model is updated.  You can also specify the target validation policy so that the target is validated on change but the model is not updated until you invoke an explicit update.&lt;br /&gt;&lt;br /&gt;There aren't any snippets of the functionality yet but hopefully I'll be able to create one soon.  I just wanted to give a heads up for anyone using HEAD as there are some nonpassive changes in this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-3290119371530721940?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/3290119371530721940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=3290119371530721940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/3290119371530721940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/3290119371530721940'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/01/data-binding-validation-story.html' title='Data Binding Validation Story'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-4381742023536400035</id><published>2007-01-10T20:02:00.000-07:00</published><updated>2007-01-10T21:30:24.883-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentation model'/><category scheme='http://www.blogger.com/atom/ns#' term='master detail'/><category scheme='http://www.blogger.com/atom/ns#' term='WritableValue'/><title type='text'>Master Detail - Distilling the Pattern</title><content type='html'>Yesterday I went over master detail in the context of &lt;a href="http://fire-change-event.blogspot.com/2007/01/master-detail-selection.html"&gt;list selection&lt;/a&gt;.  In the list selection post there were 3 steps that were required to setup the list selection master detail.  But the guts of master detail were really just the first two, the third was to setup the viewing of the detail.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Observe changes of the viewer's selection.&lt;/em&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;Observe the name property of the selection.&lt;/em&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;del&gt;Bind the text of the Text widget to the name detail (selected person's name).&lt;/del&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;In the 2 steps we're concerned with we have 3 players:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;viewer - maintains a reference to the selection and provides change events when it changes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;selection (person)- maintains a reference to the name and provides change events when it changes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;name - value to display&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;If using dot notation we'd be able to access the value of the detail with something like the following (assuming the selection is not null)...&lt;br /&gt;&lt;code&gt;viewer.selection.name&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If we genericize the roles a bit we get...&lt;br /&gt;&lt;code&gt;container.master.detail&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;The Pattern&lt;/h3&gt;&lt;br /&gt;The master detail APIs will satisfy your use case if...&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;you need to observe &lt;code&gt;container.master.detail&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;AND&lt;/em&gt; the &lt;code&gt;master&lt;/code&gt; instance can be replaced over time&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Non Selection Use Case&lt;/h3&gt;&lt;br /&gt;A use case that arose recently on the newsgroup was how to setup the binding to a Person model that can be replaced over time.  This was in the context of implementing &lt;a href="http://www.martinfowler.com/eaaDev/PresentationModel.html"&gt;presentation model&lt;/a&gt;.  The following code was being used as the presentation model.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class ViewModel {&lt;br /&gt; private Person person;&lt;br /&gt; &lt;br /&gt; public void getPerson() {&lt;br /&gt;  return person;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void setPerson(Person person) {&lt;br /&gt;  this.person = person;&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Over time a new person would be set and the UI had to update.  Expressed in dot notation this was &lt;code&gt;viewModel.person.name&lt;/code&gt;.  The only change that needed to occur to the code was that ViewModel needed to fire change events for Person and then the binding was wired up like normal.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class ViewModel {&lt;br /&gt; private Person person;&lt;br /&gt; &lt;em&gt;private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);&lt;/em&gt;&lt;br /&gt; &lt;br /&gt; &lt;em&gt;public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {&lt;/em&gt;&lt;br /&gt;  &lt;em&gt;changeSupport.addPropertyChangeListener(propertyName, listener);&lt;/em&gt;&lt;br /&gt; &lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;br /&gt; public Person getPerson() {&lt;br /&gt;  return person;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setPerson(Person person) {&lt;br /&gt;  &lt;em&gt;changeSupport.firePropertyChange("person", this.person, this.person = person);&lt;/em&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Create an observable to observe changes in the view model&lt;br /&gt;IObservableValue personValue = BeansObservables.observeValue(&lt;br /&gt;  viewModel, "person");&lt;br /&gt;&lt;br /&gt;//Bind to the name detail of the current person&lt;br /&gt;dbc.bindValue(SWTObservables.observeText(form.getTextName(),&lt;br /&gt;  SWT.Modify), BeansObservables.observeDetailValue(Realm&lt;br /&gt;  .getDefault(), personValue, "name",&lt;br /&gt;  String.class), null);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;WritableValue, for those looking for a shortcut&lt;/h3&gt;&lt;br /&gt;If you're in a position where it doesn't matter if your model is a java bean, look into one of my favorite classes &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/value/WritableValue.java?view=markup"&gt;WritableValue&lt;/a&gt;.  Your code then becomes...&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class ViewModel {&lt;br /&gt; /**&lt;br /&gt;  * observable value to maintain the person instance&lt;br /&gt;  */&lt;br /&gt; private IObservableValue personObservable = new WritableValue(Person.class);&lt;br /&gt; &lt;br /&gt; public IObservableValue getPersonObservable() {&lt;br /&gt;  return personObservable;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Observe the detail.&lt;br /&gt;IObservableValue detailObservable = BeansObservables&lt;br /&gt;    .observeDetailValue(Realm.getDefault(), viewModel.getPersonObservable(), "name",&lt;br /&gt;        String.class);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Code to set the person would be...&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;viewModel.getPersonObservable().setValue(person);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-4381742023536400035?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/4381742023536400035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=4381742023536400035' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4381742023536400035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4381742023536400035'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/01/master-detail-distilling-pattern.html' title='Master Detail - Distilling the Pattern'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-4979247565670135278</id><published>2007-01-10T18:03:00.000-07:00</published><updated>2007-01-11T09:04:56.964-07:00</updated><title type='text'>Asking JFace Data Binding questions</title><content type='html'>Today was the &lt;a href="https://admin.adobe.acrobat.com/_a300965365/p77464314/"&gt;data binding webinar&lt;/a&gt; and from what I can tell it went well.  There were quite a few questions and I think most if not all got answered.  But if you attended or not and have any questions about data binding feel free to ask them on the &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.platform"&gt;eclipse.platform newsgroup&lt;/a&gt;.   You should always be able to find the latest information on how to get in contact with us on the &lt;a href="http://wiki.eclipse.org/index.php/JFace_Data_Binding_FAQ#Where_can_I_ask_a_question.3F"&gt;FAQ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also in the evenings and on weekends I try to be on &lt;a href="http://wiki.eclipse.org/index.php/IRC"&gt;IRC&lt;/a&gt; on #eclipse and #eclipse-dev.  I'm bradleyjames.  Feel free to stop by and say hello.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-4979247565670135278?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/4979247565670135278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=4979247565670135278' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4979247565670135278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4979247565670135278'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/01/asking-jface-data-binding-questions.html' title='Asking JFace Data Binding questions'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-2554981383736551710</id><published>2007-01-09T21:00:00.000-07:00</published><updated>2007-01-09T23:15:30.070-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='master detail'/><category scheme='http://www.blogger.com/atom/ns#' term='selection'/><title type='text'>Master Detail - Selection</title><content type='html'>I find myself answering quite a few questions on the newsgroup hinting that the solution is the master detail APIs.   I figured that a verbose explanation couldn't hurt the cause.  The stereotypical master detail use case contains a list and upon selection in the list details will be displayed in a separate set of widgets.  I'll attempt to explain the core concepts involved.&lt;br /&gt;&lt;br /&gt;To explain we'll use the master detail &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/snippets/Snippet010MasterDetail.java?view=markup"&gt;snippet&lt;/a&gt; available in the data binding examples project.  The snippet displays an SWT List filled with Persons.  The Person model has one property, name.  Upon selection in the List the name of the currently selected person is displayed in a Text widget. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bpRC_X5DJc8/RaRmOFAyOrI/AAAAAAAAAAM/Px0ZQYJ6lsY/s1600-h/Picture+2.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_bpRC_X5DJc8/RaRmOFAyOrI/AAAAAAAAAAM/Px0ZQYJ6lsY/s320/Picture+2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5018248276847246002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The relevant data binding code is copied and pasted below...&lt;br /&gt;&lt;pre class="textmate-source"&gt;&lt;span class="source source_java"&gt;&lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt; 1. Observe changes in selection.&lt;br /&gt;&lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;IObservableValue&lt;/span&gt; selectionObservable = &lt;span class="storage storage_type storage_type_java"&gt;ViewersObservables&lt;/span&gt;&lt;br /&gt;    .observeSingleSelection(viewer);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt; 2. Observe the name property of the current selection.&lt;br /&gt;&lt;/span&gt;&lt;span class="storage storage_type storage_type_java"&gt;IObservableValue&lt;/span&gt; detailObservable = &lt;span class="storage storage_type storage_type_java"&gt;BeansObservables&lt;/span&gt;&lt;br /&gt;    .observeDetailValue(&lt;span class="storage storage_type storage_type_java"&gt;Realm&lt;/span&gt;.getDefault(), selectionObservable, &lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;name&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;br /&gt;        &lt;span class="support support_type support_type_built-ins support_type_built-ins_java"&gt;String&lt;/span&gt;.&lt;span class="storage storage_type storage_type_java"&gt;class&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt; 3. Bind the Text widget to the name detail (selection's name).&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;DataBindingContext&lt;/span&gt;().bindValue(&lt;span class="storage storage_type storage_type_java"&gt;SWTObservables&lt;/span&gt;.observeText(name,&lt;br /&gt;    &lt;span class="constant constant_other constant_other_java"&gt;SWT&lt;/span&gt;.&lt;span class="storage storage_type storage_type_java"&gt;None&lt;/span&gt;), detailObservable, &lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;BindSpec&lt;/span&gt;().setUpdateModel(&lt;span class="constant constant_language constant_language_java"&gt;false&lt;/span&gt;));&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;If you follow the comments in the snippet you'll see that we need to perform 3 steps:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Observe changes of the viewer's selection.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Observe the name property of the selection.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bind the text of the Text widget to the name detail (selected person's name).&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;1. Observe changes in the viewer's selection&lt;/h3&gt;&lt;br /&gt;IObservableValue has a value.  I know, rocket science.  But what IObservableValue provides us is a reference to a transient instance and we can observe changes from one instance to the next.  If the selection of the viewer is a person the value of the selection observable will be this person.  If the selection is null the value of the selection observable will be null.  Regardless of the value we have a reference to an object that will contain the viewer's selection.  Change events will fire when a new person, or null, is set as the value of this observable.  This is the master.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;2. Observe the detail of the master (name of the selected person)&lt;/h3&gt;&lt;br /&gt;When we observe a detail of the master we're effectively saying...&lt;br /&gt;&lt;blockquote&gt;"observe the value of &lt;em&gt;a property&lt;/em&gt; of the &lt;em&gt;value&lt;/em&gt; contained in &lt;em&gt;an observable&lt;/em&gt;".&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Translated into our use case we're saying...  &lt;br /&gt;&lt;blockquote&gt;"observe the value of &lt;em&gt;the name property&lt;/em&gt; of &lt;em&gt;the person&lt;/em&gt; contained in &lt;em&gt;the selection&lt;/em&gt;"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;If the selection of the the Viewer is a Person with the name "mickey mouse" the following will be true...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;selectionObservable.getValue() == Person("mickey mouse")&lt;/li&gt;&lt;br /&gt;&lt;li&gt;detailObservable.getValue() == "mickey mouse"&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;When the selection changes to a Person with the name of "daffy duck" the following will be true...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;selectionObservable.getValue() == Person("daffy duck")&lt;/li&gt;&lt;br /&gt;&lt;li&gt;detailObservable.getValue() == "daffy duck"&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;When the selection changes to null the following will be true...&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;selectionObservable.getValue() == null&lt;/li&gt;&lt;br /&gt;&lt;li&gt;detailObservable.getValue() == null&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;When the master value changes the detail populates itself with the value from the master.  This gives us the master detail behavior.  To finish it off we need to...&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;3. Bind the detail to the Text widget&lt;/h3&gt;&lt;br /&gt;The last step is to bind the detail observable to the Text widget in order to display the detail.  Enough said.&lt;br /&gt;&lt;br /&gt;Tomorrow night I'll describe a use case that explains how this fits into using JFace Data Binding and the &lt;a href="http://www.martinfowler.com/eaaDev/PresentationModel.html"&gt;presentation model&lt;/a&gt; design pattern.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-2554981383736551710?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/2554981383736551710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=2554981383736551710' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2554981383736551710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2554981383736551710'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2007/01/master-detail-selection.html' title='Master Detail - Selection'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_bpRC_X5DJc8/RaRmOFAyOrI/AAAAAAAAAAM/Px0ZQYJ6lsY/s72-c/Picture+2.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-4870092416708914257</id><published>2006-12-09T15:55:00.000-07:00</published><updated>2006-12-09T16:10:33.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3.2'/><category scheme='http://www.blogger.com/atom/ns#' term='compatibility'/><title type='text'>JFace Data Binding is Eclipse 3.2.x compatible</title><content type='html'>As of 20061209 the data binding projects are compatible with Eclipse 3.2, this will be in 3.3M4.  There weren't major issues, just compilation errors from using a couple 3.3 APIs.  But they're now fixed and we jive with 3.2 as well as 3.3.  The goal is to stay compatible with 3.2 as long as it isn't prohibitive to the projects.  We'll do our best to keep it 3.2 compatible.  If we can get to it we will be attempting to use the 3.3 viewer APIs when creating builders for viewer bindings.  When that occurs we'll try to come up with a 3.2 compatible way to handle this as well.  &lt;br /&gt;&lt;br /&gt;See bug &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164134"&gt;bug 164134&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-4870092416708914257?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/4870092416708914257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=4870092416708914257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4870092416708914257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/4870092416708914257'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/12/jface-data-binding-is-eclipse-32x.html' title='JFace Data Binding is Eclipse 3.2.x compatible'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-8042030767188727753</id><published>2006-12-04T22:38:00.000-07:00</published><updated>2006-12-12T22:13:35.263-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><title type='text'>Minor API changes before 3.3M4</title><content type='html'>We're getting close to &lt;a href="http://www.eclipse.org/eclipse/development/eclipse_project_plan_3_3.html"&gt;3.3M4 (Friday Dec. 15, 2006)&lt;/a&gt; when we're &lt;em&gt;hoping&lt;/em&gt; to have all API changes to JFace Data Binding complete.  The changes are minor but if you're using the current code you might want to peruse the list to determine if you'll be effected.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=118429"&gt;bug 118429&lt;/a&gt; -  IValidator will now return IStatus instead of a string.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147530"&gt;bug 147530&lt;/a&gt; - Event notifications on observables will pass an event object rather than the the source and diff as separate parameters.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=164653"&gt;bug 164653&lt;/a&gt; - Changes to the protected APIs in the abstract observable implementations for thread safety.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=128142"&gt;bug 128142&lt;/a&gt; - IDomainValidator is being replaced with IValidator.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Again, they're all pretty minor and shouldn't take long to correct in consuming code.&lt;br /&gt;&lt;br /&gt;Also we had a team meeting on November 30th, 2006.  The notes can be found &lt;a href="http://dev.eclipse.org/mhonarc/lists/platform-ui-dev/msg03197.html"&gt;here&lt;/a&gt;.  We tried to record the audio but alas, the service was having issues that night.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;20061212 Update:&lt;/em&gt;&lt;br /&gt;Another small change has occurred on the race to 3.3M4.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=167450"&gt;bug 167450&lt;/a&gt; - remove BindSupportFactory, a couple of methods are now gone from DataBindingContext&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-8042030767188727753?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/8042030767188727753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=8042030767188727753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/8042030767188727753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/8042030767188727753'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/12/minor-api-changes-before-33m4.html' title='Minor API changes before 3.3M4'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-6555554862339854654</id><published>2006-11-29T22:45:00.000-07:00</published><updated>2006-12-05T08:28:41.607-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipseCon'/><title type='text'>EclipseCon 2007 Data Binding Long Talk</title><content type='html'>If you have an interest in learning about binding some data, being data bound, being bound and... I got nothing... please vote for the &lt;a href="http://www.eclipsecon.org/2007/index.php?not_accepted=0&amp;page=sub/&amp;id=3743&amp;conference=2007"&gt;Introduction to Eclipse Data Binding&lt;/a&gt; long talk being proposed for &lt;a href="http://www.eclipsecon.org/2007/"&gt;EclipseCon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Straight from the &lt;a href="http://www.coconut-palm-software.com/the_visual_editor/?p=92"&gt;horse's mouth&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;"It’s new, it’s cool, and it helps you write better code!"&lt;/blockquote&gt;&lt;br /&gt;I soooooo want to write better code; I'm game.  Please &lt;a href="http://eclipsezilla.eclipsecon.org/show_bug.cgi?id=3743"&gt;vote!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-6555554862339854654?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/6555554862339854654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=6555554862339854654' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6555554862339854654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6555554862339854654'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/11/eclipsecon-2007-data-binding-long-talk.html' title='EclipseCon 2007 Data Binding Long Talk'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-9153625559517609660</id><published>2006-11-12T18:29:00.000-07:00</published><updated>2007-09-22T13:25:29.991-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diagram'/><category scheme='http://www.blogger.com/atom/ns#' term='master detail'/><title type='text'>Master Detail Sequence Diagram</title><content type='html'>One of the new packages in HEAD is &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.core.databinding/src/org/eclipse/core/databinding/observable/masterdetail/"&gt;org.eclipse.core.databinding.observable.masterdetail&lt;/a&gt;.  It contains observable implementations that provide &lt;a href="http://en.wikipedia.org/wiki/Master-detail"&gt;master detail&lt;/a&gt; behavior.  This can be a little confusing at first glance so I thought I'd take a shot at creating a sequence diagram to describe the inner workings.  Possibly this, or some form of it, will get worked into our documentation but I thought I'd throw it out there for anyone looking at the latest API.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://idisk.mac.com/brad.reynolds-Public/databinding/diagrams/master_detail_sequence_diagram.png"&gt;&lt;img src="http://idisk.mac.com/brad.reynolds-Public/databinding/diagrams/master_detail_sequence_diagram.png" width="200" height="100"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Comments are greatly appreciated.  Also if someone knows where I can get a higher resolution Eclipse logo I'd appreciate the tip.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-9153625559517609660?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/9153625559517609660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=9153625559517609660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9153625559517609660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9153625559517609660'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/11/master-detail-sequence-diagram.html' title='Master Detail Sequence Diagram'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-5340662466461992026</id><published>2006-11-12T13:36:00.001-07:00</published><updated>2006-11-12T19:06:54.617-07:00</updated><title type='text'>Project renaming and removal of provisional API</title><content type='html'>On Friday the concurrency branch, Bug116920_investigation, was merged into HEAD and the projects have also been renamed.  This means that &lt;code&gt;Realm&lt;/code&gt;s are now in HEAD and most provisional API has been removed.  What that means is that with HEAD your code probably doesn't compile.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Project Renaming&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;org.eclipse.jface.databinding -&gt; org.eclipse.core.databinding&lt;/li&gt;&lt;br /&gt;&lt;li&gt;org.eclipse.jface.databinding.beans -&gt; org.eclipse.core.databinding.beans&lt;/li&gt;&lt;br /&gt;&lt;li&gt;org.eclipse.jface.databinding.ui -&gt; org.eclipse.jface.databinding&lt;/li&gt;&lt;br /&gt;&lt;li&gt;org.eclipse.jface.examples.databinding&lt;/li&gt;&lt;br /&gt;&lt;li&gt;org.eclipse.jface.tests.databinding&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Realms&lt;/h3&gt;&lt;br /&gt;Realms deserve more than a blog post so I'm going to leave this until later; there will be documentation on the subject.  To see what has led us down this path see &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116920"&gt;bug 116920&lt;/a&gt;.  Take a look at the examples and tests projects for usage.  There's also a &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/observable/ThreadRealm.java?rev=HEAD&amp;content-type=text/vnd.viewcvs-markup"&gt;ThreadRealm&lt;/a&gt; and &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.tests.databinding/src/org/eclipse/jface/tests/databinding/observable/LockRealm.java?rev=HEAD&amp;content-type=text/vnd.viewcvs-markup"&gt;LockRealm&lt;/a&gt; implementation in the tests projects.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Provisonal API Removal&lt;/h3&gt;&lt;br /&gt;The majority of the consumer code that could be broken is the result of the removal of the provisional API.  The majority of that API existed to allow for the binding of viewers to a model.  Previously the only API that the consumer had for this was a builder that then took care of creating the label and content providers.  We don't yet have replacements for the builders but we have API for content providers and label providers which can be used to bind viewers without a builder.  By exposing these classes this allows for flexibility that we didn't previously have.  Consumers now have access to the label provider and can create a decorator to provide colors, fonts, images, etc. as well as the text.  Below is a quick example of the creation of the label and content providers for a &lt;code&gt;ComboViewer&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="textmate-source eclipse"&gt;&lt;span class='linenum'&gt;    1&lt;/span&gt; &lt;span class="source source_java"&gt;&lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;Create the observable for the domain list.&lt;br /&gt;&lt;/span&gt;&lt;span class='linenum'&gt;    2&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;IObservableList&lt;/span&gt; lodgings = &lt;span class="storage storage_type storage_type_java"&gt;BeansObservables&lt;/span&gt;.observeList(&lt;span class="storage storage_type storage_type_java"&gt;Realm&lt;/span&gt;&lt;br /&gt;&lt;span class='linenum'&gt;    3&lt;/span&gt;     .getDefault(), catalog, &lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;lodgings&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;br /&gt;&lt;span class='linenum'&gt;    4&lt;/span&gt; &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;Create the content provider that corresponds to the observable list.&lt;br /&gt;&lt;/span&gt;&lt;span class='linenum'&gt;    5&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;ObservableListContentProvider&lt;/span&gt; contentProvider = &lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;ObservableListContentProvider&lt;/span&gt;();&lt;br /&gt;&lt;span class='linenum'&gt;    6&lt;/span&gt; &lt;br /&gt;&lt;span class='linenum'&gt;    7&lt;/span&gt; &lt;span class="comment comment_line comment_line_double-slash comment_line_double-slash_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_java"&gt;//&lt;/span&gt;Create a mapping for the attribute to display.&lt;br /&gt;&lt;/span&gt;&lt;span class='linenum'&gt;    8&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;IObservableMap&lt;/span&gt;[] attributeMaps = &lt;span class="storage storage_type storage_type_java"&gt;BeansObservables&lt;/span&gt;.observeMaps(&lt;br /&gt;&lt;span class='linenum'&gt;    9&lt;/span&gt;     contentProvider.getKnownElements(), &lt;span class="storage storage_type storage_type_java"&gt;Lodging&lt;/span&gt;.&lt;span class="storage storage_type storage_type_java"&gt;class&lt;/span&gt;,&lt;br /&gt;&lt;span class='linenum'&gt;   10&lt;/span&gt;     &lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="support support_type support_type_built-ins support_type_built-ins_java"&gt;String&lt;/span&gt;[] { &lt;span class="string string_quoted string_quoted_double string_quoted_double_java"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_java"&gt;"&lt;/span&gt;name&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_java"&gt;"&lt;/span&gt;&lt;/span&gt; });&lt;br /&gt;&lt;span class='linenum'&gt;   11&lt;/span&gt; &lt;br /&gt;&lt;span class='linenum'&gt;   12&lt;/span&gt; cviewer.setContentProvider(contentProvider);&lt;br /&gt;&lt;span class='linenum'&gt;   13&lt;/span&gt; cviewer.setLabelProvider(&lt;span class="keyword keyword_other keyword_other_class-fns keyword_other_class-fns_java"&gt;new&lt;/span&gt; &lt;span class="storage storage_type storage_type_java"&gt;ObservableMapLabelProvider&lt;/span&gt;(attributeMaps));&lt;br /&gt;&lt;span class='linenum'&gt;   14&lt;/span&gt; cviewer.setInput(lodgings);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The key to this is the creation of the &lt;code&gt;attributeMaps&lt;/code&gt; (line 8).  In this case we're only specifying one attribute, name (line 10), because it's a &lt;code&gt;Combo&lt;/code&gt;.  In the map returned the key will be the element and the value will be the display value of the name attribute of the element.&lt;br /&gt;&lt;br /&gt;Stay tuned, it's going to be a busy next couple of months.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-5340662466461992026?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/5340662466461992026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=5340662466461992026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/5340662466461992026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/5340662466461992026'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/11/project-renaming-and-removal-of.html' title='Project renaming and removal of provisional API'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-1337297600018974617</id><published>2006-11-06T21:16:00.000-07:00</published><updated>2006-11-06T22:07:24.220-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jface'/><category scheme='http://www.blogger.com/atom/ns#' term='data structures'/><category scheme='http://www.blogger.com/atom/ns#' term='observables'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><category scheme='http://www.blogger.com/atom/ns#' term='bindings'/><title type='text'>A Focus on Data Structures</title><content type='html'>HEAD hasn't had many changes lately for data binding because of the 3.3M3 release.  But this doesn't mean that nothing has been happening.  Changes have been occurring in the concurrency branch (Bug116920_investigation) for, you guessed it, concurrency.  But the branch has also been used for removing provisional packages and the refactoring of some of the provisional code into API.  But before I get into the other changes it's very important to us that we get as many eyes on the concurrency approach as possible.  If you're a concurrency guru or just someone with a interest please read through &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116920"&gt;bug 116920&lt;/a&gt; and provide feedback if you have any.&lt;br /&gt;&lt;br /&gt;The other changes that have been occurring are interesting.  If you are vaguely familiar with JFace Data Binding you probably know that data binding is comprised of two parts: observables and bindings.  The idea behind bindings is pretty straight forward and what you would expect from the name.  They bind two entities and provides a MVC-esque flow of data to keep the 2 in sync.  This is normally applied in the context of a graphical user interface in order to keep the UI in sync with a model.  But there's more that needs to be implemented in order to make this synchronization and this is where observables come in.  Observables are an implementation of the &lt;a href="http://en.wikipedia.org/wiki/Observer_pattern"&gt;observer pattern&lt;/a&gt; and they create a common abstraction that allows for the observing of changes in an object.  This all begins with &lt;code&gt;IObservable&lt;/code&gt; but branches out into:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt; &lt;dt&gt;&lt;code&gt;IObservableValue&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;Interface for the observing of a single value.&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;&lt;code&gt;IObservableList&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;Interface for observing changes in a &lt;code&gt;List&lt;/code&gt;.  The notifications are notifications of when items are added or removed from the &lt;code&gt;List&lt;/code&gt;.  If an object being maintained in the &lt;code&gt;List&lt;/code&gt; changes events are not fired from the &lt;code&gt;IObservableList&lt;/code&gt; implementation.&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;&lt;code&gt;IObservableSet&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;Interface for observing changes in a Set.  Like &lt;code&gt;IObservableList&lt;/code&gt; the change events are for items being added and removed from the &lt;code&gt;Set&lt;/code&gt;.&lt;/dd&gt;&lt;br /&gt; &lt;dt&gt;&lt;code&gt;IObservableMap&lt;/code&gt;&lt;/dt&gt;&lt;br /&gt; &lt;dd&gt;Interface for observing changes in a &lt;code&gt;Map&lt;/code&gt;.  And you guess it, same type of behavior as the previous interfaces but for a &lt;code&gt;Map&lt;/code&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;For all of the above interfaces there are default mutable, or writable, implementations.  &lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;WritableValue&lt;/code&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;code&gt;WritableList&lt;/code&gt;&lt;/li&gt; &lt;br /&gt; &lt;li&gt;&lt;code&gt;WritableSet&lt;/code&gt;&lt;/li&gt; &lt;br /&gt; &lt;li&gt;&lt;code&gt;WritableMap&lt;/code&gt;&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;By providing these implementations we, and any consumer, can use the observable implementations for any need that arises.  The need doesn't have to be for binding a widget to a model, it can be any use case that you're wanting to provide notifications for a data structure.  The idea is that the abstraction should feel common and also provide building blocks, just like the &lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/reference.html"&gt;Collections Framework&lt;/a&gt;, for application needs.&lt;br /&gt;&lt;br /&gt;In order to drive home the idea that the core of data binding doesn't necessarily have anything to do with UI the core interfaces and implementations that are UI unaware will reside in plug-in org.eclipse.core.databinding.  The project is currently named org.eclipse.jface.databinding but will soon be renamed, see &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153630"&gt;bug 153630&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-1337297600018974617?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/1337297600018974617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=1337297600018974617' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1337297600018974617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/1337297600018974617'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/11/focus-on-data-structures.html' title='A Focus on Data Structures'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-6875190111438990477</id><published>2006-10-27T20:01:00.000-06:00</published><updated>2006-10-27T20:16:17.817-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jface'/><category scheme='http://www.blogger.com/atom/ns#' term='newsgroup'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>Changing to the eclipse.platform newsgroup</title><content type='html'>We're changing the official JFace Data Binding newsgroup from eclipse.platform.rcp (&lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.platform.rcp"&gt;http://&lt;/a&gt;, &lt;a href="news://news.eclipse.org/eclipse.platform.rcp"&gt;news://&lt;/a&gt;) to eclipse.platform (&lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.platform"&gt;http://&lt;/a&gt;, &lt;a href="news://news.eclipse.org/eclipse.platform"&gt;news://&lt;/a&gt;).  The reason is that we feel like it's a little more intuitive as the plug-in isn't part of RCP and is a platform project.  We'll still monitor the RCP newsgroup but in the future please post your questions to eclipse.platform.  Also please remember to prefix the summary with "[DataBinding]" to make posts easier to find.  For more information see &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161885"&gt;bug 161885&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-6875190111438990477?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/6875190111438990477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=6875190111438990477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6875190111438990477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/6875190111438990477'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/10/changing-to-eclipseplatform-newsgroup.html' title='Changing to the eclipse.platform newsgroup'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-3589755523381456472</id><published>2006-10-24T07:07:00.000-06:00</published><updated>2006-10-27T20:17:01.122-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jface'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>JFace Data Binding Google Search</title><content type='html'>I started a &lt;a href="http://google.com/coop/cse/overview"&gt;Custom Google Search&lt;/a&gt; for JFace Data Binding.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://google.com/coop/cse?cx=017491335737449582217%3Awqofq3pd2co"&gt;JFace Data Binding Google Search&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;I've done some tweaking and added the following &lt;a href="http://google.com/coop/docs/cse/refinements.html"&gt;refinements&lt;/a&gt;:&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;bugs&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Searches &lt;a href="https://bugs.eclipse.org/bugs"&gt;bugzilla&lt;/a&gt; for the entered text and adds "[DataBinding]" to the search as all Data Binding bugs contain this in the title.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;cvs&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Search CVS and &lt;a href="http://cia.navi.cx/"&gt;CVS commit messages&lt;/a&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;forums&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Searches &lt;a href="http://www.eclipsezone.com/forums"&gt;eclipsezone.com/forums&lt;/a&gt; and the &lt;a href="http://dev.eclipse.org/mhonarc/lists/platform-ui-dev/"&gt;platform-ui-dev mailing list&lt;/a&gt; adding 'databinding OR "data binding"' to narrow the search.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;When using any refinement it limits the searches to the sites I have listed for the refinement rather than just favoring the listed sites.  &lt;br /&gt;&lt;br /&gt;The main search searches the following sites:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://dev.eclipse.org/mhonarc/lists/platform-ui-dev/"&gt;http://dev.eclipse.org/mhonarc/lists/platform-ui-dev/&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.examples.databinding"&gt;http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.examples.databinding&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.tests.databinding"&gt;http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.tests.databinding&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.databinding.beans"&gt;http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.databinding.beans&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.databinding.ui"&gt;http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.databinding.ui&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.databinding"&gt;http://cia.navi.cx/stats/project/eclipse/org.eclipse.jface.databinding&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://www.eclipsezone.com"&gt;http://www.eclipsezone.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.tests.databinding"&gt;http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.tests.databinding&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.examples.databinding"&gt;http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.examples.databinding&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding.ui"&gt;http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding.ui&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding.beans"&gt;http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding.beans&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding"&gt;http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://bugs.eclipse.org/bugs"&gt;http://bugs.eclipse.org/bugs&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://wiki.eclipse.org"&gt;http://wiki.eclipse.org&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://fire-change-event.blogspot.com"&gt;http://fire-change-event.blogspot.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://www.coconut-palm-software.com/the_visual_editor"&gt;http://www.coconut-palm-software.com/the_visual_editor&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://borisoneclipse.blogspot.com"&gt;http://borisoneclipse.blogspot.com&lt;/a&gt;&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://jroller.com/rss/trisa"&gt;http://jroller.com/rss/trisa&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This works nicely when combined with &lt;a href="http://www.mozilla.org/products/firefox/smart-keywords.html"&gt;Firefox's keyword search&lt;/a&gt; or &lt;a href="http://hetima.com/safari/stand-e.html"&gt;SafariStand's&lt;/a&gt; quick search.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-3589755523381456472?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/3589755523381456472/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=3589755523381456472' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/3589755523381456472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/3589755523381456472'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/10/jface-data-binding-google-search.html' title='JFace Data Binding Google Search'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-9145494882190062267</id><published>2006-10-23T20:23:00.000-06:00</published><updated>2006-10-24T06:50:53.084-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='provisional API'/><category scheme='http://www.blogger.com/atom/ns#' term='jface'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><category scheme='http://www.blogger.com/atom/ns#' term='bindspec'/><title type='text'>Pardon our Progress: BindSpec and provisional APIs</title><content type='html'>A couple of people have run into issues lately attempting to use the provisional APIs in the latest version of Data Binding.  They receive an exception along the lines of...&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Exception in thread "main" org.eclipse.jface.internal.databinding.provisional.BindingException: No binding found for target: org.eclipse.jface.internal.databinding.internal.swt.TextObservableValue, model: org.eclipse.jface.databinding.observable.value.WritableValue&lt;br/&gt;&lt;br /&gt; at org.eclipse.jface.internal.databinding.provisional.DataBindingContext.bind(DataBindingContext.java:170)&lt;br/&gt;&lt;br /&gt; at org.eclipse.jface.internal.databinding.provisional.DataBindingContext.bind(DataBindingContext.java:228)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;The issue is that the incorrect BindSpec has been passed to DataBindingContext.bind(...).  But how can that be?  Shouldn't the API enforce the correct type?  Yes, well most of the time is should...&lt;br /&gt;&lt;br /&gt;The signature for bind(...) is as follows...&lt;br /&gt;&lt;code&gt;&lt;br /&gt; &lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;Binding&amp;nbsp;bind&lt;/font&gt;&lt;font color="#000000"&gt;(&lt;/font&gt;&lt;font color="#000000"&gt;Object targetDescription,Object modelDescription, org.eclipse.jface.databinding.BindSpec&amp;nbsp;bindSpec&lt;/font&gt;&lt;font color="#000000"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The method expects an instance of org.eclipse.jface.databinding.BindSpec.  This is the 1.0 BindSpec.  The problem is that internally if  bind(...) doesn't receive an instance of org.eclipse.jface.internal.databinding.provisional.BindSpec, the provisional BindSpec, it won't create the Binding.  The reason for this confusion is that we're trying to keep the provisional APIs working while refactoring to the 1.0 APIs.  So even though the signature of the bind(...) method accepts org.eclipse.jface.databinding.BindSpec don't pass this type, pass org.eclipse.jface.internal.databinding.provisional.BindSpec instead.&lt;br /&gt;&lt;br /&gt;So let's recap, when using the provisional DataBindingContext...&lt;br /&gt;&lt;br /&gt;org.eclipse.jface.databinding.BindSpec == bad&lt;br /&gt;&lt;br /&gt;org.eclipse.jface.internal.databinding.provisional.BindSpec == good&lt;br /&gt;&lt;br /&gt;For more information see &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=161498"&gt;bug 161498&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-9145494882190062267?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/9145494882190062267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=9145494882190062267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9145494882190062267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/9145494882190062267'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/10/pardon-our-progress-bindspec-and.html' title='Pardon our Progress: BindSpec and provisional APIs'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-2165711704282157281</id><published>2006-10-17T20:00:00.000-06:00</published><updated>2006-10-17T22:04:14.177-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jface'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>Uber Factories and Project Refactoring</title><content type='html'>It would be difficult to try to sum up what has happened in Data Binding up until this point.  So I thought I'd highlight a few changes/discussions that have occurred recently.  In case you don't know we're on the road to the &lt;a href="http://wiki.eclipse.org/index.php/JFace_Data_Binding_FAQ#When_will_version_1.0_be_released.3F"&gt;1.0 release&lt;/a&gt;.  One area that we're focusing on is API.  I'll do my best to point out changes in the API.&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147563"&gt;bug 147563 - [DataBinding] Need a standard factory for data binding contexts&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;br /&gt;&lt;em&gt;API Changes&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Those who already smoked the weed of the Überfactory and can't give up are advised to roll their own factories, or move to stronger stuff like e.g. AOP.""&lt;/blockquote&gt; - &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=147563#c75"&gt;comment 75&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;If you are familiar with the Eclipse 3.2 version of Data Binding you might be familiar with the "Uber factories" that were used to create &lt;code&gt;IObservable&lt;/code&gt;s and &lt;code&gt;Binding&lt;/code&gt;s.  The factories, &lt;code&gt;IBindingFactory&lt;/code&gt; and &lt;code&gt;IObservableFactory&lt;/code&gt;, have been deprecated as we decided to keep the API simple and expressive in order to allow for transparency, simpler debugging, and better documentation.  Currently there is SWT support using the new approach but we haven't moved the JFace support to the new API yet.  For examples of the approach see &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding.ui/src/org/eclipse/jface/databinding/swt/SWTObservables.java?rev=HEAD&amp;content-type=text/vnd.viewcvs-markup"&gt;SWTObservables&lt;/a&gt; and &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding.beans/src/org/eclipse/jface/databinding/beans/BeansObservables.java?rev=HEAD&amp;amp;content-type=text/vnd.viewcvs-markup"&gt;BeansObservables&lt;/a&gt;.  Also, before the 1.0 release the static factory methods on &lt;code&gt;SWTObservables&lt;/code&gt; will be changed from having a "get" prefix to an "observe" prefix.&lt;/p&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=153630"&gt;bug 153630 - [DataBinding] Extract SWT specific code from JFace databinding into its own bundle&lt;/a&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;As of 20061004 what was org.eclipse.jface.databinding has been broken out into 3 separate plug-ins.  The core framework no longer has SWT dependencies.  The projects and their dependencies are as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;org.eclipse.jface.databinding "core data binding framework"&lt;br /&gt;class library: J2ME Foundation 1.0&lt;br /&gt;dependencies:&lt;br /&gt; org.eclipse.equinox.common&lt;br /&gt;&lt;br /&gt;org.eclipse.jface.databinding.ui "binding to SWT and JFace"&lt;br /&gt;class library: J2ME Foundation 1.0&lt;br /&gt;dependencies:&lt;br /&gt; org.eclipse.jface.databinding&lt;br /&gt; org.eclipse.equinox.common&lt;br /&gt; org.eclipse.jface&lt;br /&gt;&lt;br /&gt;org.eclipse.jface.databinding.beans "binding to Java beans"&lt;br /&gt;class library: J2SE 1.4&lt;br /&gt;dependencies:&lt;br /&gt; org.eclipse.jface.databinding&lt;br /&gt; org.eclipse.equinox.common&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;Spreadsheet Example&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Boris has been working on a &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.examples.databinding/src/org/eclipse/jface/examples/databinding/spreadsheet/Spreadsheet.java?rev=HEAD&amp;content-type=text/vnd.viewcvs-markup"&gt;Spreadsheet&lt;/a&gt; implemented using Data Binding. It's an interesting example that uses &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jface.databinding/src/org/eclipse/jface/databinding/observable/value/ComputedValue.java?rev=HEAD&amp;amp;content-type=text/vnd.viewcvs-markup"&gt;ComputedValue&lt;/a&gt; in case you'd like to see it in action.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=116920"&gt;bug 116920 - [DataBinding] need to handle model change events which don't happen in the UI thread&lt;/a&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;It looks like progress is being made on the concurrency front.  If you have any input/concerns on concurrency in the framework please add them to the bug.  The issue is that the framework is not thread safe and if possible we'd like it to be for the 1.0 release.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;a href="http://wiki.eclipse.org/index.php/JFace_Data_Binding_FAQ"&gt;We have a FAQ&lt;/a&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;A FAQ has been started on &lt;a href="http://wiki.eclipse.org/index.php/Main_Page"&gt;Eclipsepedia&lt;/a&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-2165711704282157281?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/2165711704282157281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=2165711704282157281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2165711704282157281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/2165711704282157281'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/10/uber-factories-and-project-refactoring.html' title='Uber Factories and Project Refactoring'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1759528437624391151.post-7876096598846771167</id><published>2006-10-17T19:59:00.000-06:00</published><updated>2006-10-17T18:57:10.869-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jface'/><category scheme='http://www.blogger.com/atom/ns#' term='databinding'/><title type='text'>The goal of fireChangeEvent()</title><content type='html'>This blog is for those interested in recent activity in the Eclipse JFace Data Binding project.  The posts will be comprised of recent CVS commits, bug changes/resolutions, and any activity that might be of interest to those tracking the project.  The goal is to cut down on the amount of work you have to do to know what's going on so that you can spend more time on using the toolkit and preparing yourself for what's coming.  I'll try to keep things short and sweet.  In that spirit, on to the first post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1759528437624391151-7876096598846771167?l=fire-change-event.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fire-change-event.blogspot.com/feeds/7876096598846771167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1759528437624391151&amp;postID=7876096598846771167' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/7876096598846771167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1759528437624391151/posts/default/7876096598846771167'/><link rel='alternate' type='text/html' href='http://fire-change-event.blogspot.com/2006/10/goal-of-firechangeevent.html' title='The goal of fireChangeEvent()'/><author><name>Brad Reynolds</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_bpRC_X5DJc8/R-MZdeNyjzI/AAAAAAAAABc/GCMKUZwSgSE/S220/Untitled-1.jpg'/></author><thr:total>2</thr:total></entry></feed>
