Thanks John, these are good comments. I'll see what I can do with them. ;)

Cheers,
Katie

John Anderson wrote:
I reviewed the draft of the 0.6 architecture writeup. Overall, I thought it was excellent. Feel free to incorporate the following comments if you think they are appropriate:

In "Data Driven Architecture":

You mention that "The Python code isn't persisted". I think this might be a little misleading since, when you use a persisted Item, it's methods are always exists. Perhaps you should say Python code isn't stored in the repository, or Python code in the application is automatically associated with Items in the repository, or maybe you shouldn't mention anything.

Under the description of Collections, you might want to mention that Collections can be made by combining two or more Collections with boolean operations. Rather than saying collections use queries, you might say Collections can contain all the items of a Kind, or filter another Collection using a Python expression.

In "Data Application Layer":

You might make a distinction between loading all the parcels the first time -- which should be thought of more like a "build a step" and loading parcels that were installed after Chandler has already been run. Even though this isn't always how we ran Chandler today as we develop, it's important for developers to understand that the repository always exists and when users typically run Chandler, most parcels were usually loaded some time in the past. Maybe you could say: Parcels are not loaded each time you run Chandler, unless they have changed.

The description of how the MainView object gets populated with UI Item objects seems a bit off. During the initial repository build step, A tiny topmost tree of blocks rooted at the MainView, some template trees of blocks, collections, but not including most the UI Items that eventually get displayed are loaded into the repository. All these are Items, no different from other Items, loaded from Parcels. After the repository is built, when the UI is first displayed (i.e. when rendering the MainView), the BranchPoint Block's controller delegate creates trees of UI blocks from a combination of code and templates. These trees of blocks make up most of the UI that is actually displayed.

You might mention the repository viewer as an early "experimental" parcel, not feature.

In "CPIA":

It wasn't clear in your diagram whether the diagram was supposed to represent the arrangement of UI on the screen, or the arrangement of Blocks in the repository. If it's the latter, menu items and toolbar items can be anywhere in a tree of blocks, not just at the top.

You might mention that the Sidebar contains a Collection of Collections instead of a list of Collections, and that any number of items can be selected in the Sidebar instead of just one, however, only one is displayed in the SummaryViews/DetailView.

In the second paragraph after the first diagram, I'd describe the typical function of a block as storing the persistent state of the UI and delegating the display an Item to a widget, and not mention pulling it from the Repository, since that's an automatic function of all Items.

In the paragraph just after the second diagram (and the one following it), I would avoid using the term "render", e.g. In the sentence: The Block delegates the rendering work to a delegate object, called a Widget because we also use the term render to describe the process of creating the widget. Perhaps you could say: The Block delegates the work of display and user-interaction to a delegate object, ...

In the next paragraph, beginning with "Block objects store information..." you mention that the selection is on the Block. We recently moved the selection to the Collection (now a IndexedSelectionCollection, described below) in contents. It contains the selection and the sort, e.g. order of items in the collection that is displayed on screen. Now when a single Calendar block is used to display different contents, each contents has its own selection.

Under "Key decisions" I had never heard of the phrase "We're not trying to boil the ocean here." After a little googling, it was still unclear, but my guess is it means trying to solve an intractable problem. Using CPIA for non-Chandler applications doesn't seem intractable, but instead, is not an OSAF goal. If people interpret Chandler as a personal information manager, they might conclude that the CPIA framework excludes non-PIM content items. Also, CPIA doesn't preclude interfaces without Sidebars, SummaryViews DetailViews, e.g. the RepositoryViewer. Perhaps it would make more sense to instead say: OSAF doesn't intend to use CPIA for any other purpose than building the Chandler user-interface and allowing for extensions, e.g. extending the DetailView

Under "Most CPIA code can be found here:" there isn't a SummaryTable block today. The summary table uses a Table block which is a general purpose table.

Somewhere nearby the discussion of "The Parcel Developer's Guide to the Schema API", you might mention that the repository's data model differs from Python's data model. Notable examples include ref collections, bidirectional refs, and restrictions on using single refs.

Under "Extension Parcels" the repository viewer and CPIA Viewer are simple extensions that don't use the SummaryTable or Detail blocks.

In "Threading Model"

The last sentence might be rewritten as follows: As the new changes are picked up, Blocks are notified about changes to their contents which caused their Widgets to repaint repaint the affected data in the next Paint cycle.

In "Collections and Notifications"

You might start with a brief description of each of the different kinds of Collections:

KindCollection: a collection of all Items of a particular kind

ListCollection: an explicit list of items

DifferenceCollection: a collection that results from the difference of two source Collections.

UnionCollection: a collection that results from the union of two or more source Collections

IntersectionCollection: a collection that results from the intersection of two or more source Collections

FilteredCollection: a collection that contains only those items from another collection that match a Python filter expression

InclusionExclusionCollection: a compound collection that implements add by adding items to a unioned, "inclusions" ListCollection, and delete by adding items to a difference, "exclusion" ListCollection, and always excludes items in a Trash collection. InclusionExclusionCollection was implemented as a convenience since most user Collections in the Sidebar need this functionality.

IndexedSelectionCollection: A collection that adds an index, e.g.for ordering items in the collection, and a selection for selecting a subset of the items to source collection. IndexedSelectionCollection allow the user interface to order and store selections on existing Collections.

As mentioned above, you might replace querying for items with Collections of all items of a particular kind and filtering another Collection with a Python expression.

It might be better not to mention Repository Sets in an overview document since Collections were designed so that you didn't need to know anything about Repository Sets, which are just an implementation detail from the API point of view. Also the details of implementation of Notifications are quite complicated and subject to change. It might be better to mention that Blocks, when rendered (i.e. displayed on the screen), that have a contents attribute, will automatically be notified about changes to their contents in wxWidget's OnIdle processing. Blocks coordinate with their widget to make sure that changes to the data are reflected properly on the screen.

The Attribute Editor notification mechanism, using monitors, doesn't pick up changes from other views, so we will soon switch over to use the same notification mechanism that we use for Collections today.

John

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Open Source Applications Foundation "Dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/dev

Reply via email to