#define ABOUTBOX2 -1\r
\r
int dialogItems[][40] = {\r
-{ ABOUTBOX, IDOK, 400 }, \r
+{ ABOUTBOX, IDOK, OPT_MESS, 400 }, \r
{ DLG_TimeControl, IDC_Babble, OPT_TCUseMoves, OPT_TCUseInc, OPT_TCUseFixed, \r
OPT_TCtext1, OPT_TCtext2, OPT_TCitext1, OPT_TCitext2, OPT_TCftext, GPB_Factors, IDC_Factor1, IDC_Factor2, IDOK, IDCANCEL }, \r
{ DLG_LoadOptions, OPT_Autostep, OPT_AStext1, IDOK, IDCANCEL }, \r
OPT_AutoFlipView, OPT_ShowButtonBar, OPT_AutoRaiseBoard, OPT_ShowCoordinates,\r
OPT_Blindfold, OPT_ShowThinking, OPT_HighlightDragging, OPT_TestLegality,\r
OPT_SaveExtPGN, OPT_HideThinkFromHuman, OPT_ExtraInfoInMoveHistory,\r
- OPT_HighlightMoveArrow, OPT_AutoLogo }, \r
+ OPT_HighlightMoveArrow, OPT_AutoLogo ,OPT_SmartMove }, \r
{ DLG_IcsOptions, IDOK, IDCANCEL, OPT_AutoComment, OPT_AutoKibitz, OPT_AutoObserve,\r
OPT_GetMoveList, OPT_LocalLineEditing, OPT_QuietPlay, OPT_SeekGraph, OPT_AutoRefresh,\r
OPT_BgObserve, OPT_DualBoard, OPT_Premove, OPT_PremoveWhite, OPT_PremoveBlack,\r
{ // translate all text items in the given dialog\r
int i=0, j, k;\r
char buf[MSG_SIZ], *s;\r
-//if(appData.debugMode) fprintf(debugFP, "Translate(%d)\n", dialogID);\r
if(!barbaric) return;\r
while(dialogItems[i][0] && dialogItems[i][0] != dialogID) i++; // find the dialog description\r
if(dialogItems[i][0] != dialogID) return; // unknown dialog, should not happen\r
GetWindowText( hDlg, buf, MSG_SIZ );\r
s = T_(buf);\r
-//if(appData.debugMode) fprintf(debugFP, "WindowText '%s' -> '%s'\n", buf, s);\r
if(strcmp(buf, s)) SetWindowText(hDlg, s); // replace by translated string (if different)\r
for(j=1; k=dialogItems[i][j]; j++) { // translate all listed dialog items\r
GetDlgItemText(hDlg, k, buf, MSG_SIZ);\r
}\r
}\r
\r
+HMENU\r
+TranslateOneMenu(int i, HMENU subMenu)\r
+{\r
+ int j;\r
+ static MENUITEMINFO info;\r
+\r
+ info.cbSize = sizeof(MENUITEMINFO);\r
+ info.fMask = MIIM_STATE | MIIM_TYPE;\r
+ for(j=GetMenuItemCount(subMenu)-1; j>=0; j--){\r
+ char buf[MSG_SIZ];\r
+ info.dwTypeData = buf;\r
+ info.cch = sizeof(buf);\r
+ GetMenuItemInfo(subMenu, j, TRUE, &info);\r
+ if(i < 10) {
+ if(menuText[i][j]) safeStrCpy(buf, menuText[i][j], sizeof(buf)/sizeof(buf[0]) );\r
+ else menuText[i][j] = strdup(buf); // remember original on first change\r
+ }\r
+ if(buf[0] == NULLCHAR) continue;\r
+ info.dwTypeData = T_(buf);\r
+ info.cch = strlen(buf)+1;\r
+ SetMenuItemInfo(subMenu, j, TRUE, &info);\r
+ }\r
+ return subMenu;\r
+}\r
+\r
void\r
TranslateMenus(int addLanguage)\r
{\r
- int i, j;\r
+ int i;\r
WIN32_FIND_DATA fileData;\r
HANDLE hFind;\r
#define IDM_English 1895\r
HMENU subMenu = GetSubMenu(mainMenu, i);\r
ModifyMenu(mainMenu, i, MF_STRING|MF_BYPOSITION|MF_POPUP|EnableMenuItem(mainMenu, i, MF_BYPOSITION),\r
(UINT) subMenu, T_(menuBarText[tinyLayout][i]));\r
- for(j=GetMenuItemCount(subMenu)-1; j>=0; j--){\r
- char buf[MSG_SIZ];\r
- UINT k = GetMenuItemID(subMenu, j);\r
- if(menuText[i][j])
- safeStrCpy(buf, menuText[i][j], sizeof(buf)/sizeof(buf[0]) ); else {\r
- GetMenuString(subMenu, j, buf, MSG_SIZ, MF_BYPOSITION);\r
- menuText[i][j] = strdup(buf); // remember original on first change\r
- }\r
- if(buf[0] == NULLCHAR) continue;\r
-//fprintf(debugFP, "menu(%d,%d) = %s (%08x, %08x) %d\n", i, j, buf, mainMenu, subMenu, k);\r
- ModifyMenu(subMenu, j, MF_STRING|MF_BYPOSITION\r
- |CheckMenuItem(subMenu, j, MF_BYPOSITION)\r
- |EnableMenuItem(subMenu, j, MF_BYPOSITION), k, T_(buf));\r
- }\r
+ TranslateOneMenu(i, subMenu);\r
}\r
DrawMenuBar(hwndMain);\r
}\r
}\r
\r
JAWS_INIT\r
+ TranslateMenus(1);\r
\r
// InitCommonControlsEx(&ex);\r
InitCommonControls();\r
snprintf(oldUserName, MSG_SIZ, "logos\\%s.bmp", curName);\r
userLogo = LoadImage( 0, oldUserName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
safeStrCpy(oldUserName, curName, sizeof(oldUserName)/sizeof(oldUserName[0]) );\r
+ if(userLogo == NULL)\r
+ userLogo = LoadImage( 0, "logos\\dummy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
}\r
}\r
}\r
}\r
\r
InitDrawingSizes(boardSize, 0);\r
- TranslateMenus(1);\r
InitMenuChecks();\r
buttonCount = GetSystemMetrics(SM_CMOUSEBUTTONS);\r
\r
DeleteDC(tmphdc);\r
}\r
\r
+VOID\r
+DisplayLogos()\r
+{\r
+ if(logoHeight) {\r
+ HDC hdc = GetDC(hwndMain);\r
+ HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo;\r
+ if(appData.autoLogo) {\r
+ \r
+ switch(gameMode) { // pick logos based on game mode\r
+ case IcsObserving:\r
+ whiteLogo = second.programLogo; // ICS logo\r
+ blackLogo = second.programLogo;\r
+ default:\r
+ break;\r
+ case IcsPlayingWhite:\r
+ if(!appData.zippyPlay) whiteLogo = userLogo;\r
+ blackLogo = second.programLogo; // ICS logo\r
+ break;\r
+ case IcsPlayingBlack:\r
+ whiteLogo = second.programLogo; // ICS logo\r
+ blackLogo = appData.zippyPlay ? first.programLogo : userLogo;\r
+ break;\r
+ case TwoMachinesPlay:\r
+ if(first.twoMachinesColor[0] == 'b') {\r
+ whiteLogo = second.programLogo;\r
+ blackLogo = first.programLogo;\r
+ }\r
+ break;\r
+ case MachinePlaysWhite:\r
+ blackLogo = userLogo;\r
+ break;\r
+ case MachinePlaysBlack:\r
+ whiteLogo = userLogo;\r
+ blackLogo = first.programLogo;\r
+ }\r
+ }\r
+ DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo);\r
+ DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo);\r
+ ReleaseDC(hwndMain, hdc);\r
+ }\r
+}\r
+\r
static HDC hdcSeek;\r
\r
// [HGM] seekgraph\r
}\r
}\r
}\r
- if(logoHeight) {\r
- HBITMAP whiteLogo = (HBITMAP) first.programLogo, blackLogo = (HBITMAP) second.programLogo;\r
- if(appData.autoLogo) {\r
- \r
- switch(gameMode) { // pick logos based on game mode\r
- case IcsObserving:\r
- whiteLogo = second.programLogo; // ICS logo\r
- blackLogo = second.programLogo;\r
- default:\r
- break;\r
- case IcsPlayingWhite:\r
- if(!appData.zippyPlay) whiteLogo = userLogo;\r
- blackLogo = second.programLogo; // ICS logo\r
- break;\r
- case IcsPlayingBlack:\r
- whiteLogo = second.programLogo; // ICS logo\r
- blackLogo = appData.zippyPlay ? first.programLogo : userLogo;\r
- break;\r
- case TwoMachinesPlay:\r
- if(first.twoMachinesColor[0] == 'b') {\r
- whiteLogo = second.programLogo;\r
- blackLogo = first.programLogo;\r
- }\r
- break;\r
- case MachinePlaysWhite:\r
- blackLogo = userLogo;\r
- break;\r
- case MachinePlaysBlack:\r
- whiteLogo = userLogo;\r
- blackLogo = first.programLogo;\r
- }\r
- }\r
- DrawLogoOnDC(hdc, leftLogoRect, flipClock ? blackLogo : whiteLogo);\r
- DrawLogoOnDC(hdc, rightLogoRect, flipClock ? whiteLogo : blackLogo);\r
- }\r
\r
if( appData.highlightMoveWithArrow ) {\r
DrawArrowHighlight(hdcmem);\r
&messageRect, messageText, strlen(messageText), NULL);\r
SelectObject(hdc, oldFont);\r
DisplayBothClocks();\r
+ DisplayLogos();\r
}\r
EndPaint(hwnd,&ps);\r
}\r
Translate(hDlg, DLG_PromotionKing);\r
ShowWindow(GetDlgItem(hDlg, PB_King), \r
(!appData.testLegality || gameInfo.variant == VariantSuicide ||\r
+ gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) ||\r
gameInfo.variant == VariantGiveaway || gameInfo.variant == VariantSuper ) ?\r
SW_SHOW : SW_HIDE);\r
/* [HGM] Only allow C & A promotions if these pieces are defined */\r
ShowWindow(GetDlgItem(hDlg, PB_Archbishop),\r
- ((PieceToChar(WhiteAngel) >= 'A' &&\r
+ ((PieceToChar(WhiteAngel) >= 'A' && WhiteOnMove(currentMove) &&\r
PieceToChar(WhiteAngel) != '~') ||\r
- (PieceToChar(BlackAngel) >= 'A' &&\r
+ (PieceToChar(BlackAngel) >= 'A' && !WhiteOnMove(currentMove) &&\r
PieceToChar(BlackAngel) != '~') ) ?\r
SW_SHOW : SW_HIDE);\r
ShowWindow(GetDlgItem(hDlg, PB_Chancellor), \r
- ((PieceToChar(WhiteMarshall) >= 'A' &&\r
+ ((PieceToChar(WhiteMarshall) >= 'A' && WhiteOnMove(currentMove) &&\r
PieceToChar(WhiteMarshall) != '~') ||\r
- (PieceToChar(BlackMarshall) >= 'A' &&\r
+ (PieceToChar(BlackMarshall) >= 'A' && !WhiteOnMove(currentMove) &&\r
PieceToChar(BlackMarshall) != '~') ) ?\r
SW_SHOW : SW_HIDE);\r
/* [HGM] Hide B & R button in Shogi, use Q as promote, N as defer */\r
promoChar = gameInfo.variant == VariantSuper ? PieceToChar(BlackSilver) : PieceToChar(BlackKing);\r
break;\r
case PB_Queen:\r
- promoChar = gameInfo.variant == VariantShogi ? '+' : PieceToChar(BlackQueen);\r
+ promoChar = gameInfo.variant == VariantShogi ? '+' : ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteQueen : BlackQueen));\r
break;\r
case PB_Rook:\r
- promoChar = PieceToChar(BlackRook);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteRook : BlackRook));\r
+ if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) promoChar = PieceToChar(BlackDragon);\r
break;\r
case PB_Bishop:\r
- promoChar = PieceToChar(BlackBishop);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteBishop : BlackBishop));\r
+ if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) promoChar = PieceToChar(BlackAlfil);\r
break;\r
case PB_Chancellor:\r
- promoChar = PieceToChar(BlackMarshall);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteMarshall : BlackMarshall));\r
break;\r
case PB_Archbishop:\r
- promoChar = PieceToChar(BlackAngel);\r
+ promoChar = ToLower(PieceToChar(WhiteOnMove(currentMove) ? WhiteAngel : BlackAngel));\r
break;\r
case PB_Knight:\r
- promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(BlackKnight);\r
+ promoChar = gameInfo.variant == VariantShogi ? '=' : PieceToChar(WhiteOnMove(currentMove) ? WhiteKnight : BlackKnight);\r
break;\r
default:\r
return FALSE;\r
}\r
+ if(promoChar == '.') return FALSE; // invalid piece chosen \r
EndDialog(hDlg, TRUE); /* Exit the dialog */\r
- /* [HGM] <popupFix> Call FinishMove rather than UserMoveEvent, as we\r
- only show the popup when we are already sure the move is valid or\r
- legal. We pass a faulty move type, but the kludge is that FinishMove\r
- will figure out it is a promotion from the promoChar. */\r
UserMoveEvent(fromX, fromY, toX, toY, promoChar);\r
fromX = fromY = -1;\r
if (!appData.highlightLastMove) {\r
matchMode = 2;// distinguish from command-line-triggered case (matchMode=1)\r
appData.matchGames = appData.defaultMatchGames;\r
matchGame = 1;\r
+ first.matchWins = second.matchWins = 0;\r
\r
case IDM_TwoMachines:\r
TwoMachinesEvent();\r
break;\r
\r
case IDM_EditGame:\r
+ case IDM_EditGame2:\r
EditGameEvent();\r
SAY("edit game");\r
break;\r
\r
case IDM_EditPosition:\r
+ case IDM_EditPosition2:\r
EditPositionEvent();\r
SAY("enter a FEN string or setup a position on the board using the control R pop up menu");\r
break;\r
ShowGameListProc();\r
break;\r
\r
+ case IDM_EditProgs1:\r
+ EditTagsPopUp(firstChessProgramNames, &firstChessProgramNames);\r
+ break;\r
+\r
+ case IDM_EditProgs2:\r
+ EditTagsPopUp(secondChessProgramNames, &secondChessProgramNames);\r
+ break;\r
+\r
+ case IDM_EditServers:\r
+ EditTagsPopUp(icsNames, &icsNames);\r
+ break;\r
+\r
case IDM_EditTags:\r
case IDM_Tags:\r
EditTagsProc();\r
case IDM_FlipClock:\r
flipClock = !flipClock;\r
DisplayBothClocks();\r
- DrawPosition(FALSE, NULL);\r
+ DisplayLogos();\r
break;\r
\r
case IDM_MuteSounds:\r
* menu that TrackPopupMenu displays.\r
*/\r
hmenuTrackPopup = GetSubMenu(hmenu, 0);\r
+ TranslateOneMenu(10, hmenuTrackPopup);\r
\r
SetMenuDefaultItem(hmenuTrackPopup, def, FALSE);\r
\r
sizeY = newSizeY;\r
}\r
}\r
- SendDlgItemMessage( hDlg, OPT_CommentText, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS );\r
+ SendDlgItemMessage( hDlg, OPT_CommentText, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_KEYEVENTS );\r
return FALSE;\r
\r
case WM_COMMAND: /* message: received a command */\r
if( wParam == OPT_CommentText ) {\r
MSGFILTER * lpMF = (MSGFILTER *) lParam;\r
\r
- if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ) {\r
+ if( lpMF->msg == WM_RBUTTONDOWN && (lpMF->wParam & (MK_CONTROL | MK_SHIFT)) == 0 ||\r
+ lpMF->msg == WM_CHAR && lpMF->wParam == '\022' ) {\r
POINTL pt;\r
LRESULT index;\r
\r
pt.x = LOWORD( lpMF->lParam );\r
pt.y = HIWORD( lpMF->lParam );\r
\r
+ if(lpMF->msg == WM_CHAR) {\r
+ CHARRANGE sel;\r
+ SendDlgItemMessage( hDlg, OPT_CommentText, EM_EXGETSEL, 0, (LPARAM) &sel );\r
+ index = sel.cpMin;\r
+ } else\r
index = SendDlgItemMessage( hDlg, OPT_CommentText, EM_CHARFROMPOS, 0, (LPARAM) &pt );\r
\r
hwndText = GetDlgItem(hDlg, OPT_CommentText); // cloned from above\r
case WM_COMMAND:\r
switch (LOWORD(wParam)) {\r
case IDOK:
+\r
shiftKey = GetKeyState(VK_SHIFT) < 0; // [HGM] remember last shift status\r
GetDlgItemText(hDlg, OPT_Move, move, sizeof(move));\r
{ int n; Board board;\r
switch (message) {\r
case WM_KEYDOWN:\r
if (!(GetKeyState(VK_CONTROL) & ~1)) break;\r
+ if(wParam=='R') return 0;\r
switch (wParam) {\r
case VK_PRIOR:\r
SendMessage(hwnd, EM_LINESCROLL, 0, -999999);\r
SendMessage(hInput, message, wParam, lParam);\r
}\r
return 0;\r
- } // [HGM] navigate: for Ctrl+R, flow into nex case (moved up here) to summon up menu\r
+ } // [HGM] navigate: for Ctrl+R, flow into next case (moved up here) to summon up menu\r
+ lParam = -1;\r
case WM_RBUTTONDOWN:\r
if (!(GetKeyState(VK_SHIFT) & ~1)) {\r
/* Move selection here if it was empty */\r
pt.y = HIWORD(lParam);\r
SendMessage(hwnd, EM_EXGETSEL, 0, (LPARAM)&sel);\r
if (sel.cpMin == sel.cpMax) {\r
- sel.cpMin = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&pt); /*doc is wrong*/\r
+ if(lParam != -1) sel.cpMin = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&pt); /*doc is wrong*/\r
sel.cpMax = sel.cpMin;\r
SendMessage(hwnd, EM_EXSETSEL, 0, (LPARAM)&sel);\r
}\r
MF_BYCOMMAND|MF_UNCHECKED);\r
}\r
}\r
+ DisplayLogos(); // [HGM] logos: mode change could have altered logos\r
}\r
\r
VOID\r