Annotation of mstools/samples/sdktools/windiff/tprint.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /****************************** Module Header *******************************
                     13: * Module Name: TPRINT.C
                     14: *
                     15: * Print functions.
                     16: *
                     17: * Functions:
                     18: *
                     19: * gtab_print()
                     20: * gtab_printsetup()
                     21: * gtab_prtwidths()
                     22: * gtab_printjob()
                     23: * AbortProc()
                     24: * AbortDlg()
                     25: * gtab_printpage()
                     26: * gtab_setrects()
                     27: * gtab_printhead()
                     28: *
                     29: * Comments:
                     30: *
                     31: * See table.h for interface description.
                     32: *
                     33: ****************************************************************************/
                     34: 
                     35: #include <string.h>
                     36: #include <windows.h>
                     37: #include <commdlg.h>
                     38: 
                     39: #include "gutils.h"
                     40: #include "gutilsrc.h"
                     41: #include "table.h"
                     42: #include "tpriv.h"
                     43: 
                     44: /* in tpaint.c, calls GetTextExtentPoint */
                     45: extern int GetTextExtent(HDC, LPSTR, int);
                     46: 
                     47: extern HANDLE hLibInst;
                     48: 
                     49: /* function prototypes */
                     50: lpTable gtab_printsetup(HWND hwnd, lpTable ptab, HANDLE heap,
                     51:         lpPrintContext pcontext);
                     52: BOOL gtab_prtwidths(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext
                     53:         pcontext);
                     54: void gtab_printjob(HWND hwnd, lpTable ptab, lpPrintContext pcontext);
                     55: int APIENTRY AbortProc(HDC hpr, int code);
                     56: int APIENTRY AbortDlg(HWND hdlg, UINT msg, UINT wParam, LONG lParam);
                     57: BOOL gtab_printpage(HWND hwnd, lpTable ptab, lpPrintContext pcontext, int page);
                     58: void gtab_setrects(lpPrintContext pcontext, LPRECT rcinner, LPRECT rcouter);
                     59: void gtab_printhead(HWND hwnd, HDC hdc, lpTable ptab, lpTitle head, int page);
                     60: 
                     61: 
                     62: /***************************************************************************
                     63:  * Function: gtab_print
                     64:  *
                     65:  * Purpose:
                     66:  *
                     67:  * Prints a table.
                     68:  */
                     69: void
                     70: gtab_print(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext)
                     71: {
                     72:         BOOL fNoContext, fNoMargin, fNoPD;
                     73:         lpTable ptab_prt;
                     74: 
                     75:         fNoContext = FALSE;
                     76:         fNoPD = FALSE;
                     77:         fNoMargin = FALSE;
                     78: 
                     79:         if (pcontext == NULL) {
                     80:                 fNoContext = TRUE;
                     81:                 pcontext = (lpPrintContext) gmem_get(heap,
                     82:                         sizeof(PrintContext));
                     83:                 pcontext->head = pcontext->foot = NULL;
                     84:                 pcontext->margin = NULL;
                     85:                 pcontext->pd = NULL;
                     86:                 pcontext->id = 0;
                     87:         }
                     88:         if (pcontext->pd == NULL) {
                     89:                 fNoPD = TRUE;
                     90:         }
                     91:         if (pcontext->margin == NULL) {
                     92:                 fNoMargin = TRUE;
                     93:         }
                     94:         ptab_prt = gtab_printsetup(hwnd, ptab, heap, pcontext);
                     95: 
                     96:         if (ptab_prt != NULL) {
                     97:                 gtab_printjob(hwnd, ptab_prt, pcontext);
                     98: 
                     99:                 gtab_deltable(hwnd, ptab_prt);
                    100:         }
                    101:         if (fNoMargin) {
                    102:                 gmem_free(heap, (LPSTR)pcontext->margin,
                    103:                         sizeof(Margin));
                    104:                 pcontext->margin = NULL;
                    105:         }
                    106:         if (fNoPD) {
                    107:                 if (pcontext->pd->hDevMode != NULL) {
                    108:                         GlobalFree(pcontext->pd->hDevMode);
                    109:                 }
                    110:                 if (pcontext->pd->hDevNames != NULL) {
                    111:                         GlobalFree(pcontext->pd->hDevNames);
                    112:                 }
                    113:                 gmem_free(heap, (LPSTR) pcontext->pd, sizeof(PRINTDLG));
                    114:                 pcontext->pd = NULL;
                    115:         }
                    116:         if (fNoContext) {
                    117:                 gmem_free(heap, (LPSTR) pcontext, sizeof(PrintContext));
                    118:         }
                    119: }
                    120: 
                    121: 
                    122: 
                    123: /***************************************************************************
                    124:  * Function: gtab_printsetup
                    125:  *
                    126:  * Purpose:
                    127:  *
                    128:  * Sets up printercontext - builds lpTable for printer, incl. sizing
                    129:  * and initialises pcontext fields that may be null.
                    130:  */
                    131: lpTable
                    132: gtab_printsetup(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext)
                    133: {
                    134:         lpTable pprttab;
                    135:         PRINTDLG FAR * pd;
                    136:         int ncols, i;
                    137:         ColPropsList cplist;
                    138: 
                    139:         /* set fields for context that user left null */
                    140:         if (pcontext->margin == NULL) {
                    141:                 pcontext->margin = (lpMargin) gmem_get(heap, sizeof(Margin));
                    142:                 if (pcontext->margin == NULL) {
                    143:                         return(NULL);
                    144:                 }
                    145:                 pcontext->margin->left = 10;
                    146:                 pcontext->margin->right = 10;
                    147:                 pcontext->margin->top = 15;
                    148:                 pcontext->margin->bottom = 15;
                    149:                 pcontext->margin->topinner = 15;
                    150:                 pcontext->margin->bottominner = 15;
                    151:         }
                    152: 
                    153:         if (pcontext->pd == NULL) {
                    154:                 pd = (PRINTDLG FAR *) gmem_get(heap, sizeof(PRINTDLG));
                    155:                 if (pd == NULL) {
                    156:                         return(NULL);
                    157:                 }
                    158:                 pcontext->pd = pd;
                    159: 
                    160:                 pd->lStructSize = sizeof(PRINTDLG);
                    161:                 pd->hwndOwner = hwnd;
                    162:                 pd->hDevMode = (HANDLE) NULL;
                    163:                 pd->hDevNames = (HANDLE) NULL;
                    164:                 pd->Flags = PD_RETURNDC|PD_RETURNDEFAULT;
                    165: 
                    166:                 if (PrintDlg(pd) == FALSE) {
                    167:                         return(NULL);
                    168:                 }
                    169:         }
                    170: 
                    171:         /* now create a Table struct by querying the owner */
                    172:         pprttab = (lpTable) gmem_get(heap, sizeof(Table));
                    173: 
                    174:         if (pprttab == NULL) {
                    175:                 return(NULL);
                    176:         }
                    177:         pprttab->hdr = ptab->hdr;
                    178: 
                    179:         /* get the row/column count from owner window */
                    180:         if (pcontext->id == 0) {
                    181:                 pprttab->hdr.id = ptab->hdr.id;
                    182:         } else {
                    183:                 pprttab->hdr.id = pcontext->id;
                    184:         }
                    185:         pprttab->hdr.props.valid = 0;
                    186:         pprttab->hdr.sendscroll = FALSE;
                    187:         if (gtab_sendtq(hwnd, TQ_GETSIZE, (long) (LPSTR)&pprttab->hdr) == FALSE) {
                    188:                 return(NULL);
                    189:         }
                    190: 
                    191:         /* alloc and init the col data structs */
                    192:         ncols = pprttab->hdr.ncols;
                    193:         pprttab->pcolhdr = (lpColProps) gmem_get(heap, sizeof(ColProps) * ncols);
                    194:         if (pprttab->pcolhdr == NULL) {
                    195:                 gmem_free(heap, (LPSTR)pprttab, sizeof(Table));
                    196:                 return(NULL);
                    197:         }
                    198: 
                    199:         /* init col properties to default */
                    200:         for (i=0; i < ncols; i++) {
                    201:                 pprttab->pcolhdr[i].props.valid = 0;
                    202:                 pprttab->pcolhdr[i].nchars = 0;
                    203:         }
                    204:         /* get the column props from owner */
                    205:         cplist.plist = pprttab->pcolhdr;
                    206:         cplist.id = pprttab->hdr.id;
                    207:         cplist.startcol = 0;
                    208:         cplist.ncols = ncols;
                    209:         gtab_sendtq(hwnd, TQ_GETCOLPROPS, (long) (LPSTR)&cplist);
                    210: 
                    211: 
                    212:         pprttab->scrollscale = 1;
                    213:         pprttab->pcellpos = (lpCellPos) gmem_get(heap,
                    214:                 sizeof(CellPos) * ptab->hdr.ncols);
                    215:         if (pprttab->pcellpos == NULL) {
                    216:                 gmem_free(heap, (LPSTR) pprttab->pcolhdr, sizeof(ColProps) * ncols);
                    217:                 gmem_free(heap, (LPSTR)pprttab, sizeof(Table));
                    218:                 return(NULL);
                    219:         }
                    220:                 
                    221: 
                    222:         pprttab->pdata = NULL;
                    223:         pprttab->nlines = 0;
                    224: 
                    225:         if (!gtab_prtwidths(hwnd, pprttab, heap, pcontext)) {
                    226:                 gmem_free(heap, (LPSTR)pprttab->pcellpos,
                    227:                         sizeof(CellPos) * ptab->hdr.ncols);
                    228:                 gmem_free(heap, (LPSTR)pprttab, sizeof(Table));
                    229:                 return(NULL);
                    230:         }
                    231:         return(pprttab);
                    232: }
                    233: 
                    234: 
                    235: /***************************************************************************
                    236:  * Function: gtab_prtwidths
                    237:  *
                    238:  * Purpose:
                    239:  *
                    240:  * Calc the height/width settings and alloc line data 
                    241:  */
                    242: BOOL
                    243: gtab_prtwidths(HWND hwnd, lpTable ptab, HANDLE heap, lpPrintContext pcontext)
                    244: {
                    245:         TEXTMETRIC tm;
                    246:         int cx, cxtotal, i, curx, cury;
                    247:         lpProps hdrprops, cellprops;
                    248:         lpCellPos xpos, ypos;
                    249:         RECT rcinner, rcouter;
                    250: 
                    251:         hdrprops = &ptab->hdr.props;
                    252:         GetTextMetrics(pcontext->pd->hDC, &tm);
                    253:         ptab->avewidth = tm.tmAveCharWidth;
                    254:         ptab->rowheight = tm.tmHeight + tm.tmExternalLeading;
                    255:         if (hdrprops->valid & P_HEIGHT) {
                    256:                 ptab->rowheight = hdrprops->height;
                    257:         }
                    258: 
                    259:         /* set sizes for headers */
                    260:         gtab_setrects(pcontext, &rcinner, &rcouter);
                    261: 
                    262:         /* set width/pos for each col. */
                    263:         cxtotal = 0;
                    264:         curx = rcinner.left;
                    265:         for (i = 0; i < ptab->hdr.ncols; i++) {
                    266:                 cellprops = &ptab->pcolhdr[i].props;
                    267:                 xpos = &ptab->pcellpos[i];
                    268: 
                    269:                 if (cellprops->valid & P_WIDTH) {
                    270:                         cx = cellprops->width;
                    271:                 } else if (hdrprops->valid & P_WIDTH) {
                    272:                         cx = hdrprops->width;
                    273:                 } else {
                    274:                         cx = ptab->pcolhdr[i].nchars + 1;
                    275:                         cx *= ptab->avewidth;
                    276:                 }
                    277:                 /* add 2 for intercol spacing */
                    278:                 cx += 2;
                    279: 
                    280:                 xpos->size = cx;
                    281:                 xpos->start = curx + 1;
                    282:                 xpos->clipstart = xpos->start;
                    283:                 xpos->clipend = xpos->start + xpos->size - 2;
                    284:                 xpos->clipend = min(xpos->clipend, rcinner.right);
                    285: 
                    286:                 cxtotal += xpos->size;
                    287:                 curx += xpos->size;
                    288:         }
                    289:         ptab->rowwidth = cxtotal;
                    290: 
                    291:         if(pcontext->head != NULL) {
                    292:                 xpos = &pcontext->head->xpos;
                    293:                 ypos = &pcontext->head->ypos;
                    294: 
                    295:                 xpos->start = rcouter.left + 1;
                    296:                 xpos->clipstart = rcouter.left + 1;
                    297:                 xpos->clipend = rcouter.right - 1;
                    298:                 xpos->size = rcouter.right - rcouter.left;
                    299: 
                    300:                 ypos->start = rcouter.top;
                    301:                 ypos->clipstart = rcouter.top;
                    302:                 ypos->clipend = rcinner.top;
                    303:                 ypos->size = ptab->rowheight;
                    304:         }
                    305: 
                    306:         if (pcontext->foot != NULL) {
                    307:                 xpos = &pcontext->foot->xpos;
                    308:                 ypos = &pcontext->foot->ypos;
                    309: 
                    310:                 xpos->start = rcouter.left + 1;
                    311:                 xpos->clipstart = rcouter.left + 1;
                    312:                 xpos->clipend = rcouter.right - 1;
                    313:                 xpos->size = rcouter.right - rcouter.left;
                    314: 
                    315:                 ypos->start = rcouter.bottom - ptab->rowheight;
                    316:                 ypos->clipstart = rcinner.bottom;
                    317:                 ypos->clipend = rcouter.bottom;
                    318:                 ypos->size = ptab->rowheight;
                    319:         }
                    320: 
                    321:         /* set nr of lines per page */
                    322:         ptab->nlines = (rcinner.bottom - rcinner.top) / ptab->rowheight;
                    323:         if (!gtab_alloclinedata(hwnd, heap, ptab)) {
                    324:                 return(FALSE);
                    325:         }
                    326:         /* set line positions */
                    327:         cury = rcinner.top;
                    328:         for (i = 0; i < ptab->nlines; i++) {
                    329:                 ypos = &ptab->pdata[i].linepos;
                    330:                 ypos->start = cury;
                    331:                 ypos->clipstart = ypos->start;
                    332:                 ypos->clipend = ypos->start + ypos->size;
                    333:                 ypos->clipend = min(ypos->clipend, rcinner.bottom);
                    334:                 cury += ypos->size;
                    335:         }
                    336:         return(TRUE);
                    337: }
                    338: 
                    339: 
                    340: /* static information for this module */
                    341: BOOL bAbort;
                    342: FARPROC lpAbortProc;
                    343: DLGPROC lpAbortDlg;
                    344: HWND hAbortWnd;
                    345: int npage;
                    346: int pages;
                    347: 
                    348: /***************************************************************************
                    349:  * Function: gtab_printjob
                    350:  *
                    351:  * Purpose:
                    352:  *
                    353:  * Sets up print job and dialogs
                    354:  */ 
                    355: void
                    356: gtab_printjob(HWND hwnd, lpTable ptab, lpPrintContext pcontext)
                    357: {
                    358:         int moveables;
                    359:         int endpage;
                    360:         int startpage = 1;
                    361:         HDC hpr;
                    362:         int status;
                    363:         HANDLE hcurs;
                    364:         static char str[256];
                    365:         DOCINFO di;
                    366: 
                    367:         hcurs = SetCursor(LoadCursor(NULL, IDC_WAIT));
                    368: 
                    369:         moveables = ptab->nlines - ptab->hdr.fixedrows;
                    370:         pages = (int) (ptab->hdr.nrows - ptab->hdr.fixedrows + moveables - 1)
                    371:                         / moveables;
                    372:         endpage = pages;
                    373: 
                    374:         if (pcontext->pd->Flags & PD_PAGENUMS) {
                    375:                 startpage = pcontext->pd->nFromPage;
                    376:                 endpage = pcontext->pd->nToPage;
                    377:         }
                    378:         hpr = pcontext->pd->hDC;
                    379: 
                    380:         lpAbortDlg = (DLGPROC) MakeProcInstance((WNDPROC) AbortDlg, hLibInst);
                    381:         lpAbortProc = (FARPROC) MakeProcInstance((WNDPROC)AbortProc, hLibInst);
                    382: 
                    383:         SetAbortProc(hpr, (ABORTPROC) lpAbortProc);
                    384: 
                    385:         di.lpszDocName = "Table";
                    386:         di.cbSize = lstrlen(di.lpszDocName);
                    387:         di.lpszOutput = NULL;
                    388: 
                    389:         StartDoc(hpr, &di);
                    390: 
                    391:         bAbort = FALSE;
                    392: 
                    393:         /* add abort modeless dialog later!! */
                    394:         hAbortWnd = CreateDialog(hLibInst, "GABRTDLG", hwnd, lpAbortDlg);
                    395:         if (hAbortWnd != NULL) {
                    396:                 ShowWindow(hAbortWnd, SW_NORMAL);
                    397:                 EnableWindow(hwnd, FALSE);
                    398:         }
                    399:         SetCursor(hcurs);
                    400: 
                    401: 
                    402:         for (npage = startpage; npage<=endpage; npage++) {
                    403:                 wsprintf(str, "Page %d of %d pages",  npage, pages);
                    404:                 SetDlgItemText(hAbortWnd, IDC_LPAGENR, str);
                    405:                 status = gtab_printpage(hwnd, ptab, pcontext, npage);
                    406:                 if (status < 0) {
                    407:                         AbortDoc(hpr);
                    408:                         break;
                    409:                 }
                    410:         }
                    411:         if (status >= 0) {
                    412:                 EndDoc(hpr);
                    413:         }
                    414:         
                    415:         if (hAbortWnd != NULL) {
                    416:                 EnableWindow(hwnd, TRUE);
                    417:                 DestroyWindow(hAbortWnd);
                    418:         }
                    419:         FreeProcInstance((WNDPROC) lpAbortDlg);
                    420:         FreeProcInstance(lpAbortProc);
                    421: 
                    422:         DeleteDC(hpr);
                    423: }
                    424: 
                    425: /***************************************************************************
                    426:  * Function: AbortProc
                    427:  *
                    428:  * Purpose:
                    429:  *
                    430:  * Abort procedure for print job
                    431:  */
                    432: int APIENTRY
                    433: AbortProc(HDC hpr, int code)
                    434: {
                    435: 
                    436:         MSG msg;
                    437: 
                    438:         if (!hAbortWnd) {
                    439:                 return(TRUE);
                    440:         }
                    441:         while (!bAbort && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                    442:                 if (!IsDialogMessage(hAbortWnd, &msg)) {
                    443:                         TranslateMessage(&msg);
                    444:                         DispatchMessage(&msg);
                    445:                 }
                    446:         }
                    447:         return(!bAbort);
                    448: }
                    449: 
                    450: /***************************************************************************
                    451:  * Function: AbortDlg
                    452:  *
                    453:  * Purpose:
                    454:  *
                    455:  * Dialog for abort procedure
                    456:  */
                    457: int APIENTRY
                    458: AbortDlg(HWND hdlg, UINT msg, UINT wParam, LONG lParam)
                    459: {
                    460:         switch(msg) {
                    461: 
                    462:         case WM_COMMAND:
                    463:                 bAbort = TRUE;
                    464:                 EndDialog(hdlg, TRUE);
                    465:                 return TRUE;
                    466: 
                    467:         case WM_INITDIALOG:
                    468:                 return TRUE;
                    469:         }
                    470:         return(FALSE);
                    471: }
                    472: 
                    473: /***************************************************************************
                    474:  * Function: gtab_printpage
                    475:  *
                    476:  * Purpose:
                    477:  *
                    478:  * Print a single page. page number is 1-based
                    479:  */
                    480: BOOL
                    481: gtab_printpage(HWND hwnd, lpTable ptab, lpPrintContext pcontext, int page)
                    482: {
                    483:         HDC hpr;
                    484:         int moveables, i;
                    485:         int x1, y1, x2, y2;
                    486: 
                    487:         hpr = pcontext->pd->hDC;
                    488:         StartPage(hpr);
                    489: 
                    490:         moveables = ptab->nlines - ptab->hdr.fixedrows;
                    491:         ptab->toprow = moveables * (page-1);
                    492:         gtab_invallines(hwnd, ptab, ptab->hdr.fixedrows, moveables);
                    493: 
                    494:         for (i =0; i < ptab->nlines; i++) {
                    495:                 gtab_paint(hwnd, hpr, ptab, i);
                    496:         }
                    497:         if ((ptab->hdr.vseparator) && (ptab->hdr.fixedcols > 0)) {
                    498:                 x1 = ptab->pcellpos[ptab->hdr.fixedcols -1].clipend+1;
                    499:                 y1 = ptab->pdata[0].linepos.clipstart;
                    500:                 y2 = ptab->pdata[ptab->nlines-1].linepos.clipend;
                    501:                 MoveToEx(hpr, x1, y1, NULL);
                    502:                 LineTo(hpr, x1, y2);
                    503:         }
                    504:         if ((ptab->hdr.hseparator) && (ptab->hdr.fixedrows > 0)) {
                    505:                 y1 = ptab->pdata[ptab->hdr.fixedrows-1].linepos.clipend;
                    506:                 x1 = ptab->pcellpos[0].clipstart;
                    507:                 x2 = ptab->pcellpos[ptab->hdr.ncols-1].clipend;
                    508:                 MoveToEx(hpr, x1, y1, NULL);
                    509:                 LineTo(hpr, x2, y1);
                    510:         }
                    511: 
                    512:         if (pcontext->head != NULL) {
                    513:                 gtab_printhead(hwnd, hpr, ptab, pcontext->head, page);
                    514:         }
                    515:         if (pcontext->foot != NULL) {
                    516:                 gtab_printhead(hwnd, hpr, ptab, pcontext->foot, page);
                    517:         }
                    518: 
                    519:         return(EndPage(hpr));
                    520: }
                    521: 
                    522: 
                    523: /***************************************************************************
                    524:  * Function: gtab_setrects
                    525:  *
                    526:  * Purpose:
                    527:  *
                    528:  * Calculate the outline positions in pixels for the headers
                    529:  * (outer rect) and for the page itself (inner rect). Based on
                    530:  * page size and PrintContext margin info (which is in millimetres).
                    531:  */
                    532: void
                    533: gtab_setrects(lpPrintContext pcontext, LPRECT rcinner, LPRECT rcouter)
                    534: {
                    535:         HDC hpr;
                    536:         int hpixels, hmms;
                    537:         int vpixels, vmms;
                    538:         int h_pixpermm, v_pixpermm;
                    539: 
                    540:         hpr = pcontext->pd->hDC;
                    541:         hpixels = GetDeviceCaps(hpr, HORZRES);
                    542:         vpixels = GetDeviceCaps(hpr, VERTRES);
                    543:         vmms = GetDeviceCaps(hpr, VERTSIZE);
                    544:         hmms = GetDeviceCaps(hpr, HORZSIZE);
                    545: 
                    546:         h_pixpermm = hpixels / hmms;
                    547:         v_pixpermm = vpixels / vmms;
                    548: 
                    549:         rcouter->top = (pcontext->margin->top * v_pixpermm);
                    550:         rcouter->bottom = vpixels - (pcontext->margin->bottom * v_pixpermm);
                    551:         rcouter->left = (pcontext->margin->left * h_pixpermm);
                    552:         rcouter->right = hpixels - (pcontext->margin->right * h_pixpermm);
                    553: 
                    554:         rcinner->left = rcouter->left;
                    555:         rcinner->right = rcouter->right;
                    556:         rcinner->top = rcouter->top +
                    557:                 (pcontext->margin->topinner * v_pixpermm);
                    558:         rcinner->bottom = rcouter->bottom -
                    559:                 (pcontext->margin->bottominner * v_pixpermm);
                    560: }
                    561: 
                    562: 
                    563: /***************************************************************************
                    564:  * Function: gtab_printhead
                    565:  *
                    566:  * Purpose:
                    567:  *
                    568:  * Print header information
                    569:  */
                    570: void
                    571: gtab_printhead(HWND hwnd, HDC hdc, lpTable ptab, lpTitle head, int page)
                    572: {
                    573:         RECT rc, rcbox;
                    574:         int i, cx, x, y, tab;
                    575:         UINT align;
                    576:         LPSTR chp, tabp;
                    577:         DWORD fcol, bkcol;
                    578:         char str[256];
                    579: 
                    580:         rc.top = head->ypos.clipstart;
                    581:         rc.bottom = head->ypos.clipend;
                    582:         rc.left = head->xpos.clipstart;
                    583:         rc.right = head->xpos.clipend;
                    584: 
                    585:         /* update page number */
                    586:         chp = str;
                    587:         for (i = 0; i < lstrlen(head->ptext); i++) {
                    588:                 switch(head->ptext[i]) {
                    589: 
                    590:                 case '#':
                    591:                         chp += wsprintf(chp, "%d", page);
                    592:                         break;
                    593:                 
                    594:                 case '$':
                    595:                         chp += wsprintf(chp, "%d", pages);
                    596:                         break;
                    597:                 
                    598:                 default:
                    599:                         *chp++ = head->ptext[i];
                    600:                         break;
                    601:                 }
                    602:         }
                    603:         *chp = '\0';
                    604:         chp = str;
                    605: 
                    606:         if (head->props.valid & P_ALIGN) {
                    607:                 align = head->props.alignment;
                    608:         } else {
                    609:                 align = P_LEFT;
                    610:         }
                    611: 
                    612:         /* set colours if not default */
                    613:         if (head->props.valid & P_FCOLOUR) {
                    614:                 fcol = SetTextColor(hdc, head->props.forecolour);
                    615:         }
                    616:         if (head->props.valid & P_BCOLOUR) {
                    617:                 bkcol = SetBkColor(hdc, head->props.backcolour);
                    618:         }
                    619: 
                    620:         /* calc offset of text within cell for right-align or centering */
                    621:         if (align == P_LEFT) {
                    622:                 cx = ptab->avewidth/2;
                    623:         } else {
                    624:                 cx = LOWORD(GetTextExtent(hdc, chp, lstrlen(chp)));
                    625:                 if (align == P_CENTRE) {
                    626:                         cx = (head->xpos.size - cx) / 2;
                    627:                 } else {
                    628:                         cx = head->xpos.size - cx - (ptab->avewidth/2);
                    629:                 }
                    630:         }
                    631:         cx += head->xpos.start;
                    632: 
                    633:         /* expand tabs on output */
                    634:         tab = ptab->avewidth * 8;
                    635:         x = 0;
                    636:         y = head->ypos.start;
                    637: 
                    638:         for ( ; (tabp = strchr(chp, '\t')) != NULL; ) {
                    639:                 /* perform output upto tab char */
                    640:                 ExtTextOut(hdc, x+cx, y, ETO_CLIPPED, &rc, chp, tabp-chp, NULL);
                    641:                 
                    642:                 /* advance past the tab */
                    643:                 x += LOWORD(GetTextExtent(hdc, chp, tabp - chp));
                    644:                 x = ( (x + tab) / tab) * tab;
                    645:                 chp = ++tabp;
                    646:         }
                    647: 
                    648:         /*no more tabs - output rest of string */
                    649:         ExtTextOut(hdc, x+cx, y, ETO_CLIPPED, &rc, chp, lstrlen(chp), NULL);
                    650: 
                    651:         /* reset colours to original if not default */
                    652:         if (head->props.valid & P_FCOLOUR) {
                    653:                 SetTextColor(hdc, fcol);
                    654:         }
                    655:         if (head->props.valid & P_BCOLOUR) {
                    656:                 SetBkColor(hdc, bkcol);
                    657:         }
                    658: 
                    659:         /* now box cell if marked */
                    660:         if (head->props.valid & P_BOX) {
                    661:                 if (head->props.box != 0) {
                    662:                         rcbox.top = head->ypos.start;
                    663:                         rcbox.bottom = rcbox.top + head->ypos.size;
                    664:                         rcbox.left = head->xpos.start;
                    665:                         rcbox.right = rcbox.left + head->xpos.size;
                    666:                         gtab_boxcell(hwnd, hdc, &rcbox, &rc, head->props.box);
                    667:                 }
                    668:         }
                    669: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.