| @@ -912,17 +912,40 @@ CGContextRef juce_getImageContext (const Image& image) | |||
| } | |||
| #if JUCE_IOS | |||
| Image juce_createImageFromUIImage (UIImage* img) | |||
| { | |||
| CGImageRef image = [img CGImage]; | |||
| Image juce_createImageFromUIImage (UIImage* img) | |||
| { | |||
| CGImageRef image = [img CGImage]; | |||
| Image retval (Image::ARGB, (int) CGImageGetWidth (image), (int) CGImageGetHeight (image), true); | |||
| CGContextRef ctx = juce_getImageContext (retval); | |||
| Image retval (Image::ARGB, (int) CGImageGetWidth (image), (int) CGImageGetHeight (image), true); | |||
| CGContextRef ctx = juce_getImageContext (retval); | |||
| CGContextDrawImage (ctx, CGRectMake (0.0f, 0.0f, CGImageGetWidth (image), CGImageGetHeight (image)), image); | |||
| CGContextDrawImage (ctx, CGRectMake (0.0f, 0.0f, CGImageGetWidth (image), CGImageGetHeight (image)), image); | |||
| return retval; | |||
| } | |||
| return retval; | |||
| } | |||
| #endif | |||
| #if JUCE_MAC | |||
| NSImage* imageToNSImage (const Image& image, float scaleFactor) | |||
| { | |||
| JUCE_AUTORELEASEPOOL | |||
| { | |||
| NSImage* im = [[NSImage alloc] init]; | |||
| auto requiredSize = NSMakeSize (image.getWidth() / scaleFactor, image.getHeight() / scaleFactor); | |||
| [im setSize: requiredSize]; | |||
| CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); | |||
| CGImageRef imageRef = juce_createCoreGraphicsImage (image, colourSpace, true); | |||
| CGColorSpaceRelease (colourSpace); | |||
| NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithCGImage: imageRef]; | |||
| [imageRep setSize: requiredSize]; | |||
| [im addRepresentation: imageRep]; | |||
| [imageRep release]; | |||
| CGImageRelease (imageRef); | |||
| return im; | |||
| } | |||
| } | |||
| #endif | |||
| } | |||
| @@ -55,11 +55,15 @@ namespace | |||
| } | |||
| } | |||
| extern CGImageRef juce_createCoreGraphicsImage (const Image&, CGColorSpaceRef, bool mustOutliveSource); | |||
| extern CGContextRef juce_getImageContext (const Image&); | |||
| CGImageRef juce_createCoreGraphicsImage (const Image&, CGColorSpaceRef, bool mustOutliveSource); | |||
| CGContextRef juce_getImageContext (const Image&); | |||
| #if JUCE_IOS | |||
| extern Image juce_createImageFromUIImage (UIImage*); | |||
| Image juce_createImageFromUIImage (UIImage*); | |||
| #endif | |||
| #if JUCE_MAC | |||
| NSImage* imageToNSImage (const Image& image, float scaleFactor = 1.0f); | |||
| #endif | |||
| } // namespace juce | |||
| @@ -32,28 +32,6 @@ namespace juce | |||
| //============================================================================== | |||
| namespace MouseCursorHelpers | |||
| { | |||
| NSImage* createNSImage (const Image&, float scaleFactor = 1.0f); | |||
| NSImage* createNSImage (const Image& image, float scaleFactor) | |||
| { | |||
| JUCE_AUTORELEASEPOOL | |||
| { | |||
| NSImage* im = [[NSImage alloc] init]; | |||
| auto requiredSize = NSMakeSize (image.getWidth() / scaleFactor, image.getHeight() / scaleFactor); | |||
| [im setSize: requiredSize]; | |||
| CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceRGB(); | |||
| CGImageRef imageRef = juce_createCoreGraphicsImage (image, colourSpace, true); | |||
| CGColorSpaceRelease (colourSpace); | |||
| NSBitmapImageRep* imageRep = [[NSBitmapImageRep alloc] initWithCGImage: imageRef]; | |||
| [imageRep setSize: requiredSize]; | |||
| [im addRepresentation: imageRep]; | |||
| [imageRep release]; | |||
| CGImageRelease (imageRef); | |||
| return im; | |||
| } | |||
| } | |||
| static NSCursor* fromNSImage (NSImage* im, NSPoint hotspot) | |||
| { | |||
| NSCursor* c = [[NSCursor alloc] initWithImage: im | |||
| @@ -110,7 +88,7 @@ namespace MouseCursorHelpers | |||
| void* CustomMouseCursorInfo::create() const | |||
| { | |||
| return MouseCursorHelpers::fromNSImage (MouseCursorHelpers::createNSImage (image, scaleFactor), | |||
| return MouseCursorHelpers::fromNSImage (imageToNSImage (image, scaleFactor), | |||
| NSMakePoint (hotspot.x, hotspot.y)); | |||
| } | |||
| @@ -240,9 +240,13 @@ public: | |||
| void setRepresentedFile (const File& file) override | |||
| { | |||
| if (! isSharedWindow) | |||
| { | |||
| [window setRepresentedFilename: juceStringToNS (file != File() | |||
| ? file.getFullPathName() | |||
| : String())]; | |||
| windowRepresentsFile = (file != File()); | |||
| } | |||
| } | |||
| void setBounds (const Rectangle<int>& newBounds, bool isNowFullScreen) override | |||
| @@ -514,9 +518,16 @@ public: | |||
| } | |||
| } | |||
| void setIcon (const Image&) override | |||
| void setIcon (const Image& newIcon) override | |||
| { | |||
| // to do.. | |||
| if (! isSharedWindow) | |||
| { | |||
| // need to set a dummy represented file here to show the file icon (which we then set to the new icon) | |||
| if (! windowRepresentsFile) | |||
| [window setRepresentedFilename:juceStringToNS (" ")]; // can't just use an empty string for some reason... | |||
| [[window standardWindowButton:NSWindowDocumentIconButton] setImage:imageToNSImage (newIcon)]; | |||
| } | |||
| } | |||
| StringArray getAvailableRenderingEngines() override | |||
| @@ -1365,6 +1376,7 @@ public: | |||
| #endif | |||
| bool isZooming = false, isFirstLiveResize = false, textWasInserted = false; | |||
| bool isStretchingTop = false, isStretchingLeft = false, isStretchingBottom = false, isStretchingRight = false; | |||
| bool windowRepresentsFile = false; | |||
| String stringBeingComposed; | |||
| NSNotificationCenter* notificationCenter = nil; | |||
| @@ -1866,17 +1878,21 @@ struct JuceNSWindowClass : public ObjCClass<NSWindow> | |||
| { | |||
| addIvar<NSViewComponentPeer*> ("owner"); | |||
| addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); | |||
| addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow, "c@:"); | |||
| addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); | |||
| addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); | |||
| addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); | |||
| addMethod (@selector (windowWillResize:toSize:), windowWillResize, @encode (NSSize), "@:@", @encode (NSSize)); | |||
| addMethod (@selector (windowDidExitFullScreen:), windowDidExitFullScreen, "v@:@"); | |||
| addMethod (@selector (zoom:), zoom, "v@:@"); | |||
| addMethod (@selector (windowWillMove:), windowWillMove, "v@:@"); | |||
| addMethod (@selector (windowWillStartLiveResize:), windowWillStartLiveResize, "v@:@"); | |||
| addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize, "v@:@"); | |||
| addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); | |||
| addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow, "c@:"); | |||
| addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); | |||
| addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); | |||
| addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); | |||
| addMethod (@selector (windowWillResize:toSize:), windowWillResize, @encode (NSSize), "@:@", @encode (NSSize)); | |||
| addMethod (@selector (windowDidExitFullScreen:), windowDidExitFullScreen, "v@:@"); | |||
| addMethod (@selector (zoom:), zoom, "v@:@"); | |||
| addMethod (@selector (windowWillMove:), windowWillMove, "v@:@"); | |||
| addMethod (@selector (windowWillStartLiveResize:), windowWillStartLiveResize, "v@:@"); | |||
| addMethod (@selector (windowDidEndLiveResize:), windowDidEndLiveResize, "v@:@"); | |||
| addMethod (@selector (window:shouldPopUpDocumentPathMenu:), shouldPopUpPathMenu, "B@:@", @encode (NSMenu*)); | |||
| addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), | |||
| shouldAllowIconDrag, "B@:@", @encode (NSEvent*), @encode (NSPoint), @encode (NSPasteboard*)); | |||
| #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 | |||
| addProtocol (@protocol (NSWindowDelegate)); | |||
| @@ -1989,6 +2005,22 @@ private: | |||
| if (auto* owner = getOwner (self)) | |||
| owner->liveResizingEnd(); | |||
| } | |||
| static bool shouldPopUpPathMenu (id self, SEL, id /*window*/, NSMenu*) | |||
| { | |||
| if (auto* owner = getOwner (self)) | |||
| return owner->windowRepresentsFile; | |||
| return false; | |||
| } | |||
| static bool shouldAllowIconDrag (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*) | |||
| { | |||
| if (auto* owner = getOwner (self)) | |||
| return owner->windowRepresentsFile; | |||
| return false; | |||
| } | |||
| }; | |||
| NSView* NSViewComponentPeer::createViewInstance() | |||
| @@ -27,11 +27,6 @@ | |||
| namespace juce | |||
| { | |||
| namespace MouseCursorHelpers | |||
| { | |||
| extern NSImage* createNSImage (const Image&, float scaleFactor = 1.f); | |||
| } | |||
| extern NSMenu* createNSMenu (const PopupMenu&, const String& name, int topLevelMenuId, | |||
| int topLevelIndex, bool addDelegate); | |||
| @@ -39,7 +34,7 @@ class SystemTrayIconComponent::Pimpl : private Timer | |||
| { | |||
| public: | |||
| Pimpl (SystemTrayIconComponent& iconComp, const Image& im) | |||
| : owner (iconComp), statusIcon (MouseCursorHelpers::createNSImage (im)) | |||
| : owner (iconComp), statusIcon (imageToNSImage (im)) | |||
| { | |||
| static SystemTrayViewClass cls; | |||
| view = [cls.createInstance() init]; | |||
| @@ -73,7 +68,7 @@ public: | |||
| void updateIcon (const Image& newImage) | |||
| { | |||
| [statusIcon release]; | |||
| statusIcon = MouseCursorHelpers::createNSImage (newImage); | |||
| statusIcon = imageToNSImage (newImage); | |||
| setIconSize(); | |||
| SystemTrayViewClass::setImage (view, statusIcon); | |||
| [statusItem setView: view]; | |||