00001 /* 00002 * Copyright © 2008 Nokia Corporation. 00003 */ 00004 00005 00006 // INCLUDE FILES 00007 #include "ImageConverterApp.h" 00008 #include "ImageConverterAppUi.h" 00009 #include "ImageConverterContainer.h" 00010 #include "ImageConverterEngine.h" 00011 #include "imageconverter.hrh" 00012 #include "encoderselectiondialog.h" 00013 #include "showinfodialog.h" 00014 #include <ImageConverter.rsg> 00015 00016 00017 #include <aknmessagequerydialog.h> 00018 #include <hlplch.h> 00019 #include <avkon.hrh> 00020 #include <avkon.rsg> 00021 #include <caknfileselectiondialog.h> 00022 #include <akncommondialogs.h> 00023 #include <imageconversion.h> 00024 #include <eikmenup.h> 00025 #include <aknglobalnote.h> 00026 #include <pathinfo.h> 00027 #include <aknquerydialog.h> 00028 00029 const TInt KScaleUpFactor = 150; // Scale up by 50% 00030 const TInt KScaleDownFactor = 50; // Scale down by 50% 00031 const TInt KMaxInfoMsgLength = 50; 00032 00033 const TInt KMaxInfoDescriptorLength = 80; 00034 00035 00036 // We specify a custom cleanup method for the RImageTypeDescriptionArray used 00037 // in CImageConverterAppUi::HandleSaveAsL(). This way we can, in that method, 00038 // simply call CleanupStack::PopAndDestroy() on the array and do whatever 00039 // additional cleanup we need here. In this case ResetAndDestroy() is called 00040 // on the array to release resources consumed by it. 00041 // In general, creating a custom cleanup method allows cleanup to be more 00042 // sophisticated than simply deleting objects, for example, releasing access to 00043 // some shared resource. 00044 void CleanupRArray( TAny* object ) 00045 { 00046 ((RImageTypeDescriptionArray*)object)->ResetAndDestroy(); 00047 } 00048 00049 // ================= MEMBER FUNCTIONS ======================= 00050 // 00051 // ---------------------------------------------------------- 00052 // CImageConverterAppUi::ConstructL() 00053 // 00054 // ---------------------------------------------------------- 00055 // 00056 void CImageConverterAppUi::ConstructL() 00057 { 00058 #ifdef __TUI_SUPPORTED__ 00059 BaseConstructL(EAknEnableSkin | EAknTouchCompatible); 00060 #else 00061 BaseConstructL(EAknEnableSkin); 00062 #endif 00063 00064 00065 SearchOptionsButtonPosition(); 00066 00067 iImageLoaded = EFalse; 00068 iConverter = CImageConverterEngine::NewL( this ); 00069 00070 iAppContainer = new (ELeave) CImageConverterContainer; 00071 iAppContainer->SetMopParent( this ); 00072 iAppContainer->ConstructL( ClientRect() ); 00073 AddToStackL( iAppContainer ); 00074 00075 00076 ReadImageDirectoryL(); 00077 ReadImage(0); 00078 } 00079 00080 // ---------------------------------------------------- 00081 // CImageConverterAppUi::~CImageConverterAppUi() 00082 // Destructor 00083 // Frees reserved resources 00084 // ---------------------------------------------------- 00085 // 00086 CImageConverterAppUi::~CImageConverterAppUi() 00087 { 00088 if (iAppContainer) 00089 { 00090 RemoveFromStack( iAppContainer ); 00091 delete iAppContainer; 00092 } 00093 00094 if (iConverter) 00095 { 00096 iConverter->Cancel(); 00097 delete iConverter; 00098 } 00099 00100 delete iSaveAs; 00101 delete iInfoDialog; 00102 delete iInfoStrings; 00103 00104 iFiles.Close(); 00105 } 00106 00107 // ---------------------------------------------------- 00108 // CImageConverterAppUi::DynInitMenuPaneL( 00109 // TInt aResourceId,CEikMenuPane* aMenuPane) 00110 // Handle dynamic menu initialization 00111 // ---------------------------------------------------- 00112 // 00113 void CImageConverterAppUi::DynInitMenuPaneL( 00114 TInt aResourceId,CEikMenuPane* aMenuPane) 00115 { 00116 if( aResourceId == R_IMAGECONVERTER_MENU ) 00117 { 00118 if( !iImageLoaded ) 00119 { 00120 // if there is no image loaded do not show these menu items 00121 aMenuPane->SetItemDimmed( EImageConverterCmdSaveAs, true ); 00122 aMenuPane->SetItemDimmed( EImageConverterCmdInfo, true ); 00123 aMenuPane->SetItemDimmed( EImageConverterCmdRotate, true ); 00124 aMenuPane->SetItemDimmed( EImageConverterCmdZoomOut, true ); 00125 aMenuPane->SetItemDimmed( EImageConverterCmdZoomIn, true ); 00126 } 00127 else 00128 { 00129 aMenuPane->SetItemDimmed( EImageConverterCmdSaveAs, false ); 00130 aMenuPane->SetItemDimmed( EImageConverterCmdInfo, false ); 00131 aMenuPane->SetItemDimmed( EImageConverterCmdRotate, false ); 00132 aMenuPane->SetItemDimmed( EImageConverterCmdZoomOut, false ); 00133 if (iConverter && iConverter->CanDownScaleMore()) 00134 { 00135 aMenuPane->SetItemDimmed( EImageConverterCmdZoomIn, false ); 00136 } 00137 else 00138 { 00139 aMenuPane->SetItemDimmed( EImageConverterCmdZoomIn, true ); 00140 } 00141 } 00142 } 00143 } 00144 00145 void CImageConverterAppUi::DoEvent(EPointerEvents aEvent) 00146 { 00147 switch (aEvent) 00148 { 00149 case EZoomIn: 00150 { 00151 iAppContainer->SetTitleText(ETitleZoomIn,EFalse); 00152 if (iConverter->Scale( KScaleUpFactor )==KErrNone) 00153 { 00154 iImageLoaded = false; 00155 } 00156 break; 00157 } 00158 case EZoomOut: 00159 { 00160 iAppContainer->ResetTitleText(EFalse); 00161 if (iConverter->Scale( KScaleDownFactor )==KErrNone) 00162 { 00163 iImageLoaded = false; 00164 } 00165 break; 00166 } 00167 case ENextImage: 00168 { 00169 ReadImage(1); 00170 break; 00171 } 00172 case EPrevImage: 00173 { 00174 ReadImage(-1); 00175 break; 00176 } 00177 case ERotateRight: 00178 { 00179 iImageLoaded = false; 00180 iAppContainer->SetTitleText(ETitleRotateRight,EFalse); 00181 iConverter->Rotate( CImageConverterEngine::EClockwise90 ); 00182 break; 00183 } 00184 case ERotateLeft: 00185 { 00186 iImageLoaded = false; 00187 iAppContainer->SetTitleText(ETitleRotateLeft,EFalse); 00188 iConverter->Rotate( CImageConverterEngine::EAntiClockwise90 ); 00189 break; 00190 } 00191 default: 00192 { 00193 break; 00194 } 00195 }; 00196 } 00197 00198 TState CImageConverterAppUi::EngineState() 00199 { 00200 return iConverter->EngineState(); 00201 } 00202 00203 // ---------------------------------------------------- 00204 // CImageConverterAppUi::HandleKeyEventL( 00205 // const TKeyEvent& aKeyEvent,TEventCode /*aType*/) 00206 // takes care of key event handling 00207 // ---------------------------------------------------- 00208 // 00209 TKeyResponse CImageConverterAppUi::HandleKeyEventL( 00210 const TKeyEvent& aKeyEvent,TEventCode aType) 00211 { 00212 // if there is an image loaded, pressing arrow keys causes 00213 // scale and rotate 00214 if( iImageLoaded && (aType == EEventKey) ) 00215 { 00216 if( aKeyEvent.iCode == EKeyLeftArrow ) 00217 { 00218 iAppContainer->ChangePrevPictureL(); 00219 return EKeyWasConsumed; 00220 } 00221 else if( aKeyEvent.iCode == EKeyRightArrow ) 00222 { 00223 iAppContainer->ChangeNextPictureL(); 00224 return EKeyWasConsumed; 00225 } 00226 else if( aKeyEvent.iCode == EKeyUpArrow ) 00227 { 00228 iAppContainer->SetTitleText(ETitleZoomIn,ETrue); 00229 if (iConverter->Scale( KScaleUpFactor )==KErrNone) // scale up 00230 { 00231 iImageLoaded = false; 00232 } 00233 return EKeyWasConsumed; 00234 } 00235 else if( aKeyEvent.iCode == EKeyDownArrow ) 00236 { 00237 iAppContainer->ResetTitleText(ETrue); 00238 if (iConverter->Scale( KScaleDownFactor )==KErrNone) // scale up 00239 { 00240 iImageLoaded = false; 00241 } 00242 return EKeyWasConsumed; 00243 } 00244 } 00245 else if ( iImageLoaded && aType == EEventKeyDown) 00246 { 00247 if (aKeyEvent.iScanCode == '1' || aKeyEvent.iScanCode == '*') 00248 { 00249 iAppContainer->SetTitleText(ETitleRotateLeft,ETrue); 00250 iImageLoaded = false; 00251 iConverter->Rotate( CImageConverterEngine::EAntiClockwise90 ); 00252 return EKeyWasConsumed; 00253 } 00254 else if (aKeyEvent.iScanCode == '3' || aKeyEvent.iScanCode == EStdKeyHash) 00255 { 00256 iAppContainer->SetTitleText(ETitleRotateRight,ETrue); 00257 iImageLoaded = false; 00258 iConverter->Rotate( CImageConverterEngine::EClockwise90 ); 00259 return EKeyWasConsumed; 00260 } 00261 } 00262 return EKeyWasNotConsumed; 00263 } 00264 00265 // ---------------------------------------------------- 00266 // CImageConverterAppUi::HandleCommandL(TInt aCommand) 00267 // takes care of command handling 00268 // ---------------------------------------------------- 00269 // 00270 void CImageConverterAppUi::HandleCommandL(TInt aCommand) 00271 { 00272 switch ( aCommand ) 00273 { 00274 case EAknSoftkeyExit: 00275 case EEikCmdExit: 00276 { 00277 Exit(); 00278 break; 00279 } 00280 case EImageConverterCmdOpen: 00281 { 00282 HandleOpenL(); 00283 break; 00284 } 00285 case EImageConverterCmdSaveAs: 00286 { 00287 HandleSaveAsL(); 00288 break; 00289 } 00290 case EImageConverterCmdInfo: 00291 { 00292 HandleInfoL(); 00293 break; 00294 } 00295 case EImageConverterCmdOrientation: 00296 { 00297 if(Orientation() == CAknAppUiBase::EAppUiOrientationLandscape) 00298 { 00299 SetOrientationL(CAknAppUiBase::EAppUiOrientationPortrait); 00300 iAppContainer->SetPictureScreenCenter(ETrue); 00301 } 00302 else 00303 { 00304 SetOrientationL(CAknAppUiBase::EAppUiOrientationLandscape); 00305 iAppContainer->SetPictureScreenCenter(ETrue); 00306 } 00307 break; 00308 } 00309 case EImageConverterCmdRotateLeft: 00310 { 00311 iAppContainer->SetTitleText(ETitleRotateLeft,ETrue); 00312 iImageLoaded = false; 00313 iConverter->Rotate( CImageConverterEngine::EAntiClockwise90 ); 00314 break; 00315 } 00316 case EImageConverterCmdRotateRight: 00317 { 00318 iAppContainer->SetTitleText(ETitleRotateRight,ETrue); 00319 iImageLoaded = false; 00320 iConverter->Rotate( CImageConverterEngine::EClockwise90 ); 00321 break; 00322 } 00323 case EImageConverterCmdZoomIn: 00324 { 00325 iAppContainer->SetTitleText(ETitleZoomIn,ETrue); 00326 if (iConverter->Scale( KScaleUpFactor )==KErrNone) // scale down 00327 { 00328 iImageLoaded = false; 00329 } 00330 break; 00331 } 00332 case EImageConverterCmdZoomOut: 00333 { 00334 iAppContainer->ResetTitleText(ETrue); 00335 if (iConverter->Scale( KScaleDownFactor )==KErrNone) // scale down 00336 { 00337 iImageLoaded = false; 00338 } 00339 break; 00340 } 00341 case EImageConverterCmdNext: 00342 { 00343 iAppContainer->ChangeNextPictureL(); 00344 break; 00345 } 00346 case EImageConverterCmdPrev: 00347 { 00348 iAppContainer->ChangePrevPictureL(); 00349 break; 00350 } 00351 case EImageConverterCmdHelp: 00352 { 00353 CArrayFix<TCoeHelpContext>* buf = CCoeAppUi::AppHelpContextL ( ); 00354 HlpLauncher::LaunchHelpApplicationL (iEikonEnv->WsSession ( ), buf ); 00355 break; 00356 } 00357 case EImageConverterCmdAbout: 00358 { 00359 CAknMessageQueryDialog* dlg = new (ELeave)CAknMessageQueryDialog(); 00360 dlg->PrepareLC (R_ABOUT_QUERY_DIALOG ); 00361 HBufC* title = iEikonEnv->AllocReadResourceLC (R_ABOUT_DIALOG_TITLE ); 00362 dlg->QueryHeading()->SetTextL (*title ); 00363 CleanupStack::PopAndDestroy ( ); //title 00364 HBufC* msg = iEikonEnv->AllocReadResourceLC (R_ABOUT_DIALOG_TEXT ); 00365 dlg->SetMessageTextL (*msg ); 00366 CleanupStack::PopAndDestroy ( ); //msg 00367 dlg->RunLD ( ); 00368 break; 00369 } 00370 default: 00371 break; 00372 } 00373 } 00374 00375 00376 CArrayFix<TCoeHelpContext>* CImageConverterAppUi::HelpContextL ( ) const 00377 { 00378 CArrayFixFlat<TCoeHelpContext>* array = new(ELeave)CArrayFixFlat<TCoeHelpContext>(1); 00379 CleanupStack::PushL (array ); 00380 _LIT(KGeneral_Information, "General Information about the application"); 00381 array->AppendL (TCoeHelpContext (KUidHelpFile, KGeneral_Information ) ); 00382 CleanupStack::Pop (array ); 00383 return array; 00384 } 00385 00386 00387 void CImageConverterAppUi::ReadImageDirectoryL() 00388 { 00389 RFs& rfs = iEikonEnv->FsSession(); 00390 CDir* fileList = NULL; 00391 00392 iFiles.Reset(); 00393 00394 TFileName path = PathInfo::PhoneMemoryRootPath(); 00395 path.Append(PathInfo::ImagesPath()); 00396 00397 User::LeaveIfError(rfs.GetDir(path,KEntryAttNormal,ESortByName,fileList)); 00398 00399 for( TInt i = 0; i < fileList->Count(); i++ ) 00400 { 00401 // Read only files to array 00402 if (!fileList->operator[](i).IsDir()) 00403 { 00404 TFileName filename; 00405 filename.Append(path); 00406 filename.Append(fileList->operator[](i).iName); 00407 filename.LowerCase(); 00408 // We support only JPG, BMP, GIF 00409 if ( filename.Find(_L(".jpg"))!=KErrNotFound || 00410 filename.Find(_L(".jpeg"))!=KErrNotFound || 00411 filename.Find(_L(".bmp"))!=KErrNotFound || 00412 filename.Find(_L(".gif"))!=KErrNotFound ) 00413 { 00414 iFiles.Append(filename); 00415 } 00416 } 00417 } 00418 00419 delete fileList; 00420 } 00421 00422 00423 00424 TInt CImageConverterAppUi::ImageIndex() 00425 { 00426 return iOpenFileIndex; 00427 } 00428 00429 TInt CImageConverterAppUi::ImageCount() 00430 { 00431 return iFiles.Count(); 00432 } 00433 00434 void CImageConverterAppUi::ImageName(TFileName& aFilename) 00435 { 00436 aFilename.Copy(iFiles[iOpenFileIndex]); 00437 if (aFilename.Find(_L("\\")) > -1) 00438 { 00439 aFilename.Delete(0,aFilename.LocateReverse('\\')+1); 00440 } 00441 } 00442 00443 void CImageConverterAppUi::PlainImageName(TFileName& aFilename) 00444 { 00445 aFilename.Copy(iFiles[iOpenFileIndex]); 00446 if (aFilename.Find(_L("\\")) > -1) 00447 { 00448 aFilename.Delete(0,aFilename.LocateReverse('\\')+1); 00449 } 00450 if (aFilename.Find(_L(".")) > -1) 00451 { 00452 aFilename.SetLength(aFilename.Find(_L("."))); 00453 } 00454 } 00455 00456 void CImageConverterAppUi::ReadImage(TInt aDirection) 00457 { 00458 TFileName fileToOpen; 00459 00460 if (iFiles.Count()==0) 00461 { 00462 return; // No images found 00463 } 00464 00465 iOpenFileIndex = iOpenFileIndex + aDirection; 00466 if (iOpenFileIndex < 0) 00467 { 00468 iOpenFileIndex = iFiles.Count()-1; 00469 } 00470 else if(iOpenFileIndex > iFiles.Count()-1) 00471 { 00472 iOpenFileIndex = 0; 00473 } 00474 00475 fileToOpen.Append(iFiles[iOpenFileIndex]); 00476 00477 iImageLoaded = false; 00478 iAppContainer->SetBitmap(NULL); 00479 00480 // request the actuall open/decode 00481 // asynchronous, the result is reported via callback 00482 // NotifyCompletion 00483 TRAPD( err, iConverter->StartToDecodeL(fileToOpen) ); 00484 00485 // report errors in issuing the asynchronous call 00486 if( err != KErrNone ) 00487 { 00488 _LIT( KMsg, "Error when starting to decode:%d" ); 00489 TBuf<KMaxInfoMsgLength> buf; 00490 buf.Format( KMsg, err ); 00491 ShowMessage(buf); 00492 } 00493 } 00494 00495 00496 00497 // ---------------------------------------------------- 00498 // CImageConverterAppUi::HandleOpenL( ) 00499 // Handle open command 00500 // ---------------------------------------------------- 00501 // 00502 void CImageConverterAppUi::HandleOpenL( ) 00503 { 00504 TFileName fileToOpen; 00505 00506 _LIT( KFileSelectionTitle, "Select image to open" ); 00507 00508 // show fileopen dialog from akncommondialogs 00509 if( !AknCommonDialogs::RunSelectDlgLD(fileToOpen, 00510 R_MEMORY_SELECTION_DIALOG, KFileSelectionTitle) ) 00511 { 00512 return; 00513 } 00514 00515 iImageLoaded = false; 00516 iAppContainer->SetBitmap(NULL); 00517 00518 // request the actuall open/decode 00519 // asynchronous, the result is reported via callback 00520 // NotifyCompletion 00521 TRAPD( err, iConverter->StartToDecodeL(fileToOpen) ); 00522 00523 // report errors in issuing the asynchronous call 00524 if( err != KErrNone ) 00525 { 00526 _LIT( KMsg, "Error when starting to decode:%d" ); 00527 TBuf<KMaxInfoMsgLength> buf; 00528 buf.Format( KMsg, err ); 00529 ShowMessage(buf); 00530 } 00531 else 00532 { 00533 iFiles.Append(fileToOpen); 00534 iOpenFileIndex = iFiles.Count()-1; 00535 } 00536 } 00537 00538 // ---------------------------------------------------- 00539 // CImageConverterAppUi::HandleSaveAsL() 00540 // Handle save command 00541 // ---------------------------------------------------- 00542 // 00543 void CImageConverterAppUi::HandleSaveAsL() 00544 { 00545 TInt selectedIdx = 0; 00546 00547 // get encoder types from engine 00548 RImageTypeDescriptionArray imageTypes; 00549 iConverter->GetEncoderImageTypesL( imageTypes); 00550 00551 // Create a custom cleanup item and specify CleanupRArray to be the 00552 // method that is called once we call CleanupStack::PopAndDestroy() at the 00553 // end of this method. 00554 CleanupStack::PushL( TCleanupItem(CleanupRArray, &imageTypes) ); 00555 00556 // Create path for filename 00557 TFileName path = PathInfo::PhoneMemoryRootPath(); 00558 path.Append(PathInfo::ImagesPath()); 00559 // Get filename of current image for save image dialog 00560 TFileName fileToSave; 00561 PlainImageName(fileToSave); 00562 00563 // Create image format array for the dialog 00564 CDesCArrayFlat* array = new (ELeave) CDesCArrayFlat(imageTypes.Count()); 00565 CleanupStack::PushL(array); 00566 for( TInt i=0; i<imageTypes.Count(); i++ ) 00567 { 00568 TBuf<KMaxInfoDescriptorLength> desc; 00569 desc.Append( imageTypes[i]->Description() ); 00570 array->AppendL( desc ); 00571 } 00572 00573 // Show dialog 00574 TRAPD(err, 00575 iSaveAs = new(ELeave)CAknListQueryDialog(&selectedIdx); 00576 iSaveAs->PrepareLC(R_SELECTION_QUERY); 00577 iSaveAs->SetItemTextArray(array); 00578 iSaveAs->SetOwnershipType(ELbmDoesNotOwnItemArray); 00579 if(iSaveAs->RunLD()) 00580 { 00581 // Ask filename 00582 CAknTextQueryDialog* dlg = CAknTextQueryDialog::NewL(fileToSave,CAknQueryDialog::ENoTone); 00583 dlg->PrepareLC(R_QUERY_DIALOG); 00584 dlg->SetPromptL(_L("Save As")); 00585 if(dlg->RunLD()) 00586 { 00587 fileToSave.Append(_L(".")); 00588 fileToSave.Append(imageTypes[selectedIdx]->Description()); 00589 00590 path.Append(fileToSave); 00591 iConverter->StartToEncodeL(path, 00592 imageTypes[selectedIdx]->ImageType(), 00593 imageTypes[selectedIdx]->SubType()); 00594 } 00595 } 00596 ); 00597 iSaveAs = NULL; 00598 CleanupStack::PopAndDestroy(); // array 00599 00600 if (err) 00601 { 00602 User::Leave(err); 00603 } 00604 00605 // This will lead to a call to CleanupRArray, our custom cleanup method. 00606 CleanupStack::PopAndDestroy(&imageTypes); 00607 } 00608 00609 // ---------------------------------------------------- 00610 // CImageConverterAppUi::HandleInfoL() 00611 // Handle info command 00612 // ---------------------------------------------------- 00613 // 00614 void CImageConverterAppUi::HandleInfoL() 00615 { 00616 // Get the info strings 00617 delete iInfoStrings; 00618 iInfoStrings = NULL; 00619 iInfoStrings = iConverter->GetImageInfoL(); 00620 00621 if (iInfoStrings) 00622 { 00623 // Show the info strings in a separate dialog 00624 iInfoDialog = new(ELeave) CShowInfoDialog( iInfoStrings ); 00625 iInfoDialog->ExecuteLD( R_IMAGECONVERTER_SHOWINFO_DIALOG ); 00626 iInfoDialog = NULL; 00627 } 00628 } 00629 00630 TBool CImageConverterAppUi::IsAnimating() 00631 { 00632 return iAppContainer->IsAnimating(); 00633 } 00634 00635 TBool CImageConverterAppUi::IsEngineBusy() 00636 { 00637 return iConverter->IsActive(); 00638 } 00639 00640 // ---------------------------------------------------- 00641 // CImageConverterAppUi::NotifyCompletion( TInt aErr, 00642 // const TDesC& aMsg ) 00643 // Handle completion notifications 00644 // ---------------------------------------------------- 00645 // 00646 void CImageConverterAppUi::NotifyCompletion( TInt aErr, const TDesC& aMsg ) 00647 { 00648 if( aErr == KErrNone ) 00649 { 00650 // we have succesfully decoded an image, now make the view 00651 // to display it 00652 iAppContainer->SetBitmap(iConverter->GetBitmap()); 00653 iImageLoaded = true; 00654 } 00655 else 00656 { 00657 iAppContainer->SetBitmap(NULL); 00658 iImageLoaded = false; 00659 } 00660 00661 iAppContainer->DrawToBackBuffer(); 00662 iAppContainer->DrawNow(); 00663 00664 if (aErr && aErr != KErrNotReady) 00665 { 00666 ShowMessage(aMsg); 00667 } 00668 } 00669 00670 // ---------------------------------------------------- 00671 // CImageConverterAppUi::ShowMessage(const TDesC& aMsg) const 00672 // Show a message to the user 00673 // ---------------------------------------------------- 00674 // 00675 void CImageConverterAppUi::ShowMessage(const TDesC& aMsg) const 00676 { 00677 if (aMsg.Length()) // If there's something to show, otherwise do nothing 00678 { 00679 // No need to react if this leaves, just trap 00680 TRAPD(err, ShowMessageL(aMsg)); 00681 } 00682 } 00683 // ---------------------------------------------------- 00684 // CImageConverterAppUi::ShowMessageL(const TDesC& aMsg) const 00685 // Show a message to the user 00686 // ---------------------------------------------------- 00687 // 00688 void CImageConverterAppUi::ShowMessageL(const TDesC& aMsg) const 00689 { 00690 CAknGlobalNote* note = CAknGlobalNote::NewLC(); 00691 note->ShowNoteL(EAknGlobalConfirmationNote, aMsg); 00692 CleanupStack::PopAndDestroy(note); 00693 } 00694 00695 TBool CImageConverterAppUi::IsOptionsButtonOnTop() 00696 { 00697 return iOptionButtonOnTop; 00698 } 00699 00700 void CImageConverterAppUi::SearchOptionsButtonPosition() 00701 { 00702 iOptionButtonOnTop = EFalse; 00703 CEikButtonGroupContainer* cba = Cba(); 00704 if(!cba) 00705 { 00706 return; 00707 } 00708 CCoeControl* options = cba->ControlOrNull(EAknSoftkeyOptions); 00709 CCoeControl* exit = cba->ControlOrNull(EAknSoftkeyExit); 00710 if( options && exit ) 00711 { 00712 if( options->Position().iY < exit->Position().iY ) 00713 { 00714 iOptionButtonOnTop = ETrue; 00715 } 00716 } 00717 } 00718 00719 void CImageConverterAppUi::HandleResourceChangeL( TInt aType ) 00720 { 00721 CAknAppUi::HandleResourceChangeL( aType ); 00722 00723 if ( aType==KEikDynamicLayoutVariantSwitch ) 00724 { 00725 SearchOptionsButtonPosition(); 00726 00727 TRect rect; 00728 AknLayoutUtils::LayoutMetricsRect( 00729 AknLayoutUtils::EMainPane,rect); 00730 if (iSaveAs) 00731 { 00732 iSaveAs->SetRect(rect); 00733 } 00734 if (iInfoDialog) 00735 { 00736 iInfoDialog->SetRect(rect); 00737 } 00738 } 00739 } 00740 00741 00742 // End of File 00743
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.