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.

695 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. //[/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, ModuleList& moduleList, const ModuleList::Module& m)
  85. {
  86. StringArray dependencies, extraDepsNeeded;
  87. moduleList.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_, ModuleList& moduleList_, const String& moduleID_)
  98. : PanelBase (project_), moduleList (moduleList_), 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.loadModule (moduleID));
  105. if (module != nullptr)
  106. {
  107. props.add (new ModuleInfoComponent (project, moduleList, moduleID));
  108. if (project.isModuleEnabled (moduleID))
  109. {
  110. const ModuleList::Module* m = moduleList.findModuleInfo (moduleID);
  111. if (m != nullptr && getExtraDependenciesNeeded (project, moduleList, *m).size() > 0)
  112. props.add (new MissingDependenciesComponent (project, moduleList, 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. ModuleList& moduleList;
  146. String moduleID;
  147. //==============================================================================
  148. class ModuleInfoComponent : public PropertyComponent
  149. {
  150. public:
  151. ModuleInfoComponent (Project& project_, ModuleList& moduleList_, const String& moduleID_)
  152. : PropertyComponent ("Module", 100),
  153. project (project_), moduleList (moduleList_), moduleID (moduleID_)
  154. {
  155. }
  156. void refresh() {}
  157. void paint (Graphics& g)
  158. {
  159. g.setColour (Colours::white.withAlpha (0.4f));
  160. g.fillRect (0, 0, getWidth(), getHeight() - 1);
  161. const ModuleList::Module* module = moduleList.findModuleInfo (moduleID);
  162. if (module != nullptr)
  163. {
  164. String text;
  165. text << module->name << newLine << newLine
  166. << module->description;
  167. GlyphArrangement ga;
  168. ga.addJustifiedText (Font (13.0f), text, 4.0f, 16.0f, getWidth() - 8.0f, Justification::topLeft);
  169. g.setColour (Colours::black);
  170. ga.draw (g);
  171. }
  172. }
  173. private:
  174. Project& project;
  175. ModuleList& moduleList;
  176. String moduleID;
  177. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleInfoComponent);
  178. };
  179. //==============================================================================
  180. class MissingDependenciesComponent : public PropertyComponent,
  181. public Button::Listener
  182. {
  183. public:
  184. MissingDependenciesComponent (Project& project_, ModuleList& moduleList_, const String& moduleID_)
  185. : PropertyComponent ("Dependencies", 100),
  186. project (project_), moduleList (moduleList_), moduleID (moduleID_),
  187. fixButton ("Enable Required Modules")
  188. {
  189. const ModuleList::Module* module = moduleList.findModuleInfo (moduleID);
  190. if (module != nullptr)
  191. missingDependencies = getExtraDependenciesNeeded (project, moduleList, *module);
  192. addAndMakeVisible (&fixButton);
  193. fixButton.setColour (TextButton::buttonColourId, Colours::red);
  194. fixButton.setColour (TextButton::textColourOffId, Colours::white);
  195. fixButton.setBounds ("right - 160, parent.height - 26, parent.width - 8, top + 22");
  196. fixButton.addListener (this);
  197. }
  198. void refresh() {}
  199. void paint (Graphics& g)
  200. {
  201. g.setColour (Colours::white.withAlpha (0.4f));
  202. g.fillRect (0, 0, getWidth(), getHeight() - 1);
  203. String text ("This module requires the following dependencies:\n");
  204. text << missingDependencies.joinIntoString (", ");
  205. GlyphArrangement ga;
  206. ga.addJustifiedText (Font (13.0f), text, 4.0f, 16.0f, getWidth() - 8.0f, Justification::topLeft);
  207. g.setColour (Colours::red);
  208. ga.draw (g);
  209. }
  210. void buttonClicked (Button*);
  211. private:
  212. Project& project;
  213. ModuleList& moduleList;
  214. String moduleID;
  215. StringArray missingDependencies;
  216. TextButton fixButton;
  217. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MissingDependenciesComponent);
  218. };
  219. };
  220. //==============================================================================
  221. class ModulesPanel : public Component,
  222. public ListBoxModel
  223. {
  224. public:
  225. ModulesPanel (Project& project_)
  226. : project (project_)
  227. {
  228. modulesList.setModel (this);
  229. modulesList.setColour (ListBox::backgroundColourId, Colours::white.withAlpha (0.4f));
  230. addAndMakeVisible (&modulesList);
  231. modulesList.setBounds ("4, 3, parent.width / 2 - 4, parent.height - 3");
  232. }
  233. int getNumRows()
  234. {
  235. return moduleList.modules.size();
  236. }
  237. void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected)
  238. {
  239. if (rowIsSelected)
  240. g.fillAll (findColour (TextEditor::highlightColourId));
  241. const ModuleList::Module* const m = moduleList.modules [rowNumber];
  242. if (m != nullptr)
  243. {
  244. const float tickSize = height * 0.7f;
  245. getLookAndFeel().drawTickBox (g, *this, (height - tickSize) / 2, (height - tickSize) / 2, tickSize, tickSize,
  246. project.isModuleEnabled (m->uid), true, false, false);
  247. if (project.isModuleEnabled (m->uid) && getExtraDependenciesNeeded (project, moduleList, *m).size() > 0)
  248. g.setColour (Colours::red);
  249. else
  250. g.setColour (Colours::black);
  251. g.setFont (height * 0.7f, Font::bold);
  252. g.drawFittedText (m->uid, height, 0, 200, height, Justification::centredLeft, 1);
  253. g.setFont (height * 0.55f, Font::italic);
  254. g.drawText (m->name, height + 200, 0, width - height - 200, height, Justification::centredLeft, true);
  255. }
  256. }
  257. void flipRow (int row)
  258. {
  259. const ModuleList::Module* const m = moduleList.modules [row];
  260. if (m != nullptr)
  261. {
  262. if (project.isModuleEnabled (m->uid))
  263. {
  264. project.removeModule (m->uid);
  265. }
  266. else
  267. {
  268. const StringArray extraDepsNeeded (getExtraDependenciesNeeded (project, moduleList, *m));
  269. /* if (extraDepsNeeded.size() > 0)
  270. {
  271. if (AlertWindow::showOkCancelBox (AlertWindow::NoIcon,
  272. "Module Dependencies",
  273. "The '" + m->uid + "' module requires the following dependencies:\n"
  274. + extraDepsNeeded.joinIntoString (", ") + "\n\nDo you want to add all these to your project?"))
  275. {
  276. project.addModule (m->uid);
  277. for (int i = extraDepsNeeded.size(); --i >= 0;)
  278. project.addModule (extraDepsNeeded[i]);
  279. }
  280. }
  281. else*/
  282. {
  283. project.addModule (m->uid);
  284. }
  285. }
  286. }
  287. refresh();
  288. }
  289. void listBoxItemClicked (int row, const MouseEvent& e)
  290. {
  291. if (e.x < modulesList.getRowHeight())
  292. flipRow (row);
  293. }
  294. void listBoxItemDoubleClicked (int row, const MouseEvent& e)
  295. {
  296. flipRow (row);
  297. }
  298. void returnKeyPressed (int row)
  299. {
  300. flipRow (row);
  301. }
  302. void selectedRowsChanged (int lastRowSelected)
  303. {
  304. const ModuleList::Module* const m = moduleList.modules [lastRowSelected];
  305. settings = nullptr;
  306. if (m != nullptr)
  307. addAndMakeVisible (settings = new ModuleSettingsPanel (project, moduleList, m->uid));
  308. }
  309. void refresh()
  310. {
  311. modulesList.repaint();
  312. if (settings != nullptr)
  313. settings->refreshAll();
  314. }
  315. private:
  316. Project& project;
  317. ModuleList moduleList;
  318. ListBox modulesList;
  319. ScopedPointer<ModuleSettingsPanel> settings;
  320. };
  321. void ModuleSettingsPanel::MissingDependenciesComponent::buttonClicked (Button*)
  322. {
  323. for (int i = missingDependencies.size(); --i >= 0;)
  324. project.addModule (missingDependencies[i]);
  325. ModulesPanel* mp = findParentComponentOfClass ((ModulesPanel*) 0);
  326. if (mp != nullptr)
  327. mp->refresh();
  328. }
  329. //[/MiscUserDefs]
  330. //==============================================================================
  331. ProjectInformationComponent::ProjectInformationComponent (Project& project_)
  332. : project (project_),
  333. configTabBox (TabbedButtonBar::TabsAtTop)
  334. {
  335. addAndMakeVisible (&configTabBox);
  336. configTabBox.setBounds ("8, 0, this.left + parent.width - 16, this.top + parent.height - 36");
  337. addAndMakeVisible (&editConfigsButton);
  338. editConfigsButton.setBounds ("8, parent.height - 30, this.left + 192, this.top + 22");
  339. editConfigsButton.setButtonText ("Add/Remove Configurations...");
  340. editConfigsButton.addListener (this);
  341. addAndMakeVisible (&openProjectButton);
  342. openProjectButton.setBounds ("608, parent.height - 30, this.left + 208, this.top + 22");
  343. openProjectButton.setButtonText ("Open Project in ");
  344. openProjectButton.addListener (this);
  345. addAndMakeVisible (&editExportersButton);
  346. editExportersButton.setBounds ("208, parent.height - 30, this.left + 160, this.top + 22");
  347. editExportersButton.setButtonText ("Add/Remove Exporters...");
  348. editExportersButton.addListener (this);
  349. addAndMakeVisible (&saveAndOpenButton);
  350. saveAndOpenButton.setBounds ("391, parent.height - 30, this.left + 208, this.top + 22");
  351. saveAndOpenButton.setButtonText ("Save And Open in");
  352. saveAndOpenButton.addListener (this);
  353. //[UserPreSize]
  354. rebuildConfigTabs();
  355. #if JUCE_MAC || JUCE_WINDOWS
  356. openProjectButton.setCommandToTrigger (commandManager, CommandIDs::openInIDE, true);
  357. openProjectButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::openInIDE));
  358. saveAndOpenButton.setCommandToTrigger (commandManager, CommandIDs::saveAndOpenInIDE, true);
  359. saveAndOpenButton.setButtonText (commandManager->getNameOfCommand (CommandIDs::saveAndOpenInIDE));
  360. #else
  361. openProjectButton.setVisible (false);
  362. saveAndOpenButton.setVisible (false);
  363. #endif
  364. //[/UserPreSize]
  365. setSize (836, 427);
  366. //[Constructor] You can add your own custom stuff here..
  367. configTabBox.setOutline (1);
  368. configTabBox.setColour (TabbedComponent::outlineColourId, Colours::black.withAlpha (0.3f));
  369. editConfigsButton.setTriggeredOnMouseDown (true);
  370. project.addChangeListener (this);
  371. //[/Constructor]
  372. }
  373. ProjectInformationComponent::~ProjectInformationComponent()
  374. {
  375. //[Destructor_pre]. You can add your own custom destruction code here..
  376. project.removeChangeListener (this);
  377. //[/Destructor_pre]
  378. //[Destructor]. You can add your own custom destruction code here..
  379. //[/Destructor]
  380. }
  381. //==============================================================================
  382. void ProjectInformationComponent::resized()
  383. {
  384. //[Userresized_Pre]
  385. //[/Userresized_Pre]
  386. //[Userresized_Post]
  387. //[/Userresized_Post]
  388. }
  389. void ProjectInformationComponent::buttonClicked (Button* buttonThatWasClicked)
  390. {
  391. //[UserbuttonClicked_Pre]
  392. //[/UserbuttonClicked_Pre]
  393. if (buttonThatWasClicked == &editConfigsButton)
  394. {
  395. //[UserButtonCode_b6625dfcdb1f4755] -- add your button handler code here..
  396. showConfigMenu();
  397. //[/UserButtonCode_b6625dfcdb1f4755]
  398. }
  399. else if (buttonThatWasClicked == &openProjectButton)
  400. {
  401. //[UserButtonCode_a550a652e2666ee7] -- add your button handler code here..
  402. //[/UserButtonCode_a550a652e2666ee7]
  403. }
  404. else if (buttonThatWasClicked == &editExportersButton)
  405. {
  406. //[UserButtonCode_c1f6e5f9811b307e] -- add your button handler code here..
  407. showExporterMenu();
  408. //[/UserButtonCode_c1f6e5f9811b307e]
  409. }
  410. else if (buttonThatWasClicked == &saveAndOpenButton)
  411. {
  412. //[UserButtonCode_dRGMyYx] -- add your button handler code here..
  413. //[/UserButtonCode_dRGMyYx]
  414. }
  415. //[UserbuttonClicked_Post]
  416. //[/UserbuttonClicked_Post]
  417. }
  418. void ProjectInformationComponent::paint (Graphics& g)
  419. {
  420. //[UserPaint] Add your own custom painting code here..
  421. g.setTiledImageFill (ImageCache::getFromMemory (BinaryData::brushed_aluminium_png, BinaryData::brushed_aluminium_pngSize),
  422. 0, 0, 1.0f);
  423. g.fillAll();
  424. drawRecessedShadows (g, getWidth(), getHeight(), 14);
  425. //[/UserPaint]
  426. }
  427. //[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
  428. void ProjectInformationComponent::rebuildConfigTabs()
  429. {
  430. configTabBox.clearTabs();
  431. configTabBox.addTab ("Project Settings", Colours::lightslategrey, new ProjectTab (project), true, -1);
  432. configTabBox.addTab ("Modules", Colours::lightblue, new ModulesPanel (project), true, -1);
  433. int i;
  434. for (i = 0; i < project.getNumConfigurations(); ++i)
  435. {
  436. Component* panel = new ConfigTab (project, i);
  437. Project::BuildConfiguration config (project.getConfiguration (i));
  438. configTabBox.addTab (config.getName().toString(), Colour::greyLevel (0.65f), panel, true, -1);
  439. }
  440. for (i = 0; i < project.getNumExporters(); ++i)
  441. {
  442. ScopedPointer <ProjectExporter> exp (project.createExporter (i));
  443. if (exp != nullptr)
  444. {
  445. Component* panel = new ExportTab (project, i);
  446. configTabBox.addTab (exp->getName(), Colours::lightsteelblue, panel, true, -1);
  447. }
  448. }
  449. lastProjectType = project.getProjectTypeValue().getValue();
  450. }
  451. void ProjectInformationComponent::updateConfigTabs()
  452. {
  453. if (configTabBox.getNumTabs() != project.getNumConfigurations() + project.getNumExporters() + 2
  454. || lastProjectType != project.getProjectTypeValue().getValue())
  455. {
  456. rebuildConfigTabs();
  457. }
  458. else
  459. {
  460. for (int i = 0; i < project.getNumConfigurations(); ++i)
  461. {
  462. Project::BuildConfiguration config (project.getConfiguration (i));
  463. configTabBox.setTabName (i + 2, config.getName().toString());
  464. }
  465. }
  466. }
  467. void ProjectInformationComponent::showConfigMenu()
  468. {
  469. PopupMenu m;
  470. m.addItem (1, "Add a new empty configuration");
  471. PopupMenu createCopyMenu, removeMenu;
  472. for (int i = 0; i < project.getNumConfigurations(); ++i)
  473. {
  474. Project::BuildConfiguration config (project.getConfiguration (i));
  475. createCopyMenu.addItem (i + 10000, "Create a copy of '" + config.getName().toString() + "'");
  476. removeMenu.addItem (i + 20000, "Delete configuration '" + config.getName().toString() + "'");
  477. }
  478. m.addSubMenu ("Add a copy of an existing configuration", createCopyMenu);
  479. m.addSubMenu ("Remove configuration", removeMenu);
  480. const int r = m.showAt (&editConfigsButton);
  481. if (r >= 20000)
  482. {
  483. project.deleteConfiguration (r - 20000);
  484. }
  485. else if (r >= 10000)
  486. {
  487. Project::BuildConfiguration configToCopy (project.getConfiguration (r - 10000));
  488. project.addNewConfiguration (&configToCopy);
  489. }
  490. else if (r == 1)
  491. {
  492. project.addNewConfiguration (nullptr);
  493. }
  494. }
  495. void ProjectInformationComponent::showExporterMenu()
  496. {
  497. PopupMenu m;
  498. PopupMenu createMenu, removeMenu;
  499. int i;
  500. for (i = 0; i < project.getNumExporters(); ++i)
  501. {
  502. ScopedPointer<ProjectExporter> exp (project.createExporter (i));
  503. if (exp != nullptr)
  504. removeMenu.addItem (i + 20000, "Delete " + exp->getName());
  505. }
  506. StringArray exporters (ProjectExporter::getExporterNames());
  507. for (i = 0; i < exporters.size(); ++i)
  508. createMenu.addItem (i + 10000, "Create a new " + exporters[i] + " target");
  509. m.addSubMenu ("Create new export target", createMenu);
  510. m.addSubMenu ("Remove export target", removeMenu);
  511. const int r = m.showAt (&editExportersButton);
  512. if (r >= 20000)
  513. project.deleteExporter (r - 20000);
  514. else if (r >= 10000)
  515. project.addNewExporter (exporters [r - 10000]);
  516. }
  517. void ProjectInformationComponent::changeListenerCallback (ChangeBroadcaster*)
  518. {
  519. updateConfigTabs();
  520. }
  521. //[/MiscUserCode]
  522. //==============================================================================
  523. //======================= Jucer Information Section ==========================
  524. //==============================================================================
  525. #if 0
  526. /* This section stores the Jucer's metadata - edit it at your own risk!
  527. JUCER_COMPONENT_METADATA_START
  528. <COMPONENT id="tO9EG1a" className="ProjectInformationComponent" width="836"
  529. height="427" background="f6f9ff" parentClasses="public Component, public ChangeListener"
  530. constructorParams="Project&amp; project_" memberInitialisers="project (project_)">
  531. <COMPONENTS>
  532. <TABBEDCOMPONENT id="962c1575c4142253" memberName="configTabBox" focusOrder="0"
  533. position="8, 0, this.left + parent.width - 16, this.top + parent.height - 36"/>
  534. <TEXTBUTTON id="b6625dfcdb1f4755" memberName="editConfigsButton" focusOrder="0"
  535. text="Add/Remove Configurations..." createCallback="1" radioGroup="0"
  536. connectedLeft="0" connectedRight="0" connectedTop="0" connectedBottom="0"
  537. backgroundColour="" textColour="" backgroundColourOn="" textColourOn=""
  538. position="8, parent.height - 30, this.left + 192, this.top + 22"/>
  539. <TEXTBUTTON id="a550a652e2666ee7" memberName="openProjectButton" focusOrder="0"
  540. text="Open Project in " createCallback="1" radioGroup="0" connectedLeft="0"
  541. connectedRight="0" connectedTop="0" connectedBottom="0" backgroundColour=""
  542. textColour="" backgroundColourOn="" textColourOn="" position="608, parent.height - 30, this.left + 208, this.top + 22"/>
  543. <TEXTBUTTON id="c1f6e5f9811b307e" memberName="editExportersButton" focusOrder="0"
  544. text="Add/Remove Exporters..." createCallback="1" radioGroup="0"
  545. connectedLeft="0" connectedRight="0" connectedTop="0" connectedBottom="0"
  546. backgroundColour="" textColour="" backgroundColourOn="" textColourOn=""
  547. position="208, parent.height - 30, this.left + 160, this.top + 22"/>
  548. <TEXTBUTTON id="dRGMyYx" name="" memberName="saveAndOpenButton" position="391, parent.height - 30, this.left + 208, this.top + 22"
  549. text="Save And Open in" createCallback="1" radioGroup="0" connectedLeft="0"
  550. connectedRight="0" connectedTop="0" connectedBottom="0"/>
  551. </COMPONENTS>
  552. <MARKERS_X/>
  553. <MARKERS_Y/>
  554. <METHODS/>
  555. </COMPONENT>
  556. JUCER_COMPONENT_METADATA_END
  557. */
  558. #endif