worked on premove bug
[xboard.git] / winboard / wedittags.c
1 /*\r
2  * wedittags.c -- EditTags window for WinBoard\r
3  *\r
4  * Copyright 1995,2009 Free Software Foundation, Inc.\r
5  *\r
6  * Enhancements Copyright 2005 Alessandro Scotti\r
7  *\r
8  * ------------------------------------------------------------------------\r
9  *\r
10  * GNU XBoard is free software: you can redistribute it and/or modify\r
11  * it under the terms of the GNU General Public License as published by\r
12  * the Free Software Foundation, either version 3 of the License, or (at\r
13  * your option) any later version.\r
14  *\r
15  * GNU XBoard is distributed in the hope that it will be useful, but\r
16  * WITHOUT ANY WARRANTY; without even the implied warranty of\r
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
18  * General Public License for more details.\r
19  *\r
20  * You should have received a copy of the GNU General Public License\r
21  * along with this program. If not, see http://www.gnu.org/licenses/.  *\r
22  *\r
23  *------------------------------------------------------------------------\r
24  ** See the file ChangeLog for a revision history.  */\r
25 \r
26 #include "config.h"\r
27 \r
28 #include <windows.h>   /* required for all Windows applications */\r
29 #include <stdio.h>\r
30 #include <stdlib.h>\r
31 #include <malloc.h>\r
32 #include <fcntl.h>\r
33 #include <math.h>\r
34 #include <commdlg.h>\r
35 #include <dlgs.h>\r
36 \r
37 #include "common.h"\r
38 #include "winboard.h"\r
39 #include "frontend.h"\r
40 #include "backend.h"\r
41 #include "wedittags.h"\r
42 \r
43 /* Module globals */\r
44 static char *editTagsText;\r
45 HWND editTagsDialog = NULL;\r
46 BOOL editTagsUp = FALSE;\r
47 BOOL canEditTags = FALSE;\r
48 int editTagsX, editTagsY, editTagsW, editTagsH;\r
49 \r
50 /* Imports from winboard.c */\r
51 extern HINSTANCE hInst;\r
52 extern HWND hwndMain;\r
53 extern BoardSize boardSize;\r
54 \r
55 LRESULT CALLBACK\r
56 EditTagsDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
57 {\r
58   static HANDLE hwndText;\r
59   static int sizeX, sizeY;\r
60   int len, newSizeX, newSizeY, flags;\r
61   char *str;\r
62   RECT rect;\r
63   MINMAXINFO *mmi;\r
64   int err;\r
65   \r
66   switch (message) {\r
67   case WM_INITDIALOG: /* message: initialize dialog box */\r
68     /* Initialize the dialog items */\r
69     hwndText = GetDlgItem(hDlg, OPT_TagsText);\r
70     SendMessage(hwndText, WM_SETFONT, \r
71       (WPARAM)font[boardSize][EDITTAGS_FONT]->hf, MAKELPARAM(FALSE, 0));\r
72     SetDlgItemText(hDlg, OPT_TagsText, editTagsText);\r
73     EnableWindow(GetDlgItem(hDlg, OPT_TagsCancel), canEditTags);\r
74     EnableWindow(GetDlgItem(hDlg, OPT_EditTags), !canEditTags);\r
75     SendMessage(hwndText, EM_SETREADONLY, !canEditTags, 0);\r
76     if (canEditTags) {\r
77       SetWindowText(hDlg, "Edit Tags");\r
78       SetFocus(hwndText);\r
79     } else {\r
80       SetWindowText(hDlg, "Tags");\r
81       SetFocus(GetDlgItem(hDlg, IDOK));\r
82     }\r
83     if (!editTagsDialog) {\r
84       editTagsDialog = hDlg;\r
85       flags = SWP_NOZORDER;\r
86       GetClientRect(hDlg, &rect);\r
87       sizeX = rect.right;\r
88       sizeY = rect.bottom;\r
89       if (editTagsX != CW_USEDEFAULT && editTagsY != CW_USEDEFAULT &&\r
90           editTagsW != CW_USEDEFAULT && editTagsH != CW_USEDEFAULT) {\r
91         WINDOWPLACEMENT wp;\r
92         EnsureOnScreen(&editTagsX, &editTagsY, 0, 0);\r
93         wp.length = sizeof(WINDOWPLACEMENT);\r
94         wp.flags = 0;\r
95         wp.showCmd = SW_SHOW;\r
96         wp.ptMaxPosition.x = wp.ptMaxPosition.y = 0;\r
97         wp.rcNormalPosition.left = editTagsX;\r
98         wp.rcNormalPosition.right = editTagsX + editTagsW;\r
99         wp.rcNormalPosition.top = editTagsY;\r
100         wp.rcNormalPosition.bottom = editTagsY + editTagsH;\r
101         SetWindowPlacement(hDlg, &wp);\r
102 \r
103         GetClientRect(hDlg, &rect);\r
104         newSizeX = rect.right;\r
105         newSizeY = rect.bottom;\r
106         ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY,\r
107                               newSizeX, newSizeY);\r
108         sizeX = newSizeX;\r
109         sizeY = newSizeY;\r
110       }\r
111     }\r
112     return FALSE;\r
113     \r
114   case WM_COMMAND:\r
115     switch (LOWORD(wParam)) {\r
116     case IDOK:\r
117       if (canEditTags) {\r
118         char *p, *q;\r
119         /* Read changed options from the dialog box */\r
120         len = GetWindowTextLength(hwndText);\r
121         str = (char *) malloc(len + 1);\r
122         GetWindowText(hwndText, str, len + 1);\r
123         p = q = str;\r
124         while (*q) {\r
125           if (*q == '\r'|| *q == '\n')\r
126             q++;\r
127           else\r
128             *p++ = *q++;\r
129         }\r
130         *p = NULLCHAR;\r
131         err = ReplaceTags(str, &gameInfo);\r
132         if (err) DisplayError("Error replacing tags.", err);\r
133 \r
134         free(str);\r
135       }\r
136       TagsPopDown();\r
137       return TRUE;\r
138       \r
139     case IDCANCEL:\r
140     case OPT_TagsCancel:\r
141       TagsPopDown();\r
142       return TRUE;\r
143       \r
144     case OPT_EditTags:\r
145       EditTagsEvent();\r
146       return TRUE;\r
147 \r
148     default:\r
149       break;\r
150     }\r
151     break;\r
152 \r
153   case WM_SIZE:\r
154     newSizeX = LOWORD(lParam);\r
155     newSizeY = HIWORD(lParam);\r
156     ResizeEditPlusButtons(hDlg, hwndText, sizeX, sizeY, newSizeX, newSizeY);\r
157     sizeX = newSizeX;\r
158     sizeY = newSizeY;\r
159     break;\r
160 \r
161   case WM_GETMINMAXINFO:\r
162     /* Prevent resizing window too small */\r
163     mmi = (MINMAXINFO *) lParam;\r
164     mmi->ptMinTrackSize.x = 100;\r
165     mmi->ptMinTrackSize.y = 100;\r
166     break;\r
167   }\r
168   return FALSE;\r
169 }\r
170 \r
171 VOID TagsPopDown(void)\r
172 {\r
173   if (editTagsDialog) ShowWindow(editTagsDialog, SW_HIDE);\r
174   CheckMenuItem(GetMenu(hwndMain), IDM_EditTags, MF_UNCHECKED);\r
175   editTagsUp = FALSE;\r
176 }\r
177 \r
178 \r
179 VOID EitherTagsPopUp(char *tags, char *msg, BOOLEAN edit)\r
180 {\r
181   FARPROC lpProc;\r
182   char *p, *q;\r
183   \r
184   if (msg == NULL) msg = "";\r
185   p = (char *) malloc(2 * (strlen(tags) + strlen(msg)) + 2);\r
186   q = p;\r
187   while (*tags) {\r
188     if (*tags == '\n') *q++ = '\r';\r
189     *q++ = *tags++;\r
190   }\r
191   if (*msg != NULLCHAR) {\r
192     *q++ = '\r';\r
193     *q++ = '\n';\r
194     while (*msg) {\r
195       if (*msg == '\n') *q++ = '\r';\r
196       *q++ = *msg++;\r
197     }\r
198   }\r
199   *q = NULLCHAR;\r
200   if (editTagsText != NULL) free(editTagsText);\r
201   editTagsText = p;\r
202   canEditTags = edit;\r
203   \r
204   CheckMenuItem(GetMenu(hwndMain), IDM_EditTags, MF_CHECKED);\r
205   if (editTagsDialog) {\r
206     SendMessage(editTagsDialog, WM_INITDIALOG, 0, 0);\r
207     ShowWindow(editTagsDialog, SW_SHOW);\r
208   } else {\r
209     lpProc = MakeProcInstance((FARPROC)EditTagsDialog, hInst);\r
210     CreateDialog(hInst, MAKEINTRESOURCE(DLG_EditTags),\r
211       hwndMain, (DLGPROC)lpProc);\r
212     FreeProcInstance(lpProc);\r
213   }\r
214   editTagsUp = TRUE;\r
215 }\r
216 \r
217 VOID TagsPopUp(char *tags, char *msg)\r
218 {\r
219   HWND hwnd = GetActiveWindow();\r
220   EitherTagsPopUp(tags, msg, FALSE);\r
221   SetActiveWindow(hwnd);\r
222 }\r
223 \r
224 VOID EditTagsPopUp(char *tags)\r
225 {\r
226   EitherTagsPopUp(tags, "", TRUE);\r
227 }\r
228 \r
229 VOID EditTagsProc()\r
230 {\r
231   if (editTagsUp) {\r
232     TagsPopDown();\r
233   } else {\r
234     EditTagsEvent();\r
235   }\r
236 }\r