diff --git a/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm b/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm index 41c7f8f6b0..dc28c01eb4 100644 --- a/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm +++ b/build/macosx/platform_specific_code/juce_mac_NSViewComponentPeer.mm @@ -1454,9 +1454,10 @@ void NSViewComponentPeer::drawRect (NSRect r) bool NSViewComponentPeer::canBecomeKeyWindow() { // If running as a plugin, let the component decide whether it's going to allow the window to get focused. - return JUCEApplication::getInstance() != 0 - || (isValidPeer (this) - && ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false)); + return ((getStyleFlags() & juce::ComponentPeer::windowIsTemporary) == 0) + && (JUCEApplication::getInstance() != 0 + || (isValidPeer (this) + && ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false))); } bool NSViewComponentPeer::windowShouldClose() diff --git a/juce_amalgamated.cpp b/juce_amalgamated.cpp index 3b7864abc4..0b3feef96a 100644 --- a/juce_amalgamated.cpp +++ b/juce_amalgamated.cpp @@ -74870,7 +74870,9 @@ void TooltipWindow::showFor (Component* const c, const String& tip) const String TooltipWindow::getTipFor (Component* const c) { - if (c->isValidComponent() && Process::isForegroundProcess()) + if (c->isValidComponent() + && Process::isForegroundProcess() + && ! Component::isMouseButtonDownAnywhere()) { TooltipClient* const ttc = dynamic_cast (c); @@ -269734,9 +269736,10 @@ void NSViewComponentPeer::drawRect (NSRect r) bool NSViewComponentPeer::canBecomeKeyWindow() { // If running as a plugin, let the component decide whether it's going to allow the window to get focused. - return JUCEApplication::getInstance() != 0 - || (isValidPeer (this) - && ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false)); + return ((getStyleFlags() & juce::ComponentPeer::windowIsTemporary) == 0) + && (JUCEApplication::getInstance() != 0 + || (isValidPeer (this) + && ! getComponent()->getComponentPropertyBool ("juce_disallowFocus", false, false))); } bool NSViewComponentPeer::windowShouldClose() diff --git a/src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp b/src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp index 08619464e8..71b18f62c8 100644 --- a/src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp +++ b/src/juce_appframework/gui/components/windows/juce_TooltipWindow.cpp @@ -1,193 +1,195 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-7 by Raw Material Software ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the - GNU General Public License, as published by the Free Software Foundation; - either version 2 of the License, or (at your option) any later version. - - 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. - - You should have received a copy of the GNU General Public License - along with JUCE; if not, visit www.gnu.org/licenses or write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - ------------------------------------------------------------------------------ - - If you'd like to release a closed-source product which uses JUCE, commercial - licenses are also available: visit www.rawmaterialsoftware.com/juce for - more information. - - ============================================================================== -*/ - -#include "../../../../juce_core/basics/juce_StandardHeader.h" - -BEGIN_JUCE_NAMESPACE - - -#include "juce_TooltipWindow.h" -#include "../../../../juce_core/basics/juce_Time.h" -#include "../../../../juce_core/threads/juce_Process.h" -#include "../lookandfeel/juce_LookAndFeel.h" -#include "../juce_Desktop.h" - - -//============================================================================== -TooltipWindow::TooltipWindow (Component* const parentComponent, - const int millisecondsBeforeTipAppears_) - : Component ("tooltip"), - millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_), - mouseX (0), - mouseY (0), - lastHideTime (0), - lastComponentUnderMouse (0), - changedCompsSinceShown (true) -{ - startTimer (123); - - setAlwaysOnTop (true); - setOpaque (true); - - if (parentComponent != 0) - parentComponent->addChildComponent (this); -} - -TooltipWindow::~TooltipWindow() -{ - hide(); -} - -void TooltipWindow::setMillisecondsBeforeTipAppears (const int newTimeMs) throw() -{ - millisecondsBeforeTipAppears = newTimeMs; -} - -void TooltipWindow::paint (Graphics& g) -{ - getLookAndFeel().drawTooltip (g, tipShowing, getWidth(), getHeight()); -} - -void TooltipWindow::mouseEnter (const MouseEvent&) -{ - hide(); -} - -void TooltipWindow::showFor (Component* const c, const String& tip) -{ - jassert (tip.isNotEmpty()); - tipShowing = tip; - - int mx, my; - Desktop::getMousePosition (mx, my); - - if (getParentComponent() != 0) - getParentComponent()->globalPositionToRelative (mx, my); - - int x, y, w, h; - getLookAndFeel().getTooltipSize (tip, w, h); - - if (mx > getParentWidth() / 2) - x = mx - (w + 12); - else - x = mx + 24; - - if (my > getParentHeight() / 2) - y = my - (h + 6); - else - y = my + 6; - - setBounds (x, y, w, h); - setVisible (true); - - if (getParentComponent() == 0) - { - addToDesktop (ComponentPeer::windowHasDropShadow - | ComponentPeer::windowIsTemporary); - } - - toFront (false); -} - -const String TooltipWindow::getTipFor (Component* const c) -{ - if (c->isValidComponent() && Process::isForegroundProcess()) - { - TooltipClient* const ttc = dynamic_cast (c); - - if (ttc != 0 && ! c->isCurrentlyBlockedByAnotherModalComponent()) - return ttc->getTooltip(); - } - - return String::empty; -} - -void TooltipWindow::hide() -{ - tipShowing = String::empty; - removeFromDesktop(); - setVisible (false); -} - -void TooltipWindow::timerCallback() -{ - const unsigned int now = Time::getApproximateMillisecondCounter(); - Component* const newComp = Component::getComponentUnderMouse(); - const String newTip (getTipFor (newComp)); - - const bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse); - lastComponentUnderMouse = newComp; - lastTipUnderMouse = newTip; - - const int clickCount = Desktop::getInstance().getMouseButtonClickCounter(); - const bool mouseWasClicked = clickCount > mouseClicks; - mouseClicks = clickCount; - - int mx, my; - Desktop::getMousePosition (mx, my); - const bool mouseMovedQuickly = (abs (mx - mouseX) + abs (my - mouseY) > 12); - mouseX = mx; - mouseY = my; - - if (tipChanged || mouseWasClicked || mouseMovedQuickly) - lastCompChangeTime = now; - - if (isVisible() || now < lastHideTime + 500) - { - // if a tip is currently visible (or has just disappeared), update to a new one - // immediately if needed.. - if (newComp == 0 || mouseWasClicked || newTip.isEmpty()) - { - if (isVisible()) - { - lastHideTime = now; - hide(); - } - } - else if (tipChanged) - { - showFor (newComp, newTip); - } - } - else - { - // if there isn't currently a tip, but one is needed, only let it - // appear after a timeout.. - if (newTip.isNotEmpty() - && newTip != tipShowing - && now > lastCompChangeTime + millisecondsBeforeTipAppears) - { - showFor (newComp, newTip); - } - } -} - -END_JUCE_NAMESPACE +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-7 by Raw Material Software ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the + GNU General Public License, as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with JUCE; if not, visit www.gnu.org/licenses or write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + ------------------------------------------------------------------------------ + + If you'd like to release a closed-source product which uses JUCE, commercial + licenses are also available: visit www.rawmaterialsoftware.com/juce for + more information. + + ============================================================================== +*/ + +#include "../../../../juce_core/basics/juce_StandardHeader.h" + +BEGIN_JUCE_NAMESPACE + + +#include "juce_TooltipWindow.h" +#include "../../../../juce_core/basics/juce_Time.h" +#include "../../../../juce_core/threads/juce_Process.h" +#include "../lookandfeel/juce_LookAndFeel.h" +#include "../juce_Desktop.h" + + +//============================================================================== +TooltipWindow::TooltipWindow (Component* const parentComponent, + const int millisecondsBeforeTipAppears_) + : Component ("tooltip"), + millisecondsBeforeTipAppears (millisecondsBeforeTipAppears_), + mouseX (0), + mouseY (0), + lastHideTime (0), + lastComponentUnderMouse (0), + changedCompsSinceShown (true) +{ + startTimer (123); + + setAlwaysOnTop (true); + setOpaque (true); + + if (parentComponent != 0) + parentComponent->addChildComponent (this); +} + +TooltipWindow::~TooltipWindow() +{ + hide(); +} + +void TooltipWindow::setMillisecondsBeforeTipAppears (const int newTimeMs) throw() +{ + millisecondsBeforeTipAppears = newTimeMs; +} + +void TooltipWindow::paint (Graphics& g) +{ + getLookAndFeel().drawTooltip (g, tipShowing, getWidth(), getHeight()); +} + +void TooltipWindow::mouseEnter (const MouseEvent&) +{ + hide(); +} + +void TooltipWindow::showFor (Component* const c, const String& tip) +{ + jassert (tip.isNotEmpty()); + tipShowing = tip; + + int mx, my; + Desktop::getMousePosition (mx, my); + + if (getParentComponent() != 0) + getParentComponent()->globalPositionToRelative (mx, my); + + int x, y, w, h; + getLookAndFeel().getTooltipSize (tip, w, h); + + if (mx > getParentWidth() / 2) + x = mx - (w + 12); + else + x = mx + 24; + + if (my > getParentHeight() / 2) + y = my - (h + 6); + else + y = my + 6; + + setBounds (x, y, w, h); + setVisible (true); + + if (getParentComponent() == 0) + { + addToDesktop (ComponentPeer::windowHasDropShadow + | ComponentPeer::windowIsTemporary); + } + + toFront (false); +} + +const String TooltipWindow::getTipFor (Component* const c) +{ + if (c->isValidComponent() + && Process::isForegroundProcess() + && ! Component::isMouseButtonDownAnywhere()) + { + TooltipClient* const ttc = dynamic_cast (c); + + if (ttc != 0 && ! c->isCurrentlyBlockedByAnotherModalComponent()) + return ttc->getTooltip(); + } + + return String::empty; +} + +void TooltipWindow::hide() +{ + tipShowing = String::empty; + removeFromDesktop(); + setVisible (false); +} + +void TooltipWindow::timerCallback() +{ + const unsigned int now = Time::getApproximateMillisecondCounter(); + Component* const newComp = Component::getComponentUnderMouse(); + const String newTip (getTipFor (newComp)); + + const bool tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse); + lastComponentUnderMouse = newComp; + lastTipUnderMouse = newTip; + + const int clickCount = Desktop::getInstance().getMouseButtonClickCounter(); + const bool mouseWasClicked = clickCount > mouseClicks; + mouseClicks = clickCount; + + int mx, my; + Desktop::getMousePosition (mx, my); + const bool mouseMovedQuickly = (abs (mx - mouseX) + abs (my - mouseY) > 12); + mouseX = mx; + mouseY = my; + + if (tipChanged || mouseWasClicked || mouseMovedQuickly) + lastCompChangeTime = now; + + if (isVisible() || now < lastHideTime + 500) + { + // if a tip is currently visible (or has just disappeared), update to a new one + // immediately if needed.. + if (newComp == 0 || mouseWasClicked || newTip.isEmpty()) + { + if (isVisible()) + { + lastHideTime = now; + hide(); + } + } + else if (tipChanged) + { + showFor (newComp, newTip); + } + } + else + { + // if there isn't currently a tip, but one is needed, only let it + // appear after a timeout.. + if (newTip.isNotEmpty() + && newTip != tipShowing + && now > lastCompChangeTime + millisecondsBeforeTipAppears) + { + showFor (newComp, newTip); + } + } +} + +END_JUCE_NAMESPACE