749aa53bf384848864a237abb8bfaade845eaae5
[krb5.git] / src / windows / identity / uilib / propsheet.c
1 /*\r
2  * Copyright (c) 2004 Massachusetts Institute of Technology\r
3  *\r
4  * Permission is hereby granted, free of charge, to any person\r
5  * obtaining a copy of this software and associated documentation\r
6  * files (the "Software"), to deal in the Software without\r
7  * restriction, including without limitation the rights to use, copy,\r
8  * modify, merge, publish, distribute, sublicense, and/or sell copies\r
9  * of the Software, and to permit persons to whom the Software is\r
10  * furnished to do so, subject to the following conditions:\r
11  *\r
12  * The above copyright notice and this permission notice shall be\r
13  * included in all copies or substantial portions of the Software.\r
14  *\r
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
18  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
19  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
20  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
22  * SOFTWARE.\r
23  */\r
24 \r
25 /* $Id$ */\r
26 \r
27 #include<khuidefs.h>\r
28 #ifdef DEBUG\r
29 #include<assert.h>\r
30 #endif\r
31 \r
32 KHMEXP khm_int32 KHMAPI khui_ps_create_sheet(khui_property_sheet ** sheet)\r
33 {\r
34     khui_property_sheet * ps;\r
35 \r
36     ps = malloc(sizeof(*ps));\r
37     ZeroMemory(ps, sizeof(*ps));\r
38 \r
39     ps->header.dwSize = sizeof(ps->header);\r
40     ps->header.dwFlags = PSH_MODELESS | PSH_PROPTITLE;\r
41     ps->status = KHUI_PS_STATUS_NONE;\r
42 \r
43     *sheet = ps;\r
44 \r
45     return KHM_ERROR_SUCCESS;\r
46 }\r
47 \r
48 KHMEXP khm_int32 KHMAPI khui_ps_add_page(\r
49     khui_property_sheet * sheet,\r
50     khm_int32 credtype,\r
51     khm_int32 ordinal,\r
52     LPPROPSHEETPAGE ppage,\r
53     khui_property_page ** page)\r
54 {\r
55     khui_property_page * p;\r
56 \r
57     p = malloc(sizeof(*p));\r
58     ZeroMemory(p, sizeof(*p));\r
59 \r
60     p->credtype = credtype;\r
61     p->ordinal = ordinal;\r
62     p->p_page = ppage;\r
63     \r
64     QPUT(sheet, p);\r
65     sheet->n_pages++;\r
66 \r
67     if(page)\r
68         *page = p;\r
69 \r
70     return KHM_ERROR_SUCCESS;\r
71 }\r
72 \r
73 KHMEXP khm_int32 KHMAPI khui_ps_find_page(\r
74     khui_property_sheet * sheet,\r
75     khm_int32 credtype,\r
76     khui_property_page ** page)\r
77 {\r
78     khui_property_page * p;\r
79 \r
80     p = QTOP(sheet);\r
81 \r
82     while(p) {\r
83         if(p->credtype == credtype)\r
84             break;\r
85         p = QNEXT(p);\r
86     }\r
87 \r
88     if(p) {\r
89         *page = p;\r
90         return KHM_ERROR_SUCCESS;\r
91     } else {\r
92         *page = NULL;\r
93         return KHM_ERROR_NOT_FOUND;\r
94     }\r
95 }\r
96 \r
97 int __cdecl ps_order_func(const void *l, const void * r) {\r
98   /* l is a ** */\r
99     return 0;\r
100 }\r
101 \r
102 KHMEXP HWND KHMAPI khui_ps_show_sheet(HWND parent, khui_property_sheet * s)\r
103 {\r
104     khui_property_page * p;\r
105     HPROPSHEETPAGE phpsp[KHUI_PS_MAX_PSP];\r
106     khui_property_page * ppgs[KHUI_PS_MAX_PSP];\r
107     int i;\r
108     INT_PTR prv;\r
109     HWND hw;\r
110 \r
111     s->header.hwndParent = parent;\r
112     s->header.nPages = s->n_pages;\r
113 \r
114     p = QTOP(s);\r
115     i = 0;\r
116     while(p) {\r
117         p->h_page = CreatePropertySheetPage(p->p_page);\r
118 #ifdef DEBUG\r
119         assert(p->h_page);\r
120 #endif\r
121         ppgs[i] = p;\r
122         phpsp[i++] = p->h_page;\r
123         p = QNEXT(p);\r
124     }\r
125 \r
126     /*TODO: sort property sheets */\r
127 \r
128     s->header.phpage = phpsp;\r
129 \r
130     prv = PropertySheet(&s->header);\r
131     if(prv <= 0) {\r
132 #ifdef DEBUG\r
133         assert(FALSE);\r
134 #endif\r
135         /*TODO: better handling for this */\r
136         hw = NULL;\r
137     } else {\r
138         DWORD dw;\r
139 \r
140         dw = GetLastError();\r
141         s->status = KHUI_PS_STATUS_RUNNING;\r
142 \r
143         hw = (HWND) prv;\r
144         s->hwnd = hw;\r
145         s->hwnd_page = PropSheet_GetCurrentPageHwnd(hw);\r
146     }\r
147 \r
148     return hw;\r
149 }\r
150 \r
151 KHMEXP LRESULT KHMAPI khui_ps_check_message(\r
152     khui_property_sheet * sheet, \r
153     PMSG pmsg)\r
154 {\r
155     LRESULT lr;\r
156 \r
157     if(sheet->hwnd == NULL)\r
158         return FALSE;\r
159 \r
160     lr = PropSheet_IsDialogMessage(sheet->hwnd, pmsg);\r
161     if(lr) {\r
162         sheet->hwnd_page = PropSheet_GetCurrentPageHwnd(sheet->hwnd);\r
163         if(sheet->hwnd_page == NULL && \r
164            sheet->status == KHUI_PS_STATUS_RUNNING)\r
165 \r
166             sheet->status = KHUI_PS_STATUS_DONE;\r
167     }\r
168 \r
169     return lr;\r
170 }\r
171 \r
172 KHMEXP khm_int32 KHMAPI khui_ps_destroy_sheet(khui_property_sheet * sheet)\r
173 {\r
174     khui_property_page * p;\r
175 \r
176     DestroyWindow(sheet->hwnd);\r
177     sheet->hwnd = NULL;\r
178 \r
179     QGET(sheet, &p);\r
180     while(p) {\r
181         free(p);\r
182         QGET(sheet, &p);\r
183     }\r
184 \r
185     free(sheet);\r
186 \r
187     return KHM_ERROR_SUCCESS;\r
188 }\r