/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-9 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 "../jucedemo_headers.h" //============================================================================== // this is the listbox containing the draggable source components.. class DragAndDropDemoSource : public ListBox, public ListBoxModel { public: //============================================================================== DragAndDropDemoSource() : ListBox (T("d+d source"), 0) { // tells the ListBox that this object supplies the info about // its rows. setModel (this); setMultipleSelectionEnabled (true); } ~DragAndDropDemoSource() { } //============================================================================== // The following methods implement the necessary virtual functions from ListBoxModel, // telling the listbox how many rows there are, painting them, etc. int getNumRows() { return 30; } void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) { if (rowIsSelected) g.fillAll (Colours::lightblue); g.setColour (Colours::black); g.setFont (height * 0.7f); g.drawText (T("Row Number ") + String (rowNumber + 1), 5, 0, width, height, Justification::centredLeft, true); } const String getDragSourceDescription (const SparseSet& selectedRows) { // for our drag desctription, we'll just make a list of the selected // row numbers - this will be picked up by the drag target and displayed in // its box. String desc; for (int i = 0; i < selectedRows.size(); ++i) desc << (selectedRows [i] + 1) << T(" "); return desc.trim(); } //============================================================================== // this just fills in the background of the listbox void paint (Graphics& g) { g.fillAll (Colours::white.withAlpha (0.7f)); } /*void listBoxItemClicked (int row, const MouseEvent& e) { PopupMenu m; m.addItem (1, "sdfsdfs"); m.show(); //AlertWindow::showMessageBox (AlertWindow::InfoIcon, "asdfsadfads", "srdfsdfa"); DocumentWindow* dw = new DocumentWindow ("sfdsd", Colours::white, DocumentWindow::allButtons, true); dw->setBounds (100, 100, 500, 500); dw->setVisible (true); }*/ }; //============================================================================== // and this is a component that can have things dropped onto it.. class DragAndDropDemoTarget : public Component, public DragAndDropTarget { bool somethingIsBeingDraggedOver; String message; public: //============================================================================== DragAndDropDemoTarget() { somethingIsBeingDraggedOver = false; message = T("Drag-and-drop some rows from the top-left box onto this component!"); } ~DragAndDropDemoTarget() { } //============================================================================== void paint (Graphics& g) { g.fillAll (Colours::green.withAlpha (0.2f)); // draw a red line around the comp if the user's currently dragging something over it.. if (somethingIsBeingDraggedOver) { g.setColour (Colours::red); g.drawRect (0, 0, getWidth(), getHeight(), 3); } g.setColour (Colours::black); g.setFont (14.0f); g.drawFittedText (message, 10, 0, getWidth() - 20, getHeight(), Justification::centred, 4); } //============================================================================== bool isInterestedInDragSource (const String& sourceDescription, Component* sourceComponent) { // normally you'd check the sourceDescription value to see if it's the // sort of object that you're interested in before returning true, but for // the demo, we'll say yes to anything.. return true; } void itemDragEnter (const String& sourceDescription, Component* sourceComponent, int x, int y) { somethingIsBeingDraggedOver = true; repaint(); } void itemDragMove (const String& sourceDescription, Component* sourceComponent, int x, int y) { } void itemDragExit (const String& sourceDescription, Component* sourceComponent) { somethingIsBeingDraggedOver = false; repaint(); } void itemDropped (const String& sourceDescription, Component* sourceComponent, int x, int y) { message = T("last rows dropped: ") + sourceDescription; somethingIsBeingDraggedOver = false; repaint(); } }; //============================================================================== class DragAndDropDemo : public Component, public DragAndDropContainer { //============================================================================== DragAndDropDemoSource* source; DragAndDropDemoTarget* target; public: //============================================================================== DragAndDropDemo() { setName (T("Drag-and-Drop")); source = new DragAndDropDemoSource(); addAndMakeVisible (source); target = new DragAndDropDemoTarget(); addAndMakeVisible (target); } ~DragAndDropDemo() { deleteAllChildren(); } void resized() { source->setBounds (10, 10, 250, 150); target->setBounds (getWidth() - 260, getHeight() - 160, 250, 150); } //============================================================================== // (need to put this in to disambiguate the new/delete operators used in the // two base classes). juce_UseDebuggingNewOperator }; //============================================================================== Component* createDragAndDropDemo() { return new DragAndDropDemo(); }