/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ DialogWindow::DialogWindow (const String& name, Colour colour, const bool escapeCloses, const bool onDesktop) : DocumentWindow (name, colour, DocumentWindow::closeButton, onDesktop), escapeKeyTriggersCloseButton (escapeCloses) { } DialogWindow::~DialogWindow() { } bool DialogWindow::keyPressed (const KeyPress& key) { if (escapeKeyTriggersCloseButton && key == KeyPress::escapeKey) { setVisible (false); return true; } return DocumentWindow::keyPressed (key); } void DialogWindow::resized() { DocumentWindow::resized(); if (escapeKeyTriggersCloseButton) { if (Button* const close = getCloseButton()) { const KeyPress esc (KeyPress::escapeKey, 0, 0); if (! close->isRegisteredForShortcut (esc)) close->addShortcut (esc); } } } //============================================================================== class DefaultDialogWindow : public DialogWindow { public: DefaultDialogWindow (LaunchOptions& options) : DialogWindow (options.dialogTitle, options.dialogBackgroundColour, options.escapeKeyTriggersCloseButton, true) { setUsingNativeTitleBar (options.useNativeTitleBar); setAlwaysOnTop (juce_areThereAnyAlwaysOnTopWindows()); if (options.content.willDeleteObject()) setContentOwned (options.content.release(), true); else setContentNonOwned (options.content.release(), true); centreAroundComponent (options.componentToCentreAround, getWidth(), getHeight()); setResizable (options.resizable, options.useBottomRightCornerResizer); } void closeButtonPressed() override { setVisible (false); } private: JUCE_DECLARE_NON_COPYABLE (DefaultDialogWindow) }; DialogWindow::LaunchOptions::LaunchOptions() noexcept : dialogBackgroundColour (Colours::lightgrey), componentToCentreAround (nullptr), escapeKeyTriggersCloseButton (true), useNativeTitleBar (true), resizable (true), useBottomRightCornerResizer (false) { } DialogWindow* DialogWindow::LaunchOptions::create() { jassert (content != nullptr); // You need to provide some kind of content for the dialog! return new DefaultDialogWindow (*this); } DialogWindow* DialogWindow::LaunchOptions::launchAsync() { DialogWindow* const d = create(); d->enterModalState (true, nullptr, true); return d; } #if JUCE_MODAL_LOOPS_PERMITTED || DOXYGEN int DialogWindow::LaunchOptions::runModal() { return launchAsync()->runModalLoop(); } #endif //============================================================================== void DialogWindow::showDialog (const String& dialogTitle, Component* const contentComponent, Component* const componentToCentreAround, Colour backgroundColour, const bool escapeKeyTriggersCloseButton, const bool resizable, const bool useBottomRightCornerResizer) { LaunchOptions o; o.dialogTitle = dialogTitle; o.content.setNonOwned (contentComponent); o.componentToCentreAround = componentToCentreAround; o.dialogBackgroundColour = backgroundColour; o.escapeKeyTriggersCloseButton = escapeKeyTriggersCloseButton; o.useNativeTitleBar = false; o.resizable = resizable; o.useBottomRightCornerResizer = useBottomRightCornerResizer; o.launchAsync(); } #if JUCE_MODAL_LOOPS_PERMITTED int DialogWindow::showModalDialog (const String& dialogTitle, Component* const contentComponent, Component* const componentToCentreAround, Colour backgroundColour, const bool escapeKeyTriggersCloseButton, const bool resizable, const bool useBottomRightCornerResizer) { LaunchOptions o; o.dialogTitle = dialogTitle; o.content.setNonOwned (contentComponent); o.componentToCentreAround = componentToCentreAround; o.dialogBackgroundColour = backgroundColour; o.escapeKeyTriggersCloseButton = escapeKeyTriggersCloseButton; o.useNativeTitleBar = false; o.resizable = resizable; o.useBottomRightCornerResizer = useBottomRightCornerResizer; return o.runModal(); } #endif