/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ namespace juce { class UIViewComponent::Pimpl : public ComponentMovementWatcher { public: Pimpl (UIView* v, Component& comp) : ComponentMovementWatcher (&comp), view (v), owner (comp) { [view retain]; if (owner.isShowing()) componentPeerChanged(); } ~Pimpl() { [view removeFromSuperview]; [view release]; } void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override { auto* topComp = owner.getTopLevelComponent(); if (topComp->getPeer() != nullptr) { auto pos = topComp->getLocalPoint (&owner, Point()); [view setFrame: CGRectMake ((float) pos.x, (float) pos.y, (float) owner.getWidth(), (float) owner.getHeight())]; } } void componentPeerChanged() override { auto* peer = owner.getPeer(); 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.. currentPeer = peer; if (peer != nullptr) { UIView* peerView = (UIView*) peer->getNativeHandle(); [peerView addSubview: view]; componentMovedOrResized (false, false); } } [view setHidden: ! owner.isShowing()]; } void componentVisibilityChanged() override { componentPeerChanged(); } Rectangle getViewBounds() const { CGRect r = [view frame]; return Rectangle ((int) r.size.width, (int) r.size.height); } UIView* const view; private: Component& owner; ComponentPeer* currentPeer = nullptr; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) }; //============================================================================== UIViewComponent::UIViewComponent() {} UIViewComponent::~UIViewComponent() {} void UIViewComponent::setView (void* view) { if (view != getView()) { pimpl.reset(); if (view != nullptr) pimpl.reset (new Pimpl ((UIView*) view, *this)); } } void* UIViewComponent::getView() const { return pimpl == nullptr ? nullptr : pimpl->view; } void UIViewComponent::resizeToFitView() { if (pimpl != nullptr) setBounds (pimpl->getViewBounds()); } void UIViewComponent::paint (Graphics&) {} } // namespace juce