mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Some light modernisation of a bunch of old code
This commit is contained in:
parent
bffc53b336
commit
3d7c777238
39 changed files with 492 additions and 635 deletions
|
|
@ -508,11 +508,10 @@ public:
|
|||
if (err == ASE_OK)
|
||||
{
|
||||
buffersCreated = true;
|
||||
|
||||
tempBuffer.calloc (totalBuffers * currentBlockSizeSamples + 32);
|
||||
|
||||
int n = 0;
|
||||
Array <int> types;
|
||||
Array<int> types;
|
||||
currentBitDepth = 16;
|
||||
|
||||
for (int i = 0; i < (int) totalNumInputChans; ++i)
|
||||
|
|
|
|||
|
|
@ -60,9 +60,9 @@ public:
|
|||
|
||||
typedef ReferenceCountedObjectPtr<LADSPAModuleHandle> Ptr;
|
||||
|
||||
static Array <LADSPAModuleHandle*>& getActiveModules()
|
||||
static Array<LADSPAModuleHandle*>& getActiveModules()
|
||||
{
|
||||
static Array <LADSPAModuleHandle*> activeModules;
|
||||
static Array<LADSPAModuleHandle*> activeModules;
|
||||
return activeModules;
|
||||
}
|
||||
|
||||
|
|
@ -571,7 +571,7 @@ private:
|
|||
LADSPAPluginFormat::LADSPAPluginFormat() {}
|
||||
LADSPAPluginFormat::~LADSPAPluginFormat() {}
|
||||
|
||||
void LADSPAPluginFormat::findAllTypesForFile (OwnedArray <PluginDescription>& results,
|
||||
void LADSPAPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& results,
|
||||
const String& fileOrIdentifier)
|
||||
{
|
||||
if (! fileMightContainThisPluginType (fileOrIdentifier))
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ public:
|
|||
: PropertyComponent (name),
|
||||
owner (p),
|
||||
index (paramIndex),
|
||||
paramHasChanged (false),
|
||||
slider (p, paramIndex)
|
||||
{
|
||||
startTimer (100);
|
||||
|
|
@ -87,9 +86,9 @@ private:
|
|||
public:
|
||||
ParamSlider (AudioProcessor& p, int paramIndex) : owner (p), index (paramIndex)
|
||||
{
|
||||
const int steps = owner.getParameterNumSteps (index);
|
||||
const AudioProcessorParameter::Category category = p.getParameterCategory (index);
|
||||
const bool isLevelMeter = (((category & 0xffff0000) >> 16) == 2);
|
||||
auto steps = owner.getParameterNumSteps (index);
|
||||
auto category = p.getParameterCategory (index);
|
||||
bool isLevelMeter = (((category & 0xffff0000) >> 16) == 2);
|
||||
|
||||
if (steps > 1 && steps < 0x7fffffff)
|
||||
setRange (0.0, 1.0, 1.0 / (steps - 1.0));
|
||||
|
|
@ -104,7 +103,7 @@ private:
|
|||
|
||||
void valueChanged() override
|
||||
{
|
||||
const float newVal = (float) getValue();
|
||||
auto newVal = static_cast<float> (getValue());
|
||||
|
||||
if (owner.getParameter (index) != newVal)
|
||||
{
|
||||
|
|
@ -138,7 +137,7 @@ private:
|
|||
|
||||
AudioProcessor& owner;
|
||||
const int index;
|
||||
bool volatile paramHasChanged;
|
||||
bool volatile paramHasChanged = false;
|
||||
ParamSlider slider;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProcessorParameterPropertyComp)
|
||||
|
|
@ -154,18 +153,19 @@ GenericAudioProcessorEditor::GenericAudioProcessorEditor (AudioProcessor* const
|
|||
|
||||
addAndMakeVisible (panel);
|
||||
|
||||
Array <PropertyComponent*> params;
|
||||
Array<PropertyComponent*> params;
|
||||
|
||||
const int numParams = p->getNumParameters();
|
||||
auto numParams = p->getNumParameters();
|
||||
int totalHeight = 0;
|
||||
|
||||
for (int i = 0; i < numParams; ++i)
|
||||
{
|
||||
String name (p->getParameterName (i));
|
||||
auto name = p->getParameterName (i);
|
||||
|
||||
if (name.trim().isEmpty())
|
||||
name = "Unnamed";
|
||||
|
||||
ProcessorParameterPropertyComp* const pc = new ProcessorParameterPropertyComp (name, *p, i);
|
||||
auto* pc = new ProcessorParameterPropertyComp (name, *p, i);
|
||||
params.add (pc);
|
||||
totalHeight += pc->getPreferredHeight();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ public:
|
|||
*/
|
||||
bool scanAndAddFile (const String& possiblePluginFileOrIdentifier,
|
||||
bool dontRescanIfAlreadyInList,
|
||||
OwnedArray <PluginDescription>& typesFound,
|
||||
OwnedArray<PluginDescription>& typesFound,
|
||||
AudioPluginFormat& formatToUse);
|
||||
|
||||
/** Tells a custom scanner that a scan has finished, and it can release any resources. */
|
||||
|
|
@ -112,7 +112,7 @@ public:
|
|||
*/
|
||||
void scanAndAddDragAndDroppedFiles (AudioPluginFormatManager& formatManager,
|
||||
const StringArray& filenames,
|
||||
OwnedArray <PluginDescription>& typesFound);
|
||||
OwnedArray<PluginDescription>& typesFound);
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the list of blacklisted files. */
|
||||
|
|
@ -194,7 +194,7 @@ public:
|
|||
@returns true if the plugin loaded, false if it crashed
|
||||
*/
|
||||
virtual bool findPluginTypesFor (AudioPluginFormat& format,
|
||||
OwnedArray <PluginDescription>& result,
|
||||
OwnedArray<PluginDescription>& result,
|
||||
const String& fileOrIdentifier) = 0;
|
||||
|
||||
/** Called when a scan has finished, to allow clean-up of resources. */
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ static int findInsertIndexInSortedArray (ElementComparator& comparator,
|
|||
This will work for primitive types and objects that implement operator<().
|
||||
|
||||
Example: @code
|
||||
Array <int> myArray;
|
||||
Array<int> myArray;
|
||||
DefaultElementComparator<int> sorter;
|
||||
myArray.sort (sorter);
|
||||
@endcode
|
||||
|
|
|
|||
|
|
@ -79,12 +79,12 @@ static String removeEllipsis (const String& path)
|
|||
#endif
|
||||
{
|
||||
StringArray toks;
|
||||
toks.addTokens (path, File::separatorString, StringRef());
|
||||
toks.addTokens (path, File::separatorString, {});
|
||||
bool anythingChanged = false;
|
||||
|
||||
for (int i = 1; i < toks.size(); ++i)
|
||||
{
|
||||
const String& t = toks[i];
|
||||
auto& t = toks[i];
|
||||
|
||||
if (t == ".." && toks[i - 1] != "..")
|
||||
{
|
||||
|
|
@ -118,7 +118,7 @@ String File::parseAbsolutePath (const String& p)
|
|||
|
||||
#if JUCE_WINDOWS
|
||||
// Windows..
|
||||
String path (removeEllipsis (p.replaceCharacter ('/', '\\')));
|
||||
auto path = removeEllipsis (p.replaceCharacter ('/', '\\'));
|
||||
|
||||
if (path.startsWithChar (separator))
|
||||
{
|
||||
|
|
@ -157,7 +157,7 @@ String File::parseAbsolutePath (const String& p)
|
|||
// If that's why you've ended up here, use File::getChildFile() to build your paths instead.
|
||||
jassert ((! p.containsChar ('\\')) || (p.indexOfChar ('/') >= 0 && p.indexOfChar ('/') < p.indexOfChar ('\\')));
|
||||
|
||||
String path (removeEllipsis (p));
|
||||
auto path = removeEllipsis (p);
|
||||
|
||||
if (path.startsWithChar ('~'))
|
||||
{
|
||||
|
|
@ -170,9 +170,9 @@ String File::parseAbsolutePath (const String& p)
|
|||
else
|
||||
{
|
||||
// expand a name of type "~dave/abc"
|
||||
const String userName (path.substring (1).upToFirstOccurrenceOf ("/", false, false));
|
||||
auto userName = path.substring (1).upToFirstOccurrenceOf ("/", false, false);
|
||||
|
||||
if (struct passwd* const pw = getpwnam (userName.toUTF8()))
|
||||
if (auto* pw = getpwnam (userName.toUTF8()))
|
||||
path = addTrailingSeparator (pw->pw_dir) + path.fromFirstOccurrenceOf ("/", false, false);
|
||||
}
|
||||
}
|
||||
|
|
@ -248,11 +248,11 @@ bool File::setReadOnly (const bool shouldBeReadOnly,
|
|||
|
||||
if (applyRecursively && isDirectory())
|
||||
{
|
||||
Array <File> subFiles;
|
||||
Array<File> subFiles;
|
||||
findChildFiles (subFiles, File::findFilesAndDirectories, false);
|
||||
|
||||
for (int i = subFiles.size(); --i >= 0;)
|
||||
worked = subFiles.getReference(i).setReadOnly (shouldBeReadOnly, true) && worked;
|
||||
for (auto& f : subFiles)
|
||||
worked = f.setReadOnly (shouldBeReadOnly, true) && worked;
|
||||
}
|
||||
|
||||
return setFileReadOnlyInternal (shouldBeReadOnly) && worked;
|
||||
|
|
@ -272,8 +272,8 @@ bool File::deleteRecursively() const
|
|||
Array<File> subFiles;
|
||||
findChildFiles (subFiles, File::findFilesAndDirectories, false);
|
||||
|
||||
for (int i = subFiles.size(); --i >= 0;)
|
||||
worked = subFiles.getReference(i).deleteRecursively() && worked;
|
||||
for (auto& f : subFiles)
|
||||
worked = f.deleteRecursively() && worked;
|
||||
}
|
||||
|
||||
return deleteFile() && worked;
|
||||
|
|
@ -324,15 +324,15 @@ bool File::copyDirectoryTo (const File& newDirectory) const
|
|||
Array<File> subFiles;
|
||||
findChildFiles (subFiles, File::findFiles, false);
|
||||
|
||||
for (int i = 0; i < subFiles.size(); ++i)
|
||||
if (! subFiles.getReference(i).copyFileTo (newDirectory.getChildFile (subFiles.getReference(i).getFileName())))
|
||||
for (auto& f : subFiles)
|
||||
if (! f.copyFileTo (newDirectory.getChildFile (f.getFileName())))
|
||||
return false;
|
||||
|
||||
subFiles.clear();
|
||||
findChildFiles (subFiles, File::findDirectories, false);
|
||||
|
||||
for (int i = 0; i < subFiles.size(); ++i)
|
||||
if (! subFiles.getReference(i).copyDirectoryTo (newDirectory.getChildFile (subFiles.getReference(i).getFileName())))
|
||||
for (auto& f : subFiles)
|
||||
if (! f.copyDirectoryTo (newDirectory.getChildFile (f.getFileName())))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
|
@ -344,7 +344,7 @@ bool File::copyDirectoryTo (const File& newDirectory) const
|
|||
//==============================================================================
|
||||
String File::getPathUpToLastSlash() const
|
||||
{
|
||||
const int lastSlash = fullPath.lastIndexOfChar (separator);
|
||||
auto lastSlash = fullPath.lastIndexOfChar (separator);
|
||||
|
||||
if (lastSlash > 0)
|
||||
return fullPath.substring (0, lastSlash);
|
||||
|
|
@ -357,9 +357,7 @@ String File::getPathUpToLastSlash() const
|
|||
|
||||
File File::getParentDirectory() const
|
||||
{
|
||||
File f;
|
||||
f.fullPath = getPathUpToLastSlash();
|
||||
return f;
|
||||
return createFileWithoutCheckingPath (getPathUpToLastSlash());
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -370,8 +368,8 @@ String File::getFileName() const
|
|||
|
||||
String File::getFileNameWithoutExtension() const
|
||||
{
|
||||
const int lastSlash = fullPath.lastIndexOfChar (separator) + 1;
|
||||
const int lastDot = fullPath.lastIndexOfChar ('.');
|
||||
auto lastSlash = fullPath.lastIndexOfChar (separator) + 1;
|
||||
auto lastDot = fullPath.lastIndexOfChar ('.');
|
||||
|
||||
if (lastDot > lastSlash)
|
||||
return fullPath.substring (lastSlash, lastDot);
|
||||
|
|
@ -384,7 +382,7 @@ bool File::isAChildOf (const File& potentialParent) const
|
|||
if (potentialParent.fullPath.isEmpty())
|
||||
return false;
|
||||
|
||||
const String ourPath (getPathUpToLastSlash());
|
||||
auto ourPath = getPathUpToLastSlash();
|
||||
|
||||
if (compareFilenames (potentialParent.fullPath, ourPath) == 0)
|
||||
return true;
|
||||
|
|
@ -401,7 +399,7 @@ int64 File::hashCode64() const { return fullPath.hashCode64(); }
|
|||
//==============================================================================
|
||||
bool File::isAbsolutePath (StringRef path)
|
||||
{
|
||||
const juce_wchar firstChar = *(path.text);
|
||||
auto firstChar = *(path.text);
|
||||
|
||||
return firstChar == separator
|
||||
#if JUCE_WINDOWS
|
||||
|
|
@ -413,7 +411,7 @@ bool File::isAbsolutePath (StringRef path)
|
|||
|
||||
File File::getChildFile (StringRef relativePath) const
|
||||
{
|
||||
String::CharPointerType r = relativePath.text;
|
||||
auto r = relativePath.text;
|
||||
|
||||
if (isAbsolutePath (r))
|
||||
return File (String (r));
|
||||
|
|
@ -423,20 +421,21 @@ File File::getChildFile (StringRef relativePath) const
|
|||
return getChildFile (String (r).replaceCharacter ('/', '\\'));
|
||||
#endif
|
||||
|
||||
String path (fullPath);
|
||||
auto path = fullPath;
|
||||
|
||||
while (*r == '.')
|
||||
{
|
||||
String::CharPointerType lastPos = r;
|
||||
const juce_wchar secondChar = *++r;
|
||||
auto lastPos = r;
|
||||
auto secondChar = *++r;
|
||||
|
||||
if (secondChar == '.') // remove "../"
|
||||
{
|
||||
const juce_wchar thirdChar = *++r;
|
||||
auto thirdChar = *++r;
|
||||
|
||||
if (thirdChar == separator || thirdChar == 0)
|
||||
{
|
||||
const int lastSlash = path.lastIndexOfChar (separator);
|
||||
auto lastSlash = path.lastIndexOfChar (separator);
|
||||
|
||||
if (lastSlash >= 0)
|
||||
path = path.substring (0, lastSlash);
|
||||
|
||||
|
|
@ -492,12 +491,12 @@ Result File::create() const
|
|||
if (exists())
|
||||
return Result::ok();
|
||||
|
||||
const File parentDir (getParentDirectory());
|
||||
auto parentDir = getParentDirectory();
|
||||
|
||||
if (parentDir == *this)
|
||||
return Result::fail ("Cannot create parent directory");
|
||||
|
||||
Result r (parentDir.createDirectory());
|
||||
auto r = parentDir.createDirectory();
|
||||
|
||||
if (r.wasOk())
|
||||
{
|
||||
|
|
@ -513,12 +512,12 @@ Result File::createDirectory() const
|
|||
if (isDirectory())
|
||||
return Result::ok();
|
||||
|
||||
const File parentDir (getParentDirectory());
|
||||
auto parentDir = getParentDirectory();
|
||||
|
||||
if (parentDir == *this)
|
||||
return Result::fail ("Cannot create parent directory");
|
||||
|
||||
Result r (parentDir.createDirectory());
|
||||
auto r = parentDir.createDirectory();
|
||||
|
||||
if (r.wasOk())
|
||||
r = createDirectoryInternal (fullPath.trimCharactersAtEnd (separatorString));
|
||||
|
|
@ -601,20 +600,20 @@ File File::getNonexistentChildFile (const String& suggestedPrefix,
|
|||
const String& suffix,
|
||||
bool putNumbersInBrackets) const
|
||||
{
|
||||
File f (getChildFile (suggestedPrefix + suffix));
|
||||
auto f = getChildFile (suggestedPrefix + suffix);
|
||||
|
||||
if (f.exists())
|
||||
{
|
||||
int number = 1;
|
||||
String prefix (suggestedPrefix);
|
||||
auto prefix = suggestedPrefix;
|
||||
|
||||
// remove any bracketed numbers that may already be on the end..
|
||||
if (prefix.trim().endsWithChar (')'))
|
||||
{
|
||||
putNumbersInBrackets = true;
|
||||
|
||||
const int openBracks = prefix.lastIndexOfChar ('(');
|
||||
const int closeBracks = prefix.lastIndexOfChar (')');
|
||||
auto openBracks = prefix.lastIndexOfChar ('(');
|
||||
auto closeBracks = prefix.lastIndexOfChar (')');
|
||||
|
||||
if (openBracks > 0
|
||||
&& closeBracks > openBracks
|
||||
|
|
@ -627,7 +626,7 @@ File File::getNonexistentChildFile (const String& suggestedPrefix,
|
|||
|
||||
do
|
||||
{
|
||||
String newName (prefix);
|
||||
auto newName = prefix;
|
||||
|
||||
if (putNumbersInBrackets)
|
||||
{
|
||||
|
|
@ -662,7 +661,7 @@ File File::getNonexistentSibling (const bool putNumbersInBrackets) const
|
|||
//==============================================================================
|
||||
String File::getFileExtension() const
|
||||
{
|
||||
const int indexOfDot = fullPath.lastIndexOfChar ('.');
|
||||
auto indexOfDot = fullPath.lastIndexOfChar ('.');
|
||||
|
||||
if (indexOfDot > fullPath.lastIndexOfChar (separator))
|
||||
return fullPath.substring (indexOfDot);
|
||||
|
|
@ -675,7 +674,7 @@ bool File::hasFileExtension (StringRef possibleSuffix) const
|
|||
if (possibleSuffix.isEmpty())
|
||||
return fullPath.lastIndexOfChar ('.') <= fullPath.lastIndexOfChar (separator);
|
||||
|
||||
const int semicolon = possibleSuffix.text.indexOf ((juce_wchar) ';');
|
||||
auto semicolon = possibleSuffix.text.indexOf ((juce_wchar) ';');
|
||||
|
||||
if (semicolon >= 0)
|
||||
return hasFileExtension (String (possibleSuffix.text).substring (0, semicolon).trimEnd())
|
||||
|
|
@ -686,10 +685,10 @@ bool File::hasFileExtension (StringRef possibleSuffix) const
|
|||
if (possibleSuffix.text[0] == '.')
|
||||
return true;
|
||||
|
||||
const int dotPos = fullPath.length() - possibleSuffix.length() - 1;
|
||||
auto dotPos = fullPath.length() - possibleSuffix.length() - 1;
|
||||
|
||||
if (dotPos >= 0)
|
||||
return fullPath [dotPos] == '.';
|
||||
return fullPath[dotPos] == '.';
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -700,11 +699,12 @@ File File::withFileExtension (StringRef newExtension) const
|
|||
if (fullPath.isEmpty())
|
||||
return {};
|
||||
|
||||
String filePart (getFileName());
|
||||
auto filePart = getFileName();
|
||||
|
||||
const int i = filePart.lastIndexOfChar ('.');
|
||||
if (i >= 0)
|
||||
filePart = filePart.substring (0, i);
|
||||
auto lastDot = filePart.lastIndexOfChar ('.');
|
||||
|
||||
if (lastDot >= 0)
|
||||
filePart = filePart.substring (0, lastDot);
|
||||
|
||||
if (newExtension.isNotEmpty() && newExtension.text[0] != '.')
|
||||
filePart << '.';
|
||||
|
|
@ -729,7 +729,7 @@ FileInputStream* File::createInputStream() const
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
FileOutputStream* File::createOutputStream (const size_t bufferSize) const
|
||||
FileOutputStream* File::createOutputStream (size_t bufferSize) const
|
||||
{
|
||||
ScopedPointer<FileOutputStream> out (new FileOutputStream (*this, bufferSize));
|
||||
|
||||
|
|
@ -798,8 +798,8 @@ bool File::hasIdenticalContentTo (const File& other) const
|
|||
|
||||
for (;;)
|
||||
{
|
||||
const int num1 = in1.read (buffer1, bufferSize);
|
||||
const int num2 = in2.read (buffer2, bufferSize);
|
||||
auto num1 = in1.read (buffer1, bufferSize);
|
||||
auto num2 = in2.read (buffer2, bufferSize);
|
||||
|
||||
if (num1 != num2)
|
||||
break;
|
||||
|
|
@ -819,7 +819,7 @@ bool File::hasIdenticalContentTo (const File& other) const
|
|||
//==============================================================================
|
||||
String File::createLegalPathName (const String& original)
|
||||
{
|
||||
String s (original);
|
||||
auto s = original;
|
||||
String start;
|
||||
|
||||
if (s.isNotEmpty() && s[1] == ':')
|
||||
|
|
@ -834,14 +834,14 @@ String File::createLegalPathName (const String& original)
|
|||
|
||||
String File::createLegalFileName (const String& original)
|
||||
{
|
||||
String s (original.removeCharacters ("\"#@,;:<>*^|?\\/"));
|
||||
auto s = original.removeCharacters ("\"#@,;:<>*^|?\\/");
|
||||
|
||||
const int maxLength = 128; // only the length of the filename, not the whole path
|
||||
const int len = s.length();
|
||||
auto len = s.length();
|
||||
|
||||
if (len > maxLength)
|
||||
{
|
||||
const int lastDot = s.lastIndexOfChar ('.');
|
||||
auto lastDot = s.lastIndexOfChar ('.');
|
||||
|
||||
if (lastDot > jmax (0, len - 12))
|
||||
{
|
||||
|
|
@ -931,9 +931,9 @@ String File::getRelativePathFrom (const File& dir) const
|
|||
return thisPathAfterCommon;
|
||||
|
||||
#if JUCE_WINDOWS
|
||||
String s (String::repeatedString ("..\\", numUpDirectoriesNeeded));
|
||||
auto s = String::repeatedString ("..\\", numUpDirectoriesNeeded);
|
||||
#else
|
||||
String s (String::repeatedString ("../", numUpDirectoriesNeeded));
|
||||
auto s = String::repeatedString ("../", numUpDirectoriesNeeded);
|
||||
#endif
|
||||
s.appendCharPointer (thisPathAfterCommon);
|
||||
return s;
|
||||
|
|
@ -989,13 +989,13 @@ bool File::createSymbolicLink (const File& linkFileToCreate, bool overwriteExist
|
|||
|
||||
//==============================================================================
|
||||
MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode, bool exclusive)
|
||||
: address (nullptr), range (0, file.getSize()), fileHandle (0)
|
||||
: range (0, file.getSize())
|
||||
{
|
||||
openInternal (file, mode, exclusive);
|
||||
}
|
||||
|
||||
MemoryMappedFile::MemoryMappedFile (const File& file, const Range<int64>& fileRange, AccessMode mode, bool exclusive)
|
||||
: address (nullptr), range (fileRange.getIntersectionWith (Range<int64> (0, file.getSize()))), fileHandle (0)
|
||||
: range (fileRange.getIntersectionWith (Range<int64> (0, file.getSize())))
|
||||
{
|
||||
openInternal (file, mode, exclusive);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,13 +96,13 @@ public:
|
|||
|
||||
private:
|
||||
//==============================================================================
|
||||
void* address;
|
||||
void* address = nullptr;
|
||||
Range<int64> range;
|
||||
|
||||
#if JUCE_WINDOWS
|
||||
void* fileHandle;
|
||||
void* fileHandle = nullptr;
|
||||
#else
|
||||
int fileHandle;
|
||||
int fileHandle = 0;
|
||||
#endif
|
||||
|
||||
void openInternal (const File&, AccessMode, bool);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ struct JSONParser
|
|||
|
||||
for (;;)
|
||||
{
|
||||
juce_wchar c = t.getAndAdvance();
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (c == quoteChar)
|
||||
break;
|
||||
|
|
@ -74,7 +74,8 @@ struct JSONParser
|
|||
|
||||
for (int i = 4; --i >= 0;)
|
||||
{
|
||||
const int digitValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance());
|
||||
auto digitValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance());
|
||||
|
||||
if (digitValue < 0)
|
||||
return createFail ("Syntax error in unicode escape sequence");
|
||||
|
||||
|
|
@ -99,7 +100,7 @@ struct JSONParser
|
|||
static Result parseAny (String::CharPointerType& t, var& result)
|
||||
{
|
||||
t = t.findEndOfWhitespace();
|
||||
String::CharPointerType t2 (t);
|
||||
auto t2 = t;
|
||||
|
||||
switch (t2.getAndAdvance())
|
||||
{
|
||||
|
|
@ -167,16 +168,16 @@ private:
|
|||
|
||||
static Result parseNumber (String::CharPointerType& t, var& result, const bool isNegative)
|
||||
{
|
||||
String::CharPointerType oldT (t);
|
||||
auto oldT = t;
|
||||
|
||||
int64 intValue = t.getAndAdvance() - '0';
|
||||
jassert (intValue >= 0 && intValue < 10);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
String::CharPointerType previousChar (t);
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
const int digit = ((int) c) - '0';
|
||||
auto previousChar = t;
|
||||
auto c = t.getAndAdvance();
|
||||
auto digit = ((int) c) - '0';
|
||||
|
||||
if (isPositiveAndBelow (digit, 10))
|
||||
{
|
||||
|
|
@ -187,7 +188,7 @@ private:
|
|||
if (c == 'e' || c == 'E' || c == '.')
|
||||
{
|
||||
t = oldT;
|
||||
const double asDouble = CharacterFunctions::readDoubleValue (t);
|
||||
auto asDouble = CharacterFunctions::readDoubleValue (t);
|
||||
result = isNegative ? -asDouble : asDouble;
|
||||
return Result::ok();
|
||||
}
|
||||
|
|
@ -202,7 +203,7 @@ private:
|
|||
return createFail ("Syntax error in number", &oldT);
|
||||
}
|
||||
|
||||
const int64 correctedValue = isNegative ? -intValue : intValue;
|
||||
auto correctedValue = isNegative ? -intValue : intValue;
|
||||
|
||||
if ((intValue >> 31) != 0)
|
||||
result = correctedValue;
|
||||
|
|
@ -214,16 +215,16 @@ private:
|
|||
|
||||
static Result parseObject (String::CharPointerType& t, var& result)
|
||||
{
|
||||
DynamicObject* const resultObject = new DynamicObject();
|
||||
auto resultObject = new DynamicObject();
|
||||
result = resultObject;
|
||||
NamedValueSet& resultProperties = resultObject->getProperties();
|
||||
auto& resultProperties = resultObject->getProperties();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
t = t.findEndOfWhitespace();
|
||||
|
||||
String::CharPointerType oldT (t);
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
auto oldT = t;
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (c == '}')
|
||||
break;
|
||||
|
|
@ -234,7 +235,7 @@ private:
|
|||
if (c == '"')
|
||||
{
|
||||
var propertyNameVar;
|
||||
Result r (parseString ('"', t, propertyNameVar));
|
||||
auto r = parseString ('"', t, propertyNameVar);
|
||||
|
||||
if (r.failed())
|
||||
return r;
|
||||
|
|
@ -246,14 +247,15 @@ private:
|
|||
t = t.findEndOfWhitespace();
|
||||
oldT = t;
|
||||
|
||||
const juce_wchar c2 = t.getAndAdvance();
|
||||
auto c2 = t.getAndAdvance();
|
||||
|
||||
if (c2 != ':')
|
||||
return createFail ("Expected ':', but found", &oldT);
|
||||
|
||||
resultProperties.set (propertyName, var());
|
||||
var* propertyValue = resultProperties.getVarPointer (propertyName);
|
||||
|
||||
Result r2 (parseAny (t, *propertyValue));
|
||||
auto r2 = parseAny (t, *propertyValue);
|
||||
|
||||
if (r2.failed())
|
||||
return r2;
|
||||
|
|
@ -261,7 +263,7 @@ private:
|
|||
t = t.findEndOfWhitespace();
|
||||
oldT = t;
|
||||
|
||||
const juce_wchar nextChar = t.getAndAdvance();
|
||||
auto nextChar = t.getAndAdvance();
|
||||
|
||||
if (nextChar == ',')
|
||||
continue;
|
||||
|
|
@ -280,14 +282,14 @@ private:
|
|||
static Result parseArray (String::CharPointerType& t, var& result)
|
||||
{
|
||||
result = var (Array<var>());
|
||||
Array<var>* const destArray = result.getArray();
|
||||
auto* destArray = result.getArray();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
t = t.findEndOfWhitespace();
|
||||
|
||||
String::CharPointerType oldT (t);
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
auto oldT = t;
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (c == ']')
|
||||
break;
|
||||
|
|
@ -297,7 +299,7 @@ private:
|
|||
|
||||
t = oldT;
|
||||
destArray->add (var());
|
||||
Result r (parseAny (t, destArray->getReference (destArray->size() - 1)));
|
||||
auto r = parseAny (t, destArray->getReference (destArray->size() - 1));
|
||||
|
||||
if (r.failed())
|
||||
return r;
|
||||
|
|
@ -305,7 +307,7 @@ private:
|
|||
t = t.findEndOfWhitespace();
|
||||
oldT = t;
|
||||
|
||||
const juce_wchar nextChar = t.getAndAdvance();
|
||||
auto nextChar = t.getAndAdvance();
|
||||
|
||||
if (nextChar == ',')
|
||||
continue;
|
||||
|
|
@ -324,8 +326,7 @@ private:
|
|||
struct JSONFormatter
|
||||
{
|
||||
static void write (OutputStream& out, const var& v,
|
||||
const int indentLevel, const bool allOnOneLine,
|
||||
int maximumDecimalPlaces)
|
||||
int indentLevel, bool allOnOneLine, int maximumDecimalPlaces)
|
||||
{
|
||||
if (v.isString())
|
||||
{
|
||||
|
|
@ -355,7 +356,7 @@ struct JSONFormatter
|
|||
}
|
||||
else if (v.isObject())
|
||||
{
|
||||
if (DynamicObject* object = v.getDynamicObject())
|
||||
if (auto* object = v.getDynamicObject())
|
||||
object->writeAsJSON (out, indentLevel, allOnOneLine, maximumDecimalPlaces);
|
||||
else
|
||||
jassertfalse; // Only DynamicObjects can be converted to JSON!
|
||||
|
|
@ -378,7 +379,7 @@ struct JSONFormatter
|
|||
{
|
||||
for (;;)
|
||||
{
|
||||
const juce_wchar c (t.getAndAdvance());
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
switch (c)
|
||||
{
|
||||
|
|
@ -426,12 +427,11 @@ struct JSONFormatter
|
|||
}
|
||||
|
||||
static void writeArray (OutputStream& out, const Array<var>& array,
|
||||
const int indentLevel, const bool allOnOneLine,
|
||||
int maximumDecimalPlaces)
|
||||
int indentLevel, bool allOnOneLine, int maximumDecimalPlaces)
|
||||
{
|
||||
out << '[';
|
||||
|
||||
if (array.size() > 0)
|
||||
if (! array.isEmpty())
|
||||
{
|
||||
if (! allOnOneLine)
|
||||
out << newLine;
|
||||
|
|
@ -521,7 +521,7 @@ String JSON::escapeString (StringRef s)
|
|||
|
||||
Result JSON::parseQuotedString (String::CharPointerType& t, var& result)
|
||||
{
|
||||
const juce_wchar quote = t.getAndAdvance();
|
||||
auto quote = t.getAndAdvance();
|
||||
|
||||
if (quote == '"' || quote == '\'')
|
||||
return JSONParser::parseString (quote, t, result);
|
||||
|
|
|
|||
|
|
@ -24,24 +24,21 @@ namespace juce
|
|||
{
|
||||
|
||||
MemoryOutputStream::MemoryOutputStream (const size_t initialSize)
|
||||
: blockToUse (&internalBlock), externalData (nullptr),
|
||||
position (0), size (0), availableSize (0)
|
||||
: blockToUse (&internalBlock)
|
||||
{
|
||||
internalBlock.setSize (initialSize, false);
|
||||
}
|
||||
|
||||
MemoryOutputStream::MemoryOutputStream (MemoryBlock& memoryBlockToWriteTo,
|
||||
const bool appendToExistingBlockContent)
|
||||
: blockToUse (&memoryBlockToWriteTo), externalData (nullptr),
|
||||
position (0), size (0), availableSize (0)
|
||||
: blockToUse (&memoryBlockToWriteTo)
|
||||
{
|
||||
if (appendToExistingBlockContent)
|
||||
position = size = memoryBlockToWriteTo.getSize();
|
||||
}
|
||||
|
||||
MemoryOutputStream::MemoryOutputStream (void* destBuffer, size_t destBufferSize)
|
||||
: blockToUse (nullptr), externalData (destBuffer),
|
||||
position (0), size (0), availableSize (destBufferSize)
|
||||
: externalData (destBuffer), availableSize (destBufferSize)
|
||||
{
|
||||
jassert (externalData != nullptr); // This must be a valid pointer.
|
||||
}
|
||||
|
|
@ -77,7 +74,7 @@ void MemoryOutputStream::reset() noexcept
|
|||
char* MemoryOutputStream::prepareToWrite (size_t numBytes)
|
||||
{
|
||||
jassert ((ssize_t) numBytes >= 0);
|
||||
size_t storageNeeded = position + numBytes;
|
||||
auto storageNeeded = position + numBytes;
|
||||
|
||||
char* data;
|
||||
|
||||
|
|
@ -96,7 +93,7 @@ char* MemoryOutputStream::prepareToWrite (size_t numBytes)
|
|||
data = static_cast<char*> (externalData);
|
||||
}
|
||||
|
||||
char* const writePointer = data + position;
|
||||
auto* writePointer = data + position;
|
||||
position += numBytes;
|
||||
size = jmax (size, position);
|
||||
return writePointer;
|
||||
|
|
@ -109,7 +106,7 @@ bool MemoryOutputStream::write (const void* const buffer, size_t howMany)
|
|||
if (howMany == 0)
|
||||
return true;
|
||||
|
||||
if (char* dest = prepareToWrite (howMany))
|
||||
if (auto* dest = prepareToWrite (howMany))
|
||||
{
|
||||
memcpy (dest, buffer, howMany);
|
||||
return true;
|
||||
|
|
@ -123,7 +120,7 @@ bool MemoryOutputStream::writeRepeatedByte (uint8 byte, size_t howMany)
|
|||
if (howMany == 0)
|
||||
return true;
|
||||
|
||||
if (char* dest = prepareToWrite (howMany))
|
||||
if (auto* dest = prepareToWrite (howMany))
|
||||
{
|
||||
memset (dest, byte, howMany);
|
||||
return true;
|
||||
|
|
@ -134,7 +131,7 @@ bool MemoryOutputStream::writeRepeatedByte (uint8 byte, size_t howMany)
|
|||
|
||||
bool MemoryOutputStream::appendUTF8Char (juce_wchar c)
|
||||
{
|
||||
if (char* dest = prepareToWrite (CharPointer_UTF8::getBytesRequiredFor (c)))
|
||||
if (auto* dest = prepareToWrite (CharPointer_UTF8::getBytesRequiredFor (c)))
|
||||
{
|
||||
CharPointer_UTF8 (dest).write (c);
|
||||
return true;
|
||||
|
|
@ -191,7 +188,7 @@ int64 MemoryOutputStream::writeFromInputStream (InputStream& source, int64 maxNu
|
|||
|
||||
String MemoryOutputStream::toUTF8() const
|
||||
{
|
||||
const char* const d = static_cast<const char*> (getData());
|
||||
auto* d = static_cast<const char*> (getData());
|
||||
return String (CharPointer_UTF8 (d), CharPointer_UTF8 (d + getDataSize()));
|
||||
}
|
||||
|
||||
|
|
@ -202,7 +199,7 @@ String MemoryOutputStream::toString() const
|
|||
|
||||
OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead)
|
||||
{
|
||||
const size_t dataSize = streamToRead.getDataSize();
|
||||
auto dataSize = streamToRead.getDataSize();
|
||||
|
||||
if (dataSize > 0)
|
||||
stream.write (streamToRead.getData(), dataSize);
|
||||
|
|
|
|||
|
|
@ -114,10 +114,10 @@ public:
|
|||
|
||||
private:
|
||||
//==============================================================================
|
||||
MemoryBlock* const blockToUse;
|
||||
MemoryBlock* const blockToUse = nullptr;
|
||||
MemoryBlock internalBlock;
|
||||
void* externalData;
|
||||
size_t position, size, availableSize;
|
||||
void* externalData = nullptr;
|
||||
size_t position = 0, size = 0, availableSize = 0;
|
||||
|
||||
void trimExternalBlockSize();
|
||||
char* prepareToWrite (size_t);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ StringArray::StringArray (const StringArray& other)
|
|||
}
|
||||
|
||||
StringArray::StringArray (StringArray&& other) noexcept
|
||||
: strings (static_cast<Array <String>&&> (other.strings))
|
||||
: strings (static_cast<Array<String>&&> (other.strings))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -174,8 +174,8 @@ void StringArray::addArray (const StringArray& otherArray, int startIndex, int n
|
|||
|
||||
void StringArray::mergeArray (const StringArray& otherArray, const bool ignoreCase)
|
||||
{
|
||||
for (int i = 0; i < otherArray.size(); ++i)
|
||||
addIfNotAlreadyThere (otherArray[i], ignoreCase);
|
||||
for (auto& s : otherArray)
|
||||
addIfNotAlreadyThere (s, ignoreCase);
|
||||
}
|
||||
|
||||
void StringArray::set (const int index, const String& newString)
|
||||
|
|
@ -193,7 +193,7 @@ int StringArray::indexOf (StringRef stringToLookFor, const bool ignoreCase, int
|
|||
if (i < 0)
|
||||
i = 0;
|
||||
|
||||
const int numElements = size();
|
||||
auto numElements = size();
|
||||
|
||||
if (ignoreCase)
|
||||
{
|
||||
|
|
@ -217,7 +217,7 @@ void StringArray::move (const int currentIndex, const int newIndex) noexcept
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void StringArray::remove (const int index)
|
||||
void StringArray::remove (int index)
|
||||
{
|
||||
strings.remove (index);
|
||||
}
|
||||
|
|
@ -262,11 +262,8 @@ void StringArray::removeEmptyStrings (const bool removeWhitespaceStrings)
|
|||
|
||||
void StringArray::trim()
|
||||
{
|
||||
for (int i = size(); --i >= 0;)
|
||||
{
|
||||
String& s = strings.getReference(i);
|
||||
for (auto& s : strings)
|
||||
s = s.trim();
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -308,8 +305,8 @@ void StringArray::sortNatural()
|
|||
//==============================================================================
|
||||
String StringArray::joinIntoString (StringRef separator, int start, int numberToJoin) const
|
||||
{
|
||||
const int last = (numberToJoin < 0) ? size()
|
||||
: jmin (size(), start + numberToJoin);
|
||||
auto last = (numberToJoin < 0) ? size()
|
||||
: jmin (size(), start + numberToJoin);
|
||||
|
||||
if (start < 0)
|
||||
start = 0;
|
||||
|
|
@ -320,8 +317,8 @@ String StringArray::joinIntoString (StringRef separator, int start, int numberTo
|
|||
if (start == last - 1)
|
||||
return strings.getReference (start);
|
||||
|
||||
const size_t separatorBytes = separator.text.sizeInBytes() - sizeof (String::CharPointerType::CharType);
|
||||
size_t bytesNeeded = separatorBytes * (size_t) (last - start - 1);
|
||||
auto separatorBytes = separator.text.sizeInBytes() - sizeof (String::CharPointerType::CharType);
|
||||
auto bytesNeeded = separatorBytes * (size_t) (last - start - 1);
|
||||
|
||||
for (int i = start; i < last; ++i)
|
||||
bytesNeeded += strings.getReference(i).getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType);
|
||||
|
|
@ -333,7 +330,7 @@ String StringArray::joinIntoString (StringRef separator, int start, int numberTo
|
|||
|
||||
while (start < last)
|
||||
{
|
||||
const String& s = strings.getReference (start);
|
||||
auto& s = strings.getReference (start);
|
||||
|
||||
if (! s.isEmpty())
|
||||
dest.writeAll (s.getCharPointer());
|
||||
|
|
@ -358,11 +355,11 @@ int StringArray::addTokens (StringRef text, StringRef breakCharacters, StringRef
|
|||
|
||||
if (text.isNotEmpty())
|
||||
{
|
||||
for (String::CharPointerType t (text.text);;)
|
||||
for (auto t = text.text;;)
|
||||
{
|
||||
String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t,
|
||||
breakCharacters.text,
|
||||
quoteCharacters.text));
|
||||
auto tokenEnd = CharacterFunctions::findEndOfToken (t,
|
||||
breakCharacters.text,
|
||||
quoteCharacters.text);
|
||||
strings.add (String (t, tokenEnd));
|
||||
++num;
|
||||
|
||||
|
|
@ -379,14 +376,14 @@ int StringArray::addTokens (StringRef text, StringRef breakCharacters, StringRef
|
|||
int StringArray::addLines (StringRef sourceText)
|
||||
{
|
||||
int numLines = 0;
|
||||
String::CharPointerType text (sourceText.text);
|
||||
auto text = sourceText.text;
|
||||
bool finished = text.isEmpty();
|
||||
|
||||
while (! finished)
|
||||
{
|
||||
for (String::CharPointerType startOfLine (text);;)
|
||||
for (auto startOfLine = text;;)
|
||||
{
|
||||
const String::CharPointerType endOfLine (text);
|
||||
auto endOfLine = text;
|
||||
|
||||
switch (text.getAndAdvance())
|
||||
{
|
||||
|
|
@ -433,7 +430,7 @@ void StringArray::removeDuplicates (const bool ignoreCase)
|
|||
{
|
||||
for (int i = 0; i < size() - 1; ++i)
|
||||
{
|
||||
const String s (strings.getReference(i));
|
||||
auto s = strings.getReference(i);
|
||||
|
||||
for (int nextIndex = i + 1;;)
|
||||
{
|
||||
|
|
@ -452,24 +449,20 @@ void StringArray::appendNumbersToDuplicates (const bool ignoreCase,
|
|||
CharPointer_UTF8 preNumberString,
|
||||
CharPointer_UTF8 postNumberString)
|
||||
{
|
||||
CharPointer_UTF8 defaultPre (" ("), defaultPost (")");
|
||||
|
||||
if (preNumberString.getAddress() == nullptr)
|
||||
preNumberString = defaultPre;
|
||||
preNumberString = CharPointer_UTF8 (" (");
|
||||
|
||||
if (postNumberString.getAddress() == nullptr)
|
||||
postNumberString = defaultPost;
|
||||
postNumberString = CharPointer_UTF8 (")");
|
||||
|
||||
for (int i = 0; i < size() - 1; ++i)
|
||||
{
|
||||
String& s = strings.getReference(i);
|
||||
|
||||
int nextIndex = indexOf (s, ignoreCase, i + 1);
|
||||
auto& s = strings.getReference(i);
|
||||
auto nextIndex = indexOf (s, ignoreCase, i + 1);
|
||||
|
||||
if (nextIndex >= 0)
|
||||
{
|
||||
const String original (s);
|
||||
|
||||
auto original = s;
|
||||
int number = 0;
|
||||
|
||||
if (appendNumberToFirstInstance)
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ public:
|
|||
//==============================================================================
|
||||
private:
|
||||
CriticalSection callbackLock, listLock;
|
||||
Array <TimeSliceClient*> clients;
|
||||
Array<TimeSliceClient*> clients;
|
||||
TimeSliceClient* clientBeingCalled = nullptr;
|
||||
|
||||
TimeSliceClient* getNextClient (int index) const;
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ namespace juce
|
|||
{
|
||||
|
||||
UnitTest::UnitTest (const String& nm, const String& ctg)
|
||||
: name (nm), category (ctg), runner (nullptr)
|
||||
: name (nm), category (ctg)
|
||||
{
|
||||
getAllTests().add (this);
|
||||
}
|
||||
|
|
@ -114,16 +114,8 @@ Random UnitTest::getRandom() const
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
UnitTestRunner::UnitTestRunner()
|
||||
: currentTest (nullptr),
|
||||
assertOnFailure (true),
|
||||
logPasses (false)
|
||||
{
|
||||
}
|
||||
|
||||
UnitTestRunner::~UnitTestRunner()
|
||||
{
|
||||
}
|
||||
UnitTestRunner::UnitTestRunner() {}
|
||||
UnitTestRunner::~UnitTestRunner() {}
|
||||
|
||||
void UnitTestRunner::setAssertOnFailure (bool shouldAssert) noexcept
|
||||
{
|
||||
|
|
@ -160,17 +152,17 @@ void UnitTestRunner::runTests (const Array<UnitTest*>& tests, int64 randomSeed)
|
|||
randomForTest = Random (randomSeed);
|
||||
logMessage ("Random seed: 0x" + String::toHexString (randomSeed));
|
||||
|
||||
for (int i = 0; i < tests.size(); ++i)
|
||||
for (auto* t : tests)
|
||||
{
|
||||
if (shouldAbortTests())
|
||||
break;
|
||||
|
||||
#if JUCE_EXCEPTIONS_DISABLED
|
||||
tests.getUnchecked(i)->performTest (this);
|
||||
t->performTest (this);
|
||||
#else
|
||||
try
|
||||
{
|
||||
tests.getUnchecked(i)->performTest (this);
|
||||
t->performTest (this);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
|
|
@ -207,7 +199,7 @@ void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCatego
|
|||
endTest();
|
||||
currentTest = test;
|
||||
|
||||
TestResult* const r = new TestResult();
|
||||
auto* r = new TestResult();
|
||||
results.add (r);
|
||||
r->unitTestName = test->getName();
|
||||
r->subcategoryName = subCategory;
|
||||
|
|
@ -222,10 +214,8 @@ void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCatego
|
|||
|
||||
void UnitTestRunner::endTest()
|
||||
{
|
||||
if (results.size() > 0)
|
||||
if (auto* r = results.getLast())
|
||||
{
|
||||
TestResult* const r = results.getLast();
|
||||
|
||||
if (r->failures > 0)
|
||||
{
|
||||
String m ("FAILED!! ");
|
||||
|
|
@ -248,7 +238,7 @@ void UnitTestRunner::addPass()
|
|||
{
|
||||
const ScopedLock sl (results.getLock());
|
||||
|
||||
TestResult* const r = results.getLast();
|
||||
auto* r = results.getLast();
|
||||
jassert (r != nullptr); // You need to call UnitTest::beginTest() before performing any tests!
|
||||
|
||||
r->passes++;
|
||||
|
|
@ -269,7 +259,7 @@ void UnitTestRunner::addFail (const String& failureMessage)
|
|||
{
|
||||
const ScopedLock sl (results.getLock());
|
||||
|
||||
TestResult* const r = results.getLast();
|
||||
auto* r = results.getLast();
|
||||
jassert (r != nullptr); // You need to call UnitTest::beginTest() before performing any tests!
|
||||
|
||||
r->failures++;
|
||||
|
|
|
|||
|
|
@ -298,9 +298,8 @@ private:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
const String name;
|
||||
const String category;
|
||||
UnitTestRunner* runner;
|
||||
const String name, category;
|
||||
UnitTestRunner* runner = nullptr;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE (UnitTest)
|
||||
};
|
||||
|
|
@ -418,10 +417,10 @@ private:
|
|||
//==============================================================================
|
||||
friend class UnitTest;
|
||||
|
||||
UnitTest* currentTest;
|
||||
UnitTest* currentTest = nullptr;
|
||||
String currentSubCategory;
|
||||
OwnedArray <TestResult, CriticalSection> results;
|
||||
bool assertOnFailure, logPasses;
|
||||
OwnedArray<TestResult, CriticalSection> results;
|
||||
bool assertOnFailure = true, logPasses = false;
|
||||
Random randomForTest;
|
||||
|
||||
void beginNewTest (UnitTest* test, const String& subCategory);
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ struct ProcessSpec
|
|||
which is typically shared among several procoessors. This is useful to for
|
||||
multi-mono filters which share the same state among several mono processors.
|
||||
*/
|
||||
struct ProcessorState : ReferenceCountedObject
|
||||
struct ProcessorState : public ReferenceCountedObject
|
||||
{
|
||||
/** The ProcessorState structure is ref-counted, so this is a handy type that can be used
|
||||
as a pointer to one.
|
||||
|
|
|
|||
|
|
@ -94,18 +94,16 @@ protected:
|
|||
struct SavedState
|
||||
{
|
||||
SavedState();
|
||||
SavedState& operator= (const SavedState&) = delete;
|
||||
~SavedState();
|
||||
|
||||
RectangleList<int> clip;
|
||||
int xOffset, yOffset;
|
||||
FillType fillType;
|
||||
Font font;
|
||||
|
||||
private:
|
||||
SavedState& operator= (const SavedState&);
|
||||
};
|
||||
|
||||
OwnedArray <SavedState> stateStack;
|
||||
OwnedArray<SavedState> stateStack;
|
||||
|
||||
void writeClip();
|
||||
void writeColour (Colour colour);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ namespace juce
|
|||
class CustomTypeface::GlyphInfo
|
||||
{
|
||||
public:
|
||||
GlyphInfo (const juce_wchar c, const Path& p, const float w) noexcept
|
||||
GlyphInfo (juce_wchar c, const Path& p, float w) noexcept
|
||||
: character (c), path (p), width (w)
|
||||
{
|
||||
}
|
||||
|
|
@ -41,21 +41,17 @@ public:
|
|||
float kerningAmount;
|
||||
};
|
||||
|
||||
void addKerningPair (const juce_wchar subsequentCharacter,
|
||||
const float extraKerningAmount) noexcept
|
||||
void addKerningPair (juce_wchar subsequentCharacter, float extraKerningAmount) noexcept
|
||||
{
|
||||
KerningPair kp;
|
||||
kp.character2 = subsequentCharacter;
|
||||
kp.kerningAmount = extraKerningAmount;
|
||||
kerningPairs.add (kp);
|
||||
kerningPairs.add ({ subsequentCharacter, extraKerningAmount });
|
||||
}
|
||||
|
||||
float getHorizontalSpacing (const juce_wchar subsequentCharacter) const noexcept
|
||||
float getHorizontalSpacing (juce_wchar subsequentCharacter) const noexcept
|
||||
{
|
||||
if (subsequentCharacter != 0)
|
||||
for (int i = kerningPairs.size(); --i >= 0;)
|
||||
if (kerningPairs.getReference(i).character2 == subsequentCharacter)
|
||||
return width + kerningPairs.getReference(i).kerningAmount;
|
||||
for (auto& kp : kerningPairs)
|
||||
if (kp.character2 == subsequentCharacter)
|
||||
return width + kp.kerningAmount;
|
||||
|
||||
return width;
|
||||
}
|
||||
|
|
@ -63,7 +59,7 @@ public:
|
|||
const juce_wchar character;
|
||||
const Path path;
|
||||
float width;
|
||||
Array <KerningPair> kerningPairs;
|
||||
Array<KerningPair> kerningPairs;
|
||||
|
||||
private:
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlyphInfo)
|
||||
|
|
@ -74,11 +70,11 @@ namespace CustomTypefaceHelpers
|
|||
{
|
||||
static juce_wchar readChar (InputStream& in)
|
||||
{
|
||||
uint32 n = (uint32) (uint16) in.readShort();
|
||||
auto n = (uint32) (uint16) in.readShort();
|
||||
|
||||
if (n >= 0xd800 && n <= 0xdfff)
|
||||
{
|
||||
const uint32 nextWord = (uint32) (uint16) in.readShort();
|
||||
auto nextWord = (uint32) (uint16) in.readShort();
|
||||
jassert (nextWord >= 0xdc00); // illegal unicode character!
|
||||
|
||||
n = 0x10000 + (((n - 0xd800) << 10) | (nextWord - 0xdc00));
|
||||
|
|
@ -126,24 +122,24 @@ CustomTypeface::CustomTypeface (InputStream& serialisedTypefaceStream)
|
|||
ascent = in.readFloat();
|
||||
defaultCharacter = CustomTypefaceHelpers::readChar (in);
|
||||
|
||||
int numChars = in.readInt();
|
||||
auto numChars = in.readInt();
|
||||
|
||||
for (int i = 0; i < numChars; ++i)
|
||||
{
|
||||
const juce_wchar c = CustomTypefaceHelpers::readChar (in);
|
||||
const float width = in.readFloat();
|
||||
auto c = CustomTypefaceHelpers::readChar (in);
|
||||
auto width = in.readFloat();
|
||||
|
||||
Path p;
|
||||
p.loadPathFromStream (in);
|
||||
addGlyph (c, p, width);
|
||||
}
|
||||
|
||||
const int numKerningPairs = in.readInt();
|
||||
auto numKerningPairs = in.readInt();
|
||||
|
||||
for (int i = 0; i < numKerningPairs; ++i)
|
||||
{
|
||||
const juce_wchar char1 = CustomTypefaceHelpers::readChar (in);
|
||||
const juce_wchar char2 = CustomTypefaceHelpers::readChar (in);
|
||||
auto char1 = CustomTypefaceHelpers::readChar (in);
|
||||
auto char2 = CustomTypefaceHelpers::readChar (in);
|
||||
|
||||
addKerningPair (char1, char2, in.readFloat());
|
||||
}
|
||||
|
|
@ -163,8 +159,8 @@ void CustomTypeface::clear()
|
|||
glyphs.clear();
|
||||
}
|
||||
|
||||
void CustomTypeface::setCharacteristics (const String& newName, const float newAscent, const bool isBold,
|
||||
const bool isItalic, const juce_wchar newDefaultCharacter) noexcept
|
||||
void CustomTypeface::setCharacteristics (const String& newName, float newAscent, bool isBold,
|
||||
bool isItalic, juce_wchar newDefaultCharacter) noexcept
|
||||
{
|
||||
name = newName;
|
||||
defaultCharacter = newDefaultCharacter;
|
||||
|
|
@ -172,8 +168,8 @@ void CustomTypeface::setCharacteristics (const String& newName, const float newA
|
|||
style = FontStyleHelpers::getStyleName (isBold, isItalic);
|
||||
}
|
||||
|
||||
void CustomTypeface::setCharacteristics (const String& newName, const String& newStyle, const float newAscent,
|
||||
const juce_wchar newDefaultCharacter) noexcept
|
||||
void CustomTypeface::setCharacteristics (const String& newName, const String& newStyle,
|
||||
float newAscent, juce_wchar newDefaultCharacter) noexcept
|
||||
{
|
||||
name = newName;
|
||||
style = newStyle;
|
||||
|
|
@ -181,7 +177,7 @@ void CustomTypeface::setCharacteristics (const String& newName, const String& ne
|
|||
ascent = newAscent;
|
||||
}
|
||||
|
||||
void CustomTypeface::addGlyph (const juce_wchar character, const Path& path, const float width) noexcept
|
||||
void CustomTypeface::addGlyph (juce_wchar character, const Path& path, float width) noexcept
|
||||
{
|
||||
// Check that you're not trying to add the same character twice..
|
||||
jassert (findGlyph (character, false) == nullptr);
|
||||
|
|
@ -192,7 +188,7 @@ void CustomTypeface::addGlyph (const juce_wchar character, const Path& path, con
|
|||
glyphs.add (new GlyphInfo (character, path, width));
|
||||
}
|
||||
|
||||
void CustomTypeface::addKerningPair (const juce_wchar char1, const juce_wchar char2, const float extraAmount) noexcept
|
||||
void CustomTypeface::addKerningPair (juce_wchar char1, juce_wchar char2, float extraAmount) noexcept
|
||||
{
|
||||
if (extraAmount != 0.0f)
|
||||
{
|
||||
|
|
@ -203,17 +199,14 @@ void CustomTypeface::addKerningPair (const juce_wchar char1, const juce_wchar ch
|
|||
}
|
||||
}
|
||||
|
||||
CustomTypeface::GlyphInfo* CustomTypeface::findGlyph (const juce_wchar character, const bool loadIfNeeded) noexcept
|
||||
CustomTypeface::GlyphInfo* CustomTypeface::findGlyph (juce_wchar character, bool loadIfNeeded) noexcept
|
||||
{
|
||||
if (isPositiveAndBelow ((int) character, numElementsInArray (lookupTable)) && lookupTable [character] > 0)
|
||||
return glyphs [(int) lookupTable [(int) character]];
|
||||
|
||||
for (int i = 0; i < glyphs.size(); ++i)
|
||||
{
|
||||
GlyphInfo* const g = glyphs.getUnchecked(i);
|
||||
for (auto* g : glyphs)
|
||||
if (g->character == character)
|
||||
return g;
|
||||
}
|
||||
|
||||
if (loadIfNeeded && loadGlyphIfPossible (character))
|
||||
return findGlyph (character, false);
|
||||
|
|
@ -221,7 +214,7 @@ CustomTypeface::GlyphInfo* CustomTypeface::findGlyph (const juce_wchar character
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
bool CustomTypeface::loadGlyphIfPossible (const juce_wchar /*characterNeeded*/)
|
||||
bool CustomTypeface::loadGlyphIfPossible (juce_wchar)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -232,17 +225,17 @@ void CustomTypeface::addGlyphsFromOtherTypeface (Typeface& typefaceToCopy, juce_
|
|||
|
||||
for (int i = 0; i < numCharacters; ++i)
|
||||
{
|
||||
const juce_wchar c = (juce_wchar) (characterStartIndex + static_cast<juce_wchar> (i));
|
||||
auto c = (juce_wchar) (characterStartIndex + static_cast<juce_wchar> (i));
|
||||
|
||||
Array <int> glyphIndexes;
|
||||
Array <float> offsets;
|
||||
Array<int> glyphIndexes;
|
||||
Array<float> offsets;
|
||||
typefaceToCopy.getGlyphPositions (String::charToString (c), glyphIndexes, offsets);
|
||||
|
||||
const int glyphIndex = glyphIndexes.getFirst();
|
||||
|
||||
if (glyphIndex >= 0 && glyphIndexes.size() > 0)
|
||||
{
|
||||
const float glyphWidth = offsets[1];
|
||||
auto glyphWidth = offsets[1];
|
||||
|
||||
Path p;
|
||||
typefaceToCopy.getOutlineForGlyph (glyphIndex, p);
|
||||
|
|
@ -251,7 +244,7 @@ void CustomTypeface::addGlyphsFromOtherTypeface (Typeface& typefaceToCopy, juce_
|
|||
|
||||
for (int j = glyphs.size() - 1; --j >= 0;)
|
||||
{
|
||||
const juce_wchar char2 = glyphs.getUnchecked (j)->character;
|
||||
auto char2 = glyphs.getUnchecked (j)->character;
|
||||
glyphIndexes.clearQuick();
|
||||
offsets.clearQuick();
|
||||
typefaceToCopy.getGlyphPositions (String::charToString (c) + String::charToString (char2), glyphIndexes, offsets);
|
||||
|
|
@ -276,9 +269,8 @@ bool CustomTypeface::writeToStream (OutputStream& outputStream)
|
|||
|
||||
int numKerningPairs = 0;
|
||||
|
||||
for (int i = 0; i < glyphs.size(); ++i)
|
||||
for (auto* g : glyphs)
|
||||
{
|
||||
const GlyphInfo* const g = glyphs.getUnchecked (i);
|
||||
CustomTypefaceHelpers::writeChar (out, g->character);
|
||||
out.writeFloat (g->width);
|
||||
g->path.writePathToStream (out);
|
||||
|
|
@ -288,13 +280,10 @@ bool CustomTypeface::writeToStream (OutputStream& outputStream)
|
|||
|
||||
out.writeInt (numKerningPairs);
|
||||
|
||||
for (int i = 0; i < glyphs.size(); ++i)
|
||||
for (auto* g : glyphs)
|
||||
{
|
||||
const GlyphInfo* const g = glyphs.getUnchecked (i);
|
||||
|
||||
for (int j = 0; j < g->kerningPairs.size(); ++j)
|
||||
for (auto& p : g->kerningPairs)
|
||||
{
|
||||
const GlyphInfo::KerningPair& p = g->kerningPairs.getReference (j);
|
||||
CustomTypefaceHelpers::writeChar (out, g->character);
|
||||
CustomTypefaceHelpers::writeChar (out, p.character2);
|
||||
out.writeFloat (p.kerningAmount);
|
||||
|
|
@ -313,51 +302,50 @@ float CustomTypeface::getStringWidth (const String& text)
|
|||
{
|
||||
float x = 0;
|
||||
|
||||
for (String::CharPointerType t (text.getCharPointer()); ! t.isEmpty();)
|
||||
for (auto t = text.getCharPointer(); ! t.isEmpty();)
|
||||
{
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (const GlyphInfo* const glyph = findGlyph (c, true))
|
||||
if (auto* glyph = findGlyph (c, true))
|
||||
{
|
||||
x += glyph->getHorizontalSpacing (*t);
|
||||
}
|
||||
else
|
||||
{
|
||||
const Typeface::Ptr fallbackTypeface (Typeface::getFallbackTypeface());
|
||||
|
||||
if (fallbackTypeface != nullptr && fallbackTypeface != this)
|
||||
x += fallbackTypeface->getStringWidth (String::charToString (c));
|
||||
if (auto fallbackTypeface = Typeface::getFallbackTypeface())
|
||||
if (fallbackTypeface != this)
|
||||
x += fallbackTypeface->getStringWidth (String::charToString (c));
|
||||
}
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
void CustomTypeface::getGlyphPositions (const String& text, Array <int>& resultGlyphs, Array<float>& xOffsets)
|
||||
void CustomTypeface::getGlyphPositions (const String& text, Array<int>& resultGlyphs, Array<float>& xOffsets)
|
||||
{
|
||||
xOffsets.add (0);
|
||||
float x = 0;
|
||||
|
||||
for (String::CharPointerType t (text.getCharPointer()); ! t.isEmpty();)
|
||||
for (auto t = text.getCharPointer(); ! t.isEmpty();)
|
||||
{
|
||||
float width = 0.0f;
|
||||
int glyphChar = 0;
|
||||
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (const GlyphInfo* const glyph = findGlyph (c, true))
|
||||
if (auto* glyph = findGlyph (c, true))
|
||||
{
|
||||
width = glyph->getHorizontalSpacing (*t);
|
||||
glyphChar = (int) glyph->character;
|
||||
}
|
||||
else
|
||||
{
|
||||
const Typeface::Ptr fallbackTypeface (getFallbackTypeface());
|
||||
auto fallbackTypeface = getFallbackTypeface();
|
||||
|
||||
if (fallbackTypeface != nullptr && fallbackTypeface != this)
|
||||
{
|
||||
Array <int> subGlyphs;
|
||||
Array <float> subOffsets;
|
||||
Array<int> subGlyphs;
|
||||
Array<float> subOffsets;
|
||||
fallbackTypeface->getGlyphPositions (String::charToString (c), subGlyphs, subOffsets);
|
||||
|
||||
if (subGlyphs.size() > 0)
|
||||
|
|
@ -376,23 +364,22 @@ void CustomTypeface::getGlyphPositions (const String& text, Array <int>& resultG
|
|||
|
||||
bool CustomTypeface::getOutlineForGlyph (int glyphNumber, Path& path)
|
||||
{
|
||||
if (const GlyphInfo* const glyph = findGlyph ((juce_wchar) glyphNumber, true))
|
||||
if (auto* glyph = findGlyph ((juce_wchar) glyphNumber, true))
|
||||
{
|
||||
path = glyph->path;
|
||||
return true;
|
||||
}
|
||||
|
||||
const Typeface::Ptr fallbackTypeface (getFallbackTypeface());
|
||||
|
||||
if (fallbackTypeface != nullptr && fallbackTypeface != this)
|
||||
return fallbackTypeface->getOutlineForGlyph (glyphNumber, path);
|
||||
if (auto fallbackTypeface = getFallbackTypeface())
|
||||
if (fallbackTypeface != this)
|
||||
return fallbackTypeface->getOutlineForGlyph (glyphNumber, path);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
EdgeTable* CustomTypeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight)
|
||||
{
|
||||
if (const GlyphInfo* const glyph = findGlyph ((juce_wchar) glyphNumber, true))
|
||||
if (auto* glyph = findGlyph ((juce_wchar) glyphNumber, true))
|
||||
{
|
||||
if (! glyph->path.isEmpty())
|
||||
return new EdgeTable (glyph->path.getBoundsTransformed (transform)
|
||||
|
|
@ -401,10 +388,9 @@ EdgeTable* CustomTypeface::getEdgeTableForGlyph (int glyphNumber, const AffineTr
|
|||
}
|
||||
else
|
||||
{
|
||||
const Typeface::Ptr fallbackTypeface (getFallbackTypeface());
|
||||
|
||||
if (fallbackTypeface != nullptr && fallbackTypeface != this)
|
||||
return fallbackTypeface->getEdgeTableForGlyph (glyphNumber, transform, fontHeight);
|
||||
if (auto fallbackTypeface = getFallbackTypeface())
|
||||
if (fallbackTypeface != this)
|
||||
return fallbackTypeface->getEdgeTableForGlyph (glyphNumber, transform, fontHeight);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ public:
|
|||
float getDescent() const override;
|
||||
float getHeightToPointsFactor() const override;
|
||||
float getStringWidth (const String&) override;
|
||||
void getGlyphPositions (const String&, Array <int>& glyphs, Array<float>& xOffsets) override;
|
||||
void getGlyphPositions (const String&, Array<int>& glyphs, Array<float>& xOffsets) override;
|
||||
bool getOutlineForGlyph (int glyphNumber, Path&) override;
|
||||
EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform&, float fontHeight) override;
|
||||
|
||||
|
|
|
|||
|
|
@ -139,14 +139,14 @@ public:
|
|||
private:
|
||||
struct CachedFace
|
||||
{
|
||||
CachedFace() noexcept : lastUsageCount (0) {}
|
||||
CachedFace() noexcept {}
|
||||
|
||||
// Although it seems a bit wacky to store the name here, it's because it may be a
|
||||
// placeholder rather than a real one, e.g. "<Sans-Serif>" vs the actual typeface name.
|
||||
// Since the typeface itself doesn't know that it may have this alias, the name under
|
||||
// which it was fetched needs to be stored separately.
|
||||
String typefaceName, typefaceStyle;
|
||||
size_t lastUsageCount;
|
||||
size_t lastUsageCount = 0;
|
||||
Typeface::Ptr typeface;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -392,7 +392,7 @@ public:
|
|||
An extra x offset is added at the end of the run, to indicate where the right hand
|
||||
edge of the last character is.
|
||||
*/
|
||||
void getGlyphPositions (const String& text, Array <int>& glyphs, Array <float>& xOffsets) const;
|
||||
void getGlyphPositions (const String& text, Array<int>& glyphs, Array<float>& xOffsets) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the typeface used by this font.
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ public:
|
|||
The distances returned are based on the font having an normalised height of 1.0.
|
||||
You should never need to call this directly! Use Font::getGlyphPositions() instead!
|
||||
*/
|
||||
virtual void getGlyphPositions (const String& text, Array <int>& glyphs, Array<float>& xOffsets) = 0;
|
||||
virtual void getGlyphPositions (const String& text, Array<int>& glyphs, Array<float>& xOffsets) = 0;
|
||||
|
||||
/** Returns the outline for a glyph.
|
||||
The path returned will be normalised to a font height of 1.0.
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ public:
|
|||
/** Sets a number of temporarily underlined sections.
|
||||
This is needed by MS Windows input method UI.
|
||||
*/
|
||||
virtual void setTemporaryUnderlining (const Array <Range<int> >& underlinedRegions) = 0;
|
||||
virtual void setTemporaryUnderlining (const Array<Range<int>>& underlinedRegions) = 0;
|
||||
|
||||
/** Returns a specified sub-section of the text. */
|
||||
virtual String getTextInRange (const Range<int>& range) const = 0;
|
||||
|
|
|
|||
|
|
@ -29,14 +29,11 @@ namespace juce
|
|||
|
||||
ComponentMovementWatcher::ComponentMovementWatcher (Component* const comp)
|
||||
: component (comp),
|
||||
lastPeerID (0),
|
||||
reentrant (false),
|
||||
wasShowing (comp->isShowing())
|
||||
{
|
||||
jassert (component != nullptr); // can't use this with a null pointer..
|
||||
|
||||
component->addComponentListener (this);
|
||||
|
||||
registerWithParentComps();
|
||||
}
|
||||
|
||||
|
|
@ -55,8 +52,8 @@ void ComponentMovementWatcher::componentParentHierarchyChanged (Component&)
|
|||
{
|
||||
const ScopedValueSetter<bool> setter (reentrant, true);
|
||||
|
||||
ComponentPeer* const peer = component->getPeer();
|
||||
const uint32 peerID = peer != nullptr ? peer->getUniqueID() : 0;
|
||||
auto* peer = component->getPeer();
|
||||
auto peerID = peer != nullptr ? peer->getUniqueID() : 0;
|
||||
|
||||
if (peerID != lastPeerID)
|
||||
{
|
||||
|
|
@ -85,7 +82,7 @@ void ComponentMovementWatcher::componentMovedOrResized (Component&, bool wasMove
|
|||
if (wasMoved)
|
||||
{
|
||||
Point<int> newPos;
|
||||
Component* const top = component->getTopLevelComponent();
|
||||
auto* top = component->getTopLevelComponent();
|
||||
|
||||
if (top != component)
|
||||
newPos = top->getLocalPoint (component, Point<int>());
|
||||
|
|
@ -128,7 +125,7 @@ void ComponentMovementWatcher::componentVisibilityChanged (Component&)
|
|||
|
||||
void ComponentMovementWatcher::registerWithParentComps()
|
||||
{
|
||||
for (Component* p = component->getParentComponent(); p != nullptr; p = p->getParentComponent())
|
||||
for (auto* p = component->getParentComponent(); p != nullptr; p = p->getParentComponent())
|
||||
{
|
||||
p->addComponentListener (this);
|
||||
registeredParentComps.add (p);
|
||||
|
|
@ -137,8 +134,8 @@ void ComponentMovementWatcher::registerWithParentComps()
|
|||
|
||||
void ComponentMovementWatcher::unregister()
|
||||
{
|
||||
for (int i = registeredParentComps.size(); --i >= 0;)
|
||||
registeredParentComps.getUnchecked(i)->removeComponentListener (this);
|
||||
for (auto* c : registeredParentComps)
|
||||
c->removeComponentListener (this);
|
||||
|
||||
registeredParentComps.clear();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,9 +81,9 @@ public:
|
|||
private:
|
||||
//==============================================================================
|
||||
WeakReference<Component> component;
|
||||
uint32 lastPeerID;
|
||||
Array <Component*> registeredParentComps;
|
||||
bool reentrant, wasShowing;
|
||||
uint32 lastPeerID = 0;
|
||||
Array<Component*> registeredParentComps;
|
||||
bool reentrant = false, wasShowing;
|
||||
Rectangle<int> lastBounds;
|
||||
|
||||
void unregister();
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ MultiDocumentPanelWindow::~MultiDocumentPanelWindow()
|
|||
//==============================================================================
|
||||
void MultiDocumentPanelWindow::maximiseButtonPressed()
|
||||
{
|
||||
if (MultiDocumentPanel* const owner = getOwner())
|
||||
if (auto* owner = getOwner())
|
||||
owner->setLayoutMode (MultiDocumentPanel::MaximisedWindowsWithTabs);
|
||||
else
|
||||
jassertfalse; // these windows are only designed to be used inside a MultiDocumentPanel!
|
||||
|
|
@ -48,7 +48,7 @@ void MultiDocumentPanelWindow::maximiseButtonPressed()
|
|||
|
||||
void MultiDocumentPanelWindow::closeButtonPressed()
|
||||
{
|
||||
if (MultiDocumentPanel* const owner = getOwner())
|
||||
if (auto* owner = getOwner())
|
||||
owner->closeDocument (getContentComponent(), true);
|
||||
else
|
||||
jassertfalse; // these windows are only designed to be used inside a MultiDocumentPanel!
|
||||
|
|
@ -68,7 +68,7 @@ void MultiDocumentPanelWindow::broughtToFront()
|
|||
|
||||
void MultiDocumentPanelWindow::updateOrder()
|
||||
{
|
||||
if (MultiDocumentPanel* const owner = getOwner())
|
||||
if (auto* owner = getOwner())
|
||||
owner->updateOrder();
|
||||
}
|
||||
|
||||
|
|
@ -77,19 +77,14 @@ MultiDocumentPanel* MultiDocumentPanelWindow::getOwner() const noexcept
|
|||
return findParentComponentOfClass<MultiDocumentPanel>();
|
||||
}
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class MultiDocumentPanel::TabbedComponentInternal : public TabbedComponent
|
||||
struct MultiDocumentPanel::TabbedComponentInternal : public TabbedComponent
|
||||
{
|
||||
public:
|
||||
TabbedComponentInternal()
|
||||
: TabbedComponent (TabbedButtonBar::TabsAtTop)
|
||||
{
|
||||
}
|
||||
TabbedComponentInternal() : TabbedComponent (TabbedButtonBar::TabsAtTop) {}
|
||||
|
||||
void currentTabChanged (int, const String&)
|
||||
void currentTabChanged (int, const String&) override
|
||||
{
|
||||
if (MultiDocumentPanel* const owner = findParentComponentOfClass<MultiDocumentPanel>())
|
||||
if (auto* owner = findParentComponentOfClass<MultiDocumentPanel>())
|
||||
owner->updateOrder();
|
||||
}
|
||||
};
|
||||
|
|
@ -97,10 +92,6 @@ public:
|
|||
|
||||
//==============================================================================
|
||||
MultiDocumentPanel::MultiDocumentPanel()
|
||||
: mode (MaximisedWindowsWithTabs),
|
||||
backgroundColour (Colours::lightblue),
|
||||
maximumNumDocuments (0),
|
||||
numDocsBeforeTabsUsed (0)
|
||||
{
|
||||
setOpaque (true);
|
||||
}
|
||||
|
|
@ -121,7 +112,7 @@ namespace MultiDocHelpers
|
|||
|
||||
bool MultiDocumentPanel::closeAllDocuments (const bool checkItsOkToCloseFirst)
|
||||
{
|
||||
while (components.size() > 0)
|
||||
while (! components.isEmpty())
|
||||
if (! closeDocument (components.getLast(), checkItsOkToCloseFirst))
|
||||
return false;
|
||||
|
||||
|
|
@ -135,13 +126,13 @@ MultiDocumentPanelWindow* MultiDocumentPanel::createNewDocumentWindow()
|
|||
|
||||
void MultiDocumentPanel::addWindow (Component* component)
|
||||
{
|
||||
MultiDocumentPanelWindow* const dw = createNewDocumentWindow();
|
||||
auto* dw = createNewDocumentWindow();
|
||||
|
||||
dw->setResizable (true, false);
|
||||
dw->setContentNonOwned (component, true);
|
||||
dw->setName (component->getName());
|
||||
|
||||
const var bkg (component->getProperties() ["mdiDocumentBkg_"]);
|
||||
auto bkg = component->getProperties() ["mdiDocumentBkg_"];
|
||||
dw->setBackgroundColour (bkg.isVoid() ? backgroundColour : Colour ((uint32) static_cast<int> (bkg)));
|
||||
|
||||
int x = 4;
|
||||
|
|
@ -152,7 +143,7 @@ void MultiDocumentPanel::addWindow (Component* component)
|
|||
|
||||
dw->setTopLeftPosition (x, x);
|
||||
|
||||
const var pos (component->getProperties() ["mdiDocumentPos_"]);
|
||||
auto pos = component->getProperties() ["mdiDocumentPos_"];
|
||||
if (pos.toString().isNotEmpty())
|
||||
dw->restoreWindowStateFromString (pos.toString());
|
||||
|
||||
|
|
@ -203,10 +194,10 @@ bool MultiDocumentPanel::addDocument (Component* const component,
|
|||
{
|
||||
addAndMakeVisible (tabComponent = new TabbedComponentInternal());
|
||||
|
||||
Array<Component*> temp (components);
|
||||
auto temp = components;
|
||||
|
||||
for (int i = 0; i < temp.size(); ++i)
|
||||
tabComponent->addTab (temp[i]->getName(), docColour, temp[i], false);
|
||||
for (auto& c : temp)
|
||||
tabComponent->addTab (c->getName(), docColour, c, false);
|
||||
|
||||
resized();
|
||||
}
|
||||
|
|
@ -302,7 +293,7 @@ bool MultiDocumentPanel::closeDocument (Component* component,
|
|||
resized();
|
||||
|
||||
// This ensures that the active tab is painted properly when a tab is closed!
|
||||
if (Component* activeComponent = getActiveDocument())
|
||||
if (auto* activeComponent = getActiveDocument())
|
||||
setActiveDocument (activeComponent);
|
||||
|
||||
activeDocumentChanged();
|
||||
|
|
@ -414,17 +405,13 @@ void MultiDocumentPanel::setLayoutMode (const LayoutMode newLayoutMode)
|
|||
|
||||
resized();
|
||||
|
||||
const Array<Component*> tempComps (components);
|
||||
auto tempComps = components;
|
||||
components.clear();
|
||||
|
||||
for (int i = 0; i < tempComps.size(); ++i)
|
||||
{
|
||||
Component* const c = tempComps.getUnchecked(i);
|
||||
|
||||
for (auto* c : tempComps)
|
||||
addDocument (c,
|
||||
Colour ((uint32) static_cast<int> (c->getProperties().getWithDefault ("mdiDocumentBkg_", (int) Colours::white.getARGB()))),
|
||||
MultiDocHelpers::shouldDeleteComp (c));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -285,15 +285,14 @@ public:
|
|||
|
||||
private:
|
||||
//==============================================================================
|
||||
LayoutMode mode;
|
||||
Array <Component*> components;
|
||||
LayoutMode mode = MaximisedWindowsWithTabs;
|
||||
Array<Component*> components;
|
||||
ScopedPointer<TabbedComponent> tabComponent;
|
||||
Colour backgroundColour;
|
||||
int maximumNumDocuments, numDocsBeforeTabsUsed;
|
||||
Colour backgroundColour { Colours::lightblue };
|
||||
int maximumNumDocuments = 0, numDocsBeforeTabsUsed = 0;
|
||||
|
||||
class TabbedComponentInternal;
|
||||
struct TabbedComponentInternal;
|
||||
friend class MultiDocumentPanelWindow;
|
||||
friend class TabbedComponentInternal;
|
||||
|
||||
Component* getContainerComp (Component*) const;
|
||||
void updateOrder();
|
||||
|
|
|
|||
|
|
@ -27,14 +27,8 @@
|
|||
namespace juce
|
||||
{
|
||||
|
||||
StretchableLayoutManager::StretchableLayoutManager()
|
||||
: totalSize (0)
|
||||
{
|
||||
}
|
||||
|
||||
StretchableLayoutManager::~StretchableLayoutManager()
|
||||
{
|
||||
}
|
||||
StretchableLayoutManager::StretchableLayoutManager() {}
|
||||
StretchableLayoutManager::~StretchableLayoutManager() {}
|
||||
|
||||
//==============================================================================
|
||||
void StretchableLayoutManager::clearAllItems()
|
||||
|
|
@ -48,7 +42,7 @@ void StretchableLayoutManager::setItemLayout (const int itemIndex,
|
|||
const double maximumSize,
|
||||
const double preferredSize)
|
||||
{
|
||||
ItemLayoutProperties* layout = getInfoFor (itemIndex);
|
||||
auto* layout = getInfoFor (itemIndex);
|
||||
|
||||
if (layout == nullptr)
|
||||
{
|
||||
|
|
@ -74,7 +68,7 @@ bool StretchableLayoutManager::getItemLayout (const int itemIndex,
|
|||
double& maximumSize,
|
||||
double& preferredSize) const
|
||||
{
|
||||
if (const ItemLayoutProperties* const layout = getInfoFor (itemIndex))
|
||||
if (auto* layout = getInfoFor (itemIndex))
|
||||
{
|
||||
minimumSize = layout->minSize;
|
||||
maximumSize = layout->maxSize;
|
||||
|
|
@ -98,7 +92,7 @@ int StretchableLayoutManager::getItemCurrentPosition (const int itemIndex) const
|
|||
int pos = 0;
|
||||
|
||||
for (int i = 0; i < itemIndex; ++i)
|
||||
if (const ItemLayoutProperties* const layout = getInfoFor (i))
|
||||
if (auto* layout = getInfoFor (i))
|
||||
pos += layout->currentSize;
|
||||
|
||||
return pos;
|
||||
|
|
@ -106,7 +100,7 @@ int StretchableLayoutManager::getItemCurrentPosition (const int itemIndex) const
|
|||
|
||||
int StretchableLayoutManager::getItemCurrentAbsoluteSize (const int itemIndex) const
|
||||
{
|
||||
if (const ItemLayoutProperties* const layout = getInfoFor (itemIndex))
|
||||
if (auto* layout = getInfoFor (itemIndex))
|
||||
return layout->currentSize;
|
||||
|
||||
return 0;
|
||||
|
|
@ -114,7 +108,7 @@ int StretchableLayoutManager::getItemCurrentAbsoluteSize (const int itemIndex) c
|
|||
|
||||
double StretchableLayoutManager::getItemCurrentRelativeSize (const int itemIndex) const
|
||||
{
|
||||
if (const ItemLayoutProperties* const layout = getInfoFor (itemIndex))
|
||||
if (auto* layout = getInfoFor (itemIndex))
|
||||
return -layout->currentSize / (double) totalSize;
|
||||
|
||||
return 0;
|
||||
|
|
@ -125,18 +119,18 @@ void StretchableLayoutManager::setItemPosition (const int itemIndex,
|
|||
{
|
||||
for (int i = items.size(); --i >= 0;)
|
||||
{
|
||||
const ItemLayoutProperties* const layout = items.getUnchecked(i);
|
||||
auto* layout = items.getUnchecked(i);
|
||||
|
||||
if (layout->itemIndex == itemIndex)
|
||||
{
|
||||
int realTotalSize = jmax (totalSize, getMinimumSizeOfItems (0, items.size()));
|
||||
const int minSizeAfterThisComp = getMinimumSizeOfItems (i, items.size());
|
||||
const int maxSizeAfterThisComp = getMaximumSizeOfItems (i + 1, items.size());
|
||||
auto realTotalSize = jmax (totalSize, getMinimumSizeOfItems (0, items.size()));
|
||||
auto minSizeAfterThisComp = getMinimumSizeOfItems (i, items.size());
|
||||
auto maxSizeAfterThisComp = getMaximumSizeOfItems (i + 1, items.size());
|
||||
|
||||
newPosition = jmax (newPosition, totalSize - maxSizeAfterThisComp - layout->currentSize);
|
||||
newPosition = jmin (newPosition, realTotalSize - minSizeAfterThisComp);
|
||||
|
||||
int endPos = fitComponentsIntoSpace (0, i, newPosition, 0);
|
||||
auto endPos = fitComponentsIntoSpace (0, i, newPosition, 0);
|
||||
|
||||
endPos += layout->currentSize;
|
||||
|
||||
|
|
@ -159,9 +153,9 @@ void StretchableLayoutManager::layOutComponents (Component** const components,
|
|||
|
||||
for (int i = 0; i < numComponents; ++i)
|
||||
{
|
||||
if (const ItemLayoutProperties* const layout = getInfoFor (i))
|
||||
if (auto* layout = getInfoFor (i))
|
||||
{
|
||||
if (Component* const c = components[i])
|
||||
if (auto* c = components[i])
|
||||
{
|
||||
if (i == numComponents - 1)
|
||||
{
|
||||
|
|
@ -209,9 +203,9 @@ void StretchableLayoutManager::layOutComponents (Component** const components,
|
|||
//==============================================================================
|
||||
StretchableLayoutManager::ItemLayoutProperties* StretchableLayoutManager::getInfoFor (const int itemIndex) const
|
||||
{
|
||||
for (int i = items.size(); --i >= 0;)
|
||||
if (items.getUnchecked(i)->itemIndex == itemIndex)
|
||||
return items.getUnchecked(i);
|
||||
for (auto* i : items)
|
||||
if (i->itemIndex == itemIndex)
|
||||
return i;
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
|
@ -227,7 +221,7 @@ int StretchableLayoutManager::fitComponentsIntoSpace (const int startIndex,
|
|||
|
||||
for (int i = startIndex; i < endIndex; ++i)
|
||||
{
|
||||
ItemLayoutProperties* const layout = items.getUnchecked (i);
|
||||
auto* layout = items.getUnchecked (i);
|
||||
|
||||
layout->currentSize = sizeToRealSize (layout->minSize, totalSize);
|
||||
|
||||
|
|
@ -249,14 +243,14 @@ int StretchableLayoutManager::fitComponentsIntoSpace (const int startIndex,
|
|||
// first figure out how many comps want a slice of the extra space..
|
||||
for (int i = startIndex; i < endIndex; ++i)
|
||||
{
|
||||
ItemLayoutProperties* const layout = items.getUnchecked (i);
|
||||
auto* layout = items.getUnchecked (i);
|
||||
|
||||
double sizeWanted = sizeToRealSize (layout->preferredSize, totalSize);
|
||||
auto sizeWanted = sizeToRealSize (layout->preferredSize, totalSize);
|
||||
|
||||
const int bestSize = jlimit (layout->currentSize,
|
||||
jmax (layout->currentSize,
|
||||
sizeToRealSize (layout->maxSize, totalSize)),
|
||||
roundToInt (sizeWanted * availableSpace / totalIdealSize));
|
||||
auto bestSize = jlimit (layout->currentSize,
|
||||
jmax (layout->currentSize,
|
||||
sizeToRealSize (layout->maxSize, totalSize)),
|
||||
roundToInt (sizeWanted * availableSpace / totalIdealSize));
|
||||
|
||||
if (bestSize > layout->currentSize)
|
||||
++numWantingMoreSpace;
|
||||
|
|
@ -265,20 +259,20 @@ int StretchableLayoutManager::fitComponentsIntoSpace (const int startIndex,
|
|||
// ..share out the extra space..
|
||||
for (int i = startIndex; i < endIndex; ++i)
|
||||
{
|
||||
ItemLayoutProperties* const layout = items.getUnchecked (i);
|
||||
auto* layout = items.getUnchecked (i);
|
||||
|
||||
double sizeWanted = sizeToRealSize (layout->preferredSize, totalSize);
|
||||
auto sizeWanted = sizeToRealSize (layout->preferredSize, totalSize);
|
||||
|
||||
int bestSize = jlimit (layout->currentSize,
|
||||
jmax (layout->currentSize, sizeToRealSize (layout->maxSize, totalSize)),
|
||||
roundToInt (sizeWanted * availableSpace / totalIdealSize));
|
||||
auto bestSize = jlimit (layout->currentSize,
|
||||
jmax (layout->currentSize, sizeToRealSize (layout->maxSize, totalSize)),
|
||||
roundToInt (sizeWanted * availableSpace / totalIdealSize));
|
||||
|
||||
const int extraWanted = bestSize - layout->currentSize;
|
||||
auto extraWanted = bestSize - layout->currentSize;
|
||||
|
||||
if (extraWanted > 0)
|
||||
{
|
||||
const int extraAllowed = jmin (extraWanted,
|
||||
extraSpace / jmax (1, numWantingMoreSpace));
|
||||
auto extraAllowed = jmin (extraWanted,
|
||||
extraSpace / jmax (1, numWantingMoreSpace));
|
||||
|
||||
if (extraAllowed > 0)
|
||||
{
|
||||
|
|
@ -298,7 +292,7 @@ int StretchableLayoutManager::fitComponentsIntoSpace (const int startIndex,
|
|||
// ..and calculate the end position
|
||||
for (int i = startIndex; i < endIndex; ++i)
|
||||
{
|
||||
ItemLayoutProperties* const layout = items.getUnchecked(i);
|
||||
auto* layout = items.getUnchecked(i);
|
||||
startPos += layout->currentSize;
|
||||
}
|
||||
|
||||
|
|
@ -330,7 +324,7 @@ void StretchableLayoutManager::updatePrefSizesToMatchCurrentPositions()
|
|||
{
|
||||
for (int i = 0; i < items.size(); ++i)
|
||||
{
|
||||
ItemLayoutProperties* const layout = items.getUnchecked (i);
|
||||
auto* layout = items.getUnchecked (i);
|
||||
|
||||
layout->preferredSize
|
||||
= (layout->preferredSize < 0) ? getItemCurrentRelativeSize (i)
|
||||
|
|
|
|||
|
|
@ -242,8 +242,8 @@ private:
|
|||
double minSize, maxSize, preferredSize;
|
||||
};
|
||||
|
||||
OwnedArray <ItemLayoutProperties> items;
|
||||
int totalSize;
|
||||
OwnedArray<ItemLayoutProperties> items;
|
||||
int totalSize = 0;
|
||||
|
||||
//==============================================================================
|
||||
static int sizeToRealSize (double size, int totalSpace);
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@
|
|||
namespace juce
|
||||
{
|
||||
|
||||
TabBarButton::TabBarButton (const String& name, TabbedButtonBar& owner_)
|
||||
: Button (name), owner (owner_), overlapPixels (0), extraCompPlacement (afterText)
|
||||
TabBarButton::TabBarButton (const String& name, TabbedButtonBar& bar)
|
||||
: Button (name), owner (bar)
|
||||
{
|
||||
setWantsKeyboardFocus (false);
|
||||
}
|
||||
|
|
@ -54,7 +54,7 @@ void TabBarButton::clicked (const ModifierKeys& mods)
|
|||
|
||||
bool TabBarButton::hitTest (int mx, int my)
|
||||
{
|
||||
const Rectangle<int> area (getActiveArea());
|
||||
auto area = getActiveArea();
|
||||
|
||||
if (owner.isVertical())
|
||||
{
|
||||
|
|
@ -83,11 +83,11 @@ int TabBarButton::getBestTabLength (const int depth)
|
|||
|
||||
void TabBarButton::calcAreas (Rectangle<int>& extraComp, Rectangle<int>& textArea) const
|
||||
{
|
||||
LookAndFeel& lf = getLookAndFeel();
|
||||
auto& lf = getLookAndFeel();
|
||||
textArea = getActiveArea();
|
||||
|
||||
const int depth = owner.isVertical() ? textArea.getWidth() : textArea.getHeight();
|
||||
const int overlap = lf.getTabButtonOverlap (depth);
|
||||
auto depth = owner.isVertical() ? textArea.getWidth() : textArea.getHeight();
|
||||
auto overlap = lf.getTabButtonOverlap (depth);
|
||||
|
||||
if (overlap > 0)
|
||||
{
|
||||
|
|
@ -101,7 +101,7 @@ void TabBarButton::calcAreas (Rectangle<int>& extraComp, Rectangle<int>& textAre
|
|||
{
|
||||
extraComp = lf.getTabButtonExtraComponentBounds (*this, textArea, *extraComponent);
|
||||
|
||||
const TabbedButtonBar::Orientation orientation = owner.getOrientation();
|
||||
auto orientation = owner.getOrientation();
|
||||
|
||||
if (orientation == TabbedButtonBar::TabsAtLeft || orientation == TabbedButtonBar::TabsAtRight)
|
||||
{
|
||||
|
|
@ -129,9 +129,9 @@ Rectangle<int> TabBarButton::getTextArea() const
|
|||
|
||||
Rectangle<int> TabBarButton::getActiveArea() const
|
||||
{
|
||||
Rectangle<int> r (getLocalBounds());
|
||||
const int spaceAroundImage = getLookAndFeel().getTabButtonSpaceAroundImage();
|
||||
const TabbedButtonBar::Orientation orientation = owner.getOrientation();
|
||||
auto r = getLocalBounds();
|
||||
auto spaceAroundImage = getLookAndFeel().getTabButtonSpaceAroundImage();
|
||||
auto orientation = owner.getOrientation();
|
||||
|
||||
if (orientation != TabbedButtonBar::TabsAtLeft) r.removeFromRight (spaceAroundImage);
|
||||
if (orientation != TabbedButtonBar::TabsAtRight) r.removeFromLeft (spaceAroundImage);
|
||||
|
|
@ -203,10 +203,8 @@ private:
|
|||
|
||||
|
||||
//==============================================================================
|
||||
TabbedButtonBar::TabbedButtonBar (const Orientation orientation_)
|
||||
: orientation (orientation_),
|
||||
minimumScale (0.7),
|
||||
currentTabIndex (-1)
|
||||
TabbedButtonBar::TabbedButtonBar (Orientation orientationToUse)
|
||||
: orientation (orientationToUse)
|
||||
{
|
||||
setInterceptsMouseClicks (false, true);
|
||||
addAndMakeVisible (behindFrontTab = new BehindFrontTabComp (*this));
|
||||
|
|
@ -260,9 +258,9 @@ void TabbedButtonBar::addTab (const String& tabName,
|
|||
if (! isPositiveAndBelow (insertIndex, tabs.size()))
|
||||
insertIndex = tabs.size();
|
||||
|
||||
TabInfo* const currentTab = tabs [currentTabIndex];
|
||||
auto* currentTab = tabs[currentTabIndex];
|
||||
|
||||
TabInfo* newTab = new TabInfo();
|
||||
auto* newTab = new TabInfo();
|
||||
newTab->name = tabName;
|
||||
newTab->colour = tabBackgroundColour;
|
||||
newTab->button = createTabButton (tabName, insertIndex);
|
||||
|
|
@ -279,9 +277,9 @@ void TabbedButtonBar::addTab (const String& tabName,
|
|||
}
|
||||
}
|
||||
|
||||
void TabbedButtonBar::setTabName (const int tabIndex, const String& newName)
|
||||
void TabbedButtonBar::setTabName (int tabIndex, const String& newName)
|
||||
{
|
||||
if (TabInfo* const tab = tabs [tabIndex])
|
||||
if (auto* tab = tabs[tabIndex])
|
||||
{
|
||||
if (tab->name != newName)
|
||||
{
|
||||
|
|
@ -296,7 +294,7 @@ void TabbedButtonBar::removeTab (const int indexToRemove, const bool animate)
|
|||
{
|
||||
if (isPositiveAndBelow (indexToRemove, tabs.size()))
|
||||
{
|
||||
int oldSelectedIndex = currentTabIndex;
|
||||
auto oldSelectedIndex = currentTabIndex;
|
||||
|
||||
if (indexToRemove == currentTabIndex)
|
||||
oldSelectedIndex = -1;
|
||||
|
|
@ -312,7 +310,7 @@ void TabbedButtonBar::removeTab (const int indexToRemove, const bool animate)
|
|||
|
||||
void TabbedButtonBar::moveTab (const int currentIndex, const int newIndex, const bool animate)
|
||||
{
|
||||
TabInfo* const currentTab = tabs [currentTabIndex];
|
||||
auto* currentTab = tabs[currentTabIndex];
|
||||
tabs.move (currentIndex, newIndex);
|
||||
currentTabIndex = tabs.indexOf (currentTab);
|
||||
updateTabPositions (animate);
|
||||
|
|
@ -325,21 +323,23 @@ int TabbedButtonBar::getNumTabs() const
|
|||
|
||||
String TabbedButtonBar::getCurrentTabName() const
|
||||
{
|
||||
TabInfo* tab = tabs [currentTabIndex];
|
||||
return tab == nullptr ? String() : tab->name;
|
||||
if (auto* tab = tabs [currentTabIndex])
|
||||
return tab->name;
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
StringArray TabbedButtonBar::getTabNames() const
|
||||
{
|
||||
StringArray names;
|
||||
|
||||
for (int i = 0; i < tabs.size(); ++i)
|
||||
names.add (tabs.getUnchecked(i)->name);
|
||||
for (auto* t : tabs)
|
||||
names.add (t->name);
|
||||
|
||||
return names;
|
||||
}
|
||||
|
||||
void TabbedButtonBar::setCurrentTabIndex (int newIndex, const bool sendChangeMessage_)
|
||||
void TabbedButtonBar::setCurrentTabIndex (int newIndex, bool shouldSendChangeMessage)
|
||||
{
|
||||
if (currentTabIndex != newIndex)
|
||||
{
|
||||
|
|
@ -349,14 +349,11 @@ void TabbedButtonBar::setCurrentTabIndex (int newIndex, const bool sendChangeMes
|
|||
currentTabIndex = newIndex;
|
||||
|
||||
for (int i = 0; i < tabs.size(); ++i)
|
||||
{
|
||||
TabBarButton* tb = tabs.getUnchecked(i)->button;
|
||||
tb->setToggleState (i == newIndex, dontSendNotification);
|
||||
}
|
||||
tabs.getUnchecked(i)->button->setToggleState (i == newIndex, dontSendNotification);
|
||||
|
||||
resized();
|
||||
|
||||
if (sendChangeMessage_)
|
||||
if (shouldSendChangeMessage)
|
||||
sendChangeMessage();
|
||||
|
||||
currentTabChanged (newIndex, getCurrentTabName());
|
||||
|
|
@ -365,7 +362,7 @@ void TabbedButtonBar::setCurrentTabIndex (int newIndex, const bool sendChangeMes
|
|||
|
||||
TabBarButton* TabbedButtonBar::getTabButton (const int index) const
|
||||
{
|
||||
if (TabInfo* tab = tabs[index])
|
||||
if (auto* tab = tabs[index])
|
||||
return static_cast<TabBarButton*> (tab->button);
|
||||
|
||||
return nullptr;
|
||||
|
|
@ -383,11 +380,12 @@ int TabbedButtonBar::indexOfTabButton (const TabBarButton* button) const
|
|||
Rectangle<int> TabbedButtonBar::getTargetBounds (TabBarButton* button) const
|
||||
{
|
||||
if (button == nullptr || indexOfTabButton (button) == -1)
|
||||
return Rectangle<int>();
|
||||
return {};
|
||||
|
||||
ComponentAnimator& animator = Desktop::getInstance().getAnimator();
|
||||
auto& animator = Desktop::getInstance().getAnimator();
|
||||
|
||||
return animator.isAnimating (button) ? animator.getComponentDestination (button) : button->getBounds();
|
||||
return animator.isAnimating (button) ? animator.getComponentDestination (button)
|
||||
: button->getBounds();
|
||||
}
|
||||
|
||||
void TabbedButtonBar::lookAndFeelChanged()
|
||||
|
|
@ -409,22 +407,22 @@ void TabbedButtonBar::resized()
|
|||
//==============================================================================
|
||||
void TabbedButtonBar::updateTabPositions (bool animate)
|
||||
{
|
||||
LookAndFeel& lf = getLookAndFeel();
|
||||
auto& lf = getLookAndFeel();
|
||||
|
||||
int depth = getWidth();
|
||||
int length = getHeight();
|
||||
auto depth = getWidth();
|
||||
auto length = getHeight();
|
||||
|
||||
if (! isVertical())
|
||||
std::swap (depth, length);
|
||||
|
||||
const int overlap = lf.getTabButtonOverlap (depth) + lf.getTabButtonSpaceAroundImage() * 2;
|
||||
auto overlap = lf.getTabButtonOverlap (depth) + lf.getTabButtonSpaceAroundImage() * 2;
|
||||
|
||||
int totalLength = jmax (0, overlap);
|
||||
int numVisibleButtons = tabs.size();
|
||||
auto totalLength = jmax (0, overlap);
|
||||
auto numVisibleButtons = tabs.size();
|
||||
|
||||
for (int i = 0; i < tabs.size(); ++i)
|
||||
{
|
||||
TabBarButton* const tb = tabs.getUnchecked(i)->button;
|
||||
auto* tb = tabs.getUnchecked(i)->button.get();
|
||||
|
||||
totalLength += tb->getBestTabLength (depth) - overlap;
|
||||
tb->overlapPixels = jmax (0, overlap / 2);
|
||||
|
|
@ -448,7 +446,7 @@ void TabbedButtonBar::updateTabPositions (bool animate)
|
|||
extraTabsButton->setTriggeredOnMouseDown (true);
|
||||
}
|
||||
|
||||
const int buttonSize = jmin (proportionOfWidth (0.7f), proportionOfHeight (0.7f));
|
||||
auto buttonSize = jmin (proportionOfWidth (0.7f), proportionOfHeight (0.7f));
|
||||
extraTabsButton->setSize (buttonSize, buttonSize);
|
||||
|
||||
if (isVertical())
|
||||
|
|
@ -466,8 +464,8 @@ void TabbedButtonBar::updateTabPositions (bool animate)
|
|||
|
||||
for (int i = 0; i < tabs.size(); ++i)
|
||||
{
|
||||
TabBarButton* const tb = tabs.getUnchecked(i)->button;
|
||||
const int newLength = totalLength + tb->getBestTabLength (depth);
|
||||
auto* tb = tabs.getUnchecked(i)->button.get();
|
||||
auto newLength = totalLength + tb->getBestTabLength (depth);
|
||||
|
||||
if (i > 0 && newLength * minimumScale > tabsButtonPos)
|
||||
{
|
||||
|
|
@ -489,18 +487,18 @@ void TabbedButtonBar::updateTabPositions (bool animate)
|
|||
int pos = 0;
|
||||
|
||||
TabBarButton* frontTab = nullptr;
|
||||
ComponentAnimator& animator = Desktop::getInstance().getAnimator();
|
||||
auto& animator = Desktop::getInstance().getAnimator();
|
||||
|
||||
for (int i = 0; i < tabs.size(); ++i)
|
||||
{
|
||||
if (TabBarButton* const tb = getTabButton (i))
|
||||
if (auto* tb = getTabButton (i))
|
||||
{
|
||||
const int bestLength = roundToInt (scale * tb->getBestTabLength (depth));
|
||||
auto bestLength = roundToInt (scale * tb->getBestTabLength (depth));
|
||||
|
||||
if (i < numVisibleButtons)
|
||||
{
|
||||
const Rectangle<int> newBounds (isVertical() ? Rectangle<int> (0, pos, getWidth(), bestLength)
|
||||
: Rectangle<int> (pos, 0, bestLength, getHeight()));
|
||||
auto newBounds = isVertical() ? Rectangle<int> (0, pos, getWidth(), bestLength)
|
||||
: Rectangle<int> (pos, 0, bestLength, getHeight());
|
||||
|
||||
if (animate)
|
||||
{
|
||||
|
|
@ -538,17 +536,17 @@ void TabbedButtonBar::updateTabPositions (bool animate)
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
Colour TabbedButtonBar::getTabBackgroundColour (const int tabIndex)
|
||||
Colour TabbedButtonBar::getTabBackgroundColour (int tabIndex)
|
||||
{
|
||||
if (TabInfo* tab = tabs [tabIndex])
|
||||
if (auto* tab = tabs[tabIndex])
|
||||
return tab->colour;
|
||||
|
||||
return Colours::transparentBlack;
|
||||
}
|
||||
|
||||
void TabbedButtonBar::setTabBackgroundColour (const int tabIndex, Colour newColour)
|
||||
void TabbedButtonBar::setTabBackgroundColour (int tabIndex, Colour newColour)
|
||||
{
|
||||
if (TabInfo* const tab = tabs [tabIndex])
|
||||
if (auto* tab = tabs [tabIndex])
|
||||
{
|
||||
if (tab->colour != newColour)
|
||||
{
|
||||
|
|
@ -570,7 +568,7 @@ void TabbedButtonBar::showExtraItemsMenu()
|
|||
|
||||
for (int i = 0; i < tabs.size(); ++i)
|
||||
{
|
||||
const TabInfo* const tab = tabs.getUnchecked(i);
|
||||
auto* tab = tabs.getUnchecked(i);
|
||||
|
||||
if (! tab->button->isVisible())
|
||||
m.addItem (i + 1, tab->name, true, i == currentTabIndex);
|
||||
|
|
@ -581,12 +579,7 @@ void TabbedButtonBar::showExtraItemsMenu()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void TabbedButtonBar::currentTabChanged (const int, const String&)
|
||||
{
|
||||
}
|
||||
|
||||
void TabbedButtonBar::popupMenuClickOnTab (const int, const String&)
|
||||
{
|
||||
}
|
||||
void TabbedButtonBar::currentTabChanged (int, const String&) {}
|
||||
void TabbedButtonBar::popupMenuClickOnTab (int, const String&) {}
|
||||
|
||||
} // namespace juce
|
||||
|
|
|
|||
|
|
@ -120,10 +120,10 @@ public:
|
|||
protected:
|
||||
friend class TabbedButtonBar;
|
||||
TabbedButtonBar& owner;
|
||||
int overlapPixels;
|
||||
int overlapPixels = 0;
|
||||
|
||||
ScopedPointer<Component> extraComponent;
|
||||
ExtraComponentPlacement extraCompPlacement;
|
||||
ExtraComponentPlacement extraCompPlacement = afterText;
|
||||
|
||||
private:
|
||||
void calcAreas (Rectangle<int>&, Rectangle<int>&) const;
|
||||
|
|
@ -341,8 +341,6 @@ protected:
|
|||
virtual TabBarButton* createTabButton (const String& tabName, int tabIndex);
|
||||
|
||||
private:
|
||||
Orientation orientation;
|
||||
|
||||
struct TabInfo
|
||||
{
|
||||
ScopedPointer<TabBarButton> button;
|
||||
|
|
@ -350,10 +348,11 @@ private:
|
|||
Colour colour;
|
||||
};
|
||||
|
||||
OwnedArray <TabInfo> tabs;
|
||||
OwnedArray<TabInfo> tabs;
|
||||
|
||||
double minimumScale;
|
||||
int currentTabIndex;
|
||||
Orientation orientation;
|
||||
double minimumScale = 0.7;
|
||||
int currentTabIndex = -1;
|
||||
|
||||
class BehindFrontTabComp;
|
||||
friend class BehindFrontTabComp;
|
||||
|
|
|
|||
|
|
@ -54,12 +54,10 @@ namespace TabbedComponentHelpers
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
class TabbedComponent::ButtonBar : public TabbedButtonBar
|
||||
struct TabbedComponent::ButtonBar : public TabbedButtonBar
|
||||
{
|
||||
public:
|
||||
ButtonBar (TabbedComponent& owner_, const TabbedButtonBar::Orientation orientation_)
|
||||
: TabbedButtonBar (orientation_),
|
||||
owner (owner_)
|
||||
ButtonBar (TabbedComponent& tabComp, TabbedButtonBar::Orientation o)
|
||||
: TabbedButtonBar (o), owner (tabComp)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -83,7 +81,6 @@ public:
|
|||
return owner.createTabButton (tabName, tabIndex);
|
||||
}
|
||||
|
||||
private:
|
||||
TabbedComponent& owner;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ButtonBar)
|
||||
|
|
@ -92,9 +89,6 @@ private:
|
|||
|
||||
//==============================================================================
|
||||
TabbedComponent::TabbedComponent (const TabbedButtonBar::Orientation orientation)
|
||||
: tabDepth (30),
|
||||
outlineThickness (1),
|
||||
edgeIndent (0)
|
||||
{
|
||||
addAndMakeVisible (tabs = new ButtonBar (*this, orientation));
|
||||
}
|
||||
|
|
@ -246,7 +240,7 @@ void TabbedComponent::paint (Graphics& g)
|
|||
{
|
||||
g.fillAll (findColour (backgroundColourId));
|
||||
|
||||
Rectangle<int> content (getLocalBounds());
|
||||
auto content = getLocalBounds();
|
||||
BorderSize<int> outline (outlineThickness);
|
||||
TabbedComponentHelpers::getTabArea (content, outline, getOrientation(), tabDepth);
|
||||
|
||||
|
|
@ -265,7 +259,7 @@ void TabbedComponent::paint (Graphics& g)
|
|||
|
||||
void TabbedComponent::resized()
|
||||
{
|
||||
Rectangle<int> content (getLocalBounds());
|
||||
auto content = getLocalBounds();
|
||||
BorderSize<int> outline (outlineThickness);
|
||||
|
||||
tabs->setBounds (TabbedComponentHelpers::getTabArea (content, outline, getOrientation(), tabDepth));
|
||||
|
|
@ -285,7 +279,7 @@ void TabbedComponent::lookAndFeelChanged()
|
|||
|
||||
void TabbedComponent::changeCallback (const int newCurrentTabIndex, const String& newTabName)
|
||||
{
|
||||
Component* const newPanelComp = getTabContentComponent (getCurrentTabIndex());
|
||||
auto* newPanelComp = getTabContentComponent (getCurrentTabIndex());
|
||||
|
||||
if (newPanelComp != panelComponent)
|
||||
{
|
||||
|
|
@ -311,11 +305,10 @@ void TabbedComponent::changeCallback (const int newCurrentTabIndex, const String
|
|||
}
|
||||
|
||||
resized();
|
||||
|
||||
currentTabChanged (newCurrentTabIndex, newTabName);
|
||||
}
|
||||
|
||||
void TabbedComponent::currentTabChanged (const int, const String&) {}
|
||||
void TabbedComponent::popupMenuClickOnTab (const int, const String&) {}
|
||||
void TabbedComponent::currentTabChanged (int, const String&) {}
|
||||
void TabbedComponent::popupMenuClickOnTab (int, const String&) {}
|
||||
|
||||
} // namespace juce
|
||||
|
|
|
|||
|
|
@ -211,12 +211,11 @@ protected:
|
|||
|
||||
private:
|
||||
//==============================================================================
|
||||
Array <WeakReference<Component> > contentComponents;
|
||||
Array<WeakReference<Component>> contentComponents;
|
||||
WeakReference<Component> panelComponent;
|
||||
int tabDepth, outlineThickness, edgeIndent;
|
||||
int tabDepth = 30, outlineThickness = 1, edgeIndent = 0;
|
||||
|
||||
class ButtonBar;
|
||||
friend class ButtonBar;
|
||||
struct ButtonBar;
|
||||
void changeCallback (int newCurrentTabIndex, const String& newTabName);
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TabbedComponent)
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ public:
|
|||
component. (i.e. they are the same as the size and position of the lasso
|
||||
component itself).
|
||||
*/
|
||||
virtual void findLassoItemsInArea (Array <SelectableItemType>& itemsFound,
|
||||
virtual void findLassoItemsInArea (Array<SelectableItemType>& itemsFound,
|
||||
const Rectangle<int>& area) = 0;
|
||||
|
||||
/** Returns the SelectedItemSet that the lasso should update.
|
||||
|
|
@ -99,9 +99,7 @@ class LassoComponent : public Component
|
|||
public:
|
||||
//==============================================================================
|
||||
/** Creates a Lasso component. */
|
||||
LassoComponent() : source (nullptr)
|
||||
{
|
||||
}
|
||||
LassoComponent() {}
|
||||
|
||||
//==============================================================================
|
||||
/** Call this in your mouseDown event, to initialise a drag.
|
||||
|
|
@ -158,7 +156,7 @@ public:
|
|||
}
|
||||
else if (e.mods.isCommandDown() || e.mods.isAltDown())
|
||||
{
|
||||
Array<SelectableItemType> originalMinusNew (originalSelection);
|
||||
auto originalMinusNew = originalSelection;
|
||||
originalMinusNew.removeValuesIn (itemsInLasso);
|
||||
|
||||
itemsInLasso.removeValuesIn (originalSelection);
|
||||
|
|
@ -214,7 +212,7 @@ public:
|
|||
private:
|
||||
//==============================================================================
|
||||
Array<SelectableItemType> originalSelection;
|
||||
LassoSource<SelectableItemType>* source;
|
||||
LassoSource<SelectableItemType>* source = nullptr;
|
||||
Point<int> dragStartPos;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LassoComponent)
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ private:
|
|||
|
||||
void handleAsyncUpdate() override
|
||||
{
|
||||
const int result = getResult();
|
||||
auto result = getResult();
|
||||
|
||||
if (callback != nullptr)
|
||||
callback->modalStateFinished (result);
|
||||
|
|
@ -171,7 +171,7 @@ NSView* getNSViewForDragEvent (Component* sourceComp)
|
|||
sourceComp = draggingSource->getComponentUnderMouse();
|
||||
|
||||
if (sourceComp != nullptr)
|
||||
return (NSView*) sourceComp->getWindowHandle();
|
||||
return (NSView*) sourceComp->getWindowHandle();
|
||||
|
||||
jassertfalse; // This method must be called in response to a component's mouseDown or mouseDrag event!
|
||||
return nil;
|
||||
|
|
@ -247,18 +247,14 @@ bool DragAndDropContainer::performExternalDragDropOfText (const String& text, Co
|
|||
return false;
|
||||
}
|
||||
|
||||
class NSDraggingSourceHelper : public ObjCClass <NSObject <NSDraggingSource>>
|
||||
struct NSDraggingSourceHelper : public ObjCClass<NSObject<NSDraggingSource>>
|
||||
{
|
||||
public:
|
||||
NSDraggingSourceHelper()
|
||||
: ObjCClass <NSObject <NSDraggingSource>> ("JUCENSDraggingSourceHelper_")
|
||||
NSDraggingSourceHelper() : ObjCClass<NSObject<NSDraggingSource>> ("JUCENSDraggingSourceHelper_")
|
||||
{
|
||||
addMethod (@selector (draggingSession:sourceOperationMaskForDraggingContext:), sourceOperationMaskForDraggingContext, "c@:@@");
|
||||
|
||||
registerClass();
|
||||
}
|
||||
|
||||
private:
|
||||
static NSDragOperation sourceOperationMaskForDraggingContext (id, SEL, NSDraggingSession*, NSDraggingContext)
|
||||
{
|
||||
return NSDragOperationCopy;
|
||||
|
|
@ -280,6 +276,7 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi
|
|||
if (auto* event = [[view window] currentEvent])
|
||||
{
|
||||
auto* dragItems = [[[NSMutableArray alloc] init] autorelease];
|
||||
|
||||
for (auto& filename : files)
|
||||
{
|
||||
auto* nsFilename = juceStringToNS (filename);
|
||||
|
|
@ -299,12 +296,9 @@ bool DragAndDropContainer::performExternalDragDropOfFiles (const StringArray& fi
|
|||
|
||||
auto* helper = [draggingSourceHelper.createInstance() autorelease];
|
||||
|
||||
if (! [view beginDraggingSessionWithItems: dragItems
|
||||
event: event
|
||||
source: helper])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return [view beginDraggingSessionWithItems: dragItems
|
||||
event: event
|
||||
source: helper];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -430,9 +424,8 @@ bool Desktop::isScreenSaverEnabled()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
class DisplaySettingsChangeCallback : private DeletedAtShutdown
|
||||
struct DisplaySettingsChangeCallback : private DeletedAtShutdown
|
||||
{
|
||||
public:
|
||||
DisplaySettingsChangeCallback()
|
||||
{
|
||||
CGDisplayRegisterReconfigurationCallback (displayReconfigurationCallBack, 0);
|
||||
|
|
@ -451,7 +444,6 @@ public:
|
|||
|
||||
juce_DeclareSingleton_SingleThreaded_Minimal (DisplaySettingsChangeCallback)
|
||||
|
||||
private:
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DisplaySettingsChangeCallback)
|
||||
};
|
||||
|
||||
|
|
@ -577,7 +569,7 @@ Image createSnapshotOfNativeWindow (void* nativeWindowHandle)
|
|||
return createNSWindowSnapshot ([(NSView*) windowOrView window]);
|
||||
}
|
||||
|
||||
return Image();
|
||||
return {};
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -600,12 +592,9 @@ String SystemClipboard::getTextFromClipboard()
|
|||
void Process::setDockIconVisible (bool isVisible)
|
||||
{
|
||||
ProcessSerialNumber psn { 0, kCurrentProcess };
|
||||
ProcessApplicationTransformState state = isVisible
|
||||
? kProcessTransformToForegroundApplication
|
||||
: kProcessTransformToUIElementApplication;
|
||||
|
||||
OSStatus err = TransformProcessType (&psn, state);
|
||||
|
||||
OSStatus err = TransformProcessType (&psn, isVisible ? kProcessTransformToForegroundApplication
|
||||
: kProcessTransformToUIElementApplication);
|
||||
jassert (err == 0);
|
||||
ignoreUnused (err);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ public:
|
|||
void addElement (ElementBase* newElement);
|
||||
|
||||
//==============================================================================
|
||||
OwnedArray <ElementBase> elements;
|
||||
OwnedArray<ElementBase> elements;
|
||||
bool usesNonZeroWinding;
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -30,14 +30,14 @@ namespace juce
|
|||
ToolbarItemPalette::ToolbarItemPalette (ToolbarItemFactory& tbf, Toolbar& bar)
|
||||
: factory (tbf), toolbar (bar)
|
||||
{
|
||||
Component* const itemHolder = new Component();
|
||||
auto* itemHolder = new Component();
|
||||
viewport.setViewedComponent (itemHolder);
|
||||
|
||||
Array<int> allIds;
|
||||
factory.getAllToolbarItemIds (allIds);
|
||||
|
||||
for (int i = 0; i < allIds.size(); ++i)
|
||||
addComponent (allIds.getUnchecked (i), -1);
|
||||
for (auto& i : allIds)
|
||||
addComponent (i, -1);
|
||||
|
||||
addAndMakeVisible (viewport);
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@ ToolbarItemPalette::~ToolbarItemPalette()
|
|||
//==============================================================================
|
||||
void ToolbarItemPalette::addComponent (const int itemId, const int index)
|
||||
{
|
||||
if (ToolbarItemComponent* const tc = Toolbar::createItem (factory, itemId))
|
||||
if (auto* tc = Toolbar::createItem (factory, itemId))
|
||||
{
|
||||
items.insert (index, tc);
|
||||
viewport.getViewedComponent()->addAndMakeVisible (tc, index);
|
||||
|
|
@ -63,7 +63,7 @@ void ToolbarItemPalette::addComponent (const int itemId, const int index)
|
|||
|
||||
void ToolbarItemPalette::replaceComponent (ToolbarItemComponent& comp)
|
||||
{
|
||||
const int index = items.indexOf (&comp);
|
||||
auto index = items.indexOf (&comp);
|
||||
jassert (index >= 0);
|
||||
items.removeObject (&comp, false);
|
||||
|
||||
|
|
@ -75,19 +75,17 @@ void ToolbarItemPalette::resized()
|
|||
{
|
||||
viewport.setBoundsInset (BorderSize<int> (1));
|
||||
|
||||
Component* const itemHolder = viewport.getViewedComponent();
|
||||
auto* itemHolder = viewport.getViewedComponent();
|
||||
|
||||
const int indent = 8;
|
||||
const int preferredWidth = viewport.getWidth() - viewport.getScrollBarThickness() - indent;
|
||||
const int height = toolbar.getThickness();
|
||||
int x = indent;
|
||||
int y = indent;
|
||||
auto x = indent;
|
||||
auto y = indent;
|
||||
int maxX = 0;
|
||||
|
||||
for (int i = 0; i < items.size(); ++i)
|
||||
for (auto* tc : items)
|
||||
{
|
||||
ToolbarItemComponent* const tc = items.getUnchecked(i);
|
||||
|
||||
tc->setStyle (toolbar.getStyle());
|
||||
|
||||
int preferredSize = 1, minSize = 1, maxSize = 1;
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ private:
|
|||
ToolbarItemFactory& factory;
|
||||
Toolbar& toolbar;
|
||||
Viewport viewport;
|
||||
OwnedArray <ToolbarItemComponent> items;
|
||||
OwnedArray<ToolbarItemComponent> items;
|
||||
|
||||
friend class Toolbar;
|
||||
void replaceComponent (ToolbarItemComponent&);
|
||||
|
|
|
|||
|
|
@ -44,20 +44,20 @@ public:
|
|||
|
||||
static void createLines (Array<CodeDocumentLine*>& newLines, StringRef text)
|
||||
{
|
||||
String::CharPointerType t (text.text);
|
||||
auto t = text.text;
|
||||
int charNumInFile = 0;
|
||||
bool finished = false;
|
||||
|
||||
while (! (finished || t.isEmpty()))
|
||||
{
|
||||
String::CharPointerType startOfLine (t);
|
||||
int startOfLineInFile = charNumInFile;
|
||||
auto startOfLine = t;
|
||||
auto startOfLineInFile = charNumInFile;
|
||||
int lineLength = 0;
|
||||
int numNewLineChars = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (c == 0)
|
||||
{
|
||||
|
|
@ -107,9 +107,9 @@ public:
|
|||
lineLength = 0;
|
||||
lineLengthWithoutNewLines = 0;
|
||||
|
||||
for (String::CharPointerType t (line.getCharPointer());;)
|
||||
for (auto t = line.getCharPointer();;)
|
||||
{
|
||||
const juce_wchar c = t.getAndAdvance();
|
||||
auto c = t.getAndAdvance();
|
||||
|
||||
if (c == 0)
|
||||
break;
|
||||
|
|
@ -126,32 +126,10 @@ public:
|
|||
};
|
||||
|
||||
//==============================================================================
|
||||
CodeDocument::Iterator::Iterator (const CodeDocument& doc) noexcept
|
||||
: document (&doc),
|
||||
charPointer (nullptr),
|
||||
line (0),
|
||||
position (0)
|
||||
CodeDocument::Iterator::Iterator (const CodeDocument& doc) noexcept : document (&doc)
|
||||
{
|
||||
}
|
||||
|
||||
CodeDocument::Iterator::Iterator (const CodeDocument::Iterator& other) noexcept
|
||||
: document (other.document),
|
||||
charPointer (other.charPointer),
|
||||
line (other.line),
|
||||
position (other.position)
|
||||
{
|
||||
}
|
||||
|
||||
CodeDocument::Iterator& CodeDocument::Iterator::operator= (const CodeDocument::Iterator& other) noexcept
|
||||
{
|
||||
document = other.document;
|
||||
charPointer = other.charPointer;
|
||||
line = other.line;
|
||||
position = other.position;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
CodeDocument::Iterator::~Iterator() noexcept
|
||||
{
|
||||
}
|
||||
|
|
@ -162,13 +140,13 @@ juce_wchar CodeDocument::Iterator::nextChar() noexcept
|
|||
{
|
||||
if (charPointer.getAddress() == nullptr)
|
||||
{
|
||||
if (const CodeDocumentLine* const l = document->lines[line])
|
||||
if (auto* l = document->lines[line])
|
||||
charPointer = l->line.getCharPointer();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (const juce_wchar result = charPointer.getAndAdvance())
|
||||
if (auto result = charPointer.getAndAdvance())
|
||||
{
|
||||
if (charPointer.isEmpty())
|
||||
{
|
||||
|
|
@ -194,12 +172,10 @@ void CodeDocument::Iterator::skipToEndOfLine() noexcept
|
|||
{
|
||||
if (charPointer.getAddress() == nullptr)
|
||||
{
|
||||
const CodeDocumentLine* const l = document->lines[line];
|
||||
|
||||
if (l == nullptr)
|
||||
if (auto* l = document->lines[line])
|
||||
charPointer = l->line.getCharPointer();
|
||||
else
|
||||
return;
|
||||
|
||||
charPointer = l->line.getCharPointer();
|
||||
}
|
||||
|
||||
position += (int) charPointer.length();
|
||||
|
|
@ -211,16 +187,16 @@ juce_wchar CodeDocument::Iterator::peekNextChar() const noexcept
|
|||
{
|
||||
if (charPointer.getAddress() == nullptr)
|
||||
{
|
||||
if (const CodeDocumentLine* const l = document->lines[line])
|
||||
if (auto* l = document->lines[line])
|
||||
charPointer = l->line.getCharPointer();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (const juce_wchar c = *charPointer)
|
||||
if (auto c = *charPointer)
|
||||
return c;
|
||||
|
||||
if (const CodeDocumentLine* const l = document->lines [line + 1])
|
||||
if (auto* l = document->lines [line + 1])
|
||||
return l->line[0];
|
||||
|
||||
return 0;
|
||||
|
|
@ -239,30 +215,26 @@ bool CodeDocument::Iterator::isEOF() const noexcept
|
|||
|
||||
//==============================================================================
|
||||
CodeDocument::Position::Position() noexcept
|
||||
: owner (nullptr), characterPos (0), line (0),
|
||||
indexInLine (0), positionMaintained (false)
|
||||
{
|
||||
}
|
||||
|
||||
CodeDocument::Position::Position (const CodeDocument& ownerDocument,
|
||||
const int lineNum, const int index) noexcept
|
||||
: owner (const_cast<CodeDocument*> (&ownerDocument)),
|
||||
characterPos (0), line (lineNum),
|
||||
indexInLine (index), positionMaintained (false)
|
||||
line (lineNum), indexInLine (index)
|
||||
{
|
||||
setLineAndIndex (lineNum, index);
|
||||
}
|
||||
|
||||
CodeDocument::Position::Position (const CodeDocument& ownerDocument, const int characterPos_) noexcept
|
||||
: owner (const_cast<CodeDocument*> (&ownerDocument)),
|
||||
positionMaintained (false)
|
||||
CodeDocument::Position::Position (const CodeDocument& ownerDocument, int pos) noexcept
|
||||
: owner (const_cast<CodeDocument*> (&ownerDocument))
|
||||
{
|
||||
setPosition (characterPos_);
|
||||
setPosition (pos);
|
||||
}
|
||||
|
||||
CodeDocument::Position::Position (const Position& other) noexcept
|
||||
: owner (other.owner), characterPos (other.characterPos), line (other.line),
|
||||
indexInLine (other.indexInLine), positionMaintained (false)
|
||||
indexInLine (other.indexInLine)
|
||||
{
|
||||
jassert (*this == other);
|
||||
}
|
||||
|
|
@ -324,7 +296,7 @@ void CodeDocument::Position::setLineAndIndex (const int newLineNum, const int ne
|
|||
{
|
||||
line = owner->lines.size() - 1;
|
||||
|
||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (line);
|
||||
auto& l = *owner->lines.getUnchecked (line);
|
||||
indexInLine = l.lineLengthWithoutNewLines;
|
||||
characterPos = l.lineStartInFile + indexInLine;
|
||||
}
|
||||
|
|
@ -332,7 +304,7 @@ void CodeDocument::Position::setLineAndIndex (const int newLineNum, const int ne
|
|||
{
|
||||
line = jmax (0, newLineNum);
|
||||
|
||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (line);
|
||||
auto& l = *owner->lines.getUnchecked (line);
|
||||
|
||||
if (l.lineLengthWithoutNewLines > 0)
|
||||
indexInLine = jlimit (0, l.lineLengthWithoutNewLines, newIndexInLine);
|
||||
|
|
@ -355,7 +327,7 @@ void CodeDocument::Position::setPosition (const int newPosition)
|
|||
if (newPosition > 0)
|
||||
{
|
||||
int lineStart = 0;
|
||||
int lineEnd = owner->lines.size();
|
||||
auto lineEnd = owner->lines.size();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
|
@ -363,8 +335,8 @@ void CodeDocument::Position::setPosition (const int newPosition)
|
|||
{
|
||||
for (int i = lineStart; i < lineEnd; ++i)
|
||||
{
|
||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (i);
|
||||
const int index = newPosition - l.lineStartInFile;
|
||||
auto& l = *owner->lines.getUnchecked (i);
|
||||
auto index = newPosition - l.lineStartInFile;
|
||||
|
||||
if (index >= 0 && (index < l.lineLength || i == lineEnd - 1))
|
||||
{
|
||||
|
|
@ -378,7 +350,7 @@ void CodeDocument::Position::setPosition (const int newPosition)
|
|||
}
|
||||
else
|
||||
{
|
||||
const int midIndex = (lineStart + lineEnd + 1) / 2;
|
||||
auto midIndex = (lineStart + lineEnd + 1) / 2;
|
||||
|
||||
if (newPosition >= owner->lines.getUnchecked (midIndex)->lineStartInFile)
|
||||
lineStart = midIndex;
|
||||
|
|
@ -400,7 +372,7 @@ void CodeDocument::Position::moveBy (int characterDelta)
|
|||
// If moving right, make sure we don't get stuck between the \r and \n characters..
|
||||
if (line < owner->lines.size())
|
||||
{
|
||||
const CodeDocumentLine& l = *owner->lines.getUnchecked (line);
|
||||
auto& l = *owner->lines.getUnchecked (line);
|
||||
|
||||
if (indexInLine + characterDelta < l.lineLength
|
||||
&& indexInLine + characterDelta >= l.lineLengthWithoutNewLines + 1)
|
||||
|
|
@ -465,12 +437,7 @@ void CodeDocument::Position::setPositionMaintained (const bool isMaintained)
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
CodeDocument::CodeDocument()
|
||||
: undoManager (std::numeric_limits<int>::max(), 10000),
|
||||
currentActionIndex (0),
|
||||
indexOfSavedState (-1),
|
||||
maximumLineLength (-1),
|
||||
newLineChars ("\r\n")
|
||||
CodeDocument::CodeDocument() : undoManager (std::numeric_limits<int>::max(), 10000)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -489,12 +456,12 @@ String CodeDocument::getTextBetween (const Position& start, const Position& end)
|
|||
if (end.getPosition() <= start.getPosition())
|
||||
return {};
|
||||
|
||||
const int startLine = start.getLineNumber();
|
||||
const int endLine = end.getLineNumber();
|
||||
auto startLine = start.getLineNumber();
|
||||
auto endLine = end.getLineNumber();
|
||||
|
||||
if (startLine == endLine)
|
||||
{
|
||||
if (CodeDocumentLine* const line = lines [startLine])
|
||||
if (auto* line = lines [startLine])
|
||||
return line->line.substring (start.getIndexInLine(), end.getIndexInLine());
|
||||
|
||||
return {};
|
||||
|
|
@ -503,16 +470,16 @@ String CodeDocument::getTextBetween (const Position& start, const Position& end)
|
|||
MemoryOutputStream mo;
|
||||
mo.preallocate ((size_t) (end.getPosition() - start.getPosition() + 4));
|
||||
|
||||
const int maxLine = jmin (lines.size() - 1, endLine);
|
||||
auto maxLine = jmin (lines.size() - 1, endLine);
|
||||
|
||||
for (int i = jmax (0, startLine); i <= maxLine; ++i)
|
||||
{
|
||||
const CodeDocumentLine& line = *lines.getUnchecked(i);
|
||||
int len = line.lineLength;
|
||||
auto& line = *lines.getUnchecked(i);
|
||||
auto len = line.lineLength;
|
||||
|
||||
if (i == startLine)
|
||||
{
|
||||
const int index = start.getIndexInLine();
|
||||
auto index = start.getIndexInLine();
|
||||
mo << line.line.substring (index, len);
|
||||
}
|
||||
else if (i == endLine)
|
||||
|
|
@ -539,7 +506,7 @@ int CodeDocument::getNumCharacters() const noexcept
|
|||
|
||||
String CodeDocument::getLine (const int lineIndex) const noexcept
|
||||
{
|
||||
if (auto* line = lines [lineIndex])
|
||||
if (auto* line = lines[lineIndex])
|
||||
return line->line;
|
||||
|
||||
return {};
|
||||
|
|
@ -551,8 +518,8 @@ int CodeDocument::getMaximumLineLength() noexcept
|
|||
{
|
||||
maximumLineLength = 0;
|
||||
|
||||
for (int i = lines.size(); --i >= 0;)
|
||||
maximumLineLength = jmax (maximumLineLength, lines.getUnchecked(i)->lineLength);
|
||||
for (auto* l : lines)
|
||||
maximumLineLength = jmax (maximumLineLength, l->lineLength);
|
||||
}
|
||||
|
||||
return maximumLineLength;
|
||||
|
|
@ -591,10 +558,8 @@ void CodeDocument::applyChanges (const String& newContent)
|
|||
|
||||
TextDiff diff (getAllContent(), corrected);
|
||||
|
||||
for (int i = 0; i < diff.changes.size(); ++i)
|
||||
for (auto& c : diff.changes)
|
||||
{
|
||||
const TextDiff::Change& c = diff.changes.getReference(i);
|
||||
|
||||
if (c.isDeletion())
|
||||
remove (c.start, c.start + c.length, true);
|
||||
else
|
||||
|
|
@ -619,9 +584,9 @@ bool CodeDocument::loadFromStream (InputStream& stream)
|
|||
|
||||
bool CodeDocument::writeToStream (OutputStream& stream)
|
||||
{
|
||||
for (int i = 0; i < lines.size(); ++i)
|
||||
for (auto* l : lines)
|
||||
{
|
||||
String temp (lines.getUnchecked(i)->line); // use a copy to avoid bloating the memory footprint of the stored string.
|
||||
auto temp = l->line; // use a copy to avoid bloating the memory footprint of the stored string.
|
||||
const char* utf8 = temp.toUTF8();
|
||||
|
||||
if (! stream.write (utf8, strlen (utf8)))
|
||||
|
|
@ -669,23 +634,15 @@ bool CodeDocument::hasChangedSinceSavePoint() const noexcept
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
namespace CodeDocumentHelpers
|
||||
static inline int getCharacterType (juce_wchar character) noexcept
|
||||
{
|
||||
static int getCharacterType (const juce_wchar character) noexcept
|
||||
{
|
||||
return (CharacterFunctions::isLetterOrDigit (character) || character == '_')
|
||||
? 2 : (CharacterFunctions::isWhitespace (character) ? 0 : 1);
|
||||
}
|
||||
|
||||
static bool isTokenCharacter (const juce_wchar c) noexcept
|
||||
{
|
||||
return CharacterFunctions::isLetterOrDigit (c) || c == '.' || c == '_';
|
||||
}
|
||||
return (CharacterFunctions::isLetterOrDigit (character) || character == '_')
|
||||
? 2 : (CharacterFunctions::isWhitespace (character) ? 0 : 1);
|
||||
}
|
||||
|
||||
CodeDocument::Position CodeDocument::findWordBreakAfter (const Position& position) const noexcept
|
||||
{
|
||||
Position p (position);
|
||||
auto p = position;
|
||||
const int maxDistance = 256;
|
||||
int i = 0;
|
||||
|
||||
|
|
@ -700,9 +657,9 @@ CodeDocument::Position CodeDocument::findWordBreakAfter (const Position& positio
|
|||
|
||||
if (i == 0)
|
||||
{
|
||||
const int type = CodeDocumentHelpers::getCharacterType (p.getCharacter());
|
||||
auto type = getCharacterType (p.getCharacter());
|
||||
|
||||
while (i < maxDistance && type == CodeDocumentHelpers::getCharacterType (p.getCharacter()))
|
||||
while (i < maxDistance && type == getCharacterType (p.getCharacter()))
|
||||
{
|
||||
++i;
|
||||
p.moveBy (1);
|
||||
|
|
@ -723,14 +680,14 @@ CodeDocument::Position CodeDocument::findWordBreakAfter (const Position& positio
|
|||
|
||||
CodeDocument::Position CodeDocument::findWordBreakBefore (const Position& position) const noexcept
|
||||
{
|
||||
Position p (position);
|
||||
auto p = position;
|
||||
const int maxDistance = 256;
|
||||
int i = 0;
|
||||
bool stoppedAtLineStart = false;
|
||||
|
||||
while (i < maxDistance)
|
||||
{
|
||||
const juce_wchar c = p.movedBy (-1).getCharacter();
|
||||
auto c = p.movedBy (-1).getCharacter();
|
||||
|
||||
if (c == '\r' || c == '\n')
|
||||
{
|
||||
|
|
@ -749,9 +706,9 @@ CodeDocument::Position CodeDocument::findWordBreakBefore (const Position& positi
|
|||
|
||||
if (i < maxDistance && ! stoppedAtLineStart)
|
||||
{
|
||||
const int type = CodeDocumentHelpers::getCharacterType (p.movedBy (-1).getCharacter());
|
||||
auto type = getCharacterType (p.movedBy (-1).getCharacter());
|
||||
|
||||
while (i < maxDistance && type == CodeDocumentHelpers::getCharacterType (p.movedBy (-1).getCharacter()))
|
||||
while (i < maxDistance && type == getCharacterType (p.movedBy (-1).getCharacter()))
|
||||
{
|
||||
p.moveBy (-1);
|
||||
++i;
|
||||
|
|
@ -763,13 +720,15 @@ CodeDocument::Position CodeDocument::findWordBreakBefore (const Position& positi
|
|||
|
||||
void CodeDocument::findTokenContaining (const Position& pos, Position& start, Position& end) const noexcept
|
||||
{
|
||||
auto isTokenCharacter = [] (juce_wchar c) { return CharacterFunctions::isLetterOrDigit (c) || c == '.' || c == '_'; };
|
||||
|
||||
end = pos;
|
||||
while (CodeDocumentHelpers::isTokenCharacter (end.getCharacter()))
|
||||
while (isTokenCharacter (end.getCharacter()))
|
||||
end.moveBy (1);
|
||||
|
||||
start = end;
|
||||
while (start.getIndexInLine() > 0
|
||||
&& CodeDocumentHelpers::isTokenCharacter (start.movedBy (-1).getCharacter()))
|
||||
&& isTokenCharacter (start.movedBy (-1).getCharacter()))
|
||||
start.moveBy (-1);
|
||||
}
|
||||
|
||||
|
|
@ -800,14 +759,13 @@ void CodeDocument::checkLastLineStatus()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void CodeDocument::addListener (CodeDocument::Listener* const l) noexcept { listeners.add (l); }
|
||||
void CodeDocument::removeListener (CodeDocument::Listener* const l) noexcept { listeners.remove (l); }
|
||||
void CodeDocument::addListener (CodeDocument::Listener* l) noexcept { listeners.add (l); }
|
||||
void CodeDocument::removeListener (CodeDocument::Listener* l) noexcept { listeners.remove (l); }
|
||||
|
||||
//==============================================================================
|
||||
class CodeDocumentInsertAction : public UndoableAction
|
||||
struct CodeDocument::InsertAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
CodeDocumentInsertAction (CodeDocument& doc, const String& t, const int pos) noexcept
|
||||
InsertAction (CodeDocument& doc, const String& t, const int pos) noexcept
|
||||
: owner (doc), text (t), insertPos (pos)
|
||||
{
|
||||
}
|
||||
|
|
@ -828,12 +786,11 @@ public:
|
|||
|
||||
int getSizeInUnits() override { return text.length() + 32; }
|
||||
|
||||
private:
|
||||
CodeDocument& owner;
|
||||
const String text;
|
||||
const int insertPos;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE (CodeDocumentInsertAction)
|
||||
JUCE_DECLARE_NON_COPYABLE (InsertAction)
|
||||
};
|
||||
|
||||
void CodeDocument::insert (const String& text, const int insertPos, const bool undoable)
|
||||
|
|
@ -842,19 +799,19 @@ void CodeDocument::insert (const String& text, const int insertPos, const bool u
|
|||
{
|
||||
if (undoable)
|
||||
{
|
||||
undoManager.perform (new CodeDocumentInsertAction (*this, text, insertPos));
|
||||
undoManager.perform (new InsertAction (*this, text, insertPos));
|
||||
}
|
||||
else
|
||||
{
|
||||
Position pos (*this, insertPos);
|
||||
const int firstAffectedLine = pos.getLineNumber();
|
||||
auto firstAffectedLine = pos.getLineNumber();
|
||||
|
||||
CodeDocumentLine* const firstLine = lines [firstAffectedLine];
|
||||
String textInsideOriginalLine (text);
|
||||
auto* firstLine = lines[firstAffectedLine];
|
||||
auto textInsideOriginalLine = text;
|
||||
|
||||
if (firstLine != nullptr)
|
||||
{
|
||||
const int index = pos.getIndexInLine();
|
||||
auto index = pos.getIndexInLine();
|
||||
textInsideOriginalLine = firstLine->line.substring (0, index)
|
||||
+ textInsideOriginalLine
|
||||
+ firstLine->line.substring (index);
|
||||
|
|
@ -865,7 +822,7 @@ void CodeDocument::insert (const String& text, const int insertPos, const bool u
|
|||
CodeDocumentLine::createLines (newLines, textInsideOriginalLine);
|
||||
jassert (newLines.size() > 0);
|
||||
|
||||
CodeDocumentLine* const newFirstLine = newLines.getUnchecked (0);
|
||||
auto* newFirstLine = newLines.getUnchecked (0);
|
||||
newFirstLine->lineStartInFile = firstLine != nullptr ? firstLine->lineStartInFile : 0;
|
||||
lines.set (firstAffectedLine, newFirstLine);
|
||||
|
||||
|
|
@ -873,23 +830,20 @@ void CodeDocument::insert (const String& text, const int insertPos, const bool u
|
|||
lines.insertArray (firstAffectedLine + 1, newLines.getRawDataPointer() + 1, newLines.size() - 1);
|
||||
|
||||
int lineStart = newFirstLine->lineStartInFile;
|
||||
|
||||
for (int i = firstAffectedLine; i < lines.size(); ++i)
|
||||
{
|
||||
CodeDocumentLine& l = *lines.getUnchecked (i);
|
||||
auto& l = *lines.getUnchecked (i);
|
||||
l.lineStartInFile = lineStart;
|
||||
lineStart += l.lineLength;
|
||||
}
|
||||
|
||||
checkLastLineStatus();
|
||||
auto newTextLength = text.length();
|
||||
|
||||
const int newTextLength = text.length();
|
||||
for (int i = 0; i < positionsToMaintain.size(); ++i)
|
||||
{
|
||||
CodeDocument::Position& p = *positionsToMaintain.getUnchecked(i);
|
||||
|
||||
if (p.getPosition() >= insertPos)
|
||||
p.setPosition (p.getPosition() + newTextLength);
|
||||
}
|
||||
for (auto* p : positionsToMaintain)
|
||||
if (p->getPosition() >= insertPos)
|
||||
p->setPosition (p->getPosition() + newTextLength);
|
||||
|
||||
listeners.call (&CodeDocument::Listener::codeDocumentTextInserted, text, insertPos);
|
||||
}
|
||||
|
|
@ -897,10 +851,9 @@ void CodeDocument::insert (const String& text, const int insertPos, const bool u
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
class CodeDocumentDeleteAction : public UndoableAction
|
||||
struct CodeDocument::DeleteAction : public UndoableAction
|
||||
{
|
||||
public:
|
||||
CodeDocumentDeleteAction (CodeDocument& doc, const int start, const int end) noexcept
|
||||
DeleteAction (CodeDocument& doc, int start, int end) noexcept
|
||||
: owner (doc), startPos (start), endPos (end),
|
||||
removedText (doc.getTextBetween (CodeDocument::Position (doc, start),
|
||||
CodeDocument::Position (doc, end)))
|
||||
|
|
@ -923,12 +876,11 @@ public:
|
|||
|
||||
int getSizeInUnits() override { return (endPos - startPos) + 32; }
|
||||
|
||||
private:
|
||||
CodeDocument& owner;
|
||||
const int startPos, endPos;
|
||||
const String removedText;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE (CodeDocumentDeleteAction)
|
||||
JUCE_DECLARE_NON_COPYABLE (DeleteAction)
|
||||
};
|
||||
|
||||
void CodeDocument::remove (const int startPos, const int endPos, const bool undoable)
|
||||
|
|
@ -938,7 +890,7 @@ void CodeDocument::remove (const int startPos, const int endPos, const bool undo
|
|||
|
||||
if (undoable)
|
||||
{
|
||||
undoManager.perform (new CodeDocumentDeleteAction (*this, startPos, endPos));
|
||||
undoManager.perform (new DeleteAction (*this, startPos, endPos));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -946,9 +898,9 @@ void CodeDocument::remove (const int startPos, const int endPos, const bool undo
|
|||
Position endPosition (*this, endPos);
|
||||
|
||||
maximumLineLength = -1;
|
||||
const int firstAffectedLine = startPosition.getLineNumber();
|
||||
const int endLine = endPosition.getLineNumber();
|
||||
CodeDocumentLine& firstLine = *lines.getUnchecked (firstAffectedLine);
|
||||
auto firstAffectedLine = startPosition.getLineNumber();
|
||||
auto endLine = endPosition.getLineNumber();
|
||||
auto& firstLine = *lines.getUnchecked (firstAffectedLine);
|
||||
|
||||
if (firstAffectedLine == endLine)
|
||||
{
|
||||
|
|
@ -958,7 +910,7 @@ void CodeDocument::remove (const int startPos, const int endPos, const bool undo
|
|||
}
|
||||
else
|
||||
{
|
||||
CodeDocumentLine& lastLine = *lines.getUnchecked (endLine);
|
||||
auto& lastLine = *lines.getUnchecked (endLine);
|
||||
|
||||
firstLine.line = firstLine.line.substring (0, startPosition.getIndexInLine())
|
||||
+ lastLine.line.substring (endPosition.getIndexInLine());
|
||||
|
|
@ -970,24 +922,21 @@ void CodeDocument::remove (const int startPos, const int endPos, const bool undo
|
|||
|
||||
for (int i = firstAffectedLine + 1; i < lines.size(); ++i)
|
||||
{
|
||||
CodeDocumentLine& l = *lines.getUnchecked (i);
|
||||
const CodeDocumentLine& previousLine = *lines.getUnchecked (i - 1);
|
||||
auto& l = *lines.getUnchecked (i);
|
||||
auto& previousLine = *lines.getUnchecked (i - 1);
|
||||
l.lineStartInFile = previousLine.lineStartInFile + previousLine.lineLength;
|
||||
}
|
||||
|
||||
checkLastLineStatus();
|
||||
auto totalChars = getNumCharacters();
|
||||
|
||||
const int totalChars = getNumCharacters();
|
||||
|
||||
for (int i = 0; i < positionsToMaintain.size(); ++i)
|
||||
for (auto* p : positionsToMaintain)
|
||||
{
|
||||
CodeDocument::Position& p = *positionsToMaintain.getUnchecked(i);
|
||||
if (p->getPosition() > startPosition.getPosition())
|
||||
p->setPosition (jmax (startPos, p->getPosition() + startPos - endPos));
|
||||
|
||||
if (p.getPosition() > startPosition.getPosition())
|
||||
p.setPosition (jmax (startPos, p.getPosition() + startPos - endPos));
|
||||
|
||||
if (p.getPosition() > totalChars)
|
||||
p.setPosition (totalChars);
|
||||
if (p->getPosition() > totalChars)
|
||||
p->setPosition (totalChars);
|
||||
}
|
||||
|
||||
listeners.call (&CodeDocument::Listener::codeDocumentTextDeleted, startPos, endPos);
|
||||
|
|
|
|||
|
|
@ -179,9 +179,9 @@ public:
|
|||
String getLineText() const;
|
||||
|
||||
private:
|
||||
CodeDocument* owner;
|
||||
int characterPos, line, indexInLine;
|
||||
bool positionMaintained;
|
||||
CodeDocument* owner = nullptr;
|
||||
int characterPos = 0, line = 0, indexInLine = 0;
|
||||
bool positionMaintained = false;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -357,8 +357,8 @@ public:
|
|||
{
|
||||
public:
|
||||
Iterator (const CodeDocument& document) noexcept;
|
||||
Iterator (const Iterator&) noexcept;
|
||||
Iterator& operator= (const Iterator&) noexcept;
|
||||
Iterator (const Iterator&) noexcept = default;
|
||||
Iterator& operator= (const Iterator&) noexcept = default;
|
||||
~Iterator() noexcept;
|
||||
|
||||
/** Reads the next character and returns it.
|
||||
|
|
@ -389,24 +389,24 @@ public:
|
|||
|
||||
private:
|
||||
const CodeDocument* document;
|
||||
mutable String::CharPointerType charPointer;
|
||||
int line, position;
|
||||
mutable String::CharPointerType charPointer { nullptr };
|
||||
int line = 0, position = 0;
|
||||
};
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
friend class CodeDocumentInsertAction;
|
||||
friend class CodeDocumentDeleteAction;
|
||||
struct InsertAction;
|
||||
struct DeleteAction;
|
||||
friend class Iterator;
|
||||
friend class Position;
|
||||
|
||||
OwnedArray <CodeDocumentLine> lines;
|
||||
Array <Position*> positionsToMaintain;
|
||||
OwnedArray<CodeDocumentLine> lines;
|
||||
Array<Position*> positionsToMaintain;
|
||||
UndoManager undoManager;
|
||||
int currentActionIndex, indexOfSavedState;
|
||||
int maximumLineLength;
|
||||
ListenerList <Listener> listeners;
|
||||
String newLineChars;
|
||||
int currentActionIndex = 0, indexOfSavedState = -1;
|
||||
int maximumLineLength = -1;
|
||||
ListenerList<Listener> listeners;
|
||||
String newLineChars { "\r\n" };
|
||||
|
||||
void insert (const String& text, int insertPos, bool undoable);
|
||||
void remove (int startPos, int endPos, bool undoable);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue