view lib/ruby/kinput2_prime.rb @ 16:598fcbe482b5

imported patch 19_kinput2-v3.1-ruby.patch
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 08 Mar 2010 20:38:17 +0900
parents
children
line wrap: on
line source

# $LOAD_PATH.push ('/home/komatsu/src/prime/prime-xim/lib/ruby/')

# PRIME_USER_DIR = ENV['HOME'] + '/.prime'
# PRIME_PATH = '/home/komatsu/src/prime'
# $LOAD_PATH.push (PRIME_PATH)

require 'kinput2'
require 'prime/prime'

class KanjiConv < KanjiConvCore
  attr_reader :input, :selection, :dialog

  def initialize
    super
#    @useprime = false
    @useprime = true
    
    if @useprime then
      @prime = Prime.new
    end
    @input  = JTextEdit.new

    @selection = Selection.new (self)
    @dialog = Dialog.new (self)
    @mode = ModeMaster.new (self)

    @fundMode  = FundMode.new(self)
    @inputMode = InputMode.new(self)
    @convMode  = ConvMode.new(self)
    @mode.set(:fund,  @fundMode)
    @mode.set(:input, @inputMode)
    @mode.set(:conv,  @convMode)
    @mode.change(:fund)

    debug_message("Initialize Done.")
  end

  def reset
    super
    @mode.change(:fund)
    @input.reset
    reset_cand_list
  end

  def convert (word)
    if @useprime then
      cand_list = @prime.lookup_hybrid(word).values
    else
      cand_list = [word, "Taiyaki", "Hiroyuki", "Komatsu", "$B4A;z(B"]
    end
    return cand_list[0,5]
  end

  ## inputEvent (keynum, keysym = nil, state = nil)
  ## ReturnValue 1:Pass 0:Trap
  def inputEvent (keynum, keysym = nil, state = nil)
    debug_message("KeyNum: #{keynum}, KeySym: #{keysym}, Status: #{state}")

    if keynum == 0 then
      return 1
    end
    key = [keynum]

    if @mode.current then
      trap = @mode.current.call (keynum, keysym, state)
      return ((trap == true) ? 0 : 1)
    end
    return 1;
  end

  def selection_fix (index)
    fix (index)
    @mode.change(:fund)
  end

  def fix (fixed_arg)
    ### Must NOT chage @mode here, because exceptional case can exist.
    super (fixed_arg)
    @input.reset
    reset_cand_list
  end

  def insert (keysym, modifiers)
    debug_message("insert '#{keysym.chr}'")
    @input.insert(keysym.chr)
    set_cand_list (convert(@input.text), 0)
  end
end

class PrimeModeCore < ModeCore
  def initialize (parent)
    super
  end

  private
  def insert (keysym, modifiers)
    @parent.insert(keysym, modifiers)
    @parent.mode.change(:input)
    return true
  end

  def fix (keysym, modifiers)
    fix_internal(keysym, modifiers)
    @parent.mode.change(:fund)
    return true
  end

  def fix_and_insert (keysym, modifiers)
    fix_internal (keysym, modifiers)
    insert (keysym, modifiers)
    return true
  end

  def cursor_right (keysym, modifiers)
    @parent.input.cursor_right
    return true
  end
  def cursor_left (keysym, modifiers)
    @parent.input.cursor_left
    return true
  end
  def cursor_beginning (keysym, modifiers)
    @parent.input.cursor_beginning
    return true
  end
  def cursor_end (keysym, modifiers)
    @parent.input.cursor_end
    return true
  end

  def selection_right (keysym, modifiers)
    @parent.selection.right
    return true
  end
  def selection_left (keysym, modifiers)
    @parent.selection.left
    return true
  end
  def selection_beginning (keysym, modifiers)
    @parent.selection.line_beginning
    return true
  end
  def selection_end (keysym, modifiers)
    @parent.selection.line_end
    return true
  end
  def selection_up (keysym, modifiers)
    @parent.selection.up
    return true
  end
  def selection_down (keysym, modifiers)
    @parent.selection.down
    return true
  end
end

