Well, I've got full DIA support in PalmBible+.  Now it's time to do it in
Plucker.  Given that people have been asking for Palm DIA support for half a
year, any chance the support could make it into HEAD despite the feature
freeze?  The amount of changes to the code will actually be pretty small.  I
include below information from PalmBible+'s DIA.txt on what needs changing.
Basically, it just means that each form has to call some special handlers,
and then we need to add a bunch of new resources to the viewer.rcp.in file.
The main change to existing Plucker code is that all the current silkscreen
code would disappear and be replaced by PalmBible+'s resize.c and DIA.c
(available in cvs: the project page is www.sf.net/projects/palmbibleplus),
and the alternate size forms from viewer.rcp.in will be removed.

The code appears to work very nicely in sim and POSE for both vertical and
horizontal resizing, even with fairly complex forms (e.g., ones with two
side-by-side lists which need to resize equally).

1. To support Sony, compile DIA.c with -DSUPPORT_DIA_SONY.  To support
Handera,
   compile DIA.c with -DSUPPORT_DIA_HANDERA.  Ensure that you have a sects.h
   file that correctly sets the code sections for DIA_SECTION and
   RESIZE_SECTION.  If your application doesn't do sectioning, you can just
   do:
      #define DIA_SECTION
      #define RESIZE_SECTION
   You also need to ensure that you have defined SafeMemPtrNew() and
   SafeMemPtrFree() code and you have prototypes for these in util.h.
   SafeMemPtrFree() should return if fed a NULL pointer, else call
   MemPtrFree(), and SafeMemPtrNew() should produce a fatal application
error
   if MemPtrNew() fails.  If you don't care about error checking, you can
   always do something like:
      #define SafeMemPtrNew MemPtrNew
      #define SafeMemPtrFree( p ) if ( ( p ) != NULL ) MemPtrFree( ( p ) )

2. In your application initialization (E.g., StartApplication()) code, call
   InitializeResizeSupport( indexDIADataID ) make sure this happens before
the
   event handlers for your forms are set.  In your application
   de-initialization, call TerminateResizeSupport().

3. Before setting the event handler for form formID, call
   SetResizePolicy( formID ).

4. In each form handler that you want to support DIA, make sure that your
   winEnterEvent, winExitEvent, frmOpenEvent, frmCloseEvent and
   winDisplayChangedEvent handlers each call the appropriate resize handler,
   namely one of:
       Boolean ResizeHandleWinEnterEvent( void ) RESIZE_SECTION;
       Boolean ResizeHandleWinExitEvent( void ) RESIZE_SECTION;
       Boolean ResizeHandleFrmOpenEvent( void ) RESIZE_SECTION;
       Boolean ResizeHandleFrmCloseEvent( void ) RESIZE_SECTION;
       Boolean ResizeHandleWinDisplayChangedEvent( void ) RESIZE_SECTION;
   These routines always return true.  Note that ResizeHandleFrmOpenEvent()
   and ResizeHandleWinEnterEvent() should be called before doing anything
   yourself (e.g., drawing a form) in the frmOpenEvent and winEnterEvent
   handlers, and ResizeHandleFrmCloseEvent() and ResizeHandleWinExitEvent()
   should be called after doing any cleanup you wish to do.

5. Modify your .rcp file to include information on how to resize forms.
This
   is done by including a number of WORDLIST (wrdl) resources.  The first
   and the only non-optional one is an index resource of word pairs.
     WORDLIST ID indexDIADataID
     BEGIN
        fromID1 toID1
        fromID2 toID2
        ...
     END
   The ID indexDIADataID is the same as the one in the
InitializeResizeSupport()
   call.  The list of word pairs then each contains the ID of a form
resource
   followed by the ID of the WORDLIST resource that contains the DIA resize
data
   for that form.  DIA is disabled for any forms not listed in the index:
   virtual graffiti is popped up and resize is disabled if possible.  It is
   perfectly acceptable to have no forms in the index or not all of them.
   Unless this conflicts with other WORDLIST IDs you might be using, it is
   easiest to use the same ID for the resize data as for the form, so
   PalmBible+'s index, for instance, starts:
       frmMain        frmMain
       frmVersionInfo frmVersionInfo
       frmMemoEdit    frmMemoEdit

