Subject: Re: styles
From: Paul Rohr (paul@abisource.com)
Date: Tue Dec 07 1999 - 14:05:58 CST
At 12:39 PM 12/7/99 -0600, Stephen Hack wrote:
>Is anybody working on styles?  I'm considering creating the styles dialog and
>tieing in the pull down menubar.
Not to my knowledge.  I did the original stylesheet hacking this spring, and 
summarized how far I got in the sample document:
  abi/test/wp/Styles.abw
The existing code is quite self-contained, and was easy to add.  Most of the 
remaining work should also be pretty localized.  (I'm guessing this'll be 
true for everything except #5 in that TODO list.)  
However, in the two cases you mention, you may need to do some new API work 
at other spots in the code:
1.  To populate the toolbar combo will definitely require some API work.  
IIRC, toolbar controls currently get populated once per frame at creation 
time.  However, what we really need is to be able to:
  - populate *all* styles used (or defined, I'm not sure which), and 
  - update that set as it changes. 
The current hack of a single fixed set was a lot simpler to add, but we'll 
need a real fix.  
  AP_<platform>Toolbar_StyleCombo::populate(void)
As you can see from the original #ifdefs here, this may be as simple as 
widening some APIs upstream of this method, so that it have access to the 
View or Document.  (To check, put a breakpoint here and look at the call 
stack.)
2.  The dialog work for browsing and editing style definitions shouldn't be 
too bad, especially since we now have some XP preview widgets available.  
The paragraph dialog would be a great place to start on this. 
As a first cut, you may want to just mock up the full dialogs and allow 
users to browse existing style definitions.  I believe the current set of 
Document-level methods provides just about all the access you'll need to the 
underlying PD_Style objects, although it might be cleaner to go through 
View-level wrapper functions (kind of like PD_Document hides a lot of 
PT_PieceTable methods):
  PD_Document::appendStyle()
  PD_Document::getStyle()
  PD_Document::enumStyles()
Among other things, it might be nice to come up with localizable 
presentations of the raw properties, to avoid tainting users with the 
hyphenated-english in our property names.  
Where the real work will come is in editing and changing those style 
definitions.  In particular, we'll need to decide:
  a.  Which portions of a Style definition are editable?  For example, 
converting an existing character style to a paragraph style probably makes 
no sense.
  b.  Should any or all of the permitted changes participate in the Undo 
mechanism, and at what granularity?  (Avoiding Undo entirely would make our 
lives a lot easier, but will that make sense to users?)
Depending on the answers to these questions, it might be possible to just 
modify existing PD_Style objects in place.  Or, more likely, we'll need to 
enhance the Piece Table to make it far more aware of the ways that style 
definitions can change, so that it can undo those changes when needed by 
consulting the appropriate change record.  
After that, the real trick will be figuring out how to propagate formatting 
changes to existing style definitions.  Currently, as far as the formatter 
is concerned, styles are read-only, and features like BASEDON cascading Just 
Work, because they're hidden in the property lookup mechanism.  
  PP_evalProperty()
Thus, the only time we need to explicitly trigger style-driven reformats is 
when we apply a different block-level style, and that code is pretty 
straightforward, except down in the piece table, where it gets a bit more 
complex:
  FV_View::setStyle()
  pt_PieceTable::changeStruxFmt()
  fl_BlockLayout::doclistener_changeStrux()
However, once we allow folks to change an existing style definition, then 
we'll need to reformat whichever portions of the document got affected by 
that change.  (In particular, the BASEDON cascading makes locating relevant 
blocks and spans that much harder.)  The brute force hack is to reformat the 
entire document, which sounds ugly, but it's reliable, so perhaps that's our 
best alternative.  
And then of course, you also need to deal with the fact that documents can 
have multiple views, all of which need that same reformatting to occur.  
Sigh.  You can see why this isn't going to be a two-day project.  :-(
Paul
This archive was generated by hypermail 2b25 : Tue Dec 07 1999 - 14:00:53 CST