Browse Source

Added an option JUCE_ALLOW_STATIC_NULL_VARIABLES that can be used to turn off dangerous statics like String::empty, var::null, etc.

tags/2021-05-28
jules 9 years ago
parent
commit
9fa0d49be7
100 changed files with 322 additions and 257 deletions
  1. +2
    -2
      examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp
  2. +1
    -1
      examples/Demo/Source/Demos/CodeEditorDemo.cpp
  3. +3
    -3
      examples/Demo/Source/Demos/FontsDemo.cpp
  4. +1
    -1
      examples/Demo/Source/Demos/GraphicsDemo.cpp
  5. +1
    -1
      examples/Demo/Source/Demos/MDIDemo.cpp
  6. +2
    -2
      examples/Demo/Source/Demos/OpenGLDemo.cpp
  7. +1
    -1
      examples/Demo/Source/Demos/OpenGLDemo2D.cpp
  8. +2
    -2
      examples/Demo/Source/Demos/VideoDemo.cpp
  9. +1
    -1
      examples/Demo/Source/Demos/WavefrontObjParser.h
  10. +5
    -5
      examples/Demo/Source/Demos/WidgetsDemo.cpp
  11. +3
    -3
      examples/Demo/Source/Demos/XMLandJSONDemo.cpp
  12. +6
    -6
      examples/Demo/Source/MainWindow.cpp
  13. +8
    -8
      examples/MPETest/Source/MPESetupComponent.h
  14. +3
    -3
      examples/MPETest/Source/MainComponent.h
  15. +1
    -1
      examples/MidiTest/Source/MainComponent.cpp
  16. +1
    -1
      examples/OpenGLAppExample/Source/Resources/WavefrontObjParser.h
  17. +3
    -3
      examples/audio plugin demo/Source/PluginEditor.cpp
  18. +1
    -1
      examples/audio plugin host/Source/FilterGraph.cpp
  19. +4
    -4
      examples/audio plugin host/Source/GraphEditorPanel.cpp
  20. +5
    -5
      examples/audio plugin host/Source/MainHostWindow.cpp
  21. +1
    -1
      extras/Projucer/Source/Application/jucer_AppearanceSettings.cpp
  22. +2
    -2
      extras/Projucer/Source/Application/jucer_GlobalPreferences.cpp
  23. +1
    -1
      extras/Projucer/Source/Application/jucer_OpenDocumentManager.cpp
  24. +1
    -1
      extras/Projucer/Source/Application/jucer_OpenDocumentManager.h
  25. +1
    -1
      extras/Projucer/Source/Code Editor/jucer_SourceCodeEditor.cpp
  26. +1
    -1
      extras/Projucer/Source/Code Editor/jucer_SourceCodeEditor.h
  27. +2
    -2
      extras/Projucer/Source/ComponentEditor/components/jucer_ComboBoxHandler.h
  28. +3
    -3
      extras/Projucer/Source/ComponentEditor/components/jucer_ComponentTypeHandler.cpp
  29. +1
    -1
      extras/Projucer/Source/ComponentEditor/components/jucer_GenericComponentHandler.h
  30. +2
    -2
      extras/Projucer/Source/ComponentEditor/components/jucer_GroupComponentHandler.h
  31. +3
    -3
      extras/Projucer/Source/ComponentEditor/components/jucer_ImageButtonHandler.h
  32. +1
    -1
      extras/Projucer/Source/ComponentEditor/components/jucer_LabelHandler.h
  33. +4
    -4
      extras/Projucer/Source/ComponentEditor/components/jucer_TabbedComponentHandler.h
  34. +3
    -3
      extras/Projucer/Source/ComponentEditor/components/jucer_ViewportHandler.h
  35. +1
    -1
      extras/Projucer/Source/ComponentEditor/documents/jucer_ButtonDocument.cpp
  36. +1
    -1
      extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp
  37. +3
    -3
      extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp
  38. +10
    -10
      extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp
  39. +4
    -4
      extras/Projucer/Source/ComponentEditor/paintelements/jucer_ColouredElement.cpp
  40. +1
    -1
      extras/Projucer/Source/ComponentEditor/paintelements/jucer_FillType.h
  41. +4
    -4
      extras/Projucer/Source/ComponentEditor/paintelements/jucer_ImageResourceProperty.h
  42. +2
    -2
      extras/Projucer/Source/ComponentEditor/paintelements/jucer_PaintElementImage.h
  43. +1
    -1
      extras/Projucer/Source/ComponentEditor/paintelements/jucer_PaintElementPath.cpp
  44. +2
    -2
      extras/Projucer/Source/ComponentEditor/properties/jucer_FilePropertyComponent.h
  45. +2
    -2
      extras/Projucer/Source/ComponentEditor/properties/jucer_FontPropertyComponent.h
  46. +1
    -1
      extras/Projucer/Source/ComponentEditor/properties/jucer_PositionPropertyBase.h
  47. +7
    -7
      extras/Projucer/Source/ComponentEditor/ui/jucer_JucerDocumentEditor.cpp
  48. +3
    -3
      extras/Projucer/Source/ComponentEditor/ui/jucer_ResourceEditorPanel.cpp
  49. +1
    -1
      extras/Projucer/Source/LiveBuildEngine/projucer_ClassDatabase.h
  50. +1
    -1
      extras/Projucer/Source/LiveBuildEngine/projucer_ComponentListComp.h
  51. +1
    -1
      extras/Projucer/Source/LiveBuildEngine/projucer_CppHelpers.h
  52. +1
    -1
      extras/Projucer/Source/LiveBuildEngine/projucer_ErrorListComponent.h
  53. +1
    -1
      extras/Projucer/Source/LiveBuildEngine/projucer_SourceCodeRange.h
  54. +1
    -1
      extras/Projucer/Source/Project Saving/jucer_ProjectExport_AndroidStudio.h
  55. +1
    -1
      extras/Projucer/Source/Project Saving/jucer_ProjectExport_CodeBlocks.h
  56. +7
    -7
      extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h
  57. +1
    -1
      extras/Projucer/Source/Project Saving/jucer_ProjectExport_XCode.h
  58. +1
    -1
      extras/Projucer/Source/Project Saving/jucer_ProjectExporter.cpp
  59. +1
    -1
      extras/Projucer/Source/Project Saving/jucer_ProjectExporter.h
  60. +3
    -3
      extras/Projucer/Source/Project Saving/jucer_ProjectSaver.h
  61. +2
    -2
      extras/Projucer/Source/Project Saving/jucer_TextWithDefaultPropertyComponent.h
  62. +2
    -2
      extras/Projucer/Source/Project/jucer_DependencyPathPropertyComponent.cpp
  63. +1
    -1
      extras/Projucer/Source/Project/jucer_DependencyPathPropertyComponent.h
  64. +1
    -1
      extras/Projucer/Source/Project/jucer_Module.cpp
  65. +5
    -7
      extras/Projucer/Source/Project/jucer_Project.cpp
  66. +2
    -2
      extras/Projucer/Source/Project/jucer_ProjectContentComponent.cpp
  67. +3
    -3
      extras/Projucer/Source/Project/jucer_ProjectTree_Base.h
  68. +3
    -3
      extras/Projucer/Source/Utility/jucer_FilePathPropertyComponent.h
  69. +1
    -1
      extras/Projucer/Source/Utility/jucer_SVGPathDataComponent.h
  70. +4
    -5
      extras/Projucer/Source/Utility/jucer_TranslationTool.h
  71. +1
    -1
      extras/Projucer/Source/Utility/jucer_UTF8Component.h
  72. +1
    -1
      extras/Projucer/Source/Wizards/jucer_NewFileWizard.cpp
  73. +1
    -1
      extras/Projucer/Source/Wizards/jucer_NewProjectWizard.h
  74. +6
    -6
      extras/Projucer/Source/Wizards/jucer_NewProjectWizardComponent.h
  75. +1
    -1
      extras/Projucer/Source/Wizards/jucer_TemplateThumbnailsComponent.h
  76. +1
    -1
      modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm
  77. +1
    -1
      modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
  78. +5
    -6
      modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h
  79. +2
    -2
      modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp
  80. +19
    -19
      modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp
  81. +1
    -1
      modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp
  82. +12
    -2
      modules/juce_core/containers/juce_NamedValueSet.cpp
  83. +3
    -1
      modules/juce_core/containers/juce_Variant.cpp
  84. +2
    -0
      modules/juce_core/containers/juce_Variant.h
  85. +5
    -3
      modules/juce_core/files/juce_File.cpp
  86. +7
    -3
      modules/juce_core/files/juce_File.h
  87. +1
    -1
      modules/juce_core/javascript/juce_JSON.cpp
  88. +10
    -0
      modules/juce_core/juce_core.h
  89. +20
    -18
      modules/juce_core/text/juce_String.cpp
  90. +3
    -1
      modules/juce_core/text/juce_String.h
  91. +5
    -0
      modules/juce_core/text/juce_StringArray.cpp
  92. +3
    -3
      modules/juce_core/text/juce_TextDiff.cpp
  93. +1
    -1
      modules/juce_core/time/juce_PerformanceCounter.h
  94. +13
    -3
      modules/juce_core/xml/juce_XmlElement.cpp
  95. +15
    -3
      modules/juce_data_structures/values/juce_ValueTree.cpp
  96. +4
    -1
      modules/juce_data_structures/values/juce_ValueTree.h
  97. +2
    -0
      modules/juce_graphics/geometry/juce_AffineTransform.cpp
  98. +5
    -7
      modules/juce_graphics/geometry/juce_AffineTransform.h
  99. +2
    -0
      modules/juce_graphics/images/juce_Image.cpp
  100. +4
    -1
      modules/juce_graphics/images/juce_Image.h

+ 2
- 2
examples/Demo/Source/Demos/AudioSynthesiserDemo.cpp View File

@@ -260,7 +260,7 @@ public:
audioSourcePlayer.setSource (&synthAudioSource);
deviceManager.addAudioCallback (&audioSourcePlayer);
deviceManager.addMidiInputCallback (String::empty, &(synthAudioSource.midiCollector));
deviceManager.addMidiInputCallback (String(), &(synthAudioSource.midiCollector));
setOpaque (true);
setSize (640, 480);
@@ -269,7 +269,7 @@ public:
~AudioSynthesiserDemo()
{
audioSourcePlayer.setSource (nullptr);
deviceManager.removeMidiInputCallback (String::empty, &(synthAudioSource.midiCollector));
deviceManager.removeMidiInputCallback (String(), &(synthAudioSource.midiCollector));
deviceManager.removeAudioCallback (&audioSourcePlayer);
deviceManager.removeAudioCallback (&liveAudioDisplayComp);
}


+ 1
- 1
examples/Demo/Source/Demos/CodeEditorDemo.cpp View File

