// // AICustomTabDragWindow.m // Adium // // Created by Adam Iser on Sat Mar 06 2004. // Copyright (c) 2004 __MyCompanyName__. All rights reserved. // #import "AICustomTabDragWindow.h" #import "AICustomTabsView.h" #import "AICustomTabCell.h" #import "ESFloater.h" #define CUSTOM_TABS_INDENT 3 //Indent on left and right of tabbar #define CONTENT_OFFSET_X 1 //Offset of content view relative to tabs @interface AICustomTabDragWindow (PRIVATE) - (id)initForCustomTabView:(AICustomTabsView *)inTabView cell:(AICustomTabCell *)inTabCell transparent:(BOOL)transparent; @end @implementation AICustomTabDragWindow + (AICustomTabDragWindow *)dragWindowForCustomTabView:(AICustomTabsView *)inTabView cell:(AICustomTabCell *)inTabCell transparent:(BOOL)transparent { return([[[self alloc] initForCustomTabView:inTabView cell:inTabCell transparent:transparent] autorelease]); } //init - (id)initForCustomTabView:(AICustomTabsView *)inTabView cell:(AICustomTabCell *)inTabCell transparent:(BOOL)transparent { [super init]; floaterTabImage = [[self dragTabImageForTabCell:inTabCell inCustomTabsView:inTabView] retain]; floaterWindowImage = [[self dragWindowImageForWindow:[inTabView window] customTabsView:inTabView tabCell:inTabCell] retain]; useFancyAnimations = ( floaterWindowImage ? YES : NO ); if(useFancyAnimations){ //Create a floating window for our tab dragTabFloater = [ESFloater floaterWithImage:floaterTabImage styleMask:NSBorderlessWindowMask title:nil]; [dragTabFloater setMaxOpacity:1.0]; //Create a floating window for the stand-alone window our tab would produce dragWindowFloater = [ESFloater floaterWithImage:floaterWindowImage styleMask:NSTitledWindowMask title:[[inTabView window] title]]; [dragWindowFloater setMaxOpacity:(transparent ? 0.75 : 1.00)]; } return(self); } - (void)closeWindow { [dragTabFloater close:nil]; dragTabFloater = nil; [dragWindowFloater close:nil]; dragWindowFloater = nil; } //dealloc - (void)dealloc { [floaterTabImage release]; [floaterWindowImage release]; [dragTabFloater close:nil]; [dragWindowFloater close:nil]; [super dealloc]; } //Toggle display of the full drag window - (void)setDisplayingFullWindow:(BOOL)inFullWindow animate:(BOOL)animate { if(useFancyAnimations){ fullWindow = inFullWindow; [dragWindowFloater setVisible:fullWindow animate:animate]; [dragTabFloater setVisible:!fullWindow animate:animate]; } } //Move the drag floater to a screen point //If the drag window is fading out, we don't move it. Things look cleaner this way. - (void)moveToPoint:(NSPoint)inPoint { if(useFancyAnimations){ [dragTabFloater moveFloaterToPoint:inPoint]; if(fullWindow) [dragWindowFloater moveFloaterToPoint:NSMakePoint(inPoint.x - CUSTOM_TABS_INDENT, inPoint.y)]; } } //Tab Imaging ---------------------------------------------------------------------------------------------------------- #pragma mark Drag Images //Returns a drag image for the passed tab cell - (NSImage *)dragTabImageForTabCell:(AICustomTabCell *)tabCell inCustomTabsView:(AICustomTabsView *)customTabsView { NSImage *dragTabImage = nil; if([customTabsView canDraw]){ dragTabImage = [[[NSImage alloc] init] autorelease]; [customTabsView lockFocus]; [dragTabImage addRepresentation:[[[NSBitmapImageRep alloc] initWithFocusedViewRect:[tabCell frame]] autorelease]]; [customTabsView unlockFocus]; } return(dragTabImage); } //Returns a drag window image for the passed window/bar/cell - (NSImage *)dragWindowImageForWindow:(NSWindow *)window customTabsView:(AICustomTabsView *)customTabsView tabCell:(AICustomTabCell *)tabCell { NSView *contentView = [[tabCell tabViewItem] view]; NSImage *dragWindowImage = nil; NSImage *contentImage, *tabImage; NSPoint insertPoint; if([customTabsView canDraw] && [contentView canDraw]){ //Get an image of the tab tabImage = [[[NSImage alloc] init] autorelease]; [customTabsView lockFocus]; [tabImage addRepresentation:[[[NSBitmapImageRep alloc] initWithFocusedViewRect:[tabCell frame]] autorelease]]; [customTabsView unlockFocus]; //Get an image of the tabView content view contentImage = [[[NSImage alloc] init] autorelease]; [contentView lockFocus]; [contentImage addRepresentation:[[[NSBitmapImageRep alloc] initWithFocusedViewRect:[contentView frame]] autorelease]]; [contentView unlockFocus]; //Create a drag image the size of the window dragWindowImage = [[[NSImage alloc] initWithSize:[[window contentView] frame].size] autorelease]; [dragWindowImage setBackgroundColor:[NSColor clearColor]]; [dragWindowImage lockFocus]; //Draw the tabbar and tab [customTabsView drawBackgroundInRect:[customTabsView frame] withFrame:[customTabsView frame] selectedTabRect:NSMakeRect(0,0,0,0)]; insertPoint = [customTabsView frame].origin; insertPoint.x += CUSTOM_TABS_INDENT; //Line the tab up a bit more realistically [tabImage compositeToPoint:insertPoint operation:NSCompositeCopy]; //Draw the content NSPoint frameOrigin = [[[tabCell tabViewItem] tabView] frame].origin; [contentImage compositeToPoint:NSMakePoint(frameOrigin.x + CONTENT_OFFSET_X, frameOrigin.y) operation:NSCompositeCopy]; [dragWindowImage unlockFocus]; } return(dragWindowImage); } //Returns the drag image for a drag system call. In 10.3 we return a blank image to keep the system drag code happy //Our custom drag image code (the floating windows) screws up drag tracking events in anything before panther (10.3) //On earlier systems we fall back to using the stock dragging code - (NSImage *)dragImage { if(useFancyAnimations){ return([[[NSImage alloc] initWithSize:[floaterTabImage size]] autorelease]); }else{ return(floaterTabImage); } } @end