Hi again all,

        Back in the middle of March people gave me some very good ideas on
how possibly to run two different forms at the same time.  As I stated back
then I would post my solution.  I believe I have a "solid" solution here.
Everything seems to work perfectly as far as I can tell.  However since I'm
a newbie (At least to Palm programming.) and haven't even completed my first
application, I could just be full of my self.  Therefore I would like to
invite people that are interested in shoot hole in my code to do so.  There
maybe things about the Palm that I'm just too naive about (Ignorance is
bliss!).  In the follow paragraphs I'll describe my goal, my methodology and
attach some source code.

Thanks,
Steve

GOAL;
        The goal is to have this second form act as a navigation bar.  The
end application (That I will not discuss here.) basically mimics a sequence
of processing steps.  Each processing step is represented by forms 1 to n.
The navigation form is the 2nd form that is always running.  The navigation
form is responsible for the sequencing of the 1 to n forms.
    --------------------
   |                    |
   |                    |
   |  Area for Forms    |
   |         1 to n     |
   |                    |
   |                    |
   |                    | 
    --------------------
   |                    |
   |  Navigation Form   |
   |                    |
    --------------------

METHODOLOGY;
        In the application event handler I check all pen down events.  If
any of the pen down events are below the 1 to n form area, I set the active
form to the navigation form and set the navigation event handler as well.
No matter if I do or don't set the navigation stuff I don't set the handled
flag, that way the event is passed on to the next event handler.

        In the navigation event handler any time I detect a new 1 to n form
is to be displayed I set the active form back to the current form that is
still showing above the navigation form.  At this point I then goto the new
form and set it's event handler.  While the navigation event handler is
active, if a pen up event occurs that ends above the navigation form or in
the title area of the navigation form, I set the active form back to the
current form that is still showing above the navigation form leave the
current 1 to n form intact.

        The other forms, that is forms 1 to n are only used here for testing
purposes.


SOURCE CODE;
-------------------- start of main.c --------------------

#include <Pilot.h>
#include "NavBar_res.h"

extern Boolean frmNav_HandleEvent(EventPtr event);
extern Boolean frm1_HandleEvent(EventPtr event);
extern Boolean frm2_HandleEvent(EventPtr event);
extern Boolean frm3_HandleEvent(EventPtr event);
extern FormPtr FormPtrs[3];
extern FormEventHandlerPtr CurrHandlerPtrs[3];

FormPtr NavFrmP;

static Int16 StartApplication(void)
{
        FrmGotoForm(frmNav);
        FrmPopupForm(frm1);
        return 0;
}

static Boolean ApplicationHandleEvent(EventPtr event)
{
        Word formID;
        FormPtr form;
        Boolean handled = false;
        SWord srtY;

        switch (event->eType)
        {
                /* If pen down event is below the normal (or 1 to n) form
area,
                   set the active form to the navigation form and
                   set the navigation event handler as well. Had to use X &
Y of display
                   instead of window.*/
                case penDownEvent: //Don't set handled flag; pass it on
                        srtY = event->screenY;
                        WinWindowToDisplayPt(&event->screenX,
&event->screenY);
                        if (event->screenY > 146)
                        {
                                event->screenY = srtY;
                                FrmSetActiveForm(NavFrmP);
                                FrmSetEventHandler(NavFrmP,
(FormEventHandlerPtr) frmNav_HandleEvent);
                        }
                        break;

                case frmLoadEvent:
                        formID = event->data.frmLoad.formID;
                        form = FrmInitForm(formID);
                        FrmSetActiveForm(form);         

                        switch (formID)
                        {
                                case frm1: // Set event handler for frm1
                                        FrmSetEventHandler(form,
(FormEventHandlerPtr) frm1_HandleEvent);
                                        FormPtrs[0] = form;
                                        CurrHandlerPtrs[0] =
&frm1_HandleEvent;
                                        break;
                                case frm2: // Set event handler for frm2
                                        FrmSetEventHandler(form,
(FormEventHandlerPtr) frm2_HandleEvent);
                                        FormPtrs[1] = form;
                                        CurrHandlerPtrs[1] =
&frm1_HandleEvent;
                                        break;
                                case frm3: // Set event handler for frm3
                                        FrmSetEventHandler(form,
(FormEventHandlerPtr) frm3_HandleEvent);
                                        FormPtrs[2] = form;
                                        CurrHandlerPtrs[2] =
&frm1_HandleEvent;
                                        break;
                                case frmNav: // Set event handler for frmNav
                                        FrmSetEventHandler(form,
(FormEventHandlerPtr) frmNav_HandleEvent);
                                        NavFrmP = form;
                                        break;
                        }
                        handled = true;
                        break;
        }
        return handled;
}

static void EventLoop(void)
{
        Int16 error;
        EventType event;

        do
        {
                EvtGetEvent(&event, evtWaitForever);
                if (!SysHandleEvent(&event))
                {
                        if (!MenuHandleEvent(0, &event, &error))
                        {
                                if (!ApplicationHandleEvent(&event))
FrmDispatchEvent(&event);
                        }
                }
        }
        while (event.eType != appStopEvent);
}