6. Now include specific information on how to resize the forms in your
   application.  You should #include "resizeconsts.h" in your .rcp file to
define
   various bitmapped flags.  Each set of information has the following
format:
       WORDLIST ID resizeFormID
       BEGIN
          formFlags
          binNumber
          preferredState
          // Object data
          objectNum1  flags1   0
          objectNum2  flags2   0
          ...
        END

    formFlags is either 0 or a combination of:
        DIA_FORM_KEEP_LAST
        DIA_FORM_USE_BIN
        DIA_FORM_NO_RESIZE
    These flags, as all flags, can be added together, e.g.:
        DIA_FORM_KEEP_LAST + DIA_FORM_USE_BIN

    DIA_FORM_KEEP_LAST:  The form keeps the DIA state that was in force
        before it was opened, unless the form uses a bin, and the bin
        has defined data.  If this flag is set, binNumber is ignored
        (but must still be included--perhaps set to zero).
    DIA_FORM_USE_BIN:  A given application can include a number of "DIA
        state bins."  All forms that use the same bin share the same DIA
        setting, and if a user resizes a form in the bin, all the other
        forms in the bin are resized.  For instance, modal dialogs might
        be put all in one bin.  Or, items which do not require graffiti
        might be put in another bin.  When an application starts up,
        unless the bin data is loaded from the application's preferences
        database, each bin entry is undefined.  The DIA_FORM_USE_BIN flag
        interacts with the DIA_FORM_KEEP_LAST flag as follows: if the bin
        has not yet been defined, the bin and the form get the DIA state
        in force when the form was opened.  Without a DIA_FORM_KEEP_LAST
        flag, the bin starts off being set to preferredState.
    Without either of these flags, whenever the form is opened, the DIA
        is set to preferredState.

    preferredState is one of:
        DIA_STATE_MAX
        DIA_STATE_MIN
        DIA_STATE_NO_STATUS_BAR
    If DIA_FORM_KEEP_LAST is specified, this is ignored but must still be
    included.  The MAX and MIN refer to the size of the DIA area.  Thus,
    with DIA_STATE_MAX, the screen is typically minimized to the standard
    160x160 (or 320x320) area.  With DIA_STATE_MIN, the DIA is contracted,
    and the maximum screen size is available.  DIA_STATE_NO_STATUS_BAR is
    the same as DIA_STATE_MIN except on Sony NR/NX/NZ/UX devices where it
    opens a full screen mode with no status bar.  Make sure you give the
    user a way of exiting this!  Sony recommends you do this by letting the
    user tap on the place where the status bar used to be in order to
restore
    the status bar.

    Finally, you get a list of object resize data.  This is the part of the
    resize information that will take the most work.  By default, objects do
    not resize--they stay the same size, and the same position relative to
    the top left corner of the display.  Any objects which you want to move
    or resize with DIA changes must be listed here.  The first object (whose
    objectNum1 is ignored, but must still be included, e.g., set to 0) is
    always the form itself, and its resizing is relative to the whole
screen.
    The other objects resize relative to the form.  At least the form itself
    must be included.

    Each object resize line starts with the object ID (ignored for the form
    itself, and set to the special value GSI_OBJECT_ID (65280) for the
graffiti
    state indicator--make sure this value is not used for anything else in
your
    form), then has a word specifying a combination of flags or 0 if the
    object does not need to change size or position, followed by a reserved
    word that should contain 0.  The object flags are a combination of:
       DIA_X_RATIO DIA_Y_RATIO DIA_W_RATIO DIA_H_RATIO

       DIA_X_RIGHT DIA_Y_BOTTOM

       DIA_X_PLUS_DW DIA_Y_PLUS_DH DIA_W_PLUS_DW DIA_H_PLUS_DH

       DIA_X_PLUS_1_2_DW DIA_Y_PLUS_1_2_DH DIA_W_PLUS_1_2_DW
