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.

684 lines
24KB

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