@@ -26,7 +26,7 @@ | |||
ApplicationCommandManager::ApplicationCommandManager() | |||
: firstTarget (nullptr) | |||
{ | |||
keyMappings = new KeyPressMappingSet (this); | |||
keyMappings = new KeyPressMappingSet (*this); | |||
Desktop::getInstance().addFocusChangeListener (this); | |||
} | |||
@@ -256,14 +256,13 @@ ApplicationCommandTarget* ApplicationCommandManager::findDefaultComponentTarget( | |||
if (c != nullptr) | |||
{ | |||
ResizableWindow* const resizableWindow = dynamic_cast <ResizableWindow*> (c); | |||
// if we're focused on a ResizableWindow, chances are that it's the content | |||
// component that really should get the event. And if not, the event will | |||
// still be passed up to the top level window anyway, so let's send it to the | |||
// content comp. | |||
if (resizableWindow != nullptr && resizableWindow->getContentComponent() != nullptr) | |||
c = resizableWindow->getContentComponent(); | |||
if (ResizableWindow* const resizableWindow = dynamic_cast <ResizableWindow*> (c)) | |||
if (resizableWindow->getContentComponent() != nullptr) | |||
c = resizableWindow->getContentComponent(); | |||
if (ApplicationCommandTarget* const target = findTargetForComponent (c)) | |||
return target; | |||
@@ -23,13 +23,9 @@ | |||
============================================================================== | |||
*/ | |||
KeyPressMappingSet::KeyPressMappingSet (ApplicationCommandManager* const commandManager_) | |||
: commandManager (commandManager_) | |||
KeyPressMappingSet::KeyPressMappingSet (ApplicationCommandManager& cm) | |||
: commandManager (cm) | |||
{ | |||
// A manager is needed to get the descriptions of commands, and will be called when | |||
// a command is invoked. So you can't leave this null.. | |||
jassert (commandManager_ != nullptr); | |||
Desktop::getInstance().addFocusChangeListener (this); | |||
} | |||
@@ -78,9 +74,7 @@ void KeyPressMappingSet::addKeyPress (const CommandID commandID, | |||
} | |||
} | |||
const ApplicationCommandInfo* const ci = commandManager->getCommandForID (commandID); | |||
if (ci != nullptr) | |||
if (const ApplicationCommandInfo* const ci = commandManager.getCommandForID (commandID)) | |||
{ | |||
CommandMapping* const cm = new CommandMapping(); | |||
cm->commandID = commandID; | |||
@@ -98,9 +92,9 @@ void KeyPressMappingSet::resetToDefaultMappings() | |||
{ | |||
mappings.clear(); | |||
for (int i = 0; i < commandManager->getNumCommands(); ++i) | |||
for (int i = 0; i < commandManager.getNumCommands(); ++i) | |||
{ | |||
const ApplicationCommandInfo* const ci = commandManager->getCommandForIndex (i); | |||
const ApplicationCommandInfo* const ci = commandManager.getCommandForIndex (i); | |||
for (int j = 0; j < ci->defaultKeypresses.size(); ++j) | |||
{ | |||
@@ -116,7 +110,7 @@ void KeyPressMappingSet::resetToDefaultMapping (const CommandID commandID) | |||
{ | |||
clearAllKeyPresses (commandID); | |||
const ApplicationCommandInfo* const ci = commandManager->getCommandForID (commandID); | |||
const ApplicationCommandInfo* const ci = commandManager.getCommandForID (commandID); | |||
for (int j = 0; j < ci->defaultKeypresses.size(); ++j) | |||
{ | |||
@@ -152,13 +146,13 @@ void KeyPressMappingSet::removeKeyPress (const KeyPress& keypress) | |||
{ | |||
for (int i = mappings.size(); --i >= 0;) | |||
{ | |||
CommandMapping* const cm = mappings.getUnchecked(i); | |||
CommandMapping& cm = *mappings.getUnchecked(i); | |||
for (int j = cm->keypresses.size(); --j >= 0;) | |||
for (int j = cm.keypresses.size(); --j >= 0;) | |||
{ | |||
if (keypress == cm->keypresses [j]) | |||
if (keypress == cm.keypresses [j]) | |||
{ | |||
cm->keypresses.remove (j); | |||
cm.keypresses.remove (j); | |||
sendChangeMessage(); | |||
} | |||
} | |||
@@ -212,7 +206,7 @@ void KeyPressMappingSet::invokeCommand (const CommandID commandID, | |||
info.millisecsSinceKeyPressed = millisecsSinceKeyPressed; | |||
info.originatingComponent = originatingComponent; | |||
commandManager->invoke (info, false); | |||
commandManager.invoke (info, false); | |||
} | |||
//============================================================================== | |||
@@ -275,18 +269,18 @@ XmlElement* KeyPressMappingSet::createXml (const bool saveDifferencesFromDefault | |||
for (int i = 0; i < mappings.size(); ++i) | |||
{ | |||
const CommandMapping* const cm = mappings.getUnchecked(i); | |||
const CommandMapping& cm = *mappings.getUnchecked(i); | |||
for (int j = 0; j < cm->keypresses.size(); ++j) | |||
for (int j = 0; j < cm.keypresses.size(); ++j) | |||
{ | |||
if (defaultSet == nullptr | |||
|| ! defaultSet->containsMapping (cm->commandID, cm->keypresses.getReference (j))) | |||
|| ! defaultSet->containsMapping (cm.commandID, cm.keypresses.getReference (j))) | |||
{ | |||
XmlElement* const map = doc->createNewChildElement ("MAPPING"); | |||
map->setAttribute ("commandId", String::toHexString ((int) cm->commandID)); | |||
map->setAttribute ("description", commandManager->getDescriptionOfCommand (cm->commandID)); | |||
map->setAttribute ("key", cm->keypresses.getReference (j).getTextDescription()); | |||
map->setAttribute ("commandId", String::toHexString ((int) cm.commandID)); | |||
map->setAttribute ("description", commandManager.getDescriptionOfCommand (cm.commandID)); | |||
map->setAttribute ("key", cm.keypresses.getReference (j).getTextDescription()); | |||
} | |||
} | |||
} | |||
@@ -295,17 +289,17 @@ XmlElement* KeyPressMappingSet::createXml (const bool saveDifferencesFromDefault | |||
{ | |||
for (int i = 0; i < defaultSet->mappings.size(); ++i) | |||
{ | |||
const CommandMapping* const cm = defaultSet->mappings.getUnchecked(i); | |||
const CommandMapping& cm = *defaultSet->mappings.getUnchecked(i); | |||
for (int j = 0; j < cm->keypresses.size(); ++j) | |||
for (int j = 0; j < cm.keypresses.size(); ++j) | |||
{ | |||
if (! containsMapping (cm->commandID, cm->keypresses.getReference (j))) | |||
if (! containsMapping (cm.commandID, cm.keypresses.getReference (j))) | |||
{ | |||
XmlElement* const map = doc->createNewChildElement ("UNMAPPING"); | |||
map->setAttribute ("commandId", String::toHexString ((int) cm->commandID)); | |||
map->setAttribute ("description", commandManager->getDescriptionOfCommand (cm->commandID)); | |||
map->setAttribute ("key", cm->keypresses.getReference (j).getTextDescription()); | |||
map->setAttribute ("commandId", String::toHexString ((int) cm.commandID)); | |||
map->setAttribute ("description", commandManager.getDescriptionOfCommand (cm.commandID)); | |||
map->setAttribute ("key", cm.keypresses.getReference (j).getTextDescription()); | |||
} | |||
} | |||
} | |||
@@ -315,34 +309,33 @@ XmlElement* KeyPressMappingSet::createXml (const bool saveDifferencesFromDefault | |||
} | |||
//============================================================================== | |||
bool KeyPressMappingSet::keyPressed (const KeyPress& key, | |||
Component* originatingComponent) | |||
bool KeyPressMappingSet::keyPressed (const KeyPress& key, Component* const originatingComponent) | |||
{ | |||
bool commandWasDisabled = false; | |||
for (int i = 0; i < mappings.size(); ++i) | |||
{ | |||
CommandMapping* const cm = mappings.getUnchecked(i); | |||
CommandMapping& cm = *mappings.getUnchecked(i); | |||
if (cm->keypresses.contains (key)) | |||
if (cm.keypresses.contains (key)) | |||
{ | |||
const ApplicationCommandInfo* const ci = commandManager->getCommandForID (cm->commandID); | |||
if (ci != nullptr | |||
&& (ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) == 0) | |||
if (const ApplicationCommandInfo* const ci = commandManager.getCommandForID (cm.commandID)) | |||
{ | |||
ApplicationCommandInfo info (0); | |||
if (commandManager->getTargetForCommand (cm->commandID, info) != 0) | |||
if ((ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) == 0) | |||
{ | |||
if ((info.flags & ApplicationCommandInfo::isDisabled) == 0) | |||
{ | |||
invokeCommand (cm->commandID, key, true, 0, originatingComponent); | |||
return true; | |||
} | |||
else | |||
ApplicationCommandInfo info (0); | |||
if (commandManager.getTargetForCommand (cm.commandID, info) != nullptr) | |||
{ | |||
commandWasDisabled = true; | |||
if ((info.flags & ApplicationCommandInfo::isDisabled) == 0) | |||
{ | |||
invokeCommand (cm.commandID, key, true, 0, originatingComponent); | |||
return true; | |||
} | |||
else | |||
{ | |||
commandWasDisabled = true; | |||
} | |||
} | |||
} | |||
} | |||
@@ -362,13 +355,13 @@ bool KeyPressMappingSet::keyStateChanged (const bool /*isKeyDown*/, Component* o | |||
for (int i = mappings.size(); --i >= 0;) | |||
{ | |||
CommandMapping* const cm = mappings.getUnchecked(i); | |||
CommandMapping& cm = *mappings.getUnchecked(i); | |||
if (cm->wantsKeyUpDownCallbacks) | |||
if (cm.wantsKeyUpDownCallbacks) | |||
{ | |||
for (int j = cm->keypresses.size(); --j >= 0;) | |||
for (int j = cm.keypresses.size(); --j >= 0;) | |||
{ | |||
const KeyPress key (cm->keypresses.getReference (j)); | |||
const KeyPress key (cm.keypresses.getReference (j)); | |||
const bool isDown = key.isCurrentlyDown(); | |||
int keyPressEntryIndex = 0; | |||
@@ -407,7 +400,7 @@ bool KeyPressMappingSet::keyStateChanged (const bool /*isKeyDown*/, Component* o | |||
keysDown.remove (keyPressEntryIndex); | |||
} | |||
invokeCommand (cm->commandID, key, isDown, millisecs, originatingComponent); | |||
invokeCommand (cm.commandID, key, isDown, millisecs, originatingComponent); | |||
used = true; | |||
} | |||
} | |||
@@ -103,7 +103,7 @@ public: | |||
@see ApplicationCommandManager | |||
*/ | |||
explicit KeyPressMappingSet (ApplicationCommandManager* commandManager); | |||
explicit KeyPressMappingSet (ApplicationCommandManager& commandManager); | |||
/** Creates an copy of a KeyPressMappingSet. */ | |||
KeyPressMappingSet (const KeyPressMappingSet& other); | |||
@@ -112,7 +112,7 @@ public: | |||
~KeyPressMappingSet(); | |||
//============================================================================== | |||
ApplicationCommandManager* getCommandManager() const noexcept { return commandManager; } | |||
ApplicationCommandManager& getCommandManager() const noexcept { return commandManager; } | |||
//============================================================================== | |||
/** Returns a list of keypresses that are assigned to a particular command. | |||
@@ -172,7 +172,6 @@ public: | |||
//============================================================================== | |||
/** Looks for a command that corresponds to a keypress. | |||
@returns the UID of the command or 0 if none was found | |||
*/ | |||
CommandID findCommandForKeyPress (const KeyPress& keyPress) const noexcept; | |||
@@ -216,15 +215,15 @@ public: | |||
//============================================================================== | |||
/** @internal */ | |||
bool keyPressed (const KeyPress& key, Component* originatingComponent); | |||
bool keyPressed (const KeyPress&, Component* originatingComponent); | |||
/** @internal */ | |||
bool keyStateChanged (bool isKeyDown, Component* originatingComponent); | |||
/** @internal */ | |||
void globalFocusChanged (Component* focusedComponent); | |||
void globalFocusChanged (Component*); | |||
private: | |||
//============================================================================== | |||
ApplicationCommandManager* commandManager; | |||
ApplicationCommandManager& commandManager; | |||
struct CommandMapping | |||
{ | |||
@@ -243,13 +242,9 @@ private: | |||
OwnedArray <KeyPressTime> keysDown; | |||
void handleMessage (const Message& message); | |||
void invokeCommand (const CommandID commandID, | |||
const KeyPress& keyPress, | |||
const bool isKeyDown, | |||
const int millisecsSinceKeyPressed, | |||
Component* const originatingComponent) const; | |||
void handleMessage (const Message&); | |||
void invokeCommand (const CommandID, const KeyPress&, const bool isKeyDown, | |||
const int millisecsSinceKeyPressed, Component* originator) const; | |||
KeyPressMappingSet& operator= (const KeyPressMappingSet&); | |||
JUCE_LEAK_DETECTOR (KeyPressMappingSet); | |||
@@ -26,20 +26,18 @@ | |||
class KeyMappingEditorComponent::ChangeKeyButton : public Button | |||
{ | |||
public: | |||
ChangeKeyButton (KeyMappingEditorComponent& owner_, | |||
const CommandID commandID_, | |||
const String& keyName, | |||
const int keyNum_) | |||
ChangeKeyButton (KeyMappingEditorComponent& kec, const CommandID command, | |||
const String& keyName, const int keyIndex) | |||
: Button (keyName), | |||
owner (owner_), | |||
commandID (commandID_), | |||
keyNum (keyNum_) | |||
owner (kec), | |||
commandID (command), | |||
keyNum (keyIndex) | |||
{ | |||
setWantsKeyboardFocus (false); | |||
setTriggeredOnMouseDown (keyNum >= 0); | |||
setTooltip (keyNum_ < 0 ? TRANS("adds a new key-mapping") | |||
: TRANS("click to change this key-mapping")); | |||
setTooltip (keyIndex < 0 ? TRANS("adds a new key-mapping") | |||
: TRANS("click to change this key-mapping")); | |||
} | |||
void paintButton (Graphics& g, bool /*isOver*/, bool /*isDown*/) | |||
@@ -83,25 +81,20 @@ public: | |||
void fitToContent (const int h) noexcept | |||
{ | |||
if (keyNum < 0) | |||
{ | |||
setSize (h, h); | |||
} | |||
else | |||
{ | |||
Font f (h * 0.6f); | |||
setSize (jlimit (h * 4, h * 8, 6 + f.getStringWidth (getName())), h); | |||
} | |||
setSize (jlimit (h * 4, h * 8, 6 + Font (h * 0.6f).getStringWidth (getName())), h); | |||
} | |||
//============================================================================== | |||
class KeyEntryWindow : public AlertWindow | |||
{ | |||
public: | |||
KeyEntryWindow (KeyMappingEditorComponent& owner_) | |||
KeyEntryWindow (KeyMappingEditorComponent& kec) | |||
: AlertWindow (TRANS("New key-mapping"), | |||
TRANS("Please press a key combination now..."), | |||
AlertWindow::NoIcon), | |||
owner (owner_) | |||
owner (kec) | |||
{ | |||
addButton (TRANS("Ok"), 1); | |||
addButton (TRANS("Cancel"), 0); | |||
@@ -123,7 +116,7 @@ public: | |||
if (previousCommand != 0) | |||
message << "\n\n" << TRANS("(Currently assigned to \"") | |||
<< owner.getMappings().getCommandManager()->getNameOfCommand (previousCommand) << "\")"; | |||
<< owner.getCommandManager().getNameOfCommand (previousCommand) << "\")"; | |||
setMessage (message); | |||
return true; | |||
@@ -168,7 +161,7 @@ public: | |||
AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, | |||
TRANS("Change key-mapping"), | |||
TRANS("This key is already assigned to the command \"") | |||
+ owner.getMappings().getCommandManager()->getNameOfCommand (previousCommand) | |||
+ owner.getCommandManager().getNameOfCommand (previousCommand) | |||
+ TRANS("\"\n\nDo you want to re-assign it to this new command instead?"), | |||
TRANS("Re-assign"), | |||
TRANS("Cancel"), | |||
@@ -209,8 +202,8 @@ private: | |||
class KeyMappingEditorComponent::ItemComponent : public Component | |||
{ | |||
public: | |||
ItemComponent (KeyMappingEditorComponent& owner_, const CommandID commandID_) | |||
: owner (owner_), commandID (commandID_) | |||
ItemComponent (KeyMappingEditorComponent& kec, const CommandID command) | |||
: owner (kec), commandID (command) | |||
{ | |||
setInterceptsMouseClicks (false, true); | |||
@@ -239,7 +232,7 @@ public: | |||
g.setFont (getHeight() * 0.7f); | |||
g.setColour (findColour (KeyMappingEditorComponent::textColourId)); | |||
g.drawFittedText (owner.getMappings().getCommandManager()->getNameOfCommand (commandID), | |||
g.drawFittedText (owner.getCommandManager().getNameOfCommand (commandID), | |||
4, 0, jmax (40, getChildComponent (0)->getX() - 5), getHeight(), | |||
Justification::centredLeft, true); | |||
} | |||
@@ -272,19 +265,14 @@ private: | |||
class KeyMappingEditorComponent::MappingItem : public TreeViewItem | |||
{ | |||
public: | |||
MappingItem (KeyMappingEditorComponent& owner_, const CommandID commandID_) | |||
: owner (owner_), commandID (commandID_) | |||
{ | |||
} | |||
MappingItem (KeyMappingEditorComponent& kec, const CommandID command) | |||
: owner (kec), commandID (command) | |||
{} | |||
String getUniqueName() const { return String ((int) commandID) + "_id"; } | |||
bool mightContainSubItems() { return false; } | |||
int getItemHeight() const { return 20; } | |||
Component* createItemComponent() | |||
{ | |||
return new ItemComponent (owner, commandID); | |||
} | |||
String getUniqueName() const { return String ((int) commandID) + "_id"; } | |||
bool mightContainSubItems() { return false; } | |||
int getItemHeight() const { return 20; } | |||
Component* createItemComponent() { return new ItemComponent (owner, commandID); } | |||
private: | |||
KeyMappingEditorComponent& owner; | |||
@@ -298,10 +286,9 @@ private: | |||
class KeyMappingEditorComponent::CategoryItem : public TreeViewItem | |||
{ | |||
public: | |||
CategoryItem (KeyMappingEditorComponent& owner_, const String& name) | |||
: owner (owner_), categoryName (name) | |||
{ | |||
} | |||
CategoryItem (KeyMappingEditorComponent& kec, const String& name) | |||
: owner (kec), categoryName (name) | |||
{} | |||
String getUniqueName() const { return categoryName + "_cat"; } | |||
bool mightContainSubItems() { return true; } | |||
@@ -323,13 +310,11 @@ public: | |||
{ | |||
if (getNumSubItems() == 0) | |||
{ | |||
Array <CommandID> commands (owner.getMappings().getCommandManager()->getCommandsInCategory (categoryName)); | |||
const Array <CommandID> commands (owner.getCommandManager().getCommandsInCategory (categoryName)); | |||
for (int i = 0; i < commands.size(); ++i) | |||
{ | |||
if (owner.shouldCommandBeIncluded (commands[i])) | |||
addSubItem (new MappingItem (owner, commands[i])); | |||
} | |||
} | |||
} | |||
else | |||
@@ -351,8 +336,8 @@ class KeyMappingEditorComponent::TopLevelItem : public TreeViewItem, | |||
private ChangeListener | |||
{ | |||
public: | |||
TopLevelItem (KeyMappingEditorComponent& owner_) | |||
: owner (owner_) | |||
TopLevelItem (KeyMappingEditorComponent& kec) | |||
: owner (kec) | |||
{ | |||
setLinesDrawnForSubItems (false); | |||
owner.getMappings().addChangeListener (this); | |||
@@ -371,11 +356,11 @@ public: | |||
const OpennessRestorer opennessRestorer (*this); | |||
clearSubItems(); | |||
const StringArray categories (owner.getMappings().getCommandManager()->getCommandCategories()); | |||
const StringArray categories (owner.getCommandManager().getCommandCategories()); | |||
for (int i = 0; i < categories.size(); ++i) | |||
{ | |||
const Array <CommandID> commands (owner.getMappings().getCommandManager()->getCommandsInCategory (categories[i])); | |||
const Array <CommandID> commands (owner.getCommandManager().getCommandsInCategory (categories[i])); | |||
int count = 0; | |||
for (int j = 0; j < commands.size(); ++j) | |||
@@ -469,14 +454,14 @@ void KeyMappingEditorComponent::resized() | |||
//============================================================================== | |||
bool KeyMappingEditorComponent::shouldCommandBeIncluded (const CommandID commandID) | |||
{ | |||
const ApplicationCommandInfo* const ci = mappings.getCommandManager()->getCommandForID (commandID); | |||
const ApplicationCommandInfo* const ci = mappings.getCommandManager().getCommandForID (commandID); | |||
return ci != nullptr && (ci->flags & ApplicationCommandInfo::hiddenFromKeyEditor) == 0; | |||
} | |||
bool KeyMappingEditorComponent::isCommandReadOnly (const CommandID commandID) | |||
{ | |||
const ApplicationCommandInfo* const ci = mappings.getCommandManager()->getCommandForID (commandID); | |||
const ApplicationCommandInfo* const ci = mappings.getCommandManager().getCommandForID (commandID); | |||
return ci != nullptr && (ci->flags & ApplicationCommandInfo::readOnlyInKeyEditor) != 0; | |||
} | |||
@@ -63,6 +63,9 @@ public: | |||
/** Returns the KeyPressMappingSet that this component is acting upon. */ | |||
KeyPressMappingSet& getMappings() const noexcept { return mappings; } | |||
/** Returns the ApplicationCommandManager that this component is connected to. */ | |||
ApplicationCommandManager& getCommandManager() const noexcept { return mappings.getCommandManager(); } | |||
//============================================================================== | |||
/** Can be overridden if some commands need to be excluded from the list. | |||