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