|
|
1.1 root 1: /*
2: appdoc.c - MDI application
3: Created by Microsoft Corporation, 1989
4: */
5: #define INCL_WINSYS
6: #define INCL_WINCOMMON
7: #define INCL_WINMESSAGEMGR
8: #define INCL_WINFRAMEMGR
9: #define INCL_WINPOINTERS
10: #define INCL_WINMENUS
11: #define INCL_WINWINDOWMGR
12: #define INCL_WINACCELERATORS
13: #define INCL_WININPUT
14: #define INCL_WINHEAP
15: #define INCL_WINSCROLLBARS
16: #define INCL_WINRECTANGLES
17: #define INCL_WINCOUNTRY
18: #define INCL_GPIPRIMITIVES
19: #define INCL_GPILOGCOLORTABLE
20:
21: #include <os2.h>
22: #include <string.h>
23: #include <stdlib.h>
24: #include <stdio.h>
25: #include "app.h"
26: #include "appdata.h"
27: #include "mdi.h"
28: #include "mdidata.h"
29:
30: /* Function prototypes */
31: VOID AppHScroll(HWND hwnd, MPARAM mp1, MPARAM mp2);
32: VOID AppVScroll(HWND hwnd, MPARAM mp1, MPARAM mp2);
33: VOID AppEraseBackground(HWND hwnd, HPS hps);
34: VOID AppPaint(HWND hwnd);
35: VOID MDIClose(HWND hwndClient);
36: BOOL MDICreate(HWND);
37: BOOL MDIDestroy(HWND);
38: BOOL MDIActivate(HWND, BOOL);
39:
40: /*
41: * The array of RGB values for the rounded
42: * rectangles.
43: */
44: LONG aclrRGB[16] = {
45: RGB_RED, RGB_WHITE, RGB_GREEN, RGB_BLACK,
46: RGB_BLUE, RGB_WHITE, RGB_YELLOW, RGB_BLACK,
47: RGB_CYAN, RGB_BLACK, RGB_PINK, RGB_BLACK,
48: RGB_WHITE, RGB_PINK, RGB_BLACK, RGB_RED
49: };
50:
51:
52: MRESULT CALLBACK DocWndProc(HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
53: {
54:
55: switch (msg) {
56:
57: case WM_CREATE:
58: if (MDICreate(hwnd) == FALSE)
59: return (TRUE);
60: break;
61:
62: case WM_DESTROY:
63: MDIDestroy(hwnd);
64: break;
65:
66: case WM_CLOSE:
67: MDIClose(hwnd);
68: break;
69:
70: case WM_HSCROLL:
71: AppHScroll(hwnd, mp1, mp2);
72: break;
73:
74: case WM_VSCROLL:
75: AppVScroll(hwnd, mp1, mp2);
76: break;
77:
78: case WM_ERASEBACKGROUND:
79: AppEraseBackground(hwnd, (HPS)mp1);
80: break;
81:
82: case WM_PAINT:
83: AppPaint(hwnd);
84: break;
85:
86: case WM_ACTIVATE:
87: MDIActivate(hwnd, (BOOL)SHORT1FROMMP(mp1));
88: break;
89:
90: default:
91: return(WinDefWindowProc(hwnd, msg, mp1, mp2));
92: break;
93: }
94:
95: return (0L);
96: }
97:
98:
99: VOID AppEraseBackground(HWND hwnd, HPS hps)
100: {
101: RECTL rclPaint;
102: HWND hwndFrame, hwndClient;
103: register NPDOC npdoc;
104:
105: npdoc = NPDOCFROMCLIENT(hwnd);
106: hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
107:
108: /*
109: * We know the main client is around so
110: * go ahead and erase it.
111: */
112: WinQueryWindowRect(hwnd, &rclPaint);
113: WinMapWindowPoints(hwnd, hwndFrame, (PPOINTL)&rclPaint, 2);
114: WinFillRect(hps, &rclPaint, npdoc->clrBackground);
115:
116: /*
117: * Now check to see which of the other client windows
118: * are around and erase them.
119: *
120: * We do all this to avoid erasing the splitbars.
121: */
122: if (npdoc->fs & DF_SPLITVERT) {
123:
124: hwndClient = WinWindowFromID(hwndFrame, ID_CLIENT2);
125: /*
126: * If it became invisible due to the frame
127: * window getting too small, then don't
128: * bother drawing.
129: */
130: if (WinIsWindowVisible(hwndClient) != FALSE) {
131: WinQueryWindowRect(hwndClient, &rclPaint);
132: WinMapWindowPoints(hwndClient, hwndFrame,
133: (PPOINTL)&rclPaint, 2);
134: WinFillRect(hps, &rclPaint, npdoc->clrBackground);
135: }
136: }
137:
138: if (npdoc->fs & DF_SPLITHORZ) {
139:
140: hwndClient = WinWindowFromID(hwndFrame, ID_CLIENT3);
141: if (WinIsWindowVisible(hwndClient) != FALSE) {
142: WinQueryWindowRect(hwndClient, &rclPaint);
143: WinMapWindowPoints(hwndClient, hwndFrame,
144: (PPOINTL)&rclPaint, 2);
145: WinFillRect(hps, &rclPaint, npdoc->clrBackground);
146: }
147: }
148:
149: /*
150: * If we're split in both directions, then there's
151: * a ID_CLIENT4 window.
152: */
153: if ((npdoc->fs & (DF_SPLITHORZ | DF_SPLITVERT)) ==
154: (DF_SPLITHORZ | DF_SPLITVERT)) {
155:
156: hwndClient = WinWindowFromID(hwndFrame, ID_CLIENT4);
157: if (WinIsWindowVisible(hwndClient) != FALSE) {
158: WinQueryWindowRect(hwndClient, &rclPaint);
159: WinMapWindowPoints(hwndClient, hwndFrame,
160: (PPOINTL)&rclPaint, 2);
161: WinFillRect(hps, &rclPaint, npdoc->clrBackground);
162: }
163: }
164: }
165:
166:
167: VOID AppHScroll(HWND hwnd, MPARAM mp1, MPARAM mp2)
168: {
169: HWND hwndFrame;
170: NPDOC npdoc;
171: RECTL rclPaintBottom, rclPaintTop;
172: RECTL rclWindowBottom, rclWindowTop;
173: HWND hwndClientBottom, hwndClientTop;
174: HWND hwndScrollbar;
175: register NPVIEW npviewBottom, npviewTop;
176: SHORT posSlider, xOriginOld;
177: USHORT cmd, idScrollbar;
178:
179: hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
180: npdoc = NPDOCFROMCLIENT(hwnd);
181:
182: idScrollbar = SHORT1FROMMP(mp1);
183:
184: switch (idScrollbar) {
185:
186: case FID_HORZSCROLL:
187: hwndClientTop = hwnd;
188: if (npdoc->fs & DF_SPLITHORZ) {
189: hwndClientBottom = WinWindowFromID(hwndFrame, ID_CLIENT3);
190: } else {
191: hwndClientBottom = NULL;
192: }
193: break;
194:
195: case ID_HORZSCROLL2:
196: hwndClientTop = WinWindowFromID(hwndFrame, ID_CLIENT2);
197: if (npdoc->fs & DF_SPLITHORZ) {
198: hwndClientBottom = WinWindowFromID(hwndFrame, ID_CLIENT4);
199: } else {
200: hwndClientBottom = NULL;
201: }
202: break;
203: }
204:
205: hwndScrollbar = WinWindowFromID(hwndFrame, idScrollbar);
206:
207: npviewTop = NPVIEWFROMCLIENT(hwndClientTop);
208: WinQueryWindowRect(hwndClientTop, &rclWindowTop);
209:
210: if (hwndClientBottom != NULL) {
211: npviewBottom = NPVIEWFROMCLIENT(hwndClientBottom);
212: WinQueryWindowRect(hwndClientBottom, &rclWindowBottom);
213: }
214:
215: posSlider = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL);
216:
217: cmd = SHORT2FROMMP(mp2);
218: switch (cmd) {
219:
220: case SB_LINELEFT:
221: posSlider -= 16;
222: break;
223:
224: case SB_LINERIGHT:
225: posSlider += 16;
226: break;
227:
228: case SB_PAGELEFT:
229: posSlider -= ((SHORT)rclWindowTop.xRight - 16);
230: break;
231:
232: case SB_PAGERIGHT:
233: posSlider += ((SHORT)rclWindowTop.xRight - 16);
234: break;
235:
236: case SB_SLIDERPOSITION:
237: posSlider = SHORT1FROMMP(mp2);
238: break;
239: }
240:
241: WinSendMsg(hwndScrollbar, SBM_SETPOS, MPFROMSHORT(posSlider), NULL);
242:
243: xOriginOld = npviewTop->xOrigin;
244: npviewTop->xOrigin = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL);
245: WinScrollWindow(hwndClientTop, xOriginOld - npviewTop->xOrigin, 0,
246: NULL, NULL, NULL, &rclPaintTop, NULL);
247:
248: if (hwndClientBottom != NULL) {
249: xOriginOld = npviewBottom->xOrigin;
250: npviewBottom->xOrigin = npviewTop->xOrigin;
251: WinScrollWindow(hwndClientBottom, xOriginOld - npviewBottom->xOrigin,
252: 0, NULL, NULL, NULL, &rclPaintBottom, NULL);
253: }
254:
255: WinMapWindowPoints(hwndClientTop, hwndFrame, (PPOINTL)&rclPaintTop, 2);
256: WinInvalidateRect(hwndFrame, &rclPaintTop, TRUE);
257:
258: if (hwndClientBottom != NULL) {
259: WinMapWindowPoints(hwndClientBottom, hwndFrame, (PPOINTL)&rclPaintBottom, 2);
260: WinInvalidateRect(hwndFrame, &rclPaintBottom, TRUE);
261: }
262: }
263:
264:
265: VOID AppVScroll(HWND hwnd, MPARAM mp1, MPARAM mp2)
266: {
267: HWND hwndFrame;
268: NPDOC npdoc;
269: RECTL rclPaintRight, rclPaintLeft;
270: RECTL rclWindowRight, rclWindowLeft;
271: HWND hwndClientRight, hwndClientLeft;
272: HWND hwndScrollbar;
273: register NPVIEW npviewRight, npviewLeft;
274: SHORT posSlider, yOriginOld;
275: USHORT cmd, idScrollbar;
276:
277: hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
278: npdoc = NPDOCFROMCLIENT(hwnd);
279:
280: idScrollbar = SHORT1FROMMP(mp1);
281:
282: switch (idScrollbar) {
283:
284: case FID_VERTSCROLL:
285: hwndClientLeft = hwnd;
286: if (npdoc->fs & DF_SPLITVERT) {
287: hwndClientRight = WinWindowFromID(hwndFrame, ID_CLIENT2);
288: } else {
289: hwndClientRight = NULL;
290: }
291: break;
292:
293: case ID_VERTSCROLL2:
294: hwndClientLeft = WinWindowFromID(hwndFrame, ID_CLIENT3);
295: if (npdoc->fs & DF_SPLITVERT) {
296: hwndClientRight = WinWindowFromID(hwndFrame, ID_CLIENT4);
297: } else {
298: hwndClientRight = NULL;
299: }
300: break;
301: }
302:
303: hwndScrollbar = WinWindowFromID(hwndFrame, idScrollbar);
304:
305: npviewLeft = NPVIEWFROMCLIENT(hwndClientLeft);
306: WinQueryWindowRect(hwndClientLeft, &rclWindowLeft);
307:
308: if (hwndClientRight != NULL) {
309: npviewRight = NPVIEWFROMCLIENT(hwndClientRight);
310: WinQueryWindowRect(hwndClientRight, &rclWindowRight);
311: }
312:
313: posSlider = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL);
314:
315: cmd = SHORT2FROMMP(mp2);
316: switch (cmd) {
317:
318: case SB_LINEUP:
319: posSlider -= 16;
320: break;
321:
322: case SB_LINEDOWN:
323: posSlider += 16;
324: break;
325:
326: case SB_PAGEUP:
327: posSlider -= ((SHORT)rclWindowLeft.yTop - 16);
328: break;
329:
330: case SB_PAGEDOWN:
331: posSlider += ((SHORT)rclWindowLeft.yTop - 16);
332: break;
333:
334: case SB_SLIDERPOSITION:
335: posSlider = SHORT1FROMMP(mp2);
336: break;
337: }
338:
339: WinSendMsg(hwndScrollbar, SBM_SETPOS, MPFROMSHORT(posSlider), NULL);
340:
341: yOriginOld = npviewLeft->yOrigin;
342: npviewLeft->yOrigin = (SHORT)WinSendMsg(hwndScrollbar, SBM_QUERYPOS, NULL, NULL);
343: WinScrollWindow(hwndClientLeft, 0, npviewLeft->yOrigin - yOriginOld,
344: NULL, NULL, NULL, &rclPaintLeft, NULL);
345:
346: if (hwndClientRight != NULL) {
347: yOriginOld = npviewRight->yOrigin;
348: npviewRight->yOrigin = npviewLeft->yOrigin;
349: WinScrollWindow(hwndClientRight, 0, npviewRight->yOrigin - yOriginOld,
350: NULL, NULL, NULL, &rclPaintRight, NULL);
351: }
352:
353: WinMapWindowPoints(hwndClientLeft, hwndFrame, (PPOINTL)&rclPaintLeft, 2);
354: WinInvalidateRect(hwndFrame, &rclPaintLeft, TRUE);
355:
356: if (hwndClientRight != NULL) {
357: WinMapWindowPoints(hwndClientRight, hwndFrame, (PPOINTL)&rclPaintRight, 2);
358: WinInvalidateRect(hwndFrame, &rclPaintRight, TRUE);
359: }
360: }
361:
362:
363: VOID AppPaint(HWND hwnd)
364: {
365: HPS hps;
366: RECTL rclPaint, rclWindow, rclTest, rclDst;
367: POINTL ptl, ptlPatternRef;
368: register NPVIEW npview;
369: AREABUNDLE abnd;
370: LONG clrStart, clrEnd, clrInc, clr;
371: SHORT i, j;
372:
373: hps = WinBeginPaint(hwnd, (HPS)NULL, &rclPaint);
374:
375: /*
376: * Go into RGB mode.
377: */
378: GpiCreateLogColorTable(hps, 0L, LCOLF_RGB, 0L, 0L, NULL);
379:
380: /*
381: * Make rclPaint an inclusive-inclusive rectangle
382: * since that's how GpiBox() will be output.
383: */
384: rclPaint.xLeft--;
385: rclPaint.yBottom--;
386:
387: npview = NPVIEWFROMCLIENT(hwnd);
388:
389: /*
390: * Set the pattern to be at the top-left
391: * since we're top-left aligning the bits.
392: */
393: WinQueryWindowRect(hwnd, (PRECTL)&rclWindow);
394: ptlPatternRef.x = rclWindow.xLeft - npview->xOrigin;
395: ptlPatternRef.y = rclWindow.yTop + npview->yOrigin;
396: GpiSetPatternRefPoint(hps, &ptlPatternRef);
397:
398: for (i = 0; i < 8; i++) {
399:
400: clr = clrStart = aclrRGB[i * 2];
401: clrEnd = aclrRGB[(i * 2) + 1];
402: clrInc = (clrEnd - clrStart) / 8;
403:
404: for (j = 0; j < 8; j++) {
405: abnd.lColor = clr + (j * clrInc);
406: GpiSetAttrs(hps, PRIM_AREA, ABB_COLOR, 0L, (PBUNDLE)&abnd);
407:
408: /*
409: * Only draw the box if it's going to
410: * be visible in the update region.
411: */
412: WinSetRect(NULL, &rclTest, 10 + (i * 75),
413: (SHORT)rclWindow.yTop - 75 - (j * 75), 75 + (i * 75),
414: (SHORT)rclWindow.yTop - 10 - (j * 75));
415:
416: WinOffsetRect(NULL, &rclTest, -npview->xOrigin, npview->yOrigin);
417:
418: if (WinIntersectRect(NULL, &rclDst, &rclTest, &rclPaint)) {
419:
420: ptl.x = rclTest.xLeft;
421: ptl.y = rclTest.yTop;
422: GpiSetCurrentPosition(hps, (PPOINTL)&ptl);
423:
424: ptl.x = rclTest.xRight;
425: ptl.y = rclTest.yBottom;
426: GpiBox(hps, DRO_OUTLINEFILL, (PPOINTL)&ptl, 40L, 40L);
427: }
428: }
429: }
430:
431: WinEndPaint(hps);
432: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.