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