|
|
User login
Feeds |
accessing resource components from c++ code
|
|||||
| Mon, 2004-12-13 19:09 | |
|
I would like to access a resource form and its lines in c++ code to enable / disable them depending on user actions. First - is this possible?
If it is / might be, I have the following resource and code to handle it to consider (maybe you only need the resource, but I put the class up too just in case): Code: RESOURCE DIALOG r_contact_dialog { flags = EEikDialogFlagNoDrag | EEikDialogFlagFillAppClientRect | EEikDialogFlagWait | EEikDialogFlagButtonsRight | EEikDialogFlagNoTitleBar | EEikDialogFlagCbaButtons /*| EEikDialogFlagModeless */; buttons = r_termapp_view2; form = r_contact_form; } RESOURCE FORM r_contact_form { flags = EAknExScrollerInt0; items = { DLG_LINE { type = EEikCtEdwin; prompt = qtn_contact_form_first_name; id = EAknExScrollerDlgLineEdwinFirstName; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; }, DLG_LINE { type = EEikCtEdwin; prompt = qtn_contact_form_last_name; id = EAknExScrollerDlgLineEdwinLastName; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; }, DLG_LINE { type = EEikCtEdwin; prompt = qtn_contact_form_address; id = EAknExScrollerDlgLineEdwinAddress; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; }, DLG_LINE { type = EEikCtNumberEditor; prompt = qtn_contact_form_postal_nr; id = EAknExScrollerDlgLineNumberPostnummer; control = NUMBER_EDITOR { min = EAknExScrollerInt0; max = EAknExScrollerInt10; }; }, DLG_LINE { type = EEikCtEdwin; prompt = qtn_contact_form_city; id = EAknExScrollerDlgLineEdwinCity; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; }, DLG_LINE { //Mobile phone type = EEikCtEdwin; prompt = qtn_contact_form_phone_mobile; id = EAknExScrollerDlgLineEdwinMobilePhone;//EGeneralQuery; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; }, DLG_LINE { //Home phone type = EEikCtEdwin; prompt = qtn_contact_form_phone_home; id = EAknExScrollerDlgLineEdwinHomePhone; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; }, DLG_LINE { //Home phone type = EEikCtEdwin; prompt = qtn_contact_form_phone_work; id = EAknExScrollerDlgLineEdwinWorkPhone; control = EDWIN { maxlength = EAknExScrollerInt256; width = EAknExScrollerInt6; lines = EAknExScrollerInt5; }; } }; } Code: /*some includes */ ... CTerminalAppContactForm* CTerminalAppContactForm:: NewL(CPbkContactItem* aContactInfo, CTermView2* aView) { CTerminalAppContactForm* self = new(ELeave) CTerminalAppContactForm(aContactInfo, aView); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(); return self; } CTerminalAppContactForm::~CTerminalAppContactForm() {} CTerminalAppContactForm::CTerminalAppContactForm(CPbkContactItem* aContactInfo, CTermView2* aView) : iContactInfo(aContactInfo), iView(aView) {} void CTerminalAppContactForm::ConstructL() { CAknForm::ConstructL(); } //Here I would like to access the different list items to set them enabled or disabled - is this possible? void CTerminalAppContactForm::SetFormStatus(TInt aStatus) { switch (aStatus) { case EFormStatusBegin: { } break; case EFormStatusSending: { } break; case EFormStatusReceived: { } break; default: break; } } void CTerminalAppContactForm::SetFormData() { if (ControlOrNull(EAknExScrollerDlgLineEdwinFirstName)) SetEdwinTextL(EAknExScrollerDlgLineEdwinFirstName, &iContactInfo->FindField(EPbkFieldIdFirstName)->Text()); if (ControlOrNull(EAknExScrollerDlgLineEdwinLastName)) SetEdwinTextL(EAknExScrollerDlgLineEdwinLastName, &iContactInfo->FindField(EPbkFieldIdLastName)->Text()); if (ControlOrNull(EAknExScrollerDlgLineEdwinAddress)) SetEdwinTextL(EAknExScrollerDlgLineEdwinAddress, &iContactInfo->FindField(EPbkFieldIdStreetAddress)->Text()); if (ControlOrNull(EAknExScrollerDlgLineEdwinCity)) SetEdwinTextL(EAknExScrollerDlgLineEdwinCity, &iContactInfo->FindField(EPbkFieldIdCity)->Text()); if (ControlOrNull(EAknExScrollerDlgLineEdwinMobilePhone)) SetEdwinTextL(EAknExScrollerDlgLineEdwinMobilePhone, &iContactInfo->FindField(EPbkFieldIdPhoneNumberMobile)->Text()); if (ControlOrNull(EAknExScrollerDlgLineEdwinHomePhone)) SetEdwinTextL(EAknExScrollerDlgLineEdwinHomePhone, &iContactInfo->FindField(EPbkFieldIdPhoneNumberHome)->Text()); if (ControlOrNull(EAknExScrollerDlgLineEdwinWorkPhone)) { TPbkContactItemField* fld = iContactInfo->FindField(EPbkFieldIdPhoneNumberWork); if (fld != NULL) SetEdwinTextL(EAknExScrollerDlgLineEdwinWorkPhone, &fld->Text()); } } void CTerminalAppContactForm::PostLayoutDynInitL() { CAknForm::PostLayoutDynInitL(); SetFormData(); } TBool CTerminalAppContactForm::QuerySaveChangesL() { TBool isAnsYes(CAknForm::QuerySaveChangesL()); return isAnsYes; } void CTerminalAppContactForm::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) { CAknForm::DynInitMenuPaneL(aResourceId, aMenuPane); if (aResourceId == R_AVKON_FORM_MENUPANE) { aMenuPane->SetItemDimmed(EAknFormCmdAdd, ETrue); aMenuPane->SetItemDimmed(EAknFormCmdLabel, ETrue); } } TBool CTerminalAppContactForm:: OkToExitL(TInt aButtonId) { switch (aButtonId) { case EAknExScrollerCBACommnadNext: { TBuf<32> saveQueryBody; TBuf<16> saveQueryTitle; CCoeEnv::Static()->ReadResource(saveQueryBody, R_BUF_SAVE_QUERY_BODY); CCoeEnv::Static()->ReadResource(saveQueryTitle, R_BUF_SAVE_QUERY_TITLE); CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL(saveQueryBody); dlg->PrepareLC(R_DIALOG_POPUP_QUERY); dlg->QueryHeading()->SetTextL(saveQueryTitle); if (dlg->RunLD()) { //Save to address book if Yes // delete dlg; //Why isn't this possible??? //But first see if the contact doesn't already exist //Go through all contacts in the address book CPbkContactEngine* pbkEngine = CPbkContactEngine::NewL(); //Create the contact engine CPbkContactIter* contactIter = CPbkContactIter::NewL(*pbkEngine); contactIter->FirstL(); CPbkContactItem* curItem = contactIter->GetCurrentL(); while (curItem != NULL) { TPbkContactItemField* existFN = curItem->FindField(EPbkFieldIdFirstName); TPbkContactItemField* existLN = curItem->FindField(EPbkFieldIdLastName); if (existFN && existLN) { TPbkContactItemField* newFN = iContactInfo->FindField(EPbkFieldIdFirstName); TPbkContactItemField* newLN = iContactInfo->FindField(EPbkFieldIdLastName); if (existFN->Text().Compare(newFN->Text()) == 0 && existLN->Text().Compare(newLN->Text()) == 0) {//Already exists //Ask if user wants to overwrite existing TBuf<64> overwriteQueryBody; TBuf<16> overwriteQueryTitle; CCoeEnv::Static()->ReadResource(overwriteQueryBody, R_BUF_OVERWRITE_QUERY_BODY); CCoeEnv::Static()->ReadResource(overwriteQueryTitle, R_BUF_OVERWRITE_QUERY_TITLE); dlg = CAknMessageQueryDialog::NewL(overwriteQueryBody); dlg->PrepareLC(R_DIALOG_POPUP_QUERY); dlg->QueryHeading()->SetTextL(overwriteQueryTitle); if (dlg->RunLD()) { //Overwrite // delete dlg; CPbkContactItem* item2Change = pbkEngine->OpenContactL(curItem->Id()); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdFirstName); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdLastName); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdStreetAddress); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdPhoneNumberGeneral); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdPhoneNumberStandard); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdPhoneNumberWork); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdPhoneNumberHome); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdPhoneNumberMobile); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdFaxNumber); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdEmailAddress); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdPostalCode); AddInformationToContactFieldIfNecessary(iContactInfo, item2Change, EPbkFieldIdCity); pbkEngine->CommitContactL(*item2Change); pbkEngine->CloseContactL(curItem->Id()); } delete curItem; delete contactIter; delete pbkEngine; return CAknForm::OkToExitL(aButtonId); } } contactIter->NextL(); curItem = contactIter->GetCurrentL(); } //If not already existent - add it ((CTerminalAppAppUi*) iView->GetAppUi())->iPbkEngine->AddNewContactL(*iContactInfo); const TUid KViewId = {1}; ((CTerminalAppAppUi*) iView->GetAppUi())->ActivateView(KViewId); } break; } default: return CAknForm::OkToExitL(aButtonId); } return ETrue; } //Modifies old field or adds a new field to the existing item if new fields exists void CTerminalAppContactForm:: AddInformationToContactFieldIfNecessary(CPbkContactItem* aNewContact, CPbkContactItem* aCurItem, TInt aFieldName) { TPbkContactItemField* newField = aNewContact->FindField(aFieldName); if (newField != NULL) { TPbkContactItemField* existingField = aCurItem->FindField(aFieldName); if (existingField == NULL /*|| strängen är tom*/) { TPbkContactItemField newFld = aCurItem->AddFieldL(newField->FieldInfo()); newFld.TextStorage()->SetTextL(newField->Text()); } else existingField->TextStorage()->SetTextL(newField->Text()); } } /*void CTerminalAppContactForm:: ProcessCommandL(TInt aCommandId) { switch (aCommandId) { default : break; } }*/ void* CTermView2::GetAppUi() { return (CTerminalAppAppUi*) AppUi(); } void CTermView2::ConstructL() { BaseConstructL(); iEditMode = EFalse; } CTermView2::~CTermView2() { if (iContainer) { AppUi()->RemoveFromViewStack(*this, iContainer); delete iContainer; iContainer = NULL; } } void CTermView2::HandleCommandL(TInt aCommand) { switch (aCommand) { default: { AppUi()->HandleCommandL(aCommand); break; } } } void CTermView2::HandleClientRectChange() { if (iContainer) iContainer->SetRect(ClientRect()); } void CTermView2::DoActivateL(const TVwsViewId& /*aPrevViewId*/,TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/) { if (!iContainer) { iContainer = new (ELeave) CTerminalAppContainer2; iContainer->ConstructL(ClientRect()); AppUi()->AddToStackL(*this, iContainer); } iContactForm = CTerminalAppContactForm::NewL(((CTerminalAppAppUi*) AppUi())->iContact, this); TInt retVal = iContactForm->ExecuteLD(R_CONTACT_DIALOG); //Send the address to the Vykort application // if (!retVal) { //} TUid idiot = {1}; ((CTerminalAppAppUi*) AppUi())->ActivateView(idiot); } void CTermView2::DoDeactivate() { if (iContainer) { AppUi()->RemoveFromViewStack(*this, iContainer); delete iContainer; iContainer = NULL; } } void CTermView2::ChangeCbaL(TBool /*state*/) { CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); cba->DrawNow(); } TBuf<10> CTermView2::GetTelNrFromView() { return ((CTerminalAppAppUi*) AppUi())->iTelNrFromView; } void CTermView2::ReloadData() {} TUid CTermView2::Id() const { return KViewId2; } //??? void CTermView2::ShowRetreivedAddressL(CPbkContactItem* aContactInfo) { if (!iContainer) { iContainer = new (ELeave) CTerminalAppContainer2; iContainer->ConstructL(ClientRect()); AppUi()->AddToStackL(*this, iContainer); } } |
|