// -*- mode:objc -*- // $Id: PTYScrollView.m,v 1.18 2006/02/12 17:47:25 ujwal Exp $ /* ** PTYScrollView.m ** ** Copyright (c) 2002, 2003 ** ** Author: Fabian, Ujwal S. Setlur ** Initial code by Kiichi Kusama ** ** Project: iTerm ** ** Description: NSScrollView subclass. Handles scroll detection and background images. ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ // Debug option #define DEBUG_ALLOC 0 #define DEBUG_METHOD_TRACE 0 #import #import @implementation PTYScroller - (id)init { userScroll=NO; return [super init]; } - (void) mouseDown: (NSEvent *)theEvent { //NSLog(@"PTYScroller: mouseDown"); [super mouseDown: theEvent]; if([self floatValue] != 1) userScroll=YES; else userScroll = NO; } - (void)trackScrollButtons:(NSEvent *)theEvent { [super trackScrollButtons:theEvent]; //NSLog(@"scrollbutton"); if([self floatValue] != 1) userScroll=YES; else userScroll = NO; } - (void)trackKnob:(NSEvent *)theEvent { [super trackKnob:theEvent]; //NSLog(@"trackKnob: %f", [self floatValue]); if([self floatValue] != 1) userScroll=YES; else userScroll = NO; } - (BOOL)userScroll { return userScroll; } - (void)setUserScroll: (BOOL) scroll { userScroll=scroll; } @end @implementation PTYScrollView - (void) dealloc { #if DEBUG_ALLOC NSLog(@"%s: 0x%x", __PRETTY_FUNCTION__, self); #endif [backgroundImage release]; [super dealloc]; } - (id)initWithFrame:(NSRect)frame { #if DEBUG_ALLOC NSLog(@"%s: 0x%x: initWithFrame:%d,%d,%d,%d", __PRETTY_FUNCTION__, self, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); #endif if ((self = [super initWithFrame:frame]) == nil) return nil; NSParameterAssert([self contentView] != nil); PTYScroller *aScroller; aScroller=[[PTYScroller alloc] init]; [self setVerticalScroller: aScroller]; [aScroller release]; return self; } - (void) drawBackgroundImageRect: (NSRect) rect { //NSLog(@"%s", __PRETTY_FUNCTION__); NSRect srcRect; //NSLogRect([self frame]); // resize image if we need to if([backgroundImage size].width != [self documentVisibleRect].size.width || [backgroundImage size].height != [self documentVisibleRect].size.height) { [backgroundImage setSize: [self documentVisibleRect].size]; } srcRect = rect; // normalize to origin of visible rectangle srcRect.origin.y -= [self documentVisibleRect].origin.y; // do a vertical flip of coordinates srcRect.origin.y = [backgroundImage size].height - srcRect.origin.y - srcRect.size.height; // draw the image rect [[self backgroundImage] compositeToPoint: NSMakePoint(rect.origin.x, rect.origin.y + rect.size.height) fromRect: srcRect operation: NSCompositeSourceOver fraction: (1.0 - [self transparency])]; } - (void)scrollWheel:(NSEvent *)theEvent { PTYScroller *verticalScroller = (PTYScroller *)[self verticalScroller]; [super scrollWheel: theEvent]; //NSLog(@"PTYScrollView: scrollWheel: %f", [verticalScroller floatValue]); if([verticalScroller floatValue] < 1.0) [verticalScroller setUserScroll: YES]; else [verticalScroller setUserScroll: NO]; } - (void)detectUserScroll { PTYScroller *verticalScroller = (PTYScroller *)[self verticalScroller]; //NSLog(@"PTYScrollView: detectUserScroll: %f", [verticalScroller floatValue]); if([verticalScroller floatValue] < 1.0) [verticalScroller setUserScroll: YES]; else [verticalScroller setUserScroll: NO]; } // background image - (NSImage *) backgroundImage { return (backgroundImage); } - (void) setBackgroundImage: (NSImage *) anImage { [backgroundImage release]; [anImage retain]; backgroundImage = anImage; [backgroundImage setScalesWhenResized: YES]; [backgroundImage setSize: [self documentVisibleRect].size]; } - (float) transparency { return (transparency); } - (void) setTransparency: (float) theTransparency { if(theTransparency >= 0 && theTransparency <= 1) { transparency = theTransparency; [self setNeedsDisplay: YES]; } } @end