1: /* $Id: 1048617.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 <tcode.h>
   8: #include "paperbox.h"
   9: #include "view.h"
  10: #include "doc.h"
  11: #include "databox.h"
  12: 
  13: /* -------------------- イベント関係 -------------------- */
  14: 
  15: 
  16: /* マウスのボタンを押したところにどの仮身があるかを調べる */
  17: DOCITERATOR FindVobj(PNT aptClick,W* pwLocation)
  18: {
  19:         DOCITERATOR diCurrent;
  20: 
  21:         diCurrent=GetPrevious(NULL); /* 最後のデータから検索する */
  22:         while(diCurrent!=NULL)
  23:         {
  24:                W wVID;
  25: 
  26:                (*pwLocation)=ofnd_vob(-GetVID(diCurrent),aptClick,&wVID);
  27:                if(wVID!=0)
  28:                      return diCurrent; /* 見つかった */
  29:                diCurrent=GetPrevious(diCurrent);
  30:         }
  31:         return NULL; /* 見つからなかった */
  32: }
  33: 
  34: 
  35: W MakeNewObject(W aidWnd,W aidAtherWnd)
  36: {
  37:         DOCITERATOR diMakeNew;
  38:         W idNewVobj;
  39:         RECT rctOldView;
  40:         VFPTR pvfVobj;
  41:         VLINK vlnkLink;
  42:         UW wSize;
  43:         W idTmpAtherOld,idTmpAtherNew;
  44: 
  45:         diMakeNew=GetSelectedVobj();
  46:         if(diMakeNew==NULL)
  47:                return 0;
  48: 
  49:         rctOldView=GetRect(diMakeNew);
  50: 
  51:         oget_vob(GetVID(diMakeNew),NULL,NULL,0,&wSize);
  52:         /* if(get_lmb(&pvfVobj,(LONG)wSize,NOCLR)<0) */
  53:         if((pvfVobj.vobj=(VOBJSEG*)malloc(wSize))==NULL)
  54:         {
  55:                ErrPanel(0,FALSE);
  56:                return 0;
  57:         }
  58:         oget_vob(GetVID(diMakeNew),&vlnkLink,(VP)pvfVobj.vobj,wSize,NULL);
  59:         idTmpAtherOld=oreg_vob(&vlnkLink,(VP)pvfVobj.vobj,aidAtherWnd,V_NODISP);
  60:         idTmpAtherNew=onew_obj(idTmpAtherOld,NULL);
  61:         if(idTmpAtherNew<0)
  62:         {
  63:                odel_vob(idTmpAtherOld,0);
  64:                /* rel_lmb(pvfVobj); */
  65:                free(pvfVobj.vobj);
  66:                return 0;
  67:         }
  68:         oget_vob(idTmpAtherNew,&vlnkLink,(VP)pvfVobj.vobj,wSize,NULL);
  69:         odel_vob(idTmpAtherOld,0);
  70:         odel_vob(idTmpAtherNew,0);
  71:         idNewVobj=oreg_vob(&vlnkLink,pvfVobj.vobj,aidWnd,V_NODISP);
  72:         /* rel_lmb(pvfVobj); */
  73:         free(pvfVobj.vobj);
  74:         omov_vob(idNewVobj,0,&rctOldView,V_NODISP);
  75: 
  76:         if(idNewVobj<0)
  77:                return 0;
  78: 
  79:         return idNewVobj;
  80: }
  81: 
  82: 
  83: /* 仮身上の位置とポインタの形状の対応。[0][n]がドラッグしてないとき。 */
  84: /* [1][n]がドラッグ中の時 */
  85: PTRSTL wPointStile[2][9]=
  86: {{PS_MOVE,PS_MOVE,PS_SELECT,PS_MOVE,PS_MOVE,PS_MOVE,PS_MOVE,PS_MOVE,PS_MOVE},
  87:  {PS_GRIP,PS_GRIP,PS_GRIP,  PS_GRIP,PS_GRIP,PS_GRIP,PS_GRIP,PS_GRIP,PS_GRIP}};
  88: 
  89: /* 仮身のドラッグ移動 */
  90: void DragMove(W aidWnd,PNT aptStart)
  91: {
  92:         W idDrawEnv; /* ドラッグ描画環境 */
  93:         PNT ptMouse,ptOldMouse;
  94:         WEVENT evDragEvent; /* ドラッグ中のイベント */
  95:         BOOL isBreak; /* ドラッグが中断されたかどうか */
  96: 
  97:         /* ポインタの形状の変更 */
  98:         gset_ptr(PS_GRIP,NULL,-1,-1);
  99: 
 100:         isBreak=FALSE;
 101:         ptOldMouse=aptStart;
 102:         idDrawEnv=wsta_drg(aidWnd,0); /* ドラッグの開始(lock なし) */
 103:         MakeSelectFrame(); /* 選択枠リストを作成 */
 104:         DrawSelectFrame(-idDrawEnv,1,0,0); /* 枠の表示 */
 105: 
 106:         while(wget_drg(&ptMouse,&evDragEvent)!=EV_BUTUP)
 107:         {
 108:                PNT ptAbsolute; /* マウスのグローバル座標 */
 109:                W idToWnd; /* マウスのあるウインドウ ID */
 110: 
 111:                if(evDragEvent.s.type==EV_KEYDWN &&
 112:                      evDragEvent.e.data.key.code==TK_CAN) /* ×キーが押されたとき */
 113:                {
 114:                      isBreak=TRUE;
 115:                      break; /* ドラッグの中断 */
 116:                }
 117:                /* if(ptMouse.l==ptOldMouse.l) */
 118:                if(ptMouse.x==ptOldMouse.x && ptMouse.y==ptOldMouse.y)
 119:                {
 120:                      UW lNow;
 121: 
 122:                      get_etm(&lNow);
 123:                      {
 124:                           ptOldMouse=ptMouse;
 125:                           continue;
 126:                      }
 127:                }
 128:                /* マウスのあるウインドウIDを得る */
 129:                ptAbsolute=ptMouse;
 130:                gcnv_abs(idDrawEnv,&ptAbsolute); /* 絶対座標に変換 */
 131:                wfnd_wnd(&ptAbsolute,NULL,&idToWnd);
 132: 
 133:                DrawSelectFrame(-idDrawEnv,0,ptOldMouse.x-aptStart.x,
 134:                                  ptOldMouse.y-aptStart.y); /* 枠の消去 */
 135: 
 136:                if(idToWnd!=aidWnd) /* マウスがウインドウの外に出たなら */
 137:                {
 138:                      RECT rctAllDisplay;
 139: 
 140:                      gloc_env(idDrawEnv,1); /* ドラッグ描画環境のロック */
 141:                      /* 全画面を表示長方形にする */
 142:                      gget_fra(idDrawEnv,&rctAllDisplay);
 143:                      gset_vis(idDrawEnv,rctAllDisplay);
 144:                }else{ /* マウスが元のウインドウの中の時 */
 145:                      RECT rctWndFrame;
 146: 
 147:                      gloc_env(idDrawEnv,0); /* ドラッグ描画環境のアンロック */
 148: 
 149:                      /* ウインドウの作業領域を表示長方形にする */
 150:                      wget_wrk(aidWnd,&rctWndFrame);
 151:                      gset_vis(idDrawEnv,rctWndFrame);
 152:                }
 153: 
 154:                DrawSelectFrame(-idDrawEnv,1,ptMouse.x-aptStart.x,
 155:                                  ptMouse.y-aptStart.y); /* 枠の表示 */
 156:                ptOldMouse=ptMouse;
 157:         }
 158: 
 159:         DrawSelectFrame(-idDrawEnv,0,ptOldMouse.x-aptStart.x,
 160:                               ptOldMouse.y-aptStart.y); /* 枠の消去 */
 161:         wend_drg(); /* ドラッグの終了 */
 162: 
 163:         if(isBreak)
 164:                return; /* ドラッグが中断されたなら何もせずに終了 */
 165:         if(aptStart.x==ptMouse.x && aptStart.y==ptMouse.y)
 166:                return;
 167: 
 168:         if(evDragEvent.s.wid!=aidWnd) /* 他のウインドウなら */
 169:         {
 170:                WEVENT evPaste;
 171:                PNT ptCursorMove; /* 正しい位置に貼り込まれるための修正値 */
 172:                W idNewVobj=0;
 173: 
 174:                if(IsFusen(GetSelectedVobj())) /* 付箋の時、コピー */
 175:                      ptCursorMove=SendSelectedDataToTray(TRUE,aptStart,0);
 176:                else{ /* 仮身の時、新版作成 */
 177:                      idNewVobj=MakeNewObject(aidWnd,evDragEvent.s.wid); /* 仮登録 */
 178:                      if(idNewVobj==0)
 179:                           return;
 180:                      ptCursorMove=SendSelectedDataToTray(TRUE,aptStart,idNewVobj);
 181:                }
 182:                evPaste.r.type=EV_REQUEST;
 183:                evPaste.r.cmd=W_PASTE;
 184:                evPaste.r.wid=evDragEvent.s.wid;
 185:                evPaste.s.pos=evDragEvent.s.pos;
 186:                evPaste.s.pos.x+=ptCursorMove.x;
 187:                evPaste.s.pos.y+=ptCursorMove.y;
 188:                evPaste.s.time=evDragEvent.s.time;
 189:                wsnd_evt(&evPaste); /* 貼り込み要求をだす */
 190:                if(wwai_rsp((WEVENT*)NULL,W_PASTE,10000)!=W_ACK)
 191:                {
 192:                      ErrPanel(ID_ST_NPASTE,FALSE);
 193:                      return;
 194:                }
 195:                wswi_wnd(evDragEvent.s.wid,(WEVENT*)NULL); /* 貼り込み先のウインドウに
 196:                                                                      フォーカスを移す */
 197:                odel_vob(idNewVobj,0); /* 他のウインドウに貼り込むために
 198:                                                          仮登録された仮身を消す */
 199:         }
 200: }
 201: 
 202: /* 作業領域でマウスのボタンが押されたときの処理 */
 203: void PushWorkArea(WEVENT* apevWnd)
 204: {
 205:         W wLocation;
 206:         DOCITERATOR diPointed;
 207: 
 208:         /* 仮身の位置の検索 */
 209:         diPointed=FindVobj(apevWnd->s.pos,&wLocation);
 210:         if(diPointed==NULL) /* 仮身を指していない場合 */
 211:         {
 212:                DrawSelectFrame(apevWnd->s.wid,0,0,0);
 213:                UnSelectVobj();
 214:         }else{
 215:                W wClick;
 216: 
 217:                /* ポインタの形状の変更 */
 218:                gset_ptr(wPointStile[0][wLocation],NULL,-1,-1);
 219: 
 220:                DrawSelectFrame(apevWnd->s.wid,0,0,0); /* 選択枠を消去 */
 221: 
 222:                SelectVobj(diPointed); /* 選択されたことにする */
 223: 
 224:                wClick=wchk_dck(apevWnd->s.time);
 225:                switch(wLocation)
 226:                {
 227:                case V_NAME:
 228:                case V_RELN:
 229:                case V_PICT:
 230:                case V_WORK:
 231:                case V_FRAM:
 232:                case V_LTHD:
 233:                case V_RTHD:
 234:                case V_LBHD:
 235:                case V_RBHD:
 236:                      switch(wClick)
 237:                      {
 238:                      case W_PRESS:
 239:                      case W_QPRESS:
 240:                           /* 新版作成 */
 241:                           DragMove(apevWnd->s.wid,apevWnd->s.pos);
 242:                           break;
 243:                      }
 244:                      break;
 245:                }
 246:         }
 247:         MakeSelectFrame(); /* 選択枠リストを作成 */
 248:         DrawSelectFrame(apevWnd->s.wid,1,0,0); /* 選択枠を表示 */
 249: }
 250: 
 251: void ChangeForcusToParentWindow(W aidWnd)
 252: {
 253:         WDSTAT wsStatus;
 254: 
 255:         wget_sts(aidWnd,&wsStatus,NULL);
 256:         if(wsStatus.parent!=0)
 257:                wswi_wnd(wsStatus.parent,NULL);
 258: }
 259: 
 260: /* キーを押したときの処理 */
 261: BOOL KeyDown(WEVENT aevWnd,W aidWnd)
 262: {
 263:         static KeyTab* pktKey=NULL;
 264:         TC tcAlphaKey;
 265: 
 266:         if(pktKey==NULL)
 267:         { /*キーボード表の取り出し */
 268:                W wSize;
 269: 
 270:                wSize=get_ktb(NULL);
 271:                /* get_lmb(&pktKey,(LONG)wSize,NOCLR); */
 272:                pktKey=(KeyTab*)malloc(wSize);
 273:                get_ktb(pktKey);
 274:         }
 275:         tcAlphaKey=pktKey->kct[pktKey->keymax*pktKey->kctsel[0x01]+
 276:                                    aevWnd.e.data.key.keytop];
 277:         if(aevWnd.s.stat & ES_CMD) /* 命令キーが押されている */
 278:         {
 279:                switch(aevWnd.e.data.key.code)
 280:                {
 281:                /* カーソルキー */
 282:                case KEY_UP:
 283:                      BarMove(RIGHTBAR,-1,P_AREA,aidWnd,FALSE);
 284:                      break;
 285:                case KEY_DOWN:
 286:                      BarMove(RIGHTBAR,1,P_AREA,aidWnd,FALSE);
 287:                      break;
 288:                case KEY_RIGHT:
 289:                      BarMove(BOTTOMBAR,1,P_AREA,aidWnd,FALSE);
 290:                      break;
 291:                case KEY_LEFT:
 292:                      BarMove(BOTTOMBAR,-1,P_AREA,aidWnd,FALSE);
 293:                      break;
 294:                default:
 295:                      return MenuKey(aevWnd.s.wid,aidWnd,aevWnd.s.pos);
 296:                }
 297:         }else if(aevWnd.s.stat & (ES_LSHFT | ES_RSHFT)) /* シフトが押されている */
 298:         {
 299:                switch(aevWnd.e.data.key.code)
 300:                {
 301:                case TK_BS: /* バックスペース */
 302:                      return FALSE; /* 終了 */
 303:                }
 304:         }else{
 305:                switch(tcAlphaKey/*aevWnd.e.data.key.code*/)
 306:                {
 307:                case TK_BS: /* バックスペース */
 308:                      ChangeForcusToParentWindow(aidWnd);
 309:                                    /* 親ウインドウにフォーカスを移す */
 310:                      break;
 311:                }
 312:         }
 313: 
 314:         return TRUE;
 315: }
 316: 
 317: 
 318: /* 全面表示切り替え */
 319: void SwitchFullWindow(W aidWnd)
 320: {
 321:         /* インジケータの変更 */
 322:         SwitchFullWindowIndicator();
 323: 
 324:         /* 全面表示切り替え */
 325:         if(wchg_wnd(aidWnd,NULL,W_MOVE)>0)
 326:                DrawView(aidWnd);
 327: }
 328: 
 329: void NullEvent(WEVENT aevWnd,W aidWnd)
 330: {
 331:         W wNewPointStile;
 332: 
 333:         DrawSelectFrame(aidWnd,-1,0,0);
 334:         if(aevWnd.s.wid!=aidWnd) /* 他のウインドウ上なら何もしない */
 335:                return;
 336:         if(aevWnd.s.stat&ES_CMD) /* 命令キーが押されているとき */
 337:                wNewPointStile=PS_MENU;
 338:         else if(aevWnd.s.cmd!=W_WORK) /* 作業領域以外の時 */
 339:                return;
 340:         else if((aevWnd.s.stat&ES_LSHFT)||(aevWnd.s.stat&ES_RSHFT))
 341:                /* シフトが押されているとき */
 342:                wNewPointStile=PS_MODIFY;
 343:         else /* 作業領域の時 */
 344:         {
 345:                DOCITERATOR diPointed;
 346:                W wLocation;
 347: 
 348:                /* 仮身の位置の検索 */
 349:                diPointed=FindVobj(aevWnd.s.pos,&wLocation);
 350:                if(diPointed!=NULL)
 351:                { /* ポインタの形状の変更 */
 352:                      if(IsSelected(diPointed)==TRUE)
 353:                           wNewPointStile=wPointStile[0][wLocation];
 354:                      else
 355:                           wNewPointStile=PS_SELECT;
 356:                }else
 357:                      wNewPointStile=PS_SELECT;
 358:         }
 359:         gset_ptr(wNewPointStile,NULL,-1,-1);
 360: }
 361: 
 362: 
 363: /* エラーパネルの表示 */
 364: void ErrPanel(W awMessage,BOOL aisDouble)
 365: /* awMessage; 表示するストリングを示すデータボックスの番号 */
 366:                           /* メモリが足りないなら 0 を指定する */
 367: /* aisDouble;  複数行=TRUE 1行=FALSE */
 368: {
 369:         W err;
 370: 
 371:         gset_ptr(PS_SELECT,NULL,-1,-1);
 372:         if(awMessage==0)
 373:         {
 374:                err=pact_err(ID_PN_ERR1,NULL,NULL,NULL);
 375:         }else{
 376:                if(aisDouble)
 377:                {
 378:                    /* W key[2]; */
 379:                      TC* ptMessage[2];
 380: 
 381:                      /* key[0]=dget_dat(TEXT_DATA,awMessage,0);
 382:                         key[1]=dget_dat(TEXT_DATA,awMessage+1,0);
 383:                         smb_adr(key[0],&(ptMessage[0]));
 384:                         smb_adr(key[1],&(ptMessage[1])); */
 385:                      dget_dtp(TEXT_DATA,awMessage,(void**)&ptMessage[0]);
 386:                      dget_dtp(TEXT_DATA,awMessage+1,(void**)&ptMessage[1]);
 387: 
 388:                      err=pact_err(ID_PN_ERR1,(TC*)"\0\0",ptMessage[0],ptMessage[1]);
 389:                      /* drel_dat(key[0]);
 390:                         drel_dat(key[1]); */
 391:                }else{
 392:                    /* W key; */
 393:                      TC* ptMessage;
 394: 
 395:                      /* key=dget_dat(TEXT_DATA,awMessage,0);
 396:                         smb_adr(key,&ptMessage); */
 397:                      dget_dtp(TEXT_DATA,awMessage,(void**)&ptMessage);
 398:                      err=pact_err(ID_PN_ERR1,ptMessage,NULL,NULL);
 399:                      /* drel_dat(key); */
 400:                }
 401:         }
 402:         return;
 403: }
 404: