#
#  templdlg demo  ---  called from demo.rb
#
unless Object.const_defined?('DemoVar')
  fail RuntimeError, "This is NOT a stand alone script. This script is called from 'demo.rb'. "
end

module DemoDialog
  @@tmpl      = TkVariable.new_hash
  @@msg       = TkVariable.new_hash
  @@msgdlg    = nil
  @@progmsg   = TkVariable.new
  @@progval   = TkVariable.new
  @@progdlg   = nil
  @@resources = TkVariable.new('en')

  def self.create(nb)
    frame = nb.insert('end', 'demoDlg', :text=>'Dialog')

    titf1 = Tk::BWidget::TitleFrame.new(frame, :text=>'Resources')
    titf2 = Tk::BWidget::TitleFrame.new(frame, :text=>'Template Dialog')
    titf3 = Tk::BWidget::TitleFrame.new(frame, :text=>'Message Dialog')
    titf4 = Tk::BWidget::TitleFrame.new(frame, :text=>'Other dialog')

    subf = titf1.get_frame
    cmd = proc{ TkOption.read_file(File.join(Tk::BWidget::LIBRARY, 'lang', 
                                             @@resources.value + '.rc')) }
    Tk.pack(TkRadiobutton.new(subf, :text=>'English', :value=>'en', 
                              :variable=>@@resources, :command=>cmd), 
            TkRadiobutton.new(subf, :text=>'French', :value=>'fr', 
                              :variable=>@@resources, :command=>cmd), 
            TkRadiobutton.new(subf, :text=>'German', :value=>'de', 
                              :variable=>@@resources, :command=>cmd), 
            :side=>:left)

    _tmpldlg(titf2.get_frame)
    _msgdlg(titf3.get_frame)
    _stddlg(titf4.get_frame)

    titf1.pack(:fill=>:x, :pady=>2, :padx=>2)
    titf4.pack(:side=>:bottom, :fill=>:x, :pady=>2, :padx=>2)
    Tk.pack(titf2, titf3, :side=>:left, :padx=>2, :fill=>:both, :expand=>true)
  end

  def self._tmpldlg(parent)
    @@tmpl['side'] = :bottom
    @@tmpl['anchor'] = :c

    labf1 = Tk::BWidget::LabelFrame.new(parent, :text=>'Button side', 
                                        :side=>:top, :anchor=>:w, 
                                        :relief=>:sunken, :borderwidth=>1)
    subf = labf1.get_frame
    Tk.pack(TkRadiobutton.new(subf, :text=>'Bottom', :value=>:bottom, 
                              :variable=>@@tmpl.ref('side'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Left', :value=>:left, 
                              :variable=>@@tmpl.ref('side'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Right', :value=>:right, 
                              :variable=>@@tmpl.ref('side'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Top', :value=>:top, 
                              :variable=>@@tmpl.ref('side'), :anchor=>:w), 
            :fill=>:x, :anchor=>:w)

    labf2 = Tk::BWidget::LabelFrame.new(parent, :text=>'Button anchor', 
                                        :side=>:top, :anchor=>:w, 
                                        :relief=>:sunken, :borderwidth=>1)
    subf = labf2.get_frame
    Tk.pack(TkRadiobutton.new(subf, :text=>'North', :value=>:n, 
                              :variable=>@@tmpl.ref('anchor'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'West', :value=>:w, 
                              :variable=>@@tmpl.ref('anchor'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'East', :value=>:e, 
                              :variable=>@@tmpl.ref('anchor'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'South', :value=>:s, 
                              :variable=>@@tmpl.ref('anchor'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Center', :value=>:c, 
                              :variable=>@@tmpl.ref('anchor'), :anchor=>:w), 
            :fill=>:x, :anchor=>:w)

    sep = Tk::BWidget::Separator.new(parent, :orient=>:horizontal)
    button = TkButton.new(parent, :text=>'Show', :command=>proc{_show_tmpldlg})

    button.pack(:side=>:bottom)
    sep.pack(:side=>:bottom, :fill=>:x, :pady=>10)
    Tk.pack(labf1, labf2, :side=>:left, :padx=>4, :anchor=>:n)
  end

  def self._msgdlg(parent)
    @@msg['type'] = 'ok'
    @@msg['icon'] = 'info'

    labf1 = Tk::BWidget::LabelFrame.new(parent, :text=>'Type', :side=>:top, 
                                        :anchor=>:w, :relief=>:sunken, 
                                        :borderwidth=>1)
    subf = labf1.get_frame
    Tk.pack(TkRadiobutton.new(subf, :text=>'Ok', :value=>'ok', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Ok, Cancel', :value=>'okcancel', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Retry, Cancel', 
                              :value=>'retrycancel', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Yes, No', :value=>'yesno', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Yes, No, Cancel', 
                              :value=>'yesnocancel', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Abort, Retry, Ignore', 
                              :value=>'abortretryignore', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            :fill=>:x, :anchor=>:w)

    Tk.pack(TkRadiobutton.new(subf, :text=>'User', :value=>'user', 
                              :variable=>@@msg.ref('type'), :anchor=>:w), 
            Tk::BWidget::Entry.new(subf, :textvariable=>@@msg.ref('buttons')),
            :side=>:left)

    labf2 = Tk::BWidget::LabelFrame.new(parent, :text=>'Icon', :side=>:top, 
                                        :anchor=>:w, :relief=>:sunken, 
                                        :borderwidth=>1)
    subf = labf2.get_frame
    Tk.pack(TkRadiobutton.new(subf, :text=>'Information', :value=>'info', 
                              :variable=>@@msg.ref('icon'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Question',    :value=>'question', 
                              :variable=>@@msg.ref('icon'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Warning',     :value=>'warning', 
                              :variable=>@@msg.ref('icon'), :anchor=>:w), 
            TkRadiobutton.new(subf, :text=>'Error',       :value=>'error', 
                              :variable=>@@msg.ref('icon'), :anchor=>:w), 
            :fill=>:x, :anchor=>:w)

    sep = Tk::BWidget::Separator.new(parent, :orient=>:horizontal)
    button = TkButton.new(parent, :text=>'Show', :command=>proc{_show_msgdlg})

    button.pack(:side=>:bottom)
    sep.pack(:side=>:bottom, :fill=>:x, :pady=>10)
    Tk.pack(labf1, labf2, :side=>:left, :padx=>4, :anchor=>:n)
  end

  def self._stddlg(parent)
    Tk.pack(TkButton.new(parent, :text=>'Select a color '){|w|
              command(proc{DemoDialog._show_color(w)})
            }, 
            TkButton.new(parent, :text=>'Font selector dialog', 
                         :command=>proc{_show_fontdlg}), 
            TkButton.new(parent, :text=>'Progression dialog', 
                         :command=>proc{_show_progdlg}), 
            TkButton.new(parent, :text=>'Password dialog', 
                         :command=>proc{_show_passdlg}), 
            :side=>:left, :padx=>5, :anchor=>:w)
  end

  def self._show_color(w)
    dlg = Tk::BWidget::SelectColor.new(w, :color=>w.background)
    color = dlg.menu([:below, w])
    unless color.empty?
      w.background(color)
    end
  end

  def self._show_tmpldlg
    dlg = Tk::BWidget::Dialog.new(:relative=>Tk.root, :modal=>:local, 
                                  :separator=>true, :title=>'Template dialog', 
                                  :side=>@@tmpl['side'], 
                                  :anchor=>@@tmpl['anchor'], 
                                  :default=>0, :cancel=>1)
    dlg.add('name'=>'ok')
    dlg.add('name'=>'cancel')
    TkMessage.new(dlg.get_frame, :text=>"Template\nDialog", :justify=>:center, 
                  :anchor=>:c, :width=>80).pack(:fill=>:both, :expand=>true, 
                                                :padx=>100, :pady=>100)
    dlg.draw
    dlg.destroy
  end

  def self._show_msgdlg
    @@msgdlg.destroy if @@msgdlg
    @@msgdlg = Tk::BWidget::MessageDlg.new(:relative=>Tk.root, 
                                           :message=>'Message for MessageBox', 
                                           :type=>@@msg['type'], 
                                           :icon=>@@msg['icon'], 
                                           :buttons=>@@msg['buttons'])
    @@msgdlg.create
  end

  def self._show_fontdlg
    font = Tk::BWidget::SelectFont.new(:relative=>Tk.root, 
                                       :font=>DemoVar.font).create
    DemoVar::Demo.update_font(font)
  end

  def self._show_progdlg
    @@progmsg.value = "Compute in progress..."
    @@progval.value = 0

    @@progdlg = Tk::BWidget::ProgressDlg.new(:relative=>Tk.root, 
                                             :title=>'Wait...', 
                                             :type=>'infinite', :width=>20, 
                                             :textvariable=>@@progmsg, 
                                             :variable=>@@progval, 
                                             :stop=>'Stop') {
      command(proc{self.destroy})
      create
    }
    _update_progdlg
  end

  def self._update_progdlg
    TkTimer.new(20, -1, proc{
                  if @@progdlg && @@progdlg.winfo_exist?
                    @@progval.value = 2
                  else
                    stop
                  end
                }).start
  end

  def self._show_passdlg
    Tk::BWidget::PasswdDlg.new(:relative=>Tk.root).create
  end
end

