[Biococoa-dev] Re: Weird bug with selection in Textview with custom textcontainer [solved]

Alexander Griekspoor mek at mekentosj.com
Tue Apr 18 14:12:13 EDT 2006


Hi Douglas,

Many thanks for the advice, I've got it to work!
Below is the implementation of a custom layoutmanager class that  
fixes the problem. The nice thing is that it will get self- 
deactivated when you've fixed the problem ;-) I know if I have  
correctly implemented the fractionOfDistanceThroughGlyph part of the  
method, I'm not well known with c pointers, but that's anyway not  
really needed anyway for me.
Once again, thanks for the help!
Cheers,
Alex


#import "KDLayoutManager.h"

#define COLUMN_WIDTH 10

@implementation KDLayoutManager


- (unsigned)glyphIndexForPoint:(NSPoint)aPoint inTextContainer: 
(NSTextContainer *)aTextContainer fractionOfDistanceThroughGlyph: 
(float *)partialFraction{
	
	unsigned idx = [super glyphIndexForPoint: aPoint
							 inTextContainer: aTextContainer
			  fractionOfDistanceThroughGlyph: partialFraction];
	
	// because of a bug in this method we check by hand	if wrong value  
is given
	if(idx == COLUMN_WIDTH && !NSPointInRect(aPoint, [self  
boundingRectForGlyphRange: NSMakeRange(COLUMN_WIDTH,1)  
inTextContainer: aTextContainer])){
		int i;
		for (i=0; i<COLUMN_WIDTH; i++){
			NSRect glyphRect = [self boundingRectForGlyphRange: NSMakeRange(i, 
1) inTextContainer: aTextContainer];
			if(NSPointInRect(aPoint, glyphRect)){
				//calculate fraction
				float fraction = (aPoint.x - NSMinX(glyphRect)) / NSWidth 
(glyphRect);
				partialFraction = &fraction;
				return i;
			}
		}
		// if not found, check whether before or after
		if(aPoint.x < NSMinX([self boundingRectForGlyphRange: NSMakeRange 
(0,1) inTextContainer: aTextContainer])) {
			float fraction = 0.0;
			partialFraction = &fraction;
			return 0;
		}
		else {
			float fraction = 1.0;
			partialFraction = &fraction;
			return COLUMN_WIDTH;
		}
		
	}
	return idx;
}

@end






On 18-apr-2006, at 17:30, Douglas Davidson wrote:

>
> On Apr 18, 2006, at 12:43 AM, Alexander Griekspoor wrote:
>
>> I've thought a bit about it and I see one potential workaround.  
>> Can you tell me whether it's likely to work?
>> Here's what I had in mind:
>> 1) as you suggested, override:  - (unsigned)glyphIndexForPoint: 
>> (NSPoint)aPoint inTextContainer:(NSTextContainer *)aTextContainer  
>> fractionOfDistanceThroughGlyph:(float *)partialFraction
>>
>> 2) in it, find out if the point is within the first 10 characters  
>> and there is only one line (the conditions that the bug presents  
>> itself). <- is there an easy way to do this?
>
> You can find out from the layout manager how many fragments there  
> are, using the effective glyph range argument to  
> lineFragmentRectForGlyphAtIndex:effectiveRange: and iterating, and  
> I think you have a fixed maximum number of fragments per line.   
> However, in your case I think just counting characters will suffice  
> to determine how many lines there are.  Then I would check to see  
> whether the super method  
> glyphIndexForPoint:inTextContainer:fractionOfDistanceThroughGlyph:  
> points at the first glyph in the second fragment, which is what  
> happens in the error case.
>
>> 3) if we are dealing with the above, use - (NSRectArray) 
>> rectArrayForGlyphRange:(NSRange)glyphRange  
>> withinSelectedGlyphRange:(NSRange)selGlyphRange inTextContainer: 
>> (NSTextContainer *)aTextContainer rectCount:(unsigned *)rectCount   
>> with glyphrange 1-10, iterate over the rect array to see if the  
>> point falls within each rect and return the one where we have bingo.
>>
>
> I would use locationForGlyphAtIndex:, and if it falls before one of  
> the locations of the glyphs in the first fragment, handle it  
> accordingly, and otherwise just use the super method's values.
>
> Douglas Davidson
>

*********************************************************
                     ** Alexander Griekspoor **
*********************************************************
               The Netherlands Cancer Institute
               Department of Tumorbiology (H4)
          Plesmanlaan 121, 1066 CX, Amsterdam
                   Tel:  + 31 20 - 512 2023
                   Fax:  + 31 20 - 512 2029
                   AIM: mekentosj at mac.com
                   E-mail: a.griekspoor at nki.nl
               Web: http://www.mekentosj.com

                             iRNAi, do you?
              http://www.mekentosj.com/irnai

*********************************************************

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.bioinformatics.org/pipermail/biococoa-dev/attachments/20060418/3f5c049f/attachment.html>


More information about the Biococoa-dev mailing list