| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library.
 -    Copyright (c) 2017 - ROLI Ltd.
 - 
 -    JUCE is an open source library subject to commercial or open-source
 -    licensing.
 - 
 -    By using JUCE, you agree to the terms of both the JUCE 5 End-User License
 -    Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
 -    27th April 2017).
 - 
 -    End User License Agreement: www.juce.com/juce-5-licence
 -    Privacy Policy: www.juce.com/juce-5-privacy-policy
 - 
 -    Or: You may also use this code under the terms of the GPL v3 (see
 -    www.gnu.org/licenses).
 - 
 -    JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 -    EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 -    DISCLAIMED.
 - 
 -   ==============================================================================
 - */
 - 
 - #include "../JuceDemoHeader.h"
 - 
 - 
 - //==============================================================================
 - class FontsDemo  : public Component,
 -                    private ListBoxModel,
 -                    private Slider::Listener,
 -                    private Button::Listener,
 -                    private ComboBox::Listener
 - {
 - public:
 -     FontsDemo()
 -     {
 -         setOpaque (true);
 - 
 -         addAndMakeVisible (listBox);
 -         addAndMakeVisible (demoTextBox);
 -         addAndMakeVisible (heightSlider);
 -         addAndMakeVisible (heightLabel);
 -         addAndMakeVisible (kerningLabel);
 -         addAndMakeVisible (kerningSlider);
 -         addAndMakeVisible (scaleLabel);
 -         addAndMakeVisible (scaleSlider);
 -         addAndMakeVisible (boldToggle);
 -         addAndMakeVisible (italicToggle);
 -         addAndMakeVisible (styleBox);
 - 
 -         kerningLabel.attachToComponent (&kerningSlider, true);
 -         heightLabel.attachToComponent (&heightSlider, true);
 -         scaleLabel.attachToComponent (&scaleSlider, true);
 -         styleLabel.attachToComponent (&styleBox, true);
 - 
 -         heightSlider.addListener (this);
 -         kerningSlider.addListener (this);
 -         scaleSlider.addListener (this);
 -         boldToggle.addListener (this);
 -         italicToggle.addListener (this);
 -         styleBox.addListener (this);
 - 
 -         Font::findFonts (fonts);   // Generate the list of fonts
 - 
 -         listBox.setRowHeight (20);
 -         listBox.setModel (this);   // Tell the listbox where to get its data model
 -         listBox.setColour (ListBox::textColourId, Colours::black);
 -         listBox.setColour (ListBox::backgroundColourId, Colours::white);
 - 
 - 
 -         heightSlider.setRange (3.0, 150.0, 0.01);
 -         scaleSlider.setRange (0.2, 3.0, 0.01);
 -         kerningSlider.setRange (-2.0, 2.0, 0.01);
 - 
 -         scaleSlider.setValue (1.0);   // Set some initial values for the sliders.
 -         heightSlider.setValue (20.0);
 -         kerningSlider.setValue (0);
 - 
 -         // set up the layout and resizer bars..
 -         verticalLayout.setItemLayout (0, -0.2, -0.8, -0.35); // width of the font list must be
 -                                                              // between 20% and 80%, preferably 50%
 -         verticalLayout.setItemLayout (1, 8, 8, 8);           // the vertical divider drag-bar thing is always 8 pixels wide
 -         verticalLayout.setItemLayout (2, 150, -1.0, -0.65);  // the components on the right must be
 -                                                              // at least 150 pixels wide, preferably 50% of the total width
 - 
 -         verticalDividerBar = new StretchableLayoutResizerBar (&verticalLayout, 1, true);
 -         addAndMakeVisible (verticalDividerBar);
 - 
 -         // ..and pick a random font to select intially
 -         listBox.selectRow (Random::getSystemRandom().nextInt (fonts.size()));
 - 
 -         demoTextBox.setMultiLine (true);
 -         demoTextBox.setReturnKeyStartsNewLine (true);
 -         demoTextBox.setText ("Aa Bb Cc Dd Ee Ff Gg Hh Ii\n"
 -                              "Jj Kk Ll Mm Nn Oo Pp Qq Rr\n"
 -                              "Ss Tt Uu Vv Ww Xx Yy Zz\n"
 -                              "0123456789\n\n"
 -                              "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt "
 -                              "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco "
 -                              "laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in "
 -                              "voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat "
 -                              "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
 - 
 -         demoTextBox.setCaretPosition (0);
 -         demoTextBox.setColour (TextEditor::textColourId, Colours::black);
 -         demoTextBox.setColour (TextEditor::backgroundColourId, Colours::white);
 -     }
 - 
 -     //==============================================================================
 -     void paint (Graphics& g) override
 -     {
 -         g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground));
 -     }
 - 
 -     void resized() override
 -     {
 -         auto r = getLocalBounds().reduced (5);
 - 
 -         // lay out the list box and vertical divider..
 -         Component* vcomps[] = { &listBox, verticalDividerBar, nullptr };
 - 
 -         verticalLayout.layOutComponents (vcomps, 3,
 -                                          r.getX(), r.getY(), r.getWidth(), r.getHeight(),
 -                                          false,     // lay out side-by-side
 -                                          true);     // resize the components' heights as well as widths
 - 
 - 
 -         r.removeFromLeft (verticalDividerBar->getRight());
 - 
 -         styleBox.setBounds (r.removeFromBottom (26));
 -         r.removeFromBottom (8);
 - 
 -         const int labelWidth = 60;
 - 
 -         auto row = r.removeFromBottom (30);
 -         row.removeFromLeft (labelWidth);
 -         boldToggle.setBounds (row.removeFromLeft (row.getWidth() / 2));
 -         italicToggle.setBounds (row);
 - 
 -         r.removeFromBottom (8);
 -         scaleSlider.setBounds (r.removeFromBottom (30).withTrimmedLeft (labelWidth));
 -         r.removeFromBottom (8);
 -         kerningSlider.setBounds (r.removeFromBottom (30).withTrimmedLeft (labelWidth));
 -         r.removeFromBottom (8);
 -         heightSlider.setBounds (r.removeFromBottom (30).withTrimmedLeft (labelWidth));
 -         r.removeFromBottom (8);
 -         demoTextBox.setBounds (r);
 -     }
 - 
 -     void sliderValueChanged (Slider* sliderThatWasMoved) override
 -     {
 -         if (sliderThatWasMoved == &heightSlider)            refreshPreviewBoxFont();
 -         else if (sliderThatWasMoved == &kerningSlider)      refreshPreviewBoxFont();
 -         else if (sliderThatWasMoved == &scaleSlider)        refreshPreviewBoxFont();
 -     }
 - 
 -     void buttonClicked (Button* buttonThatWasClicked) override
 -     {
 -         if (buttonThatWasClicked == &boldToggle)            refreshPreviewBoxFont();
 -         else if (buttonThatWasClicked == &italicToggle)     refreshPreviewBoxFont();
 -     }
 - 
 -     // The following methods implement the ListBoxModel virtual methods:
 -     int getNumRows() override
 -     {
 -         return fonts.size();
 -     }
 - 
 -     void paintListBoxItem (int rowNumber, Graphics& g,
 -                            int width, int height, bool rowIsSelected) override
 -     {
 -         if (rowIsSelected)
 -             g.fillAll (Colours::lightblue);
 - 
 -         Font font (fonts[rowNumber]);
 - 
 -         AttributedString s;
 -         s.setWordWrap (AttributedString::none);
 -         s.setJustification (Justification::centredLeft);
 -         s.append (font.getTypefaceName(), font.withHeight (height * 0.7f), Colours::black);
 -         s.append ("   " + font.getTypefaceName(), Font (height * 0.5f, Font::italic), Colours::grey);
 - 
 -         s.draw (g, Rectangle<int> (width, height).expanded (-4, 50).toFloat());
 -     }
 - 
 -     void selectedRowsChanged (int /*lastRowselected*/) override
 -     {
 -         refreshPreviewBoxFont();
 -     }
 - 
 - private:
 -     Array<Font> fonts;
 -     StringArray currentStyleList;
 - 
 -     ListBox listBox;
 -     TextEditor demoTextBox;
 - 
 -     Label heightLabel {{}, "Height:" },
 -           kerningLabel {{}, "Kerning:" },
 -           scaleLabel { "Scale:" },
 -           styleLabel { "Style" };
 - 
 -     ToggleButton boldToggle { "Bold" },
 -                  italicToggle { "Italic" };
 - 
 -     Slider heightSlider, kerningSlider, scaleSlider;
 -     ComboBox styleBox;
 - 
 -     StretchableLayoutManager verticalLayout;
 -     ScopedPointer<StretchableLayoutResizerBar> verticalDividerBar;
 - 
 -     void refreshPreviewBoxFont()
 -     {
 -         const bool bold = boldToggle.getToggleState();
 -         const bool italic = italicToggle.getToggleState();
 -         const bool useStyle = ! (bold || italic);
 - 
 -         Font font (fonts [listBox.getSelectedRow()]);
 - 
 -         font = font.withPointHeight ((float) heightSlider.getValue())
 -                    .withExtraKerningFactor ((float) kerningSlider.getValue())
 -                    .withHorizontalScale ((float) scaleSlider.getValue());
 - 
 -         if (bold)    font = font.boldened();
 -         if (italic)  font = font.italicised();
 - 
 -         updateStylesList (font);
 - 
 -         styleBox.setEnabled (useStyle);
 - 
 -         if (useStyle)
 -             font = font.withTypefaceStyle (styleBox.getText());
 - 
 -         demoTextBox.applyFontToAllText (font);
 -     }
 - 
 -     void updateStylesList (const Font& newFont)
 -     {
 -         const StringArray newStyles (newFont.getAvailableStyles());
 - 
 -         if (newStyles != currentStyleList)
 -         {
 -             currentStyleList = newStyles;
 - 
 -             styleBox.clear();
 -             styleBox.addItemList (newStyles, 1);
 -             styleBox.setSelectedItemIndex (0);
 -         }
 -     }
 - 
 -     void comboBoxChanged (ComboBox* box) override
 -     {
 -         if (box == &styleBox)
 -             refreshPreviewBoxFont();
 -     }
 - 
 -     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FontsDemo)
 - };
 - 
 - 
 - // This static object will register this demo type in a global list of demos..
 - static JuceDemoType<FontsDemo> demo ("20 Graphics: Fonts");
 
 
  |