|
|
|
/*
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
This file is part of the JUCE library.
|
|
|
|
Copyright (c) 2013 - Raw Material Software 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.
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef JUCE_COMPONENT_H_INCLUDED
|
|
|
|
#define JUCE_COMPONENT_H_INCLUDED
|
|
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/**
|
|
|
|
The base class for all JUCE user-interface objects.
|
|
|
|
*/
|
|
|
|
class JUCE_API Component : public MouseListener
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//==============================================================================
|
|
|
|
/** Creates a component.
|
|
|
|
|
|
|
|
To get it to actually appear, you'll also need to:
|
|
|
|
- Either add it to a parent component or use the addToDesktop() method to
|
|
|
|
make it a desktop window
|
|
|
|
- Set its size and position to something sensible
|
|
|
|
- Use setVisible() to make it visible
|
|
|
|
|
|
|
|
And for it to serve any useful purpose, you'll need to write a
|
|
|
|
subclass of Component or use one of the other types of component from
|
|
|
|
the library.
|
|
|
|
*/
|
|
|
|
Component();
|
|
|
|
|
|
|
|
/** Destructor.
|
|
|
|
|
|
|
|
Note that when a component is deleted, any child components it contains are NOT
|
|
|
|
automatically deleted. It's your responsibilty to manage their lifespan - you
|
|
|
|
may want to use helper methods like deleteAllChildren(), or less haphazard
|
|
|
|
approaches like using ScopedPointers or normal object aggregation to manage them.
|
|
|
|
|
|
|
|
If the component being deleted is currently the child of another one, then during
|
|
|
|
deletion, it will be removed from its parent, and the parent will receive a childrenChanged()
|
|
|
|
callback. Any ComponentListener objects that have registered with it will also have their
|
|
|
|
ComponentListener::componentBeingDeleted() methods called.
|
|
|
|
*/
|
|
|
|
virtual ~Component();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Creates a component, setting its name at the same time.
|
|
|
|
@see getName, setName
|
|
|
|
*/
|
|
|
|
explicit Component (const String& componentName);
|
|
|
|
|
|
|
|
/** Returns the name of this component.
|
|
|
|
@see setName
|
|
|
|
*/
|
|
|
|
const String& getName() const noexcept { return componentName; }
|
|
|
|
|
|
|
|
/** Sets the name of this component.
|
|
|
|
|
|
|
|
When the name changes, all registered ComponentListeners will receive a
|
|
|
|
ComponentListener::componentNameChanged() callback.
|
|
|
|
|
|
|
|
@see getName
|
|
|
|
*/
|
|
|
|
virtual void setName (const String& newName);
|
|
|
|
|
|
|
|
/** Returns the ID string that was set by setComponentID().
|
|
|
|
@see setComponentID, findChildWithID
|
|
|
|
*/
|
|
|
|
const String& getComponentID() const noexcept { return componentID; }
|
|
|
|
|
|
|
|
/** Sets the component's ID string.
|
|
|
|
You can retrieve the ID using getComponentID().
|
|
|
|
@see getComponentID, findChildWithID
|
|
|
|
*/
|
|
|
|
void setComponentID (const String& newID);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Makes the component visible or invisible.
|
|
|
|
|
|
|
|
This method will show or hide the component.
|
|
|
|
Note that components default to being non-visible when first created.
|
|
|
|
Also note that visible components won't be seen unless all their parent components
|
|
|
|
are also visible.
|
|
|
|
|
|
|
|
This method will call visibilityChanged() and also componentVisibilityChanged()
|
|
|
|
for any component listeners that are interested in this component.
|
|
|
|
|
|
|
|
@param shouldBeVisible whether to show or hide the component
|
|
|
|
@see isVisible, isShowing, visibilityChanged, ComponentListener::componentVisibilityChanged
|
|
|
|
*/
|
|
|
|
virtual void setVisible (bool shouldBeVisible);
|
|
|
|
|
|
|
|
/** Tests whether the component is visible or not.
|
|
|
|
|
|
|
|
this doesn't necessarily tell you whether this comp is actually on the screen
|
|
|
|
because this depends on whether all the parent components are also visible - use
|
|
|
|
isShowing() to find this out.
|
|
|
|
|
|
|
|
@see isShowing, setVisible
|
|
|
|
*/
|
|
|
|
bool isVisible() const noexcept { return flags.visibleFlag; }
|
|
|
|
|
|
|
|
/** Called when this component's visibility changes.
|
|
|
|
@see setVisible, isVisible
|
|
|
|
*/
|
|
|
|
virtual void visibilityChanged();
|
|
|
|
|
|
|
|
/** Tests whether this component and all its parents are visible.
|
|
|
|
|
|
|
|
@returns true only if this component and all its parents are visible.
|
|
|
|
@see isVisible
|
|
|
|
*/
|
|
|
|
bool isShowing() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Makes this component appear as a window on the desktop.
|
|
|
|
|
|
|
|
Note that before calling this, you should make sure that the component's opacity is
|
|
|
|
set correctly using setOpaque(). If the component is non-opaque, the windowing
|
|
|
|
system will try to create a special transparent window for it, which will generally take
|
|
|
|
a lot more CPU to operate (and might not even be possible on some platforms).
|
|
|
|
|
|
|
|
If the component is inside a parent component at the time this method is called, it
|
|
|
|
will be first be removed from that parent. Likewise if a component on the desktop
|
|
|
|
is subsequently added to another component, it'll be removed from the desktop.
|
|
|
|
|
|
|
|
@param windowStyleFlags a combination of the flags specified in the
|
|
|
|
ComponentPeer::StyleFlags enum, which define the
|
|
|
|
window's characteristics.
|
|
|
|
@param nativeWindowToAttachTo this allows an OS object to be passed-in as the window
|
|
|
|
in which the juce component should place itself. On Windows,
|
|
|
|
this would be a HWND, a HIViewRef on the Mac. Not necessarily
|
|
|
|
supported on all platforms, and best left as 0 unless you know
|
|
|
|
what you're doing
|
|
|
|
@see removeFromDesktop, isOnDesktop, userTriedToCloseWindow,
|
|
|
|
getPeer, ComponentPeer::setMinimised, ComponentPeer::StyleFlags,
|
|
|
|
ComponentPeer::getStyleFlags, ComponentPeer::setFullScreen
|
|
|
|
*/
|
|
|
|
virtual void addToDesktop (int windowStyleFlags,
|
|
|
|
void* nativeWindowToAttachTo = nullptr);
|
|
|
|
|
|
|
|
/** If the component is currently showing on the desktop, this will hide it.
|
|
|
|
|
|
|
|
You can also use setVisible() to hide a desktop window temporarily, but
|
|
|
|
removeFromDesktop() will free any system resources that are being used up.
|
|
|
|
|
|
|
|
@see addToDesktop, isOnDesktop
|
|
|
|
*/
|
|
|
|
void removeFromDesktop();
|
|
|
|
|
|
|
|
/** Returns true if this component is currently showing on the desktop.
|
|
|
|
@see addToDesktop, removeFromDesktop
|
|
|
|
*/
|
|
|
|
bool isOnDesktop() const noexcept;
|
|
|
|
|
|
|
|
/** Returns the heavyweight window that contains this component.
|
|
|
|
|
|
|
|
If this component is itself on the desktop, this will return the window
|
|
|
|
object that it is using. Otherwise, it will return the window of
|
|
|
|
its top-level parent component.
|
|
|
|
|
|
|
|
This may return nullptr if there isn't a desktop component.
|
|
|
|
|
|
|
|
@see addToDesktop, isOnDesktop
|
|
|
|
*/
|
|
|
|
ComponentPeer* getPeer() const;
|
|
|
|
|
|
|
|
/** For components on the desktop, this is called if the system wants to close the window.
|
|
|
|
|
|
|
|
This is a signal that either the user or the system wants the window to close. The
|
|
|
|
default implementation of this method will trigger an assertion to warn you that your
|
|
|
|
component should do something about it, but you can override this to ignore the event
|
|
|
|
if you want.
|
|
|
|
*/
|
|
|
|
virtual void userTriedToCloseWindow();
|
|
|
|
|
|
|
|
/** Called for a desktop component which has just been minimised or un-minimised.
|
|
|
|
This will only be called for components on the desktop.
|
|
|
|
@see getPeer, ComponentPeer::setMinimised, ComponentPeer::isMinimised
|
|
|
|
*/
|
|
|
|
virtual void minimisationStateChanged (bool isNowMinimised);
|
|
|
|
|
|
|
|
/** Returns the default scale factor to use for this component when it is placed
|
|
|
|
on the desktop.
|
|
|
|
The default implementation of this method just returns the value from
|
|
|
|
Desktop::getGlobalScaleFactor(), but it can be overridden if a particular component
|
|
|
|
has different requirements. The method only used if this component is added
|
|
|
|
to the desktop - it has no effect for child components.
|
|
|
|
*/
|
|
|
|
virtual float getDesktopScaleFactor() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Brings the component to the front of its siblings.
|
|
|
|
|
|
|
|
If some of the component's siblings have had their 'always-on-top' flag set,
|
|
|
|
then they will still be kept in front of this one (unless of course this
|
|
|
|
one is also 'always-on-top').
|
|
|
|
|
|
|
|
@param shouldAlsoGainFocus if true, this will also try to assign keyboard focus
|
|
|
|
to the component (see grabKeyboardFocus() for more details)
|
|
|
|
@see toBack, toBehind, setAlwaysOnTop
|
|
|
|
*/
|
|
|
|
void toFront (bool shouldAlsoGainFocus);
|
|
|
|
|
|
|
|
/** Changes this component's z-order to be at the back of all its siblings.
|
|
|
|
|
|
|
|
If the component is set to be 'always-on-top', it will only be moved to the
|
|
|
|
back of the other other 'always-on-top' components.
|
|
|
|
|
|
|
|
@see toFront, toBehind, setAlwaysOnTop
|
|
|
|
*/
|
|
|
|
void toBack();
|
|
|
|
|
|
|
|
/** Changes this component's z-order so that it's just behind another component.
|
|
|
|
@see toFront, toBack
|
|
|
|
*/
|
|
|
|
void toBehind (Component* other);
|
|
|
|
|
|
|
|
/** Sets whether the component should always be kept at the front of its siblings.
|
|
|
|
@see isAlwaysOnTop
|
|
|
|
*/
|
|
|
|
void setAlwaysOnTop (bool shouldStayOnTop);
|
|
|
|
|
|
|
|
/** Returns true if this component is set to always stay in front of its siblings.
|
|
|
|
@see setAlwaysOnTop
|
|
|
|
*/
|
|
|
|
bool isAlwaysOnTop() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns the x coordinate of the component's left edge.
|
|
|
|
This is a distance in pixels from the left edge of the component's parent.
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to its bounding box.
|
|
|
|
*/
|
|
|
|
int getX() const noexcept { return bounds.getX(); }
|
|
|
|
|
|
|
|
/** Returns the y coordinate of the top of this component.
|
|
|
|
This is a distance in pixels from the top edge of the component's parent.
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to its bounding box.
|
|
|
|
*/
|
|
|
|
int getY() const noexcept { return bounds.getY(); }
|
|
|
|
|
|
|
|
/** Returns the component's width in pixels. */
|
|
|
|
int getWidth() const noexcept { return bounds.getWidth(); }
|
|
|
|
|
|
|
|
/** Returns the component's height in pixels. */
|
|
|
|
int getHeight() const noexcept { return bounds.getHeight(); }
|
|
|
|
|
|
|
|
/** Returns the x coordinate of the component's right-hand edge.
|
|
|
|
This is a distance in pixels from the left edge of the component's parent.
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to its bounding box.
|
|
|
|
*/
|
|
|
|
int getRight() const noexcept { return bounds.getRight(); }
|
|
|
|
|
|
|
|
/** Returns the component's top-left position as a Point. */
|
|
|
|
Point<int> getPosition() const noexcept { return bounds.getPosition(); }
|
|
|
|
|
|
|
|
/** Returns the y coordinate of the bottom edge of this component.
|
|
|
|
This is a distance in pixels from the top edge of the component's parent.
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to its bounding box.
|
|
|
|
*/
|
|
|
|
int getBottom() const noexcept { return bounds.getBottom(); }
|
|
|
|
|
|
|
|
/** Returns this component's bounding box.
|
|
|
|
The rectangle returned is relative to the top-left of the component's parent.
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to its bounding box.
|
|
|
|
*/
|
|
|
|
const Rectangle<int>& getBounds() const noexcept { return bounds; }
|
|
|
|
|
|
|
|
/** Returns the component's bounds, relative to its own origin.
|
|
|
|
This is like getBounds(), but returns the rectangle in local coordinates, In practice, it'll
|
|
|
|
return a rectangle with position (0, 0), and the same size as this component.
|
|
|
|
*/
|
|
|
|
Rectangle<int> getLocalBounds() const noexcept;
|
|
|
|
|
|
|
|
/** Returns the area of this component's parent which this component covers.
|
|
|
|
|
|
|
|
The returned area is relative to the parent's coordinate space.
|
|
|
|
If the component has an affine transform specified, then the resulting area will be
|
|
|
|
the smallest rectangle that fully covers the component's transformed bounding box.
|
|
|
|
If this component has no parent, the return value will simply be the same as getBounds().
|
|
|
|
*/
|
|
|
|
Rectangle<int> getBoundsInParent() const noexcept;
|
|
|
|
|
|
|
|
/** Returns the region of this component that's not obscured by other, opaque components.
|
|
|
|
|
|
|
|
The RectangleList that is returned represents the area of this component
|
|
|
|
which isn't covered by opaque child components.
|
|
|
|
|
|
|
|
If includeSiblings is true, it will also take into account any siblings
|
|
|
|
that may be overlapping the component.
|
|
|
|
*/
|
|
|
|
void getVisibleArea (RectangleList<int>& result, bool includeSiblings) const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns this component's x coordinate relative the screen's top-left origin.
|
|
|
|
@see getX, localPointToGlobal
|
|
|
|
*/
|
|
|
|
int getScreenX() const;
|
|
|
|
|
|
|
|
/** Returns this component's y coordinate relative the screen's top-left origin.
|
|
|
|
@see getY, localPointToGlobal
|
|
|
|
*/
|
|
|
|
int getScreenY() const;
|
|
|
|
|
|
|
|
/** Returns the position of this component's top-left corner relative to the screen's top-left.
|
|
|
|
@see getScreenBounds
|
|
|
|
*/
|
|
|
|
Point<int> getScreenPosition() const;
|
|
|
|
|
|
|
|
/** Returns the bounds of this component, relative to the screen's top-left.
|
|
|
|
@see getScreenPosition
|
|
|
|
*/
|
|
|
|
Rectangle<int> getScreenBounds() const;
|
|
|
|
|
|
|
|
/** Converts a point to be relative to this component's coordinate space.
|
|
|
|
|
|
|
|
This takes a point relative to a different component, and returns its position relative to this
|
|
|
|
component. If the sourceComponent parameter is null, the source point is assumed to be a global
|
|
|
|
screen coordinate.
|
|
|
|
*/
|
|
|
|
Point<int> getLocalPoint (const Component* sourceComponent,
|
|
|
|
Point<int> pointRelativeToSourceComponent) const;
|
|
|
|
|
|
|
|
/** Converts a rectangle to be relative to this component's coordinate space.
|
|
|
|
|
|
|
|
This takes a rectangle that is relative to a different component, and returns its position relative
|
|
|
|
to this component. If the sourceComponent parameter is null, the source rectangle is assumed to be
|
|
|
|
a screen coordinate.
|
|
|
|
|
|
|
|
If you've used setTransform() to apply one or more transforms to components, then the source rectangle
|
|
|
|
may not actually be rectanglular when converted to the target space, so in that situation this will return
|
|
|
|
the smallest rectangle that fully contains the transformed area.
|
|
|
|
*/
|
|
|
|
Rectangle<int> getLocalArea (const Component* sourceComponent,
|
|
|
|
const Rectangle<int>& areaRelativeToSourceComponent) const;
|
|
|
|
|
|
|
|
/** Converts a point relative to this component's top-left into a screen coordinate.
|
|
|
|
@see getLocalPoint, localAreaToGlobal
|
|
|
|
*/
|
|
|
|
Point<int> localPointToGlobal (Point<int> localPoint) const;
|
|
|
|
|
|
|
|
/** Converts a rectangle from this component's coordinate space to a screen coordinate.
|
|
|
|
|
|
|
|
If you've used setTransform() to apply one or more transforms to components, then the source rectangle
|
|
|
|
may not actually be rectanglular when converted to the target space, so in that situation this will return
|
|
|
|
the smallest rectangle that fully contains the transformed area.
|
|
|
|
@see getLocalPoint, localPointToGlobal
|
|
|
|
*/
|
|
|
|
Rectangle<int> localAreaToGlobal (const Rectangle<int>& localArea) const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Moves the component to a new position.
|
|
|
|
|
|
|
|
Changes the component's top-left position (without changing its size).
|
|
|
|
The position is relative to the top-left of the component's parent.
|
|
|
|
|
|
|
|
If the component actually moves, this method will make a synchronous call to moved().
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to whatever bounds you set for it.
|
|
|
|
|
|
|
|
@see setBounds, ComponentListener::componentMovedOrResized
|
|
|
|
*/
|
|
|
|
void setTopLeftPosition (int x, int y);
|
|
|
|
|
|
|
|
/** Moves the component to a new position.
|
|
|
|
|
|
|
|
Changes the component's top-left position (without changing its size).
|
|
|
|
The position is relative to the top-left of the component's parent.
|
|
|
|
|
|
|
|
If the component actually moves, this method will make a synchronous call to moved().
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to whatever bounds you set for it.
|
|
|
|
|
|
|
|
@see setBounds, ComponentListener::componentMovedOrResized
|
|
|
|
*/
|
|
|
|
void setTopLeftPosition (Point<int> newTopLeftPosition);
|
|
|
|
|
|
|
|
/** Moves the component to a new position.
|
|
|
|
|
|
|
|
Changes the position of the component's top-right corner (keeping it the same size).
|
|
|
|
The position is relative to the top-left of the component's parent.
|
|
|
|
|
|
|
|
If the component actually moves, this method will make a synchronous call to moved().
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to whatever bounds you set for it.
|
|
|
|
*/
|
|
|
|
void setTopRightPosition (int x, int y);
|
|
|
|
|
|
|
|
/** Changes the size of the component.
|
|
|
|
|
|
|
|
A synchronous call to resized() will be occur if the size actually changes.
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to whatever bounds you set for it.
|
|
|
|
*/
|
|
|
|
void setSize (int newWidth, int newHeight);
|
|
|
|
|
|
|
|
/** Changes the component's position and size.
|
|
|
|
|
|
|
|
The coordinates are relative to the top-left of the component's parent, or relative
|
|
|
|
to the origin of the screen is the component is on the desktop.
|
|
|
|
|
|
|
|
If this method changes the component's top-left position, it will make a synchronous
|
|
|
|
call to moved(). If it changes the size, it will also make a call to resized().
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to whatever bounds you set for it.
|
|
|
|
|
|
|
|
@see setTopLeftPosition, setSize, ComponentListener::componentMovedOrResized
|
|
|
|
*/
|
|
|
|
void setBounds (int x, int y, int width, int height);
|
|
|
|
|
|
|
|
/** Changes the component's position and size.
|
|
|
|
|
|
|
|
The coordinates are relative to the top-left of the component's parent, or relative
|
|
|
|
to the origin of the screen is the component is on the desktop.
|
|
|
|
|
|
|
|
If this method changes the component's top-left position, it will make a synchronous
|
|
|
|
call to moved(). If it changes the size, it will also make a call to resized().
|
|
|
|
|
|
|
|
Note that if you've used setTransform() to apply a transform, then the component's
|
|
|
|
bounds will no longer be a direct reflection of the position at which it appears within
|
|
|
|
its parent, as the transform will be applied to whatever bounds you set for it.
|
|
|
|
|
|
|
|
@see setBounds
|
|
|
|
*/
|
|
|
|
void setBounds (const Rectangle<int>& newBounds);
|
|
|
|
|
|
|
|
/** Changes the component's position and size.
|
|
|
|
|
|
|
|
This is similar to the other setBounds() methods, but uses RelativeRectangle::applyToComponent()
|
|
|
|
to set the position, This uses a Component::Positioner to make sure that any dynamic
|
|
|
|
expressions are used in the RelativeRectangle will be automatically re-applied to the
|
|
|
|
component's bounds when the source values change. See RelativeRectangle::applyToComponent()
|
|
|
|
for more details.
|
|
|
|
|
|
|
|
When using relative expressions, the following symbols are available:
|
|
|
|
- "left", "right", "top", "bottom" refer to the position of those edges in this component, so
|
|
|
|
e.g. for a component whose width is always 100, you might set the right edge to the "left + 100".
|
|
|
|
- "[id].left", "[id].right", "[id].top", "[id].bottom", "[id].width", "[id].height", where [id] is
|
|
|
|
the identifier of one of this component's siblings. A component's identifier is set with
|
|
|
|
Component::setComponentID(). So for example if you want your component to always be 50 pixels to the
|
|
|
|
right of the one called "xyz", you could set your left edge to be "xyz.right + 50".
|
|
|
|
- Instead of an [id], you can use the name "parent" to refer to this component's parent. Like
|
|
|
|
any other component, these values are relative to their component's parent, so "parent.right" won't be
|
|
|
|
very useful for positioning a component because it refers to a position with the parent's parent.. but
|
|
|
|
"parent.width" can be used for setting positions relative to the parent's size. E.g. to make a 10x10
|
|
|
|
component which remains 1 pixel away from its parent's bottom-right, you could use
|
|
|
|
"right - 10, bottom - 10, parent.width - 1, parent.height - 1".
|
|
|
|
- The name of one of the parent component's markers can also be used as a symbol. For markers to be
|
|
|
|
used, the parent component must implement its Component::getMarkers() method, and return at least one
|
|
|
|
valid MarkerList. So if you want your component's top edge to be 10 pixels below the
|
|
|
|
marker called "foobar", you'd set it to "foobar + 10".
|
|
|
|
|
|
|
|
See the Expression class for details about the operators that are supported, but for example
|
|
|
|
if you wanted to make your component remain centred within its parent with a size of 100, 100,
|
|
|
|
you could express it as:
|
|
|
|
@code myComp.setBounds (RelativeBounds ("parent.width / 2 - 50, parent.height / 2 - 50, left + 100, top + 100"));
|
|
|
|
@endcode
|
|
|
|
..or an alternative way to achieve the same thing:
|
|
|
|
@code myComp.setBounds (RelativeBounds ("right - 100, bottom - 100, parent.width / 2 + 50, parent.height / 2 + 50"));
|
|
|
|
@endcode
|
|
|
|
|
|
|
|
Or if you wanted a 100x100 component whose top edge is lined up to a marker called "topMarker" and
|
|
|
|
which is positioned 50 pixels to the right of another component called "otherComp", you could write:
|
|
|
|
@code myComp.setBounds (RelativeBounds ("otherComp.right + 50, topMarker, left + 100, top + 100"));
|
|
|
|
@endcode
|
|
|
|
|
|
|
|
Be careful not to make your coordinate expressions recursive, though, or exceptions and assertions will
|
|
|
|
be thrown!
|
|
|
|
|
|
|
|
@see setBounds, RelativeRectangle::applyToComponent(), Expression
|
|
|
|
*/
|
|
|
|
void setBounds (const RelativeRectangle& newBounds);
|
|
|
|
|
|
|
|
/** Sets the component's bounds with an expression.
|
|
|
|
The string is parsed as a RelativeRectangle expression - see the notes for
|
|
|
|
Component::setBounds (const RelativeRectangle&) for more information. This method is
|
|
|
|
basically just a shortcut for writing setBounds (RelativeRectangle ("..."))
|
|
|
|
*/
|
|
|
|
void setBounds (const String& newBoundsExpression);
|
|
|
|
|
|
|
|
/** Changes the component's position and size in terms of fractions of its parent's size.
|
|
|
|
|
|
|
|
The values are factors of the parent's size, so for example
|
|
|
|
setBoundsRelative (0.2f, 0.2f, 0.5f, 0.5f) would give it half the
|
|
|
|
width and height of the parent, with its top-left position 20% of
|
|
|
|
the way across and down the parent.
|
|
|
|
|
|
|
|
@see setBounds
|
|
|
|
*/
|
|
|
|
void setBoundsRelative (float proportionalX, float proportionalY,
|
|
|
|
float proportionalWidth, float proportionalHeight);
|
|
|
|
|
|
|
|
/** Changes the component's position and size based on the amount of space to leave around it.
|
|
|
|
|
|
|
|
This will position the component within its parent, leaving the specified number of
|
|
|
|
pixels around each edge.
|
|
|
|
|
|
|
|
@see setBounds
|
|
|
|
*/
|
|
|
|
void setBoundsInset (const BorderSize<int>& borders);
|
|
|
|
|
|
|
|
/** Positions the component within a given rectangle, keeping its proportions
|
|
|
|
unchanged.
|
|
|
|
|
|
|
|
If onlyReduceInSize is false, the component will be resized to fill as much of the
|
|
|
|
rectangle as possible without changing its aspect ratio (the component's
|
|
|
|
current size is used to determine its aspect ratio, so a zero-size component
|
|
|
|
won't work here). If onlyReduceInSize is true, it will only be resized if it's
|
|
|
|
too big to fit inside the rectangle.
|
|
|
|
|
|
|
|
It will then be positioned within the rectangle according to the justification flags
|
|
|
|
specified.
|
|
|
|
|
|
|
|
@see setBounds
|
|
|
|
*/
|
|
|
|
void setBoundsToFit (int x, int y, int width, int height,
|
|
|
|
Justification justification,
|
|
|
|
bool onlyReduceInSize);
|
|
|
|
|
|
|
|
/** Changes the position of the component's centre.
|
|
|
|
|
|
|
|
Leaves the component's size unchanged, but sets the position of its centre
|
|
|
|
relative to its parent's top-left.
|
|
|
|
|
|
|
|
@see setBounds
|
|
|
|
*/
|
|
|
|
void setCentrePosition (int x, int y);
|
|
|
|
|
|
|
|
/** Changes the position of the component's centre.
|
|
|
|
|
|
|
|
Leaves the position unchanged, but positions its centre relative to its
|
|
|
|
parent's size. E.g. setCentreRelative (0.5f, 0.5f) would place it centrally in
|
|
|
|
its parent.
|
|
|
|
*/
|
|
|
|
void setCentreRelative (float x, float y);
|
|
|
|
|
|
|
|
/** Changes the component's size and centres it within its parent.
|
|
|
|
|
|
|
|
After changing the size, the component will be moved so that it's
|
|
|
|
centred within its parent. If the component is on the desktop (or has no
|
|
|
|
parent component), then it'll be centred within the main monitor area.
|
|
|
|
*/
|
|
|
|
void centreWithSize (int width, int height);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Sets a transform matrix to be applied to this component.
|
|
|
|
|
|
|
|
If you set a transform for a component, the component's position will be warped by it, relative to
|
|
|
|
the component's parent's top-left origin. This means that the values you pass into setBounds() will no
|
|
|
|
longer reflect the actual area within the parent that the component covers, as the bounds will be
|
|
|
|
transformed and the component will probably end up actually appearing somewhere else within its parent.
|
|
|
|
|
|
|
|
When using transforms you need to be extremely careful when converting coordinates between the
|
|
|
|
coordinate spaces of different components or the screen - you should always use getLocalPoint(),
|
|
|
|
getLocalArea(), etc to do this, and never just manually add a component's position to a point in order to
|
|
|
|
convert it between different components (but I'm sure you would never have done that anyway...).
|
|
|
|
|
|
|
|
Currently, transforms are not supported for desktop windows, so the transform will be ignored if you
|
|
|
|
put a component on the desktop.
|
|
|
|
|
|
|
|
To remove a component's transform, simply pass AffineTransform::identity as the parameter to this method.
|
|
|
|
*/
|
|
|
|
void setTransform (const AffineTransform& transform);
|
|
|
|
|
|
|
|
/** Returns the transform that is currently being applied to this component.
|
|
|
|
For more details about transforms, see setTransform().
|
|
|
|
@see setTransform
|
|
|
|
*/
|
|
|
|
AffineTransform getTransform() const;
|
|
|
|
|
|
|
|
/** Returns true if a non-identity transform is being applied to this component.
|
|
|
|
For more details about transforms, see setTransform().
|
|
|
|
@see setTransform
|
|
|
|
*/
|
|
|
|
bool isTransformed() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns a proportion of the component's width.
|
|
|
|
This is a handy equivalent of (getWidth() * proportion).
|
|
|
|
*/
|
|
|
|
int proportionOfWidth (float proportion) const noexcept;
|
|
|
|
|
|
|
|
/** Returns a proportion of the component's height.
|
|
|
|
This is a handy equivalent of (getHeight() * proportion).
|
|
|
|
*/
|
|
|
|
int proportionOfHeight (float proportion) const noexcept;
|
|
|
|
|
|
|
|
/** Returns the width of the component's parent.
|
|
|
|
|
|
|
|
If the component has no parent (i.e. if it's on the desktop), this will return
|
|
|
|
the width of the screen.
|
|
|
|
*/
|
|
|
|
int getParentWidth() const noexcept;
|
|
|
|
|
|
|
|
/** Returns the height of the component's parent.
|
|
|
|
|
|
|
|
If the component has no parent (i.e. if it's on the desktop), this will return
|
|
|
|
the height of the screen.
|
|
|
|
*/
|
|
|
|
int getParentHeight() const noexcept;
|
|
|
|
|
|
|
|
/** Returns the screen coordinates of the monitor that contains this component.
|
|
|
|
|
|
|
|
If there's only one monitor, this will return its size - if there are multiple
|
|
|
|
monitors, it will return the area of the monitor that contains the component's
|
|
|
|
centre.
|
|
|
|
*/
|
|
|
|
Rectangle<int> getParentMonitorArea() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns the number of child components that this component contains.
|
|
|
|
|
|
|
|
@see getChildComponent, getIndexOfChildComponent
|
|
|
|
*/
|
|
|
|
int getNumChildComponents() const noexcept;
|
|
|
|
|
|
|
|
/** Returns one of this component's child components, by it index.
|
|
|
|
|
|
|
|
The component with index 0 is at the back of the z-order, the one at the
|
|
|
|
front will have index (getNumChildComponents() - 1).
|
|
|
|
|
|
|
|
If the index is out-of-range, this will return a null pointer.
|
|
|
|
|
|
|
|
@see getNumChildComponents, getIndexOfChildComponent
|
|
|
|
*/
|
|
|
|
Component* getChildComponent (int index) const noexcept;
|
|
|
|
|
|
|
|
/** Returns the index of this component in the list of child components.
|
|
|
|
|
|
|
|
A value of 0 means it is first in the list (i.e. behind all other components). Higher
|
|
|
|
values are further towards the front.
|
|
|
|
|
|
|
|
Returns -1 if the component passed-in is not a child of this component.
|
|
|
|
|
|
|
|
@see getNumChildComponents, getChildComponent, addChildComponent, toFront, toBack, toBehind
|
|
|
|
*/
|
|
|
|
int getIndexOfChildComponent (const Component* child) const noexcept;
|
|
|
|
|
|
|
|
/** Looks for a child component with the specified ID.
|
|
|
|
@see setComponentID, getComponentID
|
|
|
|
*/
|
|
|
|
Component* findChildWithID (StringRef componentID) const noexcept;
|
|
|
|
|
|
|
|
/** Adds a child component to this one.
|
|
|
|
|
|
|
|
Adding a child component does not mean that the component will own or delete the child - it's
|
|
|
|
your responsibility to delete the component. Note that it's safe to delete a component
|
|
|
|
without first removing it from its parent - doing so will automatically remove it and
|
|
|
|
send out the appropriate notifications before the deletion completes.
|
|
|
|
|
|
|
|
If the child is already a child of this component, then no action will be taken, and its
|
|
|
|
z-order will be left unchanged.
|
|
|
|
|
|
|
|
@param child the new component to add. If the component passed-in is already
|
|
|
|
the child of another component, it'll first be removed from it current parent.
|
|
|
|
@param zOrder The index in the child-list at which this component should be inserted.
|
|
|
|
A value of -1 will insert it in front of the others, 0 is the back.
|
|
|
|
@see removeChildComponent, addAndMakeVisible, addChildAndSetID, getChild, ComponentListener::componentChildrenChanged
|
|
|
|
*/
|
|
|
|
void addChildComponent (Component* child, int zOrder = -1);
|
|
|
|
|
|
|
|
/** Adds a child component to this one.
|
|
|
|
|
|
|
|
Adding a child component does not mean that the component will own or delete the child - it's
|
|
|
|
your responsibility to delete the component. Note that it's safe to delete a component
|
|
|
|
without first removing it from its parent - doing so will automatically remove it and
|
|
|
|
send out the appropriate notifications before the deletion completes.
|
|
|
|
|
|
|
|
If the child is already a child of this component, then no action will be taken, and its
|
|
|
|
z-order will be left unchanged.
|
|
|
|
|
|
|
|
@param child the new component to add. If the component passed-in is already
|
|
|
|
the child of another component, it'll first be removed from it current parent.
|
|
|
|
@param zOrder The index in the child-list at which this component should be inserted.
|
|
|
|
A value of -1 will insert it in front of the others, 0 is the back.
|
|
|
|
@see removeChildComponent, addAndMakeVisible, addChildAndSetID, getChild, ComponentListener::componentChildrenChanged
|
|
|
|
*/
|
|
|
|
void addChildComponent (Component& child, int zOrder = -1);
|
|
|
|
|
|
|
|
/** Adds a child component to this one, and also makes the child visible if it isn't already.
|
|
|
|
|
|
|
|
This is the same as calling setVisible (true) on the child and then addChildComponent().
|
|
|
|
See addChildComponent() for more details.
|
|
|
|
*/
|
|
|
|
void addAndMakeVisible (Component* child, int zOrder = -1);
|
|
|
|
|
|
|
|
/** Adds a child component to this one, and also makes the child visible if it isn't already.
|
|
|
|
|
|
|
|
This is the same as calling setVisible (true) on the child and then addChildComponent().
|
|
|
|
See addChildComponent() for more details.
|
|
|
|
*/
|
|
|
|
void addAndMakeVisible (Component& child, int zOrder = -1);
|
|
|
|
|
|
|
|
/** Adds a child component to this one, makes it visible, and sets its component ID.
|
|
|
|
@see addAndMakeVisible, addChildComponent
|
|
|
|
*/
|
|
|
|
void addChildAndSetID (Component* child, const String& componentID);
|
|
|
|
|
|
|
|
/** Removes one of this component's child-components.
|
|
|
|
|
|
|
|
If the child passed-in isn't actually a child of this component (either because
|
|
|
|
it's invalid or is the child of a different parent), then no action is taken.
|
|
|
|
|
|
|
|
Note that removing a child will not delete it! But it's ok to delete a component
|
|
|
|
without first removing it - doing so will automatically remove it and send out the
|
|
|
|
appropriate notifications before the deletion completes.
|
|
|
|
|
|
|
|
@see addChildComponent, ComponentListener::componentChildrenChanged
|
|
|
|
*/
|
|
|
|
void removeChildComponent (Component* childToRemove);
|
|
|
|
|
|
|
|
/** Removes one of this component's child-components by index.
|
|
|
|
|
|
|
|
This will return a pointer to the component that was removed, or null if
|
|
|
|
the index was out-of-range.
|
|
|
|
|
|
|
|
Note that removing a child will not delete it! But it's ok to delete a component
|
|
|
|
without first removing it - doing so will automatically remove it and send out the
|
|
|
|
appropriate notifications before the deletion completes.
|
|
|
|
|
|
|
|
@see addChildComponent, ComponentListener::componentChildrenChanged
|
|
|
|
*/
|
|
|
|
Component* removeChildComponent (int childIndexToRemove);
|
|
|
|
|
|
|
|
/** Removes all this component's children.
|
|
|
|
Note that this won't delete them! To do that, use deleteAllChildren() instead.
|
|
|
|
*/
|
|
|
|
void removeAllChildren();
|
|
|
|
|
|
|
|
/** Removes all this component's children, and deletes them.
|
|
|
|
@see removeAllChildren
|
|
|
|
*/
|
|
|
|
void deleteAllChildren();
|
|
|
|
|
|
|
|
/** Returns the component which this component is inside.
|
|
|
|
|
|
|
|
If this is the highest-level component or hasn't yet been added to
|
|
|
|
a parent, this will return null.
|
|
|
|
*/
|
|
|
|
Component* getParentComponent() const noexcept { return parentComponent; }
|
|
|
|
|
|
|
|
/** Searches the parent components for a component of a specified class.
|
|
|
|
|
|
|
|
For example findParentComponentOfClass \<MyComp\>() would return the first parent
|
|
|
|
component that can be dynamically cast to a MyComp, or will return 0 if none
|
|
|
|
of the parents are suitable.
|
|
|
|
*/
|
|
|
|
template <class TargetClass>
|
|
|
|
TargetClass* findParentComponentOfClass() const
|
|
|
|
{
|
|
|
|
for (Component* p = parentComponent; p != nullptr; p = p->parentComponent)
|
|
|
|
if (TargetClass* const target = dynamic_cast <TargetClass*> (p))
|
|
|
|
return target;
|
|
|
|
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Returns the highest-level component which contains this one or its parents.
|
|
|
|
|
|
|
|
This will search upwards in the parent-hierarchy from this component, until it
|
|
|
|
finds the highest one that doesn't have a parent (i.e. is on the desktop or
|
|
|
|
not yet added to a parent), and will return that.
|
|
|
|
*/
|
|
|
|
Component* getTopLevelComponent() const noexcept;
|
|
|
|
|
|
|
|
/** Checks whether a component is anywhere inside this component or its children.
|
|
|
|
|
|
|
|
This will recursively check through this component's children to see if the
|
|
|
|
given component is anywhere inside.
|
|
|
|
*/
|
|
|
|
bool isParentOf (const Component* possibleChild) const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Called to indicate that the component's parents have changed.
|
|
|
|
|
|
|
|
When a component is added or removed from its parent, this method will
|
|
|
|
be called on all of its children (recursively - so all children of its
|
|
|
|
children will also be called as well).
|
|
|
|
|
|
|
|
Subclasses can override this if they need to react to this in some way.
|
|
|
|
|
|
|
|
@see getParentComponent, isShowing, ComponentListener::componentParentHierarchyChanged
|
|
|
|
*/
|
|
|
|
virtual void parentHierarchyChanged();
|
|
|
|
|
|
|
|
/** Subclasses can use this callback to be told when children are added or removed, or
|
|
|
|
when their z-order changes.
|
|
|
|
@see parentHierarchyChanged, ComponentListener::componentChildrenChanged
|
|
|
|
*/
|
|
|
|
virtual void childrenChanged();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Tests whether a given point inside the component.
|
|
|
|
|
|
|
|
Overriding this method allows you to create components which only intercept
|
|
|
|
mouse-clicks within a user-defined area.
|
|
|
|
|
|
|
|
This is called to find out whether a particular x, y coordinate is
|
|
|
|
considered to be inside the component or not, and is used by methods such
|
|
|
|
as contains() and getComponentAt() to work out which component
|
|
|
|
the mouse is clicked on.
|
|
|
|
|
|
|
|
Components with custom shapes will probably want to override it to perform
|
|
|
|
some more complex hit-testing.
|
|
|
|
|
|
|
|
The default implementation of this method returns either true or false,
|
|
|
|
depending on the value that was set by calling setInterceptsMouseClicks() (true
|
|
|
|
is the default return value).
|
|
|
|
|
|
|
|
Note that the hit-test region is not related to the opacity with which
|
|
|
|
areas of a component are painted.
|
|
|
|
|
|
|
|
Applications should never call hitTest() directly - instead use the
|
|
|
|
contains() method, because this will also test for occlusion by the
|
|
|
|
component's parent.
|
|
|
|
|
|
|
|
Note that for components on the desktop, this method will be ignored, because it's
|
|
|
|
not always possible to implement this behaviour on all platforms.
|
|
|
|
|
|
|
|
@param x the x coordinate to test, relative to the left hand edge of this
|
|
|
|
component. This value is guaranteed to be greater than or equal to
|
|
|
|
zero, and less than the component's width
|
|
|
|
@param y the y coordinate to test, relative to the top edge of this
|
|
|
|
component. This value is guaranteed to be greater than or equal to
|
|
|
|
zero, and less than the component's height
|
|
|
|
@returns true if the click is considered to be inside the component
|
|
|
|
@see setInterceptsMouseClicks, contains
|
|
|
|
*/
|
|
|
|
virtual bool hitTest (int x, int y);
|
|
|
|
|
|
|
|
/** Changes the default return value for the hitTest() method.
|
|
|
|
|
|
|
|
Setting this to false is an easy way to make a component pass its mouse-clicks
|
|
|
|
through to the components behind it.
|
|
|
|
|
|
|
|
When a component is created, the default setting for this is true.
|
|
|
|
|
|
|
|
@param allowClicksOnThisComponent if true, hitTest() will always return true; if false, it will
|
|
|
|
return false (or true for child components if allowClicksOnChildComponents
|
|
|
|
is true)
|
|
|
|
@param allowClicksOnChildComponents if this is true and allowClicksOnThisComponent is false, then child
|
|
|
|
components can be clicked on as normal but clicks on this component pass
|
|
|
|
straight through; if this is false and allowClicksOnThisComponent
|
|
|
|
is false, then neither this component nor any child components can
|
|
|
|
be clicked on
|
|
|
|
@see hitTest, getInterceptsMouseClicks
|
|
|
|
*/
|
|
|
|
void setInterceptsMouseClicks (bool allowClicksOnThisComponent,
|
|
|
|
bool allowClicksOnChildComponents) noexcept;
|
|
|
|
|
|
|
|
/** Retrieves the current state of the mouse-click interception flags.
|
|
|
|
|
|
|
|
On return, the two parameters are set to the state used in the last call to
|
|
|
|
setInterceptsMouseClicks().
|
|
|
|
|
|
|
|
@see setInterceptsMouseClicks
|
|
|
|
*/
|
|
|
|
void getInterceptsMouseClicks (bool& allowsClicksOnThisComponent,
|
|
|
|
bool& allowsClicksOnChildComponents) const noexcept;
|
|
|
|
|
|
|
|
|
|
|
|
/** Returns true if a given point lies within this component or one of its children.
|
|
|
|
|
|
|
|
Never override this method! Use hitTest to create custom hit regions.
|
|
|
|
|
|
|
|
@param localPoint the coordinate to test, relative to this component's top-left.
|
|
|
|
@returns true if the point is within the component's hit-test area, but only if
|
|
|
|
that part of the component isn't clipped by its parent component. Note
|
|
|
|
that this won't take into account any overlapping sibling components
|
|
|
|
which might be in the way - for that, see reallyContains()
|
|
|
|
@see hitTest, reallyContains, getComponentAt
|
|
|
|
*/
|
|
|
|
bool contains (Point<int> localPoint);
|
|
|
|
|
|
|
|
/** Returns true if a given point lies in this component, taking any overlapping
|
|
|
|
siblings into account.
|
|
|
|
|
|
|
|
@param localPoint the coordinate to test, relative to this component's top-left.
|
|
|
|
@param returnTrueIfWithinAChild if the point actually lies within a child of this component,
|
|
|
|
this determines whether that is counted as a hit.
|
|
|
|
@see contains, getComponentAt
|
|
|
|
*/
|
|
|
|
bool reallyContains (Point<int> localPoint, bool returnTrueIfWithinAChild);
|
|
|
|
|
|
|
|
/** Returns the component at a certain point within this one.
|
|
|
|
|
|
|
|
@param x the x coordinate to test, relative to this component's left edge.
|
|
|
|
@param y the y coordinate to test, relative to this component's top edge.
|
|
|
|
@returns the component that is at this position - which may be 0, this component,
|
|
|
|
or one of its children. Note that overlapping siblings that might actually
|
|
|
|
be in the way are not taken into account by this method - to account for these,
|
|
|
|
instead call getComponentAt on the top-level parent of this component.
|
|
|
|
@see hitTest, contains, reallyContains
|
|
|
|
*/
|
|
|
|
Component* getComponentAt (int x, int y);
|
|
|
|
|
|
|
|
/** Returns the component at a certain point within this one.
|
|
|
|
|
|
|
|
@param position the coordinate to test, relative to this component's top-left.
|
|
|
|
@returns the component that is at this position - which may be 0, this component,
|
|
|
|
or one of its children. Note that overlapping siblings that might actually
|
|
|
|
be in the way are not taken into account by this method - to account for these,
|
|
|
|
instead call getComponentAt on the top-level parent of this component.
|
|
|
|
@see hitTest, contains, reallyContains
|
|
|
|
*/
|
|
|
|
Component* getComponentAt (Point<int> position);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Marks the whole component as needing to be redrawn.
|
|
|
|
|
|
|
|
Calling this will not do any repainting immediately, but will mark the component
|
|
|
|
as 'dirty'. At some point in the near future the operating system will send a paint
|
|
|
|
message, which will redraw all the dirty regions of all components.
|
|
|
|
There's no guarantee about how soon after calling repaint() the redraw will actually
|
|
|
|
happen, and other queued events may be delivered before a redraw is done.
|
|
|
|
|
|
|
|
If the setBufferedToImage() method has been used to cause this component to use a
|
|
|
|
buffer, the repaint() call will invalidate the cached buffer. If setCachedComponentImage()
|
|
|
|
has been used to provide a custom image cache, that cache will be invalidated appropriately.
|
|
|
|
|
|
|
|
To redraw just a subsection of the component rather than the whole thing,
|
|
|
|
use the repaint (int, int, int, int) method.
|
|
|
|
|
|
|
|
@see paint
|
|
|
|
*/
|
|
|
|
void repaint();
|
|
|
|
|
|
|
|
/** Marks a subsection of this component as needing to be redrawn.
|
|
|
|
|
|
|
|
Calling this will not do any repainting immediately, but will mark the given region
|
|
|
|
of the component as 'dirty'. At some point in the near future the operating system
|
|
|
|
will send a paint message, which will redraw all the dirty regions of all components.
|
|
|
|
There's no guarantee about how soon after calling repaint() the redraw will actually
|
|
|
|
happen, and other queued events may be delivered before a redraw is done.
|
|
|
|
|
|
|
|
The region that is passed in will be clipped to keep it within the bounds of this
|
|
|
|
component.
|
|
|
|
|
|
|
|
@see repaint()
|
|
|
|
*/
|
|
|
|
void repaint (int x, int y, int width, int height);
|
|
|
|
|
|
|
|
/** Marks a subsection of this component as needing to be redrawn.
|
|
|
|
|
|
|
|
Calling this will not do any repainting immediately, but will mark the given region
|
|
|
|
of the component as 'dirty'. At some point in the near future the operating system
|
|
|
|
will send a paint message, which will redraw all the dirty regions of all components.
|
|
|
|
There's no guarantee about how soon after calling repaint() the redraw will actually
|
|
|
|
happen, and other queued events may be delivered before a redraw is done.
|
|
|
|
|
|
|
|
The region that is passed in will be clipped to keep it within the bounds of this
|
|
|
|
component.
|
|
|
|
|
|
|
|
@see repaint()
|
|
|
|
*/
|
|
|
|
void repaint (const Rectangle<int>& area);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Makes the component use an internal buffer to optimise its redrawing.
|
|
|
|
|
|
|
|
Setting this flag to true will cause the component to allocate an
|
|
|
|
internal buffer into which it paints itself, so that when asked to
|
|
|
|
redraw itself, it can use this buffer rather than actually calling the
|
|
|
|
paint() method.
|
|
|
|
|
|
|
|
The buffer is kept until the repaint() method is called directly on
|
|
|
|
this component (or until it is resized), when the image is invalidated
|
|
|
|
and then redrawn the next time the component is painted.
|
|
|
|
|
|
|
|
Note that only the drawing that happens within the component's paint()
|
|
|
|
method is drawn into the buffer, it's child components are not buffered, and
|
|
|
|
nor is the paintOverChildren() method.
|
|
|
|
|
|
|
|
@see repaint, paint, createComponentSnapshot
|
|
|
|
*/
|
|
|
|
void setBufferedToImage (bool shouldBeBuffered);
|
|
|
|
|
|
|
|
/** Generates a snapshot of part of this component.
|
|
|
|
|
|
|
|
This will return a new Image, the size of the rectangle specified,
|
|
|
|
containing a snapshot of the specified area of the component and all
|
|
|
|
its children.
|
|
|
|
|
|
|
|
The image may or may not have an alpha-channel, depending on whether the
|
|
|
|
image is opaque or not.
|
|
|
|
|
|
|
|
If the clipImageToComponentBounds parameter is true and the area is greater than
|
|
|
|
the size of the component, it'll be clipped. If clipImageToComponentBounds is false
|
|
|
|
then parts of the component beyond its bounds can be drawn.
|
|
|
|
|
|
|
|
@see paintEntireComponent
|
|
|
|
*/
|
|
|
|
Image createComponentSnapshot (const Rectangle<int>& areaToGrab,
|
|
|
|
bool clipImageToComponentBounds = true,
|
|
|
|
float scaleFactor = 1.0f);
|
|
|
|
|
|
|
|
/** Draws this component and all its subcomponents onto the specified graphics
|
|
|
|
context.
|
|
|
|
|
|
|
|
You should very rarely have to use this method, it's simply there in case you need
|
|
|
|
to draw a component with a custom graphics context for some reason, e.g. for
|
|
|
|
creating a snapshot of the component.
|
|
|
|
|
|
|
|
It calls paint(), paintOverChildren() and recursively calls paintEntireComponent()
|
|
|
|
on its children in order to render the entire tree.
|
|
|
|
|
|
|
|
The graphics context may be left in an undefined state after this method returns,
|
|
|
|
so you may need to reset it if you're going to use it again.
|
|
|
|
|
|
|
|
If ignoreAlphaLevel is false, then the component will be drawn with the opacity level
|
|
|
|
specified by getAlpha(); if ignoreAlphaLevel is true, then this will be ignored and
|
|
|
|
an alpha of 1.0 will be used.
|
|
|
|
*/
|
|
|
|
void paintEntireComponent (Graphics& context, bool ignoreAlphaLevel);
|
|
|
|
|
|
|
|
/** This allows you to indicate that this component doesn't require its graphics
|
|
|
|
context to be clipped when it is being painted.
|
|
|
|
|
|
|
|
Most people will never need to use this setting, but in situations where you have a very large
|
|
|
|
number of simple components being rendered, and where they are guaranteed never to do any drawing
|
|
|
|
beyond their own boundaries, setting this to true will reduce the overhead involved in clipping
|
|
|
|
the graphics context that gets passed to the component's paint() callback.
|
|
|
|
If you enable this mode, you'll need to make sure your paint method doesn't call anything like
|
|
|
|
Graphics::fillAll(), and doesn't draw beyond the component's bounds, because that'll produce
|
|
|
|
artifacts. Your component also can't have any child components that may be placed beyond its
|
|
|
|
bounds.
|
|
|
|
*/
|
|
|
|
void setPaintingIsUnclipped (bool shouldPaintWithoutClipping) noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Adds an effect filter to alter the component's appearance.
|
|
|
|
|
|
|
|
When a component has an effect filter set, then this is applied to the
|
|
|
|
results of its paint() method. There are a few preset effects, such as
|
|
|
|
a drop-shadow or glow, but they can be user-defined as well.
|
|
|
|
|
|
|
|
The effect that is passed in will not be deleted by the component - the
|
|
|
|
caller must take care of deleting it.
|
|
|
|
|
|
|
|
To remove an effect from a component, pass a null pointer in as the parameter.
|
|
|
|
|
|
|
|
@see ImageEffectFilter, DropShadowEffect, GlowEffect
|
|
|
|
*/
|
|
|
|
void setComponentEffect (ImageEffectFilter* newEffect);
|
|
|
|
|
|
|
|
/** Returns the current component effect.
|
|
|
|
@see setComponentEffect
|
|
|
|
*/
|
|
|
|
ImageEffectFilter* getComponentEffect() const noexcept { return effect; }
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Finds the appropriate look-and-feel to use for this component.
|
|
|
|
|
|
|
|
If the component hasn't had a look-and-feel explicitly set, this will
|
|
|
|
return the parent's look-and-feel, or just the default one if there's no
|
|
|
|
parent.
|
|
|
|
|
|
|
|
@see setLookAndFeel, lookAndFeelChanged
|
|
|
|
*/
|
|
|
|
LookAndFeel& getLookAndFeel() const noexcept;
|
|
|
|
|
|
|
|
/** Sets the look and feel to use for this component.
|
|
|
|
|
|
|
|
This will also change the look and feel for any child components that haven't
|
|
|
|
had their look set explicitly.
|
|
|
|
|
|
|
|
The object passed in will not be deleted by the component, so it's the caller's
|
|
|
|
responsibility to manage it. It may be used at any time until this component
|
|
|
|
has been deleted.
|
|
|
|
|
|
|
|
Calling this method will also invoke the sendLookAndFeelChange() method.
|
|
|
|
|
|
|
|
@see getLookAndFeel, lookAndFeelChanged
|
|
|
|
*/
|
|
|
|
void setLookAndFeel (LookAndFeel* newLookAndFeel);
|
|
|
|
|
|
|
|
/** Called to let the component react to a change in the look-and-feel setting.
|
|
|
|
|
|
|
|
When the look-and-feel is changed for a component, this will be called in
|
|
|
|
all its child components, recursively.
|
|
|
|
|
|
|
|
It can also be triggered manually by the sendLookAndFeelChange() method, in case
|
|
|
|
an application uses a LookAndFeel class that might have changed internally.
|
|
|
|
|
|
|
|
@see sendLookAndFeelChange, getLookAndFeel
|
|
|
|
*/
|
|
|
|
virtual void lookAndFeelChanged();
|
|
|
|
|
|
|
|
/** Calls the lookAndFeelChanged() method in this component and all its children.
|
|
|
|
|
|
|
|
This will recurse through the children and their children, calling lookAndFeelChanged()
|
|
|
|
on them all.
|
|
|
|
|
|
|
|
@see lookAndFeelChanged
|
|
|
|
*/
|
|
|
|
void sendLookAndFeelChange();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Indicates whether any parts of the component might be transparent.
|
|
|
|
|
|
|
|
Components that always paint all of their contents with solid colour and
|
|
|
|
thus completely cover any components behind them should use this method
|
|
|
|
to tell the repaint system that they are opaque.
|
|
|
|
|
|
|
|
This information is used to optimise drawing, because it means that
|
|
|
|
objects underneath opaque windows don't need to be painted.
|
|
|
|
|
|
|
|
By default, components are considered transparent, unless this is used to
|
|
|
|
make it otherwise.
|
|
|
|
|
|
|
|
@see isOpaque, getVisibleArea
|
|
|
|
*/
|
|
|
|
void setOpaque (bool shouldBeOpaque);
|
|
|
|
|
|
|
|
/** Returns true if no parts of this component are transparent.
|
|
|
|
|
|
|
|
@returns the value that was set by setOpaque, (the default being false)
|
|
|
|
@see setOpaque
|
|
|
|
*/
|
|
|
|
bool isOpaque() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Indicates whether the component should be brought to the front when clicked.
|
|
|
|
|
|
|
|
Setting this flag to true will cause the component to be brought to the front
|
|
|
|
when the mouse is clicked somewhere inside it or its child components.
|
|
|
|
|
|
|
|
Note that a top-level desktop window might still be brought to the front by the
|
|
|
|
operating system when it's clicked, depending on how the OS works.
|
|
|
|
|
|
|
|
By default this is set to false.
|
|
|
|
|
|
|
|
@see setMouseClickGrabsKeyboardFocus
|
|
|
|
*/
|
|
|
|
void setBroughtToFrontOnMouseClick (bool shouldBeBroughtToFront) noexcept;
|
|
|
|
|
|
|
|
/** Indicates whether the component should be brought to the front when clicked-on.
|
|
|
|
@see setBroughtToFrontOnMouseClick
|
|
|
|
*/
|
|
|
|
bool isBroughtToFrontOnMouseClick() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
// Keyboard focus methods
|
|
|
|
|
|
|
|
/** Sets a flag to indicate whether this component needs keyboard focus or not.
|
|
|
|
|
|
|
|
By default components aren't actually interested in gaining the
|
|
|
|
focus, but this method can be used to turn this on.
|
|
|
|
|
|
|
|
See the grabKeyboardFocus() method for details about the way a component
|
|
|
|
is chosen to receive the focus.
|
|
|
|
|
|
|
|
@see grabKeyboardFocus, getWantsKeyboardFocus
|
|
|
|
*/
|
|
|
|
void setWantsKeyboardFocus (bool wantsFocus) noexcept;
|
|
|
|
|
|
|
|
/** Returns true if the component is interested in getting keyboard focus.
|
|
|
|
|
|
|
|
This returns the flag set by setWantsKeyboardFocus(). The default
|
|
|
|
setting is false.
|
|
|
|
|
|
|
|
@see setWantsKeyboardFocus
|
|
|
|
*/
|
|
|
|
bool getWantsKeyboardFocus() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Chooses whether a click on this component automatically grabs the focus.
|
|
|
|
|
|
|
|
By default this is set to true, but you might want a component which can
|
|
|
|
be focused, but where you don't want the user to be able to affect it directly
|
|
|
|
by clicking.
|
|
|
|
*/
|
|
|
|
void setMouseClickGrabsKeyboardFocus (bool shouldGrabFocus);
|
|
|
|
|
|
|
|
/** Returns the last value set with setMouseClickGrabsKeyboardFocus().
|
|
|
|
See setMouseClickGrabsKeyboardFocus() for more info.
|
|
|
|
*/
|
|
|
|
bool getMouseClickGrabsKeyboardFocus() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Tries to give keyboard focus to this component.
|
|
|
|
|
|
|
|
When the user clicks on a component or its grabKeyboardFocus()
|
|
|
|
method is called, the following procedure is used to work out which
|
|
|
|
component should get it:
|
|
|
|
|
|
|
|
- if the component that was clicked on actually wants focus (as indicated
|
|
|
|
by calling getWantsKeyboardFocus), it gets it.
|
|
|
|
- if the component itself doesn't want focus, it will try to pass it
|
|
|
|
on to whichever of its children is the default component, as determined by
|
|
|
|
KeyboardFocusTraverser::getDefaultComponent()
|
|
|
|
- if none of its children want focus at all, it will pass it up to its
|
|
|
|
parent instead, unless it's a top-level component without a parent,
|
|
|
|
in which case it just takes the focus itself.
|
|
|
|
|
|
|
|
@see setWantsKeyboardFocus, getWantsKeyboardFocus, hasKeyboardFocus,
|
|
|
|
getCurrentlyFocusedComponent, focusGained, focusLost,
|
|
|
|
keyPressed, keyStateChanged
|
|
|
|
*/
|
|
|
|
void grabKeyboardFocus();
|
|
|
|
|
|
|
|
/** Returns true if this component currently has the keyboard focus.
|
|
|
|
|
|
|
|
@param trueIfChildIsFocused if this is true, then the method returns true if
|
|
|
|
either this component or any of its children (recursively)
|
|
|
|
have the focus. If false, the method only returns true if
|
|
|
|
this component has the focus.
|
|
|
|
|
|
|
|
@see grabKeyboardFocus, setWantsKeyboardFocus, getCurrentlyFocusedComponent,
|
|
|
|
focusGained, focusLost
|
|
|
|
*/
|
|
|
|
bool hasKeyboardFocus (bool trueIfChildIsFocused) const;
|
|
|
|
|
|
|
|
/** Returns the component that currently has the keyboard focus.
|
|
|
|
@returns the focused component, or null if nothing is focused.
|
|
|
|
*/
|
|
|
|
static Component* JUCE_CALLTYPE getCurrentlyFocusedComponent() noexcept;
|
|
|
|
|
|
|
|
/** If any component has keyboard focus, this will defocus it. */
|
|
|
|
static void JUCE_CALLTYPE unfocusAllComponents();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Tries to move the keyboard focus to one of this component's siblings.
|
|
|
|
|
|
|
|
This will try to move focus to either the next or previous component. (This
|
|
|
|
is the method that is used when shifting focus by pressing the tab key).
|
|
|
|
|
|
|
|
Components for which getWantsKeyboardFocus() returns false are not looked at.
|
|
|
|
|
|
|
|
@param moveToNext if true, the focus will move forwards; if false, it will
|
|
|
|
move backwards
|
|
|
|
@see grabKeyboardFocus, setFocusContainer, setWantsKeyboardFocus
|
|
|
|
*/
|
|
|
|
void moveKeyboardFocusToSibling (bool moveToNext);
|
|
|
|
|
|
|
|
/** Creates a KeyboardFocusTraverser object to use to determine the logic by
|
|
|
|
which focus should be passed from this component.
|
|
|
|
|
|
|
|
The default implementation of this method will return a default
|
|
|
|
KeyboardFocusTraverser if this component is a focus container (as determined
|
|
|
|
by the setFocusContainer() method). If the component isn't a focus
|
|
|
|
container, then it will recursively ask its parents for a KeyboardFocusTraverser.
|
|
|
|
|
|
|
|
If you overrride this to return a custom KeyboardFocusTraverser, then
|
|
|
|
this component and all its sub-components will use the new object to
|
|
|
|
make their focusing decisions.
|
|
|
|
|
|
|
|
The method should return a new object, which the caller is required to
|
|
|
|
delete when no longer needed.
|
|
|
|
*/
|
|
|
|
virtual KeyboardFocusTraverser* createFocusTraverser();
|
|
|
|
|
|
|
|
/** Returns the focus order of this component, if one has been specified.
|
|
|
|
|
|
|
|
By default components don't have a focus order - in that case, this
|
|
|
|
will return 0. Lower numbers indicate that the component will be
|
|
|
|
earlier in the focus traversal order.
|
|
|
|
|
|
|
|
To change the order, call setExplicitFocusOrder().
|
|
|
|
|
|
|
|
The focus order may be used by the KeyboardFocusTraverser class as part of
|
|
|
|
its algorithm for deciding the order in which components should be traversed.
|
|
|
|
See the KeyboardFocusTraverser class for more details on this.
|
|
|
|
|
|
|
|
@see moveKeyboardFocusToSibling, createFocusTraverser, KeyboardFocusTraverser
|
|
|
|
*/
|
|
|
|
int getExplicitFocusOrder() const;
|
|
|
|
|
|
|
|
/** Sets the index used in determining the order in which focusable components
|
|
|
|
should be traversed.
|
|
|
|
|
|
|
|
A value of 0 or less is taken to mean that no explicit order is wanted, and
|
|
|
|
that traversal should use other factors, like the component's position.
|
|
|
|
|
|
|
|
@see getExplicitFocusOrder, moveKeyboardFocusToSibling
|
|
|
|
*/
|
|
|
|
void setExplicitFocusOrder (int newFocusOrderIndex);
|
|
|
|
|
|
|
|
/** Indicates whether this component is a parent for components that can have
|
|
|
|
their focus traversed.
|
|
|
|
|
|
|
|
This flag is used by the default implementation of the createFocusTraverser()
|
|
|
|
method, which uses the flag to find the first parent component (of the currently
|
|
|
|
focused one) which wants to be a focus container.
|
|
|
|
|
|
|
|
So using this method to set the flag to 'true' causes this component to
|
|
|
|
act as the top level within which focus is passed around.
|
|
|
|
|
|
|
|
@see isFocusContainer, createFocusTraverser, moveKeyboardFocusToSibling
|
|
|
|
*/
|
|
|
|
void setFocusContainer (bool shouldBeFocusContainer) noexcept;
|
|
|
|
|
|
|
|
/** Returns true if this component has been marked as a focus container.
|
|
|
|
|
|
|
|
See setFocusContainer() for more details.
|
|
|
|
|
|
|
|
@see setFocusContainer, moveKeyboardFocusToSibling, createFocusTraverser
|
|
|
|
*/
|
|
|
|
bool isFocusContainer() const noexcept;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns true if the component (and all its parents) are enabled.
|
|
|
|
|
|
|
|
Components are enabled by default, and can be disabled with setEnabled(). Exactly
|
|
|
|
what difference this makes to the component depends on the type. E.g. buttons
|
|
|
|
and sliders will choose to draw themselves differently, etc.
|
|
|
|
|
|
|
|
Note that if one of this component's parents is disabled, this will always
|
|
|
|
return false, even if this component itself is enabled.
|
|
|
|
|
|
|
|
@see setEnabled, enablementChanged
|
|
|
|
*/
|
|
|
|
bool isEnabled() const noexcept;
|
|
|
|
|
|
|
|
/** Enables or disables this component.
|
|
|
|
|
|
|
|
Disabling a component will also cause all of its child components to become
|
|
|
|
disabled.
|
|
|
|
|
|
|
|
Similarly, enabling a component which is inside a disabled parent
|
|
|
|
component won't make any difference until the parent is re-enabled.
|
|
|
|
|
|
|
|
@see isEnabled, enablementChanged
|
|
|
|
*/
|
|
|
|
void setEnabled (bool shouldBeEnabled);
|
|
|
|
|
|
|
|
/** Callback to indicate that this component has been enabled or disabled.
|
|
|
|
|
|
|
|
This can be triggered by one of the component's parent components
|
|
|
|
being enabled or disabled, as well as changes to the component itself.
|
|
|
|
|
|
|
|
The default implementation of this method does nothing; your class may
|
|
|
|
wish to repaint itself or something when this happens.
|
|
|
|
|
|
|
|
@see setEnabled, isEnabled
|
|
|
|
*/
|
|
|
|
virtual void enablementChanged();
|
|
|
|
|
|
|
|
/** Changes the transparency of this component.
|
|
|
|
When painted, the entire component and all its children will be rendered
|
|
|
|
with this as the overall opacity level, where 0 is completely invisible, and
|
|
|
|
1.0 is fully opaque (i.e. normal).
|
|
|
|
|
|
|
|
@see getAlpha
|
|
|
|
*/
|
|
|
|
void setAlpha (float newAlpha);
|
|
|
|
|
|
|
|
/** Returns the component's current transparancy level.
|
|
|
|
See setAlpha() for more details.
|
|
|
|
*/
|
|
|
|
float getAlpha() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Changes the mouse cursor shape to use when the mouse is over this component.
|
|
|
|
|
|
|
|
Note that the cursor set by this method can be overridden by the getMouseCursor
|
|
|
|
method.
|
|
|
|
|
|
|
|
@see MouseCursor
|
|
|
|
*/
|
|
|
|
void setMouseCursor (const MouseCursor& cursorType);
|
|
|
|
|
|
|
|
/** Returns the mouse cursor shape to use when the mouse is over this component.
|
|
|
|
|
|
|
|
The default implementation will return the cursor that was set by setCursor()
|
|
|
|
but can be overridden for more specialised purposes, e.g. returning different
|
|
|
|
cursors depending on the mouse position.
|
|
|
|
|
|
|
|
@see MouseCursor
|
|
|
|
*/
|
|
|
|
virtual MouseCursor getMouseCursor();
|
|
|
|
|
|
|
|
/** Forces the current mouse cursor to be updated.
|
|
|
|
|
|
|
|
If you're overriding the getMouseCursor() method to control which cursor is
|
|
|
|
displayed, then this will only be checked each time the user moves the mouse. So
|
|
|
|
if you want to force the system to check that the cursor being displayed is
|
|
|
|
up-to-date (even if the mouse is just sitting there), call this method.
|
|
|
|
|
|
|
|
(If you're changing the cursor using setMouseCursor(), you don't need to bother
|
|
|
|
calling this).
|
|
|
|
*/
|
|
|
|
void updateMouseCursor() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Components can override this method to draw their content.
|
|
|
|
|
|
|
|
The paint() method gets called when a region of a component needs redrawing,
|
|
|
|
either because the component's repaint() method has been called, or because
|
|
|
|
something has happened on the screen that means a section of a window needs
|
|
|
|
to be redrawn.
|
|
|
|
|
|
|
|
Any child components will draw themselves over whatever this method draws. If
|
|
|
|
you need to paint over the top of your child components, you can also implement
|
|
|
|
the paintOverChildren() method to do this.
|
|
|
|
|
|
|
|
If you want to cause a component to redraw itself, this is done asynchronously -
|
|
|
|
calling the repaint() method marks a region of the component as "dirty", and the
|
|
|
|
paint() method will automatically be called sometime later, by the message thread,
|
|
|
|
to paint any bits that need refreshing. In Juce (and almost all modern UI frameworks),
|
|
|
|
you never redraw something synchronously.
|
|
|
|
|
|
|
|
You should never need to call this method directly - to take a snapshot of the
|
|
|
|
component you could use createComponentSnapshot() or paintEntireComponent().
|
|
|
|
|
|
|
|
@param g the graphics context that must be used to do the drawing operations.
|
|
|
|
@see repaint, paintOverChildren, Graphics
|
|
|
|
*/
|
|
|
|
virtual void paint (Graphics& g);
|
|
|
|
|
|
|
|
/** Components can override this method to draw over the top of their children.
|
|
|
|
|
|
|
|
For most drawing operations, it's better to use the normal paint() method,
|
|
|
|
but if you need to overlay something on top of the children, this can be
|
|
|
|
used.
|
|
|
|
|
|
|
|
@see paint, Graphics
|
|
|
|
*/
|
|
|
|
virtual void paintOverChildren (Graphics& g);
|
|
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Called when the mouse moves inside a component.
|
|
|
|
|
|
|
|
If the mouse button isn't pressed and the mouse moves over a component,
|
|
|
|
this will be called to let the component react to this.
|
|
|
|
|
|
|
|
A component will always get a mouseEnter callback before a mouseMove.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseEnter, mouseExit, mouseDrag, contains
|
|
|
|
*/
|
|
|
|
virtual void mouseMove (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when the mouse first enters a component.
|
|
|
|
|
|
|
|
If the mouse button isn't pressed and the mouse moves into a component,
|
|
|
|
this will be called to let the component react to this.
|
|
|
|
|
|
|
|
When the mouse button is pressed and held down while being moved in
|
|
|
|
or out of a component, no mouseEnter or mouseExit callbacks are made - only
|
|
|
|
mouseDrag messages are sent to the component that the mouse was originally
|
|
|
|
clicked on, until the button is released.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseExit, mouseDrag, mouseMove, contains
|
|
|
|
*/
|
|
|
|
virtual void mouseEnter (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when the mouse moves out of a component.
|
|
|
|
|
|
|
|
This will be called when the mouse moves off the edge of this
|
|
|
|
component.
|
|
|
|
|
|
|
|
If the mouse button was pressed, and it was then dragged off the
|
|
|
|
edge of the component and released, then this callback will happen
|
|
|
|
when the button is released, after the mouseUp callback.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseEnter, mouseDrag, mouseMove, contains
|
|
|
|
*/
|
|
|
|
virtual void mouseExit (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when a mouse button is pressed.
|
|
|
|
|
|
|
|
The MouseEvent object passed in contains lots of methods for finding out
|
|
|
|
which button was pressed, as well as which modifier keys (e.g. shift, ctrl)
|
|
|
|
were held down at the time.
|
|
|
|
|
|
|
|
Once a button is held down, the mouseDrag method will be called when the
|
|
|
|
mouse moves, until the button is released.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseUp, mouseDrag, mouseDoubleClick, contains
|
|
|
|
*/
|
|
|
|
virtual void mouseDown (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when the mouse is moved while a button is held down.
|
|
|
|
|
|
|
|
When a mouse button is pressed inside a component, that component
|
|
|
|
receives mouseDrag callbacks each time the mouse moves, even if the
|
|
|
|
mouse strays outside the component's bounds.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseDown, mouseUp, mouseMove, contains, setDragRepeatInterval
|
|
|
|
*/
|
|
|
|
virtual void mouseDrag (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when a mouse button is released.
|
|
|
|
|
|
|
|
A mouseUp callback is sent to the component in which a button was pressed
|
|
|
|
even if the mouse is actually over a different component when the
|
|
|
|
button is released.
|
|
|
|
|
|
|
|
The MouseEvent object passed in contains lots of methods for finding out
|
|
|
|
which buttons were down just before they were released.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseDown, mouseDrag, mouseDoubleClick, contains
|
|
|
|
*/
|
|
|
|
virtual void mouseUp (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when a mouse button has been double-clicked on a component.
|
|
|
|
|
|
|
|
The MouseEvent object passed in contains lots of methods for finding out
|
|
|
|
which button was pressed, as well as which modifier keys (e.g. shift, ctrl)
|
|
|
|
were held down at the time.
|
|
|
|
|
|
|
|
@param event details about the position and status of the mouse event, including
|
|
|
|
the source component in which it occurred
|
|
|
|
@see mouseDown, mouseUp
|
|
|
|
*/
|
|
|
|
virtual void mouseDoubleClick (const MouseEvent& event) override;
|
|
|
|
|
|
|
|
/** Called when the mouse-wheel is moved.
|
|
|
|
|
|
|
|
This callback is sent to the component that the mouse is over when the
|
|
|
|
wheel is moved.
|
|
|
|
|
|
|
|
If not overridden, a component will forward this message to its parent, so
|
|
|
|
that parent components can collect mouse-wheel messages that happen to
|
|
|
|
child components which aren't interested in them. (Bear in mind that if
|
|
|
|
you attach a component as a mouse-listener to other components, then
|
|
|
|
those wheel moves will also end up calling this method and being passed up
|
|
|
|
to the parents, which may not be what you intended to happen).
|
|
|
|
|
|
|
|
@param event details about the mouse event
|
|
|
|
@param wheel details about the mouse wheel movement
|
|
|
|
*/
|
|
|
|
virtual void mouseWheelMove (const MouseEvent& event,
|
|
|
|
const MouseWheelDetails& wheel) override;
|
|
|
|
|
|
|
|
/** Called when a pinch-to-zoom mouse-gesture is used.
|
|
|
|
|
|
|
|
If not overridden, a component will forward this message to its parent, so
|
|
|
|
that parent components can collect gesture messages that are unused by child
|
|
|
|
components.
|
|
|
|
|
|
|
|
@param event details about the mouse event
|
|
|
|
@param scaleFactor a multiplier to indicate by how much the size of the target
|
|
|
|
should be changed. A value of 1.0 would indicate no change,
|
|
|
|
values greater than 1.0 mean it should be enlarged.
|
|
|
|
*/
|
|
|
|
virtual void mouseMagnify (const MouseEvent& event, float scaleFactor);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Ensures that a non-stop stream of mouse-drag events will be sent during the
|
|
|
|
current mouse-drag operation.
|
|
|
|
|
|
|
|
This allows you to make sure that mouseDrag() events are sent continuously, even
|
|
|
|
when the mouse isn't moving. This can be useful for things like auto-scrolling
|
|
|
|
components when the mouse is near an edge.
|
|
|
|
|
|
|
|
Call this method during a mouseDown() or mouseDrag() callback, specifying the
|
|
|
|
minimum interval between consecutive mouse drag callbacks. The callbacks
|
|
|
|
will continue until the mouse is released, and then the interval will be reset,
|
|
|
|
so you need to make sure it's called every time you begin a drag event.
|
|
|
|
Passing an interval of 0 or less will cancel the auto-repeat.
|
|
|
|
|
|
|
|
@see mouseDrag, Desktop::beginDragAutoRepeat
|
|
|
|
*/
|
|
|
|
static void JUCE_CALLTYPE beginDragAutoRepeat (int millisecondsBetweenCallbacks);
|
|
|
|
|
|
|
|
/** Causes automatic repaints when the mouse enters or exits this component.
|
|
|
|
|
|
|
|
If turned on, then when the mouse enters/exits, or when the button is pressed/released
|
|
|
|
on the component, it will trigger a repaint.
|
|
|
|
|
|
|
|
This is handy for things like buttons that need to draw themselves differently when
|
|
|
|
the mouse moves over them, and it avoids having to override all the different mouse
|
|
|
|
callbacks and call repaint().
|
|
|
|
|
|
|
|
@see mouseEnter, mouseExit, mouseDown, mouseUp
|
|
|
|
*/
|
|
|
|
void setRepaintsOnMouseActivity (bool shouldRepaint) noexcept;
|
|
|
|
|
|
|
|
/** Registers a listener to be told when mouse events occur in this component.
|
|
|
|
|
|
|
|
If you need to get informed about mouse events in a component but can't or
|
|
|
|
don't want to override its methods, you can attach any number of listeners
|
|
|
|
to the component, and these will get told about the events in addition to
|
|
|
|
the component's own callbacks being called.
|
|
|
|
|
|
|
|
Note that a MouseListener can also be attached to more than one component.
|
|
|
|
|
|
|
|
@param newListener the listener to register
|
|
|
|
@param wantsEventsForAllNestedChildComponents if true, the listener will receive callbacks
|
|
|
|
for events that happen to any child component
|
|
|
|
within this component, including deeply-nested
|
|
|
|
child components. If false, it will only be
|
|
|
|
told about events that this component handles.
|
|
|
|
@see MouseListener, removeMouseListener
|
|
|
|
*/
|
|
|
|
void addMouseListener (MouseListener* newListener,
|
|
|
|
bool wantsEventsForAllNestedChildComponents);
|
|
|
|
|
|
|
|
/** Deregisters a mouse listener.
|
|
|
|
@see addMouseListener, MouseListener
|
|
|
|
*/
|
|
|
|
void removeMouseListener (MouseListener* listenerToRemove);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Adds a listener that wants to hear about keypresses that this component receives.
|
|
|
|
|
|
|
|
The listeners that are registered with a component are called by its keyPressed() or
|
|
|
|
keyStateChanged() methods (assuming these haven't been overridden to do something else).
|
|
|
|
|
|
|
|
If you add an object as a key listener, be careful to remove it when the object
|
|
|
|
is deleted, or the component will be left with a dangling pointer.
|
|
|
|
|
|
|
|
@see keyPressed, keyStateChanged, removeKeyListener
|
|
|
|
*/
|
|
|
|
void addKeyListener (KeyListener* newListener);
|
|
|
|
|
|
|
|
/** Removes a previously-registered key listener.
|
|
|
|
@see addKeyListener
|
|
|
|
*/
|
|
|
|
void removeKeyListener (KeyListener* listenerToRemove);
|
|
|
|
|
|
|
|
/** Called when a key is pressed.
|
|
|
|
|
|
|
|
When a key is pressed, the component that has the keyboard focus will have this
|
|
|
|
method called. Remember that a component will only be given the focus if its
|
|
|
|
setWantsKeyboardFocus() method has been used to enable this.
|
|
|
|
|
|
|
|
If your implementation returns true, the event will be consumed and not passed
|
|
|
|
on to any other listeners. If it returns false, the key will be passed to any
|
|
|
|
KeyListeners that have been registered with this component. As soon as one of these
|
|
|
|
returns true, the process will stop, but if they all return false, the event will
|
|
|
|
be passed upwards to this component's parent, and so on.
|
|
|
|
|
|
|
|
The default implementation of this method does nothing and returns false.
|
|
|
|
|
|
|
|
@see keyStateChanged, getCurrentlyFocusedComponent, addKeyListener
|
|
|
|
*/
|
|
|
|
virtual bool keyPressed (const KeyPress& key);
|
|
|
|
|
|
|
|
/** Called when a key is pressed or released.
|
|
|
|
|
|
|
|
Whenever a key on the keyboard is pressed or released (including modifier keys
|
|
|
|
like shift and ctrl), this method will be called on the component that currently
|
|
|
|
has the keyboard focus. Remember that a component will only be given the focus if
|
|
|
|
its setWantsKeyboardFocus() method has been used to enable this.
|
|
|
|
|
|
|
|
If your implementation returns true, the event will be consumed and not passed
|
|
|
|
on to any other listeners. If it returns false, then any KeyListeners that have
|
|
|
|
been registered with this component will have their keyStateChanged methods called.
|
|
|
|
As soon as one of these returns true, the process will stop, but if they all return
|
|
|
|
false, the event will be passed upwards to this component's parent, and so on.
|
|
|
|
|
|
|
|
The default implementation of this method does nothing and returns false.
|
|
|
|
|
|
|
|
To find out which keys are up or down at any time, see the KeyPress::isKeyCurrentlyDown()
|
|
|
|
method.
|
|
|
|
|
|
|
|
@param isKeyDown true if a key has been pressed; false if it has been released
|
|
|
|
|
|
|
|
@see keyPressed, KeyPress, getCurrentlyFocusedComponent, addKeyListener
|
|
|
|
*/
|
|
|
|
virtual bool keyStateChanged (bool isKeyDown);
|
|
|
|
|
|
|
|
/** Called when a modifier key is pressed or released.
|
|
|
|
|
|
|
|
Whenever the shift, control, alt or command keys are pressed or released,
|
|
|
|
this method will be called on the component that currently has the keyboard focus.
|
|
|
|
Remember that a component will only be given the focus if its setWantsKeyboardFocus()
|
|
|
|
method has been used to enable this.
|
|
|
|
|
|
|
|
The default implementation of this method actually calls its parent's modifierKeysChanged
|
|
|
|
method, so that focused components which aren't interested in this will give their
|
|
|
|
parents a chance to act on the event instead.
|
|
|
|
|
|
|
|
@see keyStateChanged, ModifierKeys
|
|
|
|
*/
|
|
|
|
virtual void modifierKeysChanged (const ModifierKeys& modifiers);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Enumeration used by the focusChanged() and focusLost() methods. */
|
|
|
|
enum FocusChangeType
|
|
|
|
{
|
|
|
|
focusChangedByMouseClick, /**< Means that the user clicked the mouse to change focus. */
|
|
|
|
focusChangedByTabKey, /**< Means that the user pressed the tab key to move the focus. */
|
|
|
|
focusChangedDirectly /**< Means that the focus was changed by a call to grabKeyboardFocus(). */
|
|
|
|
};
|
|
|
|
|
|
|
|
/** Called to indicate that this component has just acquired the keyboard focus.
|
|
|
|
@see focusLost, setWantsKeyboardFocus, getCurrentlyFocusedComponent, hasKeyboardFocus
|
|
|
|
*/
|
|
|
|
virtual void focusGained (FocusChangeType cause);
|
|
|
|
|
|
|
|
/** Called to indicate that this component has just lost the keyboard focus.
|
|
|
|
@see focusGained, setWantsKeyboardFocus, getCurrentlyFocusedComponent, hasKeyboardFocus
|
|
|
|
*/
|
|
|
|
virtual void focusLost (FocusChangeType cause);
|
|
|
|
|
|
|
|
/** Called to indicate that one of this component's children has been focused or unfocused.
|
|
|
|
|
|
|
|
Essentially this means that the return value of a call to hasKeyboardFocus (true) has
|
|
|
|
changed. It happens when focus moves from one of this component's children (at any depth)
|
|
|
|
to a component that isn't contained in this one, (or vice-versa).
|
|
|
|
|
|
|
|
@see focusGained, setWantsKeyboardFocus, getCurrentlyFocusedComponent, hasKeyboardFocus
|
|
|
|
*/
|
|
|
|
virtual void focusOfChildComponentChanged (FocusChangeType cause);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns true if the mouse is currently over this component.
|
|
|
|
|
|
|
|
If the mouse isn't over the component, this will return false, even if the
|
|
|
|
mouse is currently being dragged - so you can use this in your mouseDrag
|
|
|
|
method to find out whether it's really over the component or not.
|
|
|
|
|
|
|
|
Note that when the mouse button is being held down, then the only component
|
|
|
|
for which this method will return true is the one that was originally
|
|
|
|
clicked on.
|
|
|
|
|
|
|
|
If includeChildren is true, then this will also return true if the mouse is over
|
|
|
|
any of the component's children (recursively) as well as the component itself.
|
|
|
|
|
|
|
|
@see isMouseButtonDown. isMouseOverOrDragging, mouseDrag
|
|
|
|
*/
|
|
|
|
bool isMouseOver (bool includeChildren = false) const;
|
|
|
|
|
|
|
|
/** Returns true if the mouse button is currently held down in this component.
|
|
|
|
|
|
|
|
Note that this is a test to see whether the mouse is being pressed in this
|
|
|
|
component, so it'll return false if called on component A when the mouse
|
|
|
|
is actually being dragged in component B.
|
|
|
|
|
|
|
|
@see isMouseButtonDownAnywhere, isMouseOver, isMouseOverOrDragging
|
|
|
|
*/
|
|
|
|
bool isMouseButtonDown() const;
|
|
|
|
|
|
|
|
/** True if the mouse is over this component, or if it's being dragged in this component.
|
|
|
|
|
|
|
|
This is a handy equivalent to (isMouseOver() || isMouseButtonDown()).
|
|
|
|
|
|
|
|
@see isMouseOver, isMouseButtonDown, isMouseButtonDownAnywhere
|
|
|
|
*/
|
|
|
|
bool isMouseOverOrDragging() const;
|
|
|
|
|
|
|
|
/** Returns true if a mouse button is currently down.
|
|
|
|
|
|
|
|
Unlike isMouseButtonDown, this will test the current state of the
|
|
|
|
buttons without regard to which component (if any) it has been
|
|
|
|
pressed in.
|
|
|
|
|
|
|
|
@see isMouseButtonDown, ModifierKeys
|
|
|
|
*/
|
|
|
|
static bool JUCE_CALLTYPE isMouseButtonDownAnywhere() noexcept;
|
|
|
|
|
|
|
|
/** Returns the mouse's current position, relative to this component.
|
|
|
|
The return value is relative to the component's top-left corner.
|
|
|
|
*/
|
|
|
|
Point<int> getMouseXYRelative() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Called when this component's size has been changed.
|
|
|
|
|
|
|
|
A component can implement this method to do things such as laying out its
|
|
|
|
child components when its width or height changes.
|
|
|
|
|
|
|
|
The method is called synchronously as a result of the setBounds or setSize
|
|
|
|
methods, so repeatedly changing a components size will repeatedly call its
|
|
|
|
resized method (unlike things like repainting, where multiple calls to repaint
|
|
|
|
are coalesced together).
|
|
|
|
|
|
|
|
If the component is a top-level window on the desktop, its size could also
|
|
|
|
be changed by operating-system factors beyond the application's control.
|
|
|
|
|
|
|
|
@see moved, setSize
|
|
|
|
*/
|
|
|
|
virtual void resized();
|
|
|
|
|
|
|
|
/** Called when this component's position has been changed.
|
|
|
|
|
|
|
|
This is called when the position relative to its parent changes, not when
|
|
|
|
its absolute position on the screen changes (so it won't be called for
|
|
|
|
all child components when a parent component is moved).
|
|
|
|
|
|
|
|
The method is called synchronously as a result of the setBounds, setTopLeftPosition
|
|
|
|
or any of the other repositioning methods, and like resized(), it will be
|
|
|
|
called each time those methods are called.
|
|
|
|
|
|
|
|
If the component is a top-level window on the desktop, its position could also
|
|
|
|
be changed by operating-system factors beyond the application's control.
|
|
|
|
|
|
|
|
@see resized, setBounds
|
|
|
|
*/
|
|
|
|
virtual void moved();
|
|
|
|
|
|
|
|
/** Called when one of this component's children is moved or resized.
|
|
|
|
|
|
|
|
If the parent wants to know about changes to its immediate children (not
|
|
|
|
to children of its children), this is the method to override.
|
|
|
|
|
|
|
|
@see moved, resized, parentSizeChanged
|
|
|
|
*/
|
|
|
|
virtual void childBoundsChanged (Component* child);
|
|
|
|
|
|
|
|
/** Called when this component's immediate parent has been resized.
|
|
|
|
|
|
|
|
If the component is a top-level window, this indicates that the screen size
|
|
|
|
has changed.
|
|
|
|
|
|
|
|
@see childBoundsChanged, moved, resized
|
|
|
|
*/
|
|
|
|
virtual void parentSizeChanged();
|
|
|
|
|
|
|
|
/** Called when this component has been moved to the front of its siblings.
|
|
|
|
|
|
|
|
The component may have been brought to the front by the toFront() method, or
|
|
|
|
by the operating system if it's a top-level window.
|
|
|
|
|
|
|
|
@see toFront
|
|
|
|
*/
|
|
|
|
virtual void broughtToFront();
|
|
|
|
|
|
|
|
/** Adds a listener to be told about changes to the component hierarchy or position.
|
|
|
|
|
|
|
|
Component listeners get called when this component's size, position or children
|
|
|
|
change - see the ComponentListener class for more details.
|
|
|
|
|
|
|
|
@param newListener the listener to register - if this is already registered, it
|
|
|
|
will be ignored.
|
|
|
|
@see ComponentListener, removeComponentListener
|
|
|
|
*/
|
|
|
|
void addComponentListener (ComponentListener* newListener);
|
|
|
|
|
|
|
|
/** Removes a component listener.
|
|
|
|
@see addComponentListener
|
|
|
|
*/
|
|
|
|
void removeComponentListener (ComponentListener* listenerToRemove);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Dispatches a numbered message to this component.
|
|
|
|
|
|
|
|
This is a quick and cheap way of allowing simple asynchronous messages to
|
|
|
|
be sent to components. It's also safe, because if the component that you
|
|
|
|
send the message to is a null or dangling pointer, this won't cause an error.
|
|
|
|
|
|
|
|
The command ID is later delivered to the component's handleCommandMessage() method by
|
|
|
|
the application's message queue.
|
|
|
|
|
|
|
|
@see handleCommandMessage
|
|
|
|
*/
|
|
|
|
void postCommandMessage (int commandId);
|
|
|
|
|
|
|
|
/** Called to handle a command that was sent by postCommandMessage().
|
|
|
|
|
|
|
|
This is called by the message thread when a command message arrives, and
|
|
|
|
the component can override this method to process it in any way it needs to.
|
|
|
|
|
|
|
|
@see postCommandMessage
|
|
|
|
*/
|
|
|
|
virtual void handleCommandMessage (int commandId);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Runs a component modally, waiting until the loop terminates.
|
|
|
|
|
|
|
|
This method first makes the component visible, brings it to the front and
|
|
|
|
gives it the keyboard focus.
|
|
|
|
|
|
|
|
It then runs a loop, dispatching messages from the system message queue, but
|
|
|
|
blocking all mouse or keyboard messages from reaching any components other
|
|
|
|
than this one and its children.
|
|
|
|
|
|
|
|
This loop continues until the component's exitModalState() method is called (or
|
|
|
|
the component is deleted), and then this method returns, returning the value
|
|
|
|
passed into exitModalState().
|
|
|
|
|
|
|
|
@see enterModalState, exitModalState, isCurrentlyModal, getCurrentlyModalComponent,
|
|
|
|
isCurrentlyBlockedByAnotherModalComponent, ModalComponentManager
|
|
|
|
*/
|
|
|
|
#if JUCE_MODAL_LOOPS_PERMITTED
|
|
|
|
int runModalLoop();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/** Puts the component into a modal state.
|
|
|
|
|
|
|
|
This makes the component modal, so that messages are blocked from reaching
|
|
|
|
any components other than this one and its children, but unlike runModalLoop(),
|
|
|
|
this method returns immediately.
|
|
|
|
|
|
|
|
If takeKeyboardFocus is true, the component will use grabKeyboardFocus() to
|
|
|
|
get the focus, which is usually what you'll want it to do. If not, it will leave
|
|
|
|
the focus unchanged.
|
|
|
|
|
|
|
|
The callback is an optional object which will receive a callback when the modal
|
|
|
|
component loses its modal status, either by being hidden or when exitModalState()
|
|
|
|
is called. If you pass an object in here, the system will take care of deleting it
|
|
|
|
later, after making the callback
|
|
|
|
|
|
|
|
If deleteWhenDismissed is true, then when it is dismissed, the component will be
|
|
|
|
deleted and then the callback will be called. (This will safely handle the situation
|
|
|
|
where the component is deleted before its exitModalState() method is called).
|
|
|
|
|
|
|
|
@see exitModalState, runModalLoop, ModalComponentManager::attachCallback
|
|
|
|
*/
|
|
|
|
void enterModalState (bool takeKeyboardFocus = true,
|
|
|
|
ModalComponentManager::Callback* callback = nullptr,
|
|
|
|
bool deleteWhenDismissed = false);
|
|
|
|
|
|
|
|
/** Ends a component's modal state.
|
|
|
|
|
|
|
|
If this component is currently modal, this will turn off its modalness, and return
|
|
|
|
a value to the runModalLoop() method that might have be running its modal loop.
|
|
|
|
|
|
|
|
@see runModalLoop, enterModalState, isCurrentlyModal
|
|
|
|
*/
|
|
|
|
void exitModalState (int returnValue);
|
|
|
|
|
|
|
|
/** Returns true if this component is the modal one.
|
|
|
|
|
|
|
|
It's possible to have nested modal components, e.g. a pop-up dialog box
|
|
|
|
that launches another pop-up, but this will only return true for
|
|
|
|
the one at the top of the stack.
|
|
|
|
|
|
|
|
@see getCurrentlyModalComponent
|
|
|
|
*/
|
|
|
|
bool isCurrentlyModal() const noexcept;
|
|
|
|
|
|
|
|
/** Returns the number of components that are currently in a modal state.
|
|
|
|
@see getCurrentlyModalComponent
|
|
|
|
*/
|
|
|
|
static int JUCE_CALLTYPE getNumCurrentlyModalComponents() noexcept;
|
|
|
|
|
|
|
|
/** Returns one of the components that are currently modal.
|
|
|
|
|
|
|
|
The index specifies which of the possible modal components to return. The order
|
|
|
|
of the components in this list is the reverse of the order in which they became
|
|
|
|
modal - so the component at index 0 is always the active component, and the others
|
|
|
|
are progressively earlier ones that are themselves now blocked by later ones.
|
|
|
|
|
|
|
|
@returns the modal component, or null if no components are modal (or if the
|
|
|
|
index is out of range)
|
|
|
|
@see getNumCurrentlyModalComponents, runModalLoop, isCurrentlyModal
|
|
|
|
*/
|
|
|
|
static Component* JUCE_CALLTYPE getCurrentlyModalComponent (int index = 0) noexcept;
|
|
|
|
|
|
|
|
/** Checks whether there's a modal component somewhere that's stopping this one
|
|
|
|
from receiving messages.
|
|
|
|
|
|
|
|
If there is a modal component, its canModalEventBeSentToComponent() method
|
|
|
|
will be called to see if it will still allow this component to receive events.
|
|
|
|
|
|
|
|
@see runModalLoop, getCurrentlyModalComponent
|
|
|
|
*/
|
|
|
|
bool isCurrentlyBlockedByAnotherModalComponent() const;
|
|
|
|
|
|
|
|
/** When a component is modal, this callback allows it to choose which other
|
|
|
|
components can still receive events.
|
|
|
|
|
|
|
|
When a modal component is active and the user clicks on a non-modal component,
|
|
|
|
this method is called on the modal component, and if it returns true, the
|
|
|
|
event is allowed to reach its target. If it returns false, the event is blocked
|
|
|
|
and the inputAttemptWhenModal() callback is made.
|
|
|
|
|
|
|
|
It called by the isCurrentlyBlockedByAnotherModalComponent() method. The default
|
|
|
|
implementation just returns false in all cases.
|
|
|
|
*/
|
|
|
|
virtual bool canModalEventBeSentToComponent (const Component* targetComponent);
|
|
|
|
|
|
|
|
/** Called when the user tries to click on a component that is blocked by another
|
|
|
|
modal component.
|
|
|
|
|
|
|
|
When a component is modal and the user clicks on one of the other components,
|
|
|
|
the modal component will receive this callback.
|
|
|
|
|
|
|
|
The default implementation of this method will play a beep, and bring the currently
|
|
|
|
modal component to the front, but it can be overridden to do other tasks.
|
|
|
|
|
|
|
|
@see isCurrentlyBlockedByAnotherModalComponent, canModalEventBeSentToComponent
|
|
|
|
*/
|
|
|
|
virtual void inputAttemptWhenModal();
|
|
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns the set of properties that belong to this component.
|
|
|
|
Each component has a NamedValueSet object which you can use to attach arbitrary
|
|
|
|
items of data to it.
|
|
|
|
*/
|
|
|
|
NamedValueSet& getProperties() noexcept { return properties; }
|
|
|
|
|
|
|
|
/** Returns the set of properties that belong to this component.
|
|
|
|
Each component has a NamedValueSet object which you can use to attach arbitrary
|
|
|
|
items of data to it.
|
|
|
|
*/
|
|
|
|
const NamedValueSet& getProperties() const noexcept { return properties; }
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Looks for a colour that has been registered with the given colour ID number.
|
|
|
|
|
|
|
|
If a colour has been set for this ID number using setColour(), then it is
|
|
|
|
returned. If none has been set, the method will try calling the component's
|
|
|
|
LookAndFeel class's findColour() method. If none has been registered with the
|
|
|
|
look-and-feel either, it will just return black.
|
|
|
|
|
|
|
|
The colour IDs for various purposes are stored as enums in the components that
|
|
|
|
they are relevent to - for an example, see Slider::ColourIds,
|
|
|
|
Label::ColourIds, TextEditor::ColourIds, TreeView::ColourIds, etc.
|
|
|
|
|
|
|
|
@see setColour, isColourSpecified, colourChanged, LookAndFeel::findColour, LookAndFeel::setColour
|
|
|
|
*/
|
|
|
|
Colour findColour (int colourId, bool inheritFromParent = false) const;
|
|
|
|
|
|
|
|
/** Registers a colour to be used for a particular purpose.
|
|
|
|
|
|
|
|
Changing a colour will cause a synchronous callback to the colourChanged()
|
|
|
|
method, which your component can override if it needs to do something when
|
|
|
|
colours are altered.
|
|
|
|
|
|
|
|
For more details about colour IDs, see the comments for findColour().
|
|
|
|
|
|
|
|
@see findColour, isColourSpecified, colourChanged, LookAndFeel::findColour, LookAndFeel::setColour
|
|
|
|
*/
|
|
|
|
void setColour (int colourId, Colour newColour);
|
|
|
|
|
|
|
|
/** If a colour has been set with setColour(), this will remove it.
|
|
|
|
This allows you to make a colour revert to its default state.
|
|
|
|
*/
|
|
|
|
void removeColour (int colourId);
|
|
|
|
|
|
|
|
/** Returns true if the specified colour ID has been explicitly set for this
|
|
|
|
component using the setColour() method.
|
|
|
|
*/
|
|
|
|
bool isColourSpecified (int colourId) const;
|
|
|
|
|
|
|
|
/** This looks for any colours that have been specified for this component,
|
|
|
|
and copies them to the specified target component.
|
|
|
|
*/
|
|
|
|
void copyAllExplicitColoursTo (Component& target) const;
|
|
|
|
|
|
|
|
/** This method is called when a colour is changed by the setColour() method.
|
|
|
|
@see setColour, findColour
|
|
|
|
*/
|
|
|
|
virtual void colourChanged();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Components can implement this method to provide a MarkerList.
|
|
|
|
The default implementation of this method returns nullptr, but you can override
|
|
|
|
it to return a pointer to the component's marker list. If xAxis is true, it should
|
|
|
|
return the X marker list; if false, it should return the Y markers.
|
|
|
|
*/
|
|
|
|
virtual MarkerList* getMarkers (bool xAxis);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns the underlying native window handle for this component.
|
|
|
|
|
|
|
|
This is platform-dependent and strictly for power-users only!
|
|
|
|
*/
|
|
|
|
void* getWindowHandle() const;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Holds a pointer to some type of Component, which automatically becomes null if
|
|
|
|
the component is deleted.
|
|
|
|
|
|
|
|
If you're using a component which may be deleted by another event that's outside
|
|
|
|
of your control, use a SafePointer instead of a normal pointer to refer to it,
|
|
|
|
and you can test whether it's null before using it to see if something has deleted
|
|
|
|
it.
|
|
|
|
|
|
|
|
The ComponentType typedef must be Component, or some subclass of Component.
|
|
|
|
|
|
|
|
You may also want to use a WeakReference<Component> object for the same purpose.
|
|
|
|
*/
|
|
|
|
template <class ComponentType>
|
|
|
|
class SafePointer
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** Creates a null SafePointer. */
|
|
|
|
SafePointer() noexcept {}
|
|
|
|
|
|
|
|
/** Creates a SafePointer that points at the given component. */
|
|
|
|
SafePointer (ComponentType* const component) : weakRef (component) {}
|
|
|
|
|
|
|
|
/** Creates a copy of another SafePointer. */
|
|
|
|
SafePointer (const SafePointer& other) noexcept : weakRef (other.weakRef) {}
|
|
|
|
|
|
|
|
/** Copies another pointer to this one. */
|
|
|
|
SafePointer& operator= (const SafePointer& other) { weakRef = other.weakRef; return *this; }
|
|
|
|
|
|
|
|
/** Copies another pointer to this one. */
|
|
|
|
SafePointer& operator= (ComponentType* const newComponent) { weakRef = newComponent; return *this; }
|
|
|
|
|
|
|
|
/** Returns the component that this pointer refers to, or null if the component no longer exists. */
|
|
|
|
ComponentType* getComponent() const noexcept { return dynamic_cast <ComponentType*> (weakRef.get()); }
|
|
|
|
|
|
|
|
/** Returns the component that this pointer refers to, or null if the component no longer exists. */
|
|
|
|
operator ComponentType*() const noexcept { return getComponent(); }
|
|
|
|
|
|
|
|
/** Returns the component that this pointer refers to, or null if the component no longer exists. */
|
|
|
|
ComponentType* operator->() noexcept { return getComponent(); }
|
|
|
|
|
|
|
|
/** Returns the component that this pointer refers to, or null if the component no longer exists. */
|
|
|
|
const ComponentType* operator->() const noexcept { return getComponent(); }
|
|
|
|
|
|
|
|
/** If the component is valid, this deletes it and sets this pointer to null. */
|
|
|
|
void deleteAndZero() { delete getComponent(); }
|
|
|
|
|
|
|
|
bool operator== (ComponentType* component) const noexcept { return weakRef == component; }
|
|
|
|
bool operator!= (ComponentType* component) const noexcept { return weakRef != component; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
WeakReference<Component> weakRef;
|
|
|
|
};
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** A class to keep an eye on a component and check for it being deleted.
|
|
|
|
|
|
|
|
This is designed for use with the ListenerList::callChecked() methods, to allow
|
|
|
|
the list iterator to stop cleanly if the component is deleted by a listener callback
|
|
|
|
while the list is still being iterated.
|
|
|
|
*/
|
|
|
|
class JUCE_API BailOutChecker
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** Creates a checker that watches one component. */
|
|
|
|
BailOutChecker (Component* component);
|
|
|
|
|
|
|
|
/** Returns true if either of the two components have been deleted since this object was created. */
|
|
|
|
bool shouldBailOut() const noexcept;
|
|
|
|
|
|
|
|
private:
|
|
|
|
const WeakReference<Component> safePointer;
|
|
|
|
|
|
|
|
JUCE_DECLARE_NON_COPYABLE (BailOutChecker)
|
|
|
|
};
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/**
|
|
|
|
Base class for objects that can be used to automatically position a component according to
|
|
|
|
some kind of algorithm.
|
|
|
|
|
|
|
|
The component class simply holds onto a reference to a Positioner, but doesn't actually do
|
|
|
|
anything with it - all the functionality must be implemented by the positioner itself (e.g.
|
|
|
|
it might choose to watch some kind of value and move the component when the value changes).
|
|
|
|
*/
|
|
|
|
class JUCE_API Positioner
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/** Creates a Positioner which can control the specified component. */
|
|
|
|
explicit Positioner (Component& component) noexcept;
|
|
|
|
/** Destructor. */
|
|
|
|
virtual ~Positioner() {}
|
|
|
|
|
|
|
|
/** Returns the component that this positioner controls. */
|
|
|
|
Component& getComponent() const noexcept { return component; }
|
|
|
|
|
|
|
|
/** Attempts to set the component's position to the given rectangle.
|
|
|
|
Unlike simply calling Component::setBounds(), this may involve the positioner
|
|
|
|
being smart enough to adjust itself to fit the new bounds, e.g. a RelativeRectangle's
|
|
|
|
positioner may try to reverse the expressions used to make them fit these new coordinates.
|
|
|
|
*/
|
|
|
|
virtual void applyNewBounds (const Rectangle<int>& newBounds) = 0;
|
|
|
|
|
|
|
|
private:
|
|
|
|
Component& component;
|
|
|
|
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Positioner)
|
|
|
|
};
|
|
|
|
|
|
|
|
/** Returns the Positioner object that has been set for this component.
|
|
|
|
@see setPositioner()
|
|
|
|
*/
|
|
|
|
Positioner* getPositioner() const noexcept;
|
|
|
|
|
|
|
|
/** Sets a new Positioner object for this component.
|
|
|
|
If there's currently another positioner set, it will be deleted. The object that is passed in
|
|
|
|
will be deleted automatically by this component when it's no longer required. Pass a null pointer
|
|
|
|
to clear the current positioner.
|
|
|
|
@see getPositioner()
|
|
|
|
*/
|
|
|
|
void setPositioner (Positioner* newPositioner);
|
|
|
|
|
|
|
|
/** Gives the component a CachedComponentImage that should be used to buffer its painting.
|
|
|
|
The object that is passed-in will be owned by this component, and will be deleted automatically
|
|
|
|
later on.
|
|
|
|
@see setBufferedToImage
|
|
|
|
*/
|
|
|
|
void setCachedComponentImage (CachedComponentImage* newCachedImage);
|
|
|
|
|
|
|
|
/** Returns the object that was set by setCachedComponentImage().
|
|
|
|
@see setCachedComponentImage
|
|
|
|
*/
|
|
|
|
CachedComponentImage* getCachedComponentImage() const noexcept { return cachedImage; }
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
// These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead.
|
|
|
|
JUCE_DEPRECATED (Point<int> relativePositionToGlobal (Point<int>) const);
|
|
|
|
JUCE_DEPRECATED (Point<int> globalPositionToRelative (Point<int>) const);
|
|
|
|
JUCE_DEPRECATED (Point<int> relativePositionToOtherComponent (const Component*, Point<int>) const);
|
|
|
|
|
|
|
|
private:
|
|
|
|
//==============================================================================
|
|
|
|
friend class ComponentPeer;
|
|
|
|
friend class MouseInputSource;
|
|
|
|
friend class MouseInputSourceInternal;
|
|
|
|
|
|
|
|
#ifndef DOXYGEN
|
|
|
|
static Component* currentlyFocusedComponent;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
String componentName, componentID;
|
|
|
|
Component* parentComponent;
|
|
|
|
Rectangle<int> bounds;
|
|
|
|
ScopedPointer <Positioner> positioner;
|
|
|
|
ScopedPointer <AffineTransform> affineTransform;
|
|
|
|
Array <Component*> childComponentList;
|
|
|
|
LookAndFeel* lookAndFeel;
|
|
|
|
MouseCursor cursor;
|
|
|
|
ImageEffectFilter* effect;
|
|
|
|
ScopedPointer <CachedComponentImage> cachedImage;
|
|
|
|
|
|
|
|
class MouseListenerList;
|
|
|
|
friend class MouseListenerList;
|
|
|
|
friend struct ContainerDeletePolicy<MouseListenerList>;
|
|
|
|
ScopedPointer <MouseListenerList> mouseListeners;
|
|
|
|
ScopedPointer <Array <KeyListener*> > keyListeners;
|
|
|
|
ListenerList <ComponentListener> componentListeners;
|
|
|
|
NamedValueSet properties;
|
|
|
|
|
|
|
|
friend class WeakReference<Component>;
|
|
|
|
WeakReference<Component>::Master masterReference;
|
|
|
|
|
|
|
|
struct ComponentFlags
|
|
|
|
{
|
|
|
|
bool hasHeavyweightPeerFlag : 1;
|
|
|
|
bool visibleFlag : 1;
|
|
|
|
bool opaqueFlag : 1;
|
|
|
|
bool ignoresMouseClicksFlag : 1;
|
|
|
|
bool allowChildMouseClicksFlag : 1;
|
|
|
|
bool wantsFocusFlag : 1;
|
|
|
|
bool isFocusContainerFlag : 1;
|
|
|
|
bool dontFocusOnMouseClickFlag : 1;
|
|
|
|
bool alwaysOnTopFlag : 1;
|
|
|
|
bool bufferToImageFlag : 1;
|
|
|
|
bool bringToFrontOnClickFlag : 1;
|
|
|
|
bool repaintOnMouseActivityFlag : 1;
|
|
|
|
bool currentlyModalFlag : 1;
|
|
|
|
bool isDisabledFlag : 1;
|
|
|
|
bool childCompFocusedFlag : 1;
|
|
|
|
bool dontClipGraphicsFlag : 1;
|
|
|
|
bool mouseDownWasBlocked : 1;
|
|
|
|
#if JUCE_DEBUG
|
|
|
|
bool isInsidePaintCall : 1;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
union
|
|
|
|
{
|
|
|
|
uint32 componentFlags;
|
|
|
|
ComponentFlags flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
uint8 componentTransparency;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
void internalMouseEnter (MouseInputSource, Point<int>, Time);
|
|
|
|
void internalMouseExit (MouseInputSource, Point<int>, Time);
|
|
|
|
void internalMouseDown (MouseInputSource, Point<int>, Time);
|
|
|
|
void internalMouseUp (MouseInputSource, Point<int>, Time, const ModifierKeys oldModifiers);
|
|
|
|
void internalMouseDrag (MouseInputSource, Point<int>, Time);
|
|
|
|
void internalMouseMove (MouseInputSource, Point<int>, Time);
|
|
|
|
void internalMouseWheel (MouseInputSource, Point<int>, Time, const MouseWheelDetails&);
|
|
|
|
void internalMagnifyGesture (MouseInputSource, Point<int>, Time, float);
|
|
|
|
void internalBroughtToFront();
|
|
|
|
void internalFocusGain (const FocusChangeType, const WeakReference<Component>&);
|
|
|
|
void internalFocusGain (const FocusChangeType);
|
|
|
|
void internalFocusLoss (const FocusChangeType);
|
|
|
|
void internalChildFocusChange (FocusChangeType, const WeakReference<Component>&);
|
|
|
|
void internalModalInputAttempt();
|
|
|
|
void internalModifierKeysChanged();
|
|
|
|
void internalChildrenChanged();
|
|
|
|
void internalHierarchyChanged();
|
|
|
|
void internalRepaint (const Rectangle<int>&);
|
|
|
|
void internalRepaintUnchecked (const Rectangle<int>&, bool);
|
|
|
|
Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents);
|
|
|
|
void reorderChildInternal (int sourceIndex, int destIndex);
|
|
|
|
void paintComponentAndChildren (Graphics&);
|
|
|
|
void paintWithinParentContext (Graphics&);
|
|
|
|
void sendMovedResizedMessages (bool wasMoved, bool wasResized);
|
|
|
|
void repaintParent();
|
|
|
|
void sendFakeMouseMove() const;
|
|
|
|
void takeKeyboardFocus (const FocusChangeType);
|
|
|
|
void grabFocusInternal (const FocusChangeType, bool canTryParent);
|
|
|
|
static void giveAwayFocus (bool sendFocusLossEvent);
|
|
|
|
void sendEnablementChangeMessage();
|
|
|
|
void sendVisibilityChangeMessage();
|
|
|
|
|
|
|
|
struct ComponentHelpers;
|
|
|
|
friend struct ComponentHelpers;
|
|
|
|
|
|
|
|
/* Components aren't allowed to have copy constructors, as this would mess up parent hierarchies.
|
|
|
|
You might need to give your subclasses a private dummy constructor to avoid compiler warnings.
|
|
|
|
*/
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Component)
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
#if JUCE_CATCH_DEPRECATED_CODE_MISUSE
|
|
|
|
// This is included here just to cause a compile error if your code is still handling
|
|
|
|
// drag-and-drop with this method. If so, just update it to use the new FileDragAndDropTarget
|
|
|
|
// class, which is easy (just make your class inherit from FileDragAndDropTarget, and
|
|
|
|
// implement its methods instead of this Component method).
|
|
|
|
virtual void filesDropped (const StringArray&, int, int) {}
|
|
|
|
|
|
|
|
// This is included here to cause an error if you use or overload it - it has been deprecated in
|
|
|
|
// favour of contains (Point<int>)
|
|
|
|
void contains (int, int) JUCE_DELETED_FUNCTION;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
protected:
|
|
|
|
//==============================================================================
|
|
|
|
/** @internal */
|
|
|
|
virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo);
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // JUCE_COMPONENT_H_INCLUDED
|