ORIGIN 'guienv'; LIB_DEF 'guienvfields' '../lib'; INCLUDE 'controls'; INCLUDE 'styledtext'; BODY 'private/fieldsbody'; (* * COPYRIGHT * Copyright (C) Mjolner Informatics, 1991-96 * All rights reserved. *) -- windowLib: attributes -- movie: (# #) (* ONLY defined to make this fragment compilable *); movieField: windowItem (# <<SLOT movieFieldLib: attributes>>; contents: (* the movie shown in THIS(movieField) *) (# theMovie: ^movie enter (# enter theMovie[] do ... #) exit (# do ... exit theMovie[] #) #); scaleToFit: (* if true, contents will be scaled to fit in * THIS(movieField). Otherwise, it will be clipped. *) (# value: @boolean; enter (# enter value do ... #) exit (# do ... exit value #) #); open::< (# create::< (# do ... #); do ... #); close::< (# do ...; #); private: @...; #) (* movieField *); textField: windowItem (* this is a simple field that is used to edit styled text. There * is no scroll functionality, use the textEditor pattern, if * scrolling is required. The normal editing commands cut, copy, * paste, clear are supported. THIS(textField) has to be the * window's target, when editing is performed. this can be obtained * by calling THIS(textField)[] -> target... this is automatically * done when the user clicks in a textField that isn't the target * already *) (# <<SLOT textFieldLib: attributes>>; controlModified: @boolean; eventhandler::< (# textChanged: event (* this event is called whenever the text in * THIS(textField) is changed *) (# do INNER #); onTextChanged:< textChanged; beforeChange: event (* This is called before any change is performed in * THIS(textField) If allow is set to false, then change * is not performed. Position indicates where in the * textfield, the text is inserted or deleted. Length * indicates how many characters is inserted or * deleted. If length is negative, then the characters are * deleted - otherwise they are inserted. *) (# position,length: @integer; allow: @boolean; theText: (* The text beeing inserted when lenght > 0 *) (# value: ^text; ... exit value[] #); enter (position,length) do (if controlModified then false->allow; else true->allow if); INNER ; false->controlModified; exit allow #); onBeforeChange:< beforeChange; onFrameChanged::< (# do ... #); onKeyDown::< (# do ... #); onMouseDown::< (# do ... #); onMouseUp::< (# do ... #); onRefresh::< (# do ... #); onEnableTarget::< (# do ... #); onDisableTarget::< (# do ... #); #); paste: (* this method pastes text from the clipboard into * THIS(textField) at the current insertion point or replaces * the current selection. The text is styled according to the * style information found in the scrap; if there is none, it * is given the same style as the first character of the * replaced selection (or that of the preceding character if * the selection is an insertion point) *) (# do ... #); copy: (* the current selection is copied into the clipboard with the * associated style information. If the current selection is an * insertion point the clipboard is emptied *) (# do ... #); cut: (* the current selection is first copied into the clipBoard * and then deleted *) (# do ... #); clear: (* the current selection is deleted, and the clipboard is not * affected. Calling delete is the same as pressing backspace *) (# do ... #); contents: (* the text in THIS(textField) *) (# theText: ^styledText; enter (# enter theText[] do ... #) exit (# do ... exit theText[] #) #); getChar: (* returns the character at position (pos) in THIS(textField). * The return character (ASCII.cr) and other control characters * count *) (# pos: @integer; ch: @char; enter pos do ... exit ch #); length: integerValue (* returns the number of characters in THIS(textField) *) (# do ... #); all: (* if you want to scan all the text in THIS(textField), use: * all -> scanText(#...#) *) (# exit (0,length) #); scanText: (* INNER is called for every character from position start to * end in THIS(textField). The variable ch is the current * character *) (# start,end: @integer; ch: @char; enter (start,end) do ... #); posToPt: (* Calculates the coordinates of the character number `pos' in * the textField. *) (# pos: @integer; pt: @point; enter pos do ...; exit pt #); ptToPos: (* Calculates the character that are located at the specified * coordinates in the textField. *) (# pos: @integer; pt: @point; enter pt do ...; exit pos #); selection: @ (* selection is the current range of characters in this * (textField) that is selected. Start is the position in the * text of the first character of the selection and end is the * position of the last. If the selection is an insertion * point, "start" and "end" will be the position of the * character just after the carret *) (# start: integerValue (# do ... #); end: integerValue (# do ... #); contents: (* returns the text selected in THIS(textField) *) (# theText: ^text; do ... exit theText[] #); scrollIntoView: (* scrollIntoView makes sure the Selection is visible, * scrolling the textField, if necesary *) ...; set: (* this makes [theStart,theEnd] the new selection *) (# theStart,theEnd: @integer; enter (theStart,theEnd) do ... #); get: (# exit (start,end) #); enter set exit get #) (* selection *); defaultStyle: (* The default style is the style that is used when the * textfield has been completely empty and new text is entered. *) (# style: ^textStyle; enter (# enter style[] do ... #) exit (# do ... exit style[] #) #); isOneStyle: (* this function returns a textStyle if the range of * characters [start,end] has the same style - in which case * "theStyle" will be set to that textStyle - Otherwise * theStyle will be NONE *) (# start,end: @integer; theStyle: ^textStyle; enter (start,end) do ... exit theStyle[] #); setOneSize: (* this makes the range of characters [start,end] have the * same size specified by "theSize" *) (# start,end: @integer; theSize: @integer; enter (start,end,theSize) do ... #); setOneFont: (* this makes the range of characters [start,end] have the * same font specified by "theFont" *) (# start,end: @integer; theFont: ^text; enter (start,end,theFont[]) do ... #); setOneFace: (* this makes the range of characters [start,end] have the * same face (textFaces.italic, textFaces.bold etc.) specified * by "theFace". If doToggle is true and the face specified * exists across the entire selected range, that face is * removed (turned off). Otherwise, all of the selected text * is set to include that face *) (# start,end: @integer; doToggle: @boolean; theFace: @integer; enter (start,end,theFace,doToggle) do ... #); setOneStyle: (* this makes the range of characters [start,end] have the * same continous style specified by "theStyle" *) (# start,end: @integer; theStyle: ^textStyle; enter (start,end,theStyle[]) do ... #); scanTextWithStyle: (* this is a control pattern that calls an INNER for all * characters in THIS(textField) with the style "theStyle". * The variable "ch" is the current character *) (# theStyle: ^textStyle; ch: @char; enter theStyle[] do ... #); margin: (* use this pattern to set or retrieve the left- and top * margin of the text in THIS(textField). The left margin is * the distance from the left bound of THIS(textField) to the * text in THIS(textField). The top margin is the distance * from the upper bound of THIS(textField) to the text in * THIS(textField) *) (# leftMargin,topMargin: @integer; enter (# enter (leftMargin,topMargin) do ... #) exit (# do ... exit (leftMargin,topMargin) #) #); insert: (* insert takes the specified text and inserts it just before * the selection range in THIS(textField). Insert doesn't * affect either the current selection range or the clipboard *) (# theText: ^text; enter theText[] do ... #); delete: (* deletes the characters in the current selection range *) (# do ... #); open::< (# create::< (# do ... #); do ... #); close::< (# do ... #); private: @...; #) (* textField *); abstractScroller: canvas (* this is an abstract superpattern for objects with two * scrollbars. The abstractScroller consist of a canvas containing * the virtual definition of contents that models the object that is * scrolled and the two scrollbars. It also defines the virtual * procedure patterns scroll and adjustscrolling *) (# <<SLOT abstractScrollerLib: attributes>>; contentsType:< (* this describes the object that is scrolled *) windowItem; contents: @contentsType; scroll:< (* this is a superpattern for scrolling functionality of * THIS(abstractScroller). The contents are scrolled "dh" * pixels to the right and "dv" pixels down *) (# dh,dv: @integer enter (dh,dv) do ...; #); open::< (# create::< (# do ... #); do ... #); close::< (# do ... #); private: @...; #) (* abstractScroller *); textEditor: abstractScroller (* this models a texteditor, that is a textfield with two * scrollbars *) (# <<SLOT textEditorLib: attributes>>; contentsType::< textField; scroll::< (# do ... #); open::< (# create::< (# do ... #); do ... #); close::< (# do ... #); private: @...; #) (* textEditor *); scroller: abstractScroller (* this is a general scroller, which can scroll an entire canvas *) (# <<SLOT scrollerLib: attributes>>; contentsType::< canvas; scroll::< (# do ... #); open::< (# create::< (# do ... #); do ... #); close::< (# do ...; #); eventhandler::< (# onFrameChanged::< (# do ...; #); #); private: @...; #)
20.3 Fields Interface | © 1994-2002 Mjølner Informatics |
[Modified: Thursday August 23rd 2001 at 15:03]
|