class FundMode < PrimeModeCore
  def initialize (parent)
    super
    @label = '[ $B$"(B ]'
    @trap  = false
  end

  def initialize_keys
    (33..126).each {|char|
      @keymap.add(char, :insert)
    }
  end

  def on (prev_mode = nil)
    @parent.selection.close
    @parent.dialog.close
  end
end

class InputMode < PrimeModeCore
  def initialize (parent)
    super
    @label   = "[$BF~NO(B]"
  end

  def initialize_keys
    (33..126).each {|char|
      @keymap.add(char, :insert)
    }
    (?A..?Z).each {|char|
      @keymap.add(char, :fix_and_insert)
    }
    @keymap.add(:enter, :fix)
    @keymap.add([?m, :ctrl], :fix)
    @keymap.add(:space, :convert)
    @keymap.add(:backspace, :backspace)
    @keymap.add([?h, :ctrl], :backspace)
    @keymap.add(:delete, :delete)
    @keymap.add([?d, :ctrl], :delete)
    @keymap.add(:left, :cursor_left)
    @keymap.add([?b, :ctrl], :cursor_left)
    @keymap.add(:right, :cursor_right)
    @keymap.add([?f, :ctrl], :cursor_right)
    @keymap.add([?a, :ctrl], :cursor_beginning)
    @keymap.add([?e, :ctrl], :cursor_end)
    @keymap.add([?g, :ctrl], :cancel)
    @keymap.add(:esc, :cancel)
  end

  def on (prev_mode = nil)
    @parent.selection.close
    @parent.dialog.open
  end

  def entries
    return @parent.input.segments
  end

  private
  def fix_internal (keysym, modifiers)
    @parent.fix(@parent.input.text)
  end

  def backspace (keysym, modifiers)
    @parent.input.backspace
    if @parent.input.text.length == 0 then
      @parent.mode.change(:fund)
    end
    return true
  end

  def delete (keysym, modifiers)
    @parent.input.delete
    if @parent.input.text.length == 0 then
      @parent.mode.change(:fund)
    end
    return true
  end

  def cancel (keysym, modifiers)
    @parent.input.reset
    @parent.mode.change(:fund)
    return true
  end

  def convert (keysym, modifiers)
    if @parent.set_cand_list (@parent.convert(@parent.input.text)) then
      @parent.set_cand_index(0)
      @parent.mode.change(:conv)
    end
    return true
  end
end

class ConvMode < PrimeModeCore
  def initialize (parent)
    super
    @label  = "[$BJQ49(B]"
  end

  def initialize_keys
    (33..126).each {|char|
      @keymap.add(char, :fix_and_insert)
    }
    @keymap.add(:enter, :fix)
    @keymap.add([?m, :ctrl], :fix)
    @keymap.add(:space, :convert)
#     @keymap.add(:backspace, :backspace)
#     @keymap.add([?h, :ctrl], :backspace)
#     @keymap.add(:delete, :delete)
#     @keymap.add([?d, :ctrl], :delete)
    @keymap.add(:left, :selection_left)
    @keymap.add([?b, :ctrl], :selection_left)
    @keymap.add(:right, :selection_right)
    @keymap.add([?f, :ctrl], :selection_right)
    @keymap.add(:down, :selection_down)
    @keymap.add([?n, :ctrl], :selection_down)
    @keymap.add(:up, :selection_up)
    @keymap.add([?p, :ctrl], :selection_up)
    @keymap.add([?a, :ctrl], :selection_beginning)
    @keymap.add([?e, :ctrl], :selection_end)
    @keymap.add([?g, :ctrl], :cancel)
    @keymap.add(:esc, :cancel)
  end

  def on (prev_mode = nil)
    @parent.selection.open
    @parent.dialog.close
  end

  def entries
    return ['', @parent.cand_list[@parent.cand_index]]
  end

  private
  def fix_internal (keysym, modifiers)
    @parent.fix(@parent.cand_list[@parent.cand_index])
  end
  
  def cancel (keysym, modifiers)
    @parent.mode.change(:input)
    return true
  end

  def convert (keysym, modifiers)
    return selection_right(keysym, modifiers)
  end
end

$kanjiConv = KanjiConv.new
#p local_variables