source: trunk/dll/attribs.c@ 1211

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

Ticket 187: Move datadevlarations/definitions out of fm3dll.h

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