[Dev] Objection to the new CPIA example

John Anderson john at osafoundation.org
Mon Nov 7 11:06:13 PST 2005


I'd like to get some other opinions on whether or not it is useful for 
learning CPIA to be able to specify a single view (tree of blocks) that 
is used to display a particular Item in the detail view without going 
into the extra complexity of the "full blown" detail view mechanism.

I had heard that scripts might be an example of such an situation.

Of course I'm not opposed to doing a "full blown" example, I just think 
starting with a simple example is useful. And as I mentioned before I 
intend to move the tutorial forward to include a complete detail view 
example with a discussion on the trade-offs.

John


Bryan Stearns wrote:

> There was a brief discussion a week or so ago about what happens when 
> a reviewer disagrees with a change; that discussion didn't come to any 
> conclusion, so I don't know what the process is to object to a change 
> that I didn't review.  This particular issue is something that I'm 
> *very* frustrated by, but I'm trying to work through it in our open 
> process, so here goes:
>
> The change below is supposed to be an example, but much of it 
> introduces a new mechanism for associating detail views with items, 
> and the example just shows how to use that. At the meeting last week 
> where John proposed this, I objected to it strongly, on the grounds 
> that we already have a satisfactory mechanism for associating detail 
> views with items, which isn't hard to use -- adding another doesn't 
> serve any useful purpose. I stated then that it's important, in 
> example code, to focus on showing techniques that you expect 
> developers to use in their code; it's bad to give examples that you 
> wouldn't want developers to ship. I feel strongly that our examples 
> should focus on doing things "the Chandler way"; if that "way" needs 
> to be refined, fine, let's refine it, but let's not pollute it with 
> alternatives we don't need.
>
> I'd like to suggest that this change be backed out, and that John (or 
> someone else) find a way to show how to add a new content item type 
> and a detail view for it without creating a new structural mechanism 
> to do so.
>
> ...Bryan
>
> -------- Original Message --------
> Subject: 	[commits] (john) [8190] Bug 3229: Hello world CPIA parcel 
> example to go with documenation.
> Date: 	Mon, 7 Nov 2005 07:16:20 -0800
> From: 	commits at osafoundation.org
> Reply-To: 	dev at osafoundation.org
> To: 	commits at osafoundation.org
>
>
>
> Revision
>     8190 <http://viewcvs.osafoundation.org/chandler?view=rev&rev=8190>
> Author
>     john
> Date
>     2005-11-07 07:15:46 -0800 (Mon, 07 Nov 2005)
>
>
>       Log Message
>
> Bug 3229 <http://bugzilla.osafoundation.org/show_bug.cgi?id=3229>: 
> Hello world CPIA parcel example to go with documenation. Checking in 
> rough draft. r=donn
>
>
>       Modified Paths
>
>     * trunk/chandler/parcels/osaf/framework/blocks/ControlBlocks.py
>       <#trunkchandlerparcelsosafframeworkblocksControlBlockspy>
>     * trunk/chandler/parcels/osaf/framework/blocks/Trunk.py
>       <#trunkchandlerparcelsosafframeworkblocksTrunkpy>
>     * trunk/chandler/parcels/osaf/framework/blocks/Views.py
>       <#trunkchandlerparcelsosafframeworkblocksViewspy>
>     * trunk/chandler/parcels/osaf/framework/blocks/__init__.py
>       <#trunkchandlerparcelsosafframeworkblocks__init__py>
>     * trunk/chandler/parcels/osaf/framework/blocks/detail/Detail.py
>       <#trunkchandlerparcelsosafframeworkblocksdetailDetailpy>
>     * trunk/chandler/parcels/osaf/pim/__init__.py
>       <#trunkchandlerparcelsosafpim__init__py>
>     * trunk/chandler/parcels/osaf/pim/items.py
>       <#trunkchandlerparcelsosafpimitemspy>
>
>
>       Added Paths
>
>     * trunk/chandler/parcels/samples/
>     * trunk/chandler/parcels/samples/__init__.py
>       <#trunkchandlerparcelssamples__init__py>
>     * trunk/chandler/parcels/samples/hello_world-1/
>     * trunk/chandler/parcels/samples/hello_world-1/__init__.py
>       <#trunkchandlerparcelssampleshello_world1__init__py>
>     * trunk/chandler/parcels/samples/hello_world-1/hello_world.py
>       <#trunkchandlerparcelssampleshello_world1hello_worldpy>
>
>
>       Diff
>
>
>         Modified:
>         trunk/chandler/parcels/osaf/framework/blocks/ControlBlocks.py
>         (8189 => 8190)
>
>--- trunk/chandler/parcels/osaf/framework/blocks/ControlBlocks.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/framework/blocks/ControlBlocks.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -44,7 +44,7 @@
> 
>     characterStyle = schema.One(Styles.CharacterStyle)
>     title = schema.One(schema.Text)
>-    buttonKind = schema.One(buttonKindEnumType)
>+    buttonKind = schema.One(buttonKindEnumType, initialValue="Text")
>     icon = schema.One(schema.Text)
>     rightClicked = schema.One(BlockEvent)
>     event = schema.One(BlockEvent)
>
>
>         Modified:
>         trunk/chandler/parcels/osaf/framework/blocks/Trunk.py (8189 =>
>         8190)
>
>--- trunk/chandler/parcels/osaf/framework/blocks/Trunk.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/framework/blocks/Trunk.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -21,6 +21,14 @@
> to customize its behavior.
> """
> 
>+class ViewableKind(schema.Annotation):
>+     """
>+     Annotate the Kind class to add a detailView attribute which is the detailView to
>+     use when displaying the Items of this class
>+     """
>+     schema.kindInfo(annotates=schema.Kind) 
>+     detailView  = schema.One(Block.Block)
>+
> class wxTrunkParentBlock(ContainerBlocks.wxBoxContainer):
>     """ 
>     A widget block that gives its TrunkParentBlock a chance to change 
>
>
>         Modified:
>         trunk/chandler/parcels/osaf/framework/blocks/Views.py (8189 =>
>         8190)
>
>--- trunk/chandler/parcels/osaf/framework/blocks/Views.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/framework/blocks/Views.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -4,10 +4,8 @@
> __license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
> __parcel__ = "osaf.framework.blocks"
> 
>-import application.Globals as Globals
>-from osaf.framework.blocks.Block import Block
> from ContainerBlocks import BoxContainer
>-import wx
>+from application import schema
> 
> class View(BoxContainer):
>     pass
>
>
>         Modified:
>         trunk/chandler/parcels/osaf/framework/blocks/__init__.py (8189
>         => 8190)
>
>--- trunk/chandler/parcels/osaf/framework/blocks/__init__.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/framework/blocks/__init__.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -13,8 +13,7 @@
>     SplitterWindow, TabbedContainer, ViewContainer
> )
> 
>-from Trunk import TrunkDelegate, TrunkParentBlock
>-from Views import View
>+from Trunk import TrunkDelegate, TrunkParentBlock, ViewableKind
> 
> from ControlBlocks import (
>     AEBlock, Button, CheckBox, Choice, ComboBox, ContentItemDetail,
>
>
>         Modified:
>         trunk/chandler/parcels/osaf/framework/blocks/detail/Detail.py
>         (8189 => 8190)
>
>--- trunk/chandler/parcels/osaf/framework/blocks/detail/Detail.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/framework/blocks/detail/Detail.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -285,24 +285,26 @@
>         # (Yes, I wrote this as a double nested list comprehension with filtering, 
>         # but I couldn't decide how to work in a lambda function, so I backed off and
>         # opted for clarity.)
>-        decoratedSubtreeList = [] # each entry will be (position, path, subtreechild)
>-        for subtree in self._getSubtrees():
>-            if keyItem.isKindOf(subtree.key) and subtree.hasLocalAttributeValue('rootBlocks'):
>-                for block in subtree.rootBlocks:
>-                    entryTobeSorted = (block.getAttributeValue('position', default=sys.maxint), 
>-                                       block.itsPath,
>-                                       self._copyItem(block))
>-                    decoratedSubtreeList.append(entryTobeSorted) 
>-                
>-        if len(decoratedSubtreeList) == 0:
>-            assert False, "Don't know how to build a trunk for this kind!"
>-            # (We can continue here - we'll end up just caching an empty view.)
>-
>-        decoratedSubtreeList.sort()
>-        
>-        # Copy our stub block and move the new kids on(to) the block
>-        trunk = self._copyItem(self.trunkStub)
>-        trunk.childrenBlocks.extend([ block for position, path, block in decoratedSubtreeList ])
>+        trunk = getattr (Trunk.ViewableKind(keyItem), "detailView", None)
>+        if trunk is None:
>+            decoratedSubtreeList = [] # each entry will be (position, path, subtreechild)
>+            for subtree in self._getSubtrees():
>+                if keyItem.isKindOf(subtree.key) and subtree.hasLocalAttributeValue('rootBlocks'):
>+                    for block in subtree.rootBlocks:
>+                        entryTobeSorted = (block.getAttributeValue('position', default=sys.maxint), 
>+                                           block.itsPath,
>+                                           self._copyItem(block))
>+                        decoratedSubtreeList.append(entryTobeSorted) 
>+                    
>+            if len(decoratedSubtreeList) == 0:
>+                assert False, "Don't know how to build a trunk for this kind!"
>+                # (We can continue here - we'll end up just caching an empty view.)
>+    
>+            decoratedSubtreeList.sort()
>+            
>+            # Copy our stub block and move the new kids on(to) the block
>+            trunk = self._copyItem(self.trunkStub)
>+            trunk.childrenBlocks.extend([ block for position, path, block in decoratedSubtreeList ])
>         return trunk
>     
>     def _getSubtrees(self):
>
>
>         Modified: trunk/chandler/parcels/osaf/pim/__init__.py (8189 =>
>         8190)
>
>--- trunk/chandler/parcels/osaf/pim/__init__.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/pim/__init__.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -2,7 +2,7 @@
> # (this should include all ContentItem subclasses in this package)
> #
> from items import (
>-    ContentKind, ContentItem, ImportanceEnum, Group, Project
>+    ContentItem, ImportanceEnum, Group, Project
> )
> from notes import Note
> from contacts import Contact, ContactName
>
>
>         Modified: trunk/chandler/parcels/osaf/pim/items.py (8189 => 8190)
>
>--- trunk/chandler/parcels/osaf/pim/items.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/osaf/pim/items.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -22,18 +22,6 @@
> 
> logger = logging.getLogger(__name__)
> 
>-class ContentKind(Kind):
>-    """This kind is a metakind for creating other kinds.  Kinds which are
>-    an instance of ContentKind will have an attribute 'detailView' of type
>-    Block.  We could also make this attribute a bidiref."""
>-
>-    __metaclass__ = schema.ItemClass
>-
>-    schema.kindInfo(displayName=u"Metakind 'Content Kind'")
>-
>-    detailView = schema.One()   # Block
>-
>-
> class ImportanceEnum(schema.Enumeration):
>     """Importance Enum"""
>     schema.kindInfo(
>
>
>         Added: trunk/chandler/parcels/samples/__init__.py (8189 => 8190)
>
>--- trunk/chandler/parcels/samples/__init__.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/samples/__init__.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -0,0 +1,7 @@
>+import application.schema as schema
>+
>+#Comment in tthe following code to enable your favorite sample.
>+#Replace "samples.hello_world-1" with your favorite sample
>+
>+#def installParcel(parcel, oldVersion=None):
>+  #schema.synchronize(parcel.itsView, 'samples.hello_world-1')
>\ No newline at end of file
>Property changes on: trunk/chandler/parcels/samples/__init__.py
>___________________________________________________________________
>Name: svn:eol-style
>   + native
>
>
>         Added:
>         trunk/chandler/parcels/samples/hello_world-1/__init__.py (8189
>         => 8190)
>
>--- trunk/chandler/parcels/samples/hello_world-1/__init__.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/samples/hello_world-1/__init__.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -0,0 +1,43 @@
>+import application.schema as schema
>+import osaf.framework.attributeEditors as attributeEditors
>+import osaf.framework.blocks as blocks
>+from osaf.framework.types.DocumentTypes import RectType, SizeType
>+from hello_world import MP3
>+
>+def installParcel(parcel, oldVersion=None):
>+
>+    repositoryView = parcel.itsView
>+    blocksParcel = schema.ns('osaf.framework.blocks', repositoryView)
>+    
>+    aePresentationStyle = blocks.ControlBlocks.PresentationStyle.update(
>+        parcel, 'presentationStyle',
>+        format = 'static')
>+
>+    attributeEditorBlock = blocks.ControlBlocks.AEBlock.update(
>+        parcel, 'attributeEditorBlock',
>+        blockName = 'HeadlineBlock',
>+        alignmentEnum = 'alignTopCenter',
>+        viewAttribute = 'about',
>+        presentationStyle = aePresentationStyle)
>+    
>+    button = blocks.ControlBlocks.Button.update(
>+        parcel, 'button',
>+        minimumSize = SizeType (40, 20),
>+        alignmentEnum = 'alignTopLeft',
>+        stretchFactor = 0.0,
>+        title = u'Play')
>+        
>+    view = blocks.BoxContainer.update(
>+        parcel, 'HelloWorldBoxContainer',
>+        orientationEnum = 'Horizontal',
>+        eventBoundary = True,
>+        childrenBlocks=[button, attributeEditorBlock])
>+    
>+    blocks.Trunk.ViewableKind(MP3.getKind(repositoryView)).detailView = view
>+
>+    song = MP3.update(parcel, "French Rock",
>+                      about = "French Rock")
>+    
>+    #eventually we need to populate the song using:
>+    #stream = song.audio.getOutputStream()
>+    #stream.write
>\ No newline at end of file
>Property changes on: trunk/chandler/parcels/samples/hello_world-1/__init__.py
>___________________________________________________________________
>Name: svn:eol-style
>   + native
>
>
>         Added:
>         trunk/chandler/parcels/samples/hello_world-1/hello_world.py
>         (8189 => 8190)
>
>--- trunk/chandler/parcels/samples/hello_world-1/hello_world.py	2005-11-05 02:49:04 UTC (rev 8189)
>+++ trunk/chandler/parcels/samples/hello_world-1/hello_world.py	2005-11-07 15:15:46 UTC (rev 8190)
>@@ -0,0 +1,7 @@
>+from osaf.pim.notes import Note
>+from application import schema
>+
>+class MP3(Note):
>+    audio = schema.One (schema.Lob)
>+
>+
>Property changes on: trunk/chandler/parcels/samples/hello_world-1/hello_world.py
>___________________________________________________________________
>Name: svn:eol-style
>   + native
>
>  
>
>------------------------------------------------------------------------
>
>_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
>
>Open Source Applications Foundation "Dev" mailing list
>http://lists.osafoundation.org/mailman/listinfo/dev
>  
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osafoundation.org/pipermail/dev/attachments/20051107/95dc8657/attachment.html


More information about the Dev mailing list