DIA_H_PLUS_1_2_DH

       DIA_X_PLUS_1_3_DW  DIA_Y_PLUS_1_3_DH  DIA_W_PLUS_1_3_DW
       DIA_H_PLUS_1_3_DH

       DIA_X_PLUS_2_3_DW  DIA_Y_PLUS_2_3_DH  DIA_W_PLUS_2_3_DW
       DIA_H_PLUS_2_3_DH

       DIA_X_PLUS_1_4_DW DIA_Y_PLUS_1_4_DH DIA_W_PLUS_1_4_DW
       DIA_H_PLUS_1_4_DH

       DIA_X_PLUS_3_4_DW  DIA_Y_PLUS_3_4_DH  DIA_W_PLUS_3_4_DW
       DIA_H_PLUS_3_4_DH

    These flags specify how the four relevant positioning values are
changed.
    These values are X (horizontal coordinate), Y (vertical coordinate), W
    (width), H (height).  You can at most include one DIA_X_* flag, one
DIA_Y_*
    flag, one DIA_W* and one DIA_H* flag.  If you omit a flag for one of the
    positioning values, the value is unchanged.  The positioning values have
    the following meanings:
        *_RATIO : Keep the ration of the value relative to the extent of the
                  form/display (i.e., for objects other than the form,
extent
                  of the form, and for the form, extent of the display)
                  constant.  Thus, if the object was originally 37% of the
                  height of the form down in the form, then DIA_Y_RATIO will
                  try to keep the object at 37% of the height of the resized
                  form down in the form.  If the object took up half of the
                  width of the form, it will still do so if you set
                  DIA_W_RATIO.
        X_RIGHT : This ensures that the distance from the right edge of the
                  screen to the right edge of the object does not change
with
                  resizing.  If the form is widened, the object moves right.
        Y_BOTTOM : This ensures that the distance from the bottom edge of
the
                  screen to the bottom edge of the object does not change
with
                  resizing.  If the form is lengthened, the object moves
                  down.
        *_PLUS_D[WH] : This says that the value should have added to it the
                  amount of the change in the width (DW) or height (DH) that
                  the form/display had.
        *_PLUS_*_D[WH] : This is the same as *_PLUS_D[WH] except only the
                  specified fraction of the change in the width or height is
                  added.  The fraction is one of 1_2 (1/2), 1_3 (1/3),
                  2_3 (2/3), 1_4 (1/4) or 3_4 (1/4).  Use this when you have
                  two to four objects horizontally or vertically arranged
                  which you would like to resize equally.  Make sure that
                  objects to the right or below them get the right
                  *_PLUS_*_D[WH] or X_RIGHT or Y_BOTTOM attributes.  For
                  instance, if you have two side-by-side list boxes, you
might
                  do:
                    listbox1 DIA_W_PLUS_1_2_DW+DIA_H_PLUS_DH 0
                    listbox2
DIA_X_PLUS_1_2_DW+DIA_W_PLUS_1_2_DW+DIA_H_PLUS_DH 0
                  This way, listbox1 and listbox2 each get the full benefit
of
                  any form lengthening (DIA_H_PLUS_DH), and each get half of
the
                  benefit of the form widening (DIA_W_PLUS_1_2_DW).
Moreover,
                  we made sure that listbox2 would be placed further to the
right
                  to compensate for listbox1 widening, as needed.

7. Unfortunately, currently (as of pilrc 3.2 beta 1), pilrc does not support
   arithmetic in WORDLIST resources.  This is a serious problem for adding
up
   flags.  The recommended solution is the following.  Run the .rcp file
   through cpp, after first changing final \ to @backslash@ with sed
(otherwise
   multiline strings are mangled).  Then run the resulting file through the
   doaddition.pl perl script which (a) does the arithmetic inside WORDLIST
   resources and changes each final @backslash@ back to \.  doaddition.pl is
   not very smart.  Make sure that WORDLIST is all caps and that WORDLIST,
   BEGIN and END are all flush on the left margin in the .rcp file.

_______________________________________________
plucker-dev mailing list
[EMAIL PROTECTED]
http://lists.rubberchicken.org/mailman/listinfo/plucker-dev

Reply via email to