diff -r 57d4cdd99204 -r edfc90759b9f imageeditor/ImageEditorUI/src/ColorSelectionPopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imageeditor/ImageEditorUI/src/ColorSelectionPopup.cpp Fri Jan 29 13:53:17 2010 +0200 @@ -0,0 +1,966 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - Initial contribution +* +* Contributors: +* Ixonos Plc +* +* Description: +* Color selection popup dialog that shows a color grid. +* +*/ + + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef RD_TACTILE_FEEDBACK +#include +#endif /* RD_TACTILE_FEEDBACK */ + +#include +#include + +#include "ResolutionUtil.h" +#include "ColorSelectionPopup.h" +#include "ImageEditorUiDefs.h" + +// CONSTANTS +const TInt KGridColumnCount = 7; +const TInt KGridRowCount = 5; +const TInt KInitialItemIndex = 0; + +//============================================================================= +CColorSelectionPopup::CColorSelectionPopup() + { + + } + +//============================================================================= +CColorSelectionPopup::~CColorSelectionPopup() + { + + delete iPopupCenter; + delete iPopupCenterMask; + delete iPopupCornerTL; + delete iPopupCornerTLMask; + delete iPopupCornerTR; + delete iPopupCornerTRMask; + delete iPopupCornerBL; + delete iPopupCornerBLMask; + delete iPopupCornerBR; + delete iPopupCornerBRMask; + delete iPopupSideL; + delete iPopupSideLMask; + delete iPopupSideR; + delete iPopupSideRMask; + delete iPopupSideT; + delete iPopupSideTMask; + delete iPopupSideB; + delete iPopupSideBMask; + + iHighlightRectsArray.Close(); + iGridRectsArray.Close(); + iColorBitmapsArray.ResetAndDestroy(); + iRGBArray.Close(); + } + +//============================================================================= +void CColorSelectionPopup::ConstructL ( CCoeControl* aParent ) + { + // Set parent + SetContainerWindowL( *aParent ); + TFileName iconFile( KImageEditorUiMifFile ); + + // Create trans popup window graphics + // Center + AknIconUtils::CreateIconL( iPopupCenter, iPopupCenterMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_center, + EMbmImageeditoruiQgn_graf_popup_trans_center_mask ); + + // Top-left corner + AknIconUtils::CreateIconL( iPopupCornerTL, iPopupCornerTLMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_corner_tl, + EMbmImageeditoruiQgn_graf_popup_trans_corner_tl_mask ); + + // Top-right corner + AknIconUtils::CreateIconL( iPopupCornerTR, iPopupCornerTRMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_corner_tr, + EMbmImageeditoruiQgn_graf_popup_trans_corner_tr_mask ); + + // Bottom-left corner + AknIconUtils::CreateIconL( iPopupCornerBL, iPopupCornerBLMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_corner_bl, + EMbmImageeditoruiQgn_graf_popup_trans_corner_bl_mask ); + + // Bottom-right corner + AknIconUtils::CreateIconL( iPopupCornerBR, iPopupCornerBRMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_corner_br, + EMbmImageeditoruiQgn_graf_popup_trans_corner_br_mask ); + + // left side + AknIconUtils::CreateIconL( iPopupSideL, iPopupSideLMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_side_l, + EMbmImageeditoruiQgn_graf_popup_trans_side_l_mask ); + + // left side + AknIconUtils::CreateIconL( iPopupSideR, iPopupSideRMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_side_r, + EMbmImageeditoruiQgn_graf_popup_trans_side_r_mask ); + + // top side + AknIconUtils::CreateIconL( iPopupSideT, iPopupSideTMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_side_t, + EMbmImageeditoruiQgn_graf_popup_trans_side_t_mask ); + + // bottom side + AknIconUtils::CreateIconL( iPopupSideB, iPopupSideBMask, iconFile, + EMbmImageeditoruiQgn_graf_popup_trans_side_b, + EMbmImageeditoruiQgn_graf_popup_trans_side_b_mask ); + + iCurrentItem = KInitialItemIndex; + + // Activate control + ActivateL(); + + } + +//============================================================================= +void CColorSelectionPopup::CreateColorBitmapsL( TSize aSize ) + { + // Color constants shown on the grid + // R indicates the row index and C the column index + const TRgb KColor_R1C1 (0, 0, 0); + const TRgb KColor_R1C2 (65, 0, 175); + const TRgb KColor_R1C3 (0, 30, 128); + const TRgb KColor_R1C4 (0, 80, 100); + const TRgb KColor_R1C5 (0, 65, 0); + const TRgb KColor_R1C6 (85, 55, 0); + const TRgb KColor_R1C7 (120, 0, 0); + const TRgb KColor_R2C1 (75, 75, 75); + const TRgb KColor_R2C2 (128, 0, 255); + const TRgb KColor_R2C3 (0, 65, 175); + const TRgb KColor_R2C4 (0, 145, 165); + const TRgb KColor_R2C5 (0, 128, 0); + const TRgb KColor_R2C6 (128, 65, 0); + const TRgb KColor_R2C7 (128, 0, 65); + const TRgb KColor_R3C1 (150, 150, 150); + const TRgb KColor_R3C2 (255, 0, 128); + const TRgb KColor_R3C3 (0, 50, 255); + const TRgb KColor_R3C4 (0, 165, 255); + const TRgb KColor_R3C5 (0, 255, 0); + const TRgb KColor_R3C6 (255, 128, 0); + const TRgb KColor_R3C7 (255, 0, 0); + const TRgb KColor_R4C1 (225, 225, 225); + const TRgb KColor_R4C2 (255, 0, 255); + const TRgb KColor_R4C3 (50, 145, 255); + const TRgb KColor_R4C4 (0, 255, 255); + const TRgb KColor_R4C5 (128, 255, 0); + const TRgb KColor_R4C6 (255, 255, 0); + const TRgb KColor_R4C7 (255, 115, 115); + const TRgb KColor_R5C1 (255, 255, 255); + const TRgb KColor_R5C2 (255, 128, 255); + const TRgb KColor_R5C3 (180, 210, 255); + const TRgb KColor_R5C4 (128, 255, 255); + const TRgb KColor_R5C5 (180, 255, 180); + const TRgb KColor_R5C6 (255, 255, 128); + const TRgb KColor_R5C7 (255, 128, 180); + + // Read rgb values into an array + iRGBArray.Reset(); + iRGBArray.Append( KColor_R1C1 ); + iRGBArray.Append( KColor_R1C2 ); + iRGBArray.Append( KColor_R1C3 ); + iRGBArray.Append( KColor_R1C4 ); + iRGBArray.Append( KColor_R1C5 ); + iRGBArray.Append( KColor_R1C6 ); + iRGBArray.Append( KColor_R1C7 ); + iRGBArray.Append( KColor_R2C1 ); + iRGBArray.Append( KColor_R2C2 ); + iRGBArray.Append( KColor_R2C3 ); + iRGBArray.Append( KColor_R2C4 ); + iRGBArray.Append( KColor_R2C5 ); + iRGBArray.Append( KColor_R2C6 ); + iRGBArray.Append( KColor_R2C7 ); + iRGBArray.Append( KColor_R3C1 ); + iRGBArray.Append( KColor_R3C2 ); + iRGBArray.Append( KColor_R3C3 ); + iRGBArray.Append( KColor_R3C4 ); + iRGBArray.Append( KColor_R3C5 ); + iRGBArray.Append( KColor_R3C6 ); + iRGBArray.Append( KColor_R3C7 ); + iRGBArray.Append( KColor_R4C1 ); + iRGBArray.Append( KColor_R4C2 ); + iRGBArray.Append( KColor_R4C3 ); + iRGBArray.Append( KColor_R4C4 ); + iRGBArray.Append( KColor_R4C5 ); + iRGBArray.Append( KColor_R4C6 ); + iRGBArray.Append( KColor_R4C7 ); + iRGBArray.Append( KColor_R5C1 ); + iRGBArray.Append( KColor_R5C2 ); + iRGBArray.Append( KColor_R5C3 ); + iRGBArray.Append( KColor_R5C4 ); + iRGBArray.Append( KColor_R5C5 ); + iRGBArray.Append( KColor_R5C6 ); + iRGBArray.Append( KColor_R5C7 ); + + // Generate color bitmaps + iColorBitmapsArray.ResetAndDestroy(); + for( TInt i = 0; i < iRGBArray.Count(); i++ ) + { + CFbsBitmap* bitmap = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( bitmap ); + User::LeaveIfError ( bitmap->Create ( aSize, EColor64K ) ); + + // Compute color for bitmap + TRgb color( iRGBArray[i] ); + + // Fill the bitmap with the correct color + TUint16 color_64k = ( TUint16 ) + (0 | + ((( TUint8 )color.Red() >> 3) << 11) | + ((( TUint8 )color.Green() >> 2) << 5) | + (( TUint8 )color.Blue() >> 3)); + + bitmap->LockHeapLC(); + TUint16 * pd = (TUint16 *)bitmap->DataAddress(); + TSize size = bitmap->SizeInPixels(); + TInt w = (bitmap->ScanLineLength(size.iWidth, EColor64K) >> 1) + * size.iHeight; + for( TInt k = w; k != 0; --k) + { + *pd++ = color_64k; + } + + iColorBitmapsArray.Append( bitmap ); + + CleanupStack::PopAndDestroy(); // LockHeapLC() + CleanupStack::Pop(); // bitmap + + } + + } + +//============================================================================= +void CColorSelectionPopup::Draw( const TRect& /*aRect*/ ) const + { + const TRgb KHighlightCenterColor (229, 229, 229); + + CWindowGc& gc = SystemGc(); + + CPreviewControlBase::DrawPreviewImage (Rect()); + + // Change brush to null to enable transparent drawing + gc.SetBrushStyle (CGraphicsContext::ENullBrush); + + // draw center of the borders + gc.BitBltMasked( iPopupCenterRect.iTl, iPopupCenter, + iPopupCenterRect.Size(), iPopupCenterMask, EFalse ); + // draw Top left corner + gc.BitBltMasked( iPopupCornerTLRect.iTl, iPopupCornerTL, + iPopupCornerTLRect.Size(), iPopupCornerTLMask, EFalse ); + // draw Top right corner + gc.BitBltMasked( iPopupCornerTRRect.iTl, iPopupCornerTR, + iPopupCornerTRRect.Size(), iPopupCornerTRMask, EFalse ); + // draw Bottom left corner + gc.BitBltMasked( iPopupCornerBLRect.iTl, iPopupCornerBL, + iPopupCornerBLRect.Size(), iPopupCornerBLMask, EFalse ); + // draw Bottom right corner + gc.BitBltMasked( iPopupCornerBRRect.iTl, iPopupCornerBR, + iPopupCornerBRRect.Size(), iPopupCornerBRMask, EFalse ); + // draw Left side + gc.BitBltMasked( iPopupSideLRect.iTl, iPopupSideL, + iPopupSideLRect.Size(), iPopupSideLMask, EFalse ); + // draw Right side + gc.BitBltMasked( iPopupSideRRect.iTl, iPopupSideR, + iPopupSideRRect.Size(), iPopupSideRMask, EFalse ); + // draw Top side + gc.BitBltMasked( iPopupSideTRect.iTl, iPopupSideT, + iPopupSideTRect.Size(), iPopupSideTMask, EFalse ); + // draw Bottom side + gc.BitBltMasked( iPopupSideBRect.iTl, iPopupSideB, + iPopupSideBRect.Size(), iPopupSideBMask, EFalse ); + + // Draw color items and selection indicator + for( TInt index = 0; index < iGridRectsArray.Count(); index++ ) + { + // Draw selection indicator for current item + if( index == iCurrentItem ) + { + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetBrushColor( KHighlightCenterColor ); + gc.SetPenColor( KRgbBlack ); + + // a trick that sets the highligh more or less to correct position in + // right-to-left languages. + if ( !AknLayoutUtils::LayoutMirrored() ) + { + gc.SetPenSize( TSize(2,2) ); + } + else + { + gc.SetPenSize( TSize(1,1) ); + } + + gc.DrawRect( iHighlightRectsArray[ iCurrentItem ] ); + + gc.SetBrushStyle (CGraphicsContext::ENullBrush); + } + + // draw color bitmap + TRect currentRect = iGridRectsArray[index]; + gc.BitBlt(currentRect.iTl, iColorBitmapsArray[index]); + } + + // Draw heading + // Convert the plug-in name to visual representation + // (in case would be right-to-left) + const CFont* font = NULL; + font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimaryFont ); + TBuf<256> visual; + // Text to be converted + HBufC * heading = CEikonEnv::Static()->AllocReadResourceLC ( R_SELECT_COLOUR ); + + AknBidiTextUtils::ConvertToVisualAndClip( + heading->Des(), + visual, + *font, + iHeadingRect.Width(), + iHeadingRect.Width() + ); + + CleanupStack::PopAndDestroy( heading ); + + gc.UseFont( font ); + gc.SetBrushStyle ( CGraphicsContext::ENullBrush ); + + TInt baseline = iHeadingRect.Height() / 2 + font->AscentInPixels() / 2; + + // Check the directionality of the current language and set the alignment + // according the directionality + TBidiText::TDirectionality dir = TBidiText::ScriptDirectionality(User::Language()); + CGraphicsContext::TTextAlign align = CGraphicsContext::ELeft; + + if( dir == TBidiText::ERightToLeft ) + { + align = CGraphicsContext::ERight; + } + gc.SetPenColor(KRgbWhite); + gc.DrawText( + visual, + iHeadingRect, + baseline, + align, + 0); + } + +//============================================================================= +void CColorSelectionPopup::SizeChanged() + { + + TAknLayoutRect layoutRect; + layoutRect.LayoutRect( Rect(), AknLayoutScalable_Apps::popup_imed_trans_window(0) ); + TRect parentRect = layoutRect.Rect(); + + TAknLayoutRect iconLayout; + if ( !AknLayoutUtils::LayoutMirrored() ) + { + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g1()); + iPopupCenterRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2()); + iPopupCornerTLRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3()); + iPopupCornerTRRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4()); + iPopupCornerBLRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5()); + iPopupCornerBRRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6()); + iPopupSideLRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7()); + iPopupSideRRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g8()); + iPopupSideTRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g9()); + iPopupSideBRect = iconLayout.Rect(); + } + else + { + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g1()); + iPopupCenterRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g3()); + iPopupCornerTLRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g2()); + iPopupCornerTRRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g5()); + iPopupCornerBLRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g4()); + iPopupCornerBRRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g7()); + iPopupSideLRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g6()); + iPopupSideRRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g8()); + iPopupSideTRect = iconLayout.Rect(); + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Avkon::bg_tb_trans_pane_g9()); + iPopupSideBRect = iconLayout.Rect(); + } + + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Apps::listscroll_imed_pane()); + TRect listscrollPaneRect = iconLayout.Rect(); + + iconLayout.LayoutRect( listscrollPaneRect, AknLayoutScalable_Apps::grid_imed_colour_35_pane( 1 )); + TRect gridPaneRect = iconLayout.Rect(); + + // Calculate grid's cell rects + iHighlightRectsArray.Reset(); + iGridRectsArray.Reset(); + for( TInt row = 0; row < KGridRowCount; row++ ) + { + for( TInt column = 0; column < KGridColumnCount; column++ ) + { + iconLayout.LayoutRect( gridPaneRect, + AknLayoutScalable_Apps::cell_imed_colour_pane(0 , column, row )); + TRect cellRect = iconLayout.Rect(); + + iconLayout.LayoutRect( cellRect, + AknLayoutScalable_Apps::hgihlgiht_grid_pane_cp016(0)); + + TRect highlightRect = iconLayout.Rect(); + iHighlightRectsArray.Append( highlightRect ); + + iconLayout.LayoutRect( cellRect, + AknLayoutScalable_Apps::cell_imed_colour_pane_g1(0) ); + + iGridRectsArray.Append( iconLayout.Rect() ); + + } + } + + CreateColorBitmapsL( iconLayout.Rect().Size() ); + + //Heading rect + iconLayout.LayoutRect( parentRect, AknLayoutScalable_Apps::heading_imed_pane()); + TRect heading = iconLayout.Rect(); + + TAknLayoutText layoutText; + layoutText.LayoutText( heading, AknLayoutScalable_Apps::heading_imed_pane_t1() ); + iHeadingRect = layoutText.TextRect(); + iLayoutTextHeading = layoutText; + + // Resize graphics to correct size + AknIconUtils::SetSize( iPopupCenter, iPopupCenterRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupCornerTL, iPopupCornerTLRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupCornerTR, iPopupCornerTRRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupCornerBL, iPopupCornerBLRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupCornerBR, iPopupCornerBRRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupSideL, iPopupSideLRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupSideR, iPopupSideRRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupSideT, iPopupSideTRect.Size(), EAspectRatioNotPreserved); + AknIconUtils::SetSize( iPopupSideB, iPopupSideBRect.Size(), EAspectRatioNotPreserved); + + } + +//============================================================================= +TKeyResponse CColorSelectionPopup::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + TKeyResponse res = EKeyWasNotConsumed; + + if (aType == EEventKey) + { + // If in landscape mode, do different mapping for the number keys. + TUint keyCode = aKeyEvent.iCode; + TBool landscape = CResolutionUtil::Self()->GetLandscape(); + if (landscape) + { + switch (keyCode) + { + case 49: // numeric keypad '1' + keyCode = 55; + break; + case 50: // numeric keypad '2' + keyCode = 52; + break; + case 51: // numeric keypad '3' + keyCode = 49; + break; + case 52: // numeric keypad '4' + keyCode = 56; + break; + case 54: // numeric keypad '6' + keyCode = 50; + break; + case 55: // numeric keypad '7' + keyCode = 57; + break; + case 56: // numeric keypad '8' + keyCode = 54; + break; + case 57: // numeric keypad '9' + keyCode = 51; + break; + default: + break; + } + } + + switch (keyCode) + { + case EKeyLeftArrow: + case 52: // numeric keypad '4' + { + if ( !AknLayoutUtils::LayoutMirrored() ) + { + if (iCurrentItem == 0) + { + iCurrentItem = iGridRectsArray.Count() - 1; + } + else + { + iCurrentItem--; + } + } + else + { + iCurrentItem++; + if (iCurrentItem >= iGridRectsArray.Count()) + { + iCurrentItem = 0; + } + } + + res = EKeyWasConsumed; + break; + } + + case EKeyRightArrow: + case 54: // numeric keypad '6' + { + if ( !AknLayoutUtils::LayoutMirrored() ) + { + iCurrentItem++; + if (iCurrentItem >= iGridRectsArray.Count()) + { + iCurrentItem = 0; + } + } + else + { + if (iCurrentItem == 0) + { + iCurrentItem = iGridRectsArray.Count() - 1; + } + else + { + iCurrentItem--; + } + } + + res = EKeyWasConsumed; + break; + } + + case EKeyDownArrow: + case 56: // numeric keypad '8' + { + iCurrentItem += KGridColumnCount; + if (iCurrentItem >= iGridRectsArray.Count()) + { + iCurrentItem = iCurrentItem - iGridRectsArray.Count(); + } + + res = EKeyWasConsumed; + break; + } + + case EKeyUpArrow: + case 50: // numeric keypad '2' + { + iCurrentItem -= KGridColumnCount; + if (iCurrentItem < 0) + { + iCurrentItem = iGridRectsArray.Count() + iCurrentItem; + } + + res = EKeyWasConsumed; + break; + } + + case 49: // numeric keypad '1' + { + // Move up and left + iCurrentItem -= KGridColumnCount; + iCurrentItem --; + if (iCurrentItem < 0) + { + iCurrentItem = iGridRectsArray.Count() + iCurrentItem; + } + res = EKeyWasConsumed; + break; + } + + case 51: // numeric keypad '3' + { + // Move up and right + iCurrentItem -= KGridColumnCount; + iCurrentItem ++; + if (iCurrentItem < 0) + { + iCurrentItem = iGridRectsArray.Count() + iCurrentItem; + } + res = EKeyWasConsumed; + break; + } + + case 55: // numeric keypad '7' + { + // Move down and left + iCurrentItem += KGridColumnCount; + iCurrentItem--; + if (iCurrentItem >= iGridRectsArray.Count()) + { + iCurrentItem = iCurrentItem - iGridRectsArray.Count(); + } + res = EKeyWasConsumed; + break; + } + + case 57: // numeric keypad '9' + { + // Move down and left + iCurrentItem += KGridColumnCount; + iCurrentItem++; + if (iCurrentItem >= iGridRectsArray.Count()) + { + iCurrentItem = iCurrentItem - iGridRectsArray.Count(); + } + res = EKeyWasConsumed; + break; + } + + default: + { + break; + } + } + } + + return res; + + } + +//============================================================================= +void CColorSelectionPopup::HandlePointerEventL( const TPointerEvent &aPointerEvent ) + { + if( AknLayoutUtils::PenEnabled() ) + { + switch( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + case TPointerEvent::EDrag: + { + // calculate which one of the grid items was pressed by + // by comparing item rects and pressed position + for (TInt i = 0; i < iHighlightRectsArray.Count(); ++i) + { + TRect iconRect( iHighlightRectsArray[i] ); + + if( iconRect.Contains( aPointerEvent.iPosition ) ) + { + // set new highlighted item + iCurrentItem = i; + break; + } + } + break; + } + case TPointerEvent::EButton1Up: + { + break; + } + default: + { + break; + } + } + } + } + +//============================================================================= +TRect CColorSelectionPopup::GridRect() const + { + return iPopupCenterRect; + } + +//============================================================================= +TBool CColorSelectionPopup::HighlightedItemPressed( TPoint aPosition ) const + { + TRect iconRect = iHighlightRectsArray[ iCurrentItem ]; + + if (iconRect.Contains( aPosition )) + { + return ETrue; + } + else + { + return EFalse; + } + } + +//============================================================================= +TRgb CColorSelectionPopup::GetSelectedColor() const + { + return iRGBArray[iCurrentItem]; + } + +//============================================================================= +void CColorSelectionPopup::SetSelectedColor(TRgb aRgb) + { + for( TInt i = 0; i < iRGBArray.Count(); i++ ) + { + if (iRGBArray[i] == aRgb) + { + iCurrentItem = i; + break; + } + } + } + + +//============================================================================= +// DIALOG +//============================================================================= +TInt CColorSelectionDialog::RunDlgLD( const CFbsBitmap* aBitmap, + const TRect& aRect, + TRgb& aRgb ) + { + CColorSelectionDialog* dialog = + new (ELeave) CColorSelectionDialog ( aRgb ); + dialog->ConstructL( aBitmap, aRect); + return dialog->ExecuteLD( R_IMAGE_EDITOR_COLOR_DIALOG ); + } + +//============================================================================= +CColorSelectionDialog::CColorSelectionDialog( TRgb& aRgb ) +: iCurrentRgb( aRgb ) + { + } + +//============================================================================= +CColorSelectionDialog::~CColorSelectionDialog() + { + delete iPopup; + } + +//============================================================================= + +void CColorSelectionDialog::ConstructL( const CFbsBitmap* aBitmap, + const TRect& aRect ) + { + iPopup = new ( ELeave ) CColorSelectionPopup(); + iPopup->ConstructL( this ); + + SetRect(aRect); + + // Not drawn correctly if calling SetRect() + iPopup->SetSize(aRect.Size()); + iPopup->SetPosition(TPoint(0,0)); + iPopup->SetImageL( aBitmap ); + iPopup->SetSelectedColor( iCurrentRgb ); + +#ifdef RD_TACTILE_FEEDBACK + iTouchFeedBack = MTouchFeedback::Instance(); +#endif /* RD_TACTILE_FEEDBACK */ + } + +//============================================================================= +TBool CColorSelectionDialog::OkToExitL( TInt aButtonId ) + { + if ( aButtonId == EAknSoftkeyOk || aButtonId == EAknSoftkeySelect) + { + iCurrentRgb = iPopup->GetSelectedColor(); + return ETrue; + } + else + { + return EFalse; + } + } + +//============================================================================= +void CColorSelectionDialog::Draw(const TRect& /*aRect*/) const + { + } + +//============================================================================= +void CColorSelectionDialog::SizeChanged() + { + iPopup->SetSize( Rect().Size() ); + } + +//============================================================================= +void CColorSelectionDialog::PreLayoutDynInitL() + { + } + + +//============================================================================= +TInt CColorSelectionDialog::CountComponentControls() const + { + return 1; + } + +//============================================================================= +CCoeControl* CColorSelectionDialog::ComponentControl(TInt /*aIndex*/) const + { + return iPopup; + } + +//============================================================================= +TKeyResponse CColorSelectionDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType) + { + // Selection key or numeric keypad '5' close the dialog + TKeyResponse res = EKeyWasNotConsumed; + if (aType == EEventKey && + (aKeyEvent.iCode == EKeyOK || aKeyEvent.iCode == 53 || aKeyEvent.iScanCode == EStdKeyEnter) ) + { + TryExitL (EAknSoftkeyOk); + res = EKeyWasConsumed; + } + else if (aType == EEventKey && aKeyEvent.iCode == EKeyNo || aKeyEvent.iCode == EKeyEscape) // Do not exit if dialog active + { + TryExitL (EAknSoftkeyCancel); + res = EKeyWasNotConsumed; + } +#ifdef FULLSCREEN_AVAILABLE + else if (aType == EEventKey && aKeyEvent.iCode == 48 ) // 0 + { + // Switch normal screen / full screen + if (CResolutionUtil::Self()->GetFullScreen()) + { + iEikonEnv->EikAppUi()->HandleCommandL(EImageEditorMenuCmdNormalScreen); + SetRect(iEikonEnv->EikAppUi()->ClientRect()); + SizeChanged(); + DrawNow(); + } + else + { + iEikonEnv->EikAppUi()->HandleCommandL(EImageEditorMenuCmdFullScreen); + SetExtentToWholeScreen(); + SizeChanged(); + DrawNow(); + } + res = EKeyWasConsumed; + } +#endif // FULLSCREEN_AVAILABLE + else + { + res = iPopup->OfferKeyEventL(aKeyEvent, aType); + if (res == EKeyWasConsumed) + { + DrawDeferred(); + } + } + + return res; + } + +//============================================================================= +void CColorSelectionDialog::HandlePointerEventL( + const TPointerEvent &aPointerEvent ) + { + if( AknLayoutUtils::PenEnabled() ) + { + TBool draw( EFalse ); + switch( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + // forward event only if grid area was pressed + if ( iPopup->GridRect().Contains( aPointerEvent.iPosition ) ) + { +#ifdef RD_TACTILE_FEEDBACK + if ( iTouchFeedBack ) + { + iTouchFeedBack->InstantFeedback( ETouchFeedbackBasic ); + RDebug::Printf( "ImageEditor::CColorSelectionDialog: ETouchFeedback" ); + } +#endif /* RD_TACTILE_FEEDBACK */ + iPopup->HandlePointerEventL( aPointerEvent ); + draw = ETrue; + } + break; + } + case TPointerEvent::EDrag: + { + if ( iPopup->GridRect().Contains( aPointerEvent.iPosition ) ) + { +#ifdef RD_TACTILE_FEEDBACK + if ( iTouchFeedBack ) + { + iTouchFeedBack->InstantFeedback( ETouchFeedbackSensitive ); + RDebug::Printf( "ImageEditor::CColorSelectionDialog: ETouchFeedbackSensitive" ); + } +#endif /* RD_TACTILE_FEEDBACK */ + iPopup->HandlePointerEventL( aPointerEvent ); + draw = ETrue; + } + break; + } + case TPointerEvent::EButton1Up: + { + // already highlighted item is pressed + if ( iPopup->HighlightedItemPressed( aPointerEvent.iPosition ) ) + { + TryExitL (EAknSoftkeyOk); + } + break; + } + default: + { + break; + } + } + + if ( draw ) + { + DrawDeferred(); + } + } + } + +// End of file +