#
# == epcb/csv/feature
#
# Revision:: $Id$
#
module EPCB
  #
  # ExcelPettyCashBookのバージョンによって、利用できるマクロなどが異なるので
  # その違いを埋めるためのクラス。あるバージョンに特有の機能を追加する場合は
  # サブクラスを作成して実装する。
  #
  class Feature
    # コンストラクタ。
    # === ARGS
    # excel_util:: ExcelUtilのインスタンス
    def initialize(excel_util)
      @util = excel_util
      @constants_cache = Hash.new
    end

    # ExcelPettyCashBook内で定義されている定数を取得する。
    # === ARGS
    # name:: 定数名
    def const_of(name)
      value = @constants_cache[name]
      if value.nil?
        value = @util.excel.run("Const_#{name}")
        @constants_cache[name] = value
      end
      return value
    end

    # データ行がある一定数空白行であるか判定する。
    # IsEmptyLineContinuedToLimitマクロを呼ぶことで判定する。
    # === ARGS
    # line:: 判定する行のオフセット
    def is_empty_line_continued_to_limit(line)
      if @util.excel.run("IsEmptyLineContinuedToLimit", line) &&
          @util.get_offset(line, const_of("DATE_OFFSET")).value.nil?
        return true
      end
    end

    # 引数のworkbookから、名前nameを持つワークシートを取得する。
    # === ARGS
    # workbook:: ワークブック
    # name:: 取得するシートの名前
    # === RETURNS
    # ワークシート。見つからなかった場合はnil。
    def get_sheet(workbook, name)
      for i in 1 .. workbook.worksheets.count
        s = workbook.worksheets(i) 
        return s if s.name == name
      end
      return nil
    end

    def get_master_sheet(workbook)
      return get_sheet(workbook, EPCB::MASTER_SHEET_NAME)
    end
    
    def get_prefs_sheet(workbook)
      return get_sheet(workbook, EPCB::PREFS_SHEET_NAME)
    end

    # プリファレンスをロードする。この実装では常にfalseを返す。
    # === RETURNS
    # プリファレンスのロードに成功した場合はtrue
    def load_preferences()
      # 何もしない
      return false
    end

    # プリファレンスに格納されている名前を配列として全て取得する。
    # この実装では常にnilを返す。
    # === RETURNS
    # プリファレンスに格納されている名前
    def get_preferences_names()
      #return @util.excel.run("GetPreferencesNames")
      return nil
    end

    # 引数のプリファレンス名に対応するプリファレンス値を取得する。
    # この実装では常にnilを返す。
    # === RETURNS
    # プリファレンス値。
    def get_preference(name)
      return nil
    end

    # 引数のnameでvalueをプリファレンスに格納する。
    # この実装では何もしない
    # === ARGS
    # name:: プリファレンス名
    # value:: プリファレンス値
    def put_preference(name, value) ; end

    # アクションフォームの位置を更新する。
    # この実装では何もしない
    def upadte_action_form_location() ; end

    # 引数のシート名+name+がマスタシートの正しい名前かどうか判定する。
#     def master_sheet?(name)
#       # $options.masterの判定はいらないはず
#       return const_of("MASTER_SHEET_NAME") == name
#     end
  end #Feature#

  #
  # 1.0のFeature。
  #
  class Feature_1_0 < Feature
    def const_of(name)
      value = @constants_cache[name]
      return value unless value.nil?

      case name
      when "VERSION"
        value = "1.0.0"
      when "DEFAULT_BASE_LOCATION"
        value = "A7"
      when "MAX_DATA_LINE"
        value = 400
      when "TEMPLATE_SHEET_NAME"
        value = "雛型"
      when "MASTER_SHEET_NAME"
        value = "マスタ"
      when "DATE_OFFSET"
        value = 0
      when "DAY_OF_WEEK_OFFSET"
        value = 1
      when "USE_OFFSET"
        value = 2
      when "AMOUNT_OF_MONEY_OFFSET"
        value = 3
      else
        return nil
      end
      @constants_cache[name] = value
      return value
    end

  end #Feature_1_0#

  #
  # 1.1のFeature。定義のみ。
  #
  class Feature_1_1 < Feature ; end 

  #
  # 1.2のFeature。
  #    #
  class Feature_1_2 < Feature_1_1
    def get_sheet(workbook, name)
      @util.excel.run("GetSheet", workbook, name, false)
    end

    def load_preferences()
      return @util.excel.run("LoadPreferences")
    end

    def get_preferences_names()
      return @util.excel.run("GetPreferencesNames")
    end

    def get_preference(name)
      return @util.excel.run("GetPreference", name)
    end

    def put_preference(name, value)
      @util.excel.run("PutPreference", name, value)
    end

    def update_action_form_location
      @util.excel.run("UpdateActionFormLocation")
    end
  end 

end
