1: /* $Id: 1048613.html,v 1.1.1.1 2000/08/28 11:39:25 hidetosi Exp $ */
   2: #include <btron/btron.h>
   3: #include <btron/hmi.h>
   4: #include <btron/vobj.h>
   5: #include <typedef.h>
   6: #include <bstdlib.h>
   7: #include "paperbox.h"
   8: #include "view.h"
   9: #include "doc.h"
  10: #include "databox.h"
  11: 
  12: 
  13: #define REDISPRECTNUM 10 /* 再表示用の矩形リストの数 */
  14: 
  15: /* -------------------- 選択枠関係 -------------------- */
  16: 
  17: 
  18: SEL_LIST* slSelectFrameList=NULL; /* 選択枠リスト */
  19: 
  20: /* 選択枠の表示 */
  21: void DrawSelectFrame(W aidWnd,W awMode,W awDx,W awDy)
  22: /* aidWnd; 値がマイナスなら描画環境 */
  23: {
  24:         W idDrawEnv;
  25:         RECT rctWork;
  26: 
  27:         if(slSelectFrameList==NULL)
  28:                return;
  29:         if(aidWnd>0) /* ウインドウに描くとき */
  30:         {
  31:                idDrawEnv=wget_gid(aidWnd);
  32:                wget_wrk(aidWnd,&rctWork);
  33:                gset_vis(idDrawEnv,rctWork); /* 領域のセット */
  34:         }else /* 描画環境に描くとき */
  35:                idDrawEnv=-aidWnd;
  36:         adsp_slt(idDrawEnv,slSelectFrameList,awMode,awDx,awDy); /* 選択枠を表示 */
  37: }
  38: 
  39: BOOL MakeSelectFrame(void)
  40: {
  41:         static SEL_LIST slFrame;
  42:         DOCITERATOR diVobj;
  43: 
  44:         if(GetSelectedVobj()==NULL)
  45:         {
  46:                slSelectFrameList=NULL;
  47:                return TRUE;
  48:         }
  49:         slSelectFrameList=&slFrame;
  50:         diVobj=GetSelectedVobj();
  51:         slSelectFrameList[0].next=NULL;
  52:         slSelectFrameList[0].rgn.sts=0x0000;
  53:         slSelectFrameList[0].rgn.rgn.r=GetRect(diVobj);
  54: 
  55:         return TRUE;
  56: }
  57: 
  58: 
  59: /* -------------------- 描画関係 -------------------- */
  60: 
  61: #define PAPERNUM 3
  62: #define PAPERSPACE 2
  63: 
  64: /* 紙を重ねた物の表示 */
  65: void DispPaper(W aidDrawEnv,RECT arctPaper)
  66: {
  67:         PAT paWhite;
  68:         PAT paBlack;
  69:         int i;
  70: 
  71:         paWhite.spat.kind=0;
  72:         paWhite.spat.hsize=8;
  73:         paWhite.spat.vsize=8;
  74:         paWhite.spat.fgcol=0x1fffffffL;
  75:         paWhite.spat.bgcol=0;
  76:         paWhite.spat.mask=FILL100;
  77: 
  78:         paBlack.spat.kind=0;
  79:         paBlack.spat.hsize=8;
  80:         paBlack.spat.vsize=8;
  81:         paBlack.spat.fgcol=0x10000000L;
  82:         paBlack.spat.bgcol=0;
  83:         paBlack.spat.mask=FILL100;
  84: 
  85:         arctPaper.c.left+=PAPERSPACE*PAPERNUM;
  86:         arctPaper.c.top+=PAPERSPACE*PAPERNUM;
  87:         arctPaper.c.right+=PAPERSPACE*PAPERNUM;
  88:         arctPaper.c.bottom+=PAPERSPACE*PAPERNUM;
  89:         for(i=0; i<PAPERNUM; i++)
  90:         {
  91:                arctPaper.c.left-=PAPERSPACE;
  92:                arctPaper.c.top-=PAPERSPACE;
  93:                arctPaper.c.right-=PAPERSPACE;
  94:                arctPaper.c.bottom-=PAPERSPACE;
  95:                gfil_rec(aidDrawEnv,arctPaper,&paWhite,0,G_STORE);
  96:                gfra_rec(aidDrawEnv,arctPaper,0x0001,&paBlack,0,G_STORE);
  97:         }
  98: }
  99: 
 100: void DrawOneRect(W aidWnd,RECT arctDraw)
 101: {
 102:         W idDrawEnv;
 103:         DOCITERATOR diCurrent;
 104: 
 105:         idDrawEnv=wget_gid((aidWnd<0)?(-aidWnd):aidWnd); /* 描画環境の取得 */
 106:         gset_vis(idDrawEnv,arctDraw); /* 領域のセット */
 107: 
 108:         wera_wnd((aidWnd<0)?(-aidWnd):aidWnd,&arctDraw); /* 背景色で塗りつぶす */
 109:         diCurrent=NULL;
 110:         while( (diCurrent=GetNext(diCurrent)) !=NULL )
 111:         {
 112:                RECT rctVobj;
 113: 
 114:                rctVobj=GetRect(diCurrent);
 115:                if(IsFusen(diCurrent)) /* 付箋 */
 116:                {
 117:                      if(!(rctVobj.c.right<arctDraw.c.left||
 118:                            rctVobj.c.left>arctDraw.c.right||
 119:                            rctVobj.c.bottom<arctDraw.c.top||
 120:                            rctVobj.c.top>arctDraw.c.bottom  ))
 121:                           /* 表示領域に入っていたら */
 122:                      {
 123:                           if(aidWnd<0)
 124:                               odsp_vob(GetVID(diCurrent),&arctDraw,V_DISP|V_NOFRAME);
 125:                           else
 126:                               odsp_vob(GetVID(diCurrent),&arctDraw,V_DISPALL);
 127:                      }
 128:                }else{ /* 仮身 */
 129:                      if(!(rctVobj.c.right+PAPERSPACE*PAPERNUM<arctDraw.c.left||
 130:                           rctVobj.c.left>arctDraw.c.right||
 131:                           rctVobj.c.bottom+PAPERSPACE*PAPERNUM<arctDraw.c.top||
 132:                           rctVobj.c.top>arctDraw.c.bottom ))
 133:                      { /* 表示領域に入っていたら */
 134:                           DispPaper(idDrawEnv,rctVobj); /* 紙を重ねた物の表示 */
 135:                           if(aidWnd<0)
 136:                               odsp_vob(GetVID(diCurrent),&arctDraw,V_DISP|V_NOFRAME);
 137:                           else
 138:                               odsp_vob(GetVID(diCurrent),&arctDraw,V_DISPALL);
 139:                      }
 140:                }
 141:         }
 142: }
 143: 
 144: 
 145: /* 再表示処理をする */
 146: void DrawView(W aidWnd)
 147: {
 148:         static RLIST rlListItem[REDISPRECTNUM];
 149:         static RLIST* prlList=NULL; /* 再表示用の矩形リスト */
 150: 
 151:         DrawSelectFrame(aidWnd,0,0,0);
 152: 
 153:         if(prlList==NULL)
 154:         { /* 再表示用の矩形リストの初期化 */
 155:                int i;
 156: 
 157:                prlList=rlListItem;
 158:                for(i=0; i<REDISPRECTNUM-1; i++)
 159:                      rlListItem[i].next=&rlListItem[i+1];
 160:                rlListItem[REDISPRECTNUM-1].next=NULL;
 161:         }
 162: 
 163:         do {
 164:                int iRectNum,i;
 165:                RECT rctDraw;
 166: 
 167:                iRectNum=wsta_dsp(aidWnd,&rctDraw,prlList); /* 再表示開始 */
 168:                if(iRectNum==0)
 169:                      break;
 170:                if(iRectNum>REDISPRECTNUM) /* 再表示の必要な矩形の数が多いとき */
 171:                      DrawOneRect(aidWnd,rctDraw);
 172:                else /* 再表示の必要な矩形の数が少ないとき */
 173:                      for(i=0; i<iRectNum; i++)
 174:                           DrawOneRect(aidWnd,rlListItem[i].rcomp); /* 1つ1つ描く */
 175:         }while(wend_dsp(aidWnd)>0);
 176:         return;
 177: }
 178: