OSDN Git Service

Initial Import
[nethackexpress/trunk.git] / sys / wince / mhtext.c
1 /* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */
2 /* NetHack may be freely redistributed.  See license for details. */
3
4 #include "winMS.h"
5 #include "mhtext.h"
6 #include "mhmsg.h"
7 #include "mhfont.h"
8 #include "mhcolor.h"
9 #include "mhtxtbuf.h"
10
11 typedef struct mswin_nethack_text_window {
12         PNHTextBuffer  window_text;
13         int done;
14 } NHTextWindow, *PNHTextWindow;
15
16 static WNDPROC editControlWndProc = NULL;
17
18 LRESULT CALLBACK        TextWndProc(HWND, UINT, WPARAM, LPARAM);
19 LRESULT CALLBACK        NHTextControlWndProc(HWND, UINT, WPARAM, LPARAM);
20 static void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
21 static void LayoutText(HWND hwnd);
22
23 HWND mswin_init_text_window () {
24         HWND ret;
25         PNHTextWindow data;
26
27         ret = CreateDialog(
28                         GetNHApp()->hApp,
29                         MAKEINTRESOURCE(IDD_NHTEXT),
30                         GetNHApp()->hMainWnd,
31                         TextWndProc
32         );
33         if( !ret ) panic("Cannot create text window");
34
35         data = (PNHTextWindow)malloc(sizeof(NHTextWindow));
36         if( !data ) panic("out of memory");
37
38         ZeroMemory(data, sizeof(NHTextWindow));
39         data->window_text = mswin_init_text_buffer(
40                         program_state.gameover? FALSE : GetNHApp()->bWrapText
41                 );
42         SetWindowLong(ret, GWL_USERDATA, (LONG)data);
43         return ret;
44 }
45
46 void mswin_display_text_window (HWND hWnd)
47 {
48         PNHTextWindow data;
49         
50         data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
51         if( data ) {
52                 HWND control;
53                 control = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
54                 SendMessage(control, EM_FMTLINES, 1, 0 );
55                 mswin_render_text(data->window_text, GetDlgItem(hWnd, IDC_TEXT_CONTROL));
56
57                 data->done = 0;
58                 mswin_popup_display(hWnd, &data->done);
59                 mswin_popup_destroy(hWnd);
60         }
61 }
62     
63 LRESULT CALLBACK TextWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
64 {
65         HWND control;
66         HDC hdc;
67         PNHTextWindow data;
68         
69         data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
70         switch (message) 
71         {
72         case WM_INITDIALOG:
73             /* set text control font */
74                 control = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
75                 if( !control ) {
76                         panic("cannot get text view window");
77                 }
78
79                 hdc = GetDC(control);
80                 SendMessage(control, WM_SETFONT, (WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0);
81                 ReleaseDC(control, hdc);
82
83 #if defined(WIN_CE_SMARTPHONE)
84                 /* special initialization for SmartPhone dialogs */ 
85                 NHSPhoneDialogSetup(hWnd, FALSE, GetNHApp()->bFullScreen);
86 #endif
87                 /* subclass edit control */
88                 editControlWndProc = (WNDPROC)GetWindowLong(control, GWL_WNDPROC);
89                 SetWindowLong(control, GWL_WNDPROC, (LONG)NHTextControlWndProc);
90
91                 if( !program_state.gameover && GetNHApp()->bWrapText ) {
92                         DWORD styles;
93                         styles = GetWindowLong(control, GWL_STYLE);
94                         if( styles ) {
95                                 SetWindowLong(control, GWL_STYLE, styles & (~WS_HSCROLL));
96                                 SetWindowPos(control, NULL, 0, 0, 0, 0, 
97                                                           SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE );
98                         }
99                 }
100
101                 SetFocus(control);
102         return FALSE;
103
104         case WM_MSNH_COMMAND:
105                 onMSNHCommand(hWnd, wParam, lParam);
106         break;
107
108         case WM_SIZE:
109                 LayoutText(hWnd);
110         return FALSE;
111
112         case WM_COMMAND:
113                 switch (LOWORD(wParam)) 
114         { 
115           case IDOK: 
116                   case IDCANCEL:
117                         data->done = 1;
118                         return TRUE;
119                 }
120         break;
121
122         case WM_CTLCOLORBTN:
123         case WM_CTLCOLOREDIT:
124         case WM_CTLCOLORSTATIC: { /* sent by edit control before it is drawn */
125                 HDC hdcEdit = (HDC) wParam; 
126                 HWND hwndEdit = (HWND) lParam;
127                 if( hwndEdit == GetDlgItem(hWnd, IDC_TEXT_CONTROL) ) {
128                         SetBkColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_BG));
129                         SetTextColor(hdcEdit, mswin_get_color(NHW_TEXT, MSWIN_COLOR_FG)); 
130                         return (BOOL)mswin_get_brush(NHW_TEXT, MSWIN_COLOR_BG);
131                 }
132         } return FALSE;
133
134         case WM_DESTROY:
135                 if( data ) {
136                         mswin_free_text_buffer(data->window_text);
137                         free(data);
138                         SetWindowLong(hWnd, GWL_USERDATA, (LONG)0);
139                 }
140         break;
141
142         }
143         return FALSE;
144 }
145
146 void onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
147 {
148         PNHTextWindow data;
149         
150         data = (PNHTextWindow)GetWindowLong(hWnd, GWL_USERDATA);
151         switch( wParam ) {
152         case MSNH_MSG_PUTSTR: {
153                 PMSNHMsgPutstr msg_data = (PMSNHMsgPutstr)lParam;
154                 mswin_add_text(data->window_text, msg_data->attr, msg_data->text);
155                 break;
156         }
157         }
158 }
159
160 void LayoutText(HWND hWnd) 
161 {
162         HWND  btn_ok;
163         HWND  text;
164         RECT  clrt, rt;
165         POINT pt_elem, pt_ok;
166         SIZE  sz_elem, sz_ok;
167
168         text = GetDlgItem(hWnd, IDC_TEXT_CONTROL);
169         btn_ok = GetDlgItem(hWnd, IDOK);
170
171         /* get window coordinates */
172         GetClientRect(hWnd, &clrt );
173         
174         /* set window placements */
175         if( IsWindow(btn_ok) ) {
176                 GetWindowRect(btn_ok, &rt);
177                 sz_ok.cx = clrt.right - clrt.left;
178                 sz_ok.cy = rt.bottom-rt.top;
179                 pt_ok.x = clrt.left;
180                 pt_ok.y = clrt.bottom - sz_ok.cy;
181                 MoveWindow(btn_ok, pt_ok.x, pt_ok.y, sz_ok.cx, sz_ok.cy, TRUE );
182
183                 pt_elem.x = clrt.left;
184                 pt_elem.y = clrt.top;
185                 sz_elem.cx = clrt.right - clrt.left;
186                 sz_elem.cy = pt_ok.y;
187                 MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE );
188         } else {
189                 pt_elem.x = clrt.left;
190                 pt_elem.y = clrt.top;
191                 sz_elem.cx = clrt.right - clrt.left;
192                 sz_elem.cy = clrt.bottom - clrt.top;
193                 MoveWindow(text, pt_elem.x, pt_elem.y, sz_elem.cx, sz_elem.cy, TRUE );
194         }
195 }
196
197 /* Text control window proc - implements close on space and scrolling on arrows */
198 LRESULT CALLBACK NHTextControlWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
199 {
200         switch(message) {
201         case WM_KEYUP:
202                 switch( wParam ) {
203                 case VK_SPACE:
204                 case VK_RETURN:
205                         /* close on space */
206                         PostMessage(GetParent(hWnd), WM_COMMAND, MAKELONG(IDOK, 0), 0);
207                         return 0;
208                 
209                 case VK_UP:
210                         /* scoll up */
211                         PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP, 0), (LPARAM)NULL);
212                         return 0;
213
214                 case VK_DOWN:
215                         /* scoll down */
216                         PostMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN, 0), (LPARAM)NULL);
217                         return 0;
218
219                 case VK_LEFT:
220                         /* scoll left */
221                         PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINELEFT, 0), (LPARAM)NULL);
222                         return 0;
223
224                 case VK_RIGHT:
225                         /* scoll right */
226                         PostMessage(hWnd, WM_HSCROLL, MAKEWPARAM(SB_LINERIGHT, 0), (LPARAM)NULL);
227                         return 0;
228                 }
229                 break; /* case WM_KEYUP: */
230         }
231
232         if( editControlWndProc ) 
233                 return CallWindowProc(editControlWndProc, hWnd, message, wParam, lParam);
234         else 
235                 return 0;
236 }