From 120979e0e239e16b9381c42310bab79eaa1b8fa9 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Sat, 16 Dec 2000 20:17:54 +0000 Subject: [PATCH] Retain/release fixes, and tidy up git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@8337 72102866-910b-0410-8b05-ffd578937521 --- Source/NSLayoutManager.m | 458 +++++++++++++++++++++------------------ 1 file changed, 244 insertions(+), 214 deletions(-) diff --git a/Source/NSLayoutManager.m b/Source/NSLayoutManager.m index e8ed2c36c..b24403b6b 100644 --- a/Source/NSLayoutManager.m +++ b/Source/NSLayoutManager.m @@ -107,6 +107,7 @@ - (void) dealloc { + RELEASE (textContainer); [super dealloc]; } @end @@ -331,11 +332,11 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) - (void) dealloc { - RELEASE(_textContainers); + RELEASE (_textContainers); - RELEASE(_containerRuns); - RELEASE(_fragmentRuns); - RELEASE(_locationRuns); + RELEASE (_containerRuns); + RELEASE (_fragmentRuns); + RELEASE (_locationRuns); [super dealloc]; } @@ -343,15 +344,18 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) // // Setting the text storage // -// The set method generally should not be called directly, but you may want to override -// it. Used to get and set the text storage. The set method is called by the -// NSTextStorage's addTextStorageObserver/removeTextStorageObserver methods. +// The set method generally should not be called directly, but you may +// want to override it. Used to get and set the text storage. The +// set method is called by the NSTextStorage's +// addTextStorageObserver/removeTextStorageObserver methods. - (void) setTextStorage: (NSTextStorage*)aTextStorage { unsigned length = [aTextStorage length]; - NSRange aRange = NSMakeRange(0, length); + NSRange aRange = NSMakeRange (0, length); - ASSIGN(_textStorage, aTextStorage); + /* The text storage is owning us - we mustn't retain it - he is + retaining us*/ + _textStorage = aTextStorage; // force complete re - layout [self textStorage: aTextStorage edited: NSTextStorageEditedCharacters | NSTextStorageEditedAttributes @@ -381,7 +385,7 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) // new one. NSTextStorage's addLayoutManager invokes NSLayoutManager's // setTextStorage method automatically, and that includes self. - while( (object = (NSLayoutManager*)[enumerator nextObject]) ) + while ((object = (NSLayoutManager*)[enumerator nextObject]) != nil) { [_textStorage removeLayoutManager: object]; [newTextStorage addLayoutManager: object]; @@ -396,15 +400,16 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) return _textContainers; } -// Add a container to the end of the array. Must invalidate layout of all glyphs -// after the previous last container (ie glyphs that were not previously laid out -// because they would not fit anywhere). +// Add a container to the end of the array. Must invalidate layout of +// all glyphs after the previous last container (ie glyphs that were +// not previously laid out because they would not fit anywhere). - (void) addTextContainer: (NSTextContainer*)obj { - if ( [_textContainers indexOfObjectIdenticalTo: obj] == NSNotFound ) + if ([_textContainers indexOfObjectIdenticalTo: obj] == NSNotFound) { [_textContainers addObject: obj]; [obj setLayoutManager: self]; + // TODO: Invalidate layout } } @@ -415,6 +420,7 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) atIndex: (unsigned)index { [_textContainers insertObject: aTextContainer atIndex: index]; + // TODO: Invalidate layout } // Removes the container at index from the array. Must invalidate layout of all @@ -428,10 +434,11 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) // Invalidating glyphs and layout // -// This removes all glyphs for the old character range, adjusts the character -// indices of all the subsequent glyphs by the change in length, and invalidates -// the new character range. If actualCharRange is non-NULL it will be set to -// the actual range invalidated after any necessary expansion. +// This removes all glyphs for the old character range, adjusts the +// character indices of all the subsequent glyphs by the change in +// length, and invalidates the new character range. If +// actualCharRange is non-NULL it will be set to the actual range +// invalidated after any necessary expansion. - (void) invalidateGlyphsForCharacterRange: (NSRange)aRange changeInLength: (int)lengthChange actualCharacterRange: (NSRange*)actualRange @@ -444,15 +451,17 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) } } -// This invalidates the layout information (glyph location and rotation) for -// the given range of characters. If flag is YES then this range is marked -// as a hard layout invalidation. If NO, then the invalidation is soft. -// A hard invalid layout range indicates that layout information must be completely -// recalculated no matter what. A soft invalid layout range means that there -// is already old layout info for the range in question, and if the NSLayoutManager -// is smart enough to figure out how to avoid doing the complete relayout, it may -// perform any optimization available. If actualCharRange is non-NULL it will be -// set to the actual range invalidated after any necessary expansion. +// This invalidates the layout information (glyph location and +// rotation) for the given range of characters. If flag is YES then +// this range is marked as a hard layout invalidation. If NO, then +// the invalidation is soft. A hard invalid layout range indicates +// that layout information must be completely recalculated no matter +// what. A soft invalid layout range means that there is already old +// layout info for the range in question, and if the NSLayoutManager +// is smart enough to figure out how to avoid doing the complete +// relayout, it may perform any optimization available. If +// actualCharRange is non-NULL it will be set to the actual range +// invalidated after any necessary expansion. - (void) invalidateLayoutForCharacterRange: (NSRange)aRange isSoft: (BOOL)flag actualCharacterRange: (NSRange*)actualRange @@ -460,11 +469,12 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) [self _doLayout]; } -// Invalidates display for the glyph or character range given. For the glyph -// range variant any part of the range that does not yet have glyphs generated -// is ignored. For the character range variant, unlaid parts of the range are -// remembered and will definitely be redisplayed at some point later when the -// layout is available. Neither method actually causes layout. +// Invalidates display for the glyph or character range given. For +// the glyph range variant any part of the range that does not yet +// have glyphs generated is ignored. For the character range variant, +// unlaid parts of the range are remembered and will definitely be +// redisplayed at some point later when the layout is available. +// Neither method actually causes layout. - (void) invalidateDisplayForCharacterRange: (NSRange)aRange { } @@ -473,7 +483,8 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) { } -// Invalidates layout of all glyphs in container and all subsequent containers. +// Invalidates layout of all glyphs in container and all subsequent +// containers. - (void) textContainerChangedGeometry: (NSTextContainer*)aContainer { // find the first character in that text container @@ -482,22 +493,23 @@ static NSComparisonResult aSort(GSIArrayItem i0, GSIArrayItem i1) // invalidate the layout from here on [self invalidateLayoutForCharacterRange: - NSMakeRange(first, [_textStorage length] - first) + NSMakeRange(first, [_textStorage length] - first) isSoft: NO actualCharacterRange: NULL]; } -// Called by NSTextContainer whenever its textView changes. -// Used to keep notifications in synch. +// Called by NSTextContainer whenever its textView changes. Used to +// keep notifications in synch. - (void) textContainerChangedTextView: (NSTextContainer*)aContainer { } -// Sent from processEditing in NSTextStorage. newCharRange is the range in the -// final string which was explicitly edited. invalidatedRange includes stuff -// which was changed as a result of attribute fixing. invalidatedRange is either -// equal to newCharRange or larger. Layout managers should not change the contents -// of the text storage during the execution of this message. +// Sent from processEditing in NSTextStorage. newCharRange is the +// range in the final string which was explicitly +// edited. invalidatedRange includes stuff which was changed as a +// result of attribute fixing. invalidatedRange is either equal to +// newCharRange or larger. Layout managers should not change the +// contents of the text storage during the execution of this message. - (void) textStorage: (NSTextStorage*)aTextStorage edited: (unsigned)mask range: (NSRange)range @@ -512,7 +524,7 @@ range.location, range.length, lengthChange, invalidatedRange.location, invalidatedRange.length); */ int delta = 0; - unsigned last = NSMaxRange(invalidatedRange); + unsigned last = NSMaxRange (invalidatedRange); if (mask & NSTextStorageEditedCharacters) { @@ -529,7 +541,7 @@ invalidatedRange.length); // the following range is soft invalidated [self invalidateLayoutForCharacterRange: - NSMakeRange(last, [_textStorage length] - last) + NSMakeRange (last, [_textStorage length] - last) isSoft: YES actualCharacterRange: NULL]; } @@ -538,8 +550,8 @@ invalidatedRange.length); // Turning on/off background layout // -// These methods allow you to set/query whether text gets laid out in the -// background when there's nothing else to do. +// These methods allow you to set/query whether text gets laid out in +// the background when there's nothing else to do. - (void) setBackgroundLayoutEnabled: (BOOL)flag { _backgroundLayout = flag; @@ -553,22 +565,25 @@ invalidatedRange.length); // // Accessing glyphs // -// These methods are primitive. They do not cause the bookkeeping of filling -// holes to happen. They do not cause invalidation of other stuff. +// These methods are primitive. They do not cause the bookkeeping of +// filling holes to happen. They do not cause invalidation of other +// stuff. -// Inserts a single glyph into the glyph stream at glyphIndex. The character -// index which this glyph corresponds to is given by charIndex. +// Inserts a single glyph into the glyph stream at glyphIndex. The +// character index which this glyph corresponds to is given by +// charIndex. - (void) insertGlyph: (NSGlyph)aGlyph atGlyphIndex: (unsigned)glyphIndex characterIndex: (unsigned)charIndex { } -// If there are any holes in the glyph stream this will cause glyph generation -// for all holes sequentially encountered until the desired index is available. -// The first variant raises a NSRangeError if the requested index is out of -// bounds, the second does not, but instead optionally returns a flag indicating -// whether the requested index exists. +// If there are any holes in the glyph stream this will cause glyph +// generation for all holes sequentially encountered until the desired +// index is available. The first variant raises a NSRangeError if the +// requested index is out of bounds, the second does not, but instead +// optionally returns a flag indicating whether the requested index +// exists. - (NSGlyph) glyphAtIndex: (unsigned)index { return NSNullGlyph; @@ -581,23 +596,24 @@ invalidatedRange.length); return NSNullGlyph; } -// Replaces the glyph currently at glyphIndex with newGlyph. The character index -// of the glyph is assumed to remain the same (although it can, of coiurse, be set -// explicitly if needed). +// Replaces the glyph currently at glyphIndex with newGlyph. The +// character index of the glyph is assumed to remain the same +// (although it can, of coiurse, be set explicitly if needed). - (void) replaceGlyphAtIndex: (unsigned)index withGlyph: (NSGlyph)newGlyph { } -// This causes glyph generation similarly to asking for a single glyph. -// It formats a sequence of NSGlyphs (unsigned long ints). It does not include -// glyphs that aren't shown in the result but does zero-terminate the array. -// The memory passed in to the function should be large enough for at least -// glyphRange.length+1 elements. The actual number of glyphs stuck into the -// array is returned (not counting the null-termination). -// RM!!! check out the private method "_packedGlyphs:range:length:" if you need -// to send glyphs to the window server. It returns a (conceptually) autoreleased -// array of big-endian packeg glyphs. Don't use this method to do that. +// This causes glyph generation similarly to asking for a single +// glyph. It formats a sequence of NSGlyphs (unsigned long ints). It +// does not include glyphs that aren't shown in the result but does +// zero-terminate the array. The memory passed in to the function +// should be large enough for at least glyphRange.length+1 elements. +// The actual number of glyphs stuck into the array is returned (not +// counting the null-termination). RM!!! check out the private method +// "_packedGlyphs:range:length:" if you need to send glyphs to the +// window server. It returns a (conceptually) autoreleased array of +// big-endian packeg glyphs. Don't use this method to do that. - (unsigned) getGlyphs: (NSGlyph*)glyphArray range: (NSRange)glyphRange { @@ -609,8 +625,8 @@ invalidatedRange.length); { } -// If there are any holes in the glyph stream, this will cause all invalid -// character ranges to have glyphs generated for them. +// If there are any holes in the glyph stream, this will cause all +// invalid character ranges to have glyphs generated for them. - (unsigned) numberOfGlyphs { return 0; @@ -619,29 +635,31 @@ invalidatedRange.length); // // Mapping characters to glyphs // -// Sets the index of the corresponding character for the glyph at the given glyphIndex. +// Sets the index of the corresponding character for the glyph at the +// given glyphIndex. - (void) setCharacterIndex: (unsigned)charIndex forGlyphAtIndex: (unsigned)glyphIndex { } -// If there are any holes in the glyph stream this will cause glyph generation -// for all holes sequentially encountered until the desired index is available. +// If there are any holes in the glyph stream this will cause glyph +// generation for all holes sequentially encountered until the desired +// index is available. - (unsigned) characterIndexForGlyphAtIndex: (unsigned)glyphIndex { // Currently gyphIndex is the same as character index return glyphIndex; } -// These two methods can cause glyph generation. -// Returns the range of characters that generated the glyphs in the -// given glyphRange. actualGlyphRange, if not NULL, will be set to -// the full range of glyphs that the character range returned generated. -// This range may be identical or slightly larger than the requested glyphRange. -// For instance, if the text storage contains the unichar (o-umlaut) and -// the glyph store contains the two atomic glyphs "o" and (umlaut), and -// if the glyphRange given encloses only the first or second glyph, the -// actualGlyphRange will be set to enclose both glyphs. +// These two methods can cause glyph generation. Returns the range of +// characters that generated the glyphs in the given glyphRange. +// actualGlyphRange, if not NULL, will be set to the full range of +// glyphs that the character range returned generated. This range may +// be identical or slightly larger than the requested glyphRange. For +// instance, if the text storage contains the unichar (o-umlaut) and +// the glyph store contains the two atomic glyphs "o" and (umlaut), +// and if the glyphRange given encloses only the first or second +// glyph, the actualGlyphRange will be set to enclose both glyphs. - (NSRange) characterRangeForGlyphRange: (NSRange)glyphRange actualGlyphRange: (NSRange*)actualGlyphRange { @@ -653,13 +671,14 @@ invalidatedRange.length); } // Returns the range of glyphs that are generated from the unichars in -// the given charRange. actualCharRange, if not NULL, will be set to the -// actual range of characters that fully define the glyph range returned. -// This range may be identical or slightly larger than the requested -// characterRange. For instance, if the text storage contains the unichars -// "o" and (umlaut) and the glyph store contains the single precomposed glyph -// (o-umlaut), and if the charcterRange given encloses only the first or -// second unichar, the actualCharRange will be set to enclose both unichars. +// the given charRange. actualCharRange, if not NULL, will be set to +// the actual range of characters that fully define the glyph range +// returned. This range may be identical or slightly larger than the +// requested characterRange. For instance, if the text storage +// contains the unichars "o" and (umlaut) and the glyph store contains +// the single precomposed glyph (o-umlaut), and if the charcterRange +// given encloses only the first or second unichar, the +// actualCharRange will be set to enclose both unichars. - (NSRange) glyphRangeForCharacterRange: (NSRange)charRange actualCharacterRange: (NSRange*)actualCharRange { @@ -674,34 +693,35 @@ invalidatedRange.length); // Setting glyph attributes // -// Each NSGlyph has an attribute field, yes? -// This method is primitive. It does not cause any invalidation of other stuff. -// This method also will not cause glyph generation. The glyph being set must -// already be there. -// This method is used by the NSGlyphGenerator to set attributes. It is not -// usually necessary for anyone but the glyph generator (and perhaps the -// typesetter) to call it. It is provided as a public method so subclassers -// can extend it to accept other glyph attributes. To add new glyph attributes -// to the text system you basically need to do two things. You need to write -// a rulebook which will generate the attributes (in rulebooks attributes are -// identified by integer tags). Then you need to subclass NSLayoutManager to -// provide someplace to store the new attribute and to override this method -// and -attribute:forGlyphAtIndex: to understand the integer tag which your -// new rulebook is generating. NSLayoutManager's implementation understands -// the glyph attributes which it is prepared to remember. Your override -// should pass any glyph attributes it does not understand up to the superclass's -// implementation. +// Each NSGlyph has an attribute field, yes? This method is +// primitive. It does not cause any invalidation of other stuff. +// This method also will not cause glyph generation. The glyph being +// set must already be there. This method is used by the +// NSGlyphGenerator to set attributes. It is not usually necessary +// for anyone but the glyph generator (and perhaps the typesetter) to +// call it. It is provided as a public method so subclassers can +// extend it to accept other glyph attributes. To add new glyph +// attributes to the text system you basically need to do two things. +// You need to write a rulebook which will generate the attributes (in +// rulebooks attributes are identified by integer tags). Then you +// need to subclass NSLayoutManager to provide someplace to store the +// new attribute and to override this method and +// -attribute:forGlyphAtIndex: to understand the integer tag which +// your new rulebook is generating. NSLayoutManager's implementation +// understands the glyph attributes which it is prepared to remember. +// Your override should pass any glyph attributes it does not +// understand up to the superclass's implementation. - (void) setIntAttribute: (int)attribute value: (int)anInt forGlyphAtIndex: (unsigned)glyphIndex { } -// This returns the value for the given glyph attribute at the glyph index -// specified. Most apps will not have much use for this info but the -// typesetter and glyph generator might need to know about certain attributes. -// You can override this method to know how to return any custom glyph -// attributes you want to support. +// This returns the value for the given glyph attribute at the glyph +// index specified. Most apps will not have much use for this info +// but the typesetter and glyph generator might need to know about +// certain attributes. You can override this method to know how to +// return any custom glyph attributes you want to support. - (int) intAttribute: (int)attribute forGlyphAtIndex: (unsigned)glyphIndex { @@ -711,16 +731,17 @@ invalidatedRange.length); // // Handling layout for text containers // -// These methods are fairly primitive. They do not cause any kind of +// These methods are fairly primitive. They do not cause any kind of // invalidation to happen. The glyphs being set must already exist. -// This is not a hardship since the NSTypesetter will have had to ask for -// the actual glyphs already by the time it goes to set this, and asking -// for the glyphs causes the glyph to be generated if necessary. -// Associates the given container with the given range of glyphs. This method -// should be called by the typesetter first (ie before setting line fragment -// rect or any of the layout bits) for each range of glyphs it lays out. -// This method will set several key layout atttributes (like not shown and -// draws outside line fragment) to their default values. +// This is not a hardship since the NSTypesetter will have had to ask +// for the actual glyphs already by the time it goes to set this, and +// asking for the glyphs causes the glyph to be generated if +// necessary. Associates the given container with the given range of +// glyphs. This method should be called by the typesetter first (ie +// before setting line fragment rect or any of the layout bits) for +// each range of glyphs it lays out. This method will set several key +// layout atttributes (like not shown and draws outside line fragment) +// to their default values. - (void) setTextContainer: (NSTextContainer*)aTextContainer forGlyphRange: (NSRange)glyphRange { @@ -733,8 +754,8 @@ invalidatedRange.length); } // All of these methods can cause glyph generation AND layout. -// Returns the range of characters which have been laid into the -// given container. This is a less efficient method than the similar +// Returns the range of characters which have been laid into the given +// container. This is a less efficient method than the similar // -textContainerForGlyphAtIndex:effectiveRange:. - (NSRange) glyphRangeForTextContainer: (NSTextContainer*)aTextContainer { @@ -749,17 +770,13 @@ textContainer(s) in containerRuns.", [_containerRuns count]); /* NSLog(@"glyphRangeForTextContainer: (%d, %d)", -aNewLine->glyphRange.location, -aNewLine->glyphRange.length); -*/ + aNewLine->glyphRange.location, aNewLine->glyphRange.length); */ if ([aNewLine->textContainer isEqual: aTextContainer]) { /* NSLog(@"glyphRangeForWantedTextContainer: (%d, %d)", -aNewLine->glyphRange.location, -aNewLine->glyphRange.length); -*/ + aNewLine->glyphRange.location, aNewLine->glyphRange.length); */ return aNewLine->glyphRange; } } @@ -767,9 +784,10 @@ aNewLine->glyphRange.length); return NSMakeRange(NSNotFound, 0); } -// Returns the container in which the given glyph is laid and (optionally) -// by reference the whole range of glyphs that are in that container. -// This will cause glyph generation AND layout as needed. +// Returns the container in which the given glyph is laid and +// (optionally) by reference the whole range of glyphs that are in +// that container. This will cause glyph generation AND layout as +// needed. - (NSTextContainer*) textContainerForGlyphAtIndex: (unsigned)glyphIndex effectiveRange: (NSRange*)effectiveRange { @@ -789,7 +807,8 @@ aNewLine->glyphRange.length); // // Handling line fragment rectangles // -// Associates the given line fragment bounds with the given range of glyphs. +// Associates the given line fragment bounds with the given range of +// glyphs. - (void) setLineFragmentRect: (NSRect)fragmentRect forGlyphRange: (NSRange)glyphRange usedRect: (NSRect)usedRect @@ -803,9 +822,10 @@ aNewLine->glyphRange.length); [_fragmentRuns insertObject: aNewLine]; } -// Returns the rect for the line fragment in which the given glyph -// is laid and (optionally) by reference the whole range of glyphs -// that are in that fragment. This will cause glyph generation AND layout as needed. +// Returns the rect for the line fragment in which the given glyph is +// laid and (optionally) by reference the whole range of glyphs that +// are in that fragment. This will cause glyph generation AND layout +// as needed. - (NSRect) lineFragmentRectForGlyphAtIndex: (unsigned)glyphIndex effectiveRange: (NSRange*)lineFragmentRange { @@ -842,11 +862,12 @@ aNewLine->glyphRange.length); return NSZeroRect; } -// Sets the bounds and container for the extra line fragment. The extra line -// fragment is used when the text backing ends with a hard line break or when -// the text backing is totally empty to define the extra line which needs to -// be displayed. If the text backing does not end with a hard line break this -// should be set to NSZeroRect and nil. +// Sets the bounds and container for the extra line fragment. The +// extra line fragment is used when the text backing ends with a hard +// line break or when the text backing is totally empty to define the +// extra line which needs to be displayed. If the text backing does +// not end with a hard line break this should be set to NSZeroRect and +// nil. - (void) setExtraLineFragmentRect: (NSRect)aRect usedRect: (NSRect)usedRect textContainer: (NSTextContainer*)aTextContainer @@ -882,15 +903,17 @@ aNewLine->glyphRange.length); { } -// Used to indicate that a particular glyph for some reason marks outside -// its line fragment bounding rect. This can commonly happen if a fixed -// line height is used (consider a 12 point line height and a 24 point glyph). +// Used to indicate that a particular glyph for some reason marks +// outside its line fragment bounding rect. This can commonly happen +// if a fixed line height is used (consider a 12 point line height and +// a 24 point glyph). - (void) setDrawsOutsideLineFragment: (BOOL)flag forGlyphAtIndex: (unsigned)glyphIndex { } -// Returns whether the glyph will make marks outside its line fragment's bounds. +// Returns whether the glyph will make marks outside its line +// fragment's bounds. - (BOOL) drawsOutsideLineFragmentForGlyphAtIndex: (unsigned)glyphIndex { return NO; @@ -900,13 +923,14 @@ aNewLine->glyphRange.length); // Layout of glyphs // -// Sets the location to draw the first glyph of the given range at. +// Sets the location to draw the first glyph of the given range at. // Setting the location for a glyph range implies that its first glyph -// is NOT nominally spaced with respect to the previous glyph. When all -// is said and done all glyphs in the layoutManager should have been -// included in a range passed to this method. But only glyphs which -// start a new nominal rtange should be at the start of such ranges. -// Glyph locations are given relative the their line fragment bounding rect's origin. +// is NOT nominally spaced with respect to the previous glyph. When +// all is said and done all glyphs in the layoutManager should have +// been included in a range passed to this method. But only glyphs +// which start a new nominal rtange should be at the start of such +// ranges. Glyph locations are given relative the their line fragment +// bounding rect's origin. - (void) setLocation: (NSPoint)aPoint forStartOfGlyphRange: (NSRange)glyphRange { @@ -918,14 +942,15 @@ forStartOfGlyphRange: (NSRange)glyphRange [_locationRuns insertObject: aNewLine]; } -// Returns the location that the given glyph will draw at. If this glyph -// doesn't have an explicit location set for it (ie it is part of (but not -// first in) a sequence of nominally spaced characters), the location is -// calculated from the location of the last glyph with a location set. -// Glyph locations are relative the their line fragment bounding rect's -// origin (see -lineFragmentForGlyphAtIndex:effectiveRange: below for -// finding line fragment bounding rects). This will cause glyph generation -// AND layout as needed. +// Returns the location that the given glyph will draw at. If this +// glyph doesn't have an explicit location set for it (ie it is part +// of (but not first in) a sequence of nominally spaced characters), +// the location is calculated from the location of the last glyph with +// a location set. Glyph locations are relative the their line +// fragment bounding rect's origin (see +// -lineFragmentForGlyphAtIndex:effectiveRange: below for finding line +// fragment bounding rects). This will cause glyph generation AND +// layout as needed. - (NSPoint) locationForGlyphAtIndex: (unsigned)glyphIndex { return NSZeroPoint; @@ -933,8 +958,8 @@ forStartOfGlyphRange: (NSRange)glyphRange // Returns the range including the first glyph from glyphIndex on back // that has a location set and up to, but not including the next glyph -// that has a location set. This is a range of glyphs that can be shown -// with a single postscript show operation. +// that has a location set. This is a range of glyphs that can be +// shown with a single postscript show operation. - (NSRange) rangeOfNominallySpacedGlyphsContainingIndex: (unsigned)glyphIndex { GSLineLayoutInfo *theLine; @@ -949,22 +974,22 @@ forStartOfGlyphRange: (NSRange)glyphRange return NSMakeRange(NSNotFound, 0); } -// Returns an array of NSRects and the number of rects by reference which -// define the region in container that encloses the given range. If a -// selected range is given in the second argument, the rectangles returned -// will be correct for drawing the selection. Selection rectangles are -// generally more complicated than enclosing rectangles and supplying a -// selected range is the clue these methods use to determine whether to -// go to the trouble of doing this special work. +// Returns an array of NSRects and the number of rects by reference +// which define the region in container that encloses the given range. +// If a selected range is given in the second argument, the rectangles +// returned will be correct for drawing the selection. Selection +// rectangles are generally more complicated than enclosing rectangles +// and supplying a selected range is the clue these methods use to +// determine whether to go to the trouble of doing this special work. // If the caller is interested in this more from an enclosing point of -// view rather than a selection point of view pass {NSNotFound, 0} as -// the selected range. This method works hard to do the minimum amount -// of work required to answer the question. The resulting array is owned -// by the layoutManager and will be reused when either of these two methods -// OR -boundingRectForGlyphRange:inTextContainer: is called. Note that -// one of these methods may be called indirectly. The upshot is that if -// you aren't going to use the rects right away, you should copy them to -// another location. +// view rather than a selection point of view pass {NSNotFound, 0} as +// the selected range. This method works hard to do the minimum +// amount of work required to answer the question. The resulting +// array is owned by the layoutManager and will be reused when either +// of these two methods OR -boundingRectForGlyphRange:inTextContainer: +// is called. Note that one of these methods may be called +// indirectly. The upshot is that if you aren't going to use the +// rects right away, you should copy them to another location. - (NSRect*) rectArrayForCharacterRange: (NSRange)charRange withinSelectedCharacterRange: (NSRange)selChareRange inTextContainer: (NSTextContainer*)aTextContainer @@ -1022,18 +1047,18 @@ forStartOfGlyphRange: (NSRange)glyphRange // completely encloses the glyphs in the given glyphRange that are in // the given container. If no container is given, then the container // of the first glyph is assumed. Basically, the range is intersected -// with the container's range before computing the bounding rect. -// This method can be used to translate glyph ranges into display rectangles -// for invalidation. +// with the container's range before computing the bounding rect. +// This method can be used to translate glyph ranges into display +// rectangles for invalidation. - (NSRect) boundingRectForGlyphRange: (NSRange)glyphRange inTextContainer: (NSTextContainer*)aTextContainer { /* Returns a single bounding rectangle enclosing all glyphs and other -marks drawn in aTextContainer for glyphRange, including glyphs that draw -outside their line fragment rectangles and text attributes such as -underlining. This method is useful for determining the area that needs to -be redrawn when a range of glyphs changes. */ +marks drawn in aTextContainer for glyphRange, including glyphs that +draw outside their line fragment rectangles and text attributes such +as underlining. This method is useful for determining the area that +needs to be redrawn when a range of glyphs changes. */ /* unsigned rectCount; NSRect *rects = [self rectArrayForCharacterRange: [self glyphRangeForTextContainer: aTextContainer] @@ -1082,10 +1107,11 @@ be redrawn when a range of glyphs changes. */ // Returns the index of the glyph which under the given point which is // expressed in the given container's coordinate system. If no glyph // is under the point the "nearest" glyph is returned where "nearest" -// is defined in such a way that selection works like it should. -// See the implementation for details. partialFraction, if provided, -// is set to the fraction of the distance between the location of the -// glyph returned and the location of the next glyph that the point is at. +// is defined in such a way that selection works like it should. See +// the implementation for details. partialFraction, if provided, is +// set to the fraction of the distance between the location of the +// glyph returned and the location of the next glyph that the point is +// at. - (unsigned) glyphIndexForPoint: (NSPoint)aPoint inTextContainer: (NSTextContainer*)aTextContainer fractionOfDistanceThroughGlyph: (float*)partialFraction @@ -1111,15 +1137,16 @@ be redrawn when a range of glyphs changes. */ { } -// Some glyphs are not shown. This will cause glyph generation and layout as needed.. +// Some glyphs are not shown. This will cause glyph generation and +// layout as needed.. - (BOOL) notShownAttributeForGlyphAtIndex: (unsigned)glyphIndex { return YES; } -// If YES, and the rulebooks and fonts in use support it, whitespace and other -// "invisible" unicodes will be shown with special glyphs (ie "." for space, -// the little CR icon for new lines, etc...) +// If YES, and the rulebooks and fonts in use support it, whitespace +// and other "invisible" unicodes will be shown with special glyphs +// (ie "." for space, the little CR icon for new lines, etc...) - (void) setShowsInvisibleCharacters: (BOOL)flag { _showsInvisibleChars = flag; @@ -1130,9 +1157,10 @@ be redrawn when a range of glyphs changes. */ return _showsInvisibleChars; } -// If YES, and the rulebooks and fonts in use support it, control characters -// will be rendered visibly (usually like "^M", but possibly with special -// glyphs if the the font and rulebook supports it). +// If YES, and the rulebooks and fonts in use support it, control +// characters will be rendered visibly (usually like "^M", but +// possibly with special glyphs if the the font and rulebook supports +// it). - (void) setShowsControlCharacters: (BOOL)flag { _showsControlChars = flag; @@ -1160,7 +1188,8 @@ be redrawn when a range of glyphs changes. */ // Finding unlaid characters/glyphs // // Returns (by reference) the character index or glyph index or both -// of the first unlaid character/glyph in the layout manager at this time. +// of the first unlaid character/glyph in the layout manager at this +// time. - (void) getFirstUnlaidCharacterIndex: (unsigned*)charIndex glyphIndex: (unsigned*)glyphIndex { @@ -1184,7 +1213,8 @@ be redrawn when a range of glyphs changes. */ // // Using screen fonts // -// Sets whether this layoutManager will use screen fonts when it is possible to do so. +// Sets whether this layoutManager will use screen fonts when it is +// possible to do so. - (void) setUsesScreenFonts: (BOOL)flag { _usesScreenFonts = flag; @@ -1195,14 +1225,15 @@ be redrawn when a range of glyphs changes. */ return _usesScreenFonts; } -// Returns a font to use in place of originalFont. This method is used -// to substitute screen fonts for regular fonts. If screen fonts are -// allowed AND no NSTextView managed by this layoutManager is scaled or -// rotated AND a screen font is available for originalFont, it is returned, -// otherwise originalFont is returned. MF:??? This method will eventually -// need to know or be told whether use of screen fonts is appropriate in a -// given situation (ie screen font used might be enabled or disabled, we -// might be printing, etc...). This method causes no generation. +// Returns a font to use in place of originalFont. This method is +// used to substitute screen fonts for regular fonts. If screen fonts +// are allowed AND no NSTextView managed by this layoutManager is +// scaled or rotated AND a screen font is available for originalFont, +// it is returned, otherwise originalFont is returned. MF:??? This +// method will eventually need to know or be told whether use of +// screen fonts is appropriate in a given situation (ie screen font +// used might be enabled or disabled, we might be printing, etc...). +// This method causes no generation. - (NSFont*) substituteFontForFont: (NSFont*)originalFont { NSFont *replaceFont; @@ -1246,8 +1277,8 @@ be redrawn when a range of glyphs changes. */ // // Managing the responder chain // -// Returns YES if the firstResponder of the given window is one of -// the NSTextViews attached to this NSLayoutManager. +// Returns YES if the firstResponder of the given window is one of the +// NSTextViews attached to this NSLayoutManager. - (BOOL) layoutManagerOwnsFirstResponderInWindow: (NSWindow*)aWindow { return NO; @@ -1354,14 +1385,14 @@ aLine->lineFragmentRect.size.height); // for the glyph range given. The second method potentailly breaks // the range it is given up into subranges and calls drawUnderline... // for ranges that should actually have the underline drawn. As -// examples of why there are two methods, consider two situations. +// examples of why there are two methods, consider two situations. // First, in all cases you don't want to underline the leading and // trailing whitespace on a line. The -underlineGlyphRange... method // is passed glyph ranges that have underlining turned on, but it will // then look for this leading and trailing white space and only pass -// the ranges that should actually be underlined to -drawUnderline... +// the ranges that should actually be underlined to -drawUnderline... // Second, if the underlineType: indicates that only words, (ie no -// whitespace), should be underlined, then -underlineGlyphRange... +// whitespace), should be underlined, then -underlineGlyphRange... // will carve the range it is passed up into words and only pass word // ranges to -drawUnderline. - (void) underlineGlyphRange: (NSRange)glyphRange @@ -1388,24 +1419,23 @@ aLine->lineFragmentRect.size.height); @end /* NSLayoutManager */ /* The methods laid out here are not correct, however the code they -contain for the most part is. Therefore, my country and a handsome gift of -Ghiradelli chocolate to he who puts all the pieces together : ) */ +contain for the most part is. Therefore, my country and a handsome +gift of Ghiradelli chocolate to he who puts all the pieces together :) */ /* - * A little utility function to determine the range of characters in a scanner - * that are present in a specified character set. - */ + * A little utility function to determine the range of characters in a + * scanner that are present in a specified character set. */ static inline NSRange -scanRange(NSScanner *scanner, NSCharacterSet* aSet) +scanRange (NSScanner *scanner, NSCharacterSet* aSet) { unsigned start = [scanner scanLocation]; unsigned end = start; - if ([scanner scanCharactersFromSet: aSet intoString: 0] == YES) + if ([scanner scanCharactersFromSet: aSet intoString: 0] == YES) { end = [scanner scanLocation]; } - return NSMakeRange(start, end - start); + return NSMakeRange (start, end - start); } @implementation NSLayoutManager (Private)