static void StopApplication(void)
{
        FrmCloseAllForms();
}

DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
{
        Int16 error;

        if (cmd == sysAppLaunchCmdNormalLaunch)
        {
                error = StartApplication();
                if (error) return error;

                EventLoop();

                StopApplication();
        }
        return 0;
}
-------------------- end of main.c --------------------

---------------- start of frmNav.c --------------------
#include <Pilot.h>
#include "NavBar_res.h"

Boolean frmNav_HandleEvent(EventPtr event);

FormPtr FormPtrs[3];
FormEventHandlerPtr CurrHandlerPtrs[3];
Word CurrFrm = 1;

Boolean frmNav_HandleEvent(EventPtr event)
{
        FormPtr form;
        Boolean handled = false;

        switch (event->eType)
        {
                case ctlSelectEvent:
                        if (event->data.ctlSelect.controlID == btnForw)
                        {
                                FrmSetActiveForm(FormPtrs[CurrFrm - 1]);
                                CurrFrm = CurrFrm + 1;
                                if (CurrFrm > 3) CurrFrm = 1;
                                FrmGotoForm(CurrFrm * 1000);
                                handled = true;
                        }
                        else if (event->data.ctlSelect.controlID == btnBack)
                        {
                                FrmSetActiveForm(FormPtrs[CurrFrm - 1]);
                                CurrFrm = CurrFrm - 1;
                                if (CurrFrm < 1) CurrFrm = 3;
                                FrmGotoForm(CurrFrm * 1000);
                                handled = true;
                        }
                break;

                case popSelectEvent: 
        
FrmSetActiveForm(FormPtrs[event->data.popSelect.priorSelection]);
                        if (event->data.popSelect.selection == (CurrFrm -
1))
                        {
                                FrmSetEventHandler(FormPtrs[CurrFrm - 1],
                                        (FormEventHandlerPtr)
CurrHandlerPtrs[CurrFrm - 1]);
                        }
                        else
                        {
                                CurrFrm = event->data.popSelect.selection +
1;
                                FrmGotoForm(CurrFrm * 1000);
                        }
                        handled = true;
                break;

                case penUpEvent:
                        if (event->data.penUp.end.y < 147 ||
FrmPointInTitle(
                                FormPtrs[CurrFrm - 1], event->screenX,
event->screenY))
                        {
                                FrmSetActiveForm(FormPtrs[CurrFrm - 1]);
                                FrmSetEventHandler(FormPtrs[CurrFrm - 1],
                                        (FormEventHandlerPtr)
CurrHandlerPtrs[CurrFrm - 1]);
                                handled = true;
                        }
                break;

                case frmOpenEvent:
                        form = FrmGetActiveForm();
                        FrmDrawForm(form);
                        handled = true;
                break;
        }
        return handled;
}
---------------- end of frmNav.c --------------------

---------------- start of OtherForms.c --------------------
#include <Pilot.h>
#include "NavBar_res.h"   

Boolean frm1_HandleEvent(EventPtr event);
Boolean frm2_HandleEvent(EventPtr event);
Boolean frm3_HandleEvent(EventPtr event);

char strX[] = "xxx";
FieldPtr fldpX;
char strY[] = "yyy";
FieldPtr fldpY;
char strAdd1[3];
FieldPtr fldpAdd1;
int intAdd1 = 0;

Boolean frm1_HandleEvent(EventPtr event)
{
        FormPtr form;
        Boolean handled = false;

        form = FrmGetActiveForm();
        switch (event->eType)
        {
                case penDownEvent: //Don't set handled flag; pass it on
                    fldpX = FrmGetObjectPtr(form, FrmGetObjectIndex(form,
fldX));
                        StrIToA(strX, event->screenX);
                    FldSetTextPtr(fldpX, strX);

                    fldpY = FrmGetObjectPtr(form, FrmGetObjectIndex(form,
fldY));
                        StrIToA(strY, event->screenY);
                    FldSetTextPtr(fldpY, strY);

                FrmDrawForm(form);
                        break;

                case ctlSelectEvent:
                        if (event->data.ctlSelect.controlID == cmdAdd1)
                        {
                                intAdd1++;
                            fldpAdd1 = FrmGetObjectPtr(form,
FrmGetObjectIndex(form, fldAdd1));
                                StrIToA(strAdd1, intAdd1);
                            FldSetTextPtr(fldpAdd1, strAdd1);

                        FrmDrawForm(form);
                                handled = true;
                                break;
                        }

                case frmOpenEvent:
                        FrmDrawForm(form);
                        handled = true;
                        break;
        }
        return handled;
}
Boolean frm2_HandleEvent(EventPtr event)
{
        FormPtr form;
        Boolean handled = false;

        form = FrmGetActiveForm();
        switch (event->eType)
        {
                case penDownEvent: //Don't set handled flag; pass it on
                    fldpX = FrmGetObjectPtr(form, FrmGetObjectIndex(form,
fldX));
                        StrIToA(strX, event->screenX);
                    FldSetTextPtr(fldpX, strX);

                    fldpY = FrmGetObjectPtr(form, FrmGetObjectIndex(form,
fldY));
                        StrIToA(strY, event->screenY);
                    FldSetTextPtr(fldpY, strY);

                FrmDrawForm(form);
                        break;

                case ctlSelectEvent:
                        if (event->data.ctlSelect.controlID == cmdAdd1)
                        {
                                intAdd1++;
                            fldpAdd1 = FrmGetObjectPtr(form,
FrmGetObjectIndex(form, fldAdd1));
                                StrIToA(strAdd1, intAdd1);
                            FldSetTextPtr(fldpAdd1, strAdd1);

                        FrmDrawForm(form);
                                handled = true;
                                break;
                        }

                case frmOpenEvent:
                        FrmDrawForm(form);
                        handled = true;
                        break;
        }
        return handled;
}

