openshot-audio  0.1.7
juce_TreeView.h
Go to the documentation of this file.
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2015 - ROLI Ltd.
6 
7  Permission is granted to use this software under the terms of either:
8  a) the GPL v2 (or any later version)
9  b) the Affero GPL v3
10 
11  Details of these licenses can be found at: www.gnu.org/licenses
12 
13  JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
14  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15  A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 
17  ------------------------------------------------------------------------------
18 
19  To release a closed-source product which uses JUCE, commercial licenses are
20  available: visit www.juce.com for more information.
21 
22  ==============================================================================
23 */
24 
25 #ifndef JUCE_TREEVIEW_H_INCLUDED
26 #define JUCE_TREEVIEW_H_INCLUDED
27 
28 class TreeView;
29 
30 
31 //==============================================================================
46 {
47 public:
48  //==============================================================================
50  TreeViewItem();
51 
53  virtual ~TreeViewItem();
54 
55  //==============================================================================
62  int getNumSubItems() const noexcept;
63 
71  TreeViewItem* getSubItem (int index) const noexcept;
72 
74  void clearSubItems();
75 
84  void addSubItem (TreeViewItem* newItem, int insertPosition = -1);
85 
94  template <class ElementComparator>
95  void addSubItemSorted (ElementComparator& comparator, TreeViewItem* newItem)
96  {
97  addSubItem (newItem, findInsertIndexInSortedArray (comparator, subItems.begin(), newItem, 0, subItems.size()));
98  }
99 
105  void removeSubItem (int index, bool deleteItem = true);
106 
122  template <class ElementComparator>
123  void sortSubItems (ElementComparator& comparator)
124  {
125  subItems.sort (comparator);
126  }
127 
128  //==============================================================================
130  TreeView* getOwnerView() const noexcept { return ownerView; }
131 
133  TreeViewItem* getParentItem() const noexcept { return parentItem; }
134 
135  //==============================================================================
137  bool isOpen() const noexcept;
138 
147  void setOpen (bool shouldBeOpen);
148 
152  bool isSelected() const noexcept;
153 
158  void setSelected (bool shouldBeSelected,
159  bool deselectOtherItemsFirst,
160  NotificationType shouldNotify = sendNotification);
161 
169  Rectangle<int> getItemPosition (bool relativeToTreeViewTopLeft) const noexcept;
170 
174  void treeHasChanged() const noexcept;
175 
181  void repaintItem() const;
182 
187  int getRowNumberInTree() const noexcept;
188 
192  bool areAllParentsOpen() const noexcept;
193 
197  void setLinesDrawnForSubItems (bool shouldDrawLines) noexcept;
198 
199  //==============================================================================
206  virtual bool mightContainSubItems() = 0;
207 
218  virtual String getUniqueName() const;
219 
240  virtual void itemOpennessChanged (bool isNowOpen);
241 
255  virtual int getItemWidth() const { return -1; }
256 
263  virtual int getItemHeight() const { return 20; }
264 
268  virtual bool canBeSelected() const { return true; }
269 
294  virtual Component* createItemComponent() { return nullptr; }
295 
296  //==============================================================================
312  virtual void paintItem (Graphics& g, int width, int height);
313 
322  virtual void paintOpenCloseButton (Graphics&, const Rectangle<float>& area,
323  Colour backgroundColour, bool isMouseOver);
324 
326  virtual void paintHorizontalConnectingLine (Graphics&, const Line<float>& line);
327 
329  virtual void paintVerticalConnectingLine (Graphics&, const Line<float>& line);
330 
342  virtual void itemClicked (const MouseEvent& e);
343 
358  virtual void itemDoubleClicked (const MouseEvent& e);
359 
365  virtual void itemSelectionChanged (bool isNowSelected);
366 
370  virtual String getTooltip();
371 
372  //==============================================================================
388  virtual var getDragSourceDescription();
389 
402  virtual bool isInterestedInFileDrag (const StringArray& files);
403 
412  virtual void filesDropped (const StringArray& files, int insertIndex);
413 
421  virtual bool isInterestedInDragSource (const DragAndDropTarget::SourceDetails& dragSourceDetails);
422 
431  virtual void itemDropped (const DragAndDropTarget::SourceDetails& dragSourceDetails, int insertIndex);
432 
433  //==============================================================================
447  void setDrawsInLeftMargin (bool canDrawInLeftMargin) noexcept;
448 
460  void setDrawsInRightMargin (bool canDrawInRightMargin) noexcept;
461 
462  //==============================================================================
483  XmlElement* getOpennessState() const;
484 
495  void restoreOpennessState (const XmlElement& xml);
496 
497  //==============================================================================
499  int getIndexInParent() const noexcept;
500 
502  bool isLastOfSiblings() const noexcept;
503 
511  String getItemIdentifierString() const;
512 
513  //==============================================================================
536  {
537  public:
538  OpennessRestorer (TreeViewItem& treeViewItem);
539  ~OpennessRestorer();
540 
541  private:
542  TreeViewItem& treeViewItem;
543  ScopedPointer <XmlElement> oldOpenness;
544 
546  };
547 
548 private:
549  //==============================================================================
550  TreeView* ownerView;
551  TreeViewItem* parentItem;
552  OwnedArray<TreeViewItem> subItems;
553  int y, itemHeight, totalHeight, itemWidth, totalWidth;
554  int uid;
555  bool selected : 1;
556  bool redrawNeeded : 1;
557  bool drawLinesInside : 1;
558  bool drawLinesSet : 1;
559  bool drawsInLeftMargin : 1;
560  bool drawsInRightMargin : 1;
561  unsigned int openness : 2;
562 
563  friend class TreeView;
564 
565  void updatePositions (int newY);
566  int getIndentX() const noexcept;
567  void setOwnerView (TreeView*) noexcept;
568  void paintRecursively (Graphics&, int width);
569  TreeViewItem* getTopLevelItem() noexcept;
570  TreeViewItem* findItemRecursively (int y) noexcept;
571  TreeViewItem* getDeepestOpenParentItem() noexcept;
572  int getNumRows() const noexcept;
573  TreeViewItem* getItemOnRow (int index) noexcept;
574  void deselectAllRecursively (TreeViewItem* itemToIgnore);
575  int countSelectedItemsRecursively (int depth) const noexcept;
576  TreeViewItem* getSelectedItemWithIndex (int index) noexcept;
577  TreeViewItem* getNextVisibleItem (bool recurse) const noexcept;
579  void restoreToDefaultOpenness();
580  bool isFullyOpen() const noexcept;
581  XmlElement* getOpennessState (bool canReturnNull) const;
582  bool removeSubItemFromList (int index, bool deleteItem);
583  void removeAllSubItemsFromList();
584  bool areLinesDrawn() const;
585 
586  #if JUCE_CATCH_DEPRECATED_CODE_MISUSE
587  // The parameters for these methods have changed - please update your code!
588  virtual void isInterestedInDragSource (const String&, Component*) {}
589  virtual int itemDropped (const String&, Component*, int) { return 0; }
590  #endif
591 
593 };
594 
595 
596 //==============================================================================
603 class JUCE_API TreeView : public Component,
604  public SettableTooltipClient,
605  public FileDragAndDropTarget,
606  public DragAndDropTarget
607 {
608 public:
609  //==============================================================================
615  TreeView (const String& componentName = String::empty);
616 
618  ~TreeView();
619 
620  //==============================================================================
635  void setRootItem (TreeViewItem* newRootItem);
636 
641  TreeViewItem* getRootItem() const noexcept { return rootItem; }
642 
646  void deleteRootItem();
647 
654  void setRootItemVisible (bool shouldBeVisible);
655 
660  bool isRootItemVisible() const noexcept { return rootItemVisible; }
661 
669  void setDefaultOpenness (bool isOpenByDefault);
670 
675  bool areItemsOpenByDefault() const noexcept { return defaultOpenness; }
676 
687  void setMultiSelectEnabled (bool canMultiSelect);
688 
693  bool isMultiSelectEnabled() const noexcept { return multiSelectEnabled; }
694 
699  void setOpenCloseButtonsVisible (bool shouldBeVisible);
700 
705  bool areOpenCloseButtonsVisible() const noexcept { return openCloseButtonsVisible; }
706 
707  //==============================================================================
709  void clearSelectedItems();
710 
716  int getNumSelectedItems (int maximumDepthToSearchTo = -1) const noexcept;
717 
721  TreeViewItem* getSelectedItem (int index) const noexcept;
722 
724  void moveSelectedRow (int deltaRows);
725 
726  //==============================================================================
731  int getNumRowsInTree() const;
732 
737  TreeViewItem* getItemOnRow (int index) const;
738 
742  TreeViewItem* getItemAt (int yPosition) const noexcept;
743 
745  void scrollToKeepItemVisible (TreeViewItem* item);
746 
748  Viewport* getViewport() const noexcept;
749 
753  int getIndentSize() noexcept;
754 
758  void setIndentSize (int newIndentSize);
759 
765  TreeViewItem* findItemFromIdentifierString (const String& identifierString) const;
766 
767  //==============================================================================
785  XmlElement* getOpennessState (bool alsoIncludeScrollPosition) const;
786 
798  void restoreOpennessState (const XmlElement& newState,
799  bool restoreStoredSelection);
800 
801  //==============================================================================
810  {
811  backgroundColourId = 0x1000500,
812  linesColourId = 0x1000501,
813  dragAndDropIndicatorColourId = 0x1000502,
814  selectedItemBackgroundColourId = 0x1000503
815  };
816 
817  //==============================================================================
822  {
823  virtual ~LookAndFeelMethods() {}
824 
825  virtual void drawTreeviewPlusMinusBox (Graphics&, const Rectangle<float>& area,
826  Colour backgroundColour, bool isItemOpen, bool isMouseOver) = 0;
827 
828  virtual bool areLinesDrawnForTreeView (TreeView&) = 0;
829  virtual int getTreeViewIndentSize (TreeView&) = 0;
830  };
831 
832  //==============================================================================
834  void paint (Graphics&) override;
836  void resized() override;
838  bool keyPressed (const KeyPress&) override;
840  void colourChanged() override;
842  void enablementChanged() override;
844  bool isInterestedInFileDrag (const StringArray& files) override;
846  void fileDragEnter (const StringArray& files, int x, int y) override;
848  void fileDragMove (const StringArray& files, int x, int y) override;
850  void fileDragExit (const StringArray& files) override;
852  void filesDropped (const StringArray& files, int x, int y) override;
854  bool isInterestedInDragSource (const SourceDetails&) override;
856  void itemDragEnter (const SourceDetails&) override;
858  void itemDragMove (const SourceDetails&) override;
860  void itemDragExit (const SourceDetails&) override;
862  void itemDropped (const SourceDetails&) override;
863 
864 private:
865  class ContentComponent;
866  class TreeViewport;
867  class InsertPointHighlight;
869  friend class TreeViewItem;
870  friend class ContentComponent;
874 
876  CriticalSection nodeAlterationLock;
877  TreeViewItem* rootItem;
878  ScopedPointer<InsertPointHighlight> dragInsertPointHighlight;
879  ScopedPointer<TargetGroupHighlight> dragTargetGroupHighlight;
880  int indentSize;
881  bool defaultOpenness, needsRecalculating, rootItemVisible;
882  bool multiSelectEnabled, openCloseButtonsVisible;
883 
884  void itemsChanged() noexcept;
885  void recalculateIfNeeded();
886  void updateButtonUnderMouse (const MouseEvent&);
887  struct InsertPoint;
888  void showDragHighlight (const InsertPoint&) noexcept;
889  void hideDragHighlight() noexcept;
890  void handleDrag (const StringArray&, const SourceDetails&);
891  void handleDrop (const StringArray&, const SourceDetails&);
892  bool toggleOpenSelectedItem();
893  void moveOutOfSelectedItem();
894  void moveIntoSelectedItem();
895  void moveByPages (int numPages);
896 
897  #if JUCE_CATCH_DEPRECATED_CODE_MISUSE
898  // this method has been deprecated - see the new version..
899  virtual int paintOpenCloseButton (Graphics&, int, int, bool) { return 0; }
900  #endif
901 
903 };
904 
905 #endif // JUCE_TREEVIEW_H_INCLUDED
Definition: juce_Variant.h:46
bool isRootItemVisible() const noexcept
Definition: juce_TreeView.h:660
Definition: juce_DragAndDropTarget.h:53
Definition: juce_KeyPress.h:37
Definition: juce_TreeView.cpp:25
static const String empty
Definition: juce_String.h:152
Definition: juce_TreeView.cpp:984
TreeView * getOwnerView() const noexcept
Definition: juce_TreeView.h:130
bool areItemsOpenByDefault() const noexcept
Definition: juce_TreeView.h:675
Definition: juce_Line.h:44
virtual ~LookAndFeelMethods()
Definition: juce_TreeView.h:823
#define noexcept
Definition: juce_CompilerSupport.h:141
ColourIds
Definition: juce_TreeView.h:809
Definition: juce_FileDragAndDropTarget.h:33
TreeViewItem * getParentItem() const noexcept
Definition: juce_TreeView.h:133
Definition: juce_TreeView.cpp:875
Definition: juce_TreeView.cpp:392
Definition: juce_String.h:43
bool areOpenCloseButtonsVisible() const noexcept
Definition: juce_TreeView.h:705
Definition: juce_TreeView.h:821
#define JUCE_API
Definition: juce_StandardHeader.h:139
TreeViewItem * getRootItem() const noexcept
Definition: juce_TreeView.h:641
Definition: juce_CriticalSection.h:47
bool isInterestedInDragSource(const SourceDetails &) override
Definition: juce_TreeView.cpp:1107
Definition: juce_Rectangle.h:36
void sortSubItems(ElementComparator &comparator)
Definition: juce_TreeView.h:123
NotificationType
Definition: juce_NotificationType.h:33
Definition: juce_TooltipClient.h:63
Definition: juce_XmlElement.h:142
Definition: juce_Colour.h:35
TreeViewItem * getItemOnRow(int index) const
Definition: juce_TreeView.cpp:581
Definition: juce_TreeView.h:535
Definition: juce_TreeView.cpp:944
Definition: juce_TreeView.h:603
Definition: juce_Component.h:33
bool isMultiSelectEnabled() const noexcept
Definition: juce_TreeView.h:693
virtual int getItemHeight() const
Definition: juce_TreeView.h:263
void addSubItemSorted(ElementComparator &comparator, TreeViewItem *newItem)
Definition: juce_TreeView.h:95
Definition: juce_StringArray.h:39
Definition: juce_ContainerDeletePolicy.h:44
virtual Component * createItemComponent()
Definition: juce_TreeView.h:294
virtual bool canBeSelected() const
Definition: juce_TreeView.h:268
Definition: juce_TreeView.h:45
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
Definition: juce_PlatformDefs.h:198
Definition: juce_GraphicsContext.h:42
Definition: juce_Viewport.h:42
Definition: juce_NotificationType.h:36
void itemDropped(const SourceDetails &) override
Definition: juce_TreeView.cpp:1127
TreeViewItem * findItemFromIdentifierString(const String &identifierString) const
Definition: juce_TreeView.cpp:599
Definition: juce_MouseEvent.h:36
virtual int getItemWidth() const
Definition: juce_TreeView.h:255
Definition: juce_DragAndDropTarget.h:43