@@ -31,7 +31,7 @@ class CodeEditorDemo : public Component,
{
public:
CodeEditorDemo()
: fileChooser ("File", File::nonexistent, true, false, false,
: fileChooser ("File", File(), true, false, false,
"*.cpp;*.h;*.hpp;*.c;*.mm;*.m", String(),
"Choose a C++ file to open it in the editor")
{


+ 3
- 3
examples/Demo/Source/Demos/FontsDemo.cpp View File

@@ -34,9 +34,9 @@ class FontsDemo : public Component,
{
public:
FontsDemo()
: heightLabel (String::empty, "Height:"),
kerningLabel (String::empty, "Kerning:"),
scaleLabel (String::empty, "Scale:"),
: heightLabel (String(), "Height:"),
kerningLabel (String(), "Kerning:"),
scaleLabel (String(), "Scale:"),
styleLabel ("Style"),
boldToggle ("Bold"),
italicToggle ("Italic")


+ 1
- 1
examples/Demo/Source/Demos/GraphicsDemo.cpp View File

@@ -395,7 +395,7 @@ class ImagesRenderingDemo : public GraphicsDemoBase
{
public:
ImagesRenderingDemo (ControllersComponent& cc, bool argb_, bool tiled_)
: GraphicsDemoBase (cc, String ("Images") + (argb_ ? ": ARGB" : ": RGB") + (tiled_ ? " Tiled" : String::empty )),
: GraphicsDemoBase (cc, String ("Images") + (argb_ ? ": ARGB" : ": RGB") + (tiled_ ? " Tiled" : String() )),
isArgb (argb_), isTiled (tiled_)
{
argbImage = ImageFileFormat::loadFrom (BinaryData::juce_icon_png, (size_t) BinaryData::juce_icon_pngSize);


+ 1
- 1
examples/Demo/Source/Demos/MDIDemo.cpp View File

@@ -86,7 +86,7 @@ public:
File getLastDocumentOpened() override
{
// not interested in this for now
return File::nonexistent;
return File();
}
void setLastDocumentOpened (const File& /*file*/) override


+ 2
- 2
examples/Demo/Source/Demos/OpenGLDemo.cpp View File

@@ -836,8 +836,8 @@ struct OpenGLDemoClasses
controlsOverlay->statusLabel.setText (statusText, dontSendNotification);
newVertexShader = String::empty;
newFragmentShader = String::empty;
newVertexShader = String();
newFragmentShader = String();
}
}


+ 1
- 1
examples/Demo/Source/Demos/OpenGLDemo2D.cpp View File

@@ -97,7 +97,7 @@ public:
if (shader != nullptr)
{
statusLabel.setText (String::empty, dontSendNotification);
statusLabel.setText (String(), dontSendNotification);
shader->fillRect (g.getInternalContext(), getLocalBounds());
}


+ 2
- 2
examples/Demo/Source/Demos/VideoDemo.cpp View File

@@ -35,8 +35,8 @@ class MovieComponentWithFileBrowser : public Component,
public:
MovieComponentWithFileBrowser()
: isDragOver (false),
fileChooser ("movie", File::nonexistent, true, false, false,
"*", String::empty, "(choose a video file to play)")
fileChooser ("movie", File(), true, false, false,
"*", String(), "(choose a video file to play)")
{
addAndMakeVisible (videoComp);


+ 1
- 1
examples/Demo/Source/Demos/WavefrontObjParser.h View File

@@ -242,7 +242,7 @@ private:
static String::CharPointerType findEndOfFaceToken (String::CharPointerType t) noexcept
{
return CharacterFunctions::findEndOfToken (t, CharPointer_ASCII ("/ \t"), String::empty.getCharPointer());
return CharacterFunctions::findEndOfToken (t, CharPointer_ASCII ("/ \t"), String().getCharPointer());
}
};


+ 5
- 5
examples/Demo/Source/Demos/WidgetsDemo.cpp View File

@@ -453,11 +453,11 @@ class ToolbarDemoComp : public Component,
{
public:
ToolbarDemoComp()
: depthLabel (String::empty, "Toolbar depth:"),
infoLabel (String::empty, "As well as showing off toolbars, this demo illustrates how to store "
"a set of SVG files in a Zip file, embed that in your application, and read "
"them back in at runtime.\n\nThe icon images here are taken from the open-source "
"Tango icon project."),
: depthLabel (String(), "Toolbar depth:"),
infoLabel (String(), "As well as showing off toolbars, this demo illustrates how to store "
"a set of SVG files in a Zip file, embed that in your application, and read "
"them back in at runtime.\n\nThe icon images here are taken from the open-source "
"Tango icon project."),
orientationButton ("Vertical/Horizontal"),
customiseButton ("Customise...")
{


+ 3
- 3
examples/Demo/Source/Demos/XMLandJSONDemo.cpp View File

@@ -356,9 +356,9 @@ private:
{
switch (type)
{
case xml: codeDocument.replaceAllContent (BinaryData::treedemo_xml); break;
case json: codeDocument.replaceAllContent (BinaryData::juce_module_info); break;
default: codeDocument.replaceAllContent (String::empty); break;
case xml: codeDocument.replaceAllContent (BinaryData::treedemo_xml); break;
case json: codeDocument.replaceAllContent (BinaryData::juce_module_info); break;
default: codeDocument.replaceAllContent (String()); break;
}
}


+ 6
- 6
examples/Demo/Source/MainWindow.cpp View File

@@ -367,32 +367,32 @@ private:
}
case MainAppWindow::useLookAndFeelV1:
result.setInfo ("Use LookAndFeel_V1", String::empty, generalCategory, 0);
result.setInfo ("Use LookAndFeel_V1", String(), generalCategory, 0);
result.addDefaultKeypress ('i', ModifierKeys::commandModifier);
result.setTicked (isLookAndFeelSelected<LookAndFeel_V1>());
break;
case MainAppWindow::useLookAndFeelV2:
result.setInfo ("Use LookAndFeel_V2", String::empty, generalCategory, 0);
result.setInfo ("Use LookAndFeel_V2", String(), generalCategory, 0);
result.addDefaultKeypress ('o', ModifierKeys::commandModifier);
result.setTicked (isLookAndFeelSelected<LookAndFeel_V2>());
break;
case MainAppWindow::useLookAndFeelV3:
result.setInfo ("Use LookAndFeel_V3", String::empty, generalCategory, 0);
result.setInfo ("Use LookAndFeel_V3", String(), generalCategory, 0);
result.addDefaultKeypress ('p', ModifierKeys::commandModifier);
result.setTicked (isLookAndFeelSelected<LookAndFeel_V3>());
break;
case MainAppWindow::toggleRepaintDebugging:
result.setInfo ("Toggle repaint display", String::empty, generalCategory, 0);
result.setInfo ("Toggle repaint display", String(), generalCategory, 0);
result.addDefaultKeypress ('r', ModifierKeys());
result.setTicked (juceDemoRepaintDebuggingActive);
break;
case MainAppWindow::useNativeTitleBar:
{
result.setInfo ("Use native window title bar", String::empty, generalCategory, 0);
result.setInfo ("Use native window title bar", String(), generalCategory, 0);
result.addDefaultKeypress ('n', ModifierKeys::commandModifier);
bool nativeTitlebar = false;
@@ -405,7 +405,7 @@ private:
#if ! JUCE_LINUX
case MainAppWindow::goToKioskMode:
result.setInfo ("Show full-screen kiosk mode", String::empty, generalCategory, 0);
result.setInfo ("Show full-screen kiosk mode", String(), generalCategory, 0);
result.addDefaultKeypress ('f', ModifierKeys::commandModifier);
result.setTicked (Desktop::getInstance().getKioskModeComponent() != 0);
break;


+ 8
- 8
examples/MPETest/Source/MPESetupComponent.h View File

@@ -50,18 +50,18 @@ public:
//==============================================================================
MPESetupComponent()
: masterChannelLabel (String::empty, "Master channel:"),
noteChannelsLabel (String::empty, "Nr. of note channels:"),
masterPitchbendRangeLabel (String::empty, "Master pitchbend range (semitones):"),
notePitchbendRangeLabel (String::empty, "Note pitchbend range (semitones):"),
: masterChannelLabel (String(), "Master channel:"),
noteChannelsLabel (String(), "Nr. of note channels:"),
masterPitchbendRangeLabel (String(), "Master pitchbend range (semitones):"),
notePitchbendRangeLabel (String(), "Note pitchbend range (semitones):"),
addZoneButton ("Add this zone"),
clearAllZonesButton ("Clear all zones"),
legacyStartChannelLabel (String::empty, "First channel:"),
legacyEndChannelLabel (String::empty, "Last channel:"),
legacyPitchbendRangeLabel (String::empty, "Pitchbend range (semitones):"),
legacyStartChannelLabel (String(), "First channel:"),
legacyEndChannelLabel (String(), "Last channel:"),
legacyPitchbendRangeLabel (String(), "Pitchbend range (semitones):"),
legacyModeEnabledToggle ("Enable Legacy Mode"),
voiceStealingEnabledToggle ("Enable synth voice stealing"),
numberOfVoicesLabel (String::empty, "Number of synth voices")
numberOfVoicesLabel (String(), "Number of synth voices")
{
initialiseComboBoxWithConsecutiveIntegers (masterChannel, masterChannelLabel, 1, 15, defaultMasterChannel);


+ 3
- 3
examples/MPETest/Source/MainComponent.h View File

@@ -41,8 +41,8 @@ public:
{
setLookAndFeel (&lookAndFeel);
setSize (880, 720);
audioDeviceManager.initialise (0, 2, 0, true, String::empty, 0);
audioDeviceManager.addMidiInputCallback(String::empty, this);
audioDeviceManager.initialise (0, 2, 0, true, String(), 0);
audioDeviceManager.addMidiInputCallback (String(), this);
audioDeviceManager.addAudioCallback (this);
addAndMakeVisible (audioSetupComp);
@@ -65,7 +65,7 @@ public:
~MainComponent()
{
audioDeviceManager.removeMidiInputCallback (String::empty, this);
audioDeviceManager.removeMidiInputCallback (String(), this);
}
//==============================================================================


+ 1
- 1
examples/MidiTest/Source/MainComponent.cpp View File

@@ -167,7 +167,7 @@ MainContentComponent::MainContentComponent ()
midiMonitor.setScrollbarsShown (true);
midiMonitor.setCaretVisible (false);
midiMonitor.setPopupMenuEnabled (false);
midiMonitor.setText (String::empty);
midiMonitor.setText (String());
addAndMakeVisible (midiMonitor);
if (! BluetoothMidiDevicePairingDialogue::isAvailable())


+ 1
- 1
examples/OpenGLAppExample/Source/Resources/WavefrontObjParser.h View File

@@ -243,7 +243,7 @@ private:
static String::CharPointerType findEndOfFaceToken (String::CharPointerType t) noexcept
{
return CharacterFunctions::findEndOfToken (t, CharPointer_ASCII ("/ \t"), String::empty.getCharPointer());
return CharacterFunctions::findEndOfToken (t, CharPointer_ASCII ("/ \t"), String().getCharPointer());
}
};


+ 3
- 3
examples/audio plugin demo/Source/PluginEditor.cpp View File

@@ -59,9 +59,9 @@ public:
JuceDemoPluginAudioProcessorEditor::JuceDemoPluginAudioProcessorEditor (JuceDemoPluginAudioProcessor& owner)
: AudioProcessorEditor (owner),
midiKeyboard (owner.keyboardState, MidiKeyboardComponent::horizontalKeyboard),
timecodeDisplayLabel (String::empty),
gainLabel (String::empty, "Throughput level:"),
delayLabel (String::empty, "Delay:")
timecodeDisplayLabel (String()),
gainLabel (String(), "Throughput level:"),
delayLabel (String(), "Delay:")
{
// add some sliders..
addAndMakeVisible (gainSlider = new ParameterSlider (*owner.gainParam));


+ 1
- 1
examples/audio plugin host/Source/FilterGraph.cpp View File

@@ -256,7 +256,7 @@ Result FilterGraph::saveDocument (const File& file)
{
ScopedPointer<XmlElement> xml (createXml());
if (! xml->writeToFile (file, String::empty))
if (! xml->writeToFile (file, String()))
return Result::fail ("Couldn't write to the file");
return Result::ok();


+ 4
- 4
examples/audio plugin host/Source/GraphEditorPanel.cpp View File

@@ -969,7 +969,7 @@ void GraphEditorPanel::dragConnector (const MouseEvent& e)
if (draggingConnector != nullptr)
{
draggingConnector->setTooltip (String::empty);
draggingConnector->setTooltip (String());
int x = e2.x;
int y = e2.y;
@@ -1013,7 +1013,7 @@ void GraphEditorPanel::endDraggingConnector (const MouseEvent& e)
if (draggingConnector == nullptr)
return;
draggingConnector->setTooltip (String::empty);
draggingConnector->setTooltip (String());
const MouseEvent e2 (e.getEventRelativeTo (this));
@@ -1108,7 +1108,7 @@ GraphDocumentComponent::GraphDocumentComponent (AudioPluginFormatManager& format
addAndMakeVisible (statusBar = new TooltipBar());
deviceManager->addAudioCallback (&graphPlayer);
deviceManager->addMidiInputCallback (String::empty, &graphPlayer.getMidiMessageCollector());
deviceManager->addMidiInputCallback (String(), &graphPlayer.getMidiMessageCollector());
graphPanel->updateComponents();
}
@@ -1143,7 +1143,7 @@ void GraphDocumentComponent::unfocusKeyboardComponent()
void GraphDocumentComponent::releaseGraph()
{
deviceManager->removeAudioCallback (&graphPlayer);
deviceManager->removeMidiInputCallback (String::empty, &graphPlayer.getMidiMessageCollector());
deviceManager->removeMidiInputCallback (String(), &graphPlayer.getMidiMessageCollector());
deviceManager->removeChangeListener (graphPanel);
deleteAllChildren();


+ 5
- 5
examples/audio plugin host/Source/MainHostWindow.cpp View File

@@ -387,12 +387,12 @@ void MainHostWindow::getCommandInfo (const CommandID commandID, ApplicationComma
break;
case CommandIDs::showPluginListEditor:
result.setInfo ("Edit the list of available plug-Ins...", String::empty, category, 0);
result.setInfo ("Edit the list of available plug-Ins...", String(), category, 0);
result.addDefaultKeypress ('p', ModifierKeys::commandModifier);
break;
case CommandIDs::showAudioSettings:
result.setInfo ("Change the audio device settings", String::empty, category, 0);
result.setInfo ("Change the audio device settings", String(), category, 0);
result.addDefaultKeypress ('a', ModifierKeys::commandModifier);
break;
@@ -401,7 +401,7 @@ void MainHostWindow::getCommandInfo (const CommandID commandID, ApplicationComma
break;
case CommandIDs::aboutBox:
result.setInfo ("About...", String::empty, category, 0);
result.setInfo ("About...", String(), category, 0);
break;
case CommandIDs::allWindowsForward:
@@ -437,7 +437,7 @@ bool MainHostWindow::perform (const InvocationInfo& info)
case CommandIDs::saveAs:
if (graphEditor != nullptr && graphEditor->graph != nullptr)
graphEditor->graph->saveAs (File::nonexistent, true, true, true);
graphEditor->graph->saveAs (File(), true, true, true);
break;
case CommandIDs::showPluginListEditor:
@@ -577,6 +577,6 @@ bool MainHostWindow::isDoublePrecisionProcessing()
void MainHostWindow::updatePrecisionMenuItem (ApplicationCommandInfo& info)
{
info.setInfo ("Double floating point precision rendering", String::empty, "General", 0);
info.setInfo ("Double floating point precision rendering", String(), "General", 0);
info.setTicked (isDoublePrecisionProcessing());
}

+ 1
- 1
extras/Projucer/Source/Application/jucer_AppearanceSettings.cpp View File

@@ -170,7 +170,7 @@ bool AppearanceSettings::readFromFile (const File& file)
bool AppearanceSettings::writeToFile (const File& file) const
{
const ScopedPointer<XmlElement> xml (settings.createXml());
return xml != nullptr && xml->writeToFile (file, String::empty);
return xml != nullptr && xml->writeToFile (file, String());
}
Font AppearanceSettings::getDefaultCodeFont()


+ 2
- 2
extras/Projucer/Source/Application/jucer_GlobalPreferences.cpp View File

@@ -77,7 +77,7 @@ Identifier PathSettingsTab::getKeyForPropertyComponent (TextPropertyComponent* c
// this property component does not have a key associated to it!
jassertfalse;
return String::empty;
return String();
}
Component* PathSettingsTab::getContent()
@@ -286,7 +286,7 @@ struct AppearanceEditor
StringArray names;
names.add ("<Default Monospaced>");
names.add (String::empty);
names.add (String());
names.addArray (getAppSettings().monospacedFontNames);
return new ChoicePropertyComponent (Value (new FontNameValueSource (value)),


+ 1
- 1
extras/Projucer/Source/Application/jucer_OpenDocumentManager.cpp View File

@@ -62,7 +62,7 @@ public:
Component* createEditor() override { return new ItemPreviewComponent (file); }
Component* createViewer() override { return createEditor(); }
void fileHasBeenRenamed (const File& newFile) override { file = newFile; }
String getState() const override { return String::empty; }
String getState() const override { return String(); }
void restoreState (const String&) override {}
String getType() const override


+ 1
- 1
extras/Projucer/Source/Application/jucer_OpenDocumentManager.h View File

@@ -62,7 +62,7 @@ public:
virtual void fileHasBeenRenamed (const File& newFile) = 0;
virtual String getState() const = 0;
virtual void restoreState (const String& state) = 0;
virtual File getCounterpartFile() const { return File::nonexistent; }
virtual File getCounterpartFile() const { return File(); }
};
//==============================================================================


+ 1
- 1
extras/Projucer/Source/Code Editor/jucer_SourceCodeEditor.cpp View File

@@ -639,7 +639,7 @@ void CppCodeEditorComponent::insertComponentClass()
const char* classNameField = "Class Name";
aw.addTextEditor (classNameField, String::empty, String::empty, false);
aw.addTextEditor (classNameField, String(), String(), false);
aw.addButton (TRANS ("Insert Code"), 1, KeyPress (KeyPress::returnKey));
aw.addButton (TRANS ("Cancel"), 0, KeyPress (KeyPress::escapeKey));


+ 1
- 1
extras/Projucer/Source/Code Editor/jucer_SourceCodeEditor.h View File

@@ -46,7 +46,7 @@ public:
bool needsSaving() const override { return codeDoc != nullptr && codeDoc->hasChangedSinceSavePoint(); }
bool hasFileBeenModifiedExternally() override { return modDetector.hasBeenModified(); }
void fileHasBeenRenamed (const File& newFile) override { modDetector.fileHasBeenRenamed (newFile); }
String getState() const override { return lastState != nullptr ? lastState->toString() : String::empty; }
String getState() const override { return lastState != nullptr ? lastState->toString() : String(); }
void restoreState (const String& state) override { lastState = new CodeEditorComponent::State (state); }
File getCounterpartFile() const override


+ 2
- 2
extras/Projucer/Source/ComponentEditor/components/jucer_ComboBoxHandler.h View File

@@ -55,14 +55,14 @@ public:
if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout))
return false;
ComboBox defaultBox (String::empty);
ComboBox defaultBox;
ComboBox* const c = dynamic_cast<ComboBox*> (comp);
jassert (c != nullptr);
c->setEditableText (xml.getBoolAttribute ("editable", defaultBox.isTextEditable()));
c->setJustificationType (Justification (xml.getIntAttribute ("layout", defaultBox.getJustificationType().getFlags())));
c->getProperties().set ("items", xml.getStringAttribute ("items", String::empty));
c->getProperties().set ("items", xml.getStringAttribute ("items", String()));
c->setTextWhenNothingSelected (xml.getStringAttribute ("textWhenNonSelected", defaultBox.getTextWhenNothingSelected()));
c->setTextWhenNoChoicesAvailable (xml.getStringAttribute ("textWhenNoItems", defaultBox.getTextWhenNoChoicesAvailable()));


+ 3
- 3
extras/Projucer/Source/ComponentEditor/components/jucer_ComponentTypeHandler.cpp View File

@@ -196,7 +196,7 @@ bool ComponentTypeHandler::restoreFromXml (const XmlElement& xml,
for (int i = 0; i < colours.size(); ++i)
{
const String col (xml.getStringAttribute (colours[i]->xmlTagName, String::empty));
const String col (xml.getStringAttribute (colours[i]->xmlTagName, String()));
if (col.isNotEmpty())
comp->setColour (colours[i]->colourId, Colour::fromString (col));
@@ -518,12 +518,12 @@ void ComponentTypeHandler::fillInResizeCode (GeneratedCode& code, Component* com
if (pos.rect.isPositionAbsolute())
code.constructorCode += r + "\n";
else
code.getCallbackCode (String::empty, "void", "resized()", false) += r;
code.getCallbackCode (String(), "void", "resized()", false) += r;
}
String ComponentTypeHandler::getCreationParameters (GeneratedCode&, Component*)
{
return String::empty;
return String();
}
void ComponentTypeHandler::fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName)


+ 1
- 1
extras/Projucer/Source/ComponentEditor/components/jucer_GenericComponentHandler.h View File

@@ -93,7 +93,7 @@ public:
return false;
((GenericComponent*) comp)->actualClassName = xml.getStringAttribute ("class", "Component");
((GenericComponent*) comp)->constructorParams = xml.getStringAttribute ("params", String::empty);
((GenericComponent*) comp)->constructorParams = xml.getStringAttribute ("params", String());
return true;
}


+ 2
- 2
extras/Projucer/Source/ComponentEditor/components/jucer_GroupComponentHandler.h View File

@@ -44,7 +44,7 @@ public:
XmlElement* e = ComponentTypeHandler::createXmlFor (comp, layout);
e->setAttribute ("title", g->getText());
GroupComponent defaultComp (String::empty, String::empty);
GroupComponent defaultComp;
if (g->getTextLabelPosition().getFlags() != defaultComp.getTextLabelPosition().getFlags())
e->setAttribute ("textpos", g->getTextLabelPosition().getFlags());
@@ -82,7 +82,7 @@ public:
String s;
GroupComponent defaultComp (String::empty, String::empty);
GroupComponent defaultComp;
if (g->getTextLabelPosition().getFlags() != defaultComp.getTextLabelPosition().getFlags())
{


+ 3
- 3
extras/Projucer/Source/ComponentEditor/components/jucer_ImageButtonHandler.h View File

@@ -101,15 +101,15 @@ public:
setImageKeepProportions (l, ib, xml.getBoolAttribute ("keepProportions", true), false);
setImageResource (l, ib, normalImage, xml.getStringAttribute ("resourceNormal", String::empty), false);
setImageResource (l, ib, normalImage, xml.getStringAttribute ("resourceNormal", String()), false);
setImageOpacity (l, ib, normalImage, (float) xml.getDoubleAttribute ("opacityNormal", 1.0f), false);
setImageColour (l, ib, normalImage, Colour::fromString (xml.getStringAttribute ("colourNormal", "0")), false);
setImageResource (l, ib, overImage, xml.getStringAttribute ("resourceOver", String::empty), false);
setImageResource (l, ib, overImage, xml.getStringAttribute ("resourceOver", String()), false);
setImageOpacity (l, ib, overImage, (float) xml.getDoubleAttribute ("opacityOver", 1.0f), false);
setImageColour (l, ib, overImage, Colour::fromString (xml.getStringAttribute ("colourOver", "0")), false);
setImageResource (l, ib, downImage, xml.getStringAttribute ("resourceDown", String::empty), false);
setImageResource (l, ib, downImage, xml.getStringAttribute ("resourceDown", String()), false);
setImageOpacity (l, ib, downImage, (float) xml.getDoubleAttribute ("opacityDown", 1.0f), false);
setImageColour (l, ib, downImage, Colour::fromString (xml.getStringAttribute ("colourDown", "0")), false);


+ 1
- 1
extras/Projucer/Source/ComponentEditor/components/jucer_LabelHandler.h View File

@@ -68,7 +68,7 @@ public:
if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout))
return false;
Label defaultLabel (String::empty, String::empty);
Label defaultLabel;
Font font;
font.setHeight ((float) xml.getDoubleAttribute ("fontsize", 15.0));


+ 4
- 4
extras/Projucer/Source/ComponentEditor/components/jucer_TabbedComponentHandler.h View File

@@ -147,7 +147,7 @@ public:
default: jassertfalse; break;
}
return String::empty;
return String();
}
void fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName)
@@ -275,7 +275,7 @@ public:
TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));
jassert (tdc != nullptr);
return tdc != 0 ? tdc->contentClassName : String::empty;
return tdc != 0 ? tdc->contentClassName : String();
}
static void setTabClassName (TabbedComponent* tc, int tabIndex, const String& newName)
@@ -295,7 +295,7 @@ public:
TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));
jassert (tdc != nullptr);
return tdc != 0 ? tdc->constructorParams : String::empty;
return tdc != 0 ? tdc->constructorParams : String();
}
static void setTabConstructorParams (TabbedComponent* tc, int tabIndex, const String& newParams)
@@ -315,7 +315,7 @@ public:
TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));
jassert (tdc != nullptr);
return tdc != 0 ? tdc->jucerComponentFile : String::empty;
return tdc != 0 ? tdc->jucerComponentFile : String();
}
static void setTabJucerFile (TabbedComponent* tc, int tabIndex, const String& newFile)


