Display PV right-clicked from EngineOutput window
authorH.G. Muller <h.g.muller@hccnet.nl>
Fri, 8 Jan 2010 10:41:26 +0000 (11:41 +0100)
committerArun Persaud <arun@nubati.net>
Tue, 12 Jan 2010 04:03:35 +0000 (20:03 -0800)
The clicked PV is selected and the memo gets focus, so that it is
highlighted. This selection is restored in the proper place after
insetrtion of a new line in the memo.

backend.c
backend.h
winboard/wengineoutput.c

index 9cfb1a2..741a93b 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -4433,21 +4433,39 @@ fprintf(debugFP,"parsePV: %d %c%c%c%c '%s'\n", valid, fromX+AAA, fromY+ONE, toX+
     moveList[endPV-1][3] = toY + ONE;
     parseList[endPV-1][0] = NULLCHAR;
   } while(valid);
+  currentMove = endPV;
+  if(currentMove == forwardMostMove) ClearPremoveHighlights(); else
+  SetPremoveHighlights(moveList[currentMove-1][0]-AAA, moveList[currentMove-1][1]-ONE,
+                       moveList[currentMove-1][2]-AAA, moveList[currentMove-1][3]-ONE);
+  DrawPosition(TRUE, boards[currentMove]);
 }
 
 static int lastX, lastY;
 
+Boolean
+LoadMultiPV(int x, int y, char *buf, int index, int *start, int *end)
+{
+       int startPV;
+
+       if(index < 0 || index >= strlen(buf)) return FALSE; // sanity
+       lastX = x; lastY = y;
+       while(index > 0 && buf[index-1] != '\n') index--; // beginning of line
+       startPV = index;
+      while(buf[index] != '\n') if(buf[index++] == '\t') startPV = index;
+      index = startPV;
+       while(buf[index] && buf[index] != '\n') index++;
+       buf[index] = 0;
+       ParsePV(buf+startPV);
+       *start = startPV; *end = index-1;
+       return TRUE;
+}
+
 Boolean
 LoadPV(int x, int y)
 { // called on right mouse click to load PV
   int which = gameMode == TwoMachinesPlay && (WhiteOnMove(forwardMostMove) == (second.twoMachinesColor[0] == 'w'));
   lastX = x; lastY = y;
   ParsePV(lastPV[which]); // load the PV of the thinking engine in the boards array.
-  currentMove = endPV;
-  if(currentMove == forwardMostMove) ClearPremoveHighlights(); else
-  SetPremoveHighlights(moveList[currentMove-1][0]-AAA, moveList[currentMove-1][1]-ONE,
-                       moveList[currentMove-1][2]-AAA, moveList[currentMove-1][3]-ONE);
-  DrawPosition(TRUE, boards[currentMove]);
   return TRUE;
 }
 
index ccfd91e..e38297f 100644 (file)
--- a/backend.h
+++ b/backend.h
@@ -206,6 +206,7 @@ void OutputChatMessage P((int partner, char *mess));
 void EditPositionDone P((Boolean fakeRights));
 Boolean GetArgValue P((char *name));
 Boolean LoadPV P((int x, int y));
+Boolean LoadMultiPV P((int x, int y, char *buf, int index, int *start, int *end));
 void UnLoadPV P(());
 void MovePV P((int x, int y, int h));
 
index bb51525..2acb145 100644 (file)
@@ -223,12 +223,39 @@ void ResizeWindowControls( int mode )
     InvalidateRect( GetDlgItem(hDlg,IDC_EngineMemo2), NULL, FALSE );\r
 }\r
 \r
+static int currentPV, highTextStart[2], highTextEnd[2];\r
+extern RECT boardRect;\r
+\r
+VOID\r
+GetMemoLine(HWND hDlg, int x, int y)\r
+{      // [HGM] pv: translate click to PV line, and load it for display\r
+       char buf[10000];\r
+       int index, start, end, memo;\r
+       POINT pt;\r
+\r
+       pt.x = x; pt.y = y;\r
+       memo = currentPV ? IDC_EngineMemo2 : IDC_EngineMemo1;\r
+       index = SendDlgItemMessage( hDlg, memo, EM_CHARFROMPOS, 0, (LPARAM) &pt );\r
+       GetDlgItemText(hDlg, memo, buf, sizeof(buf));\r
+       if(LoadMultiPV(x, y, buf, index, &start, &end)) {\r
+           SetCapture(hDlg);\r
+           SendMessage( outputField[currentPV][nMemo], EM_SETSEL, (WPARAM)start, (LPARAM)end );\r
+           highTextStart[currentPV] = start; highTextEnd[currentPV] = end;\r
+           SetFocus(outputField[currentPV][nMemo]);\r
+       }\r
+}\r
+\r
 // front end. Actual printing of PV lines into the output field\r
 void InsertIntoMemo( int which, char * text, int where )\r
 {\r
     SendMessage( outputField[which][nMemo], EM_SETSEL, where, where ); // [HGM] multivar: choose insertion point\r
 \r
     SendMessage( outputField[which][nMemo], EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text );\r
+    if(where < highTextStart[which]) { // [HGM] multiPVdisplay: move highlighting\r
+       int len = strlen(text);\r
+       highTextStart[which] += len; highTextEnd[which] += len;\r
+       SendMessage( outputField[which][nMemo], EM_SETSEL, highTextStart[which], highTextEnd[which] );\r
+    }\r
 }\r
 \r
 // front end. Associates an icon with an output field ("control" in Windows jargon).\r
@@ -261,6 +288,9 @@ LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARA
 \r
             ResizeWindowControls( windowMode );\r
 \r
+            SendDlgItemMessage( hDlg, IDC_EngineMemo1, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS );\r
+            SendDlgItemMessage( hDlg, IDC_EngineMemo2, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS );\r
+\r
            /* Set font */\r
            SendDlgItemMessage( engineOutputDialog, IDC_EngineMemo1, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 ));\r
            SendDlgItemMessage( engineOutputDialog, IDC_EngineMemo2, WM_SETFONT, (WPARAM)font[boardSize][MOVEHISTORY_FONT]->hf, MAKELPARAM(TRUE, 0 ));\r
@@ -287,6 +317,27 @@ LRESULT CALLBACK EngineOutputProc( HWND hDlg, UINT message, WPARAM wParam, LPARA
 \r
         break;\r
 \r
+    case WM_MOUSEMOVE:\r
+        MovePV(LOWORD(lParam) - boardRect.left, HIWORD(lParam) - boardRect.top, boardRect.bottom - boardRect.top);\r
+        break;\r
+\r
+    case WM_RBUTTONUP:\r
+        ReleaseCapture();\r
+        SendMessage( outputField[currentPV][nMemo], EM_SETSEL, 0, 0 );\r
+        highTextStart[currentPV] = highTextEnd[currentPV] = 0;\r
+        UnLoadPV();\r
+        break;\r
+\r
+    case WM_NOTIFY:\r
+        if( wParam == IDC_EngineMemo1 || wParam == IDC_EngineMemo2 ) {\r
+            MSGFILTER * lpMF = (MSGFILTER *) lParam;\r
+            if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) {\r
+                currentPV = (wParam == IDC_EngineMemo2);\r
+                GetMemoLine(hDlg, LOWORD(lpMF->lParam), HIWORD(lpMF->lParam));\r
+            }\r
+        }\r
+        break;\r
+\r
     case WM_GETMINMAXINFO:\r
         {\r
             MINMAXINFO * mmi = (MINMAXINFO *) lParam;\r