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.

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