/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2015 - ROLI Ltd. Permission is granted to use this software under the terms of either: a) the GPL v2 (or any later version) b) the Affero GPL v3 Details of these licenses can be found at: www.gnu.org/licenses JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. ------------------------------------------------------------------------------ To release a closed-source product which uses JUCE, commercial licenses are available: visit www.juce.com for more information. ============================================================================== */ #include "../../jucer_Headers.h" #include "jucer_TestComponent.h" #include "../jucer_ObjectTypes.h" static Array testComponents; //============================================================================== TestComponent::TestComponent (JucerDocument* const doc, JucerDocument* const loaded, const bool alwaysFill) : ownerDocument (doc), loadedDocument (loaded), alwaysFillBackground (alwaysFill) { setToInitialSize(); updateContents(); testComponents.add (this); setLookAndFeel (&lookAndFeel); } TestComponent::~TestComponent() { testComponents.removeFirstMatchingValue (this); deleteAllChildren(); } //============================================================================== void TestComponent::reloadAll() { for (int i = testComponents.size(); --i >= 0;) testComponents.getUnchecked(i)->reload(); } void TestComponent::reload() { if (findFile().exists() && lastModificationTime != findFile().getLastModificationTime()) setFilename (filename); } //============================================================================== static StringArray recursiveFiles; File TestComponent::findFile() const { if (filename.isEmpty()) return {}; if (ownerDocument != nullptr) return ownerDocument->getCppFile().getSiblingFile (filename); return File::getCurrentWorkingDirectory().getChildFile (filename); } void TestComponent::setFilename (const String& newName) { File newFile; if (newName.isNotEmpty()) { if (ownerDocument != nullptr) newFile = ownerDocument->getCppFile().getSiblingFile (newName); else newFile = File::getCurrentWorkingDirectory().getChildFile (newName); } if (! recursiveFiles.contains (newFile.getFullPathName())) { recursiveFiles.add (newFile.getFullPathName()); loadedDocument = nullptr; filename = newName; lastModificationTime = findFile().getLastModificationTime(); loadedDocument = JucerDocument::createForCppFile (nullptr, findFile()); updateContents(); repaint(); recursiveFiles.remove (recursiveFiles.size() - 1); } } void TestComponent::setConstructorParams (const String& newParams) { constructorParams = newParams; } void TestComponent::updateContents() { deleteAllChildren(); repaint(); if (loadedDocument != nullptr) { addAndMakeVisible (loadedDocument->createTestComponent (alwaysFillBackground)); resized(); } } void TestComponent::setToInitialSize() { if (loadedDocument != nullptr) setSize (loadedDocument->getInitialWidth(), loadedDocument->getInitialHeight()); else setSize (100, 100); } //============================================================================== void TestComponent::paint (Graphics& g) { if (loadedDocument == nullptr) { g.fillAll (Colours::white.withAlpha (0.25f)); g.setColour (Colours::black.withAlpha (0.5f)); g.drawRect (getLocalBounds()); g.drawLine (0.0f, 0.0f, (float) getWidth(), (float) getHeight()); g.drawLine (0.0f, (float) getHeight(), (float) getWidth(), 0.0f); g.setFont (14.0f); g.drawText ("Projucer Component", 0, 0, getWidth(), getHeight() / 2, Justification::centred, true); g.drawText ("(no file loaded)", 0, getHeight() / 2, getWidth(), getHeight() / 2, Justification::centred, true); } } void TestComponent::resized() { if (Component* const c = getChildComponent (0)) { setOpaque (c->isOpaque()); c->setBounds (getLocalBounds()); } } //============================================================================== void TestComponent::showInDialogBox (JucerDocument& document) { DialogWindow::LaunchOptions o; o.content.setOwned (new TestComponent (nullptr, document.createCopy(), true)); o.dialogTitle = "Testing: " + document.getClassName(); o.dialogBackgroundColour = Colours::azure; o.escapeKeyTriggersCloseButton = true; o.useNativeTitleBar = false; o.resizable = true; o.launchAsync(); }