source: trunk/dll/attribs.c@ 1194

Last change on this file since 1194 was 1177, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.7 KB
Line 
1
2/***********************************************************************
3
4 $Id: attribs.c 1177 2008-09-10 21:53:13Z jbs $
5
6 attributes editor
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2006 Steven H.Levine
10
11 14 Jul 06 SHL Use Runtime_Error
12 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
13 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
14
15***********************************************************************/
16
17#include <ctype.h>
18
19#define INCL_DOS
20#define INCL_WIN
21
22#include "fm3dll.h"
23#include "fm3dlg.h"
24#include "fm3str.h"
25#include "makelist.h" // LISTINFO
26#include "errutil.h" // Runtime_Error
27#include "strutil.h" // GetPString
28#include "defview.h" // QuickView
29#include "attribs.h"
30#include "misc.h" // PaintRecessedWindow
31#include "wrappers.h" // xDosSetPathInfo
32
33static PSZ pszSrcFile = __FILE__;
34
35MRESULT EXPENTRY AttrListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
36{
37 LISTINFO *li;
38
39 switch (msg) {
40 case WM_INITDLG:
41 if (!mp2)
42 WinDismissDlg(hwnd, 0);
43 else {
44 WinSetWindowPtr(hwnd, QWL_USER, mp2);
45 li = (LISTINFO *) mp2;
46 if (!li->list || !li->list[0]) {
47 WinSendMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
48 break;
49 }
50 }
51 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETTEXTLIMIT, MPFROMSHORT(4L),
52 MPVOID);
53 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
54 MPVOID);
55 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
56 MPVOID);
57 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
58 MPVOID);
59 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
60 MPVOID);
61 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
62 MPVOID);
63 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_OVERRIDESETLIMITS,
64 MPFROMLONG(2200L), MPFROMLONG(1980L));
65 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_OVERRIDESETLIMITS,
66 MPFROMLONG(12L), MPFROMLONG(1L));
67 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_OVERRIDESETLIMITS, MPFROMLONG(31L),
68 MPFROMLONG(1L));
69 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_OVERRIDESETLIMITS, MPFROMLONG(23L),
70 MPFROMLONG(0L));
71 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_OVERRIDESETLIMITS,
72 MPFROMLONG(59L), MPFROMLONG(0L));
73 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_OVERRIDESETLIMITS,
74 MPFROMLONG(59L), MPFROMLONG(0L));
75 WinCheckButton(hwnd, ATR_USEDATETIME, FALSE);
76 {
77 INT x;
78
79 for (x = 0; li->list[x]; x++) {
80 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_INSERTITEM,
81 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
82 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_SELECTITEM,
83 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
84 }
85 }
86 PostMsg(hwnd, UM_UNDO, MPFROMLONG(((!li->list[1]) ? 1L : 0L)), MPVOID);
87 if (li->list[1])
88 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ATR_NOW, 0), MPVOID);
89 break;
90
91 case UM_UNDO:
92 {
93 FILESTATUS3 fi;
94 long ro = 2, hi = 2, sy = 2, ar = 2;
95 BOOL allgrey;
96
97 allgrey = ((long)WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
98 (long)WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
99 (long)WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
100 (long)WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2);
101 li = INSTDATA(hwnd);
102 if (li && li->list[0] && (allgrey || mp1) &&
103 !DosQueryPathInfo(li->list[0], FIL_STANDARD, &fi,
104 (ULONG) sizeof(fi))) {
105 ro = ((fi.attrFile & FILE_READONLY) != 0);
106 hi = ((fi.attrFile & FILE_HIDDEN) != 0);
107 sy = ((fi.attrFile & FILE_SYSTEM) != 0);
108 ar = ((fi.attrFile & FILE_ARCHIVED) != 0);
109 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
110 MPFROMSHORT(fi.fdateLastWrite.year + 1980), MPVOID);
111 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
112 MPFROMSHORT(fi.fdateLastWrite.month), MPVOID);
113 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
114 MPFROMSHORT(fi.fdateLastWrite.day), MPVOID);
115 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
116 MPFROMSHORT(fi.ftimeLastWrite.hours), MPVOID);
117 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
118 MPFROMSHORT(fi.ftimeLastWrite.minutes), MPVOID);
119 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
120 MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2), MPVOID);
121 }
122 WinCheckButton(hwnd, ATR_READONLY, ro);
123 WinCheckButton(hwnd, ATR_HIDDEN, hi);
124 WinCheckButton(hwnd, ATR_SYSTEM, sy);
125 WinCheckButton(hwnd, ATR_ARCHIVED, ar);
126 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_READONLY, BN_CLICKED),
127 MPVOID);
128 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_HIDDEN, BN_CLICKED), MPVOID);
129 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_SYSTEM, BN_CLICKED), MPVOID);
130 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_ARCHIVED, BN_CLICKED),
131 MPVOID);
132 }
133 return 0;
134
135 case WM_ADJUSTWINDOWPOS:
136 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
137 break;
138
139 case UM_SETDIR:
140 PaintRecessedWindow(WinWindowFromID(hwnd, ATR_HELP), (HPS) 0, FALSE,
141 TRUE);
142 return 0;
143
144 case WM_CONTROL:
145 switch (SHORT1FROMMP(mp1)) {
146 case ATR_LISTBOX:
147 if (SHORT2FROMMP(mp1) == LN_ENTER) {
148
149 SHORT x;
150 CHAR szBuffer[CCHMAXPATH];
151
152 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
153 MPFROMSHORT(LIT_FIRST), MPVOID);
154 if (x >= 0) {
155 *szBuffer = 0;
156 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
157 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
158 if (*szBuffer)
159 QuickView(hwnd, szBuffer);
160 }
161 }
162 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
163 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
164 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
165 WinSetDlgItemText(hwnd, ATR_HELP,
166 GetPString(IDS_ATTRLISTBOXHELPTEXT));
167 break;
168 case ATR_YEAR:
169 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
170 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
171 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
172 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRYEARHELPTEXT));
173 break;
174 case ATR_MONTH:
175 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
176 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
177 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
178 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMONTHHELPTEXT));
179 break;
180 case ATR_DAY:
181 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
182 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
183 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
184 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRDAYHELPTEXT));
185 break;
186 case ATR_HOUR:
187 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
188 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
189 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
190 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRHOURHELPTEXT));
191 break;
192 case ATR_MINUTES:
193 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
194 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
195 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
196 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMINHELPTEXT));
197 break;
198 case ATR_SECONDS:
199 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
200 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
201 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
202 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRSECHELPTEXT));
203 break;
204 case ATR_READONLY:
205 case ATR_SYSTEM:
206 case ATR_HIDDEN:
207 case ATR_ARCHIVED:
208 WinSendMsg(hwnd, UM_CONTROL, mp1, mp2);
209 break;
210 }
211 return 0;
212
213 case UM_CONTROL:
214 switch (SHORT1FROMMP(mp1)) {
215 case ATR_READONLY:
216 case ATR_SYSTEM:
217 case ATR_HIDDEN:
218 case ATR_ARCHIVED:
219 {
220
221 LONG check = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1));
222 CHAR s[80];
223
224 sprintf(s, "%s %s",
225 (SHORT1FROMMP(mp1) == ATR_READONLY) ?
226 GetPString(IDS_ATTRREADONLYBTEXT) :
227 (SHORT1FROMMP(mp1) == ATR_SYSTEM) ?
228 GetPString(IDS_ATTRSYSTEMBTEXT) :
229 (SHORT1FROMMP(mp1) == ATR_HIDDEN) ?
230 GetPString(IDS_ATTRHIDDENBTEXT) :
231 GetPString(IDS_ATTRARCHIVEDBTEXT),
232 (check == 1) ?
233 GetPString(IDS_ONTEXT) :
234 (check == 0) ?
235 GetPString(IDS_OFFTEXT) : GetPString(IDS_UNCHANGEDTEXT));
236 WinSetDlgItemText(hwnd, SHORT1FROMMP(mp1), s);
237 }
238 break;
239 }
240 return 0;
241
242 case WM_COMMAND:
243 switch (SHORT1FROMMP(mp1)) {
244 case ATR_LEAVEALL:
245 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
246 break;
247
248 case ATR_NOW:
249 {
250 time_t t;
251 struct tm *tm;
252
253 t = time(NULL);
254 tm = localtime(&t);
255 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
256 MPFROMSHORT(tm->tm_year + 1900), MPVOID);
257 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
258 MPFROMSHORT(tm->tm_mon + 1), MPVOID);
259 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
260 MPFROMSHORT(tm->tm_mday), MPVOID);
261 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
262 MPFROMSHORT(tm->tm_hour), MPVOID);
263 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
264 MPFROMSHORT(tm->tm_min), MPVOID);
265 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
266 MPFROMSHORT(tm->tm_sec), MPVOID);
267 }
268 break;
269
270 case DID_OK:
271 if (!WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME) &&
272 WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
273 WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
274 WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
275 WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2) {
276 saymsg(MB_ENTER,
277 hwnd,
278 GetPString(IDS_UHYOTEXT), GetPString(IDS_ATTRADVANTAGETEXT));
279 break;
280 }
281 {
282 ULONG temp = 0;
283 FILESTATUS3 fi;
284 SHORT x;
285 APIRET rc;
286 USHORT state;
287
288 li = INSTDATA(hwnd);
289 if (!li) {
290 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
291 break;
292 }
293 {
294 CHAR szBuffer[CCHMAXPATH + 1];
295 UINT numfiles = 0, numalloc = 0;
296 INT error;
297
298 if (li->list)
299 FreeList(li->list);
300 li->list = NULL;
301 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
302 MPFROMSHORT(LIT_FIRST), MPVOID);
303 if (x >= 0) {
304 do {
305 *szBuffer = 0;
306 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
307 MPFROM2SHORT(x, CCHMAXPATH),
308 MPFROMP(szBuffer));
309 if (*szBuffer && isalpha(*szBuffer) &&
310 !(driveflags[toupper(*szBuffer) - 'A'] &
311 DRIVE_NOTWRITEABLE)) {
312 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
313 if (error) {
314 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
315 break;
316 }
317 }
318 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX,
319 LM_QUERYSELECTION,
320 MPFROMSHORT(x), MPVOID);
321 } while (x >= 0);
322 }
323 }
324 if (!li->list || !li->list[0]) {
325 Runtime_Error(pszSrcFile, __LINE__, "list build failed");
326 break;
327 }
328 for (x = 0; li->list[x]; x++) {
329 DosError(FERR_DISABLEHARDERR);
330 rc = DosQueryPathInfo(li->list[x], FIL_STANDARD, &fi,
331 (ULONG) sizeof(fi));
332 if (rc)
333 continue;
334 if (WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME)) {
335 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_QUERYVALUE, MPFROMP(&temp),
336 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
337 fi.fdateLastWrite.year = temp - 1980;
338 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_QUERYVALUE,
339 MPFROMP(&temp), MPFROM2SHORT(0,
340 SPBQ_DONOTUPDATE));
341 fi.fdateLastWrite.month = temp;
342 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_QUERYVALUE, MPFROMP(&temp),
343 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
344 fi.fdateLastWrite.day = temp;
345 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_QUERYVALUE, MPFROMP(&temp),
346 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
347 fi.ftimeLastWrite.hours = temp;
348 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_QUERYVALUE,
349 MPFROMP(&temp), MPFROM2SHORT(0,
350 SPBQ_DONOTUPDATE));
351 fi.ftimeLastWrite.minutes = temp;
352 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_QUERYVALUE,
353 MPFROMP(&temp), MPFROM2SHORT(0,
354 SPBQ_DONOTUPDATE));
355 fi.ftimeLastWrite.twosecs = (temp / 2L);
356 }
357 fi.attrFile &= (~FILE_DIRECTORY);
358 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_READONLY,
359 BM_QUERYCHECK, MPVOID, MPVOID);
360 if (!state)
361 fi.attrFile &= (~FILE_READONLY);
362 else if (state == 1)
363 fi.attrFile |= FILE_READONLY;
364 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_HIDDEN, BM_QUERYCHECK,
365 MPVOID, MPVOID);
366 if (!state)
367 fi.attrFile &= (~FILE_HIDDEN);
368 else if (state == 1)
369 fi.attrFile |= FILE_HIDDEN;
370 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_SYSTEM, BM_QUERYCHECK,
371 MPVOID, MPVOID);
372 if (!state)
373 fi.attrFile &= (~FILE_SYSTEM);
374 else if (state == 1)
375 fi.attrFile |= FILE_SYSTEM;
376 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_ARCHIVED,
377 BM_QUERYCHECK, MPVOID, MPVOID);
378 if (!state)
379 fi.attrFile &= (~FILE_ARCHIVED);
380 else if (state == 1)
381 fi.attrFile |= FILE_ARCHIVED;
382 xDosSetPathInfo(li->list[x], FIL_STANDARD, &fi, sizeof(fi), 0);
383 }
384 WinDismissDlg(hwnd, 1);
385 }
386 break;
387
388 case IDM_HELP:
389 if (hwndHelp)
390 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
391 MPFROM2SHORT(HELP_ATTRIBSLIST, 0),
392 MPFROMSHORT(HM_RESOURCEID));
393 break;
394
395 case DID_CANCEL:
396 WinDismissDlg(hwnd, 0);
397 break;
398 }
399 return 0;
400 }
401 return WinDefDlgProc(hwnd, msg, mp1, mp2);
402}
403
404#pragma alloc_text(ATTRIBS,AttrListDlgProc)
Note: See TracBrowser for help on using the repository browser.