|
|
|
/*
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
This file is part of the JUCE library.
|
|
|
|
Copyright (c) 2015 - ROLI Ltd.
|
|
|
|
|
|
|
|
Permission is granted to use this software under the terms of either:
|
|
|
|
a) the GPL v2 (or any later version)
|
|
|
|
b) the Affero GPL v3
|
|
|
|
|
|
|
|
Details of these licenses can be found at: www.gnu.org/licenses
|
|
|
|
|
|
|
|
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
|
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
To release a closed-source product which uses JUCE, commercial licenses are
|
|
|
|
available: visit www.juce.com for more information.
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef JUCE_APPLICATIONCOMMANDTARGET_H_INCLUDED
|
|
|
|
#define JUCE_APPLICATIONCOMMANDTARGET_H_INCLUDED
|
|
|
|
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/**
|
|
|
|
A command target publishes a list of command IDs that it can perform.
|
|
|
|
|
|
|
|
An ApplicationCommandManager despatches commands to targets, which must be
|
|
|
|
able to provide information about what commands they can handle.
|
|
|
|
|
|
|
|
To create a target, you'll need to inherit from this class, implementing all of
|
|
|
|
its pure virtual methods.
|
|
|
|
|
|
|
|
For info about how a target is chosen to receive a command, see
|
|
|
|
ApplicationCommandManager::getFirstCommandTarget().
|
|
|
|
|
|
|
|
@see ApplicationCommandManager, ApplicationCommandInfo
|
|
|
|
*/
|
|
|
|
class JUCE_API ApplicationCommandTarget
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
//==============================================================================
|
|
|
|
/** Creates a command target. */
|
|
|
|
ApplicationCommandTarget();
|
|
|
|
|
|
|
|
/** Destructor. */
|
|
|
|
virtual ~ApplicationCommandTarget();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/**
|
|
|
|
Contains contextual details about the invocation of a command.
|
|
|
|
*/
|
|
|
|
struct JUCE_API InvocationInfo
|
|
|
|
{
|
|
|
|
//==============================================================================
|
|
|
|
InvocationInfo (const CommandID commandID);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** The UID of the command that should be performed. */
|
|
|
|
CommandID commandID;
|
|
|
|
|
|
|
|
/** The command's flags.
|
|
|
|
See ApplicationCommandInfo for a description of these flag values.
|
|
|
|
*/
|
|
|
|
int commandFlags;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** The types of context in which the command might be called. */
|
|
|
|
enum InvocationMethod
|
|
|
|
{
|
|
|
|
direct = 0, /**< The command is being invoked directly by a piece of code. */
|
|
|
|
fromKeyPress, /**< The command is being invoked by a key-press. */
|
|
|
|
fromMenu, /**< The command is being invoked by a menu selection. */
|
|
|
|
fromButton /**< The command is being invoked by a button click. */
|
|
|
|
};
|
|
|
|
|
|
|
|
/** The type of event that triggered this command. */
|
|
|
|
InvocationMethod invocationMethod;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** If triggered by a keypress or menu, this will be the component that had the
|
|
|
|
keyboard focus at the time.
|
|
|
|
|
|
|
|
If triggered by a button, it may be set to that component, or it may be null.
|
|
|
|
*/
|
|
|
|
Component* originatingComponent;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** The keypress that was used to invoke it.
|
|
|
|
|
|
|
|
Note that this will be an invalid keypress if the command was invoked
|
|
|
|
by some other means than a keyboard shortcut.
|
|
|
|
*/
|
|
|
|
KeyPress keyPress;
|
|
|
|
|
|
|
|
/** True if the callback is being invoked when the key is pressed,
|
|
|
|
false if the key is being released.
|
|
|
|
|
|
|
|
@see KeyPressMappingSet::addCommand()
|
|
|
|
*/
|
|
|
|
bool isKeyDown;
|
|
|
|
|
|
|
|
/** If the key is being released, this indicates how long it had been held
|
|
|
|
down for.
|
|
|
|
|
|
|
|
(Only relevant if isKeyDown is false.)
|
|
|
|
*/
|
|
|
|
int millisecsSinceKeyPressed;
|
|
|
|
};
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** This must return the next target to try after this one.
|
|
|
|
|
|
|
|
When a command is being sent, and the first target can't handle
|
|
|
|
that command, this method is used to determine the next target that should
|
|
|
|
be tried.
|
|
|
|
|
|
|
|
It may return nullptr if it doesn't know of another target.
|
|
|
|
|
|
|
|
If your target is a Component, you would usually use the findFirstTargetParentComponent()
|
|
|
|
method to return a parent component that might want to handle it.
|
|
|
|
|
|
|
|
@see invoke
|
|
|
|
*/
|
|
|
|
virtual ApplicationCommandTarget* getNextCommandTarget() = 0;
|
|
|
|
|
|
|
|
/** This must return a complete list of commands that this target can handle.
|
|
|
|
|
|
|
|
Your target should add all the command IDs that it handles to the array that is
|
|
|
|
passed-in.
|
|
|
|
*/
|
|
|
|
virtual void getAllCommands (Array<CommandID>& commands) = 0;
|
|
|
|
|
|
|
|
/** This must provide details about one of the commands that this target can perform.
|
|
|
|
|
|
|
|
This will be called with one of the command IDs that the target provided in its
|
|
|
|
getAllCommands() methods.
|
|
|
|
|
|
|
|
It should fill-in all appropriate fields of the ApplicationCommandInfo structure with
|
|
|
|
suitable information about the command. (The commandID field will already have been filled-in
|
|
|
|
by the caller).
|
|
|
|
|
|
|
|
The easiest way to set the info is using the ApplicationCommandInfo::setInfo() method to
|
|
|
|
set all the fields at once.
|
|
|
|
|
|
|
|
If the command is currently inactive for some reason, this method must use
|
|
|
|
ApplicationCommandInfo::setActive() to make that clear, (or it should set the isDisabled
|
|
|
|
bit of the ApplicationCommandInfo::flags field).
|
|
|
|
|
|
|
|
Any default key-presses for the command should be appended to the
|
|
|
|
ApplicationCommandInfo::defaultKeypresses field.
|
|
|
|
|
|
|
|
Note that if you change something that affects the status of the commands
|
|
|
|
that would be returned by this method (e.g. something that makes some commands
|
|
|
|
active or inactive), you should call ApplicationCommandManager::commandStatusChanged()
|
|
|
|
to cause the manager to refresh its status.
|
|
|
|
*/
|
|
|
|
virtual void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result) = 0;
|
|
|
|
|
|
|
|
/** This must actually perform the specified command.
|
|
|
|
|
|
|
|
If this target is able to perform the command specified by the commandID field of the
|
|
|
|
InvocationInfo structure, then it should do so, and must return true.
|
|
|
|
|
|
|
|
If it can't handle this command, it should return false, which tells the caller to pass
|
|
|
|
the command on to the next target in line.
|
|
|
|
|
|
|
|
@see invoke, ApplicationCommandManager::invoke
|
|
|
|
*/
|
|
|
|
virtual bool perform (const InvocationInfo& info) = 0;
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Makes this target invoke a command.
|
|
|
|
|
|
|
|
Your code can call this method to invoke a command on this target, but normally
|
|
|
|
you'd call it indirectly via ApplicationCommandManager::invoke() or
|
|
|
|
ApplicationCommandManager::invokeDirectly().
|
|
|
|
|
|
|
|
If this target can perform the given command, it will call its perform() method to
|
|
|
|
do so. If not, then getNextCommandTarget() will be used to determine the next target
|
|
|
|
to try, and the command will be passed along to it.
|
|
|
|
|
|
|
|
@param invocationInfo this must be correctly filled-in, describing the context for
|
|
|
|
the invocation.
|
|
|
|
@param asynchronously if false, the command will be performed before this method returns.
|
|
|
|
If true, a message will be posted so that the command will be performed
|
|
|
|
later on the message thread, and this method will return immediately.
|
|
|
|
@see perform, ApplicationCommandManager::invoke
|
|
|
|
*/
|
|
|
|
bool invoke (const InvocationInfo& invocationInfo,
|
|
|
|
const bool asynchronously);
|
|
|
|
|
|
|
|
/** Invokes a given command directly on this target.
|
|
|
|
|
|
|
|
This is just an easy way to call invoke() without having to fill out the InvocationInfo
|
|
|
|
structure.
|
|
|
|
*/
|
|
|
|
bool invokeDirectly (const CommandID commandID,
|
|
|
|
const bool asynchronously);
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Searches this target and all subsequent ones for the first one that can handle
|
|
|
|
the specified command.
|
|
|
|
|
|
|
|
This will use getNextCommandTarget() to determine the chain of targets to try
|
|
|
|
after this one.
|
|
|
|
*/
|
|
|
|
ApplicationCommandTarget* getTargetForCommand (const CommandID commandID);
|
|
|
|
|
|
|
|
/** Checks whether this command can currently be performed by this target.
|
|
|
|
|
|
|
|
This will return true only if a call to getCommandInfo() doesn't set the
|
|
|
|
isDisabled flag to indicate that the command is inactive.
|
|
|
|
*/
|
|
|
|
bool isCommandActive (const CommandID commandID);
|
|
|
|
|
|
|
|
/** If this object is a Component, this method will seach upwards in its current
|
|
|
|
UI hierarchy for the next parent component that implements the
|
|
|
|
ApplicationCommandTarget class.
|
|
|
|
|
|
|
|
If your target is a Component, this is a very handy method to use in your
|
|
|
|
getNextCommandTarget() implementation.
|
|
|
|
*/
|
|
|
|
ApplicationCommandTarget* findFirstTargetParentComponent();
|
|
|
|
|
|
|
|
private:
|
|
|
|
//==============================================================================
|
|
|
|
WeakReference<ApplicationCommandTarget>::Master masterReference;
|
|
|
|
friend class WeakReference<ApplicationCommandTarget>;
|
|
|
|
|
|
|
|
class CommandMessage;
|
|
|
|
friend class CommandMessage;
|
|
|
|
|
|
|
|
bool tryToInvoke (const InvocationInfo&, bool async);
|
|
|
|
|
|
|
|
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ApplicationCommandTarget)
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif // JUCE_APPLICATIONCOMMANDTARGET_H_INCLUDED
|