00001 #include "../../Library/SDK_Manila_Sense.h"
00002
00003 DIRECTDRAW_GDI *MyEditControl::inputDDraw=NULL;
00004
00005 unsigned char MyEditControl::widthCorner=10;
00006 unsigned short int MyEditControl::widthItem=0;
00007 HWND MyEditControl::input=0;
00008 MyEditControl* MyEditControl::pEditCtrl=NULL;
00009
00010 int MyEditControl::EDIT_MENU_HEIGHT=0;
00011
00012 void MyEditControl::loadSurf(){
00013 if(MyEditControl::input==0){
00014 MyEditControl::input=CreateWindow(
00015 L"EDIT",
00016 NULL,
00017 ES_AUTOHSCROLL,
00018 CW_USEDEFAULT,
00019 CW_USEDEFAULT,
00020 CW_USEDEFAULT,
00021 CW_USEDEFAULT,
00022 gi->m_hWnd,
00023 (HMENU) ID_EDITCHILD,
00024 GetModuleHandle(NULL),
00025 NULL);
00026 if (!MyEditControl::input){
00027 LocalisedString::explainFailWinAPI(LocalisedString::szCreateInputText);
00028 return;
00029 }
00030
00031 CreateWindow(WC_SIPPREF, L"", WS_CHILD,
00032 0, 0, 0, 0, gi->m_hWnd, NULL, NULL, NULL);
00033 }
00034 if(inputDDraw==NULL){
00035 inputDDraw=loadImage(gi->btn_common_input);
00036 EDIT_MENU_HEIGHT=inputDDraw->height;
00037 widthItem=inputDDraw->width/3.0;
00038 }
00039
00040 DWORD dwWidth = GetSystemMetrics(SM_CXSCREEN);
00041 DWORD dwHeight = GetSystemMetrics(SM_CYSCREEN);
00042
00043 if(dwWidth > dwHeight){
00044 if(paddingSup==0){
00045 double diff=dwWidth- dwHeight;
00046 paddingSup=diff/2;
00047 if(this->getRight()+paddingSup<dwWidth){
00048 this->setRight(this->getRight()+paddingSup);
00049 this->setLeft(this->getLeft()+paddingSup);
00050 }else{
00051 paddingSup=0;
00052 }
00053 }
00054 }else{
00055 if(paddingSup!=0){
00056 this->setRight(this->getRight()-paddingSup);
00057 this->setLeft(this->getLeft()-paddingSup);
00058 paddingSup=0;
00059 }else{
00060 if(this->getRight()>dwWidth){
00061 this->setRight(this->getRight()-(dwWidth- dwHeight));
00062 }
00063 }
00064 }
00065
00066
00067 }
00068
00069 MyEditControl::MyEditControl(int idElement, int x,int y,int width):Element(idElement, x,y,TYPE_EDIT_CTRL)
00070 {
00071 text=NULL;
00072 this->setWidth(width);
00073 if(inputDDraw==NULL||gi->backBuffer==NULL){
00074 loadSurf();
00075 }
00076
00077 state=0;
00078 this->setHeight(EDIT_MENU_HEIGHT);
00079 positionAbsolute.left=0;
00080 positionAbsolute.top=0;
00081 positionAbsolute.right=0;
00082 positionAbsolute.bottom=0;
00083 text=new MyLabel(-1,4,10,width,EDIT_MENU_HEIGHT,L"",NULL,false);
00084 text->isClickable=true;
00085 text->owner=this;
00086
00087 slideToTop=false;
00088 container=NULL;
00089 }
00090
00091 void MyEditControl::sizeChanged(Element* src,int width,int height){
00092 if(src!=text)
00093 return;
00094 if(width>getWidth()){
00095 text->setWidth(getWidth());
00096 }
00097 if(height>getHeight()){
00098 text->setHeight(getHeight());
00099 }
00100 }
00101
00102 MyEditControl::~MyEditControl(void)
00103 {
00104 }
00105
00106 bool MyEditControl::run(bool isRightClicked){
00107 Element::run(isRightClicked);
00108 if(state!=VIS_HOVER)
00109 return false;
00110
00111 container=(Section*)this->mouseEvent->changeMouseAnalyse(this);
00112
00113 slideToTop=true;
00114
00115
00116 SetTimer(gi->m_hWnd, 1, MS_PER_FRAME, NULL);
00117
00118 startAnim=GetTickCount();
00119 startPos=positionAbsolute.bottom;
00120 return true;
00121
00122 }
00123 void MyEditControl::showSIP(){
00124
00125 SetFocus(gi->m_hWnd);
00126 SHFullScreen(gi->m_hWnd,SHFS_SHOWSIPBUTTON);
00127 SIPINFO si = {0};
00128 si.cbSize = sizeof(SIPINFO);
00129 SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);
00130 si.fdwFlags = SIPF_ON;
00131 SHSipInfo(SPI_SETSIPINFO, 0, &si, 0);
00132 ShowWindow(input, SW_SHOW);
00133 UpdateWindow(input);
00134 SetFocus(input);
00135
00136 }
00137 void MyEditControl::show(){
00138 pEditCtrl=this;
00139 KillTimer(gi->m_hWnd, 1);
00140
00141 gi->mustRender=false;
00142 ShowWindow(gi->m_hWnd, SW_SHOW);
00143 UpdateWindow(gi->m_hWnd);
00144 SetFocus(gi->m_hWnd);
00145
00146 SIPINFO pSipInfo;
00147 memset(&pSipInfo, 0, sizeof(pSipInfo));
00148 pSipInfo.cbSize=sizeof(pSipInfo);
00149 if(!SipGetInfo(&pSipInfo))
00150 LocalisedString::explainFail(L"Internal Failure...",L"SipGetInfo(&pSipInfo)");
00151
00152
00153 DDBLTFX ddbltfx;
00154 memset(&ddbltfx, 0, sizeof(ddbltfx));
00155 ddbltfx.dwSize = sizeof(ddbltfx);
00156 ddbltfx.dwFillColor = RGB565to32(0,0,0);
00157 RECT tmp=gi->rs;
00158 tmp.top=pSipInfo.rcSipRect.bottom;
00159 gi->rcVisibleDesktopBOTTOM=pSipInfo.rcSipRect;
00160
00161
00162 gi->window->BltFast(gi->primaryBuffer,&tmp,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAITNOTBUSY, &ddbltfx);
00163
00164
00165
00166
00167
00168
00169
00170
00171 positionAbsolute.bottom=positionAbsolute.top+EDIT_MENU_HEIGHT;
00172
00173
00174
00175
00176 gi->rcVisibleDesktopTOP.bottom=gi->rs.bottom;
00177
00178
00179
00180
00181
00182
00183 MoveWindow(MyEditControl::input,
00184 positionAbsolute.left+4*gi->percentOfVGA,
00185 positionAbsolute.top+8*gi->percentOfVGA-gi->rcVisibleDesktopTOP.top,
00186 positionAbsolute.right-positionAbsolute.left-12*gi->percentOfVGA,
00187 positionAbsolute.bottom-positionAbsolute.top-12*gi->percentOfVGA,
00188 true);
00189
00190
00191 SendMessage(input, WM_SETTEXT, 0, (LPARAM) text->getText().c_str());
00192
00193 showSIP();
00194 };
00195
00196 void MyEditControl::unClick(){
00197 pEditCtrl=NULL;
00198 if(state!=VIS_DISABLED)
00199 this->state=VIS_NORMAL;
00200
00201 gi->isActiv=true;
00202 slideToTop=false;
00203
00204
00205 if(container!=NULL)
00206 this->mouseEvent->changeMouseAnalyse(container);
00207 else
00208 return;
00209
00210
00211 if(!SipShowIM(SIPF_OFF)){
00212 LocalisedString::explainFail(LocalisedString::szCreateInputText,L"SipShowIM(SIPF_OFF)");
00213 }
00214 SHFullScreen(gi->m_hWnd,SHFS_HIDETASKBAR|SHFS_HIDESIPBUTTON);
00215 SIPINFO si = {0};
00216 si.cbSize = sizeof(SIPINFO);
00217 SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);
00218 si.fdwFlags = SIPF_OFF;
00219 SHSipInfo(SPI_SETSIPINFO, 0, &si, 0);
00220
00221 WCHAR textTmp[255];
00222 GetWindowText( input, textTmp, 255 );
00223 wstring textPrev=text->getText();
00224 if(textPrev.compare(textTmp)!=0){
00225 text->setText(textTmp);
00226 getGestEvent()->messageProc(this,EVENT_VALUE_CHANGED);
00227 }
00228
00229 ShowWindow(input, SW_HIDE);
00230
00231
00232 InvalidateRect(gi->m_hWnd,NULL,false);
00233
00234 };
00235
00236 Element* MyEditControl::isClicked(int x,int y){
00237 if(positionAbsolute.right==positionAbsolute.bottom&&
00238 positionAbsolute.bottom==0)
00239 return NULL;
00240
00241 if(x>positionAbsolute.left&&x<positionAbsolute.right&&
00242 y>positionAbsolute.top-gi->rcVisibleDesktopTOP.top&&y<positionAbsolute.top-gi->rcVisibleDesktopTOP.top+this->getHeight()){
00243 this->isActivated=true;
00244 if(state!=VIS_DISABLED){
00245 this->state=VIS_HOVER;
00246 }
00247 return this;
00248 }
00249 return NULL;
00250 };
00251
00252 void MyEditControl::paint(DIRECTDRAW_GDI* lpDDraw,int x,int y){
00253
00254 positionAbsolute.top=this->getTop()+y;
00255 positionAbsolute.bottom=positionAbsolute.top+this->getHeight();
00256 positionAbsolute.left=this->getLeft()+x;
00257 positionAbsolute.right=positionAbsolute.left+getWidth();
00258
00259
00260
00261 if(positionAbsolute.top>=gi->rcUpdateRegion.bottom||positionAbsolute.bottom<=gi->rcUpdateRegion.top||
00262 positionAbsolute.left>=gi->rcUpdateRegion.right||positionAbsolute.right<=gi->rcUpdateRegion.left)
00263 return;
00264
00265 if(positionAbsolute.top<gi->rcUpdateRegion.top){
00266 clipping.top=gi->rcUpdateRegion.top-positionAbsolute.top;
00267 positionAbsolute.top=gi->rcUpdateRegion.top;
00268 }else{
00269 clipping.top=0;
00270 }
00271 if(positionAbsolute.bottom>gi->rcUpdateRegion.bottom){
00272 clipping.bottom=this->getHeight()-(positionAbsolute.bottom-gi->rcUpdateRegion.bottom);
00273 positionAbsolute.bottom=gi->rcUpdateRegion.bottom;
00274 }else{
00275 clipping.bottom=this->getHeight();
00276 }
00277 if(positionAbsolute.left<gi->rcUpdateRegion.left){
00278 clipping.left=gi->rcUpdateRegion.left-positionAbsolute.left;
00279 positionAbsolute.left=gi->rcUpdateRegion.left;
00280 }else{
00281 clipping.left=0;
00282 }
00283 if(positionAbsolute.right>gi->rcUpdateRegion.right){
00284 clipping.right=this->getWidth()-(positionAbsolute.right-gi->rcUpdateRegion.right);
00285 positionAbsolute.right=gi->rcUpdateRegion.right;
00286 }else{
00287 clipping.right=this->getWidth();
00288 }
00289
00290
00291
00292
00293
00294 RECT tmp=positionAbsolute;
00295 RECT tmpSrc=clipping;
00296 HRESULT hres;
00297
00298
00299
00300 tmp.right=positionAbsolute.right;
00301 tmp.left=positionAbsolute.left;
00302 tmpSrc.left=(state)*widthItem+15;
00303 tmpSrc.right=tmpSrc.left+1;
00304 if(clipping.left<10)
00305 tmp.left+=10;
00306 if(clipping.right>this->getWidth()-10)
00307 tmp.right-=10;
00308 if(tmp.left<tmp.right&&tmpSrc.right<widthItem*3.0){
00309 hres= gi->window->BltFast(lpDDraw,&tmp, inputDDraw,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00310 if (hres != DD_OK)
00311 LocalisedString::explainFailDirectDraw(hres,L"MyPictureBox Blt(input mdl);");
00312 }
00313
00314 int tmpRight=clipping.right;
00315 if(tmpRight>=10)
00316 tmpRight=10;
00317 if(clipping.left<10){
00318
00319 tmp.left=positionAbsolute.left;
00320 tmp.right=tmp.left+tmpRight;
00321 tmpSrc.left=(state)*widthItem+clipping.left;
00322 tmpSrc.right=(state)*widthItem+clipping.left+tmpRight;
00323 hres= gi->window->BltFast(lpDDraw,&tmp, inputDDraw,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00324 if (hres != DD_OK)
00325 LocalisedString::explainFailDirectDraw(hres,L"MyPictureBox Blt(input ]);");
00326
00327 tmp.left=tmp.right;
00328 }
00329
00330 int tmpLeft=clipping.left;
00331 if(tmpLeft<=this->getWidth()-10)
00332 tmpLeft=this->getWidth()-10;
00333 if(clipping.right>this->getWidth()-10){
00334
00335 tmp.right=positionAbsolute.right;
00336 tmp.left=tmp.right-tmpLeft;
00337 tmpSrc.left=(state+1)*widthItem-tmpLeft;
00338 tmpSrc.right=(state+1)*widthItem;
00339 hres= gi->window->BltFast(lpDDraw,&tmp, inputDDraw,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00340 if (hres != DD_OK)
00341 LocalisedString::explainFailDirectDraw(hres,L"MyPictureBox Blt(input ]);");
00342 }
00343
00344
00345 positionAbsolute.top=this->getTop()+y;
00346 positionAbsolute.left=this->getLeft()+x;
00347
00348 text->paintColor(lpDDraw,positionAbsolute.left,positionAbsolute.top,RGB(0,0,0),RGB565to32(31,63,31));
00349
00350 };
00351
00352
00353 int MyEditControl::mouseGesture(){
00354 if(slideToTop){
00355
00356 SIPINFO pSipInfo;
00357 memset(&pSipInfo, 0, sizeof(pSipInfo));
00358 pSipInfo.cbSize=sizeof(pSipInfo);
00359 if(!SipGetInfo(&pSipInfo)){
00360 LocalisedString::explainFail(L"Internal Failure...",L"SipGetInfo(&pSipInfo)");
00361 }
00362
00363 double paddingtop=GetSystemMetrics(SM_CYSCREEN)-gi->rs.bottom;
00364 if(positionAbsolute.bottom>pSipInfo.rcSipRect.top-paddingtop){
00365 DWORD timeL=(GetTickCount()-startAnim);
00366 int out;
00367 if(timeL>200){
00368 out=-(positionAbsolute.bottom-(pSipInfo.rcSipRect.top-paddingtop));
00369 }else{
00370 out=-((positionAbsolute.bottom-(pSipInfo.rcSipRect.top-paddingtop))/4+1);
00371 }
00372
00373
00374 container->slideOverlay(out);
00375 if(out>0){
00376 gi->rcUpdateRegion.top=gi->rs.top;
00377 gi->rcUpdateRegion.bottom=gi->rs.top+out;
00378 }
00379 if(out<0){
00380 gi->rcUpdateRegion.bottom=GetSystemMetrics(SM_CYSCREEN);
00381 gi->rcUpdateRegion.top=gi->rcUpdateRegion.bottom+out;
00382 }
00383 gi->mustRedraw=false;
00384 return out;
00385 }else{
00386 if(positionAbsolute.top<50){
00387
00388 int out=1+(50-positionAbsolute.top)/2;
00389 container->slideOverlay(out);
00390 if(out>0){
00391 gi->rcUpdateRegion.top=gi->rs.top;
00392 gi->rcUpdateRegion.bottom=gi->rs.top+out;
00393 }
00394 if(out<0){
00395 gi->rcUpdateRegion.bottom=GetSystemMetrics(SM_CYSCREEN);
00396 gi->rcUpdateRegion.top=gi->rcUpdateRegion.bottom+out;
00397 }
00398 gi->mustRedraw=false;
00399 return out;
00400 }else{
00401 mouseEvent->stopScroll();
00402 slideToTop=false;
00403 this->show();
00404 }
00405 }
00406 return 0;
00407 }
00408 if(!mouseEvent->pickChange())
00409 return 0;
00410
00411 if(mouseEvent->isSelected()||mouseEvent->isClicked()||mouseEvent->isDblClicked()){
00412 int posX,posY;
00413 mouseEvent->getMousePosition(posX,posY);
00414 posY+=gi->rcVisibleDesktopTOP.top;
00415 if((posY<gi->rcVisibleDesktopTOP.bottom)||
00416 (posY>gi->rcVisibleDesktopBOTTOM.top&&posY<gi->rcVisibleDesktopBOTTOM.bottom)){
00417 this->unClick();
00418
00419
00420
00421
00422 container=NULL;
00423
00424
00425 }
00426 }
00427 return 0;
00428
00429 };
00430
00431 void MyEditControl::setText( LPCWSTR param1 )
00432 {
00433 text->setText(param1);
00434 }