2 * wedittags.c -- EditTags window for WinBoard
\r
4 * Copyright 1995, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Free
\r
5 * Software Foundation, Inc.
\r
7 * Enhancements Copyright 2005 Alessandro Scotti
\r
9 * ------------------------------------------------------------------------
\r
11 * GNU XBoard is free software: you can redistribute it and/or modify
\r
12 * it under the terms of the GNU General Public License as published by
\r
13 * the Free Software Foundation, either version 3 of the License, or (at
\r
14 * your option) any later version.
\r
16 * GNU XBoard is distributed in the hope that it will be useful, but
\r
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
\r
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
19 * General Public License for more details.
\r
21 * You should have received a copy of the GNU General Public License
\r
22 * along with this program. If not, see http://www.gnu.org/licenses/. *
\r
24 *------------------------------------------------------------------------
\r
25 ** See the file ChangeLog for a revision history. */
\r
29 #include <windows.h> /* required for all Windows applications */
\r
30 #include <richedit.h>
\r
36 #include <commdlg.h>
\r
40 #include "frontend.h"
\r
41 #include "backend.h"
\r
42 #include "winboard.h"
\r
46 /* Module globals */
\r
47 static char *editTagsText, **resPtr;
\r
49 BOOL editTagsUp = FALSE;
\r
50 BOOL canEditTags = FALSE;
\r
52 /* Imports from winboard.c */
\r
53 extern HINSTANCE hInst;
\r
54 extern HWND hwndMain;
\r
55 extern BoardSize boardSize;
\r
58 EditTagsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
\r
60 static HANDLE hwndText;
\r
61 static int sizeX, sizeY;
\r
62 int len, newSizeX, newSizeY;
\r
69 case WM_INITDIALOG: /* message: initialize dialog box */
\r
70 /* Initialize the dialog items */
\r
71 Translate(hDlg, DLG_EditTags);
\r
72 hwndText = memo = GetDlgItem(hDlg, OPT_TagsText);
\r
73 SendMessage(hwndText, WM_SETFONT,
\r
74 (WPARAM)font[boardSize][EDITTAGS_FONT]->hf, MAKELPARAM(FALSE, 0));
\r
75 SetDlgItemText(hDlg, OPT_TagsText, editTagsText);
\r
76 EnableWindow(GetDlgItem(hDlg, OPT_TagsCancel), canEditTags);
\r
77 EnableWindow(GetDlgItem(hDlg, OPT_EditTags), !canEditTags || bookUp);
\r
78 SendMessage(hwndText, EM_SETREADONLY, !canEditTags, 0);
\r
80 SetDlgItemText(hDlg, OPT_EditTags, _("&Play Move"));
\r
81 SetWindowText(hDlg, _("Edit Book"));
\r
85 SetWindowText(hDlg, _("Edit Tags"));
\r
88 SetWindowText(hDlg, _("Tags"));
\r
89 SetFocus(GetDlgItem(hDlg, IDOK));
\r
91 if (!editTagsDialog) {
\r
92 editTagsDialog = hDlg;
\r
93 GetClientRect(hDlg, &rect);
\r
95 sizeY = rect.bottom;
\r
96 SendDlgItemMessage( hDlg, OPT_TagsText, EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS );
\r
97 if (wpTags.x != CW_USEDEFAULT && wpTags.y != CW_USEDEFAULT &&
\r
98 wpTags.width != CW_USEDEFAULT && wpTags.height != CW_USEDEFAULT) {
\r
100 EnsureOnScreen(&wpTags.x, &wpTags.y, 0, 0);
\r
101 wp.length = sizeof(WINDOWPLACEMENT);
\r
103 wp.showCmd = SW_SHOW;
\r
104 wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;
\r
105 wp.rcNormalPosition.left = wpTags.x;
\r
106 wp.rcNormalPosition.right = wpTags.x + wpTags.width;
\r
107 wp.rcNormalPosition.top = wpTags.y;
\r
108 wp.rcNormalPosition.bottom = wpTags.y + wpTags.height;
\r
109 SetWindowPlacement(hDlg, &wp);
\r
111 GetClientRect(hDlg, &rect);
\r
112 newSizeX = rect.right;
\r
113 newSizeY = rect.bottom;
\r
114 ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY,
\r
115 newSizeX, newSizeY);
\r
123 switch (LOWORD(wParam)) {
\r
128 /* Read changed options from the dialog box */
\r
129 len = GetWindowTextLength(hwndText);
\r
130 str = (char *) malloc(len + 1);
\r
131 GetWindowText(hwndText, str, len + 1);
\r
139 *p = NULLCHAR; err = 0;
\r
140 if(resPtr) *resPtr = strdup(str); else
\r
141 if(bookUp) SaveToBook(str), DisplayBook(currentMove); else
\r
142 err = ReplaceTags(str, &gameInfo);
\r
143 if (err) DisplayError(_("Error replacing tags."), err);
\r
147 if(LOWORD(wParam) == IDOK) TagsPopDown();
\r
151 case OPT_TagsCancel:
\r
156 if(bookUp) addToBookFlag = !addToBookFlag; else
\r
165 case WM_NOTIFY: // [HGM] vari: cloned from whistory.c
\r
166 if( wParam == OPT_TagsText ) {
\r
167 MSGFILTER * lpMF = (MSGFILTER *) lParam;
\r
169 if( lpMF->msg == WM_RBUTTONDOWN ) {
\r
173 pt.x = LOWORD( lpMF->lParam );
\r
174 pt.y = HIWORD( lpMF->lParam );
\r
176 index = SendDlgItemMessage( hDlg, OPT_TagsText, EM_CHARFROMPOS, 0, (LPARAM) &pt );
\r
178 hwndText = GetDlgItem(hDlg, OPT_TagsText); // cloned from above
\r
179 len = GetWindowTextLength(hwndText);
\r
180 str = (char *) malloc(len + 1);
\r
181 GetWindowText(hwndText, str, len + 1);
\r
182 if(bookUp) PlayBookMove(str, index);
\r
185 /* Zap the message for good: apparently, returning non-zero is not enough */
\r
186 lpMF->msg = WM_USER;
\r
194 newSizeX = LOWORD(lParam);
\r
195 newSizeY = HIWORD(lParam);
\r
196 ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY);
\r
201 case WM_GETMINMAXINFO:
\r
202 /* Prevent resizing window too small */
\r
203 mmi = (MINMAXINFO *) lParam;
\r
204 mmi->ptMinTrackSize.x = 100;
\r
205 mmi->ptMinTrackSize.y = 100;
\r
211 VOID AddBookMove(char *text)
\r
213 SendMessage( memo, EM_SETSEL, 999999, 999999 ); // [HGM] multivar: choose insertion point
\r
214 SendMessage( memo, EM_REPLACESEL, (WPARAM) FALSE, (LPARAM) text );
\r
217 VOID TagsPopDown(void)
\r
219 if (editTagsDialog) ShowWindow(editTagsDialog, SW_HIDE);
\r
220 CheckMenuItem(GetMenu(hwndMain), IDM_Tags, MF_UNCHECKED);
\r
221 editTagsUp = bookUp = addToBookFlag = FALSE;
\r
225 VOID EitherTagsPopUp(char *tags, char *msg, BOOLEAN edit)
\r
230 if (msg == NULL) msg = "";
\r
231 p = (char *) malloc(2 * (strlen(tags) + strlen(msg)) + 2);
\r
234 if (*tags == '\n') *q++ = '\r';
\r
237 if (*msg != NULLCHAR) {
\r
241 if (*msg == '\n') *q++ = '\r';
\r
246 if (editTagsText != NULL) free(editTagsText);
\r
248 canEditTags = edit;
\r
250 CheckMenuItem(GetMenu(hwndMain), IDM_Tags, MF_CHECKED);
\r
251 if (editTagsDialog) {
\r
252 SendMessage(editTagsDialog, WM_INITDIALOG, 0, 0);
\r
253 ShowWindow(editTagsDialog, SW_SHOW);
\r
254 if(bookUp) SetFocus(hwndMain);
\r
256 lpProc = MakeProcInstance((FARPROC)EditTagsDialog, hInst);
\r
257 CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditTags),
\r
258 hwndMain, (DLGPROC)lpProc);
\r
259 FreeProcInstance(lpProc);
\r
264 VOID TagsPopUp(char *tags, char *msg)
\r
266 HWND hwnd = GetActiveWindow();
\r
267 EitherTagsPopUp(tags, msg, FALSE);
\r
268 SetActiveWindow(hwnd);
\r
271 VOID EditTagsPopUp(char *tags, char **dest)
\r
274 EitherTagsPopUp(tags, "", TRUE);
\r
277 VOID EditTagsProc()
\r
279 if (editTagsUp && !bookUp) {
\r