Skip to content
Snippets Groups Projects
commands.rb 2.35 KiB
Newer Older
  • Learn to ignore specific revisions
  • require 'fox16'
    require 'fox16/undolist'
    
    include Fox
    
    # Undo record for text fragment
    class FXTextCommand < FXCommand
    
      def initialize(txt, change)
        @text = txt
        @buffer = nil
        @pos = change.pos
        @numCharsDeleted = change.ndel
        @numCharsInserted = change.nins
      end
    
      def size
        (@buffer != nil) ? @buffer.size : 0
      end
    end
    
    # Insert command
    class FXTextInsert < FXTextCommand
    
      def undoName
        "Undo insert"
      end
    
      def redoName
        "Redo insert"
      end
    
      # Undoing an insert removes the previously inserted text
      def undo
        @buffer = @text.extractText(@pos, @numCharsInserted)
        @text.removeText(@pos, @numCharsInserted)
        @text.cursorPos = @pos
        @text.makePositionVisible(@pos)
      end
    
      # Redoing an insert re-inserts the same text
      def redo
        @text.insertText(@pos, @buffer)
        @text.cursorPos = @pos + @numCharsInserted
        @text.makePositionVisible(@pos + @numCharsInserted)
        @buffer = nil
      end
    end
    
    # Delete command
    class FXTextDelete < FXTextCommand
      def initialize(txt, change)
        super(txt, change)
        @buffer = change.del
      end
    
      def undoName
        "Undo delete"
      end
    
      def redoName
        "Redo delete"
      end
    
      # Undoing a delete re-inserts the deleted text
      def undo
        @text.insertText(@pos, @buffer)
        @text.cursorPos = @pos + @buffer.length
        @text.makePositionVisible(@pos + @buffer.length)
        @buffer = nil
      end
    
      # Redoing a delete removes it again
      def redo
        @buffer = @text.extractText(@pos, @numCharsDeleted)
        @text.removeText(@pos, @buffer.length)
        @text.cursorPos = @pos
        @text.makePositionVisible(@pos)
      end
    end
    
    # Replace command
    class FXTextReplace < FXTextCommand
      def initialize(txt, change)
        super(txt, change)
        @buffer = change.del
      end
    
      def undoName
        "Undo replace"
      end
    
      def redoName
        "Redo replace"
      end
    
      # Undoing a replace reinserts the old text
      def undo
        tmp = @text.extractText(@pos, @numCharsInserted)
        @text.replaceText(@pos, @numCharsInserted, @buffer)
        @text.cursorPos = @pos + @buffer.length
        @text.makePositionVisible(@pos + @buffer.length)
        @buffer = tmp
      end
    
      # Redo a replace reinserts the new text
      def redo
        tmp = @text.extractText(@pos, @numCharsDeleted)
        @text.replaceText(@pos, @numCharsDeleted, @buffer)
        @text.cursorPos = @pos + @numCharsInserted
        @text.makePositionVisible(@pos + @numCharsInserted)
        @buffer = tmp
      end
    end