+ 3
- 3
extras/Projucer/Source/ComponentEditor/components/jucer_ViewportHandler.h View File

@@ -66,7 +66,7 @@ public:
v->setScrollBarThickness (xml.getIntAttribute ("scrollbarThickness", defaultViewport.getScrollBarThickness()));
setViewportJucerComponentFile (v, xml.getStringAttribute ("jucerFile", String::empty));
setViewportJucerComponentFile (v, xml.getStringAttribute ("jucerFile", String()));
setViewportGenericComponentClass (v, xml.getStringAttribute ("contentClass"));
setViewportContentType (v, xml.getIntAttribute ("contentType", 0));
setViewportConstructorParams (v, xml.getStringAttribute ("constructorParams"));
@@ -150,7 +150,7 @@ public:
}
else
{
classNm = String::empty;
classNm = String();
}
}
@@ -505,7 +505,7 @@ private:
const String filename (getViewportJucerComponentFile (component));
if (filename.isEmpty())
return File::nonexistent;
return File();
return document.getCppFile().getSiblingFile (filename);
}


+ 1
- 1
extras/Projucer/Source/ComponentEditor/documents/jucer_ButtonDocument.cpp View File

@@ -275,7 +275,7 @@ class ButtonTestComponent : public Button
{
public:
ButtonTestComponent (ButtonDocument* const doc, const bool fillBackground)
: Button (String::empty),
: Button (String()),
document (doc),
alwaysFillBackground (fillBackground)
{


+ 1
- 1
extras/Projucer/Source/ComponentEditor/jucer_BinaryResources.cpp View File

@@ -158,7 +158,7 @@ String BinaryResources::browseForResource (const String& title,
return name;
}
return String::empty;
return String();
}
String BinaryResources::findUniqueName (const String& rootName) const


+ 3
- 3
extras/Projucer/Source/ComponentEditor/jucer_ComponentLayout.cpp View File

@@ -715,7 +715,7 @@ void ComponentLayout::fillInGeneratedCode (GeneratedCode& code) const
String ComponentLayout::getComponentMemberVariableName (Component* comp) const
{
if (comp == nullptr)
return String::empty;
return String();
String name (comp->getProperties() ["memberName"].toString());
@@ -730,7 +730,7 @@ void ComponentLayout::setComponentMemberVariableName (Component* comp, const Str
jassert (comp != nullptr);
const String oldName (getComponentMemberVariableName (comp));
comp->getProperties().set ("memberName", String::empty);
comp->getProperties().set ("memberName", String());
const String n (getUnusedMemberName (CodeHelpers::makeValidIdentifier (newName, false, true, false), comp));
comp->getProperties().set ("memberName", n);
@@ -775,7 +775,7 @@ String ComponentLayout::getUnusedMemberName (String nameRoot, Component* comp) c
String ComponentLayout::getComponentVirtualClassName (Component* comp) const
{
if (comp == nullptr)
return String::empty;
return String();
return comp->getProperties() ["virtualName"];
}


+ 10
- 10
extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp View File

@@ -173,7 +173,7 @@ void JucerDocument::setParentClasses (const String& classes)
s = s.fromFirstOccurrenceOf (" ", false, false);
if (s.trim().isEmpty())
type = s = String::empty;
type = s = String();
}
s = type + CodeHelpers::makeValidIdentifier (s.trim(), false, false, true);
@@ -378,11 +378,11 @@ bool JucerDocument::loadFromXml (const XmlElement& xml)
&& getTypeName().equalsIgnoreCase (xml.getStringAttribute ("documentType")))
{
className = xml.getStringAttribute ("className", defaultClassName);
templateFile = xml.getStringAttribute ("template", String::empty);
componentName = xml.getStringAttribute ("componentName", String::empty);
templateFile = xml.getStringAttribute ("template", String());
componentName = xml.getStringAttribute ("componentName", String());
parentClasses = xml.getStringAttribute ("parentClasses", defaultParentClasses);
constructorParams = xml.getStringAttribute ("constructorParams", String::empty);
variableInitialisers = xml.getStringAttribute ("variableInitialisers", String::empty);
constructorParams = xml.getStringAttribute ("constructorParams", String());
variableInitialisers = xml.getStringAttribute ("variableInitialisers", String());
fixedSize = xml.getBoolAttribute ("fixedSize", false);
initialWidth = xml.getIntAttribute ("initialWidth", 300);
@@ -425,10 +425,10 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const
code.constructorCode << "setName (" + quotedString (componentName, false) + ");\n";
// call these now, just to make sure they're the first two methods in the list.
code.getCallbackCode (String::empty, "void", "paint (Graphics& g)", false)
code.getCallbackCode (String(), "void", "paint (Graphics& g)", false)
<< "//[UserPrePaint] Add your own custom painting code here..\n//[/UserPrePaint]\n\n";
code.getCallbackCode (String::empty, "void", "resized()", false)
code.getCallbackCode (String(), "void", "resized()", false)
<< "//[UserPreResize] Add your own custom resize code here..\n//[/UserPreResize]\n\n";
if (ComponentLayout* l = getComponentLayout())
@@ -449,10 +449,10 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const
if (initialWidth > 0 || initialHeight > 0)
code.constructorCode << "\nsetSize (" << initialWidth << ", " << initialHeight << ");\n";
code.getCallbackCode (String::empty, "void", "paint (Graphics& g)", false)
code.getCallbackCode (String(), "void", "paint (Graphics& g)", false)
<< "//[UserPaint] Add your own custom painting code here..\n//[/UserPaint]";
code.getCallbackCode (String::empty, "void", "resized()", false)
code.getCallbackCode (String(), "void", "resized()", false)
<< "//[UserResized] Add your own custom resize handling here..\n//[/UserResized]";
// add optional methods
@@ -491,7 +491,7 @@ void JucerDocument::fillInPaintCode (GeneratedCode& code) const
{
for (int i = 0; i < getNumPaintRoutines(); ++i)
getPaintRoutine (i)
->fillInGeneratedCode (code, code.getCallbackCode (String::empty, "void", "paint (Graphics& g)", false));
->fillInGeneratedCode (code, code.getCallbackCode (String(), "void", "paint (Graphics& g)", false));
}
void JucerDocument::setTemplateFile (const String& newFile)


+ 4
- 4
extras/Projucer/Source/ComponentEditor/paintelements/jucer_ColouredElement.cpp View File

@@ -377,7 +377,7 @@ public:
String getResource() const
{
if (element == nullptr)
return String::empty;
return String();
if (isForStroke)
return element->getStrokeType().fill.imageResourceName;
@@ -893,12 +893,12 @@ void ColouredElement::addColourAttributes (XmlElement* const e) const
bool ColouredElement::loadColourAttributes (const XmlElement& xml)
{
fillType.restoreFromString (xml.getStringAttribute ("fill", String::empty));
fillType.restoreFromString (xml.getStringAttribute ("fill", String()));
isStrokePresent = showOutline && xml.getBoolAttribute ("hasStroke", false);
strokeType.restoreFromString (xml.getStringAttribute ("stroke", String::empty));
strokeType.fill.restoreFromString (xml.getStringAttribute ("strokeColour", String::empty));
strokeType.restoreFromString (xml.getStringAttribute ("stroke", String()));
strokeType.fill.restoreFromString (xml.getStringAttribute ("strokeColour", String()));
return true;
}


+ 1
- 1
extras/Projucer/Source/ComponentEditor/paintelements/jucer_FillType.h View File

@@ -202,7 +202,7 @@ public:
break;
}
return String::empty;
return String();
}
void restoreFromString (const String& s)


+ 4
- 4
extras/Projucer/Source/ComponentEditor/paintelements/jucer_ImageResourceProperty.h View File

@@ -77,8 +77,8 @@ public:
String resource (document.getResources()
.browseForResource ("Select an image file to add as a resource",
"*.jpg;*.jpeg;*.png;*.gif;*.svg",
File::nonexistent,
String::empty));
File(),
String()));
if (resource.isNotEmpty())
setResource (resource);
@@ -86,7 +86,7 @@ public:
else
{
if (choices[newIndex] == getNoneText() && allowChoiceOfNoResource)
setResource (String::empty);
setResource (String());
else
setResource (choices [newIndex]);
}
@@ -110,7 +110,7 @@ public:
choices.clear();
choices.add ("-- create a new image resource -- ");
choices.add (String::empty);
choices.add (String());
if (allowChoiceOfNoResource)
choices.add (getNoneText());


