@@ -1031,6 +1031,8 @@ public: | |||||
{ | { | ||||
const bool wasValid = isValid(); | const bool wasValid = isValid(); | ||||
wrapper.setVisible (false); | |||||
removeChildComponent (&wrapper); | |||||
wrapper.setView (nil); | wrapper.setView (nil); | ||||
if (wasValid) | if (wasValid) | ||||
@@ -25,7 +25,6 @@ | |||||
BEGIN_JUCE_NAMESPACE | BEGIN_JUCE_NAMESPACE | ||||
//============================================================================== | |||||
bool NamedPipe::openExisting (const String& pipeName) | bool NamedPipe::openExisting (const String& pipeName) | ||||
{ | { | ||||
currentPipeName = pipeName; | currentPipeName = pipeName; | ||||
@@ -26,8 +26,6 @@ | |||||
#ifndef __JUCE_NAMEDPIPE_JUCEHEADER__ | #ifndef __JUCE_NAMEDPIPE_JUCEHEADER__ | ||||
#define __JUCE_NAMEDPIPE_JUCEHEADER__ | #define __JUCE_NAMEDPIPE_JUCEHEADER__ | ||||
#include "../threads/juce_CriticalSection.h" | |||||
//============================================================================== | //============================================================================== | ||||
/** | /** | ||||
@@ -102,7 +100,6 @@ private: | |||||
class Pimpl; | class Pimpl; | ||||
ScopedPointer<Pimpl> pimpl; | ScopedPointer<Pimpl> pimpl; | ||||
String currentPipeName; | String currentPipeName; | ||||
CriticalSection lock; | |||||
bool openInternal (const String& pipeName, const bool createPipe); | bool openInternal (const String& pipeName, const bool createPipe); | ||||
@@ -132,8 +132,8 @@ void Button::setToggleState (const bool shouldBeOn, | |||||
{ | { | ||||
if (shouldBeOn != lastToggleState) | if (shouldBeOn != lastToggleState) | ||||
{ | { | ||||
if (isOn != shouldBeOn) // this test means that if the value is void rather than explicitly set to | |||||
isOn = shouldBeOn; // false, it won't be changed unless the required value is true. | |||||
if (getToggleState() != shouldBeOn) // this test means that if the value is void rather than explicitly set to | |||||
isOn = shouldBeOn; // false, it won't be changed unless the required value is true. | |||||
lastToggleState = shouldBeOn; | lastToggleState = shouldBeOn; | ||||
repaint(); | repaint(); | ||||
@@ -346,11 +346,13 @@ Image juce_createIconForFile (const File& file) | |||||
//============================================================================== | //============================================================================== | ||||
void SystemClipboard::copyTextToClipboard (const String& text) | void SystemClipboard::copyTextToClipboard (const String& text) | ||||
{ | { | ||||
[[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject: NSStringPboardType] | |||||
owner: nil]; | |||||
NSPasteboard* pb = [NSPasteboard generalPasteboard]; | |||||
[[NSPasteboard generalPasteboard] setString: juceStringToNS (text) | |||||
forType: NSStringPboardType]; | |||||
[pb declareTypes: [NSArray arrayWithObject: NSStringPboardType] | |||||
owner: nil]; | |||||
[pb setString: juceStringToNS (text) | |||||
forType: NSStringPboardType]; | |||||
} | } | ||||
String SystemClipboard::getTextFromClipboard() | String SystemClipboard::getTextFromClipboard() | ||||
@@ -108,19 +108,13 @@ public: | |||||
//============================================================================== | //============================================================================== | ||||
/** @internal */ | /** @internal */ | ||||
void paint (Graphics& g); | void paint (Graphics& g); | ||||
/** @internal */ | |||||
void* originalWndProc; | |||||
private: | private: | ||||
class Pimpl; | class Pimpl; | ||||
friend class Pimpl; | |||||
friend class ScopedPointer <Pimpl>; | friend class ScopedPointer <Pimpl>; | ||||
ScopedPointer <Pimpl> control; | ScopedPointer <Pimpl> control; | ||||
bool mouseEventsAllowed; | bool mouseEventsAllowed; | ||||
void setControlBounds (const Rectangle<int>& bounds) const; | |||||
void setControlVisible (bool b) const; | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveXControlComponent); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveXControlComponent); | ||||
}; | }; | ||||
@@ -84,5 +84,4 @@ private: | |||||
}; | }; | ||||
#endif | #endif | ||||
#endif // __JUCE_UIVIEWCOMPONENT_JUCEHEADER__ | #endif // __JUCE_UIVIEWCOMPONENT_JUCEHEADER__ |
@@ -75,9 +75,9 @@ public: | |||||
if (wrapperWindow == 0) | if (wrapperWindow == 0) | ||||
{ | { | ||||
Rect r; | Rect r; | ||||
r.left = getScreenX(); | |||||
r.top = getScreenY(); | |||||
r.right = r.left + getWidth(); | |||||
r.left = getScreenX(); | |||||
r.top = getScreenY(); | |||||
r.right = r.left + getWidth(); | |||||
r.bottom = r.top + getHeight(); | r.bottom = r.top + getHeight(); | ||||
CreateNewWindow (kDocumentWindowClass, | CreateNewWindow (kDocumentWindowClass, | ||||
@@ -101,10 +101,10 @@ public: | |||||
{ kEventClassWindow, kEventWindowGetClickActivation }, | { kEventClassWindow, kEventWindowGetClickActivation }, | ||||
{ kEventClassWindow, kEventWindowHandleDeactivate }, | { kEventClassWindow, kEventWindowHandleDeactivate }, | ||||
{ kEventClassWindow, kEventWindowBoundsChanging }, | { kEventClassWindow, kEventWindowBoundsChanging }, | ||||
{ kEventClassMouse, kEventMouseDown }, | |||||
{ kEventClassMouse, kEventMouseMoved }, | |||||
{ kEventClassMouse, kEventMouseDragged }, | |||||
{ kEventClassMouse, kEventMouseUp}, | |||||
{ kEventClassMouse, kEventMouseDown }, | |||||
{ kEventClassMouse, kEventMouseMoved }, | |||||
{ kEventClassMouse, kEventMouseDragged }, | |||||
{ kEventClassMouse, kEventMouseUp}, | |||||
{ kEventClassWindow, kEventWindowDrawContent }, | { kEventClassWindow, kEventWindowDrawContent }, | ||||
{ kEventClassWindow, kEventWindowShown }, | { kEventClassWindow, kEventWindowShown }, | ||||
{ kEventClassWindow, kEventWindowHidden } | { kEventClassWindow, kEventWindowHidden } | ||||
@@ -179,7 +179,7 @@ public: | |||||
HIRect r; | HIRect r; | ||||
r.origin.x = 0; | r.origin.x = 0; | ||||
r.origin.y = 0; | r.origin.y = 0; | ||||
r.size.width = (float) getWidth(); | |||||
r.size.width = (float) getWidth(); | |||||
r.size.height = (float) getHeight(); | r.size.height = (float) getHeight(); | ||||
HIViewSetFrame (embeddedView, &r); | HIViewSetFrame (embeddedView, &r); | ||||
} | } | ||||
@@ -187,9 +187,9 @@ public: | |||||
if (wrapperWindow != 0) | if (wrapperWindow != 0) | ||||
{ | { | ||||
Rect wr; | Rect wr; | ||||
wr.left = getScreenX(); | |||||
wr.top = getScreenY(); | |||||
wr.right = wr.left + getWidth(); | |||||
wr.left = getScreenX(); | |||||
wr.top = getScreenY(); | |||||
wr.right = wr.left + getWidth(); | |||||
wr.bottom = wr.top + getHeight(); | wr.bottom = wr.top + getHeight(); | ||||
SetWindowBounds (wrapperWindow, kWindowContentRgn, &wr); | SetWindowBounds (wrapperWindow, kWindowContentRgn, &wr); | ||||
@@ -40,7 +40,7 @@ public: | |||||
~Pimpl() | ~Pimpl() | ||||
{ | { | ||||
[view removeFromSuperview]; | |||||
removeFromParent(); | |||||
[view release]; | [view release]; | ||||
} | } | ||||
@@ -77,10 +77,7 @@ public: | |||||
if (currentPeer != peer) | if (currentPeer != peer) | ||||
{ | { | ||||
if ([view superview] != nil) | |||||
[view removeFromSuperview]; // Must be careful not to call this unless it's required - e.g. some Apple AU views | |||||
// override the call and use it as a sign that they're being deleted, which breaks everything.. | |||||
removeFromParent(); | |||||
currentPeer = peer; | currentPeer = peer; | ||||
if (peer != nullptr) | if (peer != nullptr) | ||||
@@ -111,6 +108,13 @@ private: | |||||
Component& owner; | Component& owner; | ||||
ComponentPeer* currentPeer; | ComponentPeer* currentPeer; | ||||
void removeFromParent() | |||||
{ | |||||
if ([view superview] != nil) | |||||
[view removeFromSuperview]; // Must be careful not to call this unless it's required - e.g. some Apple AU views | |||||
// override the call and use it as a sign that they're being deleted, which breaks everything.. | |||||
} | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl); | ||||
}; | }; | ||||
@@ -205,14 +205,14 @@ namespace ActiveXHelpers | |||||
class ActiveXControlComponent::Pimpl : public ComponentMovementWatcher | class ActiveXControlComponent::Pimpl : public ComponentMovementWatcher | ||||
{ | { | ||||
public: | public: | ||||
//============================================================================== | |||||
Pimpl (HWND hwnd, ActiveXControlComponent& owner_) | Pimpl (HWND hwnd, ActiveXControlComponent& owner_) | ||||
: ComponentMovementWatcher (&owner_), | : ComponentMovementWatcher (&owner_), | ||||
owner (owner_), | owner (owner_), | ||||
controlHWND (0), | controlHWND (0), | ||||
storage (new ActiveXHelpers::JuceIStorage()), | storage (new ActiveXHelpers::JuceIStorage()), | ||||
clientSite (new ActiveXHelpers::JuceIOleClientSite (hwnd)), | clientSite (new ActiveXHelpers::JuceIOleClientSite (hwnd)), | ||||
control (nullptr) | |||||
control (nullptr), | |||||
originalWndProc (0) | |||||
{ | { | ||||
} | } | ||||
@@ -228,16 +228,25 @@ public: | |||||
storage->Release(); | storage->Release(); | ||||
} | } | ||||
void setControlBounds (const Rectangle<int>& bounds) const | |||||
{ | |||||
if (controlHWND != 0) | |||||
MoveWindow (controlHWND, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), TRUE); | |||||
} | |||||
void setControlVisible (bool shouldBeVisible) const | |||||
{ | |||||
if (controlHWND != 0) | |||||
ShowWindow (controlHWND, shouldBeVisible ? SW_SHOWNA : SW_HIDE); | |||||
} | |||||
//============================================================================== | //============================================================================== | ||||
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) | void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) | ||||
{ | { | ||||
Component* const topComp = owner.getTopLevelComponent(); | Component* const topComp = owner.getTopLevelComponent(); | ||||
if (topComp->getPeer() != nullptr) | if (topComp->getPeer() != nullptr) | ||||
{ | |||||
const Point<int> pos (topComp->getLocalPoint (&owner, Point<int>())); | |||||
owner.setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), owner.getWidth(), owner.getHeight())); | |||||
} | |||||
setControlBounds (topComp->getLocalArea (&owner, owner.getLocalBounds())); | |||||
} | } | ||||
void componentPeerChanged() | void componentPeerChanged() | ||||
@@ -247,7 +256,7 @@ public: | |||||
void componentVisibilityChanged() | void componentVisibilityChanged() | ||||
{ | { | ||||
owner.setControlVisible (owner.isShowing()); | |||||
setControlVisible (owner.isShowing()); | |||||
componentPeerChanged(); | componentPeerChanged(); | ||||
} | } | ||||
@@ -290,7 +299,7 @@ public: | |||||
break; | break; | ||||
} | } | ||||
return CallWindowProc ((WNDPROC) ax->originalWndProc, hwnd, message, wParam, lParam); | |||||
return CallWindowProc (ax->control->originalWndProc, hwnd, message, wParam, lParam); | |||||
} | } | ||||
} | } | ||||
@@ -305,12 +314,13 @@ public: | |||||
IStorage* storage; | IStorage* storage; | ||||
IOleClientSite* clientSite; | IOleClientSite* clientSite; | ||||
IOleObject* control; | IOleObject* control; | ||||
WNDPROC originalWndProc; | |||||
}; | }; | ||||
//============================================================================== | //============================================================================== | ||||
ActiveXControlComponent::ActiveXControlComponent() | ActiveXControlComponent::ActiveXControlComponent() | ||||
: originalWndProc (0), | |||||
mouseEventsAllowed (true) | |||||
: mouseEventsAllowed (true) | |||||
{ | { | ||||
ActiveXHelpers::activeXComps.add (this); | ActiveXHelpers::activeXComps.add (this); | ||||
} | } | ||||
@@ -337,7 +347,7 @@ bool ActiveXControlComponent::createControl (const void* controlIID) | |||||
if (peer != nullptr) | if (peer != nullptr) | ||||
{ | { | ||||
const Point<int> pos (getTopLevelComponent()->getLocalPoint (this, Point<int>())); | |||||
const Rectangle<int> bounds (getTopLevelComponent()->getLocalArea (this, getLocalBounds())); | |||||
HWND hwnd = (HWND) peer->getNativeHandle(); | HWND hwnd = (HWND) peer->getNativeHandle(); | ||||
ScopedPointer<Pimpl> newControl (new Pimpl (hwnd, *this)); | ScopedPointer<Pimpl> newControl (new Pimpl (hwnd, *this)); | ||||
@@ -352,21 +362,21 @@ bool ActiveXControlComponent::createControl (const void* controlIID) | |||||
if (OleSetContainedObject (newControl->control, TRUE) == S_OK) | if (OleSetContainedObject (newControl->control, TRUE) == S_OK) | ||||
{ | { | ||||
RECT rect; | RECT rect; | ||||
rect.left = pos.getX(); | |||||
rect.top = pos.getY(); | |||||
rect.right = pos.getX() + getWidth(); | |||||
rect.bottom = pos.getY() + getHeight(); | |||||
rect.left = bounds.getX(); | |||||
rect.top = bounds.getY(); | |||||
rect.right = bounds.getRight(); | |||||
rect.bottom = bounds.getBottom(); | |||||
if (newControl->control->DoVerb (OLEIVERB_SHOW, 0, newControl->clientSite, 0, hwnd, &rect) == S_OK) | if (newControl->control->DoVerb (OLEIVERB_SHOW, 0, newControl->clientSite, 0, hwnd, &rect) == S_OK) | ||||
{ | { | ||||
control = newControl; | control = newControl; | ||||
setControlBounds (Rectangle<int> (pos.getX(), pos.getY(), getWidth(), getHeight())); | |||||
control->controlHWND = ActiveXHelpers::getHWND (this); | control->controlHWND = ActiveXHelpers::getHWND (this); | ||||
if (control->controlHWND != 0) | if (control->controlHWND != 0) | ||||
{ | { | ||||
originalWndProc = (void*) (pointer_sized_int) GetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC); | |||||
control->setControlBounds (bounds); | |||||
control->originalWndProc = (void*) (pointer_sized_int) GetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC); | |||||
SetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC, (LONG_PTR) Pimpl::activeXHookWndProc); | SetWindowLongPtr ((HWND) control->controlHWND, GWLP_WNDPROC, (LONG_PTR) Pimpl::activeXHookWndProc); | ||||
} | } | ||||
@@ -382,7 +392,6 @@ bool ActiveXControlComponent::createControl (const void* controlIID) | |||||
void ActiveXControlComponent::deleteControl() | void ActiveXControlComponent::deleteControl() | ||||
{ | { | ||||
control = nullptr; | control = nullptr; | ||||
originalWndProc = 0; | |||||
} | } | ||||
void* ActiveXControlComponent::queryInterface (const void* iid) const | void* ActiveXControlComponent::queryInterface (const void* iid) const | ||||
@@ -396,18 +405,6 @@ void* ActiveXControlComponent::queryInterface (const void* iid) const | |||||
return nullptr; | return nullptr; | ||||
} | } | ||||
void ActiveXControlComponent::setControlBounds (const Rectangle<int>& newBounds) const | |||||
{ | |||||
if (control->controlHWND != 0) | |||||
MoveWindow (control->controlHWND, newBounds.getX(), newBounds.getY(), newBounds.getWidth(), newBounds.getHeight(), TRUE); | |||||
} | |||||
void ActiveXControlComponent::setControlVisible (const bool shouldBeVisible) const | |||||
{ | |||||
if (control->controlHWND != 0) | |||||
ShowWindow (control->controlHWND, shouldBeVisible ? SW_SHOWNA : SW_HIDE); | |||||
} | |||||
void ActiveXControlComponent::setMouseEventsAllowed (const bool eventsCanReachControl) | void ActiveXControlComponent::setMouseEventsAllowed (const bool eventsCanReachControl) | ||||
{ | { | ||||
mouseEventsAllowed = eventsCanReachControl; | mouseEventsAllowed = eventsCanReachControl; | ||||