diff --git a/ChangeLog b/ChangeLog index 7a29611b5..5619b2fac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2003-02-09 18:02 Alexander Malmberg + + * Headers/gnustep/gui/GSLayoutManager_internal.h, + Source/GSLayoutManager.m, Source/NSLayoutManager.m: Add + -_didInvalidateLayout method that is called whenever layout has + been invalidated. Use it in NSLayoutManager to resize text views. + 2003-02-09 15:23 Alexander Malmberg * Source/NSTextView_actions.m: Fix several movement actions (used diff --git a/Headers/gnustep/gui/GSLayoutManager_internal.h b/Headers/gnustep/gui/GSLayoutManager_internal.h index f30a91165..86269dcb6 100644 --- a/Headers/gnustep/gui/GSLayoutManager_internal.h +++ b/Headers/gnustep/gui/GSLayoutManager_internal.h @@ -164,6 +164,19 @@ typedef struct GSLayoutManager_textcontainer_s BOOL started, complete; unsigned int pos, length; + /* + This should be set to YES whenever any layout information for this text + container has been invalidated. It is reset to NO in -_didInvalidateLayout. + All methods called externally that invalidate layout (directly or + indirectly) should call -_didInvalidateLayout at some safe point after + all invalidation is done. + + In GSLayoutManager, -_didInvalidateLayout only resets the flags. However, + subclasses might need to actually do something. NSLayoutManager needs to + tell its NSTextView:s to resize. + */ + BOOL was_invalidated; + linefrag_t *linefrags; int num_linefrags; } textcontainer_t; @@ -198,6 +211,8 @@ typedef struct GSLayoutManager_textcontainer_s -(void) _doLayout; /* TODO: this is just a hack until proper incremental layout is done */ -(void) _doLayoutToGlyph: (unsigned int)glyphIndex; -(void) _doLayoutToContainer: (int)cindex; + +-(void) _didInvalidateLayout; @end diff --git a/Source/GSLayoutManager.m b/Source/GSLayoutManager.m index ca3384801..ab38094aa 100644 --- a/Source/GSLayoutManager.m +++ b/Source/GSLayoutManager.m @@ -1295,6 +1295,7 @@ it should still be safe. might lose opportunities to merge runs, though. tc->linefrags = NULL; tc->num_linefrags = 0; tc->pos = tc->length = 0; + tc->was_invalidated = YES; } for (i = idx - 1, tc = textcontainers + idx - 1; i >= 0; i--, tc--) { @@ -1368,6 +1369,18 @@ it should still be safe. might lose opportunities to merge runs, though. [self _doLayout]; } + +-(void) _didInvalidateLayout +{ + int i; + textcontainer_t *tc; + + for (tc = textcontainers, i = 0; i < num_textcontainers; i++, tc++) + { + tc->was_invalidated = NO; + } +} + @end @@ -1380,6 +1393,7 @@ it should still be safe. might lose opportunities to merge runs, though. { [self _invalidateLayoutFromContainer: 0]; #if 0 + /* TODO: need to bring this up to date and fix it */ unsigned int from_glyph = glyphs->glyph_length; int i, j; textcontainer_t *tc; @@ -1926,6 +1940,8 @@ forStartOfGlyphRange: (NSRange)glyphRange textcontainers[i].textContainer = [aTextContainer retain]; [aTextContainer setLayoutManager: self]; + + [self _didInvalidateLayout]; } - (void) removeTextContainerAtIndex: (unsigned int)index @@ -1949,6 +1965,8 @@ forStartOfGlyphRange: (NSRange)glyphRange free(textcontainers); textcontainers = NULL; } + + [self _didInvalidateLayout]; } - (void) textContainerChangedGeometry: (NSTextContainer *)aContainer @@ -1963,6 +1981,7 @@ forStartOfGlyphRange: (NSRange)glyphRange return; } [self _invalidateLayoutFromContainer: i]; + [self _didInvalidateLayout]; } @@ -2069,6 +2088,7 @@ See [NSTextView -setTextContainer:] for more information about these calls. { [tc->textContainer setLayoutManager: self]; } + [self _didInvalidateLayout]; } /** @@ -2125,6 +2145,7 @@ See [NSTextView -setTextContainer:] for more information about these calls. return; usesScreenFonts = flag; [self _invalidateEverything]; + [self _didInvalidateLayout]; } - (NSFont *) substituteFontForFont: (NSFont *)originalFont @@ -2161,6 +2182,7 @@ See [NSTextView -setTextContainer:] for more information about these calls. showsInvisibleCharacters = flag; [self _invalidateEverything]; + [self _didInvalidateLayout]; } - (BOOL) showsInvisibleCharacters { @@ -2174,6 +2196,7 @@ See [NSTextView -setTextContainer:] for more information about these calls. return; showsControlCharacters = flag; [self _invalidateEverything]; + [self _didInvalidateLayout]; } - (BOOL) showsControlCharacters { @@ -2209,6 +2232,8 @@ See [NSTextView -setTextContainer:] for more information about these calls. [self invalidateLayoutForCharacterRange: r isSoft: YES actualCharacterRange: NULL]; + + [self _didInvalidateLayout]; } diff --git a/Source/NSLayoutManager.m b/Source/NSLayoutManager.m index 9f5a4cd75..a5c041872 100644 --- a/Source/NSLayoutManager.m +++ b/Source/NSLayoutManager.m @@ -1450,9 +1450,6 @@ TODO: not really clear what these should do changeInLength: (int)lengthChange invalidatedRange: (NSRange)invalidatedRange { - unsigned int g; - int i; - [super textStorage: aTextStorage edited: mask range: range @@ -1490,22 +1487,31 @@ TODO: not really clear what these should do } } } +} + + +-(void) _didInvalidateLayout +{ + unsigned int g; + int i; /* Invalidate display from the first glyph not laid out (which will generally be the first glyph to have been invalidated). */ g = layout_glyph; + [super _didInvalidateLayout]; + for (i = 0; i < num_textcontainers; i++) { if (textcontainers[i].complete && g < textcontainers[i].pos + textcontainers[i].length) continue; - [[textcontainers[i].textContainer textView] sizeToFit]; /* TODO? */ + [[textcontainers[i].textContainer textView] sizeToFit]; [[textcontainers[i].textContainer textView] setNeedsDisplay: YES]; } - } + @end