File: programming/cocoa/MacScare-Source.zip/MacScare-Source/GlkTextContainer.m


//
//  GlkTextContainer.m
//  CocoaGlk
//
//  Created by Andrew Hunter on Fri Jun 20 2003.
//  Copyright (c) 2003 __MyCompanyName__. All rights reserved.
//
 
#import "GlkTextContainer.h"
#import "GlkImage.h"
 
 
@implementation GlkTextContainer
 
- (id) initWithWindow: (GlkWindow*) win
                 size: (NSSize) size {
    self = [super initWithContainerSize: size];
    
    if (self) {
        glkWin = win;
    }
 
    return self;
}
 
- (BOOL)isSimpleRectangularTextContainer {
    return NO;
}
 
- (NSRect)lineFragmentRectForProposedRect:(NSRect)proposedRect
                           sweepDirection:(NSLineSweepDirection)sweepDirection
                        movementDirection:(NSLineMovementDirection)movementDirection
                            remainingRect:(NSRect *)remainingRect {
    NSRect res = [super lineFragmentRectForProposedRect: proposedRect
                                         sweepDirection: sweepDirection
                                      movementDirection: movementDirection
                                          remainingRect: remainingRect];
 
    // *remainingRect = NSZeroRect;
 
    // Check for images that distort this line
    NSRect imgBounds = NSMakeRect(0,0,0,0);
 
    // For each image..
    NSEnumerator* imgEnum = [[glkWin inlineImages] objectEnumerator];
    GlkImage*     img;
 
    GlkImage* overlapImage = nil;
 
    while (img = [imgEnum nextObject]) {
        // Retrieve/calculate the bounds of this image
        NSRect theseBounds = [img bounds];
 
        // If it intersects, then update the notification about which
        // overlap image we're dealing with
        if (NSIntersectsRect(theseBounds, res)) {
            overlapImage = img;
            imgBounds = theseBounds;
 
            int bpoint = [img flowBreakPoint];
 
            if (bpoint >= 0) {
                //NSLayoutManager* mgr = [[win view] layoutManager];
                
            }
 
            // .. and update the bounds appropriately
            switch ([img alignment]) {
                case imagealign_MarginRight:
                    // Right alignment
                    res.size.width -= (NSMaxX(res) - NSMinX(theseBounds));
                    break;
                
                case imagealign_MarginLeft:
                default:
                    // Left alignment
                    res.size.width -= (NSMaxX(theseBounds) - NSMinX(res));
                    res.origin.x    = NSMaxX(theseBounds);
            }
        }
 
        if (theseBounds.origin.y > NSMaxY(res)) {
            // No following images
            break;
        }
    }
 
    return res;
}
 
@end

This code uses the PclZip Zip File reading code, which is subject to the GNU LGPL. It also uses the GeSHi syntax highlighter, subject to the GPL. Ask if you want this for your own web site, it's free.