@@ -120,36 +120,35 @@ ProjectTreeViewBase* ProjectTreeViewBase::findTreeViewItem (const Project::Item& | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
class RenameMessage : public CallbackMessage | |||||
void ProjectTreeViewBase::triggerAsyncRename (const Project::Item& itemToRename) | |||||
{ | { | ||||
public: | |||||
RenameMessage (TreeView* const tree_, const Project::Item& itemToRename_) | |||||
: tree (tree_), itemToRename (itemToRename_) {} | |||||
~RenameMessage() throw() {} | |||||
void messageCallback() | |||||
class RenameMessage : public CallbackMessage | |||||
{ | { | ||||
if (tree->isValidComponent()) | |||||
{ | |||||
ProjectTreeViewBase* pg = dynamic_cast <ProjectTreeViewBase*> (tree->getRootItem()); | |||||
public: | |||||
RenameMessage (TreeView* const tree_, const Project::Item& itemToRename_) | |||||
: tree (tree_), itemToRename (itemToRename_) {} | |||||
if (pg != 0) | |||||
void messageCallback() | |||||
{ | |||||
if (tree != 0) | |||||
{ | { | ||||
pg = pg->findTreeViewItem (itemToRename); | |||||
ProjectTreeViewBase* pg = dynamic_cast <ProjectTreeViewBase*> (tree->getRootItem()); | |||||
if (pg != 0) | if (pg != 0) | ||||
pg->showRenameBox(); | |||||
{ | |||||
pg = pg->findTreeViewItem (itemToRename); | |||||
if (pg != 0) | |||||
pg->showRenameBox(); | |||||
} | |||||
} | } | ||||
} | } | ||||
} | |||||
TreeView* tree; | |||||
Project::Item itemToRename; | |||||
}; | |||||
private: | |||||
Component::SafePointer<TreeView> tree; | |||||
Project::Item itemToRename; | |||||
}; | |||||
void ProjectTreeViewBase::triggerAsyncRename (const Project::Item& itemToRename) | |||||
{ | |||||
(new RenameMessage (getOwnerView(), itemToRename))->post(); | (new RenameMessage (getOwnerView(), itemToRename))->post(); | ||||
} | } | ||||
@@ -38,12 +38,9 @@ ApplicationCommandManager* commandManager = 0; | |||||
//============================================================================== | //============================================================================== | ||||
class PluginHostApp : public JUCEApplication | class PluginHostApp : public JUCEApplication | ||||
{ | { | ||||
MainHostWindow* mainWindow; | |||||
public: | public: | ||||
//============================================================================== | //============================================================================== | ||||
PluginHostApp() | PluginHostApp() | ||||
: mainWindow (0) | |||||
{ | { | ||||
} | } | ||||
@@ -55,8 +52,8 @@ public: | |||||
{ | { | ||||
// initialise our settings file.. | // initialise our settings file.. | ||||
ApplicationProperties::getInstance() | ApplicationProperties::getInstance() | ||||
->setStorageParameters (T("Juce Audio Plugin Host"), | |||||
T("settings"), String::empty, 1000, | |||||
->setStorageParameters ("Juce Audio Plugin Host", | |||||
"settings", String::empty, 1000, | |||||
PropertiesFile::storeAsXML); | PropertiesFile::storeAsXML); | ||||
commandManager = new ApplicationCommandManager(); | commandManager = new ApplicationCommandManager(); | ||||
@@ -75,35 +72,26 @@ public: | |||||
void shutdown() | void shutdown() | ||||
{ | { | ||||
deleteAndZero (mainWindow); | |||||
mainWindow = 0; | |||||
ApplicationProperties::getInstance()->closeFiles(); | ApplicationProperties::getInstance()->closeFiles(); | ||||
deleteAndZero (commandManager); | deleteAndZero (commandManager); | ||||
} | } | ||||
const String getApplicationName() | |||||
{ | |||||
return T("Juce Plug-In Host"); | |||||
} | |||||
const String getApplicationVersion() | |||||
{ | |||||
return ProjectInfo::versionString; | |||||
} | |||||
void systemRequestedQuit() | void systemRequestedQuit() | ||||
{ | { | ||||
if (mainWindow->isValidComponent()) | |||||
if (mainWindow != 0) | |||||
mainWindow->tryToQuitApplication(); | mainWindow->tryToQuitApplication(); | ||||
else | else | ||||
JUCEApplication::quit(); | JUCEApplication::quit(); | ||||
} | } | ||||
bool moreThanOneInstanceAllowed() | |||||
{ | |||||
return true; | |||||
} | |||||
const String getApplicationName() { return "Juce Plug-In Host"; } | |||||
const String getApplicationVersion() { return ProjectInfo::versionString; } | |||||
bool moreThanOneInstanceAllowed() { return true; } | |||||
private: | |||||
ScopedPointer <MainHostWindow> mainWindow; | |||||
}; | }; | ||||
@@ -1062,7 +1062,7 @@ public: | |||||
- (void) deleteEditor | - (void) deleteEditor | ||||
{ | { | ||||
if (editorComp != 0 && editorComp->isValidComponent()) | |||||
if (editorComp != 0) | |||||
{ | { | ||||
if (editorComp->getChildComponent(0) != 0) | if (editorComp->getChildComponent(0) != 0) | ||||
if (activePlugins.contains ((void*) au)) // plugin may have been deleted before the UI | if (activePlugins.contains ((void*) au)) // plugin may have been deleted before the UI | ||||
@@ -17007,6 +17007,15 @@ Thread::Thread (const String& threadName) | |||||
Thread::~Thread() | Thread::~Thread() | ||||
{ | { | ||||
/* If your thread class's destructor has been called without first stopping the thread, that | |||||
means that this partially destructed object is still performing some work - and that's not | |||||
unlikely to be a safe approach to take! | |||||
To avoid this type of nastiness, always make sure you call stopThread() before or during | |||||
your subclass's destructor. | |||||
*/ | |||||
jassert (! isThreadRunning()); | |||||
stopThread (100); | stopThread (100); | ||||
} | } | ||||
@@ -25697,6 +25706,7 @@ const String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& ne | |||||
currentSetup = newSetup; | currentSetup = newSetup; | ||||
currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); | currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); | ||||
currentSetup.bufferSize = chooseBestBufferSize (newSetup.bufferSize); | |||||
error = currentAudioDevice->open (inputChannels, | error = currentAudioDevice->open (inputChannels, | ||||
outputChannels, | outputChannels, | ||||
@@ -25734,40 +25744,36 @@ double AudioDeviceManager::chooseBestSampleRate (double rate) const | |||||
jassert (currentAudioDevice != 0); | jassert (currentAudioDevice != 0); | ||||
if (rate > 0) | if (rate > 0) | ||||
{ | |||||
bool ok = false; | |||||
for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | ||||
{ | |||||
const double sr = currentAudioDevice->getSampleRate (i); | |||||
if (currentAudioDevice->getSampleRate (i) == rate) | |||||
return rate; | |||||
if (sr == rate) | |||||
ok = true; | |||||
} | |||||
double lowestAbove44 = 0.0; | |||||
if (! ok) | |||||
rate = 0; | |||||
for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | |||||
{ | |||||
const double sr = currentAudioDevice->getSampleRate (i); | |||||
if (sr >= 44100.0 && (lowestAbove44 == 0 || sr < lowestAbove44)) | |||||
lowestAbove44 = sr; | |||||
} | } | ||||
if (rate == 0) | |||||
{ | |||||
double lowestAbove44 = 0.0; | |||||
if (lowestAbove44 > 0.0) | |||||
return lowestAbove44; | |||||
for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | |||||
{ | |||||
const double sr = currentAudioDevice->getSampleRate (i); | |||||
return currentAudioDevice->getSampleRate (0); | |||||
} | |||||
if (sr >= 44100.0 && (lowestAbove44 == 0 || sr < lowestAbove44)) | |||||
lowestAbove44 = sr; | |||||
} | |||||
int AudioDeviceManager::chooseBestBufferSize (int bufferSize) const | |||||
{ | |||||
jassert (currentAudioDevice != 0); | |||||
if (lowestAbove44 == 0.0) | |||||
rate = currentAudioDevice->getSampleRate (0); | |||||
else | |||||
rate = lowestAbove44; | |||||
} | |||||
if (bufferSize > 0) | |||||
for (int i = currentAudioDevice->getNumBufferSizesAvailable(); --i >= 0;) | |||||
if (currentAudioDevice->getBufferSizeSamples(i) == bufferSize) | |||||
return bufferSize; | |||||
return rate; | |||||
return currentAudioDevice->getDefaultBufferSize(); | |||||
} | } | ||||
void AudioDeviceManager::stopDevice() | void AudioDeviceManager::stopDevice() | ||||
@@ -28897,17 +28903,26 @@ MidiMessage::MidiMessage (const void* src_, int sz, int& numBytesUsed, const uin | |||||
if (byte == 0xf0) | if (byte == 0xf0) | ||||
{ | { | ||||
const uint8* d = src; | const uint8* d = src; | ||||
bool haveReadAllLengthBytes = false; | |||||
while (d < src + sz) | while (d < src + sz) | ||||
{ | { | ||||
if (*d >= 0x80) // stop if we hit a status byte, and don't include it in this message | |||||
if (*d >= 0x80) | |||||
{ | { | ||||
if (*d == 0xf7) // include an 0xf7 if we hit one | |||||
++d; | |||||
if (*d == 0xf7) | |||||
{ | |||||
++d; // include the trailing 0xf7 when we hit it | |||||
break; | |||||
} | |||||
break; | |||||
if (haveReadAllLengthBytes) // if we see a 0x80 bit set after the initial data length | |||||
break; // bytes, assume it's the end of the sysex | |||||
++d; | |||||
continue; | |||||
} | } | ||||
haveReadAllLengthBytes = true; | |||||
++d; | ++d; | ||||
} | } | ||||
@@ -29003,7 +29018,7 @@ void MidiMessage::setChannel (const int channel) throw() | |||||
jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 | jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 | ||||
if ((data[0] & 0xf0) != (uint8) 0xf0) | if ((data[0] & 0xf0) != (uint8) 0xf0) | ||||
data[0] = (uint8) ((data[0] & (uint8)0xf0) | |||||
data[0] = (uint8) ((data[0] & (uint8) 0xf0) | |||||
| (uint8)(channel - 1)); | | (uint8)(channel - 1)); | ||||
} | } | ||||
@@ -39004,7 +39019,7 @@ Message::Message (const int intParameter1_, | |||||
{ | { | ||||
} | } | ||||
Message::~Message() throw() | |||||
Message::~Message() | |||||
{ | { | ||||
} | } | ||||
@@ -39101,7 +39116,7 @@ void MessageManager::postMessageToQueue (Message* const message) | |||||
} | } | ||||
CallbackMessage::CallbackMessage() throw() {} | CallbackMessage::CallbackMessage() throw() {} | ||||
CallbackMessage::~CallbackMessage() throw() {} | |||||
CallbackMessage::~CallbackMessage() {} | |||||
void CallbackMessage::post() | void CallbackMessage::post() | ||||
{ | { | ||||
@@ -39856,12 +39871,6 @@ BEGIN_JUCE_NAMESPACE | |||||
#define checkMessageManagerIsLocked jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | #define checkMessageManagerIsLocked jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
enum ComponentMessageNumbers | |||||
{ | |||||
customCommandMessage = 0x7fff0001, | |||||
exitModalStateMessage = 0x7fff0002 | |||||
}; | |||||
Component* Component::currentlyFocusedComponent = 0; | Component* Component::currentlyFocusedComponent = 0; | ||||
class Component::MouseListenerList | class Component::MouseListenerList | ||||
@@ -40157,11 +40166,6 @@ bool Component::isShowing() const | |||||
return false; | return false; | ||||
} | } | ||||
bool Component::isValidComponent() const | |||||
{ | |||||
return (this != 0) && isValidMessageListener(); | |||||
} | |||||
void* Component::getWindowHandle() const | void* Component::getWindowHandle() const | ||||
{ | { | ||||
const ComponentPeer* const peer = getPeer(); | const ComponentPeer* const peer = getPeer(); | ||||
@@ -41058,12 +41062,6 @@ Component* Component::getTopLevelComponent() const throw() | |||||
bool Component::isParentOf (const Component* possibleChild) const throw() | bool Component::isParentOf (const Component* possibleChild) const throw() | ||||
{ | { | ||||
if (! possibleChild->isValidComponent()) | |||||
{ | |||||
jassert (possibleChild == 0); | |||||
return false; | |||||
} | |||||
while (possibleChild != 0) | while (possibleChild != 0) | ||||
{ | { | ||||
possibleChild = possibleChild->parentComponent_; | possibleChild = possibleChild->parentComponent_; | ||||
@@ -41184,7 +41182,27 @@ void Component::exitModalState (const int returnValue) | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
postMessage (new Message (exitModalStateMessage, returnValue, 0, 0)); | |||||
class ExitModalStateMessage : public CallbackMessage | |||||
{ | |||||
public: | |||||
ExitModalStateMessage (Component* const target_, const int result_) | |||||
: target (target_), result (result_) {} | |||||
void messageCallback() | |||||
{ | |||||
if (target != 0) | |||||
target->exitModalState (result); | |||||
} | |||||
private: | |||||
Component::SafePointer<Component> target; | |||||
const int result; | |||||
ExitModalStateMessage (ExitModalStateMessage&); | |||||
ExitModalStateMessage& operator= (const ExitModalStateMessage&); | |||||
}; | |||||
(new ExitModalStateMessage (this, returnValue))->post(); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -41555,22 +41573,21 @@ void Component::sendLookAndFeelChange() | |||||
{ | { | ||||
repaint(); | repaint(); | ||||
lookAndFeelChanged(); | |||||
// (it's not a great idea to do anything that would delete this component | |||||
// during the lookAndFeelChanged() callback) | |||||
jassert (isValidComponent()); | |||||
SafePointer<Component> safePointer (this); | SafePointer<Component> safePointer (this); | ||||
for (int i = childComponentList_.size(); --i >= 0;) | |||||
lookAndFeelChanged(); | |||||
if (safePointer != 0) | |||||
{ | { | ||||
childComponentList_.getUnchecked (i)->sendLookAndFeelChange(); | |||||
for (int i = childComponentList_.size(); --i >= 0;) | |||||
{ | |||||
childComponentList_.getUnchecked (i)->sendLookAndFeelChange(); | |||||
if (safePointer == 0) | |||||
return; | |||||
if (safePointer == 0) | |||||
return; | |||||
i = jmin (i, childComponentList_.size()); | |||||
i = jmin (i, childComponentList_.size()); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -41814,13 +41831,11 @@ void Component::parentSizeChanged() | |||||
void Component::addComponentListener (ComponentListener* const newListener) | void Component::addComponentListener (ComponentListener* const newListener) | ||||
{ | { | ||||
jassert (isValidComponent()); | |||||
componentListeners.add (newListener); | componentListeners.add (newListener); | ||||
} | } | ||||
void Component::removeComponentListener (ComponentListener* const listenerToRemove) | void Component::removeComponentListener (ComponentListener* const listenerToRemove) | ||||
{ | { | ||||
jassert (isValidComponent()); | |||||
componentListeners.remove (listenerToRemove); | componentListeners.remove (listenerToRemove); | ||||
} | } | ||||
@@ -41855,21 +41870,29 @@ void Component::paintOverChildren (Graphics&) | |||||
// all painting is done in the subclasses | // all painting is done in the subclasses | ||||
} | } | ||||
void Component::handleMessage (const Message& message) | |||||
void Component::postCommandMessage (const int commandId) | |||||
{ | { | ||||
if (message.intParameter1 == exitModalStateMessage) | |||||
{ | |||||
exitModalState (message.intParameter2); | |||||
} | |||||
else if (message.intParameter1 == customCommandMessage) | |||||
class CustomCommandMessage : public CallbackMessage | |||||
{ | { | ||||
handleCommandMessage (message.intParameter2); | |||||
} | |||||
} | |||||
public: | |||||
CustomCommandMessage (Component* const target_, const int commandId_) | |||||
: target (target_), commandId (commandId_) {} | |||||
void Component::postCommandMessage (const int commandId) | |||||
{ | |||||
postMessage (new Message (customCommandMessage, commandId, 0, 0)); | |||||
void messageCallback() | |||||
{ | |||||
if (target != 0) | |||||
target->exitModalState (commandId); | |||||
} | |||||
private: | |||||
Component::SafePointer<Component> target; | |||||
const int commandId; | |||||
CustomCommandMessage (CustomCommandMessage&); | |||||
CustomCommandMessage& operator= (const CustomCommandMessage&); | |||||
}; | |||||
(new CustomCommandMessage (this, commandId))->post(); | |||||
} | } | ||||
void Component::handleCommandMessage (int) | void Component::handleCommandMessage (int) | ||||
@@ -42247,9 +42270,6 @@ void Component::broughtToFront() | |||||
void Component::internalBroughtToFront() | void Component::internalBroughtToFront() | ||||
{ | { | ||||
if (! isValidComponent()) | |||||
return; | |||||
if (flags.hasHeavyweightPeerFlag) | if (flags.hasHeavyweightPeerFlag) | ||||
Desktop::getInstance().componentBroughtToFront (this); | Desktop::getInstance().componentBroughtToFront (this); | ||||
@@ -42821,10 +42841,14 @@ Component* Desktop::findComponentAt (const Point<int>& screenPosition) const | |||||
for (int i = desktopComponents.size(); --i >= 0;) | for (int i = desktopComponents.size(); --i >= 0;) | ||||
{ | { | ||||
Component* const c = desktopComponents.getUnchecked(i); | Component* const c = desktopComponents.getUnchecked(i); | ||||
const Point<int> relative (c->globalPositionToRelative (screenPosition)); | |||||
if (c->contains (relative.getX(), relative.getY())) | |||||
return c->getComponentAt (relative.getX(), relative.getY()); | |||||
if (c->isVisible()) | |||||
{ | |||||
const Point<int> relative (c->globalPositionToRelative (screenPosition)); | |||||
if (c->contains (relative.getX(), relative.getY())) | |||||
return c->getComponentAt (relative.getX(), relative.getY()); | |||||
} | |||||
} | } | ||||
return 0; | return 0; | ||||
@@ -42991,12 +43015,10 @@ void Desktop::setKioskModeComponent (Component* componentToUse, const bool allow | |||||
{ | { | ||||
if (kioskModeComponent != componentToUse) | if (kioskModeComponent != componentToUse) | ||||
{ | { | ||||
// agh! Don't delete a component without first stopping it being the kiosk comp | |||||
jassert (kioskModeComponent == 0 || kioskModeComponent->isValidComponent()); | |||||
// agh! Don't remove a component from the desktop if it's the kiosk comp! | |||||
jassert (kioskModeComponent == 0 || kioskModeComponent->isOnDesktop()); | |||||
// agh! Don't delete or remove a component from the desktop while it's still the kiosk component! | |||||
jassert (kioskModeComponent == 0 || ComponentPeer::getPeerFor (kioskModeComponent) != 0); | |||||
if (kioskModeComponent->isValidComponent()) | |||||
if (kioskModeComponent != 0) | |||||
{ | { | ||||
juce_setKioskComponent (kioskModeComponent, false, allowMenusAndBars); | juce_setKioskComponent (kioskModeComponent, false, allowMenusAndBars); | ||||
@@ -43007,10 +43029,8 @@ void Desktop::setKioskModeComponent (Component* componentToUse, const bool allow | |||||
if (kioskModeComponent != 0) | if (kioskModeComponent != 0) | ||||
{ | { | ||||
jassert (kioskModeComponent->isValidComponent()); | |||||
// Only components that are already on the desktop can be put into kiosk mode! | // Only components that are already on the desktop can be put into kiosk mode! | ||||
jassert (kioskModeComponent->isOnDesktop()); | |||||
jassert (ComponentPeer::getPeerFor (kioskModeComponent) != 0); | |||||
kioskComponentOriginalBounds = kioskModeComponent->getBounds(); | kioskComponentOriginalBounds = kioskModeComponent->getBounds(); | ||||
@@ -55041,7 +55061,7 @@ class Toolbar::MissingItemsComponent : public PopupMenuCustomComponent | |||||
public: | public: | ||||
MissingItemsComponent (Toolbar& owner_, const int height_) | MissingItemsComponent (Toolbar& owner_, const int height_) | ||||
: PopupMenuCustomComponent (true), | : PopupMenuCustomComponent (true), | ||||
owner (owner_), | |||||
owner (&owner_), | |||||
height (height_) | height (height_) | ||||
{ | { | ||||
for (int i = owner_.items.size(); --i >= 0;) | for (int i = owner_.items.size(); --i >= 0;) | ||||
@@ -55060,23 +55080,23 @@ public: | |||||
~MissingItemsComponent() | ~MissingItemsComponent() | ||||
{ | { | ||||
// deleting the toolbar while its menu it open?? | |||||
jassert (owner.isValidComponent()); | |||||
for (int i = 0; i < getNumChildComponents(); ++i) | |||||
if (owner != 0) | |||||
{ | { | ||||
ToolbarItemComponent* const tc = dynamic_cast <ToolbarItemComponent*> (getChildComponent (i)); | |||||
if (tc != 0) | |||||
for (int i = 0; i < getNumChildComponents(); ++i) | |||||
{ | { | ||||
tc->setVisible (false); | |||||
const int index = oldIndexes.remove (i); | |||||
owner.addChildComponent (tc, index); | |||||
--i; | |||||
ToolbarItemComponent* const tc = dynamic_cast <ToolbarItemComponent*> (getChildComponent (i)); | |||||
if (tc != 0) | |||||
{ | |||||
tc->setVisible (false); | |||||
const int index = oldIndexes.remove (i); | |||||
owner->addChildComponent (tc, index); | |||||
--i; | |||||
} | |||||
} | } | ||||
} | |||||
owner.resized(); | |||||
owner->resized(); | |||||
} | |||||
} | } | ||||
void layout (const int preferredWidth) | void layout (const int preferredWidth) | ||||
@@ -55122,7 +55142,7 @@ public: | |||||
juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
private: | private: | ||||
Toolbar& owner; | |||||
Component::SafePointer<Toolbar> owner; | |||||
const int height; | const int height; | ||||
Array <int> oldIndexes; | Array <int> oldIndexes; | ||||
@@ -55745,10 +55765,17 @@ void Toolbar::showCustomisationDialog (ToolbarItemFactory& factory, const int op | |||||
{ | { | ||||
setEditingActive (true); | setEditingActive (true); | ||||
#if JUCE_DEBUG | |||||
Component::SafePointer<Component> checker (this); | |||||
#endif | |||||
ToolbarCustomisationDialog dw (factory, this, optionFlags); | ToolbarCustomisationDialog dw (factory, this, optionFlags); | ||||
dw.runModalLoop(); | dw.runModalLoop(); | ||||
jassert (isValidComponent()); // ? deleting the toolbar while it's being edited? | |||||
#if JUCE_DEBUG | |||||
jassert (checker != 0); // Don't delete the toolbar while it's being customised! | |||||
#endif | |||||
setEditingActive (false); | setEditingActive (false); | ||||
} | } | ||||
@@ -55883,7 +55910,6 @@ ToolbarItemComponent::ToolbarItemComponent (const int itemId_, | |||||
ToolbarItemComponent::~ToolbarItemComponent() | ToolbarItemComponent::~ToolbarItemComponent() | ||||
{ | { | ||||
jassert (overlayComp == 0 || overlayComp->isValidComponent()); | |||||
overlayComp = 0; | overlayComp = 0; | ||||
} | } | ||||
@@ -55971,7 +55997,6 @@ void ToolbarItemComponent::setEditingMode (const ToolbarEditingMode newMode) | |||||
if (mode == normalMode) | if (mode == normalMode) | ||||
{ | { | ||||
jassert (overlayComp == 0 || overlayComp->isValidComponent()); | |||||
overlayComp = 0; | overlayComp = 0; | ||||
} | } | ||||
else if (overlayComp == 0) | else if (overlayComp == 0) | ||||
@@ -64333,8 +64358,7 @@ private: | |||||
}; | }; | ||||
TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation) | TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation) | ||||
: panelComponent (0), | |||||
tabDepth (30), | |||||
: tabDepth (30), | |||||
outlineThickness (1), | outlineThickness (1), | ||||
edgeIndent (0) | edgeIndent (0) | ||||
{ | { | ||||
@@ -64387,13 +64411,10 @@ void TabbedComponent::clearTabs() | |||||
for (int i = contentComponents.size(); --i >= 0;) | for (int i = contentComponents.size(); --i >= 0;) | ||||
{ | { | ||||
Component* const c = contentComponents.getUnchecked(i); | |||||
// be careful not to delete these components until they've been removed from the tab component | |||||
jassert (c == 0 || c->isValidComponent()); | |||||
Component::SafePointer<Component>& c = contentComponents.getReference (i); | |||||
if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | ||||
delete c; | |||||
c.deleteAndZero(); | |||||
} | } | ||||
contentComponents.clear(); | contentComponents.clear(); | ||||
@@ -64420,19 +64441,16 @@ void TabbedComponent::setTabName (const int tabIndex, const String& newName) | |||||
void TabbedComponent::removeTab (const int tabIndex) | void TabbedComponent::removeTab (const int tabIndex) | ||||
{ | { | ||||
Component* const c = contentComponents [tabIndex]; | |||||
if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | |||||
if (tabIndex >= 0 && tabIndex < contentComponents.size()) | |||||
{ | { | ||||
if (c == panelComponent) | |||||
panelComponent = 0; | |||||
delete c; | |||||
} | |||||
Component::SafePointer<Component>& c = contentComponents.getReference (tabIndex); | |||||
contentComponents.remove (tabIndex); | |||||
if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | |||||
c.deleteAndZero(); | |||||
tabs->removeTab (tabIndex); | |||||
contentComponents.remove (tabIndex); | |||||
tabs->removeTab (tabIndex); | |||||
} | |||||
} | } | ||||
int TabbedComponent::getNumTabs() const | int TabbedComponent::getNumTabs() const | ||||
@@ -64558,15 +64576,15 @@ void TabbedComponent::resized() | |||||
const Rectangle<int> bounds (indents.subtractedFrom (getLocalBounds())); | const Rectangle<int> bounds (indents.subtractedFrom (getLocalBounds())); | ||||
for (int i = contentComponents.size(); --i >= 0;) | for (int i = contentComponents.size(); --i >= 0;) | ||||
if (contentComponents.getUnchecked (i) != 0) | |||||
contentComponents.getUnchecked (i)->setBounds (bounds); | |||||
if (contentComponents.getReference (i) != 0) | |||||
contentComponents.getReference (i)->setBounds (bounds); | |||||
} | } | ||||
void TabbedComponent::lookAndFeelChanged() | void TabbedComponent::lookAndFeelChanged() | ||||
{ | { | ||||
for (int i = contentComponents.size(); --i >= 0;) | for (int i = contentComponents.size(); --i >= 0;) | ||||
if (contentComponents.getUnchecked (i) != 0) | |||||
contentComponents.getUnchecked (i)->lookAndFeelChanged(); | |||||
if (contentComponents.getReference (i) != 0) | |||||
contentComponents.getReference (i)->lookAndFeelChanged(); | |||||
} | } | ||||
void TabbedComponent::changeCallback (const int newCurrentTabIndex, | void TabbedComponent::changeCallback (const int newCurrentTabIndex, | ||||
@@ -69200,12 +69218,8 @@ public: | |||||
~Window() | ~Window() | ||||
{ | { | ||||
getActiveWindows().removeValue (this); | getActiveWindows().removeValue (this); | ||||
Desktop::getInstance().removeGlobalMouseListener (this); | Desktop::getInstance().removeGlobalMouseListener (this); | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
activeSubMenu = 0; | activeSubMenu = 0; | ||||
deleteAllChildren(); | deleteAllChildren(); | ||||
} | } | ||||
@@ -69322,8 +69336,6 @@ public: | |||||
{ | { | ||||
if (isVisible()) | if (isVisible()) | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
activeSubMenu = 0; | activeSubMenu = 0; | ||||
currentChild = 0; | currentChild = 0; | ||||
@@ -69423,8 +69435,6 @@ public: | |||||
if (showSubMenuFor (currentChild)) | if (showSubMenuFor (currentChild)) | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
if (activeSubMenu != 0 && activeSubMenu->isVisible()) | if (activeSubMenu != 0 && activeSubMenu->isVisible()) | ||||
activeSubMenu->selectNextItem (1); | activeSubMenu->selectNextItem (1); | ||||
} | } | ||||
@@ -69512,7 +69522,7 @@ public: | |||||
if (now > timeEnteredCurrentChildComp + 100 | if (now > timeEnteredCurrentChildComp + 100 | ||||
&& reallyContains (localMousePos.getX(), localMousePos.getY(), true) | && reallyContains (localMousePos.getX(), localMousePos.getY(), true) | ||||
&& currentChild->isValidComponent() | |||||
&& currentChild != 0 | |||||
&& (! disableMouseMoves) | && (! disableMouseMoves) | ||||
&& ! (activeSubMenu != 0 && activeSubMenu->isVisible())) | && ! (activeSubMenu != 0 && activeSubMenu->isVisible())) | ||||
{ | { | ||||
@@ -69668,8 +69678,6 @@ private: | |||||
bool isOverChildren() const | bool isOverChildren() const | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
return isVisible() | return isVisible() | ||||
&& (isOver || (activeSubMenu != 0 && activeSubMenu->isOverChildren())); | && (isOver || (activeSubMenu != 0 && activeSubMenu->isOverChildren())); | ||||
} | } | ||||
@@ -69982,7 +69990,7 @@ private: | |||||
void setCurrentlyHighlightedChild (PopupMenu::ItemComponent* const child) | void setCurrentlyHighlightedChild (PopupMenu::ItemComponent* const child) | ||||
{ | { | ||||
if (currentChild->isValidComponent()) | |||||
if (currentChild != 0) | |||||
currentChild->setHighlighted (false); | currentChild->setHighlighted (false); | ||||
currentChild = child; | currentChild = child; | ||||
@@ -69996,10 +70004,9 @@ private: | |||||
bool showSubMenuFor (PopupMenu::ItemComponent* const childComp) | bool showSubMenuFor (PopupMenu::ItemComponent* const childComp) | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
activeSubMenu = 0; | activeSubMenu = 0; | ||||
if (childComp->isValidComponent() && childComp->itemInfo.hasActiveSubMenu()) | |||||
if (childComp != 0 && childComp->itemInfo.hasActiveSubMenu()) | |||||
{ | { | ||||
activeSubMenu = Window::create (*(childComp->itemInfo.subMenu), | activeSubMenu = Window::create (*(childComp->itemInfo.subMenu), | ||||
dismissOnMouseUp, | dismissOnMouseUp, | ||||
@@ -70042,8 +70049,6 @@ private: | |||||
bool isMovingTowardsMenu = false; | bool isMovingTowardsMenu = false; | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()) | |||||
if (isOver && (activeSubMenu != 0) && globalMousePos != lastMouse) | if (isOver && (activeSubMenu != 0) && globalMousePos != lastMouse) | ||||
{ | { | ||||
// try to intelligently guess whether the user is moving the mouse towards a currently-open | // try to intelligently guess whether the user is moving the mouse towards a currently-open | ||||
@@ -70104,7 +70109,7 @@ private: | |||||
void triggerCurrentlyHighlightedItem() | void triggerCurrentlyHighlightedItem() | ||||
{ | { | ||||
if (currentChild->isValidComponent() | |||||
if (currentChild != 0 | |||||
&& currentChild->itemInfo.canBeTriggered() | && currentChild->itemInfo.canBeTriggered() | ||||
&& (currentChild->itemInfo.customComp == 0 | && (currentChild->itemInfo.customComp == 0 | ||||
|| currentChild->itemInfo.customComp->isTriggeredAutomatically)) | || currentChild->itemInfo.customComp->isTriggeredAutomatically)) | ||||
@@ -70679,7 +70684,7 @@ ComponentDragger::~ComponentDragger() | |||||
void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | ||||
ComponentBoundsConstrainer* const constrainer_) | ComponentBoundsConstrainer* const constrainer_) | ||||
{ | { | ||||
jassert (componentToDrag->isValidComponent()); | |||||
jassert (componentToDrag != 0); | |||||
if (componentToDrag != 0) | if (componentToDrag != 0) | ||||
{ | { | ||||
@@ -70690,7 +70695,7 @@ void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | |||||
void ComponentDragger::dragComponent (Component* const componentToDrag, const MouseEvent& e) | void ComponentDragger::dragComponent (Component* const componentToDrag, const MouseEvent& e) | ||||
{ | { | ||||
jassert (componentToDrag->isValidComponent()); | |||||
jassert (componentToDrag != 0); | |||||
jassert (e.mods.isAnyMouseButtonDown()); // (the event has to be a drag event..) | jassert (e.mods.isAnyMouseButtonDown()); // (the event has to be a drag event..) | ||||
if (componentToDrag != 0) | if (componentToDrag != 0) | ||||
@@ -71960,12 +71965,7 @@ void MouseHoverDetector::setHoverComponent (Component* const newSourceComponent) | |||||
hasJustHovered = false; | hasJustHovered = false; | ||||
if (source != 0) | if (source != 0) | ||||
{ | |||||
// ! you need to delete the hover detector before deleting its component | |||||
jassert (source->isValidComponent()); | |||||
source->removeMouseListener (&internalTimer); | source->removeMouseListener (&internalTimer); | ||||
} | |||||
source = newSourceComponent; | source = newSourceComponent; | ||||
@@ -74086,7 +74086,7 @@ void BubbleComponent::setAllowedPlacement (const int newPlacement) | |||||
void BubbleComponent::setPosition (Component* componentToPointTo) | void BubbleComponent::setPosition (Component* componentToPointTo) | ||||
{ | { | ||||
jassert (componentToPointTo->isValidComponent()); | |||||
jassert (componentToPointTo != 0); | |||||
Point<int> pos; | Point<int> pos; | ||||
@@ -77911,7 +77911,6 @@ void ComponentPeer::setConstrainer (ComponentBoundsConstrainer* const newConstra | |||||
void ComponentPeer::handleMovedOrResized() | void ComponentPeer::handleMovedOrResized() | ||||
{ | { | ||||
jassert (component->isValidComponent()); | |||||
updateCurrentModifiers(); | updateCurrentModifiers(); | ||||
const bool nowMinimised = isMinimised(); | const bool nowMinimised = isMinimised(); | ||||
@@ -258310,8 +258309,6 @@ public: | |||||
if (! XInitImage (xImage)) | if (! XInitImage (xImage)) | ||||
jassertfalse; | jassertfalse; | ||||
} | } | ||||
zeromem (imageData, h * lineStride); | |||||
} | } | ||||
~XBitmapImage() | ~XBitmapImage() | ||||
@@ -64,7 +64,7 @@ | |||||
*/ | */ | ||||
#define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
#define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
#define JUCE_BUILDNUMBER 84 | |||||
#define JUCE_BUILDNUMBER 85 | |||||
/** Current Juce version number. | /** Current Juce version number. | ||||
@@ -12256,7 +12256,7 @@ public: | |||||
void* pointerParameter) throw(); | void* pointerParameter) throw(); | ||||
/** Destructor. */ | /** Destructor. */ | ||||
virtual ~Message() throw(); | |||||
virtual ~Message(); | |||||
// These values can be used for carrying simple data that the application needs to | // These values can be used for carrying simple data that the application needs to | ||||
// pass around. For more complex messages, just create a subclass. | // pass around. For more complex messages, just create a subclass. | ||||
@@ -25998,8 +25998,7 @@ class ComponentPeer; | |||||
The base class for all JUCE user-interface objects. | The base class for all JUCE user-interface objects. | ||||
*/ | */ | ||||
class JUCE_API Component : public MouseListener, | |||||
public MessageListener | |||||
class JUCE_API Component : public MouseListener | |||||
{ | { | ||||
public: | public: | ||||
@@ -26052,18 +26051,6 @@ public: | |||||
*/ | */ | ||||
virtual void setName (const String& newName); | virtual void setName (const String& newName); | ||||
/** Checks whether this Component object has been deleted. | |||||
This will check whether this object is still a valid component, or whether | |||||
it's been deleted. | |||||
It's safe to call this on null or dangling pointers, but note that there is a | |||||
small risk if another new (but different) component has been created at the | |||||
same memory address which this one occupied, this methods can return a | |||||
false positive. | |||||
*/ | |||||
bool isValidComponent() const; | |||||
/** Makes the component visible or invisible. | /** Makes the component visible or invisible. | ||||
This method will show or hide the component. | This method will show or hide the component. | ||||
@@ -28009,16 +27996,8 @@ private: | |||||
protected: | protected: | ||||
/** @internal */ | /** @internal */ | ||||
virtual void internalRepaint (int x, int y, int w, int h); | virtual void internalRepaint (int x, int y, int w, int h); | ||||
/** @internal */ | |||||
virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | ||||
/** Overridden from the MessageListener parent class. | |||||
You can override this if you really need to, but be sure to pass your unwanted messages up | |||||
to this base class implementation, as the Component class needs to send itself messages | |||||
to work properly. | |||||
*/ | |||||
void handleMessage (const Message&); | |||||
}; | }; | ||||
#endif // __JUCE_COMPONENT_JUCEHEADER__ | #endif // __JUCE_COMPONENT_JUCEHEADER__ | ||||
@@ -38881,6 +38860,7 @@ private: | |||||
void scanDevicesIfNeeded(); | void scanDevicesIfNeeded(); | ||||
void deleteCurrentDevice(); | void deleteCurrentDevice(); | ||||
double chooseBestSampleRate (double preferred) const; | double chooseBestSampleRate (double preferred) const; | ||||
int chooseBestBufferSize (int preferred) const; | |||||
void insertDefaultDeviceNames (AudioDeviceSetup& setup) const; | void insertDefaultDeviceNames (AudioDeviceSetup& setup) const; | ||||
AudioIODeviceType* findType (const String& inputName, const String& outputName); | AudioIODeviceType* findType (const String& inputName, const String& outputName); | ||||
@@ -43432,7 +43412,7 @@ public: | |||||
CallbackMessage() throw(); | CallbackMessage() throw(); | ||||
/** Destructor. */ | /** Destructor. */ | ||||
~CallbackMessage() throw(); | |||||
~CallbackMessage(); | |||||
/** Called when the message is delivered. | /** Called when the message is delivered. | ||||
@@ -53273,8 +53253,8 @@ protected: | |||||
private: | private: | ||||
Array <Component*> contentComponents; | |||||
Component* panelComponent; | |||||
Array <Component::SafePointer<Component> > contentComponents; | |||||
Component::SafePointer<Component> panelComponent; | |||||
int tabDepth; | int tabDepth; | ||||
int outlineThickness, edgeIndent; | int outlineThickness, edgeIndent; | ||||
static const Identifier deleteComponentId; | static const Identifier deleteComponentId; | ||||
@@ -59311,6 +59291,7 @@ private: | |||||
bool fakeMouseMessageSent : 1, isWindowMinimised : 1; | bool fakeMouseMessageSent : 1, isWindowMinimised : 1; | ||||
friend class Component; | friend class Component; | ||||
friend class Desktop; | |||||
static ComponentPeer* getPeerFor (const Component* component) throw(); | static ComponentPeer* getPeerFor (const Component* component) throw(); | ||||
void setLastDragDropTarget (Component* comp); | void setLastDragDropTarget (Component* comp); | ||||
@@ -443,6 +443,7 @@ const String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& ne | |||||
currentSetup = newSetup; | currentSetup = newSetup; | ||||
currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); | currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); | ||||
currentSetup.bufferSize = chooseBestBufferSize (newSetup.bufferSize); | |||||
error = currentAudioDevice->open (inputChannels, | error = currentAudioDevice->open (inputChannels, | ||||
outputChannels, | outputChannels, | ||||
@@ -480,40 +481,36 @@ double AudioDeviceManager::chooseBestSampleRate (double rate) const | |||||
jassert (currentAudioDevice != 0); | jassert (currentAudioDevice != 0); | ||||
if (rate > 0) | if (rate > 0) | ||||
{ | |||||
bool ok = false; | |||||
for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | ||||
{ | |||||
const double sr = currentAudioDevice->getSampleRate (i); | |||||
if (currentAudioDevice->getSampleRate (i) == rate) | |||||
return rate; | |||||
if (sr == rate) | |||||
ok = true; | |||||
} | |||||
double lowestAbove44 = 0.0; | |||||
if (! ok) | |||||
rate = 0; | |||||
for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | |||||
{ | |||||
const double sr = currentAudioDevice->getSampleRate (i); | |||||
if (sr >= 44100.0 && (lowestAbove44 == 0 || sr < lowestAbove44)) | |||||
lowestAbove44 = sr; | |||||
} | } | ||||
if (rate == 0) | |||||
{ | |||||
double lowestAbove44 = 0.0; | |||||
if (lowestAbove44 > 0.0) | |||||
return lowestAbove44; | |||||
for (int i = currentAudioDevice->getNumSampleRates(); --i >= 0;) | |||||
{ | |||||
const double sr = currentAudioDevice->getSampleRate (i); | |||||
return currentAudioDevice->getSampleRate (0); | |||||
} | |||||
if (sr >= 44100.0 && (lowestAbove44 == 0 || sr < lowestAbove44)) | |||||
lowestAbove44 = sr; | |||||
} | |||||
int AudioDeviceManager::chooseBestBufferSize (int bufferSize) const | |||||
{ | |||||
jassert (currentAudioDevice != 0); | |||||
if (lowestAbove44 == 0.0) | |||||
rate = currentAudioDevice->getSampleRate (0); | |||||
else | |||||
rate = lowestAbove44; | |||||
} | |||||
if (bufferSize > 0) | |||||
for (int i = currentAudioDevice->getNumBufferSizesAvailable(); --i >= 0;) | |||||
if (currentAudioDevice->getBufferSizeSamples(i) == bufferSize) | |||||
return bufferSize; | |||||
return rate; | |||||
return currentAudioDevice->getDefaultBufferSize(); | |||||
} | } | ||||
void AudioDeviceManager::stopDevice() | void AudioDeviceManager::stopDevice() | ||||
@@ -517,6 +517,7 @@ private: | |||||
void scanDevicesIfNeeded(); | void scanDevicesIfNeeded(); | ||||
void deleteCurrentDevice(); | void deleteCurrentDevice(); | ||||
double chooseBestSampleRate (double preferred) const; | double chooseBestSampleRate (double preferred) const; | ||||
int chooseBestBufferSize (int preferred) const; | |||||
void insertDefaultDeviceNames (AudioDeviceSetup& setup) const; | void insertDefaultDeviceNames (AudioDeviceSetup& setup) const; | ||||
AudioIODeviceType* findType (const String& inputName, const String& outputName); | AudioIODeviceType* findType (const String& inputName, const String& outputName); | ||||
@@ -184,17 +184,26 @@ MidiMessage::MidiMessage (const void* src_, int sz, int& numBytesUsed, const uin | |||||
if (byte == 0xf0) | if (byte == 0xf0) | ||||
{ | { | ||||
const uint8* d = src; | const uint8* d = src; | ||||
bool haveReadAllLengthBytes = false; | |||||
while (d < src + sz) | while (d < src + sz) | ||||
{ | { | ||||
if (*d >= 0x80) // stop if we hit a status byte, and don't include it in this message | |||||
if (*d >= 0x80) | |||||
{ | { | ||||
if (*d == 0xf7) // include an 0xf7 if we hit one | |||||
++d; | |||||
if (*d == 0xf7) | |||||
{ | |||||
++d; // include the trailing 0xf7 when we hit it | |||||
break; | |||||
} | |||||
break; | |||||
if (haveReadAllLengthBytes) // if we see a 0x80 bit set after the initial data length | |||||
break; // bytes, assume it's the end of the sysex | |||||
++d; | |||||
continue; | |||||
} | } | ||||
haveReadAllLengthBytes = true; | |||||
++d; | ++d; | ||||
} | } | ||||
@@ -290,7 +299,7 @@ void MidiMessage::setChannel (const int channel) throw() | |||||
jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 | jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 | ||||
if ((data[0] & 0xf0) != (uint8) 0xf0) | if ((data[0] & 0xf0) != (uint8) 0xf0) | ||||
data[0] = (uint8) ((data[0] & (uint8)0xf0) | |||||
data[0] = (uint8) ((data[0] & (uint8) 0xf0) | |||||
| (uint8)(channel - 1)); | | (uint8)(channel - 1)); | ||||
} | } | ||||
@@ -33,7 +33,7 @@ | |||||
*/ | */ | ||||
#define JUCE_MAJOR_VERSION 1 | #define JUCE_MAJOR_VERSION 1 | ||||
#define JUCE_MINOR_VERSION 52 | #define JUCE_MINOR_VERSION 52 | ||||
#define JUCE_BUILDNUMBER 84 | |||||
#define JUCE_BUILDNUMBER 85 | |||||
/** Current Juce version number. | /** Current Juce version number. | ||||
@@ -51,7 +51,7 @@ public: | |||||
CallbackMessage() throw(); | CallbackMessage() throw(); | ||||
/** Destructor. */ | /** Destructor. */ | ||||
~CallbackMessage() throw(); | |||||
~CallbackMessage(); | |||||
//============================================================================== | //============================================================================== | ||||
/** Called when the message is delivered. | /** Called when the message is delivered. | ||||
@@ -50,7 +50,7 @@ Message::Message (const int intParameter1_, | |||||
{ | { | ||||
} | } | ||||
Message::~Message() throw() | |||||
Message::~Message() | |||||
{ | { | ||||
} | } | ||||
@@ -59,7 +59,7 @@ public: | |||||
void* pointerParameter) throw(); | void* pointerParameter) throw(); | ||||
/** Destructor. */ | /** Destructor. */ | ||||
virtual ~Message() throw(); | |||||
virtual ~Message(); | |||||
//============================================================================== | //============================================================================== | ||||
// These values can be used for carrying simple data that the application needs to | // These values can be used for carrying simple data that the application needs to | ||||
@@ -87,7 +87,7 @@ void MessageManager::postMessageToQueue (Message* const message) | |||||
//============================================================================== | //============================================================================== | ||||
CallbackMessage::CallbackMessage() throw() {} | CallbackMessage::CallbackMessage() throw() {} | ||||
CallbackMessage::~CallbackMessage() throw() {} | |||||
CallbackMessage::~CallbackMessage() {} | |||||
void CallbackMessage::post() | void CallbackMessage::post() | ||||
{ | { | ||||
@@ -177,7 +177,7 @@ class Toolbar::MissingItemsComponent : public PopupMenuCustomComponent | |||||
public: | public: | ||||
MissingItemsComponent (Toolbar& owner_, const int height_) | MissingItemsComponent (Toolbar& owner_, const int height_) | ||||
: PopupMenuCustomComponent (true), | : PopupMenuCustomComponent (true), | ||||
owner (owner_), | |||||
owner (&owner_), | |||||
height (height_) | height (height_) | ||||
{ | { | ||||
for (int i = owner_.items.size(); --i >= 0;) | for (int i = owner_.items.size(); --i >= 0;) | ||||
@@ -196,23 +196,23 @@ public: | |||||
~MissingItemsComponent() | ~MissingItemsComponent() | ||||
{ | { | ||||
// deleting the toolbar while its menu it open?? | |||||
jassert (owner.isValidComponent()); | |||||
for (int i = 0; i < getNumChildComponents(); ++i) | |||||
if (owner != 0) | |||||
{ | { | ||||
ToolbarItemComponent* const tc = dynamic_cast <ToolbarItemComponent*> (getChildComponent (i)); | |||||
if (tc != 0) | |||||
for (int i = 0; i < getNumChildComponents(); ++i) | |||||
{ | { | ||||
tc->setVisible (false); | |||||
const int index = oldIndexes.remove (i); | |||||
owner.addChildComponent (tc, index); | |||||
--i; | |||||
ToolbarItemComponent* const tc = dynamic_cast <ToolbarItemComponent*> (getChildComponent (i)); | |||||
if (tc != 0) | |||||
{ | |||||
tc->setVisible (false); | |||||
const int index = oldIndexes.remove (i); | |||||
owner->addChildComponent (tc, index); | |||||
--i; | |||||
} | |||||
} | } | ||||
} | |||||
owner.resized(); | |||||
owner->resized(); | |||||
} | |||||
} | } | ||||
void layout (const int preferredWidth) | void layout (const int preferredWidth) | ||||
@@ -258,7 +258,7 @@ public: | |||||
juce_UseDebuggingNewOperator | juce_UseDebuggingNewOperator | ||||
private: | private: | ||||
Toolbar& owner; | |||||
Component::SafePointer<Toolbar> owner; | |||||
const int height; | const int height; | ||||
Array <int> oldIndexes; | Array <int> oldIndexes; | ||||
@@ -890,10 +890,17 @@ void Toolbar::showCustomisationDialog (ToolbarItemFactory& factory, const int op | |||||
{ | { | ||||
setEditingActive (true); | setEditingActive (true); | ||||
#if JUCE_DEBUG | |||||
Component::SafePointer<Component> checker (this); | |||||
#endif | |||||
ToolbarCustomisationDialog dw (factory, this, optionFlags); | ToolbarCustomisationDialog dw (factory, this, optionFlags); | ||||
dw.runModalLoop(); | dw.runModalLoop(); | ||||
jassert (isValidComponent()); // ? deleting the toolbar while it's being edited? | |||||
#if JUCE_DEBUG | |||||
jassert (checker != 0); // Don't delete the toolbar while it's being customised! | |||||
#endif | |||||
setEditingActive (false); | setEditingActive (false); | ||||
} | } | ||||
@@ -165,7 +165,6 @@ ToolbarItemComponent::ToolbarItemComponent (const int itemId_, | |||||
ToolbarItemComponent::~ToolbarItemComponent() | ToolbarItemComponent::~ToolbarItemComponent() | ||||
{ | { | ||||
jassert (overlayComp == 0 || overlayComp->isValidComponent()); | |||||
overlayComp = 0; | overlayComp = 0; | ||||
} | } | ||||
@@ -253,7 +252,6 @@ void ToolbarItemComponent::setEditingMode (const ToolbarEditingMode newMode) | |||||
if (mode == normalMode) | if (mode == normalMode) | ||||
{ | { | ||||
jassert (overlayComp == 0 || overlayComp->isValidComponent()); | |||||
overlayComp = 0; | overlayComp = 0; | ||||
} | } | ||||
else if (overlayComp == 0) | else if (overlayComp == 0) | ||||
@@ -46,12 +46,6 @@ BEGIN_JUCE_NAMESPACE | |||||
//============================================================================== | //============================================================================== | ||||
#define checkMessageManagerIsLocked jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | #define checkMessageManagerIsLocked jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | ||||
enum ComponentMessageNumbers | |||||
{ | |||||
customCommandMessage = 0x7fff0001, | |||||
exitModalStateMessage = 0x7fff0002 | |||||
}; | |||||
Component* Component::currentlyFocusedComponent = 0; | Component* Component::currentlyFocusedComponent = 0; | ||||
@@ -353,11 +347,6 @@ bool Component::isShowing() const | |||||
//============================================================================== | //============================================================================== | ||||
bool Component::isValidComponent() const | |||||
{ | |||||
return (this != 0) && isValidMessageListener(); | |||||
} | |||||
void* Component::getWindowHandle() const | void* Component::getWindowHandle() const | ||||
{ | { | ||||
const ComponentPeer* const peer = getPeer(); | const ComponentPeer* const peer = getPeer(); | ||||
@@ -1264,12 +1253,6 @@ Component* Component::getTopLevelComponent() const throw() | |||||
bool Component::isParentOf (const Component* possibleChild) const throw() | bool Component::isParentOf (const Component* possibleChild) const throw() | ||||
{ | { | ||||
if (! possibleChild->isValidComponent()) | |||||
{ | |||||
jassert (possibleChild == 0); | |||||
return false; | |||||
} | |||||
while (possibleChild != 0) | while (possibleChild != 0) | ||||
{ | { | ||||
possibleChild = possibleChild->parentComponent_; | possibleChild = possibleChild->parentComponent_; | ||||
@@ -1392,7 +1375,27 @@ void Component::exitModalState (const int returnValue) | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
postMessage (new Message (exitModalStateMessage, returnValue, 0, 0)); | |||||
class ExitModalStateMessage : public CallbackMessage | |||||
{ | |||||
public: | |||||
ExitModalStateMessage (Component* const target_, const int result_) | |||||
: target (target_), result (result_) {} | |||||
void messageCallback() | |||||
{ | |||||
if (target != 0) | |||||
target->exitModalState (result); | |||||
} | |||||
private: | |||||
Component::SafePointer<Component> target; | |||||
const int result; | |||||
ExitModalStateMessage (ExitModalStateMessage&); | |||||
ExitModalStateMessage& operator= (const ExitModalStateMessage&); | |||||
}; | |||||
(new ExitModalStateMessage (this, returnValue))->post(); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -1770,22 +1773,21 @@ void Component::sendLookAndFeelChange() | |||||
{ | { | ||||
repaint(); | repaint(); | ||||
lookAndFeelChanged(); | |||||
// (it's not a great idea to do anything that would delete this component | |||||
// during the lookAndFeelChanged() callback) | |||||
jassert (isValidComponent()); | |||||
SafePointer<Component> safePointer (this); | SafePointer<Component> safePointer (this); | ||||
for (int i = childComponentList_.size(); --i >= 0;) | |||||
lookAndFeelChanged(); | |||||
if (safePointer != 0) | |||||
{ | { | ||||
childComponentList_.getUnchecked (i)->sendLookAndFeelChange(); | |||||
for (int i = childComponentList_.size(); --i >= 0;) | |||||
{ | |||||
childComponentList_.getUnchecked (i)->sendLookAndFeelChange(); | |||||
if (safePointer == 0) | |||||
return; | |||||
if (safePointer == 0) | |||||
return; | |||||
i = jmin (i, childComponentList_.size()); | |||||
i = jmin (i, childComponentList_.size()); | |||||
} | |||||
} | } | ||||
} | } | ||||
@@ -2033,13 +2035,11 @@ void Component::parentSizeChanged() | |||||
void Component::addComponentListener (ComponentListener* const newListener) | void Component::addComponentListener (ComponentListener* const newListener) | ||||
{ | { | ||||
jassert (isValidComponent()); | |||||
componentListeners.add (newListener); | componentListeners.add (newListener); | ||||
} | } | ||||
void Component::removeComponentListener (ComponentListener* const listenerToRemove) | void Component::removeComponentListener (ComponentListener* const listenerToRemove) | ||||
{ | { | ||||
jassert (isValidComponent()); | |||||
componentListeners.remove (listenerToRemove); | componentListeners.remove (listenerToRemove); | ||||
} | } | ||||
@@ -2078,22 +2078,29 @@ void Component::paintOverChildren (Graphics&) | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
void Component::handleMessage (const Message& message) | |||||
void Component::postCommandMessage (const int commandId) | |||||
{ | { | ||||
if (message.intParameter1 == exitModalStateMessage) | |||||
class CustomCommandMessage : public CallbackMessage | |||||
{ | { | ||||
exitModalState (message.intParameter2); | |||||
} | |||||
else if (message.intParameter1 == customCommandMessage) | |||||
{ | |||||
handleCommandMessage (message.intParameter2); | |||||
} | |||||
} | |||||
public: | |||||
CustomCommandMessage (Component* const target_, const int commandId_) | |||||
: target (target_), commandId (commandId_) {} | |||||
//============================================================================== | |||||
void Component::postCommandMessage (const int commandId) | |||||
{ | |||||
postMessage (new Message (customCommandMessage, commandId, 0, 0)); | |||||
void messageCallback() | |||||
{ | |||||
if (target != 0) | |||||
target->exitModalState (commandId); | |||||
} | |||||
private: | |||||
Component::SafePointer<Component> target; | |||||
const int commandId; | |||||
CustomCommandMessage (CustomCommandMessage&); | |||||
CustomCommandMessage& operator= (const CustomCommandMessage&); | |||||
}; | |||||
(new CustomCommandMessage (this, commandId))->post(); | |||||
} | } | ||||
void Component::handleCommandMessage (int) | void Component::handleCommandMessage (int) | ||||
@@ -2477,9 +2484,6 @@ void Component::broughtToFront() | |||||
void Component::internalBroughtToFront() | void Component::internalBroughtToFront() | ||||
{ | { | ||||
if (! isValidComponent()) | |||||
return; | |||||
if (flags.hasHeavyweightPeerFlag) | if (flags.hasHeavyweightPeerFlag) | ||||
Desktop::getInstance().componentBroughtToFront (this); | Desktop::getInstance().componentBroughtToFront (this); | ||||
@@ -36,7 +36,6 @@ | |||||
#include "../graphics/imaging/juce_Image.h" | #include "../graphics/imaging/juce_Image.h" | ||||
#include "../graphics/geometry/juce_RectangleList.h" | #include "../graphics/geometry/juce_RectangleList.h" | ||||
#include "../graphics/geometry/juce_BorderSize.h" | #include "../graphics/geometry/juce_BorderSize.h" | ||||
#include "../../events/juce_MessageListener.h" | |||||
#include "../../events/juce_ListenerList.h" | #include "../../events/juce_ListenerList.h" | ||||
#include "../../text/juce_StringArray.h" | #include "../../text/juce_StringArray.h" | ||||
#include "../../containers/juce_Array.h" | #include "../../containers/juce_Array.h" | ||||
@@ -54,8 +53,7 @@ class ComponentPeer; | |||||
The base class for all JUCE user-interface objects. | The base class for all JUCE user-interface objects. | ||||
*/ | */ | ||||
class JUCE_API Component : public MouseListener, | |||||
public MessageListener | |||||
class JUCE_API Component : public MouseListener | |||||
{ | { | ||||
public: | public: | ||||
//============================================================================== | //============================================================================== | ||||
@@ -109,19 +107,6 @@ public: | |||||
*/ | */ | ||||
virtual void setName (const String& newName); | virtual void setName (const String& newName); | ||||
//============================================================================== | |||||
/** Checks whether this Component object has been deleted. | |||||
This will check whether this object is still a valid component, or whether | |||||
it's been deleted. | |||||
It's safe to call this on null or dangling pointers, but note that there is a | |||||
small risk if another new (but different) component has been created at the | |||||
same memory address which this one occupied, this methods can return a | |||||
false positive. | |||||
*/ | |||||
bool isValidComponent() const; | |||||
//============================================================================== | //============================================================================== | ||||
/** Makes the component visible or invisible. | /** Makes the component visible or invisible. | ||||
@@ -2112,16 +2097,8 @@ private: | |||||
protected: | protected: | ||||
/** @internal */ | /** @internal */ | ||||
virtual void internalRepaint (int x, int y, int w, int h); | virtual void internalRepaint (int x, int y, int w, int h); | ||||
/** @internal */ | |||||
virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | ||||
/** Overridden from the MessageListener parent class. | |||||
You can override this if you really need to, but be sure to pass your unwanted messages up | |||||
to this base class implementation, as the Component class needs to send itself messages | |||||
to work properly. | |||||
*/ | |||||
void handleMessage (const Message&); | |||||
}; | }; | ||||
@@ -157,10 +157,14 @@ Component* Desktop::findComponentAt (const Point<int>& screenPosition) const | |||||
for (int i = desktopComponents.size(); --i >= 0;) | for (int i = desktopComponents.size(); --i >= 0;) | ||||
{ | { | ||||
Component* const c = desktopComponents.getUnchecked(i); | Component* const c = desktopComponents.getUnchecked(i); | ||||
const Point<int> relative (c->globalPositionToRelative (screenPosition)); | |||||
if (c->contains (relative.getX(), relative.getY())) | |||||
return c->getComponentAt (relative.getX(), relative.getY()); | |||||
if (c->isVisible()) | |||||
{ | |||||
const Point<int> relative (c->globalPositionToRelative (screenPosition)); | |||||
if (c->contains (relative.getX(), relative.getY())) | |||||
return c->getComponentAt (relative.getX(), relative.getY()); | |||||
} | |||||
} | } | ||||
return 0; | return 0; | ||||
@@ -332,12 +336,10 @@ void Desktop::setKioskModeComponent (Component* componentToUse, const bool allow | |||||
{ | { | ||||
if (kioskModeComponent != componentToUse) | if (kioskModeComponent != componentToUse) | ||||
{ | { | ||||
// agh! Don't delete a component without first stopping it being the kiosk comp | |||||
jassert (kioskModeComponent == 0 || kioskModeComponent->isValidComponent()); | |||||
// agh! Don't remove a component from the desktop if it's the kiosk comp! | |||||
jassert (kioskModeComponent == 0 || kioskModeComponent->isOnDesktop()); | |||||
// agh! Don't delete or remove a component from the desktop while it's still the kiosk component! | |||||
jassert (kioskModeComponent == 0 || ComponentPeer::getPeerFor (kioskModeComponent) != 0); | |||||
if (kioskModeComponent->isValidComponent()) | |||||
if (kioskModeComponent != 0) | |||||
{ | { | ||||
juce_setKioskComponent (kioskModeComponent, false, allowMenusAndBars); | juce_setKioskComponent (kioskModeComponent, false, allowMenusAndBars); | ||||
@@ -348,10 +350,8 @@ void Desktop::setKioskModeComponent (Component* componentToUse, const bool allow | |||||
if (kioskModeComponent != 0) | if (kioskModeComponent != 0) | ||||
{ | { | ||||
jassert (kioskModeComponent->isValidComponent()); | |||||
// Only components that are already on the desktop can be put into kiosk mode! | // Only components that are already on the desktop can be put into kiosk mode! | ||||
jassert (kioskModeComponent->isOnDesktop()); | |||||
jassert (ComponentPeer::getPeerFor (kioskModeComponent) != 0); | |||||
kioskComponentOriginalBounds = kioskModeComponent->getBounds(); | kioskComponentOriginalBounds = kioskModeComponent->getBounds(); | ||||
@@ -77,8 +77,7 @@ private: | |||||
TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation) | TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation) | ||||
: panelComponent (0), | |||||
tabDepth (30), | |||||
: tabDepth (30), | |||||
outlineThickness (1), | outlineThickness (1), | ||||
edgeIndent (0) | edgeIndent (0) | ||||
{ | { | ||||
@@ -133,13 +132,10 @@ void TabbedComponent::clearTabs() | |||||
for (int i = contentComponents.size(); --i >= 0;) | for (int i = contentComponents.size(); --i >= 0;) | ||||
{ | { | ||||
Component* const c = contentComponents.getUnchecked(i); | |||||
// be careful not to delete these components until they've been removed from the tab component | |||||
jassert (c == 0 || c->isValidComponent()); | |||||
Component::SafePointer<Component>& c = contentComponents.getReference (i); | |||||
if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | ||||
delete c; | |||||
c.deleteAndZero(); | |||||
} | } | ||||
contentComponents.clear(); | contentComponents.clear(); | ||||
@@ -166,19 +162,16 @@ void TabbedComponent::setTabName (const int tabIndex, const String& newName) | |||||
void TabbedComponent::removeTab (const int tabIndex) | void TabbedComponent::removeTab (const int tabIndex) | ||||
{ | { | ||||
Component* const c = contentComponents [tabIndex]; | |||||
if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | |||||
if (tabIndex >= 0 && tabIndex < contentComponents.size()) | |||||
{ | { | ||||
if (c == panelComponent) | |||||
panelComponent = 0; | |||||
delete c; | |||||
} | |||||
Component::SafePointer<Component>& c = contentComponents.getReference (tabIndex); | |||||
contentComponents.remove (tabIndex); | |||||
if (c != 0 && (bool) c->getProperties() [deleteComponentId]) | |||||
c.deleteAndZero(); | |||||
tabs->removeTab (tabIndex); | |||||
contentComponents.remove (tabIndex); | |||||
tabs->removeTab (tabIndex); | |||||
} | |||||
} | } | ||||
int TabbedComponent::getNumTabs() const | int TabbedComponent::getNumTabs() const | ||||
@@ -304,15 +297,15 @@ void TabbedComponent::resized() | |||||
const Rectangle<int> bounds (indents.subtractedFrom (getLocalBounds())); | const Rectangle<int> bounds (indents.subtractedFrom (getLocalBounds())); | ||||
for (int i = contentComponents.size(); --i >= 0;) | for (int i = contentComponents.size(); --i >= 0;) | ||||
if (contentComponents.getUnchecked (i) != 0) | |||||
contentComponents.getUnchecked (i)->setBounds (bounds); | |||||
if (contentComponents.getReference (i) != 0) | |||||
contentComponents.getReference (i)->setBounds (bounds); | |||||
} | } | ||||
void TabbedComponent::lookAndFeelChanged() | void TabbedComponent::lookAndFeelChanged() | ||||
{ | { | ||||
for (int i = contentComponents.size(); --i >= 0;) | for (int i = contentComponents.size(); --i >= 0;) | ||||
if (contentComponents.getUnchecked (i) != 0) | |||||
contentComponents.getUnchecked (i)->lookAndFeelChanged(); | |||||
if (contentComponents.getReference (i) != 0) | |||||
contentComponents.getReference (i)->lookAndFeelChanged(); | |||||
} | } | ||||
void TabbedComponent::changeCallback (const int newCurrentTabIndex, | void TabbedComponent::changeCallback (const int newCurrentTabIndex, | ||||
@@ -228,8 +228,8 @@ protected: | |||||
private: | private: | ||||
//============================================================================== | //============================================================================== | ||||
Array <Component*> contentComponents; | |||||
Component* panelComponent; | |||||
Array <Component::SafePointer<Component> > contentComponents; | |||||
Component::SafePointer<Component> panelComponent; | |||||
int tabDepth; | int tabDepth; | ||||
int outlineThickness, edgeIndent; | int outlineThickness, edgeIndent; | ||||
static const Identifier deleteComponentId; | static const Identifier deleteComponentId; | ||||
@@ -293,12 +293,8 @@ public: | |||||
~Window() | ~Window() | ||||
{ | { | ||||
getActiveWindows().removeValue (this); | getActiveWindows().removeValue (this); | ||||
Desktop::getInstance().removeGlobalMouseListener (this); | Desktop::getInstance().removeGlobalMouseListener (this); | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
activeSubMenu = 0; | activeSubMenu = 0; | ||||
deleteAllChildren(); | deleteAllChildren(); | ||||
} | } | ||||
@@ -419,8 +415,6 @@ public: | |||||
{ | { | ||||
if (isVisible()) | if (isVisible()) | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
activeSubMenu = 0; | activeSubMenu = 0; | ||||
currentChild = 0; | currentChild = 0; | ||||
@@ -521,8 +515,6 @@ public: | |||||
if (showSubMenuFor (currentChild)) | if (showSubMenuFor (currentChild)) | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
if (activeSubMenu != 0 && activeSubMenu->isVisible()) | if (activeSubMenu != 0 && activeSubMenu->isVisible()) | ||||
activeSubMenu->selectNextItem (1); | activeSubMenu->selectNextItem (1); | ||||
} | } | ||||
@@ -611,7 +603,7 @@ public: | |||||
if (now > timeEnteredCurrentChildComp + 100 | if (now > timeEnteredCurrentChildComp + 100 | ||||
&& reallyContains (localMousePos.getX(), localMousePos.getY(), true) | && reallyContains (localMousePos.getX(), localMousePos.getY(), true) | ||||
&& currentChild->isValidComponent() | |||||
&& currentChild != 0 | |||||
&& (! disableMouseMoves) | && (! disableMouseMoves) | ||||
&& ! (activeSubMenu != 0 && activeSubMenu->isVisible())) | && ! (activeSubMenu != 0 && activeSubMenu->isVisible())) | ||||
{ | { | ||||
@@ -769,8 +761,6 @@ private: | |||||
bool isOverChildren() const | bool isOverChildren() const | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
return isVisible() | return isVisible() | ||||
&& (isOver || (activeSubMenu != 0 && activeSubMenu->isOverChildren())); | && (isOver || (activeSubMenu != 0 && activeSubMenu->isOverChildren())); | ||||
} | } | ||||
@@ -1084,7 +1074,7 @@ private: | |||||
void setCurrentlyHighlightedChild (PopupMenu::ItemComponent* const child) | void setCurrentlyHighlightedChild (PopupMenu::ItemComponent* const child) | ||||
{ | { | ||||
if (currentChild->isValidComponent()) | |||||
if (currentChild != 0) | |||||
currentChild->setHighlighted (false); | currentChild->setHighlighted (false); | ||||
currentChild = child; | currentChild = child; | ||||
@@ -1098,10 +1088,9 @@ private: | |||||
bool showSubMenuFor (PopupMenu::ItemComponent* const childComp) | bool showSubMenuFor (PopupMenu::ItemComponent* const childComp) | ||||
{ | { | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()); | |||||
activeSubMenu = 0; | activeSubMenu = 0; | ||||
if (childComp->isValidComponent() && childComp->itemInfo.hasActiveSubMenu()) | |||||
if (childComp != 0 && childComp->itemInfo.hasActiveSubMenu()) | |||||
{ | { | ||||
activeSubMenu = Window::create (*(childComp->itemInfo.subMenu), | activeSubMenu = Window::create (*(childComp->itemInfo.subMenu), | ||||
dismissOnMouseUp, | dismissOnMouseUp, | ||||
@@ -1144,8 +1133,6 @@ private: | |||||
bool isMovingTowardsMenu = false; | bool isMovingTowardsMenu = false; | ||||
jassert (activeSubMenu == 0 || activeSubMenu->isValidComponent()) | |||||
if (isOver && (activeSubMenu != 0) && globalMousePos != lastMouse) | if (isOver && (activeSubMenu != 0) && globalMousePos != lastMouse) | ||||
{ | { | ||||
// try to intelligently guess whether the user is moving the mouse towards a currently-open | // try to intelligently guess whether the user is moving the mouse towards a currently-open | ||||
@@ -1206,7 +1193,7 @@ private: | |||||
void triggerCurrentlyHighlightedItem() | void triggerCurrentlyHighlightedItem() | ||||
{ | { | ||||
if (currentChild->isValidComponent() | |||||
if (currentChild != 0 | |||||
&& currentChild->itemInfo.canBeTriggered() | && currentChild->itemInfo.canBeTriggered() | ||||
&& (currentChild->itemInfo.customComp == 0 | && (currentChild->itemInfo.customComp == 0 | ||||
|| currentChild->itemInfo.customComp->isTriggeredAutomatically)) | || currentChild->itemInfo.customComp->isTriggeredAutomatically)) | ||||
@@ -45,7 +45,7 @@ ComponentDragger::~ComponentDragger() | |||||
void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | ||||
ComponentBoundsConstrainer* const constrainer_) | ComponentBoundsConstrainer* const constrainer_) | ||||
{ | { | ||||
jassert (componentToDrag->isValidComponent()); | |||||
jassert (componentToDrag != 0); | |||||
if (componentToDrag != 0) | if (componentToDrag != 0) | ||||
{ | { | ||||
@@ -56,7 +56,7 @@ void ComponentDragger::startDraggingComponent (Component* const componentToDrag, | |||||
void ComponentDragger::dragComponent (Component* const componentToDrag, const MouseEvent& e) | void ComponentDragger::dragComponent (Component* const componentToDrag, const MouseEvent& e) | ||||
{ | { | ||||
jassert (componentToDrag->isValidComponent()); | |||||
jassert (componentToDrag != 0); | |||||
jassert (e.mods.isAnyMouseButtonDown()); // (the event has to be a drag event..) | jassert (e.mods.isAnyMouseButtonDown()); // (the event has to be a drag event..) | ||||
if (componentToDrag != 0) | if (componentToDrag != 0) | ||||
@@ -59,12 +59,7 @@ void MouseHoverDetector::setHoverComponent (Component* const newSourceComponent) | |||||
hasJustHovered = false; | hasJustHovered = false; | ||||
if (source != 0) | if (source != 0) | ||||
{ | |||||
// ! you need to delete the hover detector before deleting its component | |||||
jassert (source->isValidComponent()); | |||||
source->removeMouseListener (&internalTimer); | source->removeMouseListener (&internalTimer); | ||||
} | |||||
source = newSourceComponent; | source = newSourceComponent; | ||||
@@ -96,7 +96,7 @@ void BubbleComponent::setAllowedPlacement (const int newPlacement) | |||||
void BubbleComponent::setPosition (Component* componentToPointTo) | void BubbleComponent::setPosition (Component* componentToPointTo) | ||||
{ | { | ||||
jassert (componentToPointTo->isValidComponent()); | |||||
jassert (componentToPointTo != 0); | |||||
Point<int> pos; | Point<int> pos; | ||||
@@ -301,7 +301,6 @@ void ComponentPeer::setConstrainer (ComponentBoundsConstrainer* const newConstra | |||||
void ComponentPeer::handleMovedOrResized() | void ComponentPeer::handleMovedOrResized() | ||||
{ | { | ||||
jassert (component->isValidComponent()); | |||||
updateCurrentModifiers(); | updateCurrentModifiers(); | ||||
const bool nowMinimised = isMinimised(); | const bool nowMinimised = isMinimised(); | ||||
@@ -372,6 +372,7 @@ private: | |||||
bool fakeMouseMessageSent : 1, isWindowMinimised : 1; | bool fakeMouseMessageSent : 1, isWindowMinimised : 1; | ||||
friend class Component; | friend class Component; | ||||
friend class Desktop; | |||||
static ComponentPeer* getPeerFor (const Component* component) throw(); | static ComponentPeer* getPeerFor (const Component* component) throw(); | ||||
void setLastDragDropTarget (Component* comp); | void setLastDragDropTarget (Component* comp); | ||||
@@ -102,6 +102,15 @@ Thread::Thread (const String& threadName) | |||||
Thread::~Thread() | Thread::~Thread() | ||||
{ | { | ||||
/* If your thread class's destructor has been called without first stopping the thread, that | |||||
means that this partially destructed object is still performing some work - and that's not | |||||
unlikely to be a safe approach to take! | |||||
To avoid this type of nastiness, always make sure you call stopThread() before or during | |||||
your subclass's destructor. | |||||
*/ | |||||
jassert (! isThreadRunning()); | |||||
stopThread (100); | stopThread (100); | ||||
} | } | ||||