+ 2
- 2
extras/Projucer/Source/ComponentEditor/paintelements/jucer_PaintElementImage.h View File

@@ -368,7 +368,7 @@ public:
if (xml.hasTagName (getTagName()))
{
position.restoreFromXml (xml, position);
resourceName = xml.getStringAttribute ("resource", String::empty);
resourceName = xml.getStringAttribute ("resource", String());
opacity = xml.getDoubleAttribute ("opacity", 1.0);
mode = (StretchMode) xml.getIntAttribute ("mode", (int) stretched);
@@ -405,7 +405,7 @@ private:
if (element != nullptr)
return element->getResource();
return String::empty;
return String();
}
};


+ 1
- 1
extras/Projucer/Source/ComponentEditor/paintelements/jucer_PaintElementPath.cpp View File

@@ -425,7 +425,7 @@ void PaintElementPath::fillInGeneratedCode (GeneratedCode& code, String& paintMe
r << '\n';
if (somePointsAreRelative)
code.getCallbackCode (String::empty, "void", "resized()", false)
code.getCallbackCode (String(), "void", "resized()", false)
<< pathVariable << ".clear();\n" << r;
else
code.constructorCode << r;


+ 2
- 2
extras/Projucer/Source/ComponentEditor/properties/jucer_FilePropertyComponent.h View File

@@ -35,9 +35,9 @@ public:
const bool allowEditingOfFilename,
const String& fileBrowserWildcard = "*")
: PropertyComponent (name),
filenameComp (name, File::nonexistent, allowEditingOfFilename,
filenameComp (name, File(), allowEditingOfFilename,
isDirectory, false, fileBrowserWildcard,
String::empty, String::empty)
String(), String())
{
addAndMakeVisible (filenameComp);
filenameComp.addListener (this);


+ 2
- 2
extras/Projucer/Source/ComponentEditor/properties/jucer_FontPropertyComponent.h View File

@@ -36,7 +36,7 @@ public:
choices.add (getDefaultSans());
choices.add (getDefaultSerif());
choices.add (getDefaultMono());
choices.add (String::empty);
choices.add (String());
static StringArray fontNames;
@@ -90,7 +90,7 @@ public:
static String getTypefaceNameCode (const String& typefaceName)
{
if (typefaceName == getDefaultFont()) return String::empty;
if (typefaceName == getDefaultFont()) return String();
if (typefaceName == getDefaultSans()) return "Font::getDefaultSansSerifFontName(), ";
if (typefaceName == getDefaultSerif()) return "Font::getDefaultSerifFontName(), ";
if (typefaceName == getDefaultMono()) return "Font::getDefaultMonospacedFontName(), ";


+ 1
- 1
extras/Projucer/Source/ComponentEditor/properties/jucer_PositionPropertyBase.h View File

@@ -414,7 +414,7 @@ protected:
public:
PositionPropLabel (PositionPropertyBase& owner_)
: Label (String::empty, String::empty),
: Label (String(), String()),
owner (owner_)
{
setEditable (true, true, false);


+ 7
- 7
extras/Projucer/Source/ComponentEditor/ui/jucer_JucerDocumentEditor.cpp View File

@@ -47,7 +47,7 @@ public:
: PropertyComponent ("extra callbacks", 250),
document (doc)
{
addAndMakeVisible (listBox = new ListBox (String::empty, this));
addAndMakeVisible (listBox = new ListBox (String(), this));
listBox->setRowHeight (22);
document.addChangeListener (this);
@@ -817,20 +817,20 @@ void JucerDocumentEditor::getCommandInfo (const CommandID commandID, Application
break;
case StandardApplicationCommandIDs::cut:
result.setInfo (TRANS ("Cut"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Cut"), String(), "Editing", 0);
result.setActive (isSomethingSelected());
result.defaultKeypresses.add (KeyPress ('x', cmd, 0));
break;
case StandardApplicationCommandIDs::copy:
result.setInfo (TRANS ("Copy"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Copy"), String(), "Editing", 0);
result.setActive (isSomethingSelected());
result.defaultKeypresses.add (KeyPress ('c', cmd, 0));
break;
case StandardApplicationCommandIDs::paste:
{
result.setInfo (TRANS ("Paste"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Paste"), String(), "Editing", 0);
result.defaultKeypresses.add (KeyPress ('v', cmd, 0));
bool canPaste = false;
@@ -851,18 +851,18 @@ void JucerDocumentEditor::getCommandInfo (const CommandID commandID, Application
break;
case StandardApplicationCommandIDs::del:
result.setInfo (TRANS ("Delete"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Delete"), String(), "Editing", 0);
result.setActive (isSomethingSelected());
break;
case StandardApplicationCommandIDs::selectAll:
result.setInfo (TRANS ("Select All"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Select All"), String(), "Editing", 0);
result.setActive (currentPaintRoutine != nullptr || currentLayout != nullptr);
result.defaultKeypresses.add (KeyPress ('a', cmd, 0));
break;
case StandardApplicationCommandIDs::deselectAll:
result.setInfo (TRANS ("Deselect All"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Deselect All"), String(), "Editing", 0);
result.setActive (currentPaintRoutine != nullptr || currentLayout != nullptr);
result.defaultKeypresses.add (KeyPress ('d', cmd, 0));
break;


+ 3
- 3
extras/Projucer/Source/ComponentEditor/ui/jucer_ResourceEditorPanel.cpp View File

@@ -84,7 +84,7 @@ ResourceEditorPanel::ResourceEditorPanel (JucerDocument& doc)
delButton.addListener (this);
delButton.setEnabled (false);
addAndMakeVisible (listBox = new TableListBox (String::empty, this));
addAndMakeVisible (listBox = new TableListBox (String(), this));
listBox->getHeader().addColumn ("name", 1, 150, 80, 400);
listBox->getHeader().addColumn ("original file", 2, 350, 80, 800);
listBox->getHeader().addColumn ("size", 3, 100, 40, 150);
@@ -247,8 +247,8 @@ void ResourceEditorPanel::buttonClicked (Button* b)
document.getResources()
.browseForResource ("Select a file to add as a resource",
"*",
File::nonexistent,
String::empty);
File(),
String());
}
else if (b == &delButton)
{


+ 1
- 1
extras/Projucer/Source/LiveBuildEngine/projucer_ClassDatabase.h View File

@@ -219,7 +219,7 @@ struct ClassDatabase
if (isAbstract) return "This class is abstract";
if (noDefaultConstructor) return "This class has no default constructor";
if (inAnonymousNamespace) return "This class is declared inside an anonymous namespace";
return String::empty;
return String();
}
bool isDisallowed (const InstantiationFlags& disallowedFlags) const


+ 1
- 1
extras/Projucer/Source/LiveBuildEngine/projucer_ComponentListComp.h View File

@@ -82,7 +82,7 @@ private:
}
String getRenamingName() const override { return getDisplayName(); }
String getDisplayName() const override { return (namespaceToShow != nullptr ? namespaceToShow->name : String::empty) + "::"; }
String getDisplayName() const override { return (namespaceToShow != nullptr ? namespaceToShow->name : String()) + "::"; }
void setName (const String&) override {}
bool isMissing() override { return false; }
Icon getIcon() const override { return Icon (getIcons().graph, getContrastingColour (Colours::darkred, 0.5f)); }


+ 1
- 1
extras/Projucer/Source/LiveBuildEngine/projucer_CppHelpers.h View File

@@ -190,7 +190,7 @@ struct CppParserHelpers
if (CPlusPlusCodeTokeniser::isReservedKeyword (ed.getText().replaceSection (ed.getHighlightedRegion().getStart(),
ed.getHighlightedRegion().getLength(),
s)))
return String::empty;
return String();
return s;
}


+ 1
- 1
extras/Projucer/Source/LiveBuildEngine/projucer_ErrorListComponent.h View File

@@ -27,7 +27,7 @@ class ErrorListComp : public TreePanelBase,
{
public:
ErrorListComp (ErrorList& el)
: TreePanelBase (nullptr, String::empty),
: TreePanelBase (nullptr, String()),
errorList (el)
{
setName ("Errors and Warnings");


+ 1
- 1
extras/Projucer/Source/LiveBuildEngine/projucer_SourceCodeRange.h View File

@@ -82,7 +82,7 @@ struct SourceCodeRange
String toString() const
{
if (file.isEmpty() && range.isEmpty())
return String::empty;
return String();
return file + ":" + String (range.getStart()) + ":" + String (range.getEnd());
}


+ 1
- 1
extras/Projucer/Source/Project Saving/jucer_ProjectExport_AndroidStudio.h View File

@@ -179,7 +179,7 @@ public:
return defaultInstallation;
#endif
return File::nonexistent;
return File();
}
protected:


+ 1
- 1
extras/Projucer/Source/Project Saving/jucer_ProjectExport_CodeBlocks.h View File

@@ -188,7 +188,7 @@ private:
if (isCodeBlocks() && isWindows())
{
defines.set ("__MINGW__", "1");
defines.set ("__MINGW_EXTENSION", String::empty);
defines.set ("__MINGW_EXTENSION", String());
}
else
{


+ 7
- 7
extras/Projucer/Source/Project Saving/jucer_ProjectExport_MSVC.h View File

@@ -767,7 +767,7 @@ protected:
<< newLine
<< "#endif" << newLine;
if (iconFile != File::nonexistent)
if (iconFile != File())
mo << newLine
<< "IDI_ICON1 ICON DISCARDABLE " << iconFile.getFileName().quoted()
<< newLine
@@ -862,7 +862,7 @@ public:
if (group.getID() == ProjectSaver::getGeneratedGroupID())
{
if (iconFile != File::nonexistent)
if (iconFile != File())
{
group.addFileAtIndex (iconFile, -1, true);
group.findItemForFile (iconFile).getShouldAddToBinaryResourcesValue() = false;
@@ -884,7 +884,7 @@ public:
{
MemoryOutputStream mo;
writeSolutionFile (mo, getSolutionVersionString(), String::empty, getVCProjFile());
writeSolutionFile (mo, getSolutionVersionString(), String(), getVCProjFile());
overwriteFileIfDifferentOrThrow (getSLNFile(), mo);
}
@@ -1493,7 +1493,7 @@ protected:
{
XmlElement* targetName = props->createNewChildElement ("TargetName");
setConditionAttribute (*targetName, config);
targetName->addTextElement (config.getOutputFilename (String::empty, true));
targetName->addTextElement (config.getOutputFilename (String(), true));
}
{
@@ -1660,7 +1660,7 @@ protected:
}
}
if (iconFile != File::nonexistent)
if (iconFile != File())
{
XmlElement* e = otherFilesGroup->createNewChildElement ("None");
e->setAttribute ("Include", prependDot (iconFile.getFileName()));
@@ -1694,7 +1694,7 @@ protected:
if (projectType.isStaticLibrary()) return "StaticLibrary";
jassertfalse;
return String::empty;
return String();
}
static const char* getOptimisationLevelString (int level)
@@ -1777,7 +1777,7 @@ protected:
for (int i = 0; i < projectItem.getNumChildren(); ++i)
addFilesToFilter (projectItem.getChild(i),
(path.isEmpty() ? String::empty : (path + "\\")) + projectItem.getChild(i).getName(),
(path.isEmpty() ? String() : (path + "\\")) + projectItem.getChild(i).getName(),
cpps, headers, otherFiles, groups);
}
else if (projectItem.shouldBeAddedToTargetProject())


+ 1
- 1
extras/Projucer/Source/Project Saving/jucer_ProjectExport_XCode.h View File

@@ -550,7 +550,7 @@ public:
xcodeIsExecutable = true;
xcodeCreatePList = false;
xcodeFileType = "compiled.mach-o.executable";
xcodeBundleExtension = String::empty;
xcodeBundleExtension = String();
xcodeProductType = "com.apple.product-type.tool";
xcodeCopyToProductInstallPathAfterBuild = false;
break;


+ 1
- 1
extras/Projucer/Source/Project Saving/jucer_ProjectExporter.cpp View File

@@ -833,5 +833,5 @@ String ProjectExporter::getExternalLibraryFlags (const BuildConfiguration& confi
if (libraries.size() != 0)
return replacePreprocessorTokens (config, "-l" + libraries.joinIntoString (" -l")).trim();
return String::empty;
return String();
}

+ 1
- 1
extras/Projucer/Source/Project Saving/jucer_ProjectExporter.h View File

@@ -384,7 +384,7 @@ protected:
static void writeXmlOrThrow (const XmlElement& xml, const File& file, const String& encoding, int maxCharsPerLine, bool useUnixNewLines = false)
{
MemoryOutputStream mo;
xml.writeToStream (mo, String::empty, false, true, encoding, maxCharsPerLine);
xml.writeToStream (mo, String(), false, true, encoding, maxCharsPerLine);
if (useUnixNewLines)
{


+ 3
- 3
extras/Projucer/Source/Project Saving/jucer_ProjectSaver.h View File

@@ -287,7 +287,7 @@ private:
if (xml != nullptr)
{
MemoryOutputStream mo;
xml->writeToStream (mo, String::empty);
xml->writeToStream (mo, String());
replaceFileIfDifferent (projectFile, mo);
}
}
@@ -324,9 +324,9 @@ private:
if (! foundCodeSection)
{
userContent.add (String::empty);
userContent.add (String());
userContent.add ("// (You can add your own code in this section, and the Projucer will not overwrite it)");
userContent.add (String::empty);
userContent.add (String());
}
return userContent.joinIntoString (newLine) + newLine;


+ 2
- 2
extras/Projucer/Source/Project Saving/jucer_TextWithDefaultPropertyComponent.h View File

@@ -36,7 +36,7 @@ class TextWithDefaultPropertyComponent : public PropertyComponent,
{
public:
LabelComp (TextWithDefaultPropertyComponent& tpc, const int charLimit)
: Label (String::empty, String::empty),
: Label (String(), String()),
owner (tpc),
maxChars (charLimit)
{
@@ -158,7 +158,7 @@ private:
void editorShown (Label*, TextEditor& editor) override
{
if (cachedValue.isUsingDefault())
editor.setText (String::empty, dontSendNotification);
editor.setText (String(), dontSendNotification);
}
void editorHidden (Label*, TextEditor&) override {}


+ 2
- 2
extras/Projucer/Source/Project/jucer_DependencyPathPropertyComponent.cpp View File

@@ -65,7 +65,7 @@ try : TextPropertyComponent (propertyName, 1024, false),
// which has set the project value to whatever is displayed in the label (this may be the
// global/fallback value). In this case we have to reset the project value to blank:
if (initialValueIsEmpty)
getValue().setValue (String::empty);
getValue().setValue (String());
getValue().addListener (this);
setColour (textColourId, getTextColourToDisplay());
@@ -114,7 +114,7 @@ void DependencyPathPropertyComponent::labelTextChanged (Label*)
void DependencyPathPropertyComponent::editorShown (Label* /*label*/, TextEditor& editor)
{
if (! pathValueSource.isUsingProjectSettings())
editor.setText (String::empty, dontSendNotification);
editor.setText (String(), dontSendNotification);
}
void DependencyPathPropertyComponent::editorHidden (Label*, TextEditor&)


+ 1
- 1
extras/Projucer/Source/Project/jucer_DependencyPathPropertyComponent.h View File

@@ -90,7 +90,7 @@ private:
if ((value.refersToSameSourceAs (globalSettingsValue) && isUsingGlobalSettings()))
{
sendChangeMessage (true);
setValue (String::empty); // make sure that the project-specific value is still blank
setValue (String()); // make sure that the project-specific value is still blank
}
}


+ 1
- 1
extras/Projucer/Source/Project/jucer_Module.cpp View File

@@ -761,7 +761,7 @@ void EnabledModuleList::addModuleFromUserSelectedFile()
{
static File lastLocation (findDefaultModulesFolder (project));
FileChooser fc ("Select a module to add...", lastLocation, String::empty, false);
FileChooser fc ("Select a module to add...", lastLocation, String(), false);
if (fc.browseForDirectory())
{


+ 5
- 7
extras/Projucer/Source/Project/jucer_Project.cpp View File

@@ -1231,15 +1231,13 @@ void Project::createExporterForCurrentPlatform()
String Project::getFileTemplate (const String& templateName)
{
int dataSize;
const char* data = BinaryData::getNamedResource (templateName.toUTF8(), dataSize);
if (data == nullptr)
{
jassertfalse;
return String::empty;
}
if (const char* data = BinaryData::getNamedResource (templateName.toUTF8(), dataSize))
return String::fromUTF8 (data, dataSize);
jassertfalse;
return String();
return String::fromUTF8 (data, dataSize);
}
//==============================================================================


+ 2
- 2
extras/Projucer/Source/Project/jucer_ProjectContentComponent.cpp View File

@@ -637,7 +637,7 @@ bool ProjectContentComponent::hasFileInRecentList (const File& f) const
File ProjectContentComponent::getCurrentFile() const
{
return currentDocument != nullptr ? currentDocument->getFile()
: File::nonexistent;
: File();
}
bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc, bool grabFocus)
@@ -1174,7 +1174,7 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica
break;
case CommandIDs::deleteSelectedItem:
result.setInfo ("Delete Selected File", String::empty, CommandCategories::general, 0);
result.setInfo ("Delete Selected File", String(), CommandCategories::general, 0);
result.defaultKeypresses.add (KeyPress (KeyPress::deleteKey, 0, 0));
result.defaultKeypresses.add (KeyPress (KeyPress::backspaceKey, 0, 0));
result.setActive (dynamic_cast<TreePanelBase*> (treeViewTabs.getCurrentContentComponent()) != nullptr);


+ 3
- 3
extras/Projucer/Source/Project/jucer_ProjectTree_Base.h View File

@@ -140,7 +140,7 @@ public:
virtual void browseToAddExistingFiles()
{
const File location (item.isGroup() ? item.determineGroupFolder() : getFile());
FileChooser fc ("Add Files to Jucer Project", location, String::empty, false);
FileChooser fc ("Add Files to Jucer Project", location, String(), false);
if (fc.browseForMultipleFilesOrDirectories())
{
@@ -156,7 +156,7 @@ public:
virtual void checkFileStatus() // (recursive)
{
const File file (getFile());
const bool nowMissing = file != File::nonexistent && ! file.exists();
const bool nowMissing = file != File() && ! file.exists();
if (nowMissing != isFileMissing)
{
@@ -235,7 +235,7 @@ public:
bool mightContainSubItems() override { return item.getNumChildren() > 0; }
String getUniqueName() const override { jassert (item.getID().isNotEmpty()); return item.getID(); }
bool canBeSelected() const override { return true; }
String getTooltip() override { return String::empty; }
String getTooltip() override { return String(); }
File getDraggableFile() const override { return getFile(); }
var getDragSourceDescription() override


+ 3
- 3
extras/Projucer/Source/Utility/jucer_FilePathPropertyComponent.h View File

@@ -39,7 +39,7 @@ public:
const String& propertyDescription,
bool isDirectory,
const String& wildcards = "*",
const File& rootToUseForRelativePaths = File::nonexistent)
const File& rootToUseForRelativePaths = File())
: PropertyComponent (propertyDescription),
innerComp (valueToControl, isDirectory, wildcards, rootToUseForRelativePaths)
{
@@ -122,8 +122,8 @@ private:
void setTo (const File& f)
{
value = (root == File::nonexistent) ? f.getFullPathName()
: f.getRelativePathFrom (root);
value = (root == File()) ? f.getFullPathName()
: f.getRelativePathFrom (root);
}
Value value;


+ 1
- 1
extras/Projucer/Source/Utility/jucer_SVGPathDataComponent.h View File

@@ -27,7 +27,7 @@ class SVGPathDataComponent : public Component,
{
public:
SVGPathDataComponent()
: desc (String::empty,
: desc (String(),
"Paste an SVG path string into the top box, and it'll be converted to some C++ "
"code that will load it as a Path object..")
{


+ 4
- 5
extras/Projucer/Source/Utility/jucer_TranslationTool.h View File

@@ -201,7 +201,7 @@ struct TranslationHelpers
if (currentItem.isNotEmpty())
result.add (currentItem);
currentItem = String::empty;
currentItem = String();
}
else
{
@@ -273,7 +273,7 @@ struct TranslationHelpers
{
lines.add ("language: " + original.getLanguageName());
lines.add ("countries: " + original.getCountryCodes().joinIntoString (" "));
lines.add (String::empty);
lines.add (String());
const StringArray& originalKeys (originalStrings.getAllKeys());
const StringArray& originalValues (originalStrings.getAllValues());
@@ -296,7 +296,7 @@ struct TranslationHelpers
{
lines.add ("language: [enter full name of the language here!]");
lines.add ("countries: [enter list of 2-character country codes here!]");
lines.add (String::empty);
lines.add (String());
}
for (int i = 0; i < preStrings.size(); ++i)
@@ -429,8 +429,7 @@ private:
void loadFile()
{
FileChooser fc ("Choose a translation file to load",
File::nonexistent,
"*");
File(), "*");
if (fc.browseForFileToOpen())
{


+ 1
- 1
extras/Projucer/Source/Utility/jucer_UTF8Component.h View File

@@ -27,7 +27,7 @@ class UTF8Component : public Component,
{
public:
UTF8Component()
: desc (String::empty,
: desc (String(),
"Type any string into the box, and it'll be shown below as a portable UTF-8 literal, "
"ready to cut-and-paste into your source-code...")
{


+ 1
- 1
extras/Projucer/Source/Wizards/jucer_NewFileWizard.cpp View File

@@ -142,7 +142,7 @@ public:
TRANS ("Please enter the name for the new class"),
AlertWindow::NoIcon, nullptr);
aw.addTextEditor (getClassNameFieldName(), String::empty, String::empty, false);
aw.addTextEditor (getClassNameFieldName(), String(), String(), false);
aw.addButton (TRANS ("Create Files"), 1, KeyPress (KeyPress::returnKey));
aw.addButton (TRANS ("Cancel"), 0, KeyPress (KeyPress::escapeKey));


+ 1
- 1
extras/Projucer/Source/Wizards/jucer_NewProjectWizard.h View File

@@ -38,7 +38,7 @@ static ComboBox& createFileCreationOptionComboBox (Component& setupComp,
c->addItemList (fileOptions, 1);
c->setSelectedId (1, dontSendNotification);
Label* l = new Label (String::empty, TRANS("Files to Auto-Generate") + ":");
Label* l = new Label (String(), TRANS("Files to Auto-Generate") + ":");
l->attachToComponent (c, true);
itemsCreated.add (l);


+ 6
- 6
extras/Projucer/Source/Wizards/jucer_NewProjectWizardComponent.h View File

@@ -34,9 +34,9 @@ public:
ModulesFolderPathBox (File initialFileOrDirectory)
: currentPathBox ("currentPathBox"),
openFolderButton (TRANS("...")),
modulesLabel (String::empty, TRANS("Modules Folder") + ":")
modulesLabel (String(), TRANS("Modules Folder") + ":")
{
if (initialFileOrDirectory == File::nonexistent)
if (initialFileOrDirectory == File())
initialFileOrDirectory = findDefaultModulesFolder();
setModulesFolder (initialFileOrDirectory);
@@ -263,14 +263,14 @@ public:
WizardComp()
: platformTargets(),
projectName (TRANS("Project name")),
nameLabel (String::empty, TRANS("Project Name") + ":"),
typeLabel (String::empty, TRANS("Project Type") + ":"),
nameLabel (String(), TRANS("Project Name") + ":"),
typeLabel (String(), TRANS("Project Type") + ":"),
fileBrowser (FileBrowserComponent::saveMode
| FileBrowserComponent::canSelectDirectories
| FileBrowserComponent::doNotClearFileNameOnRootChange,
NewProjectWizardClasses::getLastWizardFolder(), nullptr, nullptr),
fileOutline (String::empty, TRANS("Project Folder") + ":"),
targetsOutline (String::empty, TRANS("Target Platforms") + ":"),
fileOutline (String(), TRANS("Project Folder") + ":"),
targetsOutline (String(), TRANS("Target Platforms") + ":"),
createButton (TRANS("Create") + "..."),
cancelButton (TRANS("Cancel")),
modulesPathBox (findDefaultModulesFolder())


+ 1
- 1
extras/Projucer/Source/Wizards/jucer_TemplateThumbnailsComponent.h View File

@@ -254,7 +254,7 @@ public:
appFolder = appFolder.getParentDirectory();
}
return File::nonexistent;
return File();
}
private:


+ 1
- 1
modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm View File

@@ -254,7 +254,7 @@ struct OpenDiskDevice
[device releaseMediaReservation];
[device releaseExclusiveAccess];
return String::empty;
return String();
}
DRDevice* device;


+ 1
- 1
modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h View File

@@ -129,7 +129,7 @@ public:
if (settings != nullptr)
f = File (settings->getValue ("lastStateFile"));
if (f == File::nonexistent)
if (f == File())
f = File::getSpecialLocation (File::userDocumentsDirectory);
return f;


+ 5
- 6
modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h View File

@@ -44,12 +44,11 @@ public:
@param formatToLookFor this is the type of format that you want to look for
@param directoriesToSearch the path to search
@param searchRecursively true to search recursively
@param deadMansPedalFile if this isn't File::nonexistent, then it will
be used as a file to store the names of any plugins
that crash during initialisation. If there are
any plugins listed in it, then these will always
be scanned after all other possible files have
been tried - in this way, even if there's a few
@param deadMansPedalFile if this isn't File(), then it will be used as a file
to store the names of any plugins that crash during
initialisation. If there are any plugins listed in it,
then these will always be scanned after all other possible
files have been tried - in this way, even if there's a few
dodgy plugins in your path, then a couple of rescans
will still manage to find all the proper plugins.
It's probably best to choose a file in the user's


+ 2
- 2
modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp View File

@@ -336,7 +336,7 @@ public:
bool allowPluginsWhichRequireAsynchronousInstantiation, int threads,
const String& title, const String& text)
: owner (plc), formatToScan (format), propertiesToUse (properties),
pathChooserWindow (TRANS("Select folders to scan..."), String::empty, AlertWindow::NoIcon),
pathChooserWindow (TRANS("Select folders to scan..."), String(), AlertWindow::NoIcon),
progressWindow (title, text, AlertWindow::NoIcon),
progress (0.0), numThreads (threads), allowAsync (allowPluginsWhichRequireAsynchronousInstantiation),
finished (false)
@@ -422,7 +422,7 @@ private:
+ TRANS ("Are you sure you want to scan the folder \"XYZ\"?")
.replace ("XYZ", f.getFullPathName()),
TRANS ("Scan"),
String::empty,
String(),
nullptr,
ModalCallbackFunction::create (warnAboutStupidPathsCallback, this));
return;


+ 19
- 19
modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp View File

@@ -76,7 +76,7 @@ class AudioDeviceSelectorComponent::MidiInputSelectorComponentListBox : public
{
public:
MidiInputSelectorComponentListBox (AudioDeviceManager& dm, const String& noItems)
: ListBox (String::empty, nullptr),
: ListBox (String(), nullptr),
deviceManager (dm),
noItemsMessage (noItems)
{
@@ -340,11 +340,11 @@ public:
|| comboBoxThatHasChanged == inputDeviceDropDown)
{
if (outputDeviceDropDown != nullptr)
config.outputDeviceName = outputDeviceDropDown->getSelectedId() < 0 ? String::empty
config.outputDeviceName = outputDeviceDropDown->getSelectedId() < 0 ? String()
: outputDeviceDropDown->getText();
if (inputDeviceDropDown != nullptr)
config.inputDeviceName = inputDeviceDropDown->getSelectedId() < 0 ? String::empty
config.inputDeviceName = inputDeviceDropDown->getSelectedId() < 0 ? String()
: inputDeviceDropDown->getText();
if (! type.hasSeparateInputsAndOutputs())
@@ -390,7 +390,7 @@ public:
{
if (AudioIODevice* const device = setup.manager->getCurrentAudioDevice())
{
Component modalWindow (String::empty);
Component modalWindow;
modalWindow.setOpaque (true);
modalWindow.addToDesktop (0);
modalWindow.enterModalState();
@@ -445,7 +445,7 @@ public:
addAndMakeVisible (outputChanList
= new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioOutputType,
TRANS ("(no audio output channels found)")));
outputChanLabel = new Label (String::empty, TRANS("Active output channels:"));
outputChanLabel = new Label (String(), TRANS("Active output channels:"));
outputChanLabel->setJustificationType (Justification::centredRight);
outputChanLabel->attachToComponent (outputChanList, true);
}
@@ -466,7 +466,7 @@ public:
addAndMakeVisible (inputChanList
= new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioInputType,
TRANS("(no audio input channels found)")));
inputChanLabel = new Label (String::empty, TRANS("Active input channels:"));
inputChanLabel = new Label (String(), TRANS("Active input channels:"));
inputChanLabel->setJustificationType (Justification::centredRight);
inputChanLabel->attachToComponent (inputChanList, true);
}
@@ -605,11 +605,11 @@ private:
{
if (outputDeviceDropDown == nullptr)
{
outputDeviceDropDown = new ComboBox (String::empty);
outputDeviceDropDown = new ComboBox (String());
outputDeviceDropDown->addListener (this);
addAndMakeVisible (outputDeviceDropDown);
outputDeviceLabel = new Label (String::empty,
outputDeviceLabel = new Label (String(),
type.hasSeparateInputsAndOutputs() ? TRANS("Output:")
: TRANS("Device:"));
outputDeviceLabel->attachToComponent (outputDeviceDropDown, true);
@@ -634,11 +634,11 @@ private:
{
if (inputDeviceDropDown == nullptr)
{
inputDeviceDropDown = new ComboBox (String::empty);
inputDeviceDropDown = new ComboBox (String());
inputDeviceDropDown->addListener (this);
addAndMakeVisible (inputDeviceDropDown);
inputDeviceLabel = new Label (String::empty, TRANS("Input:"));
inputDeviceLabel = new Label (String(), TRANS("Input:"));
inputDeviceLabel->attachToComponent (inputDeviceDropDown, true);
addAndMakeVisible (inputLevelMeter
@@ -655,9 +655,9 @@ private:
{
if (sampleRateDropDown == nullptr)
{
addAndMakeVisible (sampleRateDropDown = new ComboBox (String::empty));
addAndMakeVisible (sampleRateDropDown = new ComboBox (String()));
sampleRateLabel = new Label (String::empty, TRANS("Sample rate:"));
sampleRateLabel = new Label (String(), TRANS("Sample rate:"));
sampleRateLabel->attachToComponent (sampleRateDropDown, true);
}
else
@@ -682,9 +682,9 @@ private:
{
if (bufferSizeDropDown == nullptr)
{
addAndMakeVisible (bufferSizeDropDown = new ComboBox (String::empty));
addAndMakeVisible (bufferSizeDropDown = new ComboBox (String()));
bufferSizeLabel = new Label (String::empty, TRANS("Audio buffer size:"));
bufferSizeLabel = new Label (String(), TRANS("Audio buffer size:"));
bufferSizeLabel->attachToComponent (bufferSizeDropDown, true);
}
else
@@ -724,7 +724,7 @@ public:
//==============================================================================
ChannelSelectorListBox (const AudioDeviceSetupDetails& setupDetails,
const BoxType boxType, const String& noItemsText)
: ListBox (String::empty, nullptr),
: ListBox (String(), nullptr),
setup (setupDetails), type (boxType), noItemsMessage (noItemsText)
{
refresh();
@@ -993,7 +993,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
if (types.size() > 1)
{
deviceTypeDropDown = new ComboBox (String::empty);
deviceTypeDropDown = new ComboBox (String());
for (int i = 0; i < types.size(); ++i)
deviceTypeDropDown->addItem (types.getUnchecked(i)->getTypeName(), i + 1);
@@ -1001,7 +1001,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
addAndMakeVisible (deviceTypeDropDown);
deviceTypeDropDown->addListener (this);
deviceTypeDropDownLabel = new Label (String::empty, TRANS("Audio device type:"));
deviceTypeDropDownLabel = new Label (String(), TRANS("Audio device type:"));
deviceTypeDropDownLabel->setJustificationType (Justification::centredRight);
deviceTypeDropDownLabel->attachToComponent (deviceTypeDropDown, true);
}
@@ -1012,7 +1012,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
= new MidiInputSelectorComponentListBox (deviceManager,
"(" + TRANS("No MIDI inputs available") + ")"));
midiInputsLabel = new Label (String::empty, TRANS ("Active MIDI inputs:"));
midiInputsLabel = new Label (String(), TRANS ("Active MIDI inputs:"));
midiInputsLabel->setJustificationType (Justification::topRight);
midiInputsLabel->attachToComponent (midiInputsList, true);
@@ -1032,7 +1032,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
if (showMidiOutputSelector)
{
addAndMakeVisible (midiOutputSelector = new ComboBox (String::empty));
addAndMakeVisible (midiOutputSelector = new ComboBox (String()));
midiOutputSelector->addListener (this);
midiOutputLabel = new Label ("lm", TRANS("MIDI Output:"));


+ 1
- 1
modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp View File

@@ -26,7 +26,7 @@ class MidiKeyboardUpDownButton : public Button
{
public:
MidiKeyboardUpDownButton (MidiKeyboardComponent& comp, const int d)
: Button (String::empty), owner (comp), delta (d)
: Button (String()), owner (comp), delta (d)
{
}


+ 12
- 2
modules/juce_core/containers/juce_NamedValueSet.cpp View File

@@ -85,12 +85,22 @@ bool NamedValueSet::isEmpty() const noexcept
return values.isEmpty();
}
static const var& getNullVarRef() noexcept
{
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
return var::null;
#else
static var nullVar;
return nullVar;
#endif
}
const var& NamedValueSet::operator[] (const Identifier& name) const noexcept
{
if (const var* v = getVarPointer (name))
return *v;
return var::null;
return getNullVarRef();
}
var NamedValueSet::getWithDefault (const Identifier& name, const var& defaultReturnValue) const
@@ -189,7 +199,7 @@ const var& NamedValueSet::getValueAt (const int index) const noexcept
return values.getReference (index).value;
jassertfalse;
return var::null;
return getNullVarRef();
}
var* NamedValueSet::getVarPointerAt (int index) const noexcept


+ 3
- 1
modules/juce_core/containers/juce_Variant.cpp View File

@@ -434,7 +434,9 @@ var::var() noexcept : type (&VariantType_Void::instance) {}
var::var (const VariantType& t) noexcept : type (&t) {}
var::~var() noexcept { type->cleanUp (value); }
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const var var::null;
#endif
//==============================================================================
var::var (const var& valueToCopy) : type (valueToCopy.type)
@@ -582,7 +584,7 @@ const var& var::operator[] (const Identifier& propertyName) const
if (DynamicObject* const o = getDynamicObject())
return o->getProperty (propertyName);
return var::null;
return getNullVarRef();
}
const var& var::operator[] (const char* const propertyName) const


+ 2
- 0
modules/juce_core/containers/juce_Variant.h View File

@@ -70,8 +70,10 @@ public:
/** Destructor. */
~var() noexcept;
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** A static var object that can be used where you need an empty variant object. */
static const var null;
#endif
var (const var& valueToCopy);
var (int value) noexcept;


+ 5
- 3
modules/juce_core/files/juce_File.cpp View File

@@ -68,7 +68,9 @@ File& File::operator= (File&& other) noexcept
}
#endif
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const File File::nonexistent;
#endif
//==============================================================================
static String removeEllipsis (const String& path)
@@ -1009,9 +1011,9 @@ public:
const File home (File::getSpecialLocation (File::userHomeDirectory));
const File temp (File::getSpecialLocation (File::tempDirectory));
expect (! File::nonexistent.exists());
expect (! File::nonexistent.existsAsFile());
expect (! File::nonexistent.isDirectory());
expect (! File().exists());
expect (! File().existsAsFile());
expect (! File().isDirectory());
#if ! JUCE_WINDOWS
expect (File("/").isDirectory());
#endif


+ 7
- 3
modules/juce_core/files/juce_File.h View File

@@ -49,8 +49,7 @@ public:
/** Creates an (invalid) file object.
The file is initially set to an empty path, so getFullPathName() will return
an empty string, and comparing the file to File::nonexistent will return
true.
an empty string.
You can use its operator= method to point it at a proper file.
*/
@@ -95,8 +94,13 @@ public:
#endif
//==============================================================================
/** This static constant is used for referring to an 'invalid' file. */
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** This static constant is used for referring to an 'invalid' file.
Bear in mind that you should avoid this kind of static variable, and always prefer
to use File() or {} if you need a default-constructed File object.
*/
static const File nonexistent;
#endif
//==============================================================================
/** Checks whether the file actually exists.


+ 1
- 1
modules/juce_core/javascript/juce_JSON.cpp View File

@@ -625,7 +625,7 @@ public:
beginTest ("JSON");
Random r = getRandom();
expect (JSON::parse (String::empty) == var());
expect (JSON::parse (String()) == var());
expect (JSON::parse ("{}").isObject());
expect (JSON::parse ("[]").isArray());
expect (JSON::parse ("[ 1234 ]")[0].isInt());


+ 10
- 0
modules/juce_core/juce_core.h View File

@@ -156,6 +156,16 @@
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1
#endif
/* Config: JUCE_ALLOW_STATIC_NULL_VARIABLES
If disabled, this will turn off dangerous static globals like String::empty, var::null, etc
which can cause nasty order-of-initialisation problems if they are referenced during static
constructor code.
*/
#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES
#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1
#endif
#ifndef JUCE_STRING_UTF_TYPE
#define JUCE_STRING_UTF_TYPE 8
#endif


+ 20
- 18
modules/juce_core/text/juce_String.cpp View File

@@ -237,7 +237,9 @@ private:
}
};
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const String String::empty;
#endif
//==============================================================================
String::String() noexcept : text (&(emptyString.text))
@@ -2270,7 +2272,7 @@ public:
beginTest ("Basics");
expect (String().length() == 0);
expect (String() == String::empty);
expect (String() == String());
String s1, s2 ("abcd");
expect (s1.isEmpty() && ! s1.isNotEmpty());
expect (s2.isNotEmpty() && ! s2.isEmpty());
@@ -2282,16 +2284,16 @@ public:
expect (String ("abcdefg", 4) == L"abcd");
expect (String ("abcdefg", 4) == String (L"abcdefg", 4));
expect (String::charToString ('x') == "x");
expect (String::charToString (0) == String::empty);
expect (String::charToString (0) == String());
expect (s2 + "e" == "abcde" && s2 + 'e' == "abcde");
expect (s2 + L'e' == "abcde" && s2 + L"e" == "abcde");
expect (s1.equalsIgnoreCase ("abcD") && s1 < "abce" && s1 > "abbb");
expect (s1.startsWith ("ab") && s1.startsWith ("abcd") && ! s1.startsWith ("abcde"));
expect (s1.startsWithIgnoreCase ("aB") && s1.endsWithIgnoreCase ("CD"));
expect (s1.endsWith ("bcd") && ! s1.endsWith ("aabcd"));
expectEquals (s1.indexOf (String::empty), 0);
expectEquals (s1.indexOfIgnoreCase (String::empty), 0);
expect (s1.startsWith (String::empty) && s1.endsWith (String::empty) && s1.contains (String::empty));
expectEquals (s1.indexOf (String()), 0);
expectEquals (s1.indexOfIgnoreCase (String()), 0);
expect (s1.startsWith (String()) && s1.endsWith (String()) && s1.contains (String()));
expect (s1.contains ("cd") && s1.contains ("ab") && s1.contains ("abcd"));
expect (s1.containsChar ('a'));
expect (! s1.containsChar ('x'));
@@ -2472,9 +2474,9 @@ public:
}
beginTest ("Numeric conversions");
expect (String::empty.getIntValue() == 0);
expect (String::empty.getDoubleValue() == 0.0);
expect (String::empty.getFloatValue() == 0.0f);
expect (String().getIntValue() == 0);
expect (String().getDoubleValue() == 0.0);
expect (String().getFloatValue() == 0.0f);
expect (s.getIntValue() == 12345678);
expect (s.getLargeIntValue() == (int64) 12345678);
expect (s.getDoubleValue() == 12345678.0);
@@ -2511,11 +2513,11 @@ public:
expect (s3.containsAnyOf (String (L"zzzFs")));
expect (s3.startsWith ("abcd"));
expect (s3.startsWithIgnoreCase (String (L"abCD")));
expect (s3.startsWith (String::empty));
expect (s3.startsWith (String()));
expect (s3.startsWithChar ('a'));
expect (s3.endsWith (String ("HIJ")));
expect (s3.endsWithIgnoreCase (String (L"Hij")));
expect (s3.endsWith (String::empty));
expect (s3.endsWith (String()));
expect (s3.endsWithChar (L'J'));
expect (s3.indexOf ("HIJ") == 7);
expect (s3.indexOf (String (L"HIJK")) == -1);
@@ -2565,28 +2567,28 @@ public:
expect (! String ("xx?y").matchesWildcard ("xx?y?", true));
expect (String ("xx?y").matchesWildcard ("xx??", true));
expectEquals (s5.fromFirstOccurrenceOf (String::empty, true, false), s5);
expectEquals (s5.fromFirstOccurrenceOf (String(), true, false), s5);
expectEquals (s5.fromFirstOccurrenceOf ("xword2", true, false), s5.substring (100));
expectEquals (s5.fromFirstOccurrenceOf (String (L"word2"), true, false), s5.substring (5));
expectEquals (s5.fromFirstOccurrenceOf ("Word2", true, true), s5.substring (5));
expectEquals (s5.fromFirstOccurrenceOf ("word2", false, false), s5.getLastCharacters (6));
expectEquals (s5.fromFirstOccurrenceOf ("Word2", false, true), s5.getLastCharacters (6));
expectEquals (s5.fromLastOccurrenceOf (String::empty, true, false), s5);
expectEquals (s5.fromLastOccurrenceOf (String(), true, false), s5);
expectEquals (s5.fromLastOccurrenceOf ("wordx", true, false), s5);
expectEquals (s5.fromLastOccurrenceOf ("word", true, false), s5.getLastCharacters (5));
expectEquals (s5.fromLastOccurrenceOf ("worD", true, true), s5.getLastCharacters (5));
expectEquals (s5.fromLastOccurrenceOf ("word", false, false), s5.getLastCharacters (1));
expectEquals (s5.fromLastOccurrenceOf ("worD", false, true), s5.getLastCharacters (1));
expect (s5.upToFirstOccurrenceOf (String::empty, true, false).isEmpty());
expect (s5.upToFirstOccurrenceOf (String(), true, false).isEmpty());
expectEquals (s5.upToFirstOccurrenceOf ("word4", true, false), s5);
expectEquals (s5.upToFirstOccurrenceOf ("word2", true, false), s5.substring (0, 10));
expectEquals (s5.upToFirstOccurrenceOf ("Word2", true, true), s5.substring (0, 10));
expectEquals (s5.upToFirstOccurrenceOf ("word2", false, false), s5.substring (0, 5));
expectEquals (s5.upToFirstOccurrenceOf ("Word2", false, true), s5.substring (0, 5));
expectEquals (s5.upToLastOccurrenceOf (String::empty, true, false), s5);
expectEquals (s5.upToLastOccurrenceOf (String(), true, false), s5);
expectEquals (s5.upToLastOccurrenceOf ("zword", true, false), s5);
expectEquals (s5.upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1));
expectEquals (s5.dropLastCharacters(1).upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1));
@@ -2604,9 +2606,9 @@ public:
expect (s5.replaceCharacters ("wo", "xy") != s5);
expectEquals (s5.replaceCharacters ("wo", "xy").replaceCharacters ("xy", "wo"), s5);
expectEquals (s5.retainCharacters ("1wordxya"), String ("wordwordword"));
expect (s5.retainCharacters (String::empty).isEmpty());
expect (s5.retainCharacters (String()).isEmpty());
expect (s5.removeCharacters ("1wordxya") == " 2 3");
expectEquals (s5.removeCharacters (String::empty), s5);
expectEquals (s5.removeCharacters (String()), s5);
expect (s5.initialSectionContainingOnly ("word") == L"word");
expect (String ("word").initialSectionContainingOnly ("word") == L"word");
expectEquals (s5.initialSectionNotContaining (String ("xyz ")), String ("word"));
@@ -2647,9 +2649,9 @@ public:
expectEquals (s.joinIntoString ("-"), String ("4-3-2-1-0"));
s.remove (2);
expectEquals (s.joinIntoString ("--"), String ("4--3--1--0"));
expectEquals (s.joinIntoString (String::empty), String ("4310"));
expectEquals (s.joinIntoString (StringRef()), String ("4310"));
s.clear();
expectEquals (s.joinIntoString ("x"), String::empty);
expectEquals (s.joinIntoString ("x"), String());
StringArray toks;
toks.addTokens ("x,,", ";,", "");


+ 3
- 1
modules/juce_core/text/juce_String.h View File

@@ -147,13 +147,15 @@ public:
~String() noexcept;
//==============================================================================
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** This is a static empty string object that can be used if you need a reference to one.
The value of String::empty is exactly the same as String(), and in almost all cases
it's better to avoid String::empty and just use String() instead, so that the compiler
it's better to avoid String::empty and just use String() or {} instead, so that the compiler
only has to reason about locally-constructed objects, rather than taking into account
the fact that you're referencing a global shared static memory address.
*/
static const String empty;
#endif
/** This is the character encoding type used internally to store the string.


+ 5
- 0
modules/juce_core/text/juce_StringArray.cpp View File

@@ -127,7 +127,12 @@ const String& StringArray::operator[] (const int index) const noexcept
if (isPositiveAndBelow (index, strings.size()))
return strings.getReference (index);
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
return String::empty;
#else
static String empty;
return empty;
#endif
}
String& StringArray::getReference (const int index) noexcept


+ 3
- 3
modules/juce_core/text/juce_TextDiff.cpp View File

@@ -262,9 +262,9 @@ public:
Random r = getRandom();
testDiff (String::empty, String::empty);
testDiff ("x", String::empty);
testDiff (String::empty, "x");
testDiff (String(), String());
testDiff ("x", String());
testDiff (String(), "x");
testDiff ("x", "x");
testDiff ("x", "y");
testDiff ("xxx", "x");


+ 1
- 1
modules/juce_core/time/juce_PerformanceCounter.h View File

@@ -60,7 +60,7 @@ public:
@param counterName the name used when printing out the statistics
@param runsPerPrintout the number of start/stop iterations before calling
printStatistics()
@param loggingFile a file to dump the results to - if this is File::nonexistent,
@param loggingFile a file to dump the results to - if this is File(),
the results are just written to the debugger output
*/
PerformanceCounter (const String& counterName,


+ 13
- 3
modules/juce_core/xml/juce_XmlElement.cpp View File

@@ -460,12 +460,22 @@ int XmlElement::getNumAttributes() const noexcept
return attributes.size();
}
static const String& getEmptyStringRef() noexcept
{
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
return String::empty;
#else
static String empty;
return empty;
#endif
}
const String& XmlElement::getAttributeName (const int index) const noexcept
{
if (const XmlAttributeNode* const att = attributes [index])
return att->name.toString();
return String::empty;
return getEmptyStringRef();
}
const String& XmlElement::getAttributeValue (const int index) const noexcept
@@ -473,7 +483,7 @@ const String& XmlElement::getAttributeValue (const int index) const noexcept
if (const XmlAttributeNode* const att = attributes [index])
return att->value;
return String::empty;
return getEmptyStringRef();
}
XmlElement::XmlAttributeNode* XmlElement::getAttribute (StringRef attributeName) const noexcept
@@ -496,7 +506,7 @@ const String& XmlElement::getStringAttribute (StringRef attributeName) const noe
if (const XmlAttributeNode* att = getAttribute (attributeName))
return att->value;
return String::empty;
return getEmptyStringRef();
}
String XmlElement::getStringAttribute (StringRef attributeName, const String& defaultReturnValue) const


+ 15
- 3
modules/juce_data_structures/values/juce_ValueTree.cpp View File

@@ -627,7 +627,9 @@ ValueTree::ValueTree() noexcept
{
}
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const ValueTree ValueTree::invalid;
#endif
ValueTree::ValueTree (const Identifier& type) : object (new ValueTree::SharedObject (type))
{
@@ -721,20 +723,30 @@ ValueTree ValueTree::getParent() const noexcept
ValueTree ValueTree::getSibling (const int delta) const noexcept
{
if (object == nullptr || object->parent == nullptr)
return invalid;
return ValueTree();
const int index = object->parent->indexOf (*this) + delta;
return ValueTree (object->parent->children.getObjectPointer (index));
}
static const var& getNullVarRef() noexcept
{
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
return var::null;
#else
static var nullVar;
return nullVar;
#endif
}
const var& ValueTree::operator[] (const Identifier& name) const noexcept
{
return object == nullptr ? var::null : object->properties[name];
return object == nullptr ? getNullVarRef() : object->properties[name];
}
const var& ValueTree::getProperty (const Identifier& name) const noexcept
{
return object == nullptr ? var::null : object->properties[name];
return object == nullptr ? getNullVarRef() : object->properties[name];
}
var ValueTree::getProperty (const Identifier& name, const var& defaultReturnValue) const


+ 4
- 1
modules/juce_data_structures/values/juce_ValueTree.h View File

@@ -523,10 +523,13 @@ public:
}
}
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** An invalid ValueTree that can be used if you need to return one as an error condition, etc.
This invalid object is equivalent to ValueTree created with its default constructor.
This invalid object is equivalent to ValueTree created with its default constructor, but
you should always prefer to avoid it and use ValueTree() or {} instead.
*/
static const ValueTree invalid;
#endif
/** Returns the total number of references to the shared underlying data structure that this
ValueTree is using.


+ 2
- 0
modules/juce_graphics/geometry/juce_AffineTransform.cpp View File

@@ -79,7 +79,9 @@ bool AffineTransform::isIdentity() const noexcept
&& (mat11 == 1.0f);
}
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const AffineTransform AffineTransform::identity;
#endif
//==============================================================================
AffineTransform AffineTransform::followedBy (const AffineTransform& other) const noexcept


+ 5
- 7
modules/juce_graphics/geometry/juce_AffineTransform.h View File

@@ -67,15 +67,13 @@ public:
/** Compares two transforms. */
bool operator!= (const AffineTransform& other) const noexcept;
/** A ready-to-use identity transform, which you can use to append other
transformations to.
e.g. @code
AffineTransform myTransform = AffineTransform().rotated (.5f)
.scaled (2.0f);
@endcode
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** A ready-to-use identity transform.
Note that you should always avoid using a static variable like this, and
prefer AffineTransform() or {} if you need a default-constructed instance.
*/
static const AffineTransform identity;
#endif
//==============================================================================
/** Transforms a 2D coordinate using this matrix. */


+ 2
- 0
modules/juce_graphics/images/juce_Image.cpp View File

@@ -259,7 +259,9 @@ Image::~Image()
{
}
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const Image Image::null;
#endif
int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); }
int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; }


+ 4
- 1
modules/juce_graphics/images/juce_Image.h View File

@@ -146,10 +146,13 @@ public:
*/
inline bool isNull() const noexcept { return image == nullptr; }
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** A null Image object that can be used when you need to return an invalid image.
This object is the equivalient to an Image created with the default constructor.
This object is the equivalient to an Image created with the default constructor, and
you should always prefer to use Image() or {} when you need an empty image object.
*/
static const Image null;
#endif
//==============================================================================
/** Returns the image's width (in pixels). */


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save