home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
util
/
wb
/
stickit2
/
source
/
notemenus.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-03-29
|
5KB
|
242 lines
/**************************************************
************** notemenus.c ******************
**************************************************/
#define INTUI_V36_NAMES_ONLY
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/iffparse.h>
#include <libraries/gadtools.h>
#include <clib/iffparse_protos.h>
#include <stdio.h> /* for printf */
#include <string.h>
#include "stickit2.h"
#include "consts.h"
#include "structs.h"
#include "proto.h"
#define ID_FTXT MAKE_ID('F','T','X','T')
#define ID_CHRS MAKE_ID('C','H','R','S')
extern prj_p prj;
/*
Function : BOOL notemenu_editcopy(note_p curr_note)
Puporse : Copy the current note's text into the clipboard. Returns TRUE if
sucessful, FALSE otherwise.
*/
BOOL notemenu_editcopy(note_p curr_note)
{
struct IFFHandle *iffhandle = NULL;
char errmsg[STRLEN_ERRMSG];
long errno = 0;
int textlen;
/* Is it a valid note ? */
if (!curr_note)
return (FALSE);
/* Allocate IFF structure */
iffhandle = AllocIFF();
if (!iffhandle) {
error("Can't allocate clipboard structure",ERR_WARNING,__LINE__,
__FILE__);
return (FALSE);
}
/* Set up IFF_File for clipboard IO */
iffhandle->iff_Stream = (ULONG)OpenClipboard(prj->prefs.clipunit);
if (!iffhandle) {
sprintf(errmsg,"Can't open clipboard unit %ul",
prj->prefs.clipunit);
error(errmsg,ERR_WARNING,__LINE__,__FILE__);
FreeIFF(iffhandle);
return(FALSE);
}
InitIFFasClip(iffhandle);
/* Start the write to the clipboard */
if (OpenIFF(iffhandle,IFFF_WRITE)) {
error("Can't write to clipboard unit",ERR_WARNING,__LINE__,
__FILE__);
CloseClipboard((struct ClipboardHandle *)iffhandle->iff_Stream);
FreeIFF(iffhandle);
return(FALSE);
}
/* Write the data out */
if (!(errno = PushChunk(iffhandle,ID_FTXT,ID_FORM,IFFSIZE_UNKNOWN))) {
if (!(errno = PushChunk(iffhandle,0,ID_CHRS,IFFSIZE_UNKNOWN))) {
textlen = strlen(curr_note->text);
if (WriteChunkBytes(iffhandle,curr_note->text,textlen)!=
textlen) {
error("Can't write text to clipboard",
ERR_WARNING,__LINE__,__FILE__);
errno = IFFERR_WRITE;
}
}
if (!errno)
errno = PopChunk(iffhandle);
}
if (!errno)
errno = PopChunk(iffhandle);
/* Free resources */
CloseIFF(iffhandle);
CloseClipboard((struct ClipboardHandle *)iffhandle->iff_Stream);
/* Finally, free iffhandle */
FreeIFF(iffhandle);
if (errno)
return (FALSE);
else
return (TRUE);
}
/*
Function : void notemenu_editpaste(note_p curr_note)
Puporse : Copy the current note's from the clipboard into the current cursor
position.
*/
void notemenu_editpaste(note_p curr_note)
{
struct IFFHandle *iffhandle = NULL;
struct ContextNode *contextnode = NULL;
char errmsg[STRLEN_ERRMSG];
char pastebuffer[STRLEN_NOTETEXT];
long errno = 0;
int textlen;
int l;
/* Is it a valid note with carat ? */
if (!curr_note)
return;
if (!curr_note->carat.text)
return;
/* Allocate IFF structure */
iffhandle = AllocIFF();
if (!iffhandle) {
error("Can't allocate clipboard structure",ERR_WARNING,__LINE__,
__FILE__);
return;
}
/* Set up IFF_File for clipboard IO */
iffhandle->iff_Stream = (ULONG)OpenClipboard(prj->prefs.clipunit);
if (!iffhandle) {
sprintf(errmsg,"Can't open clipboard unit %ul",
prj->prefs.clipunit);
error(errmsg,ERR_WARNING,__LINE__,__FILE__);
FreeIFF(iffhandle);
return;
}
InitIFFasClip(iffhandle);
/* Start the write to the clipboard */
if (OpenIFF(iffhandle,IFFF_READ)) {
error("Can't read from clipboard unit",ERR_WARNING,__LINE__,
__FILE__);
CloseClipboard((struct ClipboardHandle *)iffhandle->iff_Stream);
FreeIFF(iffhandle);
return;
}
/* If can't find right chunk */
if (StopChunk(iffhandle,ID_FTXT,ID_CHRS)) {
CloseClipboard((struct ClipboardHandle *)iffhandle->iff_Stream);
FreeIFF(iffhandle);
return;
}
while (TRUE) {
errno = ParseIFF(iffhandle,IFFPARSE_SCAN);
if (errno == IFFERR_EOC)
continue; /* enter next context */
else if (errno)
break;
contextnode = CurrentChunk(iffhandle);
if ((contextnode) && (contextnode->cn_Type == ID_FTXT) &&
(contextnode->cn_ID)) {
while ((textlen = ReadChunkBytes(iffhandle,pastebuffer,
STRLEN_NOTETEXT)) > 0) {
pastebuffer[textlen] = '\0';
for (l = 0; l < textlen; l++)
carat_addachar(curr_note,(char)
((pastebuffer[l] == '\012')?' ':pastebuffer[l]),FALSE);
}
if (textlen < 0)
errno = textlen;
}
}
/* Refresh the note */
carat_from_ptr(curr_note,PTRCHANGE_CLICK);
note_refresh(curr_note);
/* Free resources */
CloseIFF(iffhandle);
CloseClipboard((struct ClipboardHandle *)iffhandle->iff_Stream);
/* Finally, free iffhandle */
FreeIFF(iffhandle);
/* The note text has probably been changed */
prj->projectchanged = TRUE;
}