accessing resource components from c++ code

Login to reply to this topic.
Mon, 2004-12-13 19:09
Joined: 2004-09-06
Forum posts: 349
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);      
  }
}
  • Login to reply to this topic.