/* ============================================================================== 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. ============================================================================== */ #ifndef __JUCER_DRAWABLETREEVIEWITEM_JUCEHEADER__ #define __JUCER_DRAWABLETREEVIEWITEM_JUCEHEADER__ #include "../jucer_DocumentEditorComponent.h" #include "../../model/jucer_DrawableDocument.h" //============================================================================== /** */ class DrawableTreeViewItem : public JucerTreeViewBase, public ValueTree::Listener, public ChangeListener { DrawableTreeViewItem (DrawableEditor& editor_, const ValueTree& drawableRoot, const String& typeName_) : editor (editor_), node (drawableRoot), typeName (typeName_) { node.addListener (this); editor.selectedItems.addChangeListener (this); } public: static DrawableTreeViewItem* createItemForNode (DrawableEditor& editor, const ValueTree& drawableRoot) { const char* typeName = 0; { ScopedPointer d (Drawable::createFromValueTree (drawableRoot)); if (d != 0) { if (dynamic_cast ((Drawable*) d) != 0) typeName = "Path"; else if (dynamic_cast ((Drawable*) d) != 0) typeName = "Image"; else if (dynamic_cast ((Drawable*) d) != 0) typeName = "Group"; else if (dynamic_cast ((Drawable*) d) != 0) typeName = "Text"; else { jassertfalse } } } if (typeName != 0) return new DrawableTreeViewItem (editor, drawableRoot, typeName); return 0; } ~DrawableTreeViewItem() { editor.selectedItems.removeChangeListener (this); node.removeListener (this); } //============================================================================== void valueTreePropertyChanged (ValueTree& tree, const var::identifier& property) { } void valueTreeChildrenChanged (ValueTree& tree) { if (tree == node) refreshSubItems(); } void valueTreeParentChanged (ValueTree& tree) { } //============================================================================== // TreeViewItem stuff.. bool mightContainSubItems() { return node.getNumChildren() > 0; } const String getUniqueName() const { jassert (node ["id"].toString().isNotEmpty()); return node ["id"]; } void itemOpennessChanged (bool isNowOpen) { if (isNowOpen) refreshSubItems(); } void refreshSubItems() { ScopedPointer openness (getOpennessState()); clearSubItems(); for (int i = 0; i < node.getNumChildren(); ++i) { ValueTree subNode (node.getChild (i)); DrawableTreeViewItem* const item = createItemForNode (editor, subNode); if (item != 0) addSubItem (item); } if (openness != 0) restoreOpennessState (*openness); editor.selectedItems.changed(); } const String getDisplayName() const { const String name (getRenamingName()); return typeName + (name.isEmpty() ? String::empty : (" \"" + name + "\"")); } const String getRenamingName() const { return node ["name"]; } void setName (const String& newName) { } bool isMissing() { return false; } Image* getIcon() const { return LookAndFeel::getDefaultLookAndFeel().getDefaultDocumentFileImage(); } void itemClicked (const MouseEvent& e) { } void itemDoubleClicked (const MouseEvent& e) { } void itemSelectionChanged (bool isNowSelected) { DrawableEditor* ed = getEditor(); jassert (ed != 0); if (ed != 0) { const int64 hash = DrawableEditor::getHashForNode (node); if (isNowSelected) ed->selectedItems.addToSelection (hash); else ed->selectedItems.deselect (hash); } } void changeListenerCallback (void*) { setSelected (editor.selectedItems.isSelected (DrawableEditor::getHashForNode (node)), false); } const String getTooltip() { return String::empty; } const String getDragSourceDescription() { return drawableItemDragType; } //============================================================================== // Drag-and-drop stuff.. bool isInterestedInFileDrag (const StringArray& files) { return false; } void filesDropped (const StringArray& files, int insertIndex) { } bool isInterestedInDragSource (const String& sourceDescription, Component* sourceComponent) { return false; } void itemDropped (const String& sourceDescription, Component* sourceComponent, int insertIndex) { } //============================================================================== void showRenameBox() { } // Text editor listener for renaming.. void textEditorTextChanged (TextEditor& editor) {} void textEditorReturnKeyPressed (TextEditor& editor) { editor.exitModalState (1); } void textEditorEscapeKeyPressed (TextEditor& editor) { editor.exitModalState (0); } void textEditorFocusLost (TextEditor& editor) { editor.exitModalState (0); } //============================================================================== DrawableEditor& editor; ValueTree node; private: String typeName; DrawableEditor* getEditor() const { return getOwnerView()->findParentComponentOfClass ((DrawableEditor*) 0); } }; #endif // __JUCER_DRAWABLETREEVIEWITEM_JUCEHEADER__