1: /* $Id: 1048606.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 <errcode.h>
   8: #include "paperbox.h"
   9: #include "file.h"
  10: #include "doc.h"
  11: #include "view.h"
  12: #include "databox.h"
  13: 
  14: #define COORDINATE_MIN 5
  15: 
  16: /* 仮身1つのデータ構造 */
  17: typedef struct tag_VOBJDATA{
  18:         struct tag_VOBJDATA* next;
  19:         struct tag_VOBJDATA* previous;
  20:         W idVirtualObj; /* 仮身 ID */
  21:         BOOL isFusen; /* TRUE=付箋 FALSE=仮身 */
  22:         RECT rctView; /* 表示位置 */
  23: } VOBJDATA;
  24: 
  25: 
  26: typedef struct{
  27:         VOBJDATA* vdFirst; /* 最初の仮身 */
  28:         VOBJDATA* vdLast; /* 最後の仮身 */
  29:         RECT rctView; /* すべての仮身を囲む領域 */
  30:         W idVirtualObj; /* このファイルの仮身ID */
  31:         W wFileDscr; /* ファイルディスクリプタ */
  32:         int iVobjNum; /* 仮身の数 */
  33:         int iFusenNum; /* 付箋の数 */
  34:         VOBJDATA* vdSelected;
  35:         BOOL isReadOnly;
  36: } DOCDATA;
  37: 
  38: DOCDATA document={NULL,NULL,{{0,0,0,0}},0,-1,0,0,NULL,FALSE};
  39: 
  40: 
  41: /* データ全体の RECT の大きさより外に新たなデータが出来たら
  42:    document.rctView を大きくする。
  43:    (大きくするだけ。小さくするには他の関数を使う。 */
  44: void CheckViewSize(RECT arctNew)
  45: {
  46:         if(arctNew.c.left<document.rctView.c.left+COORDINATE_MIN)
  47:                document.rctView.c.left=arctNew.c.left-COORDINATE_MIN;
  48:         if(arctNew.c.top<document.rctView.c.top+COORDINATE_MIN)
  49:                document.rctView.c.top=arctNew.c.top-COORDINATE_MIN;
  50:         if(arctNew.c.right>document.rctView.c.right-COORDINATE_MIN)
  51:                document.rctView.c.right=arctNew.c.right+COORDINATE_MIN;
  52:         if(arctNew.c.bottom>document.rctView.c.bottom-COORDINATE_MIN)
  53:                document.rctView.c.bottom=arctNew.c.bottom+COORDINATE_MIN;
  54: }
  55: 
  56: 
  57: /* 仮身のデータ(VOBJDATA)を追加する */
  58: void AddVobjData(VOBJDATA* avdData,BOOL aisLast)
  59: /* BOOL aisLast;  TRUE=最後に追加する FALSE=最初に追加する */
  60: {
  61:         if(document.vdFirst!=NULL) /* 2つ目以降なら */
  62:         {
  63:                if(aisLast)
  64:                { /* 最後に追加する */
  65:                      avdData->previous=document.vdLast;
  66:                      avdData->next=NULL;
  67:                      document.vdLast->next=avdData;
  68:                      document.vdLast=avdData;
  69:                }else{ /* 最初に追加する */
  70:                      avdData->next=document.vdFirst;
  71:                      avdData->previous=NULL;
  72:                      document.vdFirst->previous=avdData;
  73:                      document.vdFirst=avdData;
  74:                }
  75:         }else{ /* 最初の項目なら */
  76:                document.vdFirst=avdData;
  77:                document.vdLast=avdData;
  78:                avdData->next=NULL;
  79:                avdData->previous=NULL;
  80:         }
  81: 
  82:         CheckViewSize(avdData->rctView);
  83: 
  84:         if(avdData->isFusen)
  85:                document.iFusenNum++;
  86:         else
  87:                document.iVobjNum++;
  88: }
  89: 
  90: 
  91: /* --------------------ファイルロード関連-------------------- */
  92: 
  93: 
  94: BOOL FileOpen(W aidVirtual,LINK alnkOpen)
  95: {
  96:         W wFileDscr;
  97: 
  98:         document.idVirtualObj=aidVirtual;
  99: 
 100:         if(chk_fil(&alnkOpen,F_READ|F_EXCUTE,NULL)<0)
 101:         {
 102:                ErrPanel(ID_ST_NACSES,FALSE);
 103:                return FALSE;
 104:         }
 105:         if(chk_fil(&alnkOpen,F_WRITE,NULL)<0)
 106:         { /* リードオンリー */
 107:                wFileDscr=oopn_obj(aidVirtual,NULL,F_READ|F_WEXCL,NULL);
 108:                if(wFileDscr<0)
 109:                {
 110:                      ErrPanel(ID_ST_NOPENFILE,FALSE);
 111:                      return FALSE;
 112:                }
 113:                document.isReadOnly=TRUE;
 114:         }else{
 115:                /* ファイルのオープン */
 116:                wFileDscr=oopn_obj(aidVirtual,NULL,F_UPDATE|F_WEXCL,NULL);
 117:                if(wFileDscr<0)
 118:                {
 119:                      switch(wFileDscr)
 120:                      {
 121:                      case EC_BUSY: /* 他のアプリですでに開かれている */
 122:                           wFileDscr=opn_fil(&alnkOpen,F_READ,NULL);
 123:                           if(wFileDscr<0)
 124:                           {
 125:                               ErrPanel(ID_ST_NOPNBUSY,TRUE);
 126:                               return FALSE;
 127:                           }
 128:                           document.isReadOnly=TRUE;
 129:                           break;
 130:                      case EC_ACCES: /* アクセス権限がない */
 131:                           ErrPanel(ID_ST_NACSES,FALSE);
 132:                           return FALSE;
 133:                      default:
 134:                           ErrPanel(ID_ST_NOPENFILE,FALSE);
 135:                           return FALSE;
 136:                      }
 137:                }
 138:         }
 139:         document.wFileDscr=wFileDscr;
 140:         return TRUE;
 141: }
 142: 
 143: BOOL ReadVobj(FILECONTEXT* afcFile,W aidWnd,BOOL aisFusen)
 144: {
 145:         VOBJDATA* pvdItem;
 146:         VFPTR vfItem;
 147:         VLINK* plnkLink;
 148:         VLINK lnkData;
 149:         W idVobj;
 150:         int iSize;
 151:         W lOffset;
 152: 
 153:         lOffset=afcFile->offset;
 154: 
 155:         /* 仮身セグメントの読み込み(あまり良くない方法) */ 
 156:         iSize=afcFile->length;
 157:         /* if(get_lmb(&(vfItem.vobj),(LONG)iSize,NOCLR)<0) */
 158:         if((vfItem.vobj=(VOBJSEG*)malloc(iSize))==NULL)
 159:         {
 160:                ErrPanel(0,FALSE);
 161:                return FALSE;
 162:         }
 163:         ReadData(afcFile,(B*)vfItem.vobj,iSize);
 164: 
 165:         /* リンクレコードの読み込み */
 166:         if(aisFusen)
 167:                plnkLink=NULL;
 168:         else{
 169:                if(!ReadLinkRecode(afcFile,&lnkData))
 170:                {
 171:                      /* rel_lmb(vfItem.vobj); */
 172:                      free(vfItem.vobj);
 173:                      return FALSE;
 174:                }
 175:                plnkLink=&lnkData;
 176:         }
 177: 
 178:         /* 仮身の登録 */
 179:         if(aidWnd<0) /* 開いた仮身の時 */
 180:                idVobj=oreg_vob(plnkLink,(VP)vfItem.vobj,-aidWnd,V_NODISP);
 181:         else /* 仮身のオープンの時 */
 182:                idVobj=oreg_vob(plnkLink,(VP)vfItem.vobj,aidWnd,V_NODISP);
 183:         if(idVobj<0) /* 登録できなかったら */
 184:         {
 185:                ErrPanel(ID_ST_NREGVOBJ,FALSE);
 186:                /* rel_lmb(vfItem); */
 187:                free(vfItem.vobj);
 188:                return FALSE;
 189:         }
 190: 
 191:         /* 項目へメモリー割り当て */
 192:         /* if(get_lmb(&pvdItem,(LONG)sizeof(VOBJDATA),NOCLR)<0) */
 193:         if((pvdItem=(VOBJDATA*)malloc(sizeof(VOBJDATA)))==NULL)
 194:         {
 195:                ErrPanel(0,FALSE);
 196:                /* rel_lmb(vfItem); */
 197:                free(vfItem.vobj);
 198:                return FALSE;
 199:         }
 200: 
 201:         /* 項目の要素をセット */
 202:         pvdItem->rctView=vfItem.vobj->view; /* 仮身も付箋もここだけ共通 */
 203:         pvdItem->idVirtualObj=idVobj;
 204:         if(aisFusen)
 205:         {
 206:                pvdItem->isFusen=TRUE;
 207:         }else{
 208:                pvdItem->isFusen=FALSE;
 209:         }
 210: 
 211:         AddVobjData(pvdItem,TRUE);
 212: 
 213:         /* rel_lmb(vfItem); */
 214:         free(vfItem.vobj);
 215: 
 216:         return TRUE;
 217: }
 218: 
 219: /* 主 TAD レコードに対応してない仮身レコードと機能付箋レコードを読み込む */
 220: BOOL ReadNotInTADRecord(FILECONTEXT* afcFile,W aidWnd)
 221: {
 222:         /* 仮身レコードを読み込む */
 223:         see_rec(afcFile->fd,afcFile->LinkRecode,1,NULL);
 224:         while(fnd_rec(afcFile->fd,F_FWD,1,0,NULL)==0)
 225:         {
 226:                VOBJDATA* pvdItem;
 227:                VFPTR vfItem;
 228:                VLINK lnkLink;
 229:                W idVobj;
 230: 
 231:                /* 仮身セグメントを適当に作成する */ 
 232:                /* if(get_lmb(&(vfItem.vobj),(LONG)sizeof(VOBJSEG),NOCLR)<0) */
 233:                if((vfItem.vobj=(VOBJSEG*)malloc(sizeof(VOBJSEG)))==NULL)
 234:                {
 235:                      ErrPanel(0,FALSE);
 236:                      return FALSE;
 237:                }
 238:                vfItem.vobj->view.c.left=COORDINATE_MIN;
 239:                vfItem.vobj->view.c.right=150+COORDINATE_MIN;
 240:                vfItem.vobj->view.c.top=document.rctView.c.bottom+5;
 241:                vfItem.vobj->view.c.bottom=document.rctView.c.bottom+5+22;
 242:                vfItem.vobj->height=0;
 243:                vfItem.vobj->chsz=0;
 244:                vfItem.vobj->frcol=15;
 245:                vfItem.vobj->tbcol=0x10DFDFDF;
 246:                vfItem.vobj->chcol=15;
 247:                vfItem.vobj->bgcol=0;
 248:                vfItem.vobj->dlen=0;
 249: 
 250:                /* リンクレコードの読み込み */
 251:                if(rea_rec(afcFile->fd,0,(B*)&lnkLink,sizeof(VLINK),NULL,NULL)<0)
 252:                {
 253:                      /* rel_lmb(vfItem.vobj); */
 254:                      free(vfItem.vobj);
 255:                      return FALSE;
 256:                }
 257:                see_rec(afcFile->fd,1,0,NULL); /* 次のレコードへ */
 258: 
 259:                /* 仮身の登録 */
 260:                if(aidWnd<0) /* 開いた仮身の時 */
 261:                      idVobj=oreg_vob(&lnkLink,(VP)vfItem.vobj,
 262:                                                    -aidWnd,V_NODISP);
 263:                else /* 仮身のオープンの時 */
 264:                      idVobj=oreg_vob(&lnkLink,(VP)vfItem.vobj,
 265:                                                    aidWnd,V_NODISP);
 266:                if(idVobj<0) /* 登録できなかったら */
 267:                {
 268:                      ErrPanel(ID_ST_NREGVOBJ,FALSE);
 269:                      /* rel_lmb(vfItem); */
 270:                      free(vfItem.vobj);
 271:                      return FALSE;
 272:                }
 273: 
 274:                /* 項目へメモリー割り当て */
 275:                /* if(get_lmb(&pvdItem,(LONG)sizeof(VOBJDATA),NOCLR)<0) */
 276:                if((pvdItem=(VOBJDATA*)malloc(sizeof(VOBJDATA)))==NULL)
 277:                {
 278:                      ErrPanel(0,FALSE);
 279:                      /* rel_lmb(vfItem); */
 280:                      free(vfItem.vobj);
 281:                      return FALSE;
 282:                }
 283: 
 284:                /* 項目の要素をセット */
 285:                pvdItem->rctView=vfItem.vobj->view;
 286:                pvdItem->idVirtualObj=idVobj;
 287:                pvdItem->isFusen=FALSE;
 288: 
 289:                AddVobjData(pvdItem,TRUE);
 290: 
 291:                /* rel_lmb(vfItem); */
 292:                free(vfItem.vobj);
 293:         }
 294: 
 295:         /* 機能付箋レコードを読み込む */
 296:         see_rec(afcFile->fd,0,1,NULL);
 297:         while(fnd_rec(afcFile->fd,F_FWD,128,0,NULL)==7)
 298:         {
 299:                VOBJDATA* pvdItem;
 300:                VFPTR vfItem;
 301:                W idVobj;
 302:                W lSize;
 303: 
 304:                rea_rec(afcFile->fd,0,NULL,0,&lSize,NULL); /* レコードサイズを得る */
 305: 
 306:                /* メモリ割り当て */ 
 307:                /* if(get_lmb(&(vfItem.fsn),lSize,NOCLR)<0) */
 308:                if((vfItem.fsn=(FUSENSEG*)malloc(lSize))==NULL)
 309:                {
 310:                      ErrPanel(0,FALSE);
 311:                      return FALSE;
 312:                }
 313: 
 314:                /* 機能付箋レコードの読み込み */
 315:                if(rea_rec(afcFile->fd,0,(B*)vfItem.fsn,lSize,NULL,NULL) < 0)
 316:                {
 317:                      /* rel_lmb(vfItem.fsn); */
 318:                      free(vfItem.fsn);
 319:                      return FALSE;
 320:                }
 321: 
 322:                see_rec(afcFile->fd,1,0,NULL); /* 次のレコードへ */
 323: 
 324:                /* 付箋の登録 */
 325:                if(aidWnd<0) /* 開いた仮身の時 */
 326:                      idVobj=oreg_vob(NULL,(VP)vfItem.fsn,-aidWnd,V_DISPALL|V_NOFRAME);
 327:                else /* 仮身のオープンの時 */
 328:                      idVobj=oreg_vob(NULL,(VP)vfItem.fsn,aidWnd,V_DISPALL);
 329:                if(idVobj<0) /* 登録できなかったら */
 330:                {
 331:                      ErrPanel(ID_ST_NREGVOBJ,FALSE);
 332:                      /* rel_lmb(vfItem); */
 333:                      free(vfItem.fsn);
 334:                      return FALSE;
 335:                }
 336: 
 337:                /* 項目へメモリー割り当て */
 338:                /* if(get_lmb(&pvdItem,(LONG)sizeof(VOBJDATA),NOCLR)<0) */
 339:                if((pvdItem=(VOBJDATA*)malloc(sizeof(VOBJDATA)))==NULL)
 340:                {
 341:                      ErrPanel(0,FALSE);
 342:                      /* rel_lmb(vfItem); */
 343:                      free(vfItem.fsn);
 344:                      return FALSE;
 345:                }
 346: 
 347:                /* 項目の要素をセット */
 348:                pvdItem->rctView=vfItem.vobj->view;
 349:                pvdItem->idVirtualObj=idVobj;
 350:                pvdItem->isFusen=TRUE;
 351: 
 352:                AddVobjData(pvdItem,TRUE);
 353: 
 354:                /* rel_lmb(vfItem); */
 355:                free(vfItem.fsn);
 356:         }
 357: 
 358:         return TRUE;
 359: }
 360: 
 361: BOOL ReadFile(W aidWnd)
 362: {
 363:         W lTADRecode;
 364:         FILECONTEXT* fcFile;
 365:         BOOL isStartSegCame;
 366:         BOOL isText;
 367:         BOOL isRightTAD; /* 想定したとおりの TAD かどうか */
 368:         BOOL isErrLink;
 369:         W lLastOffset; /* 追加書き込みの時に書き込み始めるオフセット */
 370: 
 371:         /* TAD 主レコードを探す */
 372:         if(fnd_rec(document.wFileDscr,F_TOPEND,2,0,&lTADRecode)<0)
 373:         { /* 見つからなかったら */
 374:                return TRUE;
 375:         }
 376: 
 377:         fcFile=StartFile(document.wFileDscr,lTADRecode);
 378:         if(fcFile==NULL)
 379:                return FALSE;
 380: 
 381:         isStartSegCame=FALSE;
 382:         isRightTAD=TRUE;
 383:         isErrLink=FALSE;
 384:         /* セグメントを1つずつ読んでいく */
 385:         while(NextSegment(fcFile,TRUE))
 386:         {
 387: /*b_printf("ID=%d\n",fcFile->ID);*/
 388:                switch(fcFile->ID)
 389:                {
 390:                case TS_FIG: /* 図形開始セグメントの時 */
 391:                      if(isStartSegCame)
 392:                      {
 393:                           isRightTAD=FALSE;
 394:                           break;
 395:                      }
 396:                      isStartSegCame=TRUE;
 397:                      isText=FALSE;
 398:                      SkipData(fcFile,16);
 399:                      SkipData(fcFile,4);
 400:                      break;
 401: 
 402:                case TS_TEXT: /* 文章開始セグメントの時 */
 403:                      isRightTAD=FALSE;
 404:                      if(isStartSegCame)
 405:                           break;
 406:                      isStartSegCame=TRUE;
 407:                      isText=TRUE;
 408:                      SkipData(fcFile,16);
 409:                      SkipData(fcFile,4);
 410:                      break;
 411: 
 412:                case TS_FIGEND: /* 図形終了セグメントの時 */
 413:                      if(isStartSegCame && !isText)
 414:                           lLastOffset=fcFile->SegOffset;
 415:                      else
 416:                           isRightTAD=FALSE;
 417:                      break;
 418: 
 419:                case TS_TEXTEND: /* 文章終了セグメントの時 */
 420:                      isRightTAD=FALSE;
 421:                      if(isStartSegCame && isText)
 422:                           lLastOffset=fcFile->SegOffset;
 423:                      break;
 424: 
 425:                case TS_VOBJ: /* 仮身セグメントの時 */
 426:                      if(!isStartSegCame)
 427:                           break;
 428:                      lLastOffset=fcFile->NextOffset;
 429:                      if(!ReadVobj(fcFile,aidWnd,FALSE))
 430:                      {
 431:                           isErrLink=TRUE;
 432:                           isRightTAD=FALSE;
 433:                           break;
 434:                      }
 435:                      break;
 436: 
 437:                case TS_FFUSEN: /* 機能付箋の時 */
 438:                      if(!isStartSegCame)
 439:                           break;
 440:                      lLastOffset=fcFile->NextOffset;
 441:                      if(!ReadVobj(fcFile,aidWnd,TRUE))
 442:                      {
 443:                           isRightTAD=FALSE;
 444:                           break;
 445:                      }
 446:                      break;
 447: 
 448:                case TS_INFO:
 449:                      break;
 450:                default:
 451:                      isRightTAD=FALSE;
 452:                }
 453:         }
 454: 
 455:         /* 主 TAD レコードに対応してない仮身レコードと機能付箋レコードを読み込む */
 456:         ReadNotInTADRecord(fcFile,aidWnd);
 457: 
 458:         EndFile(fcFile);
 459:         /* cls_fil(document.wFileDscr); */
 460: 
 461:         return TRUE;
 462: }
 463: 
 464: 
 465: 
 466: /* --------------------データ管理-------------------- */
 467: 
 468: 
 469: BOOL IsFusen(DOCITERATOR adiCurrent)
 470: {
 471:         return ((VOBJDATA*)adiCurrent)->isFusen;
 472: }
 473: 
 474: DOCITERATOR GetIterator(W aidVobj)
 475: {
 476:         VOBJDATA* vdCurrent;
 477: 
 478:         vdCurrent=document.vdFirst;
 479:         while(vdCurrent!=NULL)
 480:         {
 481:                if(vdCurrent->idVirtualObj==aidVobj)
 482:                      return (DOCITERATOR)vdCurrent;
 483:                vdCurrent=vdCurrent->next;
 484:         }
 485:         return NULL;
 486: }
 487: 
 488: DOCITERATOR GetNext(DOCITERATOR adiCurrent)
 489: {
 490:         if(adiCurrent==NULL)
 491:                return document.vdFirst;
 492:         return ((VOBJDATA*)adiCurrent)->next;
 493: }
 494: 
 495: DOCITERATOR GetPrevious(DOCITERATOR adiCurrent)
 496: {
 497:         if(adiCurrent==NULL)
 498:                return document.vdLast;
 499:         return ((VOBJDATA*)adiCurrent)->previous;
 500: }
 501: 
 502: W GetVID(DOCITERATOR adiCurrent)
 503: {
 504:         return ((VOBJDATA*)adiCurrent)->idVirtualObj;
 505: }
 506: 
 507: RECT GetRect(DOCITERATOR adiCurrent)
 508: {
 509:         return ((VOBJDATA*)adiCurrent)->rctView;
 510: }
 511: 
 512: RECT GetDocRect(void)
 513: {
 514:         return document.rctView;
 515: }
 516: 
 517: DOCITERATOR GetSelectedVobj(void)
 518: {
 519:         return document.vdSelected;
 520: }
 521: 
 522: BOOL IsSelected(DOCITERATOR adiCurrent)
 523: {
 524:         if(adiCurrent==document.vdSelected)
 525:                return TRUE;
 526:         else
 527:                return FALSE;
 528: }
 529: 
 530: void SelectVobj(DOCITERATOR adiCurrent)
 531: {
 532:         document.vdSelected=adiCurrent;
 533: }
 534: 
 535: void UnSelectVobj(void)
 536: {
 537:         document.vdSelected=NULL;
 538: }
 539: 
 540: 
 541: PNT SendSelectedDataToTray(BOOL aisTempTray,PNT aptOrigin,W aidNewVobj)
 542: {
 543:         TRAYREC ptrTrayIndex[2];
 544:         FIGSEG fsFigStart;
 545:         DOCITERATOR diCurrent;
 546:         PNT ptReturn;
 547:         TR_VOBJREC* ptvVobj=NULL;
 548:         FUSENSEG* pfsFusen=NULL;
 549:         UW wSize;
 550:         W wVobjRecSize;
 551:         /* W wErr; */
 552:         W idSend;
 553: 
 554:         diCurrent=GetSelectedVobj();
 555:         if(diCurrent==NULL)
 556:         {
 557:                ptReturn.x=0;
 558:                ptReturn.y=0;
 559:                return ptReturn;
 560:         }
 561: 
 562:         /* 最初に来る図形セグメントの設定 */
 563:         fsFigStart.draw=GetRect(diCurrent);
 564:         fsFigStart.view.c.left=0;
 565:         fsFigStart.view.c.top=0;
 566:         fsFigStart.view.c.right=fsFigStart.draw.c.right-fsFigStart.draw.c.left;
 567:         fsFigStart.view.c.bottom=fsFigStart.draw.c.bottom-fsFigStart.draw.c.top;
 568:         fsFigStart.h_unit=-120;
 569:         fsFigStart.v_unit=-120;
 570:         fsFigStart.ratio=0;
 571:         ptrTrayIndex[0].id=TS_FIG;
 572:         ptrTrayIndex[0].len=sizeof(FIGSEG);
 573:         ptrTrayIndex[0].dt=(B*)&fsFigStart;
 574: 
 575: 
 576:         if(aidNewVobj==0)
 577:                idSend=GetVID(diCurrent);
 578:         else
 579:                idSend=aidNewVobj;
 580:         oget_vob(idSend,NULL,NULL,0,&wSize);
 581:         wVobjRecSize=sizeof(TR_VOBJREC)+wSize-sizeof(VOBJSEG);
 582:         if(IsFusen(diCurrent))
 583:             /* wErr=get_lmb(&pfsFusen,(LONG)wVobjRecSize,NOCLR); */
 584:                pfsFusen=(FUSENSEG*)malloc(wVobjRecSize);
 585:         else
 586:             /* wErr=get_lmb(&ptvVobj,(LONG)wVobjRecSize,NOCLR); */
 587:                ptvVobj=(TR_VOBJREC*)malloc(wVobjRecSize);
 588:         if(pfsFusen==NULL && ptvVobj==NULL)
 589:         {
 590:                ErrPanel(0,FALSE);
 591:                /* rel_lmb(ptrTrayIndex); */
 592:                ptReturn.x=0;
 593:                ptReturn.y=0;
 594:                return ptReturn;
 595:         }
 596:         if(IsFusen(diCurrent))
 597:         {
 598:                oget_vob(idSend,NULL,pfsFusen,wSize,NULL);
 599:                ptrTrayIndex[1].id=TS_FFUSEN;
 600:                ptrTrayIndex[1].len=wVobjRecSize;
 601:                ptrTrayIndex[1].dt=(B*)pfsFusen;
 602:         }else{
 603:                oget_vob(idSend,&(ptvVobj[0].vlnk),
 604:                               &(ptvVobj[0].vseg),wSize,NULL);
 605:                ptrTrayIndex[1].id=TR_VOBJ;
 606:                ptrTrayIndex[1].len=wVobjRecSize;
 607:                ptrTrayIndex[1].dt=(B*)ptvVobj;
 608:         }
 609:         if(aisTempTray)
 610:                tset_dat(ptrTrayIndex,2); /* 一時トレーにデータを送る */
 611:         else{
 612:             /* W wKey; */
 613:                TC* ptMessage=NULL;
 614: 
 615:                /* wKey=dget_dat(TEXT_DATA,ID_ST_TRVOBJ,0); */ /* データの名称を得る */
 616:                /* smb_adr(wKey,&ptMessage); */
 617:                dget_dtp(TEXT_DATA,ID_ST_TRVOBJ,(void**)ptMessage); /* データの名称を得る */
 618:                tpsh_dat(ptrTrayIndex,2,ptMessage);
 619:                /* drel_dat(wKey); */
 620:         }
 621: 
 622:         ptReturn.x=fsFigStart.draw.c.left-aptOrigin.x;
 623:         ptReturn.y=fsFigStart.draw.c.top-aptOrigin.y;
 624:         return ptReturn;
 625: }
 626: 
 627: 
 628: /* メモリを解放する */
 629: BOOL FreeDocument(void)
 630: {
 631:         DOCITERATOR diCurrent,diNext;
 632: 
 633:         diCurrent=GetNext(NULL);
 634:         while(diCurrent)
 635:         {
 636:                diNext=GetNext(diCurrent);
 637:                odel_vob(GetVID(diCurrent),0);
 638:                /* rel_lmb(diCurrent); */
 639:                free(diCurrent);
 640:                diCurrent=diNext;
 641:         }
 642: 
 643:         return TRUE;
 644: }
 645: 
 646: 
 647: /* --------------------固有データの処理-------------------- */
 648: 
 649: 
 650: #define UNIQUEDATASIZE 8 /* 固有データの大きさ */
 651: /* 実行機能付箋からの固有データの読み込み */
 652: BOOL ReadUniqueData(W* awUniqueData,RECT* aprctWnd,RECT* aprctWork)
 653: {
 654:         H* wData;
 655:         H wBuf[UNIQUEDATASIZE+1];
 656: 
 657:         if(awUniqueData==NULL)
 658:         {
 659:                wData=wBuf;
 660:                oget_fsn(document.idVirtualObj,document.wFileDscr,wData,
 661:                           (UW)(UNIQUEDATASIZE+1)*sizeof(H));
 662:         }else
 663:                wData=(H*)awUniqueData;
 664: 
 665:         if(wData[0]!=UNIQUEDATASIZE*sizeof(H))
 666:                return FALSE;
 667: 
 668:         aprctWnd->c.left=wData[1];
 669:         aprctWnd->c.top=wData[2];
 670:         aprctWnd->c.right=wData[3];
 671:         aprctWnd->c.bottom=wData[4];
 672:         aprctWork->c.left=wData[5];
 673:         aprctWork->c.top=wData[6];
 674:         aprctWork->c.right=wData[7];
 675:         aprctWork->c.bottom=wData[8];
 676: 
 677:         return TRUE;
 678: }
 679: 
 680: void WriteUniqueData(RECT arctWnd,RECT arctWork)
 681: {
 682:         H wData[UNIQUEDATASIZE+1];
 683: 
 684:         wData[0]=UNIQUEDATASIZE*sizeof(H);
 685:         wData[1]=arctWnd.c.left;
 686:         wData[2]=arctWnd.c.top;
 687:         wData[3]=arctWnd.c.right;
 688:         wData[4]=arctWnd.c.bottom;
 689:         wData[5]=arctWork.c.left;
 690:         wData[6]=arctWork.c.top;
 691:         wData[7]=arctWork.c.right;
 692:         wData[8]=arctWork.c.bottom;
 693: 
 694:         if(!document.isReadOnly)
 695:         {
 696:                W wFileDscr;
 697: 
 698:                wFileDscr=oopn_obj(document.idVirtualObj,NULL,F_UPDATE,NULL);
 699:                if(wFileDscr>=0)
 700:                {
 701:                      oput_fsn(document.idVirtualObj,wFileDscr,wData);
 702:                      cls_fil(wFileDscr);
 703:                }
 704:         }
 705: 
 706:         oend_prc(document.idVirtualObj,wData,0); /* 実身の処理終了 */
 707: }
 708: 
 709: void CloseFile(void)
 710: {
 711:         if(document.wFileDscr>=0)
 712:         {
 713:                cls_fil(document.wFileDscr);
 714:                document.wFileDscr=-1;
 715:         }
 716: }
 717: