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.

179 lines
5.7KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2017 - ROLI Ltd.
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 5 End-User License
  8. Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
  9. 27th April 2017).
  10. End User License Agreement: www.juce.com/juce-5-licence
  11. Privacy Policy: www.juce.com/juce-5-privacy-policy
  12. Or: You may also use this code under the terms of the GPL v3 (see
  13. www.gnu.org/licenses).
  14. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  15. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  16. DISCLAIMED.
  17. ==============================================================================
  18. */
  19. #include "../JuceDemoHeader.h"
  20. //==============================================================================
  21. class CodeEditorDemo : public Component,
  22. private FilenameComponentListener
  23. {
  24. public:
  25. CodeEditorDemo()
  26. : fileChooser ("File", File(), true, false, false,
  27. "*.cpp;*.h;*.hpp;*.c;*.mm;*.m", String(),
  28. "Choose a C++ file to open it in the editor")
  29. {
  30. setOpaque (true);
  31. // Create the editor..
  32. addAndMakeVisible (editor = new CodeEditorComponent (codeDocument, &cppTokeniser));
  33. editor->loadContent ("\n"
  34. "/* Code editor demo!\n"
  35. "\n"
  36. " To see a real-world example of the code editor\n"
  37. " in action, have a look at the Projucer!\n"
  38. "\n"
  39. "*/\n"
  40. "\n");
  41. // Create a file chooser control to load files into it..
  42. addAndMakeVisible (fileChooser);
  43. fileChooser.addListener (this);
  44. lookAndFeelChanged();
  45. }
  46. ~CodeEditorDemo()
  47. {
  48. fileChooser.removeListener (this);
  49. }
  50. void paint (Graphics& g) override
  51. {
  52. g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground,
  53. Colours::lightgrey));
  54. }
  55. void resized() override
  56. {
  57. Rectangle<int> r (getLocalBounds().reduced (8));
  58. fileChooser.setBounds (r.removeFromTop (25));
  59. editor->setBounds (r.withTrimmedTop (8));
  60. }
  61. private:
  62. // this is the document that the editor component is showing
  63. CodeDocument codeDocument;
  64. // this is a tokeniser to apply the C++ syntax highlighting
  65. CPlusPlusCodeTokeniser cppTokeniser;
  66. // the editor component
  67. ScopedPointer<CodeEditorComponent> editor;
  68. FilenameComponent fileChooser;
  69. void filenameComponentChanged (FilenameComponent*) override
  70. {
  71. editor->loadContent (fileChooser.getCurrentFile().loadFileAsString());
  72. }
  73. void lookAndFeelChanged() override
  74. {
  75. if (auto* v4 = dynamic_cast<LookAndFeel_V4*> (&LookAndFeel::getDefaultLookAndFeel()))
  76. {
  77. auto useLight = v4->getCurrentColourScheme() == LookAndFeel_V4::getLightColourScheme();
  78. editor->setColourScheme (useLight ? getLightCodeEditorColourScheme()
  79. : getDarkCodeEditorColourScheme());
  80. }
  81. else
  82. {
  83. editor->setColourScheme (cppTokeniser.getDefaultColourScheme());
  84. }
  85. }
  86. CodeEditorComponent::ColourScheme getDarkCodeEditorColourScheme()
  87. {
  88. struct Type
  89. {
  90. const char* name;
  91. juce::uint32 colour;
  92. };
  93. const Type types[] =
  94. {
  95. { "Error", 0xffe60000 },
  96. { "Comment", 0xff72d20c },
  97. { "Keyword", 0xffee6f6f },
  98. { "Operator", 0xffc4eb19 },
  99. { "Identifier", 0xffcfcfcf },
  100. { "Integer", 0xff42c8c4 },
  101. { "Float", 0xff885500 },
  102. { "String", 0xffbc45dd },
  103. { "Bracket", 0xff058202 },
  104. { "Punctuation", 0xffcfbeff },
  105. { "Preprocessor Text", 0xfff8f631 }
  106. };
  107. CodeEditorComponent::ColourScheme cs;
  108. for (auto& t : types)
  109. cs.set (t.name, Colour (t.colour));
  110. return cs;
  111. }
  112. CodeEditorComponent::ColourScheme getLightCodeEditorColourScheme()
  113. {
  114. struct Type
  115. {
  116. const char* name;
  117. juce::uint32 colour;
  118. };
  119. const Type types[] =
  120. {
  121. { "Error", 0xffcc0000 },
  122. { "Comment", 0xff00aa00 },
  123. { "Keyword", 0xff0000cc },
  124. { "Operator", 0xff225500 },
  125. { "Identifier", 0xff000000 },
  126. { "Integer", 0xff880000 },
  127. { "Float", 0xff885500 },
  128. { "String", 0xff990099 },
  129. { "Bracket", 0xff000055 },
  130. { "Punctuation", 0xff004400 },
  131. { "Preprocessor Text", 0xff660000 }
  132. };
  133. CodeEditorComponent::ColourScheme cs;
  134. for (auto& t : types)
  135. cs.set (t.name, Colour (t.colour));
  136. return cs;
  137. }
  138. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CodeEditorDemo)
  139. };
  140. // This static object will register this demo type in a global list of demos..
  141. static JuceDemoType<CodeEditorDemo> demo ("10 Components: Code Editor");