home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
dirs
/
'liner_394.lzh
/
'Liner
/
Source
/
clip.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-28
|
7KB
|
275 lines
/*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*/