1: /* $Id: 1048611.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: 
  11: W idBar[2];
  12: 
  13: 
  14: BOOL SetBarValue(W aidWnd)
  15: {
  16:         W value[4];
  17:         RECT rctWnd,rctDoc;
  18:         static RECT rctOldWnd={{0,0,0,0}},rctOldDoc={{0,0,0,0}};
  19:         
  20:         rctDoc=GetDocRect();
  21:         rctDoc.c.top=0;
  22:         rctDoc.c.left=0;
  23:         wget_wrk(aidWnd,&rctWnd);
  24: 
  25:         if(rctWnd.c.top!=rctOldWnd.c.top || rctWnd.c.bottom!=rctOldWnd.c.bottom ||
  26:            rctDoc.c.top!=rctOldDoc.c.top || rctDoc.c.bottom!=rctOldDoc.c.bottom)
  27:         {
  28:                value[0]=rctWnd.c.top;
  29:                value[1]=rctWnd.c.bottom;
  30:                value[2]=rctDoc.c.top;
  31:                value[3]=rctDoc.c.bottom;
  32:                if(value[0]<value[2])
  33:                      value[2]=value[0];
  34:                if(value[1]>value[3])
  35:                      value[3]=value[1];
  36: 
  37:                cset_val(idBar[RIGHTBAR],4,value);
  38:         }
  39:         if(rctWnd.c.left!=rctOldWnd.c.left ||
  40:            rctWnd.c.right!=rctOldWnd.c.right ||
  41:            rctDoc.c.left!=rctOldDoc.c.left ||
  42:            rctDoc.c.right!=rctOldDoc.c.right)
  43:         {
  44:                value[0]=rctWnd.c.right;
  45:                value[1]=rctWnd.c.left;
  46:                value[2]=rctDoc.c.right;
  47:                value[3]=rctDoc.c.left;
  48:                if(value[0]>value[2])
  49:                      value[2]=value[0];
  50:                if(value[1]<value[3])
  51:                      value[3]=value[1];
  52: 
  53:                cset_val(idBar[BOTTOMBAR],4,value);
  54:         }
  55:         rctOldWnd=rctWnd;
  56:         rctOldDoc=rctDoc;
  57:         return TRUE;
  58: }
  59: 
  60: 
  61: BOOL InitScrollBar(W aidWnd)
  62: {
  63:         /* スクロールバーのパーツ ID を取り出す */
  64:         wget_bar(aidWnd,&idBar[RIGHTBAR],&idBar[BOTTOMBAR],NULL);
  65: 
  66:         /* スムーズスクロール */
  67:         cchg_par( idBar[RIGHTBAR], P_DRAGBREAK|P_NORMAL|P_ENABLE );
  68:         cchg_par( idBar[BOTTOMBAR], P_DRAGBREAK|P_NORMAL|P_ENABLE );
  69: 
  70:         SetBarValue(aidWnd);
  71: 
  72:         return TRUE;
  73: }
  74: 
  75: 
  76: void ScrollByBarDifference(int aiBar,W* apwOld,W* apwNew,W aidWnd)
  77: {
  78:         W idDrawEnv;
  79:         W wMove;
  80:         W err;
  81:         RECT rctWork;
  82: 
  83:         if(apwNew[0]==apwOld[0])
  84:                return;
  85: 
  86:         idDrawEnv=wget_gid(aidWnd); /* 描画環境の取得 */
  87:         wget_wrk(aidWnd,&rctWork);
  88:         gset_vis(idDrawEnv,rctWork); /* 領域のセット */
  89: 
  90:         wMove=apwOld[0]-apwNew[0];
  91:         if(aiBar==RIGHTBAR)
  92:                err=wscr_wnd(aidWnd,(RECT*)NULL,0,wMove,W_SCRL|W_RDSET);
  93:         else
  94:                err=wscr_wnd(aidWnd,(RECT*)NULL,wMove,0,W_SCRL|W_RDSET);
  95: 
  96:         SetBarValue(aidWnd);
  97: 
  98:         if(err&W_RDSET) /* 再表示が必要なら */
  99:                DrawView(aidWnd);
 100: }
 101: 
 102: 
 103: 
 104: void BarMove(int aiBar,int aiDirection,W aiSmoothOrArea,W aidWnd,BOOL aisEnlarge)
 105: /* aiDirection; 移動方向 1:正 -1:負 */
 106: /* aiSmoothOrArea;  P_SMOOTH  P_AREA */
 107: {
 108:         static W wHeight=16; /* 文字の高さ */ /* "16"に固定(toriumi) */
 109:         W pwOld[4];
 110:         W pwBarValue[4];
 111:         int iKnobSize;
 112: 
 113: /* gget_fntのlinkができないため、以下の行を削除(toriumi)
 114:         if(wHeight==0)
 115:         {
 116:                TC DevName[11];
 117:                DEV_SPEC spec;
 118:                FNTINFO info;
 119:                W wGid;
 120: 
 121:                wGid=wget_gid(aidWnd);
 122:                gget_dev(wGid,DevName);
 123:                gget_spc(DevName,&spec);
 124:                gget_fnt(wGid,NULL,&info);
 125:                wHeight=info.height;
 126:         }
 127: */
 128:         cget_val(idBar[aiBar],4,pwOld);
 129:         pwBarValue[0]=pwOld[0];
 130:         pwBarValue[1]=pwOld[1];
 131:         pwBarValue[2]=pwOld[2];
 132:         pwBarValue[3]=pwOld[3];
 133: 
 134:         iKnobSize=pwOld[0]-pwOld[1];
 135:         if(iKnobSize<0)
 136:                iKnobSize=-iKnobSize;
 137: 
 138:         if(aiSmoothOrArea==P_SMOOTH)
 139:         {
 140:                pwBarValue[0]+=wHeight*aiDirection;
 141:                pwBarValue[1]+=wHeight*aiDirection;
 142:         }else{
 143:                pwBarValue[0]+=iKnobSize*aiDirection;
 144:                pwBarValue[1]+=iKnobSize*aiDirection;
 145:         }
 146: 
 147:         if(pwBarValue[0]>pwBarValue[2] && aiBar==BOTTOMBAR && !aisEnlarge)
 148:         { /* 右端を越えた */
 149:                pwBarValue[0]=pwBarValue[2];
 150:                pwBarValue[1]=pwBarValue[2]-iKnobSize;
 151:         }else
 152:         if(pwBarValue[0]<pwBarValue[2] && aiBar==RIGHTBAR && !aisEnlarge)
 153:         { /* 上端を越えた */
 154:                pwBarValue[0]=pwBarValue[2];
 155:                pwBarValue[1]=pwBarValue[2]+iKnobSize;
 156:         }else
 157:         if(pwBarValue[1]<pwBarValue[3] && aiBar==BOTTOMBAR && !aisEnlarge)
 158:         { /* 左端を越えた */
 159:                pwBarValue[1]=pwBarValue[3];
 160:                pwBarValue[0]=pwBarValue[3]+iKnobSize;
 161:         }else
 162:         if(pwBarValue[1]>pwBarValue[3] && aiBar==RIGHTBAR && !aisEnlarge)
 163:         { /* 右端を越えた */
 164:                pwBarValue[1]=pwBarValue[3];
 165:                pwBarValue[0]=pwBarValue[3]-iKnobSize;
 166:         }
 167: 
 168:         if(pwBarValue[0]<0 && aiBar==RIGHTBAR)
 169:         {
 170:                pwBarValue[0]=0;
 171:                pwBarValue[1]=iKnobSize;
 172:         }
 173:         if(pwBarValue[1]<0 && aiBar==BOTTOMBAR)
 174:         {
 175:                pwBarValue[0]=iKnobSize;
 176:                pwBarValue[1]=0;
 177:         }
 178: 
 179: /*      cset_val(idBar[aiBar],4,pwBarValue);*/
 180: 
 181:         ScrollByBarDifference(aiBar,pwOld,pwBarValue,aidWnd);
 182: }
 183: 
 184: 
 185: void ActScrollBar(int aiBar,WEVENT* aevWnd)
 186: {
 187:         UW ret;
 188:         W pwOldBarValue[4];
 189: 
 190:         cget_val(idBar[aiBar],4,pwOldBarValue);
 191:         while( ((ret=cact_par(idBar[aiBar],aevWnd))&0x6000) == 0x6000 )
 192:         { /* 中断の時 */
 193:             if(ret&0x0008) /* ジャンプ移動の中断なら */
 194:             {
 195:                W pwNewBarValue[4];
 196: 
 197:                cget_val(idBar[aiBar],4,pwNewBarValue);
 198:                ScrollByBarDifference(aiBar,pwOldBarValue,
 199:                                 pwNewBarValue,aevWnd->s.wid);
 200:                cget_val(idBar[aiBar],4,pwOldBarValue);
 201:             }else{ /* スムーズ移動の中断 */
 202:                if(ret&0x0001) /* 増加方向なら */
 203:                      BarMove(aiBar,1,P_SMOOTH,aevWnd->s.wid,FALSE);
 204:                else /* 減少方向なら */
 205:                      BarMove(aiBar,-1,P_SMOOTH,aevWnd->s.wid,FALSE);
 206:                aevWnd->s.type=EV_NULL;
 207:             }
 208:         }
 209:         if( (ret&0x100c) == 0x1004 ) /* エリア移動の時 */
 210:         {
 211:                if(ret&0x0001) /* 増加方向なら */
 212:                      BarMove(aiBar,1,P_AREA,aevWnd->s.wid,FALSE);
 213:                else /* 減少方向なら */
 214:                      BarMove(aiBar,-1,P_AREA,aevWnd->s.wid,FALSE);
 215:         }else if( (ret&0x100c) == 0x1000 ) /* スムーズ移動の時 */
 216:         {
 217:                if(ret&0x0001) /* 増加方向なら */
 218:                      BarMove(aiBar,1,P_SMOOTH,aevWnd->s.wid,FALSE);
 219:                else /* 減少方向なら */
 220:                      BarMove(aiBar,-1,P_SMOOTH,aevWnd->s.wid,FALSE);
 221:         }else if( (ret&0x100c) == 0x1008 ) /* ジャンプ移動の時 */
 222:         {
 223:                W pwNewBarValue[4];
 224: 
 225:                cget_val(idBar[aiBar],4,pwNewBarValue);
 226:                ScrollByBarDifference(aiBar,pwOldBarValue,pwNewBarValue,aevWnd->s.wid);
 227:         }
 228: }
 229: