Go to the documentation of this file.00001 #include "../../Library/SDK_Manila_Sense.h"
00002
00003 MouseCtrl* MouseCtrl::instance=NULL;
00004 CRITICAL_SECTION MouseCtrl::mouseUpdate;
00005 GlobalInformations* MouseCtrl::gi=NULL;
00006
00007 MouseCtrl::MouseCtrl(void)
00008 {
00009 gi=GlobalInformations::getInstance();
00010
00011 mouseOldXPos=0;
00012 mouseOldYPos=0;
00013 mouseNewXPos=0;
00014 mouseNewYPos=0;
00015 mouseClickXPos=0;
00016 mouseClickYPos=0;
00017 lastMouseXPos=0;
00018 lastMouseYPos=0;
00019
00020 somethingAppend=true;
00021 scrolling=false;
00022 clickSelected=false;
00023 mouseDown=false;
00024 splClick=false;
00025 dblClick=false;
00026 hasInfoAboutClick=false;
00027 clickPosGet=false;
00028
00029
00030 lastTickMouse=0;
00031 startScrolling=0;
00032 lastScroll=0;
00033 for(int i=0;i<NB_MOUSE_HISTORY;i++){
00034 userYVel[i]=0;
00035 userXVel[i]=0;
00036 }
00037 this->idPos=0;
00038
00039 InitializeCriticalSection(&MouseCtrl::mouseUpdate);
00040 gestMouse=NULL;
00041 }
00042
00043 MouseCtrl::~MouseCtrl(void)
00044 {
00045 instance=NULL;
00046 gi=NULL;
00047 }
00048
00049 MouseCtrl* MouseCtrl::getInstance(){
00050 if(instance==NULL)
00051 instance=new MouseCtrl();
00052 return instance;
00053 };
00054
00055 void MouseCtrl::rightBtnDown(int x,int y){
00056 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00057
00058 rightClick=true;
00059 slideLeft=false;
00060 dblClick=false;
00061 clickSelected=false;
00062 mouseDown=false;
00063 clickPosGet=false;
00064 mouseClickXPos=x;
00065 mouseClickYPos=y;
00066 mouseNewXPos=x;
00067 mouseNewYPos=y;
00068 mouseOldXPos=x;
00069 mouseOldYPos=y;
00070 lastMouseXPos=x;
00071 lastMouseYPos=y;
00072
00073 somethingAppend=true;
00074 cantSlideLeft=false;
00075 stopScroll();
00076
00077 userXVel[0]=0;
00078 userYVel[0]=0;
00079 idPos=0;
00080 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00081 }
00082
00083
00084 void MouseCtrl::leftBtnDown(int x,int y){
00085 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00086 lastTickMouse=GetTickCount();
00087 if(!splClick)
00088 clickEvent=lastTickMouse;
00089
00090 rightClick=false;
00091 slideLeft=false;
00092 dblClick=false;
00093 clickSelected=true;
00094 mouseDown=true;
00095 clickPosGet=false;
00096 mouseClickXPos=x;
00097 mouseClickYPos=y;
00098 mouseNewXPos=x;
00099 mouseNewYPos=y;
00100 mouseOldXPos=x;
00101 mouseOldYPos=y;
00102 lastMouseXPos=x;
00103 lastMouseYPos=y;
00104
00105 somethingAppend=true;
00106 cantSlideLeft=false;
00107 stopScroll();
00108
00109 userXVel[0]=0;
00110 userYVel[0]=0;
00111 idPos=0;
00112 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00113
00114 }
00115
00116 void MouseCtrl::leftBtnUp(int x,int y){
00117 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00118
00119
00120 somethingAppend=true;
00121 mouseDown=false;
00122 DWORD tick=GetTickCount();
00123 double timeBetweenPosition = (double)(tick - lastTickMouse);
00124
00125 if (clickSelected){
00126 if(splClick&&((double)(tick - clickEvent)<DBL_CLICK_LENGTH)){
00127 splClick=false;
00128 dblClick=true;
00129 }else{
00130 clickEvent=tick;
00131 hasInfoAboutClick=false;
00132 splClick=true;
00133 }
00134 clickSelected=false;
00135 }
00136 if(idPos>2){
00137 unsigned char posHistory=(idPos-2)%NB_MOUSE_HISTORY;
00138 unsigned char posHistory1=(idPos-1)%NB_MOUSE_HISTORY;
00139 if(abs(this->userYVel[posHistory1]+this->userYVel[posHistory])>10&&
00140 timeBetweenPosition<300){
00141
00142 SetTimer(gi->m_hWnd, 1, MS_PER_FRAME, NULL);
00143 scrolling=true;
00144 startScrolling=GetTickCount();
00145 lastScroll=startScrolling;
00146 }
00147 }else
00148 idPos++;
00149
00150 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00151 };
00152 void MouseCtrl::stopScroll(){
00153 if(scrolling){
00154 scrolling=false;
00155
00156 KillTimer(gi->m_hWnd, 1);
00157 }
00158 };
00159
00160 void MouseCtrl::leftBtnMove(int x,int y){
00161 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00162 rightClick=false;
00163 DWORD tick=GetTickCount();
00164 double timeBetweenPosition = (double)(tick - lastTickMouse);
00165 if(timeBetweenPosition<3){
00166 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00167 return;
00168 }
00169 if (clickSelected){
00170 if(abs(mouseClickXPos-x)>30||abs(mouseClickYPos-y)>30){
00171 clickSelected=false;
00172 }
00173 }
00174 somethingAppend=true;
00175 stopScroll();
00176
00177 if(!cantSlideLeft&&abs(mouseClickYPos-y)<30){
00178 if(abs(mouseClickXPos-x)>150)
00179 slideLeft=true;
00180 }else{
00181 cantSlideLeft=true;
00182 slideLeft=false;
00183 }
00184
00185 mouseOldXPos=mouseNewXPos;
00186 mouseOldYPos=mouseNewYPos;
00187
00188 mouseNewXPos=x;
00189 mouseNewYPos=y;
00190
00191 lastTickMouse=tick;
00192 unsigned char posHistory=(idPos)%NB_MOUSE_HISTORY;
00193 this->userXVel[posHistory]=100.0*(double)(mouseNewXPos-mouseOldXPos)/timeBetweenPosition;
00194 this->userYVel[posHistory]=100.0*(double)(mouseNewYPos-mouseOldYPos)/timeBetweenPosition;
00195 if(this->userYVel[posHistory]>500){
00196 this->userYVel[posHistory]=500;
00197 }
00198 if(this->userYVel[posHistory]<-500){
00199 this->userYVel[posHistory]=-500;
00200 }
00201
00202 idPos++;
00203 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00204
00205 };
00206
00207 bool MouseCtrl::setMouseAnalyse(Element* e){
00208 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00209 if(gestMouse==NULL){
00210 gestMouse=e;
00211 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00212 return true;
00213 }
00214 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00215 return false;
00216 }
00217
00218 Element* MouseCtrl::changeMouseAnalyse(Element* e){
00219 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00220
00221 if(e==NULL){
00222 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00223 return NULL;
00224 }
00225
00226 slideLeft=false;
00227 somethingAppend=true;
00228 stopScroll();
00229 clickSelected=false;
00230 splClick=false;
00231 dblClick=false;
00232 hasInfoAboutClick=false;
00233
00234 Element* mouseAnalysePrev=gestMouse;
00235 gestMouse=e;
00236 return mouseAnalysePrev;
00237 };
00238
00239
00240 int MouseCtrl::getMouseDY(){
00241 int out=0;
00242 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00243 DWORD tick= GetTickCount();
00244 double timeFrame=(double)(tick-lastScroll);
00245 if(timeFrame<2){
00246 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00247 return 0;
00248 }
00249
00250 if(scrolling){
00251 if(idPos<2){
00252 stopScroll();
00253 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00254 return 0;
00255 }
00256
00257 double timeAnim =(double)(tick-startScrolling);
00258 lastScroll=tick;
00259
00260 double speedY=(2.0*userYVel[(idPos-1)%NB_MOUSE_HISTORY]+userYVel[(idPos-2)%NB_MOUSE_HISTORY])/3.0;
00261
00262 speedY=timeFrame*speedY/100.0;
00263 if(speedY>120)
00264 speedY=120;
00265 if(speedY<-120)
00266 speedY=-120;
00267 bool up=speedY<0;
00268
00269 if(up)
00270 timeAnim=-timeAnim;
00271
00272 double test=speedY-(timeAnim/VEL_INERTIE);
00273 if(abs((int)test)<1||abs((int)test)>abs((int)speedY)||(up&&test>0.0)||(!up&&test<0.0))
00274 stopScroll();
00275 else
00276 out=(int)test;
00277
00278 }else{
00279 out=mouseNewYPos-lastMouseYPos;
00280 }
00281 lastMouseYPos=mouseNewYPos;
00282 lastScroll=tick;
00283 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00284 return out;
00285 };
00286
00287
00288 int MouseCtrl::getMouseDX(){
00289 int out=0;
00290 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00291 DWORD tick= GetTickCount();
00292 double timeFrame=(double)(tick-lastScroll);
00293 if(timeFrame<2){
00294 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00295 return 0;
00296 }
00297
00298 out=mouseNewXPos-lastMouseXPos;
00299 lastMouseXPos=mouseNewXPos;
00300 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00301 return out;
00302 };
00303
00304 double MouseCtrl::getMouseDXMean(){
00305 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00306 double speedX=(2.0*userXVel[(idPos-1)%NB_MOUSE_HISTORY]+userXVel[(idPos-2)%NB_MOUSE_HISTORY])/300.0;
00307 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00308 return speedX;
00309 };
00310
00311
00312
00313
00314 int MouseCtrl::updateElement(){
00315 int out;
00316 EnterCriticalSection(&MouseCtrl::mouseUpdate);
00317 if(this->gestMouse!=NULL)
00318 out=this->gestMouse->mouseGesture();
00319 LeaveCriticalSection(&MouseCtrl::mouseUpdate);
00320 return out;
00321 };
00322
00323 bool MouseCtrl::isSelected(){
00324 return clickSelected;
00325 };
00326 bool MouseCtrl::isClicked(){
00327 if(hasInfoAboutClick)
00328 return false;
00329 else{
00330 hasInfoAboutClick=true;
00331 return splClick;
00332 }
00333 };
00334 bool MouseCtrl::isMouseDown(){
00335 return mouseDown;
00336 };
00337
00338 bool MouseCtrl::isDblClicked(){
00339 return dblClick;
00340 };
00341
00342 bool MouseCtrl::isSlidingLeft(){
00343 return slideLeft;
00344 };
00345 bool MouseCtrl::sthgHasChange(){
00346 return somethingAppend||scrolling;
00347 };
00348
00349 void MouseCtrl::getMousePosition(int &x,int &y){
00350 if(!clickPosGet){
00351 x=mouseClickXPos;
00352 y=mouseClickYPos;
00353 clickPosGet=true;
00354 }else{
00355 x=mouseNewXPos;
00356 y=mouseNewYPos;
00357 }
00358 };