|
Ein Textarea Objekt stellt ein Ein- und Ausgabeelement für Texte dar. In dieses Textobjekt kann sowohl von der Applikation als auch vom Benutzer Texte eingetragen werden. Weiterhin bietet ein Textobjekt die Möglichkeit Bereiche mit der Maus zu selektieren. Das folgende Beispiel implementiert einen rudimentären Editor mit den Funktionen Cut, Copy und Paste:
/* Example text.c */ : (Menupukte New, Save, Quit, Select All, Cut, Copy und Paste) : text = j_textarea(frame,25,12); j_settext(text,newtext); while(1) { : if(obj==text) printf("text changed (len=%d)\n",j_getlength(text)); if(obj==new) j_settext(text,newtext); if(obj==save) { j_gettext(text,inhalt); printf("BEGIN\n%s\nEND\n",inhalt); } if((obj==quit) || (obj == frame)) { j_quit(); break; } if(obj==selall) j_selectall(text); if((obj==cut)||(obj==copy)||(obj==paste)) { selstart=j_getselstart(text); selend =j_getselend(text); } if(obj==cut) { j_delete(text,selstart,selend); j_selecttext(text,selstart,selstart); } if(obj==copy) j_getseltext(text,inhalt); if(obj==paste) { if(selstart==selend) j_inserttext(text,inhalt,j_getcurpos(text)); else j_replacetext(text,inhalt,selstart,selend); j_setcurpos(text,selstart); } : } :
Der Editor enthählt weiterhin 7 Menupunkte, die folgende Funktion erfüllen:
Nach der Definition der Menupunkte wird ein Textelement erzeugt:
text = j_textarea(frame,25,12);
Die beiden ersten Argumente definieren die sichtbaren Spalten bzw. Zeilen des Textelements. Werden vom Benutzer über Zeilen bzw. Spaltenende hinausgeschrieben, so erfolgt automatisch eine Anpassung der beiden Scrollbars, die an jedem Textelement angefügt sind. Die folgende Zeile fügt einen vordefinierten Text in das Textelement ein. Der Text befindet sich in der Stringvariablen ''newtext'', die beliebig lang sein kann2.2.
j_settext(text,newtext);
In der folgenden Eventloop werden die Aktionen des Benutzers abgefragt. Werden Änderungen am Text vorgenommen, so wird die Applikation mit mit der ID des Textelementes benachrichtigt:
if(obj==text) printf("text changed (len=%d)\n",j_getlength(text));
Im Beipiel wird dann die Nachricht ''text changed'' ausgegeben, und die aktuelle Länge des Textes ermittelt. Dies erfolgt mit der Funktion:
j_getlength(text)
die als Rückgabewert die Länge des Textes enthält. Die Länge eines Textes entspricht der Anzahl der enthaltenen Zeichen.
Wird der Menupunkt ''Save'' angeklickt, so wird mit der Funktion:
j_gettext(text,inhalt);
der Inhalt des Textelement in die Stringvariable ''inhalt'' kopiert. Diese muss groß genug sein um den gesamten Text aufzunehmen. Im Zweifelsfall ist vorher mit j_getlength(text) zu überprüfen, ob die Stringvariable groß genug ist.
Der gesamte Text kann mit der Funktion:
j_selectall(text);
selektiert werden. Soll nur ein Teil des Textes selektiert werden so kann dies mit der Prozedur:
j_selecttext(text,selstart,selend);
erreicht werden. Das zweite und dritte Argument bestimmt den Anfang bzw. das Ende) des zu selektierenden Bereichs. Da in der Regel jedoch vom Benutzer ein Textbereich selektiert wird, kann Anfang und Ende eines selektierten Textes mit den Funktionen:
selstart=j_getselstart(text); selend =j_getselend(text);
ermittelt werden. Die Funktionen liefern die Position des ersten bzw. letzten selektierten Zeichens zurück. Der Inhalt einen markierten Bereichs kann mit der Procedur:
j_getseltext(text,inhalt);
in die Stringvariable ''inhalt'' kopiert werden. Auch hierbei gilt, daß die Variable ausreichend Speicherplatz bieten muß. Die Mindeslänge dieser Variablen kann mit ''j_getselend(text) - j_getselstart(text)'' ermittelt werden.
Um Texte einzufügen stehen zwei Funktionen zur Verfügung:
j_inserttext(text,inhalt,j_getcurpos(text)); j_replacetext(text,inhalt,selstart,selend);
Dabei fügt die Funktion j_inserttext() den Inhalt der Stringvariablen ''inhalt'' an der Position ''pos'' im Text ein. Die Funktion j_replacetext() ersetzt den Textbereich, zwischen des Positionen ''start'' und ''end'', durch den Inhalt der Stringvariablen ''inhalt''. Im Beispiel werden mit diesen Funktionen die Paste Operationen realisiert.
Zum Löschen von Textbereichen steht die Funktion:
j_delete(text,selstart,selend);
zur Verfügung. Sie löscht den Bereich zwischen der angegebenen Start- und Endposition. Im Beispiel sollen dies der selektierte Bereich sein.
Der Textcursor kann mit der Funktion
j_setcurpos(text,selstart);
vor die angegebene Position plaziert werden. Analog wird mit der Funktion
j_delete(text,selstart,selend);
die aktuelle Position des Cursors zurückgegeben. Die Position versteht sich als 'Anzahl der Zeichen' vom Beginn des Textes an gezählt.
Mit Hilfe dieser präsentierten Funktionen realisiert das obige Beispiel einen einfachen Editor mit den wichtigsten Editierfunktionen.