home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / tplab009.zip / tl_paint.cpp < prev    next >
C/C++ Source or Header  |  1996-05-05  |  9KB  |  259 lines

  1. /* 
  2.  
  3.  
  4.     tl_paint.cpp (emx+gcc) 
  5.     Tape Label Editor Version 0.09
  6.  
  7.     1995 1996 Giovanni Iachello
  8.     This is freeware software. You can use or modify it as you wish,
  9.     provided that the part of code that I wrote remains freeware.
  10.     Freeware means that the source code must be available on request 
  11.     to anyone.
  12.     You must also include this notice in all files derived from this
  13.     file.
  14.  
  15.  
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <time.h>
  22. #include "tapelab.h"
  23. #include "pmdlg.h"
  24. #include "pmgpi.h"
  25. #include "pmstdres.h"
  26.  
  27.  
  28.  
  29. BOOL TapeLab::paint(PMPresSpace& ps)
  30. {
  31.     PMRect rcl;
  32.     rcl=this;
  33.  
  34.     // inizializzazione
  35.     ps.fillRect(&rcl,CLR_PALEGRAY);
  36.     SIZEL size;
  37.     size.cx=1500;
  38.     size.cy=fixpoints[labelformat.size][0].y+100;
  39.     ps.set(&size,PU_LOMETRIC);
  40.  
  41.     PMRect q;
  42.     ps.queryPageViewport(&q);
  43.  
  44.     if ( sizey==-1 ) {
  45.         sizey=rcl.yTop;
  46.     } 
  47.     if ( posy==-1 ) {
  48.         posy=q.yTop-sizey;
  49.     } 
  50.     PMRect r(0,-posy,q.xRight,q.yTop-posy);
  51.     ps.setPageViewport(&r);
  52.     sb->setScrollBar(q.yTop-sizey-posy,0,q.yTop-sizey);
  53.     sb->setThumbSize(sizey,q.yTop);
  54.         
  55.     // scatola bianca | white box
  56.     ps.setColor(CLR_WHITE);
  57.     ps.move(&fixpoints[labelformat.size][0]);
  58.     ps.box(DRO_FILL,&fixpoints[labelformat.size][labelformat.flaps*2 +1]);
  59.     return paintlabel(ps);
  60. }
  61.  
  62.  
  63. // parte in comune fra stampante e schermo
  64.  
  65. BOOL TapeLab::paintlabel(PMPresSpace& ps) 
  66. {
  67.     
  68.     ps.setColor(CLR_BLACK);
  69.  
  70.     // righe orizzontali
  71.     int i;
  72.     for (i=0; i<=labelformat.flaps; i++) {
  73.         if (i>0 && i<labelformat.flaps) ps.setLineType(LINETYPE_DOT); 
  74.             else ps.setLineType(LINETYPE_DEFAULT);
  75.         ps.move(&fixpoints[labelformat.size][i*2]);
  76.         ps.line(&fixpoints[labelformat.size][i*2+1]);
  77.     }
  78.     // righe verticali
  79.     ps.move(&fixpoints[labelformat.size][0]);
  80.     ps.line(&fixpoints[labelformat.size][ labelformat.flaps * 2 ]);
  81.     ps.move(&fixpoints[labelformat.size][1]);
  82.     ps.line(&fixpoints[labelformat.size][ ( labelformat.flaps * 2 ) + 1 ]);
  83.  
  84.     // esegue clip dentro a rettangolo dell'etichetta!
  85.     PMRect clip(fixpoints[labelformat.size][labelformat.flaps*2],fixpoints[labelformat.size][1]);
  86.     ps.intersectClipRectangle(&clip);
  87.  
  88.     // titolo
  89.     PMPoint a;
  90.     if (labelformat.title2[0] != '\0') { // ci sono 2 titoli
  91.         a.y=(fixpoints[labelformat.size][2].y+fixpoints[labelformat.size][4].y)/2;
  92.         a.x=fixpoints[labelformat.size][2].x+labelformat.form.titlelm;
  93.         a.y=a.y+ (((fixpoints[labelformat.size][2].y-fixpoints[labelformat.size][4].y)/2)-pts2dmm(labelformat.title1font.height))/2 ;
  94.         paintString(labelformat.title1,&labelformat.title1font,1000L,a,ps);
  95.  
  96.         a.y=fixpoints[labelformat.size][4].y; 
  97.         a.x=fixpoints[labelformat.size][2].x+labelformat.form.titlelm;
  98.         a.y=a.y+ (((fixpoints[labelformat.size][2].y-fixpoints[labelformat.size][4].y)/2)-pts2dmm(labelformat.title2font.height))/2 ;
  99.         paintString(labelformat.title2,&labelformat.title2font,1000L,a,ps);
  100.     } else { // c'e' un solo titolo
  101.         a.x=fixpoints[labelformat.size][2].x+labelformat.form.titlelm;
  102.         a.y=(fixpoints[labelformat.size][2].y+fixpoints[labelformat.size][4].y-pts2dmm(labelformat.title1font.height)) / 2 ;
  103.         paintString(labelformat.title1,&labelformat.title1font,1000L,a,ps);
  104.     }
  105.     // testo
  106.     a.y=fixpoints[labelformat.size][4].y-pts2dmm(labelformat.text1font.height)-labelformat.form.texttm; 
  107.     a.x=fixpoints[labelformat.size][4].x+labelformat.form.textlm;
  108.     paintString(labelformat.text1,&labelformat.text1font,labelformat.form.textvert1,a,ps);
  109.  
  110.     a.y=fixpoints[labelformat.size][4].y-pts2dmm(labelformat.text1font.height)-labelformat.form.texttm; 
  111.     a.x=(fixpoints[labelformat.size][4].x+fixpoints[labelformat.size][5].x)/2+labelformat.form.textlm;
  112.     paintString(labelformat.text2,&labelformat.text2font,labelformat.form.textvert2,a,ps);
  113.  
  114.     
  115.     if (labelformat.size != 2 && labelformat.flaps > 2) {
  116.         a.y=fixpoints[labelformat.size][0].y-pts2dmm(labelformat.datefont.height)-15; 
  117.         // data A
  118.         if (labelformat.whatinfo[0]) {
  119.             a.x=fixpoints[labelformat.size][0].x+20;
  120.             paintString(labelformat.date1,&labelformat.datefont,1000L,a,ps);
  121.         }
  122.         // data B
  123.         if (labelformat.whatinfo[1]) {
  124.             a.x=fixpoints[labelformat.size][1].x-queryStrWidth(labelformat.date2,&labelformat.datefont,ps)-20;
  125.             paintString(labelformat.date2,&labelformat.datefont,1000L,a,ps);
  126.         }
  127.         // "DATE"
  128.         if (labelformat.whatinfo[1] || labelformat.whatinfo[0]) {
  129.             a.x=(fixpoints[labelformat.size][0].x+fixpoints[labelformat.size][1].x-queryStrWidth("DATE",&labelformat.datefont,ps))/2;
  130.             paintString("DATE",&labelformat.datefont,1000L,a,ps);
  131.             a.y-=pts2dmm(labelformat.sourcefont.height); // se c'era uno dei due abbassati...
  132.         }
  133.  
  134.         // source A
  135.         if (labelformat.whatinfo[4]) {
  136.             a.x=fixpoints[labelformat.size][0].x+20;
  137.             paintString(apchSources[labelformat.source1],&labelformat.sourcefont,1000L,a,ps);
  138.         }
  139.         // source B            
  140.         if (labelformat.whatinfo[5]) {
  141.             a.x=fixpoints[labelformat.size][1].x-queryStrWidth(apchSources[labelformat.source2],&labelformat.sourcefont,ps)-20;
  142.             paintString(apchSources[labelformat.source2],&labelformat.sourcefont,1000L,a,ps);
  143.         }
  144.         // "SOURCE"
  145.         if (labelformat.whatinfo[4] || labelformat.whatinfo[5]) {
  146.             a.x=(fixpoints[labelformat.size][0].x+fixpoints[labelformat.size][1].x-queryStrWidth("SOURCE",&labelformat.sourcefont,ps))/2;
  147.             paintString("SOURCE",&labelformat.sourcefont,1000L,a,ps);
  148.             a.y-=pts2dmm(labelformat.nrfont.height); 
  149.         }
  150.  
  151.         // NR A
  152.         if (labelformat.whatinfo[2]) {
  153.             a.x=fixpoints[labelformat.size][0].x+20;
  154.             paintString(apchNR[labelformat.nr1],&labelformat.nrfont,1000L,a,ps);
  155.         }
  156.         // NR B
  157.         if (labelformat.whatinfo[3]) {
  158.             a.x=fixpoints[labelformat.size][1].x-queryStrWidth(apchNR[labelformat.nr2],&labelformat.nrfont,ps)-20;
  159.             paintString(apchNR[labelformat.nr2],&labelformat.nrfont,1000L,a,ps);
  160.         }
  161.         // "NR"
  162.         if (labelformat.whatinfo[2] || labelformat.whatinfo[3]) {
  163.             a.x=(fixpoints[labelformat.size][0].x+fixpoints[labelformat.size][1].x-queryStrWidth("NR",&labelformat.nrfont,ps))/2;
  164.             paintString("NR",&labelformat.sourcefont,1000L,a,ps);
  165.         }
  166.     }
  167.     return TRUE;
  168. }
  169.  
  170. BOOL TapeLab::paintString(char* str,_fontinfo *font,int spc,PMPoint pos,PMPresSpace &ps)
  171. {
  172.     FONTMETRICS fm;
  173.     PMLogFont f(ps,&font->fattrs);
  174.     ps.setCharSet(f);
  175.  
  176.     SIZEF csize;
  177.     csize.cy=MAKEFIXED(font->height*254L/72L,0);   // [punti] * [decimillimetri]/[pollice] * 1/[punti]/[pollice]
  178.     csize.cx=(font->height << 16)*254L/72L;
  179.     ps.setCharBox(&csize);
  180.     ps.queryFontMetrics(&fm);      // chiedi i fontmetrics
  181.  
  182.     pos.y += fm.lMaxDescender;    // e alza il font a causa del descender
  183.     
  184.     char* p=str,*start;
  185.     int line=0,x=0,pageadj=0;
  186.     while (*p) {        // finche' la str non finisce
  187.         int len=0;
  188.         start=p;
  189.         while (*p!=0xd && *p!=0x9 && *p) { len++; p++; }  // cerca newline, tab, o fine str
  190.         PMPoint off(x,-pageadj-( line*( ( font->height * spc / 1000L ) + font->extleading ) *254L /72L)  );       // calcola posizione
  191.         off=off+pos;
  192.  
  193.         if (off.y-fm.lMaxDescender<fixpoints[labelformat.size][6].y && pageadj==0) { // siamo passati sulla nuova pagina, aggiusta di conseguenza...
  194.             pageadj=off.y-(pos.y-fixpoints[labelformat.size][4].y+fixpoints[labelformat.size][6].y);
  195.             off.y-=pageadj;
  196.         }        
  197.         ps.charStringAt(&off,len,start);           // stampa
  198.  
  199.         if (*p==0x9) { // tabba
  200.             POINTL aptlPoints[TXTBOX_COUNT];
  201.             p++;
  202.             ps.queryTextBox (len,start, TXTBOX_COUNT, aptlPoints);
  203.             x+=(aptlPoints[TXTBOX_TOPRIGHT].x/labelformat.form.tabsize + 1 )* labelformat.form.tabsize; 
  204.  
  205.         } else {
  206.             line++;
  207.             x=0;        // ritorno a capo significa eliminare offset x
  208.             if (*p==0xd) p++;                       // skippa 0xd
  209.             if (*p==0xa) p++;                       // skippa 0xa
  210.         }
  211.     }
  212.     return TRUE;
  213. }
  214.  
  215. LONG TapeLab::queryStrWidth(PSZ pszString,_fontinfo *font,PMPresSpace &ps)
  216. {
  217.     PMLogFont f(ps,&font->fattrs);
  218.     ps.setCharSet(f);
  219.     return ps.queryTextBoxWidth(pszString);
  220. }
  221.  
  222. BOOL TapeLab::setFont(_fontinfo *font,char* title)
  223. {
  224.     FONTMETRICS fm;
  225.     PMWindowPresSpace ps(this);      // crea pres space della finestra
  226.     SIZEL size;
  227.     size.cx=1500;
  228.     size.cy=1800;
  229.     ps.set(&size,PU_LOMETRIC);
  230.     PMLogFont f(ps,&font->fattrs);          // crea font
  231.     ps.setCharSet(f);              // imposta font
  232.  
  233.     SIZEF csize;
  234.     csize.cy=(font->height << 16)*254L/72L;
  235.     csize.cx=(font->height << 16)*254L/72L;
  236.     ps.setCharBox(&csize);
  237.  
  238.     ps.queryFontMetrics(&fm);      // chiedi i fontmetrics
  239.     fm.sNominalPointSize=font->point*10;
  240.     PMFontDialog fd(HWND_DESKTOP,hwnd, &fm,font->type,title,"Preview");
  241.     int ret=fd.createWin();          // fai scegliere all'utente
  242.     FONTDLG fi=fd;
  243.     if ( ret == DID_OK ) {
  244.         font->fattrs=fi.fAttrs; 
  245.         font->height=fi.lEmHeight;
  246.         font->extleading=fi.lExternalLeading;
  247.         font->type=fi.flType;
  248.         font->point=FIXEDINT(fi.fxPointSize);
  249.         font->fattrs.lMaxBaselineExt = 0L;
  250.         font->fattrs.lAveCharWidth = 0L; 
  251.         setModified(TRUE);
  252.         invalidate(TRUE);
  253.         return TRUE;
  254.     }
  255.     return FALSE;
  256. }
  257.  
  258.  
  259.