Boolean frm3_HandleEvent(EventPtr event)
{
        FormPtr form;
        Boolean handled = false;

        form = FrmGetActiveForm();
        switch (event->eType)
        {
                case penDownEvent: //Don't set handled flag; pass it on
                    fldpX = FrmGetObjectPtr(form, FrmGetObjectIndex(form,
fldX));
                        StrIToA(strX, event->screenX);
                    FldSetTextPtr(fldpX, strX);

                    fldpY = FrmGetObjectPtr(form, FrmGetObjectIndex(form,
fldY));
                        StrIToA(strY, event->screenY);
                    FldSetTextPtr(fldpY, strY);

                FrmDrawForm(form);
                        break;

                case ctlSelectEvent:
                        if (event->data.ctlSelect.controlID == cmdAdd1)
                        {
                                intAdd1++;
                            fldpAdd1 = FrmGetObjectPtr(form,
FrmGetObjectIndex(form, fldAdd1));
                                StrIToA(strAdd1, intAdd1);
                            FldSetTextPtr(fldpAdd1, strAdd1);

                        FrmDrawForm(form);
                                handled = true;
                                break;
                        }

                case frmOpenEvent:
                        FrmDrawForm(form);
                        handled = true;
                        break;
        }
        return handled;
}
---------------- end of OtherForms.c --------------------

---------------- start of NavBar_res.h --------------------
#define frm1    1000
#define frm2    2000
#define frm3    3000

#define frmNav  4000
#define btnBack 4001
#define btnForw 4002
#define lstNav 4003
#define popNav 4004

#define cmdAdd1 5001
#define fldAdd1 5002
#define fldX    5003
#define fldY    5004
---------------- end of NavBar_res.h --------------------

---------------- start of NavBar.rcp --------------------
#include "NavBar_res.h"

ICON "computer_22x22x1.bmp"
SMALLICON "computer_15x9x1.bmp"

FORM ID frmNav AT (0 147 160 13)
NOFRAME
USABLE
BEGIN
        TITLE "GoTo"
        POPUPTRIGGER "frm1" ID popNav AT (34 1 49 11) USABLE FONT 0
        LIST "frm1" "frm2" "frm3"
                ID lstNav AT (34 1 49 11) VISIBLEITEMS 2 NONUSABLE
        POPUPLIST ID popNav lstNav
        BUTTON "Back" ID btnBack AT (86 1 35 11) USABLE FONT 0
        BUTTON "Forward" ID btnForw AT (123 1 36 11) USABLE FONT 0
END

FORM ID frm1 AT (0 0 160 147)
NOFRAME
USABLE
BEGIN
        TITLE "frm1"
        BUTTON "Add 1" ID cmdAdd1 AT (15 35 AUTO AUTO)
        FIELD fldAdd1 AT (60 35 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
        LABEL "X = " AUTOID AT (10 70)
        LABEL "Y = " AUTOID AT (10 85)
        FIELD fldX AT (28 70 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
        FIELD fldY AT (28 85 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
END

FORM ID frm2 AT (0 0 160 147)
NOFRAME
USABLE
BEGIN
        TITLE "frm2"
        BUTTON "Add 1" ID cmdAdd1 AT (15 35 AUTO AUTO)
        FIELD fldAdd1 AT (60 35 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
        LABEL "X = " AUTOID AT (10 70)
        LABEL "Y = " AUTOID AT (10 85)
        FIELD fldX AT (28 70 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
        FIELD fldY AT (28 85 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
END

FORM ID frm3 AT (0 0 160 147)
NOFRAME
USABLE
BEGIN
        TITLE "frm3"
        BUTTON "Add 1" ID cmdAdd1 AT (15 35 AUTO AUTO)
        FIELD fldAdd1 AT (60 35 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
        LABEL "X = " AUTOID AT (10 70)
        LABEL "Y = " AUTOID AT (10 85)
        FIELD fldX AT (28 70 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
        FIELD fldY AT (28 85 50 15) NONEDITABLE SINGLELINE MAXCHARS 4
END
---------------- end NavBar.rcp --------------------



-- 
For information on using the Palm Developer Forums, or to unsubscribe, please see 
http://www.palmos.com/dev/tech/support/forums/

Reply via email to