## -*- Ruby -*-
## $Id: renamefox.rb 93 2005-01-11 22:58:46Z Sascha $

begin
  require 'fox'
rescue LoadError
  require 'fox12'
  FXTooltip = Fox::FXToolTip
  FXToolbar = Fox::FXToolBar
  FXScrollbar = Fox::FXScrollBar
  FXMenubar = Fox::FXMenuBar
  FXStatusbar = Fox::FXStatusBar
  FXStatusline = Fox::FXStatusLine
  FXToolbarShell = Fox::FXToolBarShell
  FXToolbarGrip = Fox::FXToolBarGrip
end
include Fox

class RenameFox < Fox::FXMainWindow
  include Fox
  include Responder

  def initialize(app, team = {})
    super(app, "RenameFox", nil, nil, DECOR_ALL,
          0, 0, 100, 100, 0, 0)
    initVars
    initView
    statusbar = FXStatusbar.new(self, STATUSBAR_WITH_DRAGCORNER)
    statusbar.setLayoutHints(LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
    FXTooltip.new(getApp, TOOLTIP_NORMAL)
  end

  def initVars
    @pipes = Array.new
    @fillMode = LAYOUT_FILL_X
    @frameStyle = FRAME_NONE
  end

  def initFrame(aFrame)
    aFrame.setFrameStyle(@frameStyle)
    aFrame.setLayoutHints(@fillMode)
    return aFrame
  end

  def initView
    basicFrame = initFrame(FXVerticalFrame.new(self))
    basicFrame.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_Y)

    directoryFrame = initFrame(FXHorizontalFrame.new(basicFrame))
    FXLabel.new(directoryFrame, "Directory:")
    @dirTextField = FXTextField.new(directoryFrame, 32)
    @dirTextField.setLayoutHints(@fillMode)
    @dirTextField.setText(Dir.getwd)
    dirButton = FXButton.new(directoryFrame, "Choose")
    dirButton.connect(SEL_COMMAND, method(:onCmdChooseDir))

    replaceFrame = initFrame(FXHorizontalFrame.new(basicFrame))
    FXLabel.new(replaceFrame, "Replace in Filenames:")
    @patternTextField = FXTextField.new(replaceFrame, 32)
    @patternTextField.setLayoutHints(@fillMode)
    @patternTextField.setText('pattern')
    FXLabel.new(replaceFrame, "by:")
    @replacementTextField = FXTextField.new(replaceFrame, 32)
    @replacementTextField.setLayoutHints(@fillMode)
    @replacementTextField.setText('replacement')

    actionFrame = initFrame(FXHorizontalFrame.new(basicFrame))
    renameButton = FXButton.new(actionFrame, "Replace")
    renameButton.connect(SEL_COMMAND, method(:onCmdRename))
    previewButton = FXButton.new(actionFrame, "Preview")
    previewButton.setButtonStyle(BUTTON_DEFAULT)
    previewButton.setDefault
    previewButton.connect(SEL_COMMAND, method(:onCmdPreview))

    @cmdOutput = FXText.new(basicFrame)
    @cmdOutput.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_Y)
  end

  # Create and show window
  def create
    resize(340, 300)
    super
    show(PLACEMENT_SCREEN)
  end

  def onCmdChooseDir(sender, sel, ptr)
    dialog = FXDirDialog.new(self, "Open Directory")
    dialog.setDirectory(directory)
    @dirTextField.setText(dialog.getDirectory) if dialog.execute
  end

  def pattern
    @patternTextField.getText
  end

  def replacement
    @replacementTextField.getText
  end

  def directory
    @dirTextField.getText
  end

  def onPairOfNamesDo &block
    Dir.chdir(directory)
    patternRegex = Regexp.compile(pattern)
    Dir.foreach('.'){ |f|
      fNew = f.gsub(patternRegex, replacement)
      block.call(f, fNew) unless fNew == f
    }
  end

  def preview
    @cmdOutput.setText('')
    onPairOfNamesDo { |f, fNew|
      @cmdOutput.appendText("Would replace #{f} by #{fNew}\n")
    }    
  end

  def onCmdPreview(sender, sel, ptr)
    preview
  end

  def onCmdRename(sender, sel, ptr)
    @cmdOutput.setText('')
    onPairOfNamesDo { |f, fNew|
      File.rename(f, fNew)
      @cmdOutput.appendText("Replaced #{f} by #{fNew}\n")
    }
  end
  
  def onCmdQuit(sender, sel, ptr)
    getApp.exit(0)
  end
end

def runRenamefox()
  application = Fox::FXApp.new("RenameFox", "Sascha Dördelmann")
  window = RenameFox.new(application)
  application.addSignal("SIGINT", window.method(:onCmdQuit))
  application.create
  application.run
end

if $0 == __FILE__
  Dir.chdir($1.gsub(/\\/, File::SEPARATOR)) if $1
  runRenamefox
end

