永井@知能.九工大です.

>>>>> "M" == Yukihiro Matsumoto <matz / netlab.co.jp> writes:
M> In message "[ruby-dev:3319] Re: sample of TkFont class"
M>     on 98/07/16, NAGAI Hidetoshi <nagai / dumbo.ai.kyutech.ac.jp> writes:
M> |では,1.1c0 直前にさらに駆け込みで unofficial patch を.(^_^)
M> |1.1b9_31 からの差分ですので,上記の修正も差分中に含まれています.
M> |ご注意ください.
M> 取り込みました.

ありがとうございます.
で,さらに追加です.(間に合うかな? (^_^;)
widget-demo の dialog[12].tcl を実現するために,
tkdialog.rb に手を入れてみました.
# つまり,この tkdialog.rb で OK なら,
# dialog1.tcl, dialog2.tcl の移植も完了となります.
ついでに,フォントや色の configuration も可能にしてみました.
こんな風に使います.
----------------------------------------------
require 'tkdialog'

TkDialog.new('message'=>'Dialog Message', 
	'message_config'=>{'foreground'=>'red','font'=>'a14'}, 
	'bitmap_config'=>{'foreground'=>'red'}, 
	'button_configs'=>proc{|i| [{'foreground'=>'red'},
	                            {'foreground'=>'blue'}][i] }, 
	'prev_command'=>proc{|w| p w})
----------------------------------------------
このように指定は生成時パラメータで与えることもできますが,
一応,サブクラスを作って,各パラメータを与えるメソッドを再定義して
使うものと考えています.
従来との互換性は保てていると思いますが,
このような tkdialog.rb でよいと思われるかどうか,
ご意見をいただけると幸いです.

-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp

require "tk"

class TkDialog < TkWindow
  extend Tk

  # initialize tk_dialog
  def initialize(keys = nil)
    super()
    @var = TkVariable.new
    id = @var.id

    @title   = title

    @message = message
    @message_config = message_config

    @bitmap  = bitmap
    @bitmap_config = message_config

    @default_button = default_button

    @buttons = buttons
    @button_configs = proc{|num| button_configs num}

    if keys.kind_of? Hash
      @title   = keys['title'] if keys['title']
      @message = keys['message'] if keys['message']
      @bitmap  = keys['bitmap'] if keys['bitmap']
      @default_button = keys['default'] if keys['default']
      @buttons = keys['buttons'] if keys['buttons']

      @command = keys['prev_command']

      @message_config = keys['message_config'] if keys['message_config']
      @bitmap_config  = keys['bitmap_config']  if keys['bitmap_config']
      @button_configs = keys['button_configs'] if keys['button_configs']
    end

    if @title.include? ?\s
      @title = '{' + @title + '}'
    end

    @buttons = tk_split_list(@buttons) if @buttons.kind_of? String
    @buttons = @buttons.collect{|s|
      if s.kind_of? Array
	s = s.join(' ')
      end
      if s.include? ?\s
	'{' + s + '}'
      else
	s
      end
    }

    config = ""
    if @message_config.kind_of? Hash
      config << format("%s.msg configure %s\n", 
		       @path, hash_kv(@message_config).join(' '))
    end
    if @bitmap_config.kind_of? Hash
      config << format("%s.msg configure %s\n", 
		       @path, hash_kv(@bitmap_config).join(' '))
    end
    if @button_configs.kind_of? Proc
      @buttons.each_index{|i|
	if (c = @button_configs.call(i)).kind_of? Hash
	  config << format("%s.button%s configure %s\n", 
			   @path, i, hash_kv(c).join(' '))
	end
      }
    end
    config = 'after idle {' + config + '};' if config != ""

    if @command.kind_of? Proc
      @command.call(self)
    end

    INTERP._eval('eval {global '+id+';'+config+
		 'set '+id+' [tk_dialog '+ 
		 @path+" "+@title+" {#{@message}} "+@bitmap+" "+
		 String(@default_button)+" "+@buttons.join(' ')+']}')
  end
  def value
    return @var.value.to_i
  end
  ######################################################
  #                                                    #
  # these methods must be overridden for each dialog   #
  #                                                    #
  ######################################################
  def title
    return "DIALOG"
  end
  def message
    return "MESSAGE"
  end
  def message_config
    return nil
  end
  def bitmap
    return "info"
  end
  def bitmap_config
    return nil
  end
  def default_button
    return 0
  end
  def buttons
    #return "BUTTON1 BUTTON2"
    return ["BUTTON1", "BUTTON2"]
  end
  def button_configs(num)
    return nil
  end
end

#
# dialog for warning
#
class TkWarning < TkDialog
  def initialize(mes)
    @mes = mes
    super()
  end
  def message
    return @mes
  end
  def title
    return "WARNING";
  end
  def bitmap
    return "warning";
  end
  def default_button
    return 0;
  end
  def buttons
    return "OK";
  end
end