#include "SCENE.H" #include "mshtmhst.h" int WORLD::UpdateText() { if (pTG) { CurrentlyEditedText[2000] = 0; pTG -> UPDATETEXT(CurrentlyEditedText); strcpy(CurrentlyEditedText,pTG->TEXT); if (D_UI.CursorPos >= strlen(CurrentlyEditedText)) { D_UI.CursorPos = strlen(CurrentlyEditedText); pTG -> UPDATETEXT(CurrentlyEditedText); strcpy(CurrentlyEditedText,pTG->TEXT); } } return 0; } int WORLD::GetTextFocus(TEXT_Grabber *pTGTS) { if (pTG != pTGTS) LooseFocus(); pTG = pTGTS; memset(&D_UI,0,sizeof(DrwTEXT_UI)); D_UI.ColorFront = 0xffffffff; D_UI.ColorBack = 0; D_UI.CurrentCursorPos = 0; D_UI.CursorPos = 0; D_UI.MouseToCursor = 0; D_UI.SelStart = D_UI.SelEnd = 0; D_UI.X = 2; D_UI.Y = pTG->Image.SY-18; D_UI.XEnd = 0; D_UI.YEnd = 0; strcpy(CurrentlyEditedText,pTG->TEXT); D_UI.CursorPos = strlen(CurrentlyEditedText); D_UI.Birth = timeGetTime(); return 0; } int WORLD::LooseFocus() { if (pTG) { TEXT_Grabber *PTGSave; PTGSave = pTG; pTG = NULL; PTGSave -> UPDATETEXT(CurrentlyEditedText); } return 0; } int WORLD::ProcessSel(char *NewString) { u32 Start,End; if (D_UI.SelStart == D_UI.SelEnd) D_UI.SelStart = D_UI.SelEnd = D_UI.CursorPos; if (D_UI.SelStart < D_UI.SelEnd ) { Start = D_UI.SelStart; End = D_UI.SelEnd ; } else { Start = D_UI.SelEnd ; End = D_UI.SelStart; } if ((Start != End) || (NewString && *NewString)) { if ((Start <= strlen(CurrentlyEditedText)) && (End <= strlen(CurrentlyEditedText))) { char Local[sizeof(CurrentlyEditedText)]; strcpy(Local,&CurrentlyEditedText[End]); if (NewString) { if (strlen(NewString) + strlen(CurrentlyEditedText) < sizeof(CurrentlyEditedText) -1) { sprintf(&CurrentlyEditedText[Start],"%s%s",NewString,Local); Start += strlen(NewString); } } else sprintf(&CurrentlyEditedText[Start],"%s",Local); } } if (D_UI.SelStart != D_UI.SelEnd ) { D_UI.SelEnd = D_UI.CursorPos = D_UI.SelStart = Start; return 1; } else { D_UI.SelEnd = D_UI.CursorPos = D_UI.SelStart = Start; return 0; } } int WORLD::InputHook(UINT message , LPARAM wParam, LPARAM lParam) { static u32 LastClickTime = 0; /* A text is edited and focus all events */ switch (message) { case WM_CUT: case WM_PASTE: case WM_COPY: ProcessSel(NULL); break; case WM_KEYDOWN: if (pTG) { if ((wParam == VK_TAB) || (wParam == VK_RETURN)) { LuaHandle(WM_KEYDOWN, wParam, 0); } else LuaHandle(WM_KEYDOWN, 0, 0); u32 COPY,PASTE,CUT; COPY=PASTE=CUT=0; if (GetAsyncKeyState(VK_CONTROL) & 0x8000) { if ((wParam == 'C') || (wParam == VK_INSERT)) // ^INSERT or ^c COPY = 1; else if (wParam == 'V') // ^V PASTE = 1; else if (wParam == 'X') // ^X CUT = 1; } if (GetAsyncKeyState(VK_SHIFT) & 0x8000) { if (wParam == VK_INSERT) // ^INSERT or ^c PASTE = 1; } if ((COPY || CUT) && (!pTG->TT.Password)) { /* COPY */ if (( D_UI.SelStart != D_UI.SelEnd ) && OpenClipboard(NULL)) { HANDLE hMem; char *DET; u32 size,Base; if (D_UI.SelStart < D_UI.SelEnd) { Base = D_UI.SelStart; size = D_UI.SelEnd - D_UI.SelStart + 1; } else { Base = D_UI.SelEnd; size = D_UI.SelStart - D_UI.SelEnd + 1; } hMem = GlobalAlloc(GMEM_MOVEABLE,size); DET=(char*)GlobalLock(hMem); if (DET) { memcpy(DET,&CurrentlyEditedText[Base],size); DET[size-1] = 0; GlobalUnlock(hMem); } EmptyClipboard(); hMem = SetClipboardData(CF_TEXT,hMem); CloseClipboard(); } if (CUT) ProcessSel(NULL); } if (PASTE ) { // PASTE if (OpenClipboard(NULL)) { HANDLE hMem; hMem = GetClipboardData(CF_TEXT); char *DET; if (hMem) { DET=(char*)GlobalLock(hMem); if (DET) { ProcessSel(DET); GlobalUnlock(hMem); } } CloseClipboard(); } } if (COPY|PASTE|CUT) { UpdateText(); return 1; } if ((wParam != VK_CONTROL) && (wParam <= 0x2f)&& (wParam != VK_SPACE)) { if (D_UI.CursorPos >= strlen(CurrentlyEditedText) ) D_UI.CursorPos = strlen(CurrentlyEditedText); D_UI.Birth = timeGetTime(); if (wParam == 27) // ESCAPE { LooseFocus(); return 1; } if (wParam == VK_RIGHT) { if (CurrentlyEditedText[D_UI.CursorPos]) D_UI.CursorPos++; if (GetAsyncKeyState(VK_CONTROL) & 0x8000) { while (((CurrentlyEditedText[D_UI.CursorPos] != ' ') && (CurrentlyEditedText[D_UI.CursorPos] != '\n')) && CurrentlyEditedText[D_UI.CursorPos]) {D_UI.CursorPos++;}; while (((CurrentlyEditedText[D_UI.CursorPos] == ' ') || (CurrentlyEditedText[D_UI.CursorPos] == '\n') ) && CurrentlyEditedText[D_UI.CursorPos]) {D_UI.CursorPos++;}; } } if (wParam == VK_LEFT) { if (D_UI.CursorPos) D_UI.CursorPos--; if (GetAsyncKeyState(VK_CONTROL) & 0x8000) { while (D_UI.CursorPos && (CurrentlyEditedText[D_UI.CursorPos] == ' ') ) {D_UI.CursorPos--;}; while (D_UI.CursorPos && (CurrentlyEditedText[D_UI.CursorPos-1] != '\n') && (CurrentlyEditedText[D_UI.CursorPos-1] != ' ') ) {D_UI.CursorPos--;}; } } if (wParam == VK_UP) D_UI.CursorPos = D_UI.CursorPosUP; if (wParam == VK_HOME) { if (GetAsyncKeyState(VK_CONTROL) & 0x8000) D_UI.CursorPos = 0; else { if (D_UI.CursorPos) while (((CurrentlyEditedText[D_UI.CursorPos - 1] != '\n') && D_UI.CursorPos&& (D_UI.CursorPos>1))) {D_UI.CursorPos--;}; if (D_UI.CursorPos == 1) D_UI.CursorPos = 0; } } if (wParam == VK_END) { if (GetAsyncKeyState(VK_CONTROL) & 0x8000) { D_UI.CursorPos = strlen(CurrentlyEditedText); //if (D_UI.CursorPos) D_UI.CursorPos--; } else { while ((CurrentlyEditedText[D_UI.CursorPos] != '\n') && CurrentlyEditedText[D_UI.CursorPos]) { D_UI.CursorPos++; }; } } if (wParam == VK_DOWN) D_UI.CursorPos = D_UI.CursorPosDown; if (wParam == VK_INSERT) D_UI.InsertMode ^= 1; //if (wParam == VK_PRIOR) D_UI.CursorPos = D_UI.CursorPosDown; if (wParam == VK_PRIOR) { s32 LineCounter,LineNumber; /* advance cursor of imagesy / 16 lignes */ LineCounter = 0; LineNumber = (pTG->Image.SY / 16) - 4; if (LineNumber < 0) LineNumber = 1; while ((D_UI.CursorPos) && (LineCounter < LineNumber)) { if (CurrentlyEditedText[D_UI.CursorPos] == '\n') LineCounter++; D_UI.CursorPos--; } } if (wParam == VK_NEXT) { s32 LineCounter,LineNumber; /* advance cursor of imagesy / 16 lignes */ LineCounter = 0; LineNumber = (pTG->Image.SY / 16) - 4; if (LineNumber < 0) LineNumber = 1; while ((CurrentlyEditedText[D_UI.CursorPos]) && (LineCounter < LineNumber)) { if (CurrentlyEditedText[D_UI.CursorPos] == '\n') LineCounter++; D_UI.CursorPos++; } if (!CurrentlyEditedText[D_UI.CursorPos]) if(D_UI.CursorPos) D_UI.CursorPos-- ; } if (wParam == VK_BACK) { if (!ProcessSel(NULL)) { u32 Coun = D_UI.CursorPos; if (Coun) { Coun--; D_UI.CursorPos--; while (CurrentlyEditedText[Coun]) { CurrentlyEditedText[Coun] = CurrentlyEditedText[Coun+1]; Coun++; } CurrentlyEditedText[Coun] = 0; } } } if (wParam == VK_DELETE) { if (!ProcessSel(NULL)) { u32 Coun = D_UI.CursorPos; if (CurrentlyEditedText[Coun]) { while (CurrentlyEditedText[Coun]) { CurrentlyEditedText[Coun] = CurrentlyEditedText[Coun+1]; Coun++; } CurrentlyEditedText[Coun] = 0; } } } if (wParam == VK_SHIFT) D_UI.SelStart = D_UI.SelEnd = D_UI.CursorPos; else if (!(GetAsyncKeyState(VK_SHIFT) & 0x8000)) { D_UI.SelStart = D_UI.SelEnd = D_UI.CursorPos; } else D_UI.SelEnd = D_UI.CursorPos; UpdateText(); } return 1; } break; case WM_CHAR: if (pTG) { if (wParam == '\r') wParam = '\n'; if (strlen(CurrentlyEditedText) <= sizeof(CurrentlyEditedText)-1) { if (((wParam >= 32) && (wParam <= 255)) || ((wParam == '\n') && (pTG->TT.Multiline))) { char Swap,Swap2; u32 Coun; ProcessSel(NULL); if (D_UI.InsertMode) { if (!CurrentlyEditedText[D_UI.CursorPos]) CurrentlyEditedText[D_UI.CursorPos+1] = 0; CurrentlyEditedText[D_UI.CursorPos] = (char)wParam; D_UI.CursorPos++; } else { Coun = D_UI.CursorPos; Swap = CurrentlyEditedText[Coun]; CurrentlyEditedText[Coun] = (char)wParam; while (CurrentlyEditedText[Coun]) { Swap2 = CurrentlyEditedText[Coun+1]; CurrentlyEditedText[Coun+1] = Swap; Swap = Swap2; Coun++; } CurrentlyEditedText[Coun] = 0; D_UI.CursorPos++; } }//*/ } UpdateText(); } break; case WM_KEYUP: if (pTG) { D_UI.Birth = timeGetTime(); } break; case WM_KILLFOCUS: LooseFocus(); break; case WM_LBUTTONDOWN: u32 ulLooseFocus; ulLooseFocus = 1; if (PickReportFinal.CollidedMediaName[0] == 0) { for (u32 Counter = 0 ; Counter < MAX_INPMED ; Counter++) { if (ID_MEDIA[Counter] && (&ID_MEDIA[Counter]->Image == PickReportFinal.CollidedMap)) { strcpy((char*)PickReportFinal.CollidedMediaName,(char*)ID_MEDIA[Counter]->MediaName); strcpy((char*)PickReportFinal.CollidedMediaNickname,(char*)ID_MEDIA[Counter]->Nickname); Counter = MAX_INPMED; } } } if (*PickReportFinal.PickingClass && PickReportFinal.CollidedMediaName) { UnicID MediaIndex; MediaIndex = MediaDico.IsExist(PickReportFinal.CollidedMediaName); if (MediaIndex != -1) { MediaIndex = MediaDico.mpst_Dico[MediaIndex].AssociatedValue; ulLooseFocus = 0; if (ID_MEDIA[MediaIndex] && (ID_MEDIA[MediaIndex]->GetType() == IOtype_TEXT) && (((TEXT_Grabber *)ID_MEDIA[MediaIndex])->TT.Editable)&&(pTG!=ID_MEDIA[MediaIndex])) { LooseFocus(); GetTextFocus((TEXT_Grabber *)ID_MEDIA[MediaIndex]); } else if (pTG!=ID_MEDIA[MediaIndex]) ulLooseFocus = 1; } } if (pTG && ulLooseFocus) { LooseFocus(); return 0; } if (pTG) { if (timeGetTime() - LastClickTime < 500) // Double CLick !! { D_UI.SelStart = D_UI.SelEnd = D_UI.CursorPos = D_UI.MouseToCursor; while (D_UI.SelStart && (CurrentlyEditedText[D_UI.SelStart-1] != ' ') && (CurrentlyEditedText[D_UI.SelStart-1] != '\n') ) {D_UI.SelStart--;}; if (D_UI.SelStart == 1) D_UI.SelStart = 0; while (CurrentlyEditedText[D_UI.SelEnd] && (CurrentlyEditedText[D_UI.SelEnd] != ' ') && (CurrentlyEditedText[D_UI.SelEnd] != '\n') ) {D_UI.SelEnd++;}; D_UI.CursorPos = D_UI.SelStart; } else { D_UI.Birth = timeGetTime(); D_UI.MouseX = PickReportFinal.PickingCoordUV.x; D_UI.MouseY = PickReportFinal.PickingCoordUV.y; UpdateText(); if (GetAsyncKeyState(VK_SHIFT) & 0x8000) D_UI.SelStart = D_UI.CursorPos = D_UI.MouseToCursor; else D_UI.SelStart = D_UI.CursorPos = D_UI.SelEnd = D_UI.MouseToCursor; } LastClickTime = timeGetTime(); } break; case WM_MOUSEMOVE: //if (timeGetTime() - LastClickTime > 100) { if (pTG && (GetAsyncKeyState(VK_LBUTTON) & 0x8000)) { D_UI.Birth = timeGetTime(); D_UI.MouseX = PickReportFinal.PickingCoordUV.x; D_UI.MouseY = PickReportFinal.PickingCoordUV.y; D_UI.SelStart = D_UI.CursorPos = D_UI.MouseToCursor; } } break; } return 0; } void WORLD::InputHookPickEnd() { if (pTG) D_UI.Age = timeGetTime() - D_UI.Birth; }