On 23 Dec 2007, at 8:04 PM, Adam R. Maxwell wrote: > Good grief...do we really need 6 ivars and 4 early returns to work > around a minor bug in a legacy OS? I switched from cells to NSButtons > precisely because they can be added as subviews, so they take care of > drawing and tracking. >
It's only 3 ivars. I don't think it 's that much of a change. > In addition, drawing is now broken in the test project when icons are > selected, so some thorough testing is in order (and I don't have time > for it). > Not on Tiger. What is broken? Christiaan > On Dec 23, 2007, at 10:35 AM, [EMAIL PROTECTED] wrote: > >> Revision: 12019 >> http://bibdesk.svn.sourceforge.net/bibdesk/? >> rev=12019&view=rev >> Author: hofman >> Date: 2007-12-23 10:35:46 -0800 (Sun, 23 Dec 2007) >> >> Log Message: >> ----------- >> Use buttoncells for arrows in fileview and let the fileview track >> and draw the arrows, through the cells. This fixes tool tips in >> Tiger. >> >> Modified Paths: >> -------------- >> trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.h >> trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.m >> trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.h >> trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.m >> >> Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.h >> =================================================================== >> --- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.h >> 2007-12-23 13:39:08 UTC (rev 12018) >> +++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.h >> 2007-12-23 18:35:46 UTC (rev 12019) >> @@ -45,3 +45,11 @@ >> - (id)initWithFrame:(NSRect)frameRect direction: >> (NSUInteger)arrowDirection; >> >> @end >> + >> [EMAIL PROTECTED] FVArrowButtonCell : NSButtonCell { >> + NSUInteger arrowDirection; >> +} >> +- (id)initWithArrowDirection:(NSUInteger)anArrowDirection; >> +- (NSUInteger)arrowDirection; >> +- (void)setArrowDirection:(NSUInteger)newArrowDirection; >> [EMAIL PROTECTED] >> >> Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.m >> =================================================================== >> --- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.m >> 2007-12-23 13:39:08 UTC (rev 12018) >> +++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FVArrowButton.m >> 2007-12-23 18:35:46 UTC (rev 12019) >> @@ -40,21 +40,19 @@ >> >> static NSBezierPath *rightArrowBezierPathWithSize(NSSize size); >> >> [EMAIL PROTECTED] FVArrowButtonCell : NSButtonCell { >> - NSUInteger arrowDirection; >> -} >> -- (NSUInteger)arrowDirection; >> -- (void)setArrowDirection:(NSUInteger)newArrowDirection; >> [EMAIL PROTECTED] >> - >> @implementation FVArrowButtonCell >> >> - (id)initTextCell:(NSString *)aString { >> + return [self initWithArrowDirection:FVArrowRight]; >> +} >> + >> +- (id)initWithArrowDirection:(NSUInteger)anArrowDirection { >> if (self = [super initTextCell:@""]) { >> [self setHighlightsBy:NSNoCellMask]; >> [self setImagePosition:NSImageOnly]; >> [self setBezelStyle:NSRegularSquareBezelStyle]; >> [self setBordered:NO]; >> + arrowDirection = anArrowDirection; >> } >> return self; >> } >> @@ -74,14 +72,14 @@ >> // NSCell's highlight drawing does not look correct against a >> dark background, so override it completely >> NSColor *bgColor = nil; >> NSColor *arrowColor = nil; >> - if ([self isHighlighted]) { >> - bgColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.5]; >> - arrowColor = [NSColor colorWithCalibratedWhite:0.7 alpha: >> 0.8]; >> - } else if ([self isEnabled]) { >> - bgColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.7]; >> + if ([self isEnabled] == NO) { >> + bgColor = [NSColor colorWithCalibratedWhite:0.3 alpha:0.5]; >> arrowColor = [NSColor colorWithCalibratedWhite:1.0 alpha: >> 0.9]; >> + } else if ([self isHighlighted]) { >> + bgColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.8]; >> + arrowColor = [NSColor colorWithCalibratedWhite:0.5 alpha: >> 0.9]; >> } else { >> - bgColor = [NSColor colorWithCalibratedWhite:0.3 alpha:0.5]; >> + bgColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.7]; >> arrowColor = [NSColor colorWithCalibratedWhite:1.0 alpha: >> 0.9]; >> } >> >> @@ -89,6 +87,7 @@ >> [[NSBezierPath bezierPathWithOvalInRect:frame] fill]; >> >> CGContextRef ctxt = [[NSGraphicsContext currentContext] >> graphicsPort]; >> + CGContextSaveGState(ctxt); >> CGContextTranslateCTM(ctxt, NSMinX(frame), NSMinY(frame)); >> if (FVArrowLeft == arrowDirection) { >> CGContextTranslateCTM(ctxt, NSWidth(frame), 0); >> @@ -96,6 +95,7 @@ >> } >> [arrowColor setFill]; >> [rightArrowBezierPathWithSize(frame.size) fill]; >> + CGContextRestoreGState(ctxt); >> } >> >> @end >> >> Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.h >> =================================================================== >> --- trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.h 2007-12-23 >> 13:39:08 UTC (rev 12018) >> +++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.h 2007-12-23 >> 18:35:46 UTC (rev 12019) >> @@ -79,8 +79,11 @@ >> CFAbsoluteTime _timeOfLastOrigin; >> NSPoint _lastOrigin; >> CFMutableDictionaryRef _trackingRectMap; >> - NSButton *_leftArrow; >> - NSButton *_rightArrow; >> + NSButtonCell *_leftArrow; >> + NSButtonCell *_rightArrow; >> + NSButtonCell *_trackedArrow; >> + NSRect _leftArrowFrame; >> + NSRect _rightArrowFrame; >> >> NSArray *_iconURLs; >> } >> >> Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.m >> =================================================================== >> --- trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.m 2007-12-23 >> 13:39:08 UTC (rev 12018) >> +++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FileView.m 2007-12-23 >> 18:35:46 UTC (rev 12019) >> @@ -116,6 +116,7 @@ >> - (void)_updateButtonsForIcon:(FVIcon *)anIcon; >> - (void)_showArrowsForIconAtIndex:(NSUInteger)anIndex; >> - (void)_hideArrows; >> +- (BOOL)_hasArrows; >> - (NSURL *)_URLAtPoint:(NSPoint)point; >> - (NSIndexSet *)_allIndexesInRubberBandRect; >> - (BOOL)_isLocalDraggingInfo:(id <NSDraggingInfo>)sender; >> @@ -203,23 +204,13 @@ >> const CFDictionaryValueCallBacks integerValueCallBacks = { 0, >> NULL, NULL, intDesc, intEqual }; >> _trackingRectMap = CFDictionaryCreateMutable(alloc, 0, >> &integerKeyCallBacks, &integerValueCallBacks); >> >> - _leftArrow = [[FVArrowButton alloc] >> initWithFrame:NSMakeRect(0.0, 0.0, 16.0, 16.0) >> direction:FVArrowLeft]; >> + _leftArrow = [[FVArrowButtonCell alloc] >> initWithArrowDirection:FVArrowLeft]; >> [_leftArrow setTarget:self]; >> [_leftArrow setAction:@selector(leftArrowAction:)]; >> >> - _rightArrow = [[FVArrowButton alloc] >> initWithFrame:NSMakeRect(0.0, 0.0, 16.0, 16.0) >> direction:FVArrowRight]; >> + _rightArrow = [[FVArrowButtonCell alloc] >> initWithArrowDirection:FVArrowRight]; >> [_rightArrow setTarget:self]; >> [_rightArrow setAction:@selector(rightArrowAction:)]; >> - >> - /* >> - Add as subviews and setHidden. >> - >> - If I use addSubview: when the mouse enters, it kills the >> tooltip on 10.5. In the long run, it may be better to accept that >> limitation. On 10.4, tooltips seem to interfere with the buttons in >> either case, causing the buttons to flicker when moving the mouse >> around; for now, I've decided to ignore that since it's evidently a >> bug. >> - */ >> - [_leftArrow setHidden:YES]; >> - [self addSubview:_leftArrow]; >> - [_rightArrow setHidden:YES]; >> - [self addSubview:_rightArrow]; >> } >> >> - (void)observeValueForKeyPath:(NSString *)keyPath ofObject: >> (id)object change:(NSDictionary *)change context:(void *)context >> @@ -1168,6 +1159,13 @@ >> [self _drawDropMessage]; >> } >> >> + if ([self _hasArrows]) { >> + if (NSIntersectsRect(rect, _leftArrowFrame)) >> + [_leftArrow drawWithFrame:_leftArrowFrame inView:self]; >> + if (NSIntersectsRect(rect, _rightArrowFrame)) >> + [_rightArrow drawWithFrame:_rightArrowFrame >> inView:self]; >> + } >> + >> // drop highlight and rubber band are mutually exclusive >> if (NSIsEmptyRect(_dropRectForHighlight) == NO) { >> [self _drawDropHighlightInRect:[self >> centerScanRect:_dropRectForHighlight]]; >> @@ -1257,23 +1255,13 @@ >> - (void)_updateButtonsForIcon:(FVIcon *)anIcon; >> { >> NSUInteger curPage = [anIcon currentPageIndex]; >> - if (curPage == [anIcon pageCount]) { >> - [_leftArrow setEnabled:YES]; >> - [_rightArrow setEnabled:NO]; >> - } >> - else if (curPage == 1) { >> - [_leftArrow setEnabled:NO]; >> - [_rightArrow setEnabled:YES]; >> - } >> - else { >> - [_leftArrow setEnabled:YES]; >> - [_rightArrow setEnabled:YES]; >> - } >> + [_leftArrow setEnabled:curPage != 1]; >> + [_rightArrow setEnabled:curPage != [anIcon pageCount]]; >> } >> >> - (void)leftArrowAction:(id)sender >> { >> - FVIcon *anIcon = [[sender cell] representedObject]; >> + FVIcon *anIcon = [_leftArrow representedObject]; >> [anIcon showPreviousPage]; >> [self _updateButtonsForIcon:anIcon]; >> [self setNeedsDisplay:YES]; >> @@ -1281,12 +1269,16 @@ >> >> - (void)rightArrowAction:(id)sender >> { >> - FVIcon *anIcon = [[sender cell] representedObject]; >> + FVIcon *anIcon = [_rightArrow representedObject]; >> [anIcon showNextPage]; >> [self _updateButtonsForIcon:anIcon]; >> [self setNeedsDisplay:YES]; >> } >> >> +- (BOOL)_hasArrows { >> + return [_leftArrow representedObject] != nil; >> +} >> + >> - (void)_showArrowsForIconAtIndex:(NSUInteger)anIndex >> { >> NSUInteger r, c; >> @@ -1299,8 +1291,6 @@ >> >> NSRect iconRect = [self _rectOfIconInRow:r column:c]; >> >> - NSRect leftRect = NSZeroRect, rightRect = NSZeroRect; >> - >> // determine a min/max size for the arrow buttons >> CGFloat side; >> #if __LP64__ >> @@ -1310,35 +1300,28 @@ >> #endif >> side = MIN(side, 32); >> side = MAX(side, 10); >> - leftRect.size = NSMakeSize(side, side); >> - rightRect.size = NSMakeSize(side, side); >> - >> // 2 pixels between arrows horizontally, and 4 pixels >> between bottom of arrow and bottom of iconRect >> - leftRect.origin = NSMakePoint(NSMidX(iconRect) - 2 - >> NSWidth(leftRect), NSMaxY(iconRect) - NSHeight(leftRect) - 4); >> - rightRect.origin = NSMakePoint(NSMidX(iconRect) + 2, >> NSMaxY(iconRect) - NSHeight(rightRect) - 4); >> + _leftArrowFrame = _rightArrowFrame = >> NSMakeRect(NSMidX(iconRect) + 2, NSMaxY(iconRect) - side - 4, side, >> side); >> + _leftArrowFrame.origin.x -= side + 4; >> >> - // Could check to see if the icon is fully visible; >> NSSplitView is a bit weird about this, since we end up getting >> mouseEntered: for icons that are scrolled out of sight. Full >> visibility isn't required to change pages, though. >> - if (NSContainsRect([self visibleRect], rightRect) && >> NSContainsRect([self visibleRect], leftRect)) { >> - >> - [_leftArrow setFrame:leftRect]; >> - [[_leftArrow cell] setRepresentedObject:anIcon]; >> - [_rightArrow setFrame:rightRect]; >> - [[_rightArrow cell] setRepresentedObject:anIcon]; >> - >> - // set enabled states >> - [self _updateButtonsForIcon:anIcon]; >> - [_leftArrow setHidden:NO]; >> - [_rightArrow setHidden:NO]; >> - // adding buttons as subviews here seems to kill >> the tooltips; maybe that's good, though...they can easily hide the >> arrow buttons, depending on where the mouse enters >> - } >> + [_leftArrow setRepresentedObject:anIcon]; >> + [_rightArrow setRepresentedObject:anIcon]; >> + >> + // set enabled states >> + [self _updateButtonsForIcon:anIcon]; >> + >> + [self >> setNeedsDisplayInRect:NSUnionRect(_leftArrowFrame, >> _rightArrowFrame)]; >> } >> } >> } >> >> - (void)_hideArrows >> { >> - [_leftArrow setHidden:YES]; >> - [_rightArrow setHidden:YES]; >> + if ([self _hasArrows]) { >> + [_leftArrow setRepresentedObject:nil]; >> + [_rightArrow setRepresentedObject:nil]; >> + [self setNeedsDisplayInRect:NSUnionRect(_leftArrowFrame, >> _rightArrowFrame)]; >> + } >> } >> >> - (void)mouseEntered:(NSEvent *)event; >> @@ -1425,6 +1408,27 @@ >> >> NSUInteger r, c, i; >> >> + if ([self _hasArrows]) { >> + if (NSMouseInRect(p, _leftArrowFrame, [self isFlipped])) { >> + _trackedArrow = _leftArrow; >> + // NSButtonCell does not do the highlighting itself >> + [_leftArrow highlight:YES withFrame:_leftArrowFrame >> inView:self]; >> + // this returns YES when the mouse is up or NO when the >> mouse moves out of the rect >> + if ([_leftArrow trackMouse:event inRect:_leftArrowFrame >> ofView:self untilMouseUp:NO]) >> + _trackedArrow = nil; >> + [_leftArrow highlight:NO withFrame:_leftArrowFrame >> inView:self]; >> + return; >> + } >> + else if (NSMouseInRect(p, _rightArrowFrame, [self >> isFlipped])) { >> + _trackedArrow = _rightArrow; >> + [_rightArrow highlight:YES withFrame:_rightArrowFrame >> inView:self]; >> + if ([_rightArrow trackMouse:event >> inRect:_rightArrowFrame ofView:self untilMouseUp:NO]) >> + _trackedArrow = nil; >> + [_rightArrow highlight:NO withFrame:_rightArrowFrame >> inView:self]; >> + return; >> + } >> + } >> + >> // mark this icon for highlight if necessary >> if ([self _getGridRow:&r column:&c atPoint:p]) { >> >> @@ -1565,18 +1569,44 @@ >> >> - (void)mouseUp:(NSEvent *)event >> { >> - if (NO == NSIsEmptyRect(_rubberBandRect)) { >> + if (_trackedArrow) { >> + // the mouse went up while tracking outside ann arrow >> button, it was already unhighlighted >> + _trackedArrow = nil; >> + } >> + else if (NO == NSIsEmptyRect(_rubberBandRect)) { >> + [self setNeedsDisplayInRect:_rubberBandRect]; >> _rubberBandRect = NSZeroRect; >> - [self setNeedsDisplay:YES]; >> } >> } >> >> - (void)mouseDragged:(NSEvent *)event >> { >> - // in mouseDragged:, we're either drawing a rubber band >> selection or initiating a drag >> + // in mouseDragged:, we're either tracking an arrow button, >> drawing a rubber band selection, or initiating a drag >> >> + NSPoint p = [self convertPoint:[event locationInWindow] >> fromView:nil]; >> + >> + if (_trackedArrow == _leftArrow) { >> + // the mouse was dragged out of the left arrow button >> + if (NSMouseInRect(p, _leftArrowFrame, [self isFlipped])) { >> + // it's dragged back into the button, highlight and >> track it until the mouse moved up or outside the button >> + [_leftArrow highlight:YES withFrame:_leftArrowFrame >> inView:self]; >> + if ([_leftArrow trackMouse:event inRect:_leftArrowFrame >> ofView:self untilMouseUp:NO]) >> + _trackedArrow = nil; >> + [_leftArrow highlight:NO withFrame:_leftArrowFrame >> inView:self]; >> + } >> + return; >> + } >> + else if (_trackedArrow == _rightArrow) { >> + if (NSMouseInRect(p, _rightArrowFrame, [self isFlipped])) { >> + [_rightArrow highlight:YES withFrame:_rightArrowFrame >> inView:self]; >> + if ([_rightArrow trackMouse:event >> inRect:_rightArrowFrame ofView:self untilMouseUp:NO]) >> + _trackedArrow = nil; >> + [_rightArrow highlight:NO withFrame:_rightArrowFrame >> inView:self]; >> + } >> + return; >> + } >> + >> NSArray *selectedURLs = nil; >> - NSPoint p = [self convertPoint:[event locationInWindow] >> fromView:nil]; >> NSURL *pointURL = [self _URLAtPoint:p]; >> >> // No previous rubber band selection, so check to see if we're >> dragging an icon at this point. >> >> >> This was sent by the SourceForge.net collaborative development >> platform, the world's largest Open Source development site. >> >> --------------------------------------------------------------------- >> ---- >> This SF.net email is sponsored by: Microsoft >> Defy all challenges. Microsoft(R) Visual Studio 2005. >> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ >> _______________________________________________ >> Bibdesk-commit mailing list >> [EMAIL PROTECTED] >> https://lists.sourceforge.net/lists/listinfo/bibdesk-commit > > > ---------------------------------------------------------------------- > --- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2005. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Bibdesk-develop mailing list > Bibdesk-develop@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/bibdesk-develop ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2005. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Bibdesk-develop mailing list Bibdesk-develop@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bibdesk-develop