source: trunk/dll/attribs.c@ 1166

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

Ticket 187: Draft 1: Functions only

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