1
/* $Id: CocoaDockIconPreview.mm $ */
4
* VBox frontends: Qt GUI ("VirtualBox"):
5
* Cocoa helper for the dock icon preview
9
* Copyright (C) 2009 Sun Microsystems, Inc.
11
* This file is part of VirtualBox Open Source Edition (OSE), as
12
* available from http://www.virtualbox.org. This file is free software;
13
* you can redistribute it and/or modify it under the terms of the GNU
14
* General Public License (GPL) as published by the Free Software
15
* Foundation, in version 2 as it comes in the "COPYING" file of the
16
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20
* Clara, CA 95054 USA or visit http://www.sun.com if you need
21
* additional information or have any questions.
25
#include "CocoaDockIconPreview.h"
26
#include "VBoxCocoaHelper.h"
29
#import <Cocoa/Cocoa.h>
31
@interface DockTileMonitor: NSView
33
CocoaDockIconPreviewPrivate *p;
35
NSImageView *mScreenContent;
36
NSImageView *mMonitorGlossy;
38
- (id)initWithFrame:(NSRect)frame parent:(CocoaDockIconPreviewPrivate*)parent;
39
- (NSImageView*)screenContent;
40
- (void)resize:(NSSize)size;
43
@interface DockTileOverlay: NSView
45
CocoaDockIconPreviewPrivate *p;
47
- (id)initWithFrame:(NSRect)frame parent:(CocoaDockIconPreviewPrivate*)parent;
50
@interface DockTile: NSView
52
CocoaDockIconPreviewPrivate *p;
54
DockTileMonitor *mMonitor;
55
NSImageView *mAppIcon;
57
DockTileOverlay *mOverlay;
59
- (id)initWithParent:(CocoaDockIconPreviewPrivate*)parent;
60
- (NSView*)screenContent;
62
- (void)restoreAppIcon;
63
- (void)updateAppIcon;
64
- (void)restoreMonitor;
65
- (void)updateMonitorWithImage:(CGImageRef)image;
66
- (void)resizeMonitor:(NSSize)size;
70
* Helper class which allow us to access all members/methods of AbstractDockIconPreviewHelper
71
* from any Cocoa class.
73
class CocoaDockIconPreviewPrivate: public AbstractDockIconPreviewHelper
76
inline CocoaDockIconPreviewPrivate (VBoxConsoleWnd *aMainWnd, const QPixmap& aOverlayImage)
77
:AbstractDockIconPreviewHelper (aMainWnd, aOverlayImage)
79
mDockTile = [[DockTile alloc] initWithParent:this];
82
inline ~CocoaDockIconPreviewPrivate()
91
* Cocoa wrapper for the abstract dock icon preview class
93
CocoaDockIconPreview::CocoaDockIconPreview (VBoxConsoleWnd *aMainWnd, const QPixmap& aOverlayImage)
94
: AbstractDockIconPreview (aMainWnd, aOverlayImage)
96
CocoaAutoreleasePool pool;
98
d = new CocoaDockIconPreviewPrivate (aMainWnd, aOverlayImage);
101
CocoaDockIconPreview::~CocoaDockIconPreview()
103
CocoaAutoreleasePool pool;
108
void CocoaDockIconPreview::updateDockOverlay()
110
CocoaAutoreleasePool pool;
112
[d->mDockTile updateAppIcon];
115
void CocoaDockIconPreview::updateDockPreview (CGImageRef aVMImage)
117
CocoaAutoreleasePool pool;
119
[d->mDockTile updateMonitorWithImage:aVMImage];
122
void CocoaDockIconPreview::updateDockPreview (VBoxFrameBuffer *aFrameBuffer)
124
CocoaAutoreleasePool pool;
126
AbstractDockIconPreview::updateDockPreview (aFrameBuffer);
130
void CocoaDockIconPreview::setOriginalSize (int aWidth, int aHeight)
132
CocoaAutoreleasePool pool;
134
[d->mDockTile resizeMonitor:NSMakeSize (aWidth, aHeight)];
138
* Class for arranging/updating the layers for the glossy monitor preview.
140
@implementation DockTileMonitor;
141
- (id)initWithFrame:(NSRect)frame parent:(CocoaDockIconPreviewPrivate*)parent
143
self = [super initWithFrame:frame];
148
/* The screen content view */
149
mScreenContent = [[NSImageView alloc] initWithFrame:NSRectFromCGRect (p->flipRect (p->mUpdateRect))];
150
// [mScreenContent setImageAlignment: NSImageAlignCenter];
151
[mScreenContent setImageAlignment: NSImageAlignTop| NSImageAlignLeft];
152
[mScreenContent setImageScaling: NSScaleToFit];
153
[self addSubview: mScreenContent];
155
mMonitorGlossy = [[NSImageView alloc] initWithFrame:NSRectFromCGRect (p->flipRect (p->mMonitorRect))];
156
[mMonitorGlossy setImage: darwinCGImageToNSImage (p->mDockMonitorGlossy)];
157
[self addSubview: mMonitorGlossy];
163
- (void)drawRect:(NSRect)aRect;
165
NSImage *dockMonitor = darwinCGImageToNSImage (p->mDockMonitor);
166
[dockMonitor drawInRect:NSRectFromCGRect (p->flipRect (p->mMonitorRect)) fromRect:aRect operation:NSCompositeSourceOver fraction:1.0];
167
[dockMonitor release];
170
- (NSImageView*)screenContent
172
return mScreenContent;
175
- (void)resize:(NSSize)size;
177
/* Calculate the new size based on the aspect ratio of the original screen
180
if (size.width > size.height)
182
w = p->mUpdateRect.size.width;
183
h = ((float)size.height / size.width * p->mUpdateRect.size.height);
187
w = ((float)size.width / size.height * p->mUpdateRect.size.width);
188
h = p->mUpdateRect.size.height;
190
CGRect r = (p->flipRect (p->centerRectTo (CGRectMake (0, 0, (int)w, (int)h), p->mUpdateRect)));
191
r.origin.x = (int)r.origin.x;
192
r.origin.y = (int)r.origin.y;
193
r.size.width = (int)r.size.width;
194
r.size.height = (int)r.size.height;
195
// printf("gui %f %f %f %f\n", r.origin.x, r.origin.y, r.size.width, r.size.height);
196
/* Center within the update rect */
197
[mScreenContent setFrame:NSRectFromCGRect (r)];
202
* Simple implementation for the overlay of the OS & the state icon. Is used both
203
* in the application icon & preview mode.
205
@implementation DockTileOverlay
206
- (id)initWithFrame:(NSRect)frame parent:(CocoaDockIconPreviewPrivate*)parent
208
self = [super initWithFrame:frame];
216
- (void)drawRect:(NSRect)aRect;
218
NSGraphicsContext *nsContext = [NSGraphicsContext currentContext];
219
CGContextRef pCGContext = (CGContextRef)[nsContext graphicsPort];
220
p->drawOverlayIcons (pCGContext);
225
* VirtualBox Dock Tile implementation. Manage the switching between the icon
226
* and preview mode & forwards all update request to the appropriate methods.
228
@implementation DockTile
229
- (id)initWithParent:(CocoaDockIconPreviewPrivate*)parent
236
/* Add self as the content view of the dock tile */
237
NSDockTile *dock = [[NSApplication sharedApplication] dockTile];
238
[dock setContentView: self];
239
/* App icon is default */
240
[self restoreAppIcon];
242
mOverlay = [[DockTileOverlay alloc] initWithFrame:NSRectFromCGRect(p->flipRect (p->mDockIconRect)) parent:p];
243
[self addSubview: mOverlay];
249
- (NSView*)screenContent
251
return [mMonitor screenContent];
258
[mAppIcon removeFromSuperview];
264
[mMonitor removeFromSuperview];
270
- (void)restoreAppIcon
275
mAppIcon = [[NSImageView alloc] initWithFrame:NSRectFromCGRect (p->flipRect (p->mDockIconRect))];
276
[mAppIcon setImage: [NSImage imageNamed:@"NSApplicationIcon"]];
277
[self addSubview: mAppIcon positioned:NSWindowBelow relativeTo:mOverlay];
281
- (void)updateAppIcon
283
[self restoreAppIcon];
284
[[[NSApplication sharedApplication] dockTile] display];
287
- (void)restoreMonitor
291
p->initPreviewImages();
293
mMonitor = [[DockTileMonitor alloc] initWithFrame:NSRectFromCGRect (p->flipRect (p->mDockIconRect)) parent:p];
294
[self addSubview: mMonitor positioned:NSWindowBelow relativeTo:mOverlay];
298
- (void)updateMonitorWithImage:(CGImageRef)image
300
[self restoreMonitor];
301
NSImage *nsimage = darwinCGImageToNSImage (image);
302
[[mMonitor screenContent] setImage: nsimage];
304
[[[NSApplication sharedApplication] dockTile] display];
307
- (void)resizeMonitor:(NSSize)size;
309
[mMonitor resize:size];