Skip to content
Snippets Groups Projects
dragdrop.rb 2.81 KiB
Newer Older
  • Learn to ignore specific revisions
  • require 'fox16'
    require 'fox16/kwargs'
    
    include Fox
    
    class DragDropWindow < FXMainWindow
      
      def initialize(anApp)
        # Initialize base class
        super(anApp, "Drag and Drop", :opts => DECOR_ALL, :width => 400, :height => 300)
        
        # Fill main window with canvas
        @canvas = FXCanvas.new(self, :opts => LAYOUT_FILL_X|LAYOUT_FILL_Y)
        @canvas.backColor = "red"
        
        # Enable canvas for drag-and-drop messages
        @canvas.dropEnable
        
        # Handle expose events on the canvas
        @canvas.connect(SEL_PAINT) do |sender, sel, event|
          FXDCWindow.new(@canvas, event) do |dc|
            dc.foreground = @canvas.backColor
            dc.fillRectangle(event.rect.x, event.rect.y, event.rect.w, event.rect.h)
          end
        end
    
        # Handle left button press
        @canvas.connect(SEL_LEFTBUTTONPRESS) do
          #
          # Capture (grab) the mouse when the button goes down, so that all future
          # mouse events will be reported to this widget, even if those events occur
          # outside of this widget.
          #
          @canvas.grab
    
          # Advertise which drag types we can offer
          dragTypes = [FXWindow.colorType]
          @canvas.beginDrag(dragTypes)
        end
        
        # Handle mouse motion events
        @canvas.connect(SEL_MOTION) do |sender, sel, event|
          if @canvas.dragging?
            @canvas.handleDrag(event.root_x, event.root_y)
            unless @canvas.didAccept == DRAG_REJECT
              @canvas.dragCursor = getApp().getDefaultCursor(DEF_SWATCH_CURSOR)
            else
              @canvas.dragCursor = getApp().getDefaultCursor(DEF_DNDSTOP_CURSOR)
            end
          end
        end
    
        # Handle SEL_DND_MOTION messages from the canvas
        @canvas.connect(SEL_DND_MOTION) do
          @canvas.acceptDrop if @canvas.offeredDNDType?(FROM_DRAGNDROP, FXWindow.colorType)
        end
    
        # Handle left button release
        @canvas.connect(SEL_LEFTBUTTONRELEASE) do
          @canvas.ungrab
          @canvas.endDrag
        end
        
        # Handle SEL_DND_DROP message from the canvas
        @canvas.connect(SEL_DND_DROP) do
          # Try to obtain the data as color values first
          data = @canvas.getDNDData(FROM_DRAGNDROP, FXWindow.colorType)
    
          # Update canvas background color
          @canvas.backColor = Fox.fxdecodeColorData(data) unless data.nil?
        end
    
        # Handle request for DND data
        @canvas.connect(SEL_DND_REQUEST) do |sender, sel, event|
          @canvas.setDNDData(FROM_DRAGNDROP, FXWindow.colorType, Fox.fxencodeColorData(@canvas.backColor)) if event.target == FXWindow.colorType
        end
      end
    
      def create
        # Create the main window and canvas
        super
        
        # Register the drag type for colors
        FXWindow.colorType = getApp().registerDragType(FXWindow.colorTypeName)
    
        # Show the main window
        show(PLACEMENT_SCREEN)
      end
    end
    
    if __FILE__ == $0
      FXApp.new("DragDrop", "FXRuby") do |theApp|
        DragDropWindow.new(theApp)
        theApp.create
        theApp.run
      end
    end