Object Browser ver0.2

VisualuRuby の勉強がてら Object Browserを作成。
ここに exe 化したファイルを置いておきます。
http://www3.pf-x.net/~spider-man/cgi-bin/hiki/hiki.cgi?Object+Browser


画面を貼ってみる。

変更点 ver0.1 -> ver0.2

・オブジェクトIDの検索機能を追加
  大文字小文字無視の正規表現で検索可能
・メソッドの戻り値の型表示を追加


object-browser.rb

require 'vr/vrcontrol'
require 'vr/vrcomctl'
require 'vr/vrtooltip'
require 'win32ole'

# version情報
VER = 0.2

class MyForm < VRForm
  include VRMenuUseable
  include VRStatusbarDockable


  def setprogids(condition=nil)
    @progids_view.clearItems
      ids = WIN32OLE_TYPE.progids
    ids.sort!{|a,b| b <=> a}
   
    for id in ids
      # 条件指定があった場合
      if condition
        if id =~ /#{condition}/i
          @progids_view.insertItem(0,[id])
        end
      else
        @progids_view.insertItem(0,[id])
      end
    end
  end

  def construct
    move 10,40,600,480

    self.caption="Object Browser - ver.#{VER}"

    addControl(VREdit     ,"search_text"   ,""             ,0  ,0,210,25,WStyle::WS_BORDER)
    addControl(VRButton   ,"search_button" ,"検索"         ,210,0,40,25,WStyle::WS_BORDER)
    addControl(VRListview ,"progids_view"  ,"progids_view" ,0  ,25,250,425,WStyle::WS_BORDER)
    addControl(VRListview ,"methods_view"  ,"methods_view" ,250,0,330,200,WStyle::WS_VSCROLL)
    addControl(VRListview ,"params_view"   ,"params_view"  ,250,210,340,240,WStyle::WS_VSCROLL)

    @progids_view.insertColumn(0,"progids",230)
    @methods_view.insertColumn(0,"method",180)
    @methods_view.insertColumn(1,"return type",130)
    @params_view.insertColumn(0,"inout"   ,40)
    @params_view.insertColumn(1,"name"    ,100)
    @params_view.insertColumn(2,"default" ,100)
    @params_view.insertColumn(3,"type"    ,95)
    setprogids
  end

  def progids_view_itemchanged(index,state)
    if state == 0
      begin
        @methods_view.clearItems
        @params_view.clearItems

        progid = @progids_view.getItemTextOf(index)
        app = WIN32OLE.new(progid)
        methods = app.ole_methods
        methods.sort!{|a,b| b.to_s <=> a.to_s}
        for method in methods
          @methods_view.insertItem(0 , [method , method.return_type])
        end
      rescue => e
        puts e if $DEBUG
        @methods_view.clearItems
        @methods_view.insertItem(0 , [e.message]) 
        @methods_view.insertItem(0 , ["error!!"])
      end
    end 
  end

  def methods_view_itemchanged(index , state)
    if state == 0
      begin 
        @params_view.clearItems
        @progids_view.eachSelectedItems {|progids_index|
          progid = @progids_view.getItemTextOf(progids_index)
          method = @methods_view.getItemTextOf(index)
          puts "progid=#{progid} method=#{method}" if $DEBUG
          app = WIN32OLE.new(progid)
          app.ole_method(method).params.reverse.each{|param|
            info = Array.new
            info.push("in")       if param.input?
            info.push("out")      if param.output?
            info.push("optional") if param.optional?
            info.push("retval")   if param.retval?
            info.push(param.name)
            info.push(param.default)
            info.push(param.ole_type)

            @params_view.insertItem(0, info);
          }
        }
      rescue => e
        puts e if $DEBUG
        @params_view.clearItems
        @params_view.insertItem(0, [e.message]);
        @params_view.insertItem(0, ["error!!"]);
      end
    end
  end

  def search_button_clicked
    setprogids(@search_text.text)
  end
  def search_text_entered
    search_button_clicked
  end
end

VRLocalScreen.showForm(MyForm)
VRLocalScreen.messageloop