text: /*
    ==============================================================================
  
     This file is part of the JUCE library.
     Copyright (c) 2015 - ROLI Ltd.
  
     Permission is granted to use this software under the terms of either:
     a) the GPL v2 (or any later version)
     b) the Affero GPL v3
  
     Details of these licenses can be found 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.juce.com for more information.
  
    ==============================================================================
  */
  
  #ifndef JUCER_COMPONENTLAYOUTEDITOR_H_INCLUDED
  #define JUCER_COMPONENTLAYOUTEDITOR_H_INCLUDED
  
  #include "jucer_ComponentOverlayComponent.h"
  #include "../jucer_JucerDocument.h"
  #include "jucer_SnapGridPainter.h"
  
  
  //==============================================================================
  /**
  */
  class ComponentLayoutEditor  : public Component,
                                 public ChangeListener,
                                 public FileDragAndDropTarget,
                                 public DragAndDropTarget,
                                 public LassoSource<Component*>
  {
  public:
      //==============================================================================
      ComponentLayoutEditor (JucerDocument& document, ComponentLayout& layout);
      ~ComponentLayoutEditor();
  
      //==============================================================================
      void paint (Graphics&) override;
      void resized() override;
      void visibilityChanged() override;
      void changeListenerCallback (ChangeBroadcaster*) override;
  
      void mouseDown (const MouseEvent&) override;
      void mouseDrag (const MouseEvent&) override;
      void mouseUp (const MouseEvent&) override;
      bool keyPressed (const KeyPress&) override;
  
      bool isInterestedInFileDrag (const StringArray& files) override;
      void filesDropped (const StringArray& filenames, int x, int y) override;
  
      bool isInterestedInDragSource (const SourceDetails& dragSourceDetails) override;
      void itemDropped (const SourceDetails& dragSourceDetails) override;
  
  
      ComponentLayout& getLayout() const noexcept                 { return layout; }
  
      void findLassoItemsInArea (Array <Component*>& results, const Rectangle<int>& area) override;
  
      SelectedItemSet<Component*>& getLassoSelection() override;
  
      //==============================================================================
      void refreshAllComponents();
      void updateOverlayPositions();
  
      ComponentOverlayComponent* getOverlayCompFor (Component*) const;
  
      Rectangle<int> getComponentArea() const;
      Image createComponentLayerSnapshot() const;
  
  private:
      JucerDocument& document;
      ComponentLayout& layout;
      Component* subCompHolder;
  
      LassoComponent<Component*> lassoComp;
      SnapGridPainter grid;
      bool firstResize;
  };
  
  
  #endif   // JUCER_COMPONENTLAYOUTEDITOR_H_INCLUDED
  