/*Clipboard I/O routines*/ #include "Globals.h" #define WCLIP_FIRST_WRITE 0 #define WCLIP_CONT_WRITE 1 #define WCLIP_LAST_WRITE 2 void SetupClipboard() /*Setup the clipboard device*/ { if(OpenDevice("clipboard.device",0,&ClipboardIO,0)!=0) { Leave(0,"Can't open clipboard!"); CloseWindow(Window); CloseScreen(Screen); exit(200); } /*Establish the clipboard communication port*/ 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; } void 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); } void WriteStringClip(string) /*Write a single string to the Clipboard*/ char *string; { int len; /*Write the data, in IFF (Formatted TeXT) 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); } void 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); } } void ShutDownClipboard() { RemPort(&clipboardMsgPort); CloseDevice(&ClipboardIO); } void ReadItemString(Start,Len,string) int Start,Len; /*Read a string from the clipboard and put it into*/ char *string; /*the specified string*/ { char WorkString[160]; char TmpString[160]; register int c; strcpy(TmpString,""); strcpy(WorkString,""); ReadString(WorkString,159); strcpy(TmpString,string); TmpString[Start]=NULL; strcat(TmpString,WorkString); strncat(TmpString,&string[Start],159-strlen(TmpString)); TmpString[159]=NULL; /*Trundicate the inputted string*/ for(c=0;c<159 && TmpString[c]!=NULL;c++) if(TmpString[c]==0x0a) TmpString[c]=NULL; strcpy(string,TmpString); } ReadString(string,len) /*Read a string from the Clipboard*/ char *string; int len; { char WorkingString[180]; int length; strcpy(WorkingString,""); length=ReadClip(&ClipboardIO,WorkingString,179); 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 area*/ struct LineItem *Source,*Last; { struct LineItem *Dest; struct LineItem *item; char buffer[90]; ULONG blocklen=0; ULONG len; /*This keeps a continuation from being CUT all by itself...*/ Source=(struct LineItem *)FindPrevNonCont(Source); item=(struct LineItem *)Source; while(item != Last->NextItem) /*Get the length of all the data*/ { MakeTextLine(buffer,item); blocklen+=strlen(buffer); item=(struct LineItem *)item->NextItem; } /*Write out the IFF FORM and FTXT chunk header*/ WriteClip(&ClipboardIO,"FORM",4,WCLIP_FIRST_WRITE); len=blocklen+12; WriteClip(&ClipboardIO,&len,4,WCLIP_CONT_WRITE); WriteClip(&ClipboardIO,"FTXT",4,WCLIP_CONT_WRITE); WriteClip(&ClipboardIO,"CHRS",4,WCLIP_CONT_WRITE); WriteClip(&ClipboardIO,&blocklen,4,WCLIP_CONT_WRITE); MakeTextLine(buffer,Source); /*Send the first line to the clipboard*/ WriteClip(&ClipboardIO,buffer,strlen(buffer),WCLIP_CONT_WRITE); ClipStart=ClipEnd=Dest=(struct LineItem *)InsertItem(NULL,NULL); if(ClipStart==NULL) { Leave(0,"Memory too fragmented to perform CUT/COPY!"); return(FALSE); } Dest->Level=Source->Level; strcpy(Dest->Text,Source->Text); Source=(struct LineItem *)Source->NextItem; while(Source != Last->NextItem) /*Go through the list*/ { /*and copy into the clip area*/ ClipEnd=(struct LineItem *)Dest; Dest=(struct LineItem *)InsertItem(NULL,Dest); if(Dest==NULL) { Leave(0,"Memory too fragmented to perform CUT/COPY!"); FreeListMem(ClipStart,ClipEnd); return; } Dest->Level=Source->Level; /*Put lines into an internal clip area*/ Dest->cont=Source->cont; strcpy(Dest->Text,Source->Text); MakeTextLine(buffer,Source); /*And also sends them out to the clipboard*/ WriteClip(&ClipboardIO,buffer,strlen(buffer),WCLIP_CONT_WRITE); Source=(struct LineItem *)Source->NextItem; } ClipEnd=Dest; WriteClip(&ClipboardIO,NULL,NULL,WCLIP_LAST_WRITE); /*Finish it off*/ return(TRUE); } void 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; /*Start at the beginning*/ Dest=(struct LineItem *)InsertItem(Start->NextItem,Start); if(Dest==NULL) { Leave(0,"Memory too fragmented to perform paste!"); return; } OrigLevel=Item->Level; Dest->Level=5; Dest->ItemNumber=Item->ItemNumber; strcpy(Dest->Text,Item->Text); for(;Dest->Level > OrigLevel;Dest->Level--) /*Adjust the ItemNumbers*/ { AddItem(Dest); RemItem(Dest); } AddItem(Dest); AddItem(Dest->NextItem); Item=(struct LineItem *)ClipStart->NextItem; while(Item != NULL) /*Copy the lines to the main outline*/ { Dest=(struct LineItem *)InsertItem(Dest->NextItem,Dest); if(Dest==NULL) { Leave(0,"Memory too fragmented to continue with paste!"); PrintItemList(Start,1); return; } Dest->Level=Item->Level; Dest->ItemNumber=Item->ItemNumber; Dest->cont=Item->cont; strcpy(Dest->Text,Item->Text); AddItem(Dest); Item=(struct LineItem *)Item->NextItem; } TempY=CurY; TempX=CurX; PrintItemList(CurrentItem,CurY); /*Redraw the screen*/ PlotCursor(TempX,TempY); if(LastItem==Start) LastItem=(struct LineItem *)Dest; } /*End of clip.c*/