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


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

@@ -31,7 +31,7 @@ class CodeEditorDemo : public Component,
{ {
public: public:
CodeEditorDemo() CodeEditorDemo()
: fileChooser ("File", File::nonexistent, true, false, false,
: fileChooser ("File", File(), true, false, false,
"*.cpp;*.h;*.hpp;*.c;*.mm;*.m", String(), "*.cpp;*.h;*.hpp;*.c;*.mm;*.m", String(),
"Choose a C++ file to open it in the editor") "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: public:
FontsDemo() FontsDemo()
: heightLabel (String::empty, "Height:"),
kerningLabel (String::empty, "Kerning:"),
scaleLabel (String::empty, "Scale:"),
: heightLabel (String(), "Height:"),
kerningLabel (String(), "Kerning:"),
scaleLabel (String(), "Scale:"),
styleLabel ("Style"), styleLabel ("Style"),
boldToggle ("Bold"), boldToggle ("Bold"),
italicToggle ("Italic") italicToggle ("Italic")


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

@@ -395,7 +395,7 @@ class ImagesRenderingDemo : public GraphicsDemoBase
{ {
public: public:
ImagesRenderingDemo (ControllersComponent& cc, bool argb_, bool tiled_) 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_) isArgb (argb_), isTiled (tiled_)
{ {
argbImage = ImageFileFormat::loadFrom (BinaryData::juce_icon_png, (size_t) BinaryData::juce_icon_pngSize); 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 File getLastDocumentOpened() override
{ {
// not interested in this for now // not interested in this for now
return File::nonexistent;
return File();
} }
void setLastDocumentOpened (const File& /*file*/) override 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); 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) if (shader != nullptr)
{ {
statusLabel.setText (String::empty, dontSendNotification);
statusLabel.setText (String(), dontSendNotification);
shader->fillRect (g.getInternalContext(), getLocalBounds()); shader->fillRect (g.getInternalContext(), getLocalBounds());
} }


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

@@ -35,8 +35,8 @@ class MovieComponentWithFileBrowser : public Component,
public: public:
MovieComponentWithFileBrowser() MovieComponentWithFileBrowser()
: isDragOver (false), : 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); 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 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: public:
ToolbarDemoComp() 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"), orientationButton ("Vertical/Horizontal"),
customiseButton ("Customise...") customiseButton ("Customise...")
{ {


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

@@ -356,9 +356,9 @@ private:
{ {
switch (type) 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: 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.addDefaultKeypress ('i', ModifierKeys::commandModifier);
result.setTicked (isLookAndFeelSelected<LookAndFeel_V1>()); result.setTicked (isLookAndFeelSelected<LookAndFeel_V1>());
break; break;
case MainAppWindow::useLookAndFeelV2: 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.addDefaultKeypress ('o', ModifierKeys::commandModifier);
result.setTicked (isLookAndFeelSelected<LookAndFeel_V2>()); result.setTicked (isLookAndFeelSelected<LookAndFeel_V2>());
break; break;
case MainAppWindow::useLookAndFeelV3: 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.addDefaultKeypress ('p', ModifierKeys::commandModifier);
result.setTicked (isLookAndFeelSelected<LookAndFeel_V3>()); result.setTicked (isLookAndFeelSelected<LookAndFeel_V3>());
break; break;
case MainAppWindow::toggleRepaintDebugging: 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.addDefaultKeypress ('r', ModifierKeys());
result.setTicked (juceDemoRepaintDebuggingActive); result.setTicked (juceDemoRepaintDebuggingActive);
break; break;
case MainAppWindow::useNativeTitleBar: 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); result.addDefaultKeypress ('n', ModifierKeys::commandModifier);
bool nativeTitlebar = false; bool nativeTitlebar = false;
@@ -405,7 +405,7 @@ private:
#if ! JUCE_LINUX #if ! JUCE_LINUX
case MainAppWindow::goToKioskMode: 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.addDefaultKeypress ('f', ModifierKeys::commandModifier);
result.setTicked (Desktop::getInstance().getKioskModeComponent() != 0); result.setTicked (Desktop::getInstance().getKioskModeComponent() != 0);
break; break;


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

@@ -50,18 +50,18 @@ public:
//============================================================================== //==============================================================================
MPESetupComponent() 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"), addZoneButton ("Add this zone"),
clearAllZonesButton ("Clear all zones"), 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"), legacyModeEnabledToggle ("Enable Legacy Mode"),
voiceStealingEnabledToggle ("Enable synth voice stealing"), voiceStealingEnabledToggle ("Enable synth voice stealing"),
numberOfVoicesLabel (String::empty, "Number of synth voices")
numberOfVoicesLabel (String(), "Number of synth voices")
{ {
initialiseComboBoxWithConsecutiveIntegers (masterChannel, masterChannelLabel, 1, 15, defaultMasterChannel); initialiseComboBoxWithConsecutiveIntegers (masterChannel, masterChannelLabel, 1, 15, defaultMasterChannel);


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

@@ -41,8 +41,8 @@ public:
{ {
setLookAndFeel (&lookAndFeel); setLookAndFeel (&lookAndFeel);
setSize (880, 720); 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); audioDeviceManager.addAudioCallback (this);
addAndMakeVisible (audioSetupComp); addAndMakeVisible (audioSetupComp);
@@ -65,7 +65,7 @@ public:
~MainComponent() ~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.setScrollbarsShown (true);
midiMonitor.setCaretVisible (false); midiMonitor.setCaretVisible (false);
midiMonitor.setPopupMenuEnabled (false); midiMonitor.setPopupMenuEnabled (false);
midiMonitor.setText (String::empty);
midiMonitor.setText (String());
addAndMakeVisible (midiMonitor); addAndMakeVisible (midiMonitor);
if (! BluetoothMidiDevicePairingDialogue::isAvailable()) 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 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) JuceDemoPluginAudioProcessorEditor::JuceDemoPluginAudioProcessorEditor (JuceDemoPluginAudioProcessor& owner)
: AudioProcessorEditor (owner), : AudioProcessorEditor (owner),
midiKeyboard (owner.keyboardState, MidiKeyboardComponent::horizontalKeyboard), 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.. // add some sliders..
addAndMakeVisible (gainSlider = new ParameterSlider (*owner.gainParam)); 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()); 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::fail ("Couldn't write to the file");
return Result::ok(); 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) if (draggingConnector != nullptr)
{ {
draggingConnector->setTooltip (String::empty);
draggingConnector->setTooltip (String());
int x = e2.x; int x = e2.x;
int y = e2.y; int y = e2.y;
@@ -1013,7 +1013,7 @@ void GraphEditorPanel::endDraggingConnector (const MouseEvent& e)
if (draggingConnector == nullptr) if (draggingConnector == nullptr)
return; return;
draggingConnector->setTooltip (String::empty);
draggingConnector->setTooltip (String());
const MouseEvent e2 (e.getEventRelativeTo (this)); const MouseEvent e2 (e.getEventRelativeTo (this));
@@ -1108,7 +1108,7 @@ GraphDocumentComponent::GraphDocumentComponent (AudioPluginFormatManager& format
addAndMakeVisible (statusBar = new TooltipBar()); addAndMakeVisible (statusBar = new TooltipBar());
deviceManager->addAudioCallback (&graphPlayer); deviceManager->addAudioCallback (&graphPlayer);
deviceManager->addMidiInputCallback (String::empty, &graphPlayer.getMidiMessageCollector());
deviceManager->addMidiInputCallback (String(), &graphPlayer.getMidiMessageCollector());
graphPanel->updateComponents(); graphPanel->updateComponents();
} }
@@ -1143,7 +1143,7 @@ void GraphDocumentComponent::unfocusKeyboardComponent()
void GraphDocumentComponent::releaseGraph() void GraphDocumentComponent::releaseGraph()
{ {
deviceManager->removeAudioCallback (&graphPlayer); deviceManager->removeAudioCallback (&graphPlayer);
deviceManager->removeMidiInputCallback (String::empty, &graphPlayer.getMidiMessageCollector());
deviceManager->removeMidiInputCallback (String(), &graphPlayer.getMidiMessageCollector());
deviceManager->removeChangeListener (graphPanel); deviceManager->removeChangeListener (graphPanel);
deleteAllChildren(); deleteAllChildren();


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

@@ -387,12 +387,12 @@ void MainHostWindow::getCommandInfo (const CommandID commandID, ApplicationComma
break; break;
case CommandIDs::showPluginListEditor: 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); result.addDefaultKeypress ('p', ModifierKeys::commandModifier);
break; break;
case CommandIDs::showAudioSettings: 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); result.addDefaultKeypress ('a', ModifierKeys::commandModifier);
break; break;
@@ -401,7 +401,7 @@ void MainHostWindow::getCommandInfo (const CommandID commandID, ApplicationComma
break; break;
case CommandIDs::aboutBox: case CommandIDs::aboutBox:
result.setInfo ("About...", String::empty, category, 0);
result.setInfo ("About...", String(), category, 0);
break; break;
case CommandIDs::allWindowsForward: case CommandIDs::allWindowsForward:
@@ -437,7 +437,7 @@ bool MainHostWindow::perform (const InvocationInfo& info)
case CommandIDs::saveAs: case CommandIDs::saveAs:
if (graphEditor != nullptr && graphEditor->graph != nullptr) if (graphEditor != nullptr && graphEditor->graph != nullptr)
graphEditor->graph->saveAs (File::nonexistent, true, true, true);
graphEditor->graph->saveAs (File(), true, true, true);
break; break;
case CommandIDs::showPluginListEditor: case CommandIDs::showPluginListEditor:
@@ -577,6 +577,6 @@ bool MainHostWindow::isDoublePrecisionProcessing()
void MainHostWindow::updatePrecisionMenuItem (ApplicationCommandInfo& info) 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()); 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 bool AppearanceSettings::writeToFile (const File& file) const
{ {
const ScopedPointer<XmlElement> xml (settings.createXml()); const ScopedPointer<XmlElement> xml (settings.createXml());
return xml != nullptr && xml->writeToFile (file, String::empty);
return xml != nullptr && xml->writeToFile (file, String());
} }
Font AppearanceSettings::getDefaultCodeFont() 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! // this property component does not have a key associated to it!
jassertfalse; jassertfalse;
return String::empty;
return String();
} }
Component* PathSettingsTab::getContent() Component* PathSettingsTab::getContent()
@@ -286,7 +286,7 @@ struct AppearanceEditor
StringArray names; StringArray names;
names.add ("<Default Monospaced>"); names.add ("<Default Monospaced>");
names.add (String::empty);
names.add (String());
names.addArray (getAppSettings().monospacedFontNames); names.addArray (getAppSettings().monospacedFontNames);
return new ChoicePropertyComponent (Value (new FontNameValueSource (value)), 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* createEditor() override { return new ItemPreviewComponent (file); }
Component* createViewer() override { return createEditor(); } Component* createViewer() override { return createEditor(); }
void fileHasBeenRenamed (const File& newFile) override { file = newFile; } 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 {} void restoreState (const String&) override {}
String getType() const 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 void fileHasBeenRenamed (const File& newFile) = 0;
virtual String getState() const = 0; virtual String getState() const = 0;
virtual void restoreState (const String& state) = 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"; 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 ("Insert Code"), 1, KeyPress (KeyPress::returnKey));
aw.addButton (TRANS ("Cancel"), 0, KeyPress (KeyPress::escapeKey)); 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 needsSaving() const override { return codeDoc != nullptr && codeDoc->hasChangedSinceSavePoint(); }
bool hasFileBeenModifiedExternally() override { return modDetector.hasBeenModified(); } bool hasFileBeenModifiedExternally() override { return modDetector.hasBeenModified(); }
void fileHasBeenRenamed (const File& newFile) override { modDetector.fileHasBeenRenamed (newFile); } 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); } void restoreState (const String& state) override { lastState = new CodeEditorComponent::State (state); }
File getCounterpartFile() const override 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)) if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout))
return false; return false;
ComboBox defaultBox (String::empty);
ComboBox defaultBox;
ComboBox* const c = dynamic_cast<ComboBox*> (comp); ComboBox* const c = dynamic_cast<ComboBox*> (comp);
jassert (c != nullptr); jassert (c != nullptr);
c->setEditableText (xml.getBoolAttribute ("editable", defaultBox.isTextEditable())); c->setEditableText (xml.getBoolAttribute ("editable", defaultBox.isTextEditable()));
c->setJustificationType (Justification (xml.getIntAttribute ("layout", defaultBox.getJustificationType().getFlags()))); 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->setTextWhenNothingSelected (xml.getStringAttribute ("textWhenNonSelected", defaultBox.getTextWhenNothingSelected()));
c->setTextWhenNoChoicesAvailable (xml.getStringAttribute ("textWhenNoItems", defaultBox.getTextWhenNoChoicesAvailable())); 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) 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()) if (col.isNotEmpty())
comp->setColour (colours[i]->colourId, Colour::fromString (col)); comp->setColour (colours[i]->colourId, Colour::fromString (col));
@@ -518,12 +518,12 @@ void ComponentTypeHandler::fillInResizeCode (GeneratedCode& code, Component* com
if (pos.rect.isPositionAbsolute()) if (pos.rect.isPositionAbsolute())
code.constructorCode += r + "\n"; code.constructorCode += r + "\n";
else else
code.getCallbackCode (String::empty, "void", "resized()", false) += r;
code.getCallbackCode (String(), "void", "resized()", false) += r;
} }
String ComponentTypeHandler::getCreationParameters (GeneratedCode&, Component*) String ComponentTypeHandler::getCreationParameters (GeneratedCode&, Component*)
{ {
return String::empty;
return String();
} }
void ComponentTypeHandler::fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName) 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; return false;
((GenericComponent*) comp)->actualClassName = xml.getStringAttribute ("class", "Component"); ((GenericComponent*) comp)->actualClassName = xml.getStringAttribute ("class", "Component");
((GenericComponent*) comp)->constructorParams = xml.getStringAttribute ("params", String::empty);
((GenericComponent*) comp)->constructorParams = xml.getStringAttribute ("params", String());
return true; 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); XmlElement* e = ComponentTypeHandler::createXmlFor (comp, layout);
e->setAttribute ("title", g->getText()); e->setAttribute ("title", g->getText());
GroupComponent defaultComp (String::empty, String::empty);
GroupComponent defaultComp;
if (g->getTextLabelPosition().getFlags() != defaultComp.getTextLabelPosition().getFlags()) if (g->getTextLabelPosition().getFlags() != defaultComp.getTextLabelPosition().getFlags())
e->setAttribute ("textpos", g->getTextLabelPosition().getFlags()); e->setAttribute ("textpos", g->getTextLabelPosition().getFlags());
@@ -82,7 +82,7 @@ public:
String s; String s;
GroupComponent defaultComp (String::empty, String::empty);
GroupComponent defaultComp;
if (g->getTextLabelPosition().getFlags() != defaultComp.getTextLabelPosition().getFlags()) 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); 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); setImageOpacity (l, ib, normalImage, (float) xml.getDoubleAttribute ("opacityNormal", 1.0f), false);
setImageColour (l, ib, normalImage, Colour::fromString (xml.getStringAttribute ("colourNormal", "0")), 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); setImageOpacity (l, ib, overImage, (float) xml.getDoubleAttribute ("opacityOver", 1.0f), false);
setImageColour (l, ib, overImage, Colour::fromString (xml.getStringAttribute ("colourOver", "0")), 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); setImageOpacity (l, ib, downImage, (float) xml.getDoubleAttribute ("opacityDown", 1.0f), false);
setImageColour (l, ib, downImage, Colour::fromString (xml.getStringAttribute ("colourDown", "0")), 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)) if (! ComponentTypeHandler::restoreFromXml (xml, comp, layout))
return false; return false;
Label defaultLabel (String::empty, String::empty);
Label defaultLabel;
Font font; Font font;
font.setHeight ((float) xml.getDoubleAttribute ("fontsize", 15.0)); 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; default: jassertfalse; break;
} }
return String::empty;
return String();
} }
void fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName) void fillInCreationCode (GeneratedCode& code, Component* component, const String& memberVariableName)
@@ -275,7 +275,7 @@ public:
TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex)); TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));
jassert (tdc != nullptr); 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) static void setTabClassName (TabbedComponent* tc, int tabIndex, const String& newName)
@@ -295,7 +295,7 @@ public:
TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex)); TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));
jassert (tdc != nullptr); 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) static void setTabConstructorParams (TabbedComponent* tc, int tabIndex, const String& newParams)
@@ -315,7 +315,7 @@ public:
TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex)); TabDemoContentComp* const tdc = dynamic_cast<TabDemoContentComp*> (tc->getTabContentComponent (tabIndex));
jassert (tdc != nullptr); 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) 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())); 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")); setViewportGenericComponentClass (v, xml.getStringAttribute ("contentClass"));
setViewportContentType (v, xml.getIntAttribute ("contentType", 0)); setViewportContentType (v, xml.getIntAttribute ("contentType", 0));
setViewportConstructorParams (v, xml.getStringAttribute ("constructorParams")); setViewportConstructorParams (v, xml.getStringAttribute ("constructorParams"));
@@ -150,7 +150,7 @@ public:
} }
else else
{ {
classNm = String::empty;
classNm = String();
} }
} }
@@ -505,7 +505,7 @@ private:
const String filename (getViewportJucerComponentFile (component)); const String filename (getViewportJucerComponentFile (component));
if (filename.isEmpty()) if (filename.isEmpty())
return File::nonexistent;
return File();
return document.getCppFile().getSiblingFile (filename); 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: public:
ButtonTestComponent (ButtonDocument* const doc, const bool fillBackground) ButtonTestComponent (ButtonDocument* const doc, const bool fillBackground)
: Button (String::empty),
: Button (String()),
document (doc), document (doc),
alwaysFillBackground (fillBackground) 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 name;
} }
return String::empty;
return String();
} }
String BinaryResources::findUniqueName (const String& rootName) const 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 String ComponentLayout::getComponentMemberVariableName (Component* comp) const
{ {
if (comp == nullptr) if (comp == nullptr)
return String::empty;
return String();
String name (comp->getProperties() ["memberName"].toString()); String name (comp->getProperties() ["memberName"].toString());
@@ -730,7 +730,7 @@ void ComponentLayout::setComponentMemberVariableName (Component* comp, const Str
jassert (comp != nullptr); jassert (comp != nullptr);
const String oldName (getComponentMemberVariableName (comp)); 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)); const String n (getUnusedMemberName (CodeHelpers::makeValidIdentifier (newName, false, true, false), comp));
comp->getProperties().set ("memberName", n); comp->getProperties().set ("memberName", n);
@@ -775,7 +775,7 @@ String ComponentLayout::getUnusedMemberName (String nameRoot, Component* comp) c
String ComponentLayout::getComponentVirtualClassName (Component* comp) const String ComponentLayout::getComponentVirtualClassName (Component* comp) const
{ {
if (comp == nullptr) if (comp == nullptr)
return String::empty;
return String();
return comp->getProperties() ["virtualName"]; 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); s = s.fromFirstOccurrenceOf (" ", false, false);
if (s.trim().isEmpty()) if (s.trim().isEmpty())
type = s = String::empty;
type = s = String();
} }
s = type + CodeHelpers::makeValidIdentifier (s.trim(), false, false, true); s = type + CodeHelpers::makeValidIdentifier (s.trim(), false, false, true);
@@ -378,11 +378,11 @@ bool JucerDocument::loadFromXml (const XmlElement& xml)
&& getTypeName().equalsIgnoreCase (xml.getStringAttribute ("documentType"))) && getTypeName().equalsIgnoreCase (xml.getStringAttribute ("documentType")))
{ {
className = xml.getStringAttribute ("className", defaultClassName); 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); 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); fixedSize = xml.getBoolAttribute ("fixedSize", false);
initialWidth = xml.getIntAttribute ("initialWidth", 300); initialWidth = xml.getIntAttribute ("initialWidth", 300);
@@ -425,10 +425,10 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const
code.constructorCode << "setName (" + quotedString (componentName, false) + ");\n"; code.constructorCode << "setName (" + quotedString (componentName, false) + ");\n";
// call these now, just to make sure they're the first two methods in the list. // 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"; << "//[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"; << "//[UserPreResize] Add your own custom resize code here..\n//[/UserPreResize]\n\n";
if (ComponentLayout* l = getComponentLayout()) if (ComponentLayout* l = getComponentLayout())
@@ -449,10 +449,10 @@ void JucerDocument::fillInGeneratedCode (GeneratedCode& code) const
if (initialWidth > 0 || initialHeight > 0) if (initialWidth > 0 || initialHeight > 0)
code.constructorCode << "\nsetSize (" << initialWidth << ", " << initialHeight << ");\n"; 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]"; << "//[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]"; << "//[UserResized] Add your own custom resize handling here..\n//[/UserResized]";
// add optional methods // add optional methods
@@ -491,7 +491,7 @@ void JucerDocument::fillInPaintCode (GeneratedCode& code) const
{ {
for (int i = 0; i < getNumPaintRoutines(); ++i) for (int i = 0; i < getNumPaintRoutines(); ++i)
getPaintRoutine (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) 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 String getResource() const
{ {
if (element == nullptr) if (element == nullptr)
return String::empty;
return String();
if (isForStroke) if (isForStroke)
return element->getStrokeType().fill.imageResourceName; return element->getStrokeType().fill.imageResourceName;
@@ -893,12 +893,12 @@ void ColouredElement::addColourAttributes (XmlElement* const e) const
bool ColouredElement::loadColourAttributes (const XmlElement& xml) 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); 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; return true;
} }


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

@@ -202,7 +202,7 @@ public:
break; break;
} }
return String::empty;
return String();
} }
void restoreFromString (const String& s) 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() String resource (document.getResources()
.browseForResource ("Select an image file to add as a resource", .browseForResource ("Select an image file to add as a resource",
"*.jpg;*.jpeg;*.png;*.gif;*.svg", "*.jpg;*.jpeg;*.png;*.gif;*.svg",
File::nonexistent,
String::empty));
File(),
String()));
if (resource.isNotEmpty()) if (resource.isNotEmpty())
setResource (resource); setResource (resource);
@@ -86,7 +86,7 @@ public:
else else
{ {
if (choices[newIndex] == getNoneText() && allowChoiceOfNoResource) if (choices[newIndex] == getNoneText() && allowChoiceOfNoResource)
setResource (String::empty);
setResource (String());
else else
setResource (choices [newIndex]); setResource (choices [newIndex]);
} }
@@ -110,7 +110,7 @@ public:
choices.clear(); choices.clear();
choices.add ("-- create a new image resource -- "); choices.add ("-- create a new image resource -- ");
choices.add (String::empty);
choices.add (String());
if (allowChoiceOfNoResource) if (allowChoiceOfNoResource)
choices.add (getNoneText()); choices.add (getNoneText());


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

@@ -368,7 +368,7 @@ public:
if (xml.hasTagName (getTagName())) if (xml.hasTagName (getTagName()))
{ {
position.restoreFromXml (xml, position); position.restoreFromXml (xml, position);
resourceName = xml.getStringAttribute ("resource", String::empty);
resourceName = xml.getStringAttribute ("resource", String());
opacity = xml.getDoubleAttribute ("opacity", 1.0); opacity = xml.getDoubleAttribute ("opacity", 1.0);
mode = (StretchMode) xml.getIntAttribute ("mode", (int) stretched); mode = (StretchMode) xml.getIntAttribute ("mode", (int) stretched);
@@ -405,7 +405,7 @@ private:
if (element != nullptr) if (element != nullptr)
return element->getResource(); 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'; r << '\n';
if (somePointsAreRelative) if (somePointsAreRelative)
code.getCallbackCode (String::empty, "void", "resized()", false)
code.getCallbackCode (String(), "void", "resized()", false)
<< pathVariable << ".clear();\n" << r; << pathVariable << ".clear();\n" << r;
else else
code.constructorCode << r; code.constructorCode << r;


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

@@ -35,9 +35,9 @@ public:
const bool allowEditingOfFilename, const bool allowEditingOfFilename,
const String& fileBrowserWildcard = "*") const String& fileBrowserWildcard = "*")
: PropertyComponent (name), : PropertyComponent (name),
filenameComp (name, File::nonexistent, allowEditingOfFilename,
filenameComp (name, File(), allowEditingOfFilename,
isDirectory, false, fileBrowserWildcard, isDirectory, false, fileBrowserWildcard,
String::empty, String::empty)
String(), String())
{ {
addAndMakeVisible (filenameComp); addAndMakeVisible (filenameComp);
filenameComp.addListener (this); 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 (getDefaultSans());
choices.add (getDefaultSerif()); choices.add (getDefaultSerif());
choices.add (getDefaultMono()); choices.add (getDefaultMono());
choices.add (String::empty);
choices.add (String());
static StringArray fontNames; static StringArray fontNames;
@@ -90,7 +90,7 @@ public:
static String getTypefaceNameCode (const String& typefaceName) 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 == getDefaultSans()) return "Font::getDefaultSansSerifFontName(), ";
if (typefaceName == getDefaultSerif()) return "Font::getDefaultSerifFontName(), "; if (typefaceName == getDefaultSerif()) return "Font::getDefaultSerifFontName(), ";
if (typefaceName == getDefaultMono()) return "Font::getDefaultMonospacedFontName(), "; if (typefaceName == getDefaultMono()) return "Font::getDefaultMonospacedFontName(), ";


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

@@ -414,7 +414,7 @@ protected:
public: public:
PositionPropLabel (PositionPropertyBase& owner_) PositionPropLabel (PositionPropertyBase& owner_)
: Label (String::empty, String::empty),
: Label (String(), String()),
owner (owner_) owner (owner_)
{ {
setEditable (true, true, false); 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), : PropertyComponent ("extra callbacks", 250),
document (doc) document (doc)
{ {
addAndMakeVisible (listBox = new ListBox (String::empty, this));
addAndMakeVisible (listBox = new ListBox (String(), this));
listBox->setRowHeight (22); listBox->setRowHeight (22);
document.addChangeListener (this); document.addChangeListener (this);
@@ -817,20 +817,20 @@ void JucerDocumentEditor::getCommandInfo (const CommandID commandID, Application
break; break;
case StandardApplicationCommandIDs::cut: case StandardApplicationCommandIDs::cut:
result.setInfo (TRANS ("Cut"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Cut"), String(), "Editing", 0);
result.setActive (isSomethingSelected()); result.setActive (isSomethingSelected());
result.defaultKeypresses.add (KeyPress ('x', cmd, 0)); result.defaultKeypresses.add (KeyPress ('x', cmd, 0));
break; break;
case StandardApplicationCommandIDs::copy: case StandardApplicationCommandIDs::copy:
result.setInfo (TRANS ("Copy"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Copy"), String(), "Editing", 0);
result.setActive (isSomethingSelected()); result.setActive (isSomethingSelected());
result.defaultKeypresses.add (KeyPress ('c', cmd, 0)); result.defaultKeypresses.add (KeyPress ('c', cmd, 0));
break; break;
case StandardApplicationCommandIDs::paste: 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)); result.defaultKeypresses.add (KeyPress ('v', cmd, 0));
bool canPaste = false; bool canPaste = false;
@@ -851,18 +851,18 @@ void JucerDocumentEditor::getCommandInfo (const CommandID commandID, Application
break; break;
case StandardApplicationCommandIDs::del: case StandardApplicationCommandIDs::del:
result.setInfo (TRANS ("Delete"), String::empty, "Editing", 0);
result.setInfo (TRANS ("Delete"), String(), "Editing", 0);
result.setActive (isSomethingSelected()); result.setActive (isSomethingSelected());
break; break;
case StandardApplicationCommandIDs::selectAll: 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.setActive (currentPaintRoutine != nullptr || currentLayout != nullptr);
result.defaultKeypresses.add (KeyPress ('a', cmd, 0)); result.defaultKeypresses.add (KeyPress ('a', cmd, 0));
break; break;
case StandardApplicationCommandIDs::deselectAll: 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.setActive (currentPaintRoutine != nullptr || currentLayout != nullptr);
result.defaultKeypresses.add (KeyPress ('d', cmd, 0)); result.defaultKeypresses.add (KeyPress ('d', cmd, 0));
break; 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.addListener (this);
delButton.setEnabled (false); 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 ("name", 1, 150, 80, 400);
listBox->getHeader().addColumn ("original file", 2, 350, 80, 800); listBox->getHeader().addColumn ("original file", 2, 350, 80, 800);
listBox->getHeader().addColumn ("size", 3, 100, 40, 150); listBox->getHeader().addColumn ("size", 3, 100, 40, 150);
@@ -247,8 +247,8 @@ void ResourceEditorPanel::buttonClicked (Button* b)
document.getResources() document.getResources()
.browseForResource ("Select a file to add as a resource", .browseForResource ("Select a file to add as a resource",
"*", "*",
File::nonexistent,
String::empty);
File(),
String());
} }
else if (b == &delButton) 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 (isAbstract) return "This class is abstract";
if (noDefaultConstructor) return "This class has no default constructor"; if (noDefaultConstructor) return "This class has no default constructor";
if (inAnonymousNamespace) return "This class is declared inside an anonymous namespace"; if (inAnonymousNamespace) return "This class is declared inside an anonymous namespace";
return String::empty;
return String();
} }
bool isDisallowed (const InstantiationFlags& disallowedFlags) const 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 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 {} void setName (const String&) override {}
bool isMissing() override { return false; } bool isMissing() override { return false; }
Icon getIcon() const override { return Icon (getIcons().graph, getContrastingColour (Colours::darkred, 0.5f)); } 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(), if (CPlusPlusCodeTokeniser::isReservedKeyword (ed.getText().replaceSection (ed.getHighlightedRegion().getStart(),
ed.getHighlightedRegion().getLength(), ed.getHighlightedRegion().getLength(),
s))) s)))
return String::empty;
return String();
return s; return s;
} }


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

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


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

@@ -82,7 +82,7 @@ struct SourceCodeRange
String toString() const String toString() const
{ {
if (file.isEmpty() && range.isEmpty()) if (file.isEmpty() && range.isEmpty())
return String::empty;
return String();
return file + ":" + String (range.getStart()) + ":" + String (range.getEnd()); 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; return defaultInstallation;
#endif #endif
return File::nonexistent;
return File();
} }
protected: protected:


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

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


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

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


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

@@ -550,7 +550,7 @@ public:
xcodeIsExecutable = true; xcodeIsExecutable = true;
xcodeCreatePList = false; xcodeCreatePList = false;
xcodeFileType = "compiled.mach-o.executable"; xcodeFileType = "compiled.mach-o.executable";
xcodeBundleExtension = String::empty;
xcodeBundleExtension = String();
xcodeProductType = "com.apple.product-type.tool"; xcodeProductType = "com.apple.product-type.tool";
xcodeCopyToProductInstallPathAfterBuild = false; xcodeCopyToProductInstallPathAfterBuild = false;
break; 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) if (libraries.size() != 0)
return replacePreprocessorTokens (config, "-l" + libraries.joinIntoString (" -l")).trim(); 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) static void writeXmlOrThrow (const XmlElement& xml, const File& file, const String& encoding, int maxCharsPerLine, bool useUnixNewLines = false)
{ {
MemoryOutputStream mo; MemoryOutputStream mo;
xml.writeToStream (mo, String::empty, false, true, encoding, maxCharsPerLine);
xml.writeToStream (mo, String(), false, true, encoding, maxCharsPerLine);
if (useUnixNewLines) if (useUnixNewLines)
{ {


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

@@ -287,7 +287,7 @@ private:
if (xml != nullptr) if (xml != nullptr)
{ {
MemoryOutputStream mo; MemoryOutputStream mo;
xml->writeToStream (mo, String::empty);
xml->writeToStream (mo, String());
replaceFileIfDifferent (projectFile, mo); replaceFileIfDifferent (projectFile, mo);
} }
} }
@@ -324,9 +324,9 @@ private:
if (! foundCodeSection) 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 ("// (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; 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: public:
LabelComp (TextWithDefaultPropertyComponent& tpc, const int charLimit) LabelComp (TextWithDefaultPropertyComponent& tpc, const int charLimit)
: Label (String::empty, String::empty),
: Label (String(), String()),
owner (tpc), owner (tpc),
maxChars (charLimit) maxChars (charLimit)
{ {
@@ -158,7 +158,7 @@ private:
void editorShown (Label*, TextEditor& editor) override void editorShown (Label*, TextEditor& editor) override
{ {
if (cachedValue.isUsingDefault()) if (cachedValue.isUsingDefault())
editor.setText (String::empty, dontSendNotification);
editor.setText (String(), dontSendNotification);
} }
void editorHidden (Label*, TextEditor&) override {} 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 // 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: // global/fallback value). In this case we have to reset the project value to blank:
if (initialValueIsEmpty) if (initialValueIsEmpty)
getValue().setValue (String::empty);
getValue().setValue (String());
getValue().addListener (this); getValue().addListener (this);
setColour (textColourId, getTextColourToDisplay()); setColour (textColourId, getTextColourToDisplay());
@@ -114,7 +114,7 @@ void DependencyPathPropertyComponent::labelTextChanged (Label*)
void DependencyPathPropertyComponent::editorShown (Label* /*label*/, TextEditor& editor) void DependencyPathPropertyComponent::editorShown (Label* /*label*/, TextEditor& editor)
{ {
if (! pathValueSource.isUsingProjectSettings()) if (! pathValueSource.isUsingProjectSettings())
editor.setText (String::empty, dontSendNotification);
editor.setText (String(), dontSendNotification);
} }
void DependencyPathPropertyComponent::editorHidden (Label*, TextEditor&) 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())) if ((value.refersToSameSourceAs (globalSettingsValue) && isUsingGlobalSettings()))
{ {
sendChangeMessage (true); 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)); 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()) 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) String Project::getFileTemplate (const String& templateName)
{ {
int dataSize; 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 File ProjectContentComponent::getCurrentFile() const
{ {
return currentDocument != nullptr ? currentDocument->getFile() return currentDocument != nullptr ? currentDocument->getFile()
: File::nonexistent;
: File();
} }
bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc, bool grabFocus) bool ProjectContentComponent::showDocument (OpenDocumentManager::Document* doc, bool grabFocus)
@@ -1174,7 +1174,7 @@ void ProjectContentComponent::getCommandInfo (const CommandID commandID, Applica
break; break;
case CommandIDs::deleteSelectedItem: 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::deleteKey, 0, 0));
result.defaultKeypresses.add (KeyPress (KeyPress::backspaceKey, 0, 0)); result.defaultKeypresses.add (KeyPress (KeyPress::backspaceKey, 0, 0));
result.setActive (dynamic_cast<TreePanelBase*> (treeViewTabs.getCurrentContentComponent()) != nullptr); 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() virtual void browseToAddExistingFiles()
{ {
const File location (item.isGroup() ? item.determineGroupFolder() : getFile()); 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()) if (fc.browseForMultipleFilesOrDirectories())
{ {
@@ -156,7 +156,7 @@ public:
virtual void checkFileStatus() // (recursive) virtual void checkFileStatus() // (recursive)
{ {
const File file (getFile()); const File file (getFile());
const bool nowMissing = file != File::nonexistent && ! file.exists();
const bool nowMissing = file != File() && ! file.exists();
if (nowMissing != isFileMissing) if (nowMissing != isFileMissing)
{ {
@@ -235,7 +235,7 @@ public:
bool mightContainSubItems() override { return item.getNumChildren() > 0; } bool mightContainSubItems() override { return item.getNumChildren() > 0; }
String getUniqueName() const override { jassert (item.getID().isNotEmpty()); return item.getID(); } String getUniqueName() const override { jassert (item.getID().isNotEmpty()); return item.getID(); }
bool canBeSelected() const override { return true; } bool canBeSelected() const override { return true; }
String getTooltip() override { return String::empty; }
String getTooltip() override { return String(); }
File getDraggableFile() const override { return getFile(); } File getDraggableFile() const override { return getFile(); }
var getDragSourceDescription() override var getDragSourceDescription() override


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

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


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

@@ -27,7 +27,7 @@ class SVGPathDataComponent : public Component,
{ {
public: public:
SVGPathDataComponent() SVGPathDataComponent()
: desc (String::empty,
: desc (String(),
"Paste an SVG path string into the top box, and it'll be converted to some C++ " "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..") "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()) if (currentItem.isNotEmpty())
result.add (currentItem); result.add (currentItem);
currentItem = String::empty;
currentItem = String();
} }
else else
{ {
@@ -273,7 +273,7 @@ struct TranslationHelpers
{ {
lines.add ("language: " + original.getLanguageName()); lines.add ("language: " + original.getLanguageName());
lines.add ("countries: " + original.getCountryCodes().joinIntoString (" ")); lines.add ("countries: " + original.getCountryCodes().joinIntoString (" "));
lines.add (String::empty);
lines.add (String());
const StringArray& originalKeys (originalStrings.getAllKeys()); const StringArray& originalKeys (originalStrings.getAllKeys());
const StringArray& originalValues (originalStrings.getAllValues()); const StringArray& originalValues (originalStrings.getAllValues());
@@ -296,7 +296,7 @@ struct TranslationHelpers
{ {
lines.add ("language: [enter full name of the language here!]"); lines.add ("language: [enter full name of the language here!]");
lines.add ("countries: [enter list of 2-character country codes 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) for (int i = 0; i < preStrings.size(); ++i)
@@ -429,8 +429,7 @@ private:
void loadFile() void loadFile()
{ {
FileChooser fc ("Choose a translation file to load", FileChooser fc ("Choose a translation file to load",
File::nonexistent,
"*");
File(), "*");
if (fc.browseForFileToOpen()) if (fc.browseForFileToOpen())
{ {


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

@@ -27,7 +27,7 @@ class UTF8Component : public Component,
{ {
public: public:
UTF8Component() UTF8Component()
: desc (String::empty,
: desc (String(),
"Type any string into the box, and it'll be shown below as a portable UTF-8 literal, " "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...") "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"), TRANS ("Please enter the name for the new class"),
AlertWindow::NoIcon, nullptr); 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 ("Create Files"), 1, KeyPress (KeyPress::returnKey));
aw.addButton (TRANS ("Cancel"), 0, KeyPress (KeyPress::escapeKey)); 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->addItemList (fileOptions, 1);
c->setSelectedId (1, dontSendNotification); 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); l->attachToComponent (c, true);
itemsCreated.add (l); itemsCreated.add (l);


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

@@ -34,9 +34,9 @@ public:
ModulesFolderPathBox (File initialFileOrDirectory) ModulesFolderPathBox (File initialFileOrDirectory)
: currentPathBox ("currentPathBox"), : currentPathBox ("currentPathBox"),
openFolderButton (TRANS("...")), openFolderButton (TRANS("...")),
modulesLabel (String::empty, TRANS("Modules Folder") + ":")
modulesLabel (String(), TRANS("Modules Folder") + ":")
{ {
if (initialFileOrDirectory == File::nonexistent)
if (initialFileOrDirectory == File())
initialFileOrDirectory = findDefaultModulesFolder(); initialFileOrDirectory = findDefaultModulesFolder();
setModulesFolder (initialFileOrDirectory); setModulesFolder (initialFileOrDirectory);
@@ -263,14 +263,14 @@ public:
WizardComp() WizardComp()
: platformTargets(), : platformTargets(),
projectName (TRANS("Project name")), 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 fileBrowser (FileBrowserComponent::saveMode
| FileBrowserComponent::canSelectDirectories | FileBrowserComponent::canSelectDirectories
| FileBrowserComponent::doNotClearFileNameOnRootChange, | FileBrowserComponent::doNotClearFileNameOnRootChange,
NewProjectWizardClasses::getLastWizardFolder(), nullptr, nullptr), 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") + "..."), createButton (TRANS("Create") + "..."),
cancelButton (TRANS("Cancel")), cancelButton (TRANS("Cancel")),
modulesPathBox (findDefaultModulesFolder()) modulesPathBox (findDefaultModulesFolder())


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

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


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

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


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

@@ -129,7 +129,7 @@ public:
if (settings != nullptr) if (settings != nullptr)
f = File (settings->getValue ("lastStateFile")); f = File (settings->getValue ("lastStateFile"));
if (f == File::nonexistent)
if (f == File())
f = File::getSpecialLocation (File::userDocumentsDirectory); f = File::getSpecialLocation (File::userDocumentsDirectory);
return f; 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 formatToLookFor this is the type of format that you want to look for
@param directoriesToSearch the path to search @param directoriesToSearch the path to search
@param searchRecursively true to search recursively @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 dodgy plugins in your path, then a couple of rescans
will still manage to find all the proper plugins. will still manage to find all the proper plugins.
It's probably best to choose a file in the user's 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, bool allowPluginsWhichRequireAsynchronousInstantiation, int threads,
const String& title, const String& text) const String& title, const String& text)
: owner (plc), formatToScan (format), propertiesToUse (properties), : 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), progressWindow (title, text, AlertWindow::NoIcon),
progress (0.0), numThreads (threads), allowAsync (allowPluginsWhichRequireAsynchronousInstantiation), progress (0.0), numThreads (threads), allowAsync (allowPluginsWhichRequireAsynchronousInstantiation),
finished (false) finished (false)
@@ -422,7 +422,7 @@ private:
+ TRANS ("Are you sure you want to scan the folder \"XYZ\"?") + TRANS ("Are you sure you want to scan the folder \"XYZ\"?")
.replace ("XYZ", f.getFullPathName()), .replace ("XYZ", f.getFullPathName()),
TRANS ("Scan"), TRANS ("Scan"),
String::empty,
String(),
nullptr, nullptr,
ModalCallbackFunction::create (warnAboutStupidPathsCallback, this)); ModalCallbackFunction::create (warnAboutStupidPathsCallback, this));
return; return;


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

@@ -76,7 +76,7 @@ class AudioDeviceSelectorComponent::MidiInputSelectorComponentListBox : public
{ {
public: public:
MidiInputSelectorComponentListBox (AudioDeviceManager& dm, const String& noItems) MidiInputSelectorComponentListBox (AudioDeviceManager& dm, const String& noItems)
: ListBox (String::empty, nullptr),
: ListBox (String(), nullptr),
deviceManager (dm), deviceManager (dm),
noItemsMessage (noItems) noItemsMessage (noItems)
{ {
@@ -340,11 +340,11 @@ public:
|| comboBoxThatHasChanged == inputDeviceDropDown) || comboBoxThatHasChanged == inputDeviceDropDown)
{ {
if (outputDeviceDropDown != nullptr) if (outputDeviceDropDown != nullptr)
config.outputDeviceName = outputDeviceDropDown->getSelectedId() < 0 ? String::empty
config.outputDeviceName = outputDeviceDropDown->getSelectedId() < 0 ? String()
: outputDeviceDropDown->getText(); : outputDeviceDropDown->getText();
if (inputDeviceDropDown != nullptr) if (inputDeviceDropDown != nullptr)
config.inputDeviceName = inputDeviceDropDown->getSelectedId() < 0 ? String::empty
config.inputDeviceName = inputDeviceDropDown->getSelectedId() < 0 ? String()
: inputDeviceDropDown->getText(); : inputDeviceDropDown->getText();
if (! type.hasSeparateInputsAndOutputs()) if (! type.hasSeparateInputsAndOutputs())
@@ -390,7 +390,7 @@ public:
{ {
if (AudioIODevice* const device = setup.manager->getCurrentAudioDevice()) if (AudioIODevice* const device = setup.manager->getCurrentAudioDevice())
{ {
Component modalWindow (String::empty);
Component modalWindow;
modalWindow.setOpaque (true); modalWindow.setOpaque (true);
modalWindow.addToDesktop (0); modalWindow.addToDesktop (0);
modalWindow.enterModalState(); modalWindow.enterModalState();
@@ -445,7 +445,7 @@ public:
addAndMakeVisible (outputChanList addAndMakeVisible (outputChanList
= new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioOutputType, = new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioOutputType,
TRANS ("(no audio output channels found)"))); 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->setJustificationType (Justification::centredRight);
outputChanLabel->attachToComponent (outputChanList, true); outputChanLabel->attachToComponent (outputChanList, true);
} }
@@ -466,7 +466,7 @@ public:
addAndMakeVisible (inputChanList addAndMakeVisible (inputChanList
= new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioInputType, = new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioInputType,
TRANS("(no audio input channels found)"))); 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->setJustificationType (Justification::centredRight);
inputChanLabel->attachToComponent (inputChanList, true); inputChanLabel->attachToComponent (inputChanList, true);
} }
@@ -605,11 +605,11 @@ private:
{ {
if (outputDeviceDropDown == nullptr) if (outputDeviceDropDown == nullptr)
{ {
outputDeviceDropDown = new ComboBox (String::empty);
outputDeviceDropDown = new ComboBox (String());
outputDeviceDropDown->addListener (this); outputDeviceDropDown->addListener (this);
addAndMakeVisible (outputDeviceDropDown); addAndMakeVisible (outputDeviceDropDown);
outputDeviceLabel = new Label (String::empty,
outputDeviceLabel = new Label (String(),
type.hasSeparateInputsAndOutputs() ? TRANS("Output:") type.hasSeparateInputsAndOutputs() ? TRANS("Output:")
: TRANS("Device:")); : TRANS("Device:"));
outputDeviceLabel->attachToComponent (outputDeviceDropDown, true); outputDeviceLabel->attachToComponent (outputDeviceDropDown, true);
@@ -634,11 +634,11 @@ private:
{ {
if (inputDeviceDropDown == nullptr) if (inputDeviceDropDown == nullptr)
{ {
inputDeviceDropDown = new ComboBox (String::empty);
inputDeviceDropDown = new ComboBox (String());
inputDeviceDropDown->addListener (this); inputDeviceDropDown->addListener (this);
addAndMakeVisible (inputDeviceDropDown); addAndMakeVisible (inputDeviceDropDown);
inputDeviceLabel = new Label (String::empty, TRANS("Input:"));
inputDeviceLabel = new Label (String(), TRANS("Input:"));
inputDeviceLabel->attachToComponent (inputDeviceDropDown, true); inputDeviceLabel->attachToComponent (inputDeviceDropDown, true);
addAndMakeVisible (inputLevelMeter addAndMakeVisible (inputLevelMeter
@@ -655,9 +655,9 @@ private:
{ {
if (sampleRateDropDown == nullptr) 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); sampleRateLabel->attachToComponent (sampleRateDropDown, true);
} }
else else
@@ -682,9 +682,9 @@ private:
{ {
if (bufferSizeDropDown == nullptr) 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); bufferSizeLabel->attachToComponent (bufferSizeDropDown, true);
} }
else else
@@ -724,7 +724,7 @@ public:
//============================================================================== //==============================================================================
ChannelSelectorListBox (const AudioDeviceSetupDetails& setupDetails, ChannelSelectorListBox (const AudioDeviceSetupDetails& setupDetails,
const BoxType boxType, const String& noItemsText) const BoxType boxType, const String& noItemsText)
: ListBox (String::empty, nullptr),
: ListBox (String(), nullptr),
setup (setupDetails), type (boxType), noItemsMessage (noItemsText) setup (setupDetails), type (boxType), noItemsMessage (noItemsText)
{ {
refresh(); refresh();
@@ -993,7 +993,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
if (types.size() > 1) if (types.size() > 1)
{ {
deviceTypeDropDown = new ComboBox (String::empty);
deviceTypeDropDown = new ComboBox (String());
for (int i = 0; i < types.size(); ++i) for (int i = 0; i < types.size(); ++i)
deviceTypeDropDown->addItem (types.getUnchecked(i)->getTypeName(), i + 1); deviceTypeDropDown->addItem (types.getUnchecked(i)->getTypeName(), i + 1);
@@ -1001,7 +1001,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
addAndMakeVisible (deviceTypeDropDown); addAndMakeVisible (deviceTypeDropDown);
deviceTypeDropDown->addListener (this); 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->setJustificationType (Justification::centredRight);
deviceTypeDropDownLabel->attachToComponent (deviceTypeDropDown, true); deviceTypeDropDownLabel->attachToComponent (deviceTypeDropDown, true);
} }
@@ -1012,7 +1012,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
= new MidiInputSelectorComponentListBox (deviceManager, = new MidiInputSelectorComponentListBox (deviceManager,
"(" + TRANS("No MIDI inputs available") + ")")); "(" + 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->setJustificationType (Justification::topRight);
midiInputsLabel->attachToComponent (midiInputsList, true); midiInputsLabel->attachToComponent (midiInputsList, true);
@@ -1032,7 +1032,7 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager&
if (showMidiOutputSelector) if (showMidiOutputSelector)
{ {
addAndMakeVisible (midiOutputSelector = new ComboBox (String::empty));
addAndMakeVisible (midiOutputSelector = new ComboBox (String()));
midiOutputSelector->addListener (this); midiOutputSelector->addListener (this);
midiOutputLabel = new Label ("lm", TRANS("MIDI Output:")); 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: public:
MidiKeyboardUpDownButton (MidiKeyboardComponent& comp, const int d) 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(); 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 const var& NamedValueSet::operator[] (const Identifier& name) const noexcept
{ {
if (const var* v = getVarPointer (name)) if (const var* v = getVarPointer (name))
return *v; return *v;
return var::null;
return getNullVarRef();
} }
var NamedValueSet::getWithDefault (const Identifier& name, const var& defaultReturnValue) const 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; return values.getReference (index).value;
jassertfalse; jassertfalse;
return var::null;
return getNullVarRef();
} }
var* NamedValueSet::getVarPointerAt (int index) const noexcept 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 (const VariantType& t) noexcept : type (&t) {}
var::~var() noexcept { type->cleanUp (value); } var::~var() noexcept { type->cleanUp (value); }
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const var var::null; const var var::null;
#endif
//============================================================================== //==============================================================================
var::var (const var& valueToCopy) : type (valueToCopy.type) 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()) if (DynamicObject* const o = getDynamicObject())
return o->getProperty (propertyName); return o->getProperty (propertyName);
return var::null;
return getNullVarRef();
} }
const var& var::operator[] (const char* const propertyName) const 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. */ /** Destructor. */
~var() noexcept; ~var() noexcept;
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
/** A static var object that can be used where you need an empty variant object. */ /** A static var object that can be used where you need an empty variant object. */
static const var null; static const var null;
#endif
var (const var& valueToCopy); var (const var& valueToCopy);
var (int value) noexcept; 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 #endif
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const File File::nonexistent; const File File::nonexistent;
#endif
//============================================================================== //==============================================================================
static String removeEllipsis (const String& path) static String removeEllipsis (const String& path)
@@ -1009,9 +1011,9 @@ public:
const File home (File::getSpecialLocation (File::userHomeDirectory)); const File home (File::getSpecialLocation (File::userHomeDirectory));
const File temp (File::getSpecialLocation (File::tempDirectory)); 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 #if ! JUCE_WINDOWS
expect (File("/").isDirectory()); expect (File("/").isDirectory());
#endif #endif


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

@@ -49,8 +49,7 @@ public:
/** Creates an (invalid) file object. /** Creates an (invalid) file object.
The file is initially set to an empty path, so getFullPathName() will return 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. You can use its operator= method to point it at a proper file.
*/ */
@@ -95,8 +94,13 @@ public:
#endif #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; static const File nonexistent;
#endif
//============================================================================== //==============================================================================
/** Checks whether the file actually exists. /** Checks whether the file actually exists.


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

@@ -625,7 +625,7 @@ public:
beginTest ("JSON"); beginTest ("JSON");
Random r = getRandom(); Random r = getRandom();
expect (JSON::parse (String::empty) == var());
expect (JSON::parse (String()) == var());
expect (JSON::parse ("{}").isObject()); expect (JSON::parse ("{}").isObject());
expect (JSON::parse ("[]").isArray()); expect (JSON::parse ("[]").isArray());
expect (JSON::parse ("[ 1234 ]")[0].isInt()); 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 //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1
#endif #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 #ifndef JUCE_STRING_UTF_TYPE
#define JUCE_STRING_UTF_TYPE 8 #define JUCE_STRING_UTF_TYPE 8
#endif #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; const String String::empty;
#endif
//============================================================================== //==============================================================================
String::String() noexcept : text (&(emptyString.text)) String::String() noexcept : text (&(emptyString.text))
@@ -2270,7 +2272,7 @@ public:
beginTest ("Basics"); beginTest ("Basics");
expect (String().length() == 0); expect (String().length() == 0);
expect (String() == String::empty);
expect (String() == String());
String s1, s2 ("abcd"); String s1, s2 ("abcd");
expect (s1.isEmpty() && ! s1.isNotEmpty()); expect (s1.isEmpty() && ! s1.isNotEmpty());
expect (s2.isNotEmpty() && ! s2.isEmpty()); expect (s2.isNotEmpty() && ! s2.isEmpty());
@@ -2282,16 +2284,16 @@ public:
expect (String ("abcdefg", 4) == L"abcd"); expect (String ("abcdefg", 4) == L"abcd");
expect (String ("abcdefg", 4) == String (L"abcdefg", 4)); expect (String ("abcdefg", 4) == String (L"abcdefg", 4));
expect (String::charToString ('x') == "x"); 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 + "e" == "abcde" && s2 + 'e' == "abcde");
expect (s2 + L'e' == "abcde" && s2 + L"e" == "abcde"); expect (s2 + L'e' == "abcde" && s2 + L"e" == "abcde");
expect (s1.equalsIgnoreCase ("abcD") && s1 < "abce" && s1 > "abbb"); expect (s1.equalsIgnoreCase ("abcD") && s1 < "abce" && s1 > "abbb");
expect (s1.startsWith ("ab") && s1.startsWith ("abcd") && ! s1.startsWith ("abcde")); expect (s1.startsWith ("ab") && s1.startsWith ("abcd") && ! s1.startsWith ("abcde"));
expect (s1.startsWithIgnoreCase ("aB") && s1.endsWithIgnoreCase ("CD")); expect (s1.startsWithIgnoreCase ("aB") && s1.endsWithIgnoreCase ("CD"));
expect (s1.endsWith ("bcd") && ! s1.endsWith ("aabcd")); 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.contains ("cd") && s1.contains ("ab") && s1.contains ("abcd"));
expect (s1.containsChar ('a')); expect (s1.containsChar ('a'));
expect (! s1.containsChar ('x')); expect (! s1.containsChar ('x'));
@@ -2472,9 +2474,9 @@ public:
} }
beginTest ("Numeric conversions"); 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.getIntValue() == 12345678);
expect (s.getLargeIntValue() == (int64) 12345678); expect (s.getLargeIntValue() == (int64) 12345678);
expect (s.getDoubleValue() == 12345678.0); expect (s.getDoubleValue() == 12345678.0);
@@ -2511,11 +2513,11 @@ public:
expect (s3.containsAnyOf (String (L"zzzFs"))); expect (s3.containsAnyOf (String (L"zzzFs")));
expect (s3.startsWith ("abcd")); expect (s3.startsWith ("abcd"));
expect (s3.startsWithIgnoreCase (String (L"abCD"))); expect (s3.startsWithIgnoreCase (String (L"abCD")));
expect (s3.startsWith (String::empty));
expect (s3.startsWith (String()));
expect (s3.startsWithChar ('a')); expect (s3.startsWithChar ('a'));
expect (s3.endsWith (String ("HIJ"))); expect (s3.endsWith (String ("HIJ")));
expect (s3.endsWithIgnoreCase (String (L"Hij"))); expect (s3.endsWithIgnoreCase (String (L"Hij")));
expect (s3.endsWith (String::empty));
expect (s3.endsWith (String()));
expect (s3.endsWithChar (L'J')); expect (s3.endsWithChar (L'J'));
expect (s3.indexOf ("HIJ") == 7); expect (s3.indexOf ("HIJ") == 7);
expect (s3.indexOf (String (L"HIJK")) == -1); 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?y?", true));
expect (String ("xx?y").matchesWildcard ("xx??", 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 ("xword2", true, false), s5.substring (100));
expectEquals (s5.fromFirstOccurrenceOf (String (L"word2"), true, false), s5.substring (5)); expectEquals (s5.fromFirstOccurrenceOf (String (L"word2"), true, false), s5.substring (5));
expectEquals (s5.fromFirstOccurrenceOf ("Word2", true, true), 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, false), s5.getLastCharacters (6));
expectEquals (s5.fromFirstOccurrenceOf ("Word2", false, true), 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 ("wordx", true, false), s5);
expectEquals (s5.fromLastOccurrenceOf ("word", true, false), s5.getLastCharacters (5)); expectEquals (s5.fromLastOccurrenceOf ("word", true, false), s5.getLastCharacters (5));
expectEquals (s5.fromLastOccurrenceOf ("worD", true, true), 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, false), s5.getLastCharacters (1));
expectEquals (s5.fromLastOccurrenceOf ("worD", false, true), 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 ("word4", true, false), s5);
expectEquals (s5.upToFirstOccurrenceOf ("word2", true, false), s5.substring (0, 10)); expectEquals (s5.upToFirstOccurrenceOf ("word2", true, false), s5.substring (0, 10));
expectEquals (s5.upToFirstOccurrenceOf ("Word2", true, true), 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, false), s5.substring (0, 5));
expectEquals (s5.upToFirstOccurrenceOf ("Word2", false, true), 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 ("zword", true, false), s5);
expectEquals (s5.upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1)); expectEquals (s5.upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1));
expectEquals (s5.dropLastCharacters(1).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); expect (s5.replaceCharacters ("wo", "xy") != s5);
expectEquals (s5.replaceCharacters ("wo", "xy").replaceCharacters ("xy", "wo"), s5); expectEquals (s5.replaceCharacters ("wo", "xy").replaceCharacters ("xy", "wo"), s5);
expectEquals (s5.retainCharacters ("1wordxya"), String ("wordwordword")); expectEquals (s5.retainCharacters ("1wordxya"), String ("wordwordword"));
expect (s5.retainCharacters (String::empty).isEmpty());
expect (s5.retainCharacters (String()).isEmpty());
expect (s5.removeCharacters ("1wordxya") == " 2 3"); expect (s5.removeCharacters ("1wordxya") == " 2 3");
expectEquals (s5.removeCharacters (String::empty), s5);
expectEquals (s5.removeCharacters (String()), s5);
expect (s5.initialSectionContainingOnly ("word") == L"word"); expect (s5.initialSectionContainingOnly ("word") == L"word");
expect (String ("word").initialSectionContainingOnly ("word") == L"word"); expect (String ("word").initialSectionContainingOnly ("word") == L"word");
expectEquals (s5.initialSectionNotContaining (String ("xyz ")), String ("word")); expectEquals (s5.initialSectionNotContaining (String ("xyz ")), String ("word"));
@@ -2647,9 +2649,9 @@ public:
expectEquals (s.joinIntoString ("-"), String ("4-3-2-1-0")); expectEquals (s.joinIntoString ("-"), String ("4-3-2-1-0"));
s.remove (2); s.remove (2);
expectEquals (s.joinIntoString ("--"), String ("4--3--1--0")); expectEquals (s.joinIntoString ("--"), String ("4--3--1--0"));
expectEquals (s.joinIntoString (String::empty), String ("4310"));
expectEquals (s.joinIntoString (StringRef()), String ("4310"));
s.clear(); s.clear();
expectEquals (s.joinIntoString ("x"), String::empty);
expectEquals (s.joinIntoString ("x"), String());
StringArray toks; StringArray toks;
toks.addTokens ("x,,", ";,", ""); toks.addTokens ("x,,", ";,", "");


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

@@ -147,13 +147,15 @@ public:
~String() noexcept; ~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. /** 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 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 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. the fact that you're referencing a global shared static memory address.
*/ */
static const String empty; static const String empty;
#endif
/** This is the character encoding type used internally to store the string. /** 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())) if (isPositiveAndBelow (index, strings.size()))
return strings.getReference (index); return strings.getReference (index);
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
return String::empty; return String::empty;
#else
static String empty;
return empty;
#endif
} }
String& StringArray::getReference (const int index) noexcept 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(); 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", "x");
testDiff ("x", "y"); testDiff ("x", "y");
testDiff ("xxx", "x"); 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 counterName the name used when printing out the statistics
@param runsPerPrintout the number of start/stop iterations before calling @param runsPerPrintout the number of start/stop iterations before calling
printStatistics() 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 the results are just written to the debugger output
*/ */
PerformanceCounter (const String& counterName, 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(); 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 const String& XmlElement::getAttributeName (const int index) const noexcept
{ {
if (const XmlAttributeNode* const att = attributes [index]) if (const XmlAttributeNode* const att = attributes [index])
return att->name.toString(); return att->name.toString();
return String::empty;
return getEmptyStringRef();
} }
const String& XmlElement::getAttributeValue (const int index) const noexcept 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]) if (const XmlAttributeNode* const att = attributes [index])
return att->value; return att->value;
return String::empty;
return getEmptyStringRef();
} }
XmlElement::XmlAttributeNode* XmlElement::getAttribute (StringRef attributeName) const noexcept 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)) if (const XmlAttributeNode* att = getAttribute (attributeName))
return att->value; return att->value;
return String::empty;
return getEmptyStringRef();
} }
String XmlElement::getStringAttribute (StringRef attributeName, const String& defaultReturnValue) const 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; const ValueTree ValueTree::invalid;
#endif
ValueTree::ValueTree (const Identifier& type) : object (new ValueTree::SharedObject (type)) 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 ValueTree ValueTree::getSibling (const int delta) const noexcept
{ {
if (object == nullptr || object->parent == nullptr) if (object == nullptr || object->parent == nullptr)
return invalid;
return ValueTree();
const int index = object->parent->indexOf (*this) + delta; const int index = object->parent->indexOf (*this) + delta;
return ValueTree (object->parent->children.getObjectPointer (index)); 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 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 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 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. /** 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; static const ValueTree invalid;
#endif
/** Returns the total number of references to the shared underlying data structure that this /** Returns the total number of references to the shared underlying data structure that this
ValueTree is using. 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); && (mat11 == 1.0f);
} }
#if JUCE_ALLOW_STATIC_NULL_VARIABLES
const AffineTransform AffineTransform::identity; const AffineTransform AffineTransform::identity;
#endif
//============================================================================== //==============================================================================
AffineTransform AffineTransform::followedBy (const AffineTransform& other) const noexcept 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. */ /** Compares two transforms. */
bool operator!= (const AffineTransform& other) const noexcept; 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; static const AffineTransform identity;
#endif
//============================================================================== //==============================================================================
/** Transforms a 2D coordinate using this matrix. */ /** 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; const Image Image::null;
#endif
int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); } int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); }
int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; } 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; } 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. /** 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; static const Image null;
#endif
//============================================================================== //==============================================================================
/** Returns the image's width (in pixels). */ /** Returns the image's width (in pixels). */


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

Loading…
Cancel
Save