quinta-feira, 3 de fevereiro de 2011

form manager - how to switch forms in bada apps (part 2)

As we've learned, FormMgr is another Form in the application responsible for Forms management. The FormMgr just change screens in bada. FormMgr don't present labels, images, etc...

Steps:
1. create your Forms (Forms that app needs);



In this post I will just send an information from one Form to another (easiest way).
Note that in Forms properties you must set Form name, Labels name, Editfields names, ...

2. update application class to start with FormMgr (and not with FormMain)

bool
FormManagerSample::OnAppInitializing(AppRegistry& appRegistry)
{
result r = E_SUCCESS;
FormMgr *pFormMgr = new FormMgr();
if(pFormMgr->Initialize())
{
r = Application::GetInstance()->GetAppFrame()
->GetFrame()->AddControl(*pFormMgr);
TryCatch(r == E_SUCCESS, , GetErrorMessage(r));
pFormMgr->SetStarterForm(FormMgr::REQUEST_MAINFORM,
null);
}

return true;

CATCH:
SetLastResult(r);//we'll see this soon, in next posts
return false;
}


3. create FormMgr.cpp and FormMgr.h
Now, let's see FormMgr code...
FormMgr.h>>

#ifndef _FORMMGR_H_
#define _FORMMGR_H_

#include
#include
#include
#include
#include
#include

class FormMgr :
public Osp::Ui::Controls::Form //derived from Form;
{
public:
FormMgr(void);
virtual ~FormMgr(void);

public:
bool Initialize(void);
bool SetStarterForm(RequestId requestId,
Osp::Base::Collection::IList* pArgs);
static const RequestId REQUEST_MAINFORM = 100; //Form 1
static const RequestId REQUEST_RESULTFORM = 101; //Form 2

protected:
void SwitchToForm(RequestId requestId,
Osp::Base::Collection::IList* pArgs);
Osp::Ui::Controls::Form *__pPreviousForm;
FormMain* __pMainForm; //Main Form - will send the data
FormResult* __pResultForm; //Result Form - will receive the data

public:
virtual void OnUserEventReceivedN(RequestId requestId,
Osp::Base::Collection::IList* pArgs);
};

#endif


FormMgr.cpp>>

#include "FormMgr.h"
#include "FormMain.h"
#include
#include "FormResult.h"

using namespace Osp::App;
using namespace Osp::Base;
using namespace Osp::Ui;
using namespace Osp::Ui::Controls;

FormMgr::FormMgr(void)
{
__pPreviousForm = null;
__pMainForm = null;
__pResultForm = null;
}

FormMgr::~FormMgr(void)
{
}

bool
FormMgr::Initialize(void)
{
result r = E_SUCCESS;
//FormMgr must be constructed...
r = Form::Construct(FORM_STYLE_NORMAL);
if (r != E_SUCCESS)
{
SetLastResult(r);
}else{
//and you must set a name!
SetName(L"FormMgr");
}
return r == E_SUCCESS;
}

bool FormMgr::SetStarterForm(RequestId requestId,
Osp::Base::Collection::IList* pArgs)
{
Form *pCurrentForm = Application::GetInstance()->GetAppFrame()
->GetFrame()->GetCurrentForm();

if (pCurrentForm == this)
SwitchToForm(requestId, pArgs);
else
return false;

return true;
}

void FormMgr::OnUserEventReceivedN(RequestId requestId,
Osp::Base::Collection::IList* pArgs)
{
SwitchToForm(requestId, pArgs);
}

void FormMgr::SwitchToForm(RequestId requestId,
Osp::Base::Collection::IList* pArgs)
{
result r = E_SUCCESS;
Frame *pFrame = Application::GetInstance()
->GetAppFrame()->GetFrame();
//BaseForm is adopted to facilitate a large number of Forms...
BaseForm* pBaseForm = null;

switch (requestId)
{
//MAIN FORM
case REQUEST_MAINFORM:
{
if (null == __pMainForm)
{
__pMainForm = new FormMain();
if(!__pMainForm->Initialize())
{
TryCatch(false, , GetErrorMessage(r));
}
r = pFrame->AddControl(*__pMainForm);
TryCatch(r == E_SUCCESS, , GetErrorMessage(r));
}
r = pFrame->SetCurrentForm(*__pMainForm);
TryCatch(r == E_SUCCESS, , GetErrorMessage(r));
__pMainForm->RequestRedraw(true);
if (__pPreviousForm != null) {
if (__pPreviousForm != __pMainForm)
pFrame->RemoveControl(*__pPreviousForm);
}
__pPreviousForm = __pMainForm;
break;
}
//RESULT FORM
case REQUEST_RESULTFORM:
{
FormResult* formResult = new FormResult();
if (formResult->Initialize()) {
//Passing parameters from FORMMAIN to FORMRESULT
formResult->ShowResult(pArgs);
//BaseForm is now a FormResult
pBaseForm = formResult;
}
break;
}
default:
break;
}

if (null != pBaseForm) {
//It can be used for a large number of Forms
r = pFrame->AddControl(*pBaseForm);
TryCatch(r == E_SUCCESS, , GetErrorMessage(r));
r = pFrame->SetCurrentForm(*pBaseForm);
TryCatch(r == E_SUCCESS, , GetErrorMessage(r));
pBaseForm->RequestRedraw(true);
}

if (__pPreviousForm != null) {
if (__pPreviousForm != __pMainForm)
pFrame->RemoveControl(*__pPreviousForm);
}
__pPreviousForm = pBaseForm;


if (null != pArgs) {
pArgs->RemoveAll(true);
delete pArgs;
pArgs = null;
}

return;
CATCH:
//Avoid Memory Leak
SetLastResult(r);
if(null != __pMainForm)
{
delete __pMainForm;
__pMainForm = null;
}
if(null != pBaseForm)
{
delete pBaseForm;
pBaseForm = null;
}
return;
}


4. Link FormMgr and new Forms...
Ok, we know how to update application class to call FormMgr, understood FormMgr... Now, lets see how to call FormMgr to switch the Forms and how to receive Args.

From FormMain to FormResult: sending and presenting data texts...
FormMain.cpp>>

void
FormMain::OnActionPerformed(const Osp::Ui::Control& source,
int actionId)
{
FormMgr *pFormMgr = null;
Frame *pFrame = null;

switch(actionId)
{
//If Button OK is clicked
case ID_BUTTON_OK:
{

//Get editField control
EditField * editField = static_cast(GetControl(L"IDC_EDITFIELD1"));
//Get editField content
String* strData = new String(editField->GetText());
ArrayList * list = new ArrayList;
list->Construct(1);
list->Add(*strData);
//Get Frame Instance
pFrame = Application::GetInstance()->GetAppFrame()->GetFrame();
if(null != pFrame)
{
//Get FormMgr Control
pFormMgr = static_cast (pFrame->GetControl("FormMgr"));
}
if (null != pFormMgr)
//Send an user event to FormMgr: note that
//you must say the Form to be presented and the Args.
//In this example, FormMgr will consider
//REQUEST_RESULTFORM switch case.
pFormMgr->SendUserEvent(FormMgr::REQUEST_RESULTFORM, list);
break;
}
default:
break;
}
}


After sending... this parameters will be considered in void FormMgr::SwitchToForm(RequestId requestId, Osp::Base::Collection::IList* pArgs) function.

To receive the parameters, lets see FormResult example:
FormResult>>

void
FormResult::ShowResult(Osp::Base::Collection::IList * pArgs)
{
String * strResultFromFormMain = static_cast<String*>
(pArgs->GetAt(0));
Label * lblResultado = static_cast<Label *>
(GetControl(L"IDC_LABEL1"));
lblResultado->SetText(*strResultFromFormMain);
}


This example is available HERE!

Thanks for your visit! :)

Next post: OnDraw(void);

Feel free to ask/suggest/comment.
Twitter: @oliveiraeduardo

3 comentários: