The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

710 lines
25KB

  1. /*
  2. ==============================================================================
  3. This is an automatically generated file created by the Jucer!
  4. Be careful when adding custom code to these files, as only the code within
  5. the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded
  6. and re-saved.
  7. Created for JUCE version: JUCE v1.53.8
  8. ------------------------------------------------------------------------------
  9. JUCE and the Jucer are copyright 2004-10 by Raw Material Software ltd.
  10. ==============================================================================
  11. */
  12. //[CppHeaders] You can add your own extra header files here...
  13. #include "../Project Saving/jucer_ProjectExporter.h"
  14. #include "jucer_Module.h"
  15. #include "../Application/jucer_JuceUpdater.h"
  16. //[/CppHeaders]
  17. #include "jucer_ProjectInformationComponent.h"
  18. //[MiscUserDefs] You can add your own user definitions and misc code here...
  19. //==============================================================================
  20. class PanelBase : public PropertyPanelWithTooltips
  21. {
  22. public:
  23. PanelBase (Project& project_) : project (project_) {}
  24. virtual void rebuildProperties (Array <PropertyComponent*>& props) = 0;
  25. void visibilityChanged()
  26. {
  27. if (isVisible())
  28. refreshAll();
  29. }
  30. void refreshAll()
  31. {
  32. getPanel().clear();
  33. Array <PropertyComponent*> props;
  34. rebuildProperties (props);
  35. getPanel().addProperties (props);
  36. }
  37. protected:
  38. Project& project;
  39. };
  40. //==============================================================================
  41. class ProjectTab : public PanelBase
  42. {
  43. public:
  44. ProjectTab (Project& project_) : PanelBase (project_) {}
  45. void rebuildProperties (Array <PropertyComponent*>& props)
  46. {
  47. project.createPropertyEditors (props);
  48. }
  49. };
  50. //==============================================================================
  51. class ConfigTab : public PanelBase
  52. {
  53. public:
  54. ConfigTab (Project& project_, int configIndex_)
  55. : PanelBase (project_), configIndex (configIndex_)
  56. {
  57. }
  58. void rebuildProperties (Array <PropertyComponent*>& props)
  59. {
  60. project.getConfiguration (configIndex).createPropertyEditors (props);
  61. }
  62. private:
  63. int configIndex;
  64. };
  65. //==============================================================================
  66. class ExportTab : public PanelBase
  67. {
  68. public:
  69. ExportTab (Project& project_, int exporterIndex_)
  70. : PanelBase (project_), exporterIndex (exporterIndex_)
  71. {
  72. }
  73. void rebuildProperties (Array <PropertyComponent*>& props)
  74. {
  75. ScopedPointer <ProjectExporter> exp (project.createExporter (exporterIndex));
  76. if (exp != nullptr)
  77. exp->createPropertyEditors (props);
  78. for (int i = props.size(); --i >= 0;)
  79. props.getUnchecked(i)->setPreferredHeight (22);
  80. }
  81. private:
  82. int exporterIndex;
  83. };
  84. //==============================================================================
  85. static StringArray getExtraDependenciesNeeded (Project& project, ModuleList& moduleList, const ModuleList::Module& m)
  86. {
  87. StringArray dependencies, extraDepsNeeded;
  88. moduleList.getDependencies (m.uid, dependencies);
  89. for (int i = 0; i < dependencies.size(); ++i)
  90. if ((! project.isModuleEnabled (dependencies[i])) && dependencies[i] != m.uid)
  91. extraDepsNeeded.add (dependencies[i]);
  92. return extraDepsNeeded;
  93. }
  94. //==============================================================================
  95. class ModuleSettingsPanel : public PanelBase
  96. {
  97. public:
  98. ModuleSettingsPanel (Project& project_, ModuleList& moduleList_, const String& moduleID_)
  99. : PanelBase (project_), moduleList (moduleList_), moduleID (moduleID_)
  100. {
  101. setBounds ("parent.width / 2 + 1, 31, parent.width - 3, parent.height - 3");
  102. }
  103. void rebuildProperties (Array <PropertyComponent*>& props)
  104. {
  105. ScopedPointer<LibraryModule> module (moduleList.loadModule (moduleID));
  106. if (module != nullptr)
  107. {
  108. props.add (new ModuleInfoComponent (project, moduleList, moduleID));
  109. if (project.isModuleEnabled (moduleID))
  110. {
  111. const ModuleList::Module* m = moduleList.findModuleInfo (moduleID);
  112. if (m != nullptr && getExtraDependenciesNeeded (project, moduleList, *m).size() > 0)
  113. props.add (new MissingDependenciesComponent (project, moduleList, moduleID));
  114. }
  115. props.add (new BooleanPropertyComponent (project.shouldShowAllModuleFilesInProject (moduleID),
  116. "Add source to project", "Make module files browsable in projects"));
  117. props.getLast()->setTooltip ("If this is enabled, then the entire source tree from this module will be shown inside your project, "
  118. "making it easy to browse/edit the module's classes. If disabled, then only the minimum number of files "
  119. "required to compile it will appear inside your project.");
  120. props.add (new BooleanPropertyComponent (project.shouldCopyModuleFilesLocally (moduleID),
  121. "Create local copy", "Copy the module into the project folder"));
  122. props.getLast()->setTooltip ("If this is enabled, then a local copy of the entire module will be made inside your project (in the auto-generated JuceLibraryFiles folder), "
  123. "so that your project will be self-contained, and won't need to contain any references to files in other folders. "
  124. "This also means that you can check the module into your source-control system to make sure it is always in sync with your own code.");
  125. StringArray possibleValues;
  126. possibleValues.add ("(Use Default)");
  127. possibleValues.add ("Enabled");
  128. possibleValues.add ("Disabled");
  129. Array<var> mappings;
  130. mappings.add (Project::configFlagDefault);
  131. mappings.add (Project::configFlagEnabled);
  132. mappings.add (Project::configFlagDisabled);
  133. OwnedArray <Project::ConfigFlag> flags;
  134. module->getConfigFlags (project, flags);
  135. for (int i = 0; i < flags.size(); ++i)
  136. {
  137. ChoicePropertyComponent* c = new ChoicePropertyComponent (flags[i]->value, flags[i]->symbol, possibleValues, mappings);
  138. c->setTooltip (flags[i]->description);
  139. c->setPreferredHeight (22);
  140. props.add (c);
  141. }
  142. }
  143. setEnabled (project.isModuleEnabled (moduleID));
  144. }
  145. private:
  146. ModuleList& moduleList;
  147. String moduleID;
  148. //==============================================================================
  149. class ModuleInfoComponent : public PropertyComponent
  150. {
  151. public:
  152. ModuleInfoComponent (Project& project_, ModuleList& moduleList_, const String& moduleID_)
  153. : PropertyComponent ("Module", 100),
  154. project (project_), moduleList (moduleList_), moduleID (moduleID_)
  155. {
  156. }
  157. void refresh() {}
  158. void paint (Graphics& g)
  159. {
  160. g.setColour (Colours::white.withAlpha (0.4f));
  161. g.fillRect (0, 0, getWidth(), getHeight() - 1);
  162. const ModuleList::Module* module = moduleList.findModuleInfo (moduleID);
  163. if (module != nullptr)
  164. {
  165. String text;
  166. text << module->name << newLine << "Version: " << module->version << newLine << newLine
  167. << module->description;
  168. GlyphArrangement ga;
  169. ga.addJustifiedText (Font (13.0f), text, 4.0f, 16.0f, getWidth() - 8.0f, Justification::topLeft);
  170. g.setColour (Colours::black);
  171. ga.draw (g);
  172. }
  173. }
  174. private:
  175. Project& project;
  176. ModuleList& moduleList;
  177. String moduleID;
  178. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleInfoComponent);
  179. };
  180. //==============================================================================
  181. class MissingDependenciesComponent : public PropertyComponent,
  182. public ButtonListener
  183. {
  184. public:
  185. MissingDependenciesComponent (Project& project_, ModuleList& moduleList_, const String& moduleID_)
  186. : PropertyComponent ("Dependencies", 100),
  187. project (project_), moduleList (moduleList_), moduleID (moduleID_),
  188. fixButton ("Enable Required Modules")
  189. {
  190. const ModuleList::Module* module = moduleList.findModuleInfo (moduleID);
  191. if (module != nullptr)
  192. missingDependencies = getExtraDependenciesNeeded (project, moduleList, *module);
  193. addAndMakeVisible (&fixButton);
  194. fixButton.setColour (TextButton::buttonColourId, Colours::red);
  195. fixButton.setColour (TextButton::textColourOffId, Colours::white);
  196. fixButton.setBounds ("right - 160, parent.height - 26, parent.width - 8, top + 22");
  197. fixButton.addListener (this);
  198. }
  199. void refresh() {}
  200. void paint (Graphics& g)
  201. {
  202. g.setColour (Colours::white.withAlpha (0.4f));
  203. g.fillRect (0, 0, getWidth(), getHeight() - 1);
  204. String text ("This module requires the following dependencies:\n");
  205. text << missingDependencies.joinIntoString (", ");
  206. GlyphArrangement ga;
  207. ga.addJustifiedText (Font (13.0f), text, 4.0f, 16.0f, getWidth() - 8.0f, Justification::topLeft);
  208. g.setColour (Colours::red);
  209. ga.draw (g);
  210. }
  211. void buttonClicked (Button*);
  212. private:
  213. Project& project;
  214. ModuleList& moduleList;
  215. String moduleID;
  216. StringArray missingDependencies;
  217. TextButton fixButton;
  218. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MissingDependenciesComponent);
  219. };
  220. };
  221. //==============================================================================
  222. class ModulesPanel : public Component,
  223. public ListBoxModel,
  224. public FilenameComponentListener,
  225. public ButtonListener
  226. {
  227. public:
  228. ModulesPanel (Project& project_)
  229. : project (project_),
  230. moduleList (ModuleList::getLocalModulesFolder (&project)),
  231. modulesLocation ("modules", moduleList.getModulesFolder(),
  232. true, true, false, "*", String::empty,
  233. "Select a folder containing your JUCE modules..."),
  234. modulesLabel (String::empty, "Module source folder:"),
  235. updateModulesButton ("Check for module updates...")
  236. {
  237. addAndMakeVisible (&modulesLocation);
  238. modulesLocation.setBounds ("150, 3, parent.width - 180, 28");
  239. modulesLocation.addListener (this);
  240. modulesLabel.attachToComponent (&modulesLocation, true);
  241. addAndMakeVisible (&updateModulesButton);
  242. updateModulesButton.setBounds ("parent.width - 175, 3, parent.width - 4, 28");
  243. updateModulesButton.addListener (this);
  244. modulesList.setModel (this);
  245. modulesList.setColour (ListBox::backgroundColourId, Colours::white.withAlpha (0.4f));
  246. addAndMakeVisible (&modulesList);
  247. modulesList.setBounds ("4, 31, parent.width / 2 - 4, parent.height - 3");
  248. }
  249. int getNumRows()
  250. {
  251. return moduleList.modules.size();
  252. }
  253. void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected)
  254. {
  255. if (rowIsSelected)
  256. g.fillAll (findColour (TextEditor::highlightColourId));
  257. const ModuleList::Module* const m = moduleList.modules [rowNumber];
  258. if (m != nullptr)
  259. {
  260. const float tickSize = height * 0.7f;
  261. getLookAndFeel().drawTickBox (g, *this, (height - tickSize) / 2, (height - tickSize) / 2, tickSize, tickSize,
  262. project.isModuleEnabled (m->uid), true, false, false);
  263. if (project.isModuleEnabled (m->uid) && getExtraDependenciesNeeded (project, moduleList, *m).size() > 0)
  264. g.setColour (Colours::red);
  265. else
  266. g.setColour (Colours::black);
  267. g.setFont (height * 0.7f, Font::bold);
  268. g.drawFittedText (m->uid, height, 0, 200, height, Justification::centredLeft, 1);
  269. g.setFont (height * 0.55f, Font::italic);
  270. g.drawText (m->name, height + 200, 0, width - height - 200, height, Justification::centredLeft, true);
  271. }
  272. }
  273. void flipRow (int row)
  274. {
  275. const ModuleList::Module* const m = moduleList.modules [row];
  276. if (m != nullptr)
  277. {
  278. if (project.isModuleEnabled (m->uid))
  279. project.removeModule (m->uid);
  280. else
  281. project.addModule (m->uid);
  282. }
  283. refresh();
  284. }
  285. void filenameComponentChanged (FilenameComponent*)
  286. {
  287. moduleList.rescan (modulesLocation.getCurrentFile());
  288. modulesLocation.setCurrentFile (moduleList.getModulesFolder(), false, false);
  289. ModuleList::setLocalModulesFolder (moduleList.getModulesFolder());
  290. modulesList.updateContent();
  291. }
  292. void buttonClicked (Button*)
  293. {
  294. JuceUpdater::show (moduleList, getTopLevelComponent());
  295. filenameComponentChanged (nullptr);
  296. }
  297. void listBoxItemClicked (int row, const MouseEvent& e)
  298. {
  299. if (e.x < modulesList.getRowHeight())
  300. flipRow (row);
  301. }
  302. void listBoxItemDoubleClicked (int row, const MouseEvent& e)
  303. {
  304. flipRow (row);
  305. }
  306. void returnKeyPressed (int row)
  307. {
  308. flipRow (row);
  309. }
  310. void selectedRowsChanged (int lastRowSelected)
  311. {
  312. const ModuleList::Module* const m = moduleList.modules [lastRowSelected];
  313. settings = nullptr;
  314. if (m != nullptr)
  315. addAndMakeVisible (settings = new ModuleSettingsPanel (project, moduleList, m->uid));
  316. }
  317. void refresh()
  318. {
  319. modulesList.repaint();
  320. if (settings != nullptr)
  321. settings->refreshAll();
  322. }
  323. private:
  324. Project& project;
  325. ModuleList moduleList;
  326. FilenameComponent modulesLocation;
  327. Label modulesLabel;
  328. TextButton updateModulesButton;
  329. ListBox modulesList;
  330. ScopedPointer<ModuleSettingsPanel> settings;
  331. };
  332. void ModuleSettingsPanel::MissingDependenciesComponent::buttonClicked (Button*)
  333. {
  334. for (int i = missingDependencies.size(); --i >= 0;)
  335. project.addModule (missingDependencies[i]);
  336. ModulesPanel* mp = findParentComponentOfClass ((ModulesPanel*) 0);
  337. if (mp != nullptr)
  338. mp->refresh();
  339. }
  340. //[/MiscUserDefs]
  341. //==============================================================================
  342. ProjectInformationComponent::ProjectInformationComponent (Project& project_)
  343. : project (project_),
  344. configTabBox (TabbedButtonBar::TabsAtTop)
  345. {
  346. addAndMakeVisible (&configTabBox);
  347. configTabBox.setBounds ("8, 0, this.left + parent.width - 16, this.top + parent.height - 36");
  348. addAndMakeVisible (&editConfigsButton);
  349. editConfigsButton.setBounds ("8, parent.height - 30, this.left + 192, this.top + 22");
  350. editConfigsButton.setButtonText ("Add/Remove Configurations...");
  351. editConfigsButton.addListener (this);
  352. addAndMakeVisible (&openProjectButton);
  353. openProjectButton.setBounds ("608, parent.height - 30, this.left + 208, this.top + 22");
  354. openProjectButton.setButtonText ("Open Project in ");
  355. openProjectButton.addListener (this);
  356. addAndMakeVisible (&editExportersButton);
  357. editExportersButton.setBounds ("208, parent.height - 30, this.left + 160, this.top + 22");
  358. editExportersButton.setButtonText ("Add/Remove Exporters...");
  359. editExportersButton.addListener (this);
  360. addAndMakeVisible (&saveAndOpenButton);
  361. saveAndOpenButton.setBounds ("391, parent.height - 30, this.left + 208, this.top + 22");
  362. saveAndOpenButton.setButtonText ("Save And Open in");
  363. saveAndOpenButton.addListener (this);
  364. //[UserPreSize]
  365. rebuildConfigTabs();
  366. #if JUCE_MAC || JUCE_WINDOWS
  367. openProjectButton.setCommandToTrigger (commandManager, CommandIDs::openInIDE, true);
  368. openProjectButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::openInIDE));
  369. saveAndOpenButton.setCommandToTrigger (commandManager, CommandIDs::saveAndOpenInIDE, true);
  370. saveAndOpenButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::saveAndOpenInIDE));
  371. #else
  372. openProjectButton.setVisible (false);
  373. saveAndOpenButton.setVisible (false);
  374. #endif
  375. //[/UserPreSize]
  376. setSize (836, 427);
  377. //[Constructor] You can add your own custom stuff here..
  378. configTabBox.setOutline (1);
  379. configTabBox.setColour (TabbedComponent::outlineColourId, Colours::black.withAlpha (0.3f));
  380. editConfigsButton.setTriggeredOnMouseDown (true);
  381. project.addChangeListener (this);
  382. //[/Constructor]
  383. }
  384. ProjectInformationComponent::~ProjectInformationComponent()
  385. {
  386. //[Destructor_pre]. You can add your own custom destruction code here..
  387. project.removeChangeListener (this);
  388. //[/Destructor_pre]
  389. //[Destructor]. You can add your own custom destruction code here..
  390. //[/Destructor]
  391. }
  392. //==============================================================================
  393. void ProjectInformationComponent::resized()
  394. {
  395. //[Userresized_Pre]
  396. //[/Userresized_Pre]
  397. //[Userresized_Post]
  398. //[/Userresized_Post]
  399. }
  400. void ProjectInformationComponent::buttonClicked (Button* buttonThatWasClicked)
  401. {
  402. //[UserbuttonClicked_Pre]
  403. //[/UserbuttonClicked_Pre]
  404. if (buttonThatWasClicked == &editConfigsButton)
  405. {
  406. //[UserButtonCode_b6625dfcdb1f4755] -- add your button handler code here..
  407. showConfigMenu();
  408. //[/UserButtonCode_b6625dfcdb1f4755]
  409. }
  410. else if (buttonThatWasClicked == &openProjectButton)
  411. {
  412. //[UserButtonCode_a550a652e2666ee7] -- add your button handler code here..
  413. //[/UserButtonCode_a550a652e2666ee7]
  414. }
  415. else if (buttonThatWasClicked == &editExportersButton)
  416. {
  417. //[UserButtonCode_c1f6e5f9811b307e] -- add your button handler code here..
  418. showExporterMenu();
  419. //[/UserButtonCode_c1f6e5f9811b307e]
  420. }
  421. else if (buttonThatWasClicked == &saveAndOpenButton)
  422. {
  423. //[UserButtonCode_dRGMyYx] -- add your button handler code here..
  424. //[/UserButtonCode_dRGMyYx]
  425. }
  426. //[UserbuttonClicked_Post]
  427. //[/UserbuttonClicked_Post]
  428. }
  429. void ProjectInformationComponent::paint (Graphics& g)
  430. {
  431. //[UserPaint] Add your own custom painting code here..
  432. g.setTiledImageFill (ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize),
  433. 0, 0, 1.0f);
  434. g.fillAll();
  435. drawRecessedShadows (g, getWidth(), getHeight(), 14);
  436. //[/UserPaint]
  437. }
  438. //[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
  439. void ProjectInformationComponent::rebuildConfigTabs()
  440. {
  441. configTabBox.clearTabs();
  442. configTabBox.addTab ("Project Settings", Colours::lightslategrey, new ProjectTab (project), true, -1);
  443. configTabBox.addTab ("Modules", Colours::lightblue, new ModulesPanel (project), true, -1);
  444. int i;
  445. for (i = 0; i < project.getNumConfigurations(); ++i)
  446. {
  447. Component* panel = new ConfigTab (project, i);
  448. Project::BuildConfiguration config (project.getConfiguration (i));
  449. configTabBox.addTab (config.getName().toString(), Colour::greyLevel (0.65f), panel, true, -1);
  450. }
  451. for (i = 0; i < project.getNumExporters(); ++i)
  452. {
  453. ScopedPointer <ProjectExporter> exp (project.createExporter (i));
  454. if (exp != nullptr)
  455. {
  456. Component* panel = new ExportTab (project, i);
  457. configTabBox.addTab (exp->getName(), Colours::lightsteelblue, panel, true, -1);
  458. }
  459. }
  460. lastProjectType = project.getProjectTypeValue().getValue();
  461. }
  462. void ProjectInformationComponent::updateConfigTabs()
  463. {
  464. if (configTabBox.getNumTabs() != project.getNumConfigurations() + project.getNumExporters() + 2
  465. || lastProjectType != project.getProjectTypeValue().getValue())
  466. {
  467. rebuildConfigTabs();
  468. }
  469. else
  470. {
  471. for (int i = 0; i < project.getNumConfigurations(); ++i)
  472. {
  473. Project::BuildConfiguration config (project.getConfiguration (i));
  474. configTabBox.setTabName (i + 2, config.getName().toString());
  475. }
  476. }
  477. }
  478. void ProjectInformationComponent::showConfigMenu()
  479. {
  480. PopupMenu m;
  481. m.addItem (1, "Add a new empty configuration");
  482. PopupMenu createCopyMenu, removeMenu;
  483. for (int i = 0; i < project.getNumConfigurations(); ++i)
  484. {
  485. Project::BuildConfiguration config (project.getConfiguration (i));
  486. createCopyMenu.addItem (i + 10000, "Create a copy of '" + config.getName().toString() + "'");
  487. removeMenu.addItem (i + 20000, "Delete configuration '" + config.getName().toString() + "'");
  488. }
  489. m.addSubMenu ("Add a copy of an existing configuration", createCopyMenu);
  490. m.addSubMenu ("Remove configuration", removeMenu);
  491. const int r = m.showAt (&editConfigsButton);
  492. if (r >= 20000)
  493. {
  494. project.deleteConfiguration (r - 20000);
  495. }
  496. else if (r >= 10000)
  497. {
  498. Project::BuildConfiguration configToCopy (project.getConfiguration (r - 10000));
  499. project.addNewConfiguration (&configToCopy);
  500. }
  501. else if (r == 1)
  502. {
  503. project.addNewConfiguration (nullptr);
  504. }
  505. }
  506. void ProjectInformationComponent::showExporterMenu()
  507. {
  508. PopupMenu m;
  509. PopupMenu createMenu, removeMenu;
  510. int i;
  511. for (i = 0; i < project.getNumExporters(); ++i)
  512. {
  513. ScopedPointer<ProjectExporter> exp (project.createExporter (i));
  514. if (exp != nullptr)
  515. removeMenu.addItem (i + 20000, "Delete " + exp->getName());
  516. }
  517. StringArray exporters (ProjectExporter::getExporterNames());
  518. for (i = 0; i < exporters.size(); ++i)
  519. createMenu.addItem (i + 10000, "Create a new " + exporters[i] + " target");
  520. m.addSubMenu ("Create new export target", createMenu);
  521. m.addSubMenu ("Remove export target", removeMenu);
  522. const int r = m.showAt (&editExportersButton);
  523. if (r >= 20000)
  524. project.deleteExporter (r - 20000);
  525. else if (r >= 10000)
  526. project.addNewExporter (exporters [r - 10000]);
  527. }
  528. void ProjectInformationComponent::changeListenerCallback (ChangeBroadcaster*)
  529. {
  530. updateConfigTabs();
  531. }
  532. //[/MiscUserCode]
  533. //==============================================================================
  534. //======================= Jucer Information Section ==========================
  535. //==============================================================================
  536. #if 0
  537. /* This section stores the Jucer's metadata - edit it at your own risk!
  538. JUCER_COMPONENT_METADATA_START
  539. <COMPONENT id="tO9EG1a" className="ProjectInformationComponent" width="836"
  540. height="427" background="f6f9ff" parentClasses="public Component, public ChangeListener"
  541. constructorParams="Project&amp; project_" memberInitialisers="project (project_)">
  542. <COMPONENTS>
  543. <TABBEDCOMPONENT id="962c1575c4142253" memberName="configTabBox" focusOrder="0"
  544. position="8, 0, this.left + parent.width - 16, this.top + parent.height - 36"/>
  545. <TEXTBUTTON id="b6625dfcdb1f4755" memberName="editConfigsButton" focusOrder="0"
  546. text="Add/Remove Configurations..." createCallback="1" radioGroup="0"
  547. connectedLeft="0" connectedRight="0" connectedTop="0" connectedBottom="0"
  548. backgroundColour="" textColour="" backgroundColourOn="" textColourOn=""
  549. position="8, parent.height - 30, this.left + 192, this.top + 22"/>
  550. <TEXTBUTTON id="a550a652e2666ee7" memberName="openProjectButton" focusOrder="0"
  551. text="Open Project in " createCallback="1" radioGroup="0" connectedLeft="0"
  552. connectedRight="0" connectedTop="0" connectedBottom="0" backgroundColour=""
  553. textColour="" backgroundColourOn="" textColourOn="" position="608, parent.height - 30, this.left + 208, this.top + 22"/>
  554. <TEXTBUTTON id="c1f6e5f9811b307e" memberName="editExportersButton" focusOrder="0"
  555. text="Add/Remove Exporters..." createCallback="1" radioGroup="0"
  556. connectedLeft="0" connectedRight="0" connectedTop="0" connectedBottom="0"
  557. backgroundColour="" textColour="" backgroundColourOn="" textColourOn=""
  558. position="208, parent.height - 30, this.left + 160, this.top + 22"/>
  559. <TEXTBUTTON id="dRGMyYx" name="" memberName="saveAndOpenButton" position="391, parent.height - 30, this.left + 208, this.top + 22"
  560. text="Save And Open in" createCallback="1" radioGroup="0" connectedLeft="0"
  561. connectedRight="0" connectedTop="0" connectedBottom="0"/>
  562. </COMPONENTS>
  563. <MARKERS_X/>
  564. <MARKERS_Y/>
  565. <METHODS/>
  566. </COMPONENT>
  567. JUCER_COMPONENT_METADATA_END
  568. */
  569. #endif