| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library - "Jules' Utility Class Extensions"
 -    Copyright 2004-12 by Raw Material Software Ltd.
 - 
 -   ------------------------------------------------------------------------------
 - 
 -    JUCE can be redistributed and/or modified under the terms of the GNU General
 -    Public License (Version 2), as published by the Free Software Foundation.
 -    A copy of the license is included in the JUCE distribution, or can be found
 -    online at www.gnu.org/licenses.
 - 
 -    JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
 -    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 -    A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 - 
 -   ------------------------------------------------------------------------------
 - 
 -    To release a closed-source product which uses JUCE, commercial licenses are
 -    available: visit www.rawmaterialsoftware.com/juce for more information.
 - 
 -   ==============================================================================
 - */
 - 
 - #include "../JuceDemoHeader.h"
 - 
 - //==============================================================================
 - /** The Note class contains text editor used to display and edit the note's contents and will
 -     also listen to changes in the text and mark the FileBasedDocument as 'dirty'. This 'dirty'
 -     flag is used to promt the user to save the note when it is closed.
 -  */
 - class Note    : public Component,
 -                 public FileBasedDocument,
 -                 private TextEditor::Listener
 - {
 - public:
 -     Note (const String& name, const String& contents)
 -         : FileBasedDocument (".jnote", "*.jnote",
 -                              "Browse for note to load",
 -                              "Choose file to save note to"),
 -           textValueObject (contents)
 -     {
 -         // we need to use an separate Value object as our text source so it doesn't get marked
 -         // as changed immediately
 -         setName (name);
 - 
 -         editor.setMultiLine (true);
 -         editor.setReturnKeyStartsNewLine (true);
 -         editor.getTextValue().referTo (textValueObject);
 -         addAndMakeVisible (editor);
 -         editor.addListener (this);
 -     }
 - 
 -     ~Note()
 -     {
 -         editor.removeListener (this);
 -     }
 - 
 -     void resized() override
 -     {
 -         editor.setBounds (getLocalBounds());
 -     }
 - 
 -     String getDocumentTitle() override
 -     {
 -         return getName();
 -     }
 - 
 -     Result loadDocument (const File& file) override
 -     {
 -         editor.setText (file.loadFileAsString());
 -         return Result::ok();
 -     }
 - 
 -     Result saveDocument (const File& file) override
 -     {
 -         // attempt to save the contents into the given file
 -         FileOutputStream os (file);
 - 
 -         if (os.openedOk())
 -             os.writeText (editor.getText(), false, false);
 - 
 -         return Result::ok();
 -     }
 - 
 -     File getLastDocumentOpened() override
 -     {
 -         // not interested in this for now
 -         return File::nonexistent;
 -     }
 - 
 -     void setLastDocumentOpened (const File& /*file*/) override
 -     {
 -         // not interested in this for now
 -     }
 - 
 -     File getSuggestedSaveAsFile (const File&)
 -     {
 -         return File::getSpecialLocation (File::userDesktopDirectory).getChildFile (getName()).withFileExtension ("jnote");
 -     }
 - 
 - private:
 -     Value textValueObject;
 -     TextEditor editor;
 - 
 -     void textEditorTextChanged (TextEditor& ed) override
 -     {
 -         // let our FileBasedDocument know we've changed
 -         if (&ed == &editor)
 -             changed();
 -     }
 - 
 -     void textEditorReturnKeyPressed (TextEditor&) override {}
 -     void textEditorEscapeKeyPressed (TextEditor&) override {}
 -     void textEditorFocusLost (TextEditor&) override {}
 - 
 -     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Note);
 - };
 - 
 - 
 - //==============================================================================
 - /** Simple MultiDocumentPanel that just tries to save our notes when they are closed.
 -  */
 - class DemoMultiDocumentPanel    : public MultiDocumentPanel
 - {
 - public:
 -     DemoMultiDocumentPanel()
 -     {
 -     }
 - 
 -     ~DemoMultiDocumentPanel()
 -     {
 -         closeAllDocuments (true);
 -     }
 - 
 -     bool tryToCloseDocument (Component* component) override
 -     {
 -        #if JUCE_MODAL_LOOPS_PERMITTED
 -         if (Note* note = dynamic_cast<Note*> (component))
 -             return note->saveIfNeededAndUserAgrees() != FileBasedDocument::failedToWriteToFile;
 -        #endif
 - 
 -         return true;
 -     }
 - 
 - private:
 -     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DemoMultiDocumentPanel);
 - };
 - 
 - //==============================================================================
 - /** Simple multi-document panel that manages a number of notes that you can store to files.
 -     By default this will look for notes saved to the desktop and load them up.
 -  */
 - class MDIDemo   : public Component,
 -                   public FileDragAndDropTarget,
 -                   private Button::Listener
 - {
 - public:
 -     MDIDemo()
 -     {
 -         setOpaque (true);
 - 
 -         showInTabsButton.setButtonText ("Show with tabs");
 -         showInTabsButton.setToggleState (false, dontSendNotification);
 -         showInTabsButton.addListener (this);
 -         addAndMakeVisible (showInTabsButton);
 - 
 -         addNoteButton.setButtonText ("Create a new note");
 -         addNoteButton.addListener (this);
 -         addAndMakeVisible (addNoteButton);
 - 
 -         addAndMakeVisible (multiDocumentPanel);
 -         multiDocumentPanel.setBackgroundColour (Colours::transparentBlack);
 - 
 -         updateLayoutMode();
 -         addNote ("Notes Demo", "You can drag-and-drop text files onto this page to open them as notes..");
 -         addExistingNotes();
 -     }
 - 
 -     ~MDIDemo()
 -     {
 -         addNoteButton.removeListener (this);
 -         showInTabsButton.removeListener (this);
 -     }
 - 
 -     void paint (Graphics& g) override
 -     {
 -         fillTiledBackground (g);
 -     }
 - 
 -     void resized() override
 -     {
 -         Rectangle<int> area (getLocalBounds());
 -         Rectangle<int> buttonArea (area.removeFromTop (28).reduced (2));
 -         addNoteButton.setBounds (buttonArea.removeFromRight (150));
 -         showInTabsButton.setBounds (buttonArea);
 - 
 -         multiDocumentPanel.setBounds (area);
 -     }
 - 
 -     bool isInterestedInFileDrag (const StringArray&) override
 -     {
 -         return true;
 -     }
 - 
 -     void filesDropped (const StringArray& filenames, int /* x */, int /* y */) override
 -     {
 -         Array<File> files;
 - 
 -         for (int i = 0; i < filenames.size(); ++i)
 -             files.add (File (filenames[i]));
 - 
 -         createNotesForFiles (files);
 -     }
 - 
 -     void createNotesForFiles (const Array<File>& files)
 -     {
 -         for (int i = 0; i < files.size(); ++i)
 -         {
 -             const File file (files[i]);
 - 
 -             String content = file.loadFileAsString();
 - 
 -             if (content.length() > 20000)
 -                 content = "Too long!";
 - 
 -             addNote (file.getFileName(), content);
 -         }
 -     }
 - 
 - private:
 -     ToggleButton showInTabsButton;
 -     TextButton addNoteButton;
 -     DemoMultiDocumentPanel multiDocumentPanel;
 - 
 -     void updateLayoutMode()
 -     {
 -         multiDocumentPanel.setLayoutMode (showInTabsButton.getToggleState() ? MultiDocumentPanel::MaximisedWindowsWithTabs
 -                                                                             : MultiDocumentPanel::FloatingWindows);
 -     }
 - 
 -     void addNote (const String& name, const String& content)
 -     {
 -         Note* newNote = new Note (name, content);
 -         newNote->setSize (200, 200);
 - 
 -         multiDocumentPanel.addDocument (newNote, Colours::lightblue.withAlpha (0.6f), true);
 -     }
 - 
 -     void addExistingNotes()
 -     {
 -         Array<File> files;
 -         File::getSpecialLocation (File::userDesktopDirectory).findChildFiles (files, File::findFiles, false, "*.jnote");
 -         createNotesForFiles (files);
 -     }
 - 
 -     void buttonClicked (Button* b) override
 -     {
 -         if (b == &showInTabsButton)
 -             updateLayoutMode();
 -         else if (b == &addNoteButton)
 -             addNote (String ("Note ") + String (multiDocumentPanel.getNumDocuments() + 1), "Hello World!");
 -     }
 - 
 -     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MDIDemo);
 - };
 - 
 - 
 - // This static object will register this demo type in a global list of demos..
 - static JuceDemoType<MDIDemo> demo ("10 Components: MDI");
 
 
  |