00001 #include "../../Library/SDK_Manila_Sense.h"
00002
00003
00004 DIRECTDRAW_GDI *ChildSection::backgroundLeft=NULL;
00005 DIRECTDRAW_GDI *ChildSection::backgroundRight=NULL;
00006 int ChildSection::arrowWidth=0;
00007 int ChildSection::arrowHeight=0;
00008 int ChildSection::backgroundHeight=0;
00009 int ChildSection::backgroundWidth=0;
00010
00011 void ChildSection::loadSurf(){
00012 if(backgroundLeft==NULL){
00013
00014 backgroundLeft=loadImage(gi->btn_common_listitem);
00015 backgroundRight=loadImage(gi->btn_common_listitem);
00016
00017 backgroundHeight=backgroundLeft->height;
00018 backgroundWidth=backgroundLeft->width/4;
00019
00020
00021 RECT imgSize=patchImage(backgroundLeft,gi->pivot_leftarrow,4,PADDING_ARROW,backgroundHeight/15);
00022 arrowWidth=imgSize.right;
00023 arrowHeight=imgSize.bottom;
00024
00025 patchImage(backgroundRight,gi->pivot_rightarrow,4,backgroundWidth-PADDING_ARROW-arrowWidth,backgroundHeight/15);
00026 }
00027 DWORD dwWidth = GetSystemMetrics(SM_CXSCREEN);
00028 DWORD dwHeight = GetSystemMetrics(SM_CYSCREEN);
00029
00030 if(this->getRight()==dwHeight){
00031 this->setRight(dwWidth);
00032 }
00033
00034 }
00035
00036 ChildSection::ChildSection(int idElement,int x,int y,wstring t,wstring subT):Element(idElement,x,y,TYPE_CHILD_SECTION)
00037 {
00038 if(backgroundLeft==NULL){
00039 loadSurf();
00040 }
00041
00042 int myHeight=backgroundHeight;
00043 if(subT!=L""){
00044 title=new MyLabel(-1,arrowWidth+2*PADDING_ARROW,5,t,TEXT_NORMAL,(DWORD)0,true);
00045 subTitle=new MyLabel(-1,arrowWidth+2*PADDING_ARROW,5,subT,TEXT_ITALIC,(DWORD)0,true);
00046 if(myHeight<title->getBottom())
00047 myHeight=title->getBottom()*2;
00048 subTitle->setPaddingTop(myHeight/2);
00049 if(myHeight<subTitle->getBottom())
00050 myHeight=subTitle->getBottom();
00051 }else{
00052 title=new MyLabel(-1,arrowWidth+2*PADDING_ARROW,5,t,TEXT_NORMAL,(DWORD)0,true);
00053 title->setPaddingTop(backgroundHeight/4);
00054 subTitle=NULL;
00055 if(myHeight<title->getBottom())
00056 myHeight=title->getBottom()*2;
00057 }
00058 state=STATE_NORMAL;
00059 this->setHeight(myHeight);
00060 this->setWidth(gi->rs.right);
00061
00062 sliding=false;
00063 isInOurSection=false;
00064 container=NULL;
00065
00066 slidToLeft=true;
00067 durationSlide=200;
00068
00069 ourSection=new Section(-1,0,0,gi->rs.right,t);
00070 ourSection->owner=this;
00071 ourSection->add(this,false);
00072 }
00073
00074 ChildSection::~ChildSection(void)
00075 {
00076 delete title;
00077 delete subTitle;
00078 }
00079
00080
00081 Element* ChildSection::isClicked(int x,int y){
00082 if(positionAbsolute.right==positionAbsolute.bottom&&
00083 positionAbsolute.bottom==0)
00084 return NULL;
00085
00086 positionAbsolute.right=positionAbsolute.left+this->getWidth();
00087 if(x>positionAbsolute.left-5&&x<positionAbsolute.right+5&&y>positionAbsolute.top-10-gi->rcVisibleDesktopTOP.top&&
00088 y<positionAbsolute.top+this->getHeight()-gi->rcVisibleDesktopTOP.top){
00089 this->isActivated=true;
00090 if(this->state==STATE_NORMAL||this->state==STATE_SELECTED){
00091 this->state=STATE_HOVER;
00092 setMustRedraw();
00093 }
00094 return this;
00095 }
00096 return NULL;
00097 };
00098
00099 bool ChildSection::run(bool isRightClicked){
00100 Element::run(isRightClicked);
00101
00102 if(this->state==STATE_HOVER||
00103 (mouseEvent->isSlidingLeft()&&!slidToLeft)){
00104 this->state=STATE_SELECTED;
00105
00106 if(!isInOurSection){
00107 container=(Section*)this->mouseEvent->changeMouseAnalyse(this);
00108 container->setDrawingHook(this);
00109 }
00110
00111 sliding=true;
00112 slideScreen(gi->primaryBuffer);
00113 return true;
00114 }
00115 return false;
00116 };
00117 void ChildSection::unClick(){
00118 if(this->state==STATE_HOVER){
00119 this->state=STATE_NORMAL;
00120 setMustRedraw();
00121 return;
00122 }
00123
00124 if(container!=NULL){
00125 container->setDrawingHook(NULL);
00126 this->mouseEvent->changeMouseAnalyse(container);
00127 mouseEvent->setClickSelected(false);
00128 container=NULL;
00129 }else
00130 return;
00131
00132 this->setMustRedraw();
00133 gi->rcUpdateRegion=gi->rs;
00134 };
00135
00136 void ChildSection::paint(DIRECTDRAW_GDI* lpDDraw,int x,int y){
00137
00138 positionAbsolute.top=this->getTop()+y;
00139 positionAbsolute.bottom=positionAbsolute.top+this->getHeight();
00140 positionAbsolute.left=this->getLeft()+x;
00141 positionAbsolute.right=positionAbsolute.left+getWidth();
00142
00143
00144
00145 if(positionAbsolute.top>=gi->rcUpdateRegion.bottom||positionAbsolute.bottom<=gi->rcUpdateRegion.top||
00146 positionAbsolute.left>=gi->rcUpdateRegion.right||positionAbsolute.right<=gi->rcUpdateRegion.left)
00147 return;
00148
00149 if(positionAbsolute.top<gi->rcUpdateRegion.top){
00150 clipping.top=gi->rcUpdateRegion.top-positionAbsolute.top;
00151 positionAbsolute.top=gi->rcUpdateRegion.top;
00152 }else{
00153 clipping.top=0;
00154 }
00155 if(positionAbsolute.bottom>gi->rcUpdateRegion.bottom){
00156 clipping.bottom=this->getHeight()-(positionAbsolute.bottom-gi->rcUpdateRegion.bottom);
00157 positionAbsolute.bottom=gi->rcUpdateRegion.bottom;
00158 }else{
00159 clipping.bottom=this->getHeight();
00160 }
00161 if(positionAbsolute.left<gi->rcUpdateRegion.left){
00162 clipping.left=(state)*backgroundWidth+gi->rcUpdateRegion.left-positionAbsolute.left;
00163 positionAbsolute.left=gi->rcUpdateRegion.left;
00164 }else{
00165 clipping.left=(state)*backgroundWidth;
00166 }
00167 if(positionAbsolute.right>gi->rcUpdateRegion.right){
00168 positionAbsolute.right=gi->rcUpdateRegion.right;
00169 clipping.right=clipping.left+(positionAbsolute.right-positionAbsolute.left);
00170 }else{
00171 clipping.right=(state+1)*backgroundWidth;
00172 }
00173
00174 HRESULT hres;
00175 if(slidToLeft){
00176 if(clipping.right-clipping.left>4&&clipping.left>=0){
00177 while(backgroundWidth<positionAbsolute.right-positionAbsolute.left){
00178 RECT clTmp={clipping.left+3,clipping.top,
00179 clipping.left+4,clipping.bottom};
00180 RECT posTmp={positionAbsolute.left,positionAbsolute.top,
00181 positionAbsolute.left+((positionAbsolute.right-positionAbsolute.left)-backgroundWidth),positionAbsolute.bottom};
00182
00183 hres= gi->window->BltFast(lpDDraw,&posTmp, backgroundRight,&clTmp, DDBLT_WAITNOTBUSY,NULL);
00184 if (hres != DD_OK){
00185 LocalisedString::explainFailDirectDraw(hres,L"ChildSection Blt(backgroundRight);");
00186 return;
00187 }
00188 positionAbsolute.left=posTmp.right;
00189 }
00190 hres= gi->window->BltFast(lpDDraw,&positionAbsolute, backgroundRight,&clipping, DDBLT_WAITNOTBUSY,NULL);
00191 if (hres != DD_OK){
00192 LocalisedString::explainFailDirectDraw(hres,L"ChildSection Blt(backgroundRight);");
00193 return;
00194 }
00195 }
00196
00197 if(state!=STATE_NORMAL)
00198 this->title->paintColor(lpDDraw,x,y,RGB(196,196,196),RGB565to32(6,12,6));
00199 else
00200 this->title->paintColor(lpDDraw,x,y,RGB(5,5,5),RGB565to32(28,56,28));
00201 if(subTitle!=NULL){
00202 if(state!=STATE_NORMAL)
00203 this->subTitle->paintColor(lpDDraw,x,y,RGB(196,196,196),RGB565to32(6,12,6));
00204 else
00205 this->subTitle->paintColor(lpDDraw,x,y,RGB(5,5,5),RGB565to32(28,56,28));
00206 }
00207 }else{
00208 if(clipping.right-clipping.left>4&&clipping.left>=0){
00209 while(backgroundWidth<positionAbsolute.right-positionAbsolute.left){
00210 RECT clTmp={clipping.left+3,clipping.top,
00211 clipping.left+4,clipping.bottom};
00212 RECT posTmp={positionAbsolute.right-((positionAbsolute.right-positionAbsolute.left)-backgroundWidth),positionAbsolute.top,
00213 positionAbsolute.right,positionAbsolute.bottom};
00214
00215 hres= gi->window->BltFast(lpDDraw,&posTmp, backgroundLeft,&clTmp, DDBLT_WAITNOTBUSY,NULL);
00216 if (hres != DD_OK){
00217 LocalisedString::explainFailDirectDraw(hres,L"ChildSection Blt(backgroundLeft);");
00218 return;
00219 }
00220 positionAbsolute.right=posTmp.left;
00221 clipping.right=clipping.left+positionAbsolute.right-positionAbsolute.left;
00222 }
00223 HRESULT hres= gi->window->BltFast(lpDDraw,&positionAbsolute, backgroundLeft,&clipping, DDBLT_WAITNOTBUSY,NULL);
00224 if (hres != DD_OK){
00225 LocalisedString::explainFailDirectDraw(hres,L"ChildSection Blt(backgroundLeft);");
00226 return;
00227 }
00228 }
00229
00230 if(state!=STATE_NORMAL)
00231 this->title->paintColor(lpDDraw,x,y,RGB(196,196,196),RGB565to32(6,12,6));
00232 else
00233 this->title->paintColor(lpDDraw,x,y,RGB(5,5,5),RGB565to32(28,56,28));
00234 }
00235
00236
00237 positionAbsolute.top=this->getTop()+y;
00238 positionAbsolute.left=this->getLeft()+x;
00239 };
00240
00241
00242 int ChildSection::mouseGesture(){
00243
00244 if(mouseEvent->isClicked()||mouseEvent->isDblClicked()){
00245 this->unClick();
00246 return 0;
00247 }
00248
00249 return 0;
00250 };
00251
00252
00253 void ChildSection::slideScreen(DIRECTDRAW_GDI* lpDDraw){
00254
00255 slidToLeft=!slidToLeft;
00256 isInOurSection=!isInOurSection;
00257 sliding=false;
00258
00259 this->state=STATE_NORMAL;
00260
00261 if(slidToLeft){
00262 this->title->setPaddingTop(savPaddingTopTitle);
00263 this->title->setText(savTitle,false);
00264 }else{
00265 savTitle=this->title->getText();
00266 savPaddingTopTitle=this->title->getPaddingTop();
00267 this->title->setPaddingTop(backgroundHeight/4);
00268 this->title->setText(L"Back",false);
00269 }
00270
00271 RECT dest=gi->rs;
00272 RECT src=dest;
00273 int distancePrev=0;
00274 int distance=0;
00275 double speed=1;
00276 double accel=((double)gi->rs.right-speed*durationSlide)/(durationSlide*durationSlide);
00277 HRESULT hRet;
00278
00279
00280 gi->rcUpdateRegion=gi->rs;
00281 gi->rcUpdateRegion.top=gi->rcVisibleDesktopTOP.top;
00282 dest.top=gi->rcVisibleDesktopTOP.top;
00283 src.top=gi->rcVisibleDesktopTOP.top;
00284
00285
00286 DWORD lastTickMouse=GetTickCount();
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298 gi->window->BltFast(gi->backBuffer,NULL, gi->background,NULL, DDBLT_WAITNOTBUSY,NULL);
00299
00300
00301
00302 if(!isInOurSection){
00303
00304
00305 mouseEvent->changeMouseAnalyse(container);
00306 mouseEvent->setClickSelected(false);
00307 container->setDrawingHook(NULL);
00308 container->paint(gi->backBuffer,0,0);
00309 }else{
00310
00311 mouseEvent->changeMouseAnalyse(ourSection);
00312 mouseEvent->setClickSelected(false);
00313 container->setDrawingHook(ourSection);
00314 ourSection->paint(gi->backBuffer,0,0);
00315 }
00316
00317
00318 DWORD timeAnim=10;
00319 DWORD timeDiff=0;
00320 lastTickMouse=GetTickCount();
00321 int nbSlide=0;
00322 distance=speed*timeAnim+(accel*(timeAnim*timeAnim))/2.0;
00323 gi->window->beginPaint();
00324 while(distance<gi->rs.right){
00325 nbSlide++;
00326 if(!slidToLeft){
00327 dest.left=0;
00328 dest.right=gi->rs.right-((LONG)distance-(LONG)distancePrev);
00329 src.left=((int)distance-(int)distancePrev);
00330 src.right=gi->rs.right;
00331 }else{
00332 dest.left=((int)distance-(int)distancePrev);
00333 dest.right=gi->rs.right;
00334 src.left=0;
00335 src.right=gi->rs.right-((LONG)distance-(LONG)distancePrev);
00336 }
00337 hRet = gi->window->BltFast(lpDDraw, &dest, lpDDraw, &src, DDBLT_WAITNOTBUSY, NULL );
00338 if (hRet != DD_OK)
00339 LocalisedString::explainFailDirectDraw(hRet,L"slideScreen error");
00340
00341 if(!slidToLeft){
00342 dest.left=gi->rs.right-((LONG)distance-(LONG)distancePrev);
00343 dest.right=gi->rs.right;
00344 src.left=(LONG)distancePrev;
00345 src.right=(LONG)distance;
00346 }else{
00347 dest.left=0;
00348 dest.right=((LONG)distance-(LONG)distancePrev);
00349 src.left=gi->rs.right-(LONG)distance;
00350 src.right=gi->rs.right-(LONG)distancePrev;
00351 }
00352 hRet = gi->window->BltFast(lpDDraw, &dest, gi->backBuffer, &src, DDBLT_WAITNOTBUSY, NULL );
00353 if (hRet != DD_OK)
00354 LocalisedString::explainFailDirectDraw(hRet,L"slideScreen error");
00355 gi->window->endPaint();
00356
00357 timeDiff=GetTickCount()-lastTickMouse;
00358
00359 lastTickMouse=GetTickCount();
00360 distancePrev=distance;
00361 if(timeDiff>30){
00362 timeAnim+=timeDiff;
00363 }else{
00364 Sleep(30-timeDiff);
00365 timeAnim+=30;
00366 }
00367 gi->window->beginPaint();
00368
00369 distance=(speed*timeAnim+(accel*(timeAnim*timeAnim))/2.0);
00370 if(distance<=distancePrev){
00371 distance=distancePrev+1;
00372 }
00373
00374 }
00375
00376 gi->window->BltFast(gi->primaryBuffer,&gi->rcUpdateRegion,
00377 gi->backBuffer,&gi->rcUpdateRegion,
00378 DDBLT_WAITNOTBUSY, NULL );
00379
00380
00381
00382 gi->rcUpdateRegion=gi->rs;
00383 };