/*Clipboard I/O routines*/ #define WCLIP_FIRST_WRITE 0 #define WCLIP_CONT_WRITE 1 #define WCLIP_LAST_WRITE 2 SetupClipboard() /*Setup the clipboard device*/ { if(OpenDevice("clipboard.device",0,&ClipboardIO,0)!=0) { TitleError("Can't open clipboard!\n"); Delay(500); /*Pause for 5 seconds; get the user's attention*/ CloseWindow(Window); CloseScreen(Screen); exit(); } clipboardMsgPort.mp_Node.ln_Type=NT_MSGPORT; clipboardMsgPort.mp_Flags=0; clipboardMsgPort.mp_SigBit=AllocSignal(-1); clipboardMsgPort.mp_SigTask=(struct Task *)FindTask((char *)NULL); AddPort(&clipboardMsgPort); ClipboardIO.io_Message.mn_ReplyPort=(struct MsgPort *)&clipboardMsgPort; } WriteInvsTextToClip(StartLoc,Chars,String) int StartLoc,Chars; /*Write a highlighted text block to clipboard*/ char *String; { char WorkString[80]; strcpy(WorkString,""); strcpy(WorkString,&String[StartLoc]); WorkString[Chars]=NULL; WriteStringClip(WorkString); } WriteStringClip(string) /*Write a string to the Clipboard*/ char *string; { int len; /*Write the data, in IFF form*/ WriteClip(&ClipboardIO,"FORM",4,WCLIP_FIRST_WRITE); len=strlen(string)+12; WriteClip(&ClipboardIO,&len,4,WCLIP_CONT_WRITE); WriteClip(&ClipboardIO,"FTXT",4,WCLIP_CONT_WRITE); WriteClip(&ClipboardIO,"CHRS",4,WCLIP_CONT_WRITE); len=strlen(string); WriteClip(&ClipboardIO,&len,4,WCLIP_CONT_WRITE); WriteClip(&ClipboardIO,string,len,WCLIP_LAST_WRITE); } WriteClip(ioreq,buf,bufsiz,whichone) /*Writes a clip to the clipboard*/ register struct IOClipReq *ioreq; char *buf; int bufsiz; int whichone; { if(whichone==WCLIP_FIRST_WRITE) /*First time*/ { ioreq->io_Offset=0; ioreq->io_ClipID=0; } ioreq->io_Command=CMD_WRITE; ioreq->io_Data=buf; ioreq->io_Length=bufsiz; DoIO(ioreq); if(whichone==WCLIP_LAST_WRITE) /*Last time, tell clipboard to make the*/ { /*data available to the system*/ ioreq->io_Command=CMD_UPDATE; DoIO(ioreq); } } ShutDownClipboard() { RemPort(&clipboardMsgPort); CloseDevice(&ClipboardIO); } ReadItemString(Start,Len,string) int Start,Len; /*Read a string from the clipboard and put it into*/ char *string; /*the specified string*/ { char WorkString[80]; char TmpString[80]; strcpy(TmpString,""); strcpy(WorkString,""); ReadString(WorkString,79); strcpy(TmpString,string); TmpString[Start]=NULL; strcat(TmpString,WorkString); strncat(TmpString,&string[Start],79-strlen(TmpString)); TmpString[79]=NULL; strcpy(string,TmpString); } ReadString(string,len) /*Read a string from the Clipboard*/ char *string; int len; { char WorkingString[80]; int length; strcpy(WorkingString,""); length=ReadClip(&ClipboardIO,WorkingString,79); if(!strncmp("FTXT",WorkingString,4)) return(FALSE); strcpy(string,&WorkingString[20]); string[20+len]=NULL; return(TRUE); } ReadClip(ioreq,buf,bufsiz) register struct IOClipReq *ioreq; char *buf; /*Read data from the Clipboard*/ int bufsiz; { int length; ioreq->io_Command=CMD_READ; ioreq->io_Data=buf; ioreq->io_Length=bufsiz-1; ioreq->io_Offset=0; ioreq->io_ClipID=0; DoIO(ioreq); length=ioreq->io_Actual; *(buf+length)='\0'; if(ioreq->io_Actual <(bufsiz-1)) { ioreq->io_Command=CMD_READ; ioreq->io_Length=1; ioreq->io_Data=NULL; DoIO(ioreq); } return(length); } SnagBlock(Source,Last) /*Copy block of lines into clip (non-clipboard)*/ struct LineItem *Source,*Last; { struct LineItem *Dest; ClipStart=ClipEnd=(struct LineItem *)NULL; ClipStart=ClipEnd=Dest=(struct LineItem *)InsertItem(NULL,NULL); Dest->Level=Source->Level; strcpy(Dest->Text,Source->Text); Source=(struct LineItem *)Source->NextItem; while(Source != Last->NextItem) { ClipEnd=Dest=(struct LineItem *)InsertItem(NULL,Dest); Dest->Level=Source->Level; strcpy(Dest->Text,Source->Text); Source=(struct LineItem *)Source->NextItem; } } AddBlock(Start) /*Insert a SnagBlocked item list into the main list*/ struct LineItem *Start; /*starting at Start*/ { struct LineItem *Item,*Dest; int TempX,TempY; UBYTE OrigLevel; Item=(struct LineItem *)ClipStart; Dest=(struct LineItem *)InsertItem(Start->NextItem,Start); OrigLevel=Item->Level; Dest->Level=5; Dest->ItemNumber=Item->ItemNumber; strcpy(Dest->Text,Item->Text); for(;Dest->Level > OrigLevel;Dest->Level--) { AddItem(Dest); RemItem(Dest); } AddItem(Dest); AddItem(Dest->NextItem); Item=(struct LineItem *)ClipStart->NextItem; while(Item != NULL) { Dest=(struct LineItem *)InsertItem(Dest->NextItem,Dest); Dest->Level=Item->Level; Dest->ItemNumber=Item->ItemNumber; strcpy(Dest->Text,Item->Text); AddItem(Dest); Item=(struct LineItem *)Item->NextItem; } TempY=CurY; TempX=CurX; PrintItemList(CurrentItem,CurY); PlotCursor(TempX,TempY); }