00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "EmbeddingGraphicsControl.h"
00017 #include <coemain.h>
00018
00019
00020 #include <s32std.h>
00021
00022 static const TUid KUidExampleSmileyPicture = { 0x100000E6 } ;
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 class TExamplePictureFactory : public MPictureFactory
00034 {
00035 public:
00036 void NewPictureL(TPictureHeader& aHeader,const CStreamStore& aDeferredPictureStore) const;
00037 };
00038
00039 void TExamplePictureFactory::NewPictureL(TPictureHeader& aHeader,const CStreamStore& aDeferredPictureStore) const
00040 {
00041 if (aHeader.iPictureType == KUidExampleSmileyPicture)
00042 {
00043
00044
00045
00046 if (aHeader.iPicture.IsId())
00047 aHeader.iPicture = CSmileyPicture::NewL(aDeferredPictureStore,aHeader.iPicture.AsId());
00048
00049 }
00050 else
00051 {
00052
00053 User::Leave(KErrNoMemory);
00054 }
00055 }
00056
00057
00058
00059 CSmileyPicture::CSmileyPicture()
00060 {
00061
00062 }
00063
00064 CSmileyPicture* CSmileyPicture::NewL(TMood aMood, TSizeSpec aSizeSpec)
00065 {
00066 CSmileyPicture* self = new (ELeave) CSmileyPicture();
00067 self->iMood = aMood;
00068 self->iSizeSpec = aSizeSpec;
00069 return self;
00070 }
00071
00072 CSmileyPicture* CSmileyPicture::NewL(const CStreamStore& aStore, TStreamId aStreamId)
00073
00074 {
00075 RStoreReadStream inStream;
00076 inStream.OpenLC(aStore,aStreamId);
00077 CSmileyPicture* self = new (ELeave) CSmileyPicture();
00078 self->InternalizeL(inStream);
00079 CleanupStack::PopAndDestroy();
00080 return self;
00081 }
00082
00083 TStreamId CSmileyPicture::StoreL(CStreamStore& aStore) const
00084
00085 {
00086 RStoreWriteStream stream;
00087 TStreamId id=stream.CreateLC(aStore);
00088 ExternalizeL(stream);
00089 stream.CommitL();
00090 CleanupStack::PopAndDestroy();
00091 return id;
00092 }
00093
00094 void CSmileyPicture::ExternalizeL(RWriteStream& aStream) const
00095 {
00096 aStream.WriteInt8L(iMood);
00097 aStream.WriteInt8L(iSizeSpec);
00098 }
00099
00100 void CSmileyPicture::InternalizeL(RReadStream& aStream)
00101 {
00102 iMood = TMood(aStream.ReadInt8L());
00103 iSizeSpec = TSizeSpec(aStream.ReadInt8L());
00104 }
00105
00106 TInt CSmileyPicture::SpecToFactor() const
00107 {
00108 switch (iSizeSpec)
00109 {
00110 case ESmall:
00111 return 1;
00112 case EMedium:
00113 return 2;
00114 case ELarge:
00115 return 3;
00116 default:
00117 return 0;
00118 }
00119 }
00120
00121 void CSmileyPicture::Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,
00122 MGraphicsDeviceMap* ) const
00123 {
00124 aGc.SetClippingRect(aClipRect);
00125
00126 TInt scaleFactor = SpecToFactor();
00127
00128 TSize penSizeBold(3*scaleFactor,3*scaleFactor);
00129 TSize penSizeFat(5*scaleFactor,5*scaleFactor);
00130 aGc.SetPenSize(penSizeFat);
00131
00132 TInt leftOffset = 13*scaleFactor;
00133 TInt rightOffset = 27*scaleFactor;
00134 TInt circleSize = 40*scaleFactor;
00135 TInt shrinkSize = 10*scaleFactor;
00136 TInt halfCircle = 20*scaleFactor;
00137 TInt neutralSize = 13*scaleFactor;
00138
00139 TPoint leftEye(aTopLeft.iX+leftOffset,aTopLeft.iY+leftOffset);
00140 TPoint rightEye(aTopLeft.iX+rightOffset,aTopLeft.iY+leftOffset);
00141 aGc.Plot(leftEye);
00142 aGc.Plot(rightEye);
00143 aGc.SetPenSize(penSizeBold);
00144 TRect circle(aTopLeft,TPoint(aTopLeft.iX+circleSize,aTopLeft.iY+circleSize));
00145 aGc.DrawEllipse(circle);
00146
00147
00148 TRect smile = circle;
00149 switch (iMood)
00150 {
00151 case EHappy:
00152 {
00153 smile.Shrink(shrinkSize,shrinkSize);
00154 aGc.DrawArc(smile,TPoint(aTopLeft.iX,aTopLeft.iY+circleSize-shrinkSize),TPoint(aTopLeft.iX+circleSize,aTopLeft.iY+circleSize-shrinkSize));
00155 }
00156 break;
00157 case ENeutral:
00158 {
00159 aGc.DrawLine(TPoint(leftEye.iX,leftEye.iY+neutralSize),TPoint(rightEye.iX,rightEye.iY+neutralSize));
00160 }
00161 break;
00162 case ESad:
00163 {
00164 smile.Shrink(shrinkSize,shrinkSize);
00165 smile.Move(0,15*scaleFactor);
00166 aGc.DrawArc(smile,TPoint(aTopLeft.iX+circleSize,aTopLeft.iY+halfCircle),TPoint(aTopLeft.iX,aTopLeft.iY+halfCircle));
00167 }
00168 break;
00169 }
00170 }
00171
00172 void CSmileyPicture::SetMood(TMood aMood)
00173 {
00174 iMood = aMood;
00175 }
00176
00177 CSmileyPicture::TMood CSmileyPicture::Mood()
00178 {
00179 return iMood;
00180 }
00181
00182 void CSmileyPicture::SetSize(TSizeSpec aSizeSpec)
00183 {
00184 iSizeSpec = aSizeSpec;
00185 }
00186
00187 CSmileyPicture::TSizeSpec CSmileyPicture::Size()
00188 {
00189 return iSizeSpec;
00190 }
00191
00192 void CSmileyPicture::GetOriginalSizeInTwips(TSize& ) const
00193 {
00194
00195 }
00196
00197
00198 void CSmileyPicture::SetScaleFactor(TInt ,TInt )
00199 {
00200
00201 }
00202
00203
00204 TInt CSmileyPicture::ScaleFactorWidth()const
00205 {
00206 return 1;
00207 }
00208
00209
00210 TInt CSmileyPicture::ScaleFactorHeight()const
00211 {
00212 return 1;
00213 }
00214
00215
00216 void CSmileyPicture::SetCropInTwips(const TMargins& )
00217 {
00218
00219 }
00220
00221
00222 void CSmileyPicture::GetCropInTwips(TMargins& aMargins)const
00223 {
00224 CPicture::GetCropInTwips(aMargins);
00225 }
00226
00227 TPictureCapability CSmileyPicture::Capability()const
00228 {
00229 return CPicture::Capability();
00230 }
00231
00232
00233 CPictureControl::CPictureControl()
00234 {
00235 SetMaxPhases(7);
00236 iValidDocument = CPictureControl::EPicture;
00237 iOffset = TPoint(50,50);
00238 }
00239
00240
00241 _LIT(KFileName,"\\grpict.dat");
00242
00243
00244 _LIT(KTxtUpdateModelCase0,"draw happy face at (50,50)");
00245 _LIT(KTxtUpdateModelCase1,"draw sad face at (50,50)");
00246 _LIT(KTxtUpdateModelCase2,"draw neutral face at (50,50)");
00247 _LIT(KTxtUpdateModelCase3,"store picture in file");
00248 _LIT(KTxtUpdateModelCase4,"delete picture from memory");
00249 _LIT(KTxtUpdateModelCase5,"restore picture header from file");
00250 _LIT(KTxtUpdateModelCase6,"restore picture from file");
00251
00252 void CPictureControl::UpdateModelL()
00253 {
00254
00255 testZf.SetGraphicsDeviceMap(iCoeEnv->ScreenDevice());
00256
00257 testZf.SetZoomFactor(TZoomFactor::EZoomOneToOne);
00258
00259 testMap=&testZf;
00260
00261
00262 RFs fsSession;
00263 TParse filestorename;
00264
00265 switch (Phase())
00266 {
00267 case 0:
00268 iGraphObserver->NotifyStatus(KTxtUpdateModelCase0);
00269 iPicture = CSmileyPicture::NewL(CSmileyPicture::EHappy,CSmileyPicture::ESmall);
00270 break;
00271 case 1:
00272 iGraphObserver->NotifyStatus(KTxtUpdateModelCase1);
00273 iPicture->SetMood(CSmileyPicture::ESad);
00274 iPicture->SetSize(CSmileyPicture::EMedium);
00275 break;
00276 case 2:
00277 iGraphObserver->NotifyStatus(KTxtUpdateModelCase2);
00278 iPicture->SetMood(CSmileyPicture::ENeutral);
00279 iPicture->SetSize(CSmileyPicture::ELarge);
00280 break;
00281 case 3:
00282 iGraphObserver->NotifyStatus(KTxtUpdateModelCase3);
00283
00284 fsSession.Connect();
00285
00286
00287 fsSession.Parse(KFileName,filestorename);
00288 iStore = CDirectFileStore::ReplaceLC(fsSession,filestorename.FullName(),EFileWrite);
00289
00290 iStore->SetTypeL(KDirectFileStoreLayoutUid);
00291
00292
00293 iHeader.iPicture = iPicture;
00294 iHeader.iSize = TSize(iPicture->SpecToFactor()*40,iPicture->SpecToFactor()*40);
00295 iHeader.iPictureType = KUidExampleSmileyPicture;
00296
00297
00298 iHeaderId = StoreHeaderL(*iStore);
00299
00300 iStore->SetRootL(iHeaderId);
00301
00302
00303 CleanupStack::PopAndDestroy();
00304 fsSession.Close();
00305 break;
00306 case 4:
00307 iGraphObserver->NotifyStatus(KTxtUpdateModelCase4);
00308 delete iPicture;
00309 iPicture = NULL;
00310 iValidDocument = CPictureControl::EFalse;
00311 break;
00312 case 5:
00313 iGraphObserver->NotifyStatus(KTxtUpdateModelCase5);
00314
00315 fsSession.Connect();
00316
00317
00318 fsSession.Parse(KFileName,filestorename);
00319 iStore = CDirectFileStore::OpenLC(fsSession,filestorename.FullName(),EFileRead);
00320
00321 RestoreHeaderL(*iStore,iStore->Root());
00322
00323 CleanupStack::PopAndDestroy();
00324 fsSession.Close();
00325 iValidDocument = CPictureControl::EHeader;
00326 break;
00327 case 6:
00328 iGraphObserver->NotifyStatus(KTxtUpdateModelCase6);
00329
00330 fsSession.Connect();
00331
00332
00333 fsSession.Parse(KFileName,filestorename);
00334 iStore = CDirectFileStore::OpenLC(fsSession,filestorename.FullName(),EFileRead);
00335
00336 TExamplePictureFactory factory;
00337 factory.NewPictureL(iHeader,*iStore);
00338
00339 iPicture = (CSmileyPicture *) iHeader.iPicture.AsPtr();
00340
00341
00342 CleanupStack::PopAndDestroy();
00343 fsSession.Close();
00344 iValidDocument = CPictureControl::EPicture;
00345 break;
00346 }
00347 }
00348
00349 void CPictureControl::RestoreHeaderL(CStreamStore& aStore, TStreamId aId)
00350 {
00351 RStoreReadStream stream;
00352 stream.OpenLC(aStore,aId);
00353 iHeader.InternalizeL(stream);
00354 CleanupStack::PopAndDestroy();
00355 }
00356
00357 TStreamId CPictureControl::StoreHeaderL(CStreamStore& aStore) const
00358 {
00359 CStoreMap* map=CStoreMap::NewLC(aStore);
00360 StoreHeaderComponentsL(*map,aStore);
00361
00362 RStoreWriteStream stream(*map);
00363 TStreamId id = stream.CreateLC(aStore);
00364 iHeader.ExternalizeL(stream);
00365 stream.CommitL();
00366 map->Reset();
00367 CleanupStack::PopAndDestroy(2);
00368 return id;
00369 }
00370
00371 void CPictureControl::StoreHeaderComponentsL(CStoreMap& aMap,CStreamStore& aStore) const
00372 {
00373 TStreamId id;
00374
00375 id = iPicture->StoreL(aStore);
00376 aMap.BindL(iPicture,id);
00377 }
00378
00379 void CPictureControl::Draw(const TRect& ) const
00380 {
00381
00382 CWindowGc& gc=SystemGc();
00383 gc.UseFont(iMessageFont);
00384 gc.Clear();
00385 SystemGc().DrawRect(Rect());
00386 TRect rect=Rect();
00387 TRgb darkGray(85,85,85);
00388
00389
00390 switch (iValidDocument)
00391 {
00392 case CPictureControl::EFalse:
00393
00394 gc.SetBrushColor(darkGray);
00395 gc.Clear(rect);
00396 break;
00397 case CPictureControl::EPicture:
00398
00399 iPicture->Draw(gc,iOffset,rect,testMap);
00400 break;
00401 case CPictureControl::EHeader:
00402
00403 TInt bottomRightX = iOffset.iX + iHeader.iSize.iWidth;
00404 TInt bottomRightY = iOffset.iY + iHeader.iSize.iHeight;
00405 TRect outlineBox(iOffset,TPoint(bottomRightX,bottomRightY));
00406
00407 gc.SetPenStyle(CGraphicsContext::EDottedPen);
00408 gc.DrawRect(outlineBox);
00409 break;
00410 }
00411
00412
00413
00414
00415 }