#!/opt/local/bin/ruby18
require 'tk'
require 'tkextlib/bwidget'

module DemoVar
  @_wfont    = nil
  @notebook  = nil
  @mainframe = nil
  @status    = TkVariable.new
  @prgtext   = TkVariable.new
  @prgindic  = TkVariable.new
  @font      = nil
  @font_name = nil
  @toolbar1  = TkVariable.new(true)
  @toolbar2  = TkVariable.new(true)
end
class << DemoVar
  attr_accessor :_wfont, :notebook, :mainframe, :font, :font_name
  attr_reader   :status, :prgtext, :prgindic, :toolbar1, :toolbar2
end

class BWidget_Demo
  DEMODIR = File.dirname(File.expand_path(__FILE__))

  %w(manager basic select dnd tree tmpldlg).each{|f|
    require File.join(DEMODIR, f << '.rb')
  }

  def initialize
    TkOption.add('*TitleFrame.l.font', 'helvetica 11 bold italic')

    root = TkRoot.new(:title=>'BWidget demo')
    root.withdraw

    _create

    Tk::BWidget.place(root, 0, 0, :center)
    root.deiconify
    root.raise
    root.focus(true)

    root.geometry(root.geometry)
  end

  def _create
    DemoVar.prgtext.value = 'Please wait while loading font...'
    DemoVar.prgindic.value = -1

    intro = _create_intro

    Tk.update

    Tk::BWidget::SelectFont.load_font

    descmenu = [
      '&File', 'all', 'file', 0, [
        ['command', 'E&xit', [], 'Exit BWidget demo', [], 
          {:command=>proc{exit}}]
      ], 
      '&Options', 'all', 'options', 0, [
        ['checkbutton', 'Toolbar &1', ['all', 'option'], 
          'Show/hide toolbar 1', [], 
          { :variable=>DemoVar.toolbar1, 
            :command=>proc{
              DemoVar.mainframe.show_toolbar(0, DemoVar.toolbar1.value)
            }
          }
        ], 
        ['checkbutton', 'Toolbar &2', ['all', 'option'], 
          'Show/hide toolbar 2', [], 
          { :variable=>DemoVar.toolbar2, 
            :command=>proc{
              DemoVar.mainframe.show_toolbar(1, DemoVar.toolbar2.value)
            }
          }
        ]
      ]
    ]

    DemoVar.prgtext.value = 'Creating MainFrame...'
    DemoVar.prgindic.value = 0

    DemoVar.mainframe = Tk::BWidget::MainFrame.new(
                                :menu=>descmenu, 
                                :textvariable=>DemoVar.status, 
                                :progressvar=>DemoVar.prgindic
                        )

    # toobar 1 creation
    DemoVar.prgindic.numeric += 1

    DemoVar.mainframe.add_toolbar{|tb1|
      Tk::BWidget::ButtonBox.new(tb1, :spacing=>0, :padx=>1, :pady=>1){|bbox|
        add(:image=>Tk::BWidget::Bitmap.new('new'), 
            :highlightthickness=>0, :takefocus=>0, :relief=>:link, 
            :borderwidth=>1, :padx=>1, :pady=>1, 
            :command=>proc{puts 'select "Create a new file" icon'}, 
            :helptext=>"Create a new file")

        add(:image=>Tk::BWidget::Bitmap.new('open'), 
            :highlightthickness=>0, :takefocus=>0, :relief=>:link, 
            :borderwidth=>1, :padx=>1, :pady=>1, 
            :command=>proc{puts 'select "Open an existing file" icon'}, 
            :helptext=>"Open an existing file")

        add(:image=>Tk::BWidget::Bitmap.new('save'), 
            :highlightthickness=>0, :takefocus=>0, :relief=>:link, 
            :borderwidth=>1, :padx=>1, :pady=>1, 
            :command=>proc{puts 'select "Save file" icon'}, 
            :helptext=>"Save file")

        pack(:side=>:left, :anchor=>:w)
      }

      Tk::BWidget::Separator.new(tb1, :orient=>:vertical){
        pack(:side=>:left, :fill=>:y, :padx=>4, :anchor=>:w)
      }

      DemoVar.prgindic.numeric += 1

      Tk::BWidget::ButtonBox.new(tb1, :spacing=>0, :padx=>1, :pady=>1){|bbox|
        add(:image=>Tk::BWidget::Bitmap.new('cut'), 
            :highlightthickness=>0, :takefocus=>0, :relief=>:link, 
            :borderwidth=>1, :padx=>1, :pady=>1, 
            :command=>proc{puts 'select "Cut selection" icon'}, 
            :helptext=>"Cut selection")

        add(:image=>Tk::BWidget::Bitmap.new('copy'), 
            :highlightthickness=>0, :takefocus=>0, :relief=>:link, 
            :borderwidth=>1, :padx=>1, :pady=>1, 
            :command=>proc{puts 'select "Copy selection" icon'}, 
            :helptext=>"Copy selection")

        add(:image=>Tk::BWidget::Bitmap.new('paste'), 
            :highlightthickness=>0, :takefocus=>0, :relief=>:link, 
            :borderwidth=>1, :padx=>1, :pady=>1, 
            :command=>proc{puts 'select "Paste selection" icon'}, 
            :helptext=>"Paste selection")

        pack(:side=>:left, :anchor=>:w)
      }
    }

    # toolbar 2 creation
    DemoVar.prgindic.numeric += 1

    tb2 = DemoVar.mainframe.add_toolbar
    DemoVar._wfont = Tk::BWidget::SelectFont::Toolbar.new(tb2, 
                       :command=>proc{update_font(DemoVar._wfont[:font])}
                     )
    DemoVar.font = DemoVar._wfont[:font]
    DemoVar._wfont.pack(:side=>:left, :anchor=>:w)

    DemoVar.mainframe.add_indicator(
      :text=>"BWidget #{Tk::BWidget.package_version}"
    )
    DemoVar.mainframe.add_indicator(:textvariable=>'tk_patchLevel')

    # NoteBook creation
    DemoVar.notebook = Tk::BWidget::NoteBook.new(DemoVar.mainframe.get_frame)

    DemoVar.prgtext.value = "Creating Manager..."
    DemoVar.prgindic.numeric += 1
    DemoManager.create(DemoVar.notebook)

    DemoVar.prgtext.value = "Creating Basic..."
    DemoVar.prgindic.numeric += 1
    DemoBasic.create(DemoVar.notebook)

    DemoVar.prgtext.value = "Creating Select..."
    DemoVar.prgindic.numeric += 1
    DemoSelect.create(DemoVar.notebook)

    DemoVar.prgtext.value = "Creating Dialog..."
    DemoVar.prgindic.numeric += 1
    DemoDialog.create(DemoVar.notebook)

    DemoVar.prgtext.value = "Creating Drag and Drop..."
    DemoVar.prgindic.numeric += 1
    DemoDnD.create(DemoVar.notebook)

    DemoVar.prgtext.value = "Creating Tree..."
    DemoVar.prgindic.numeric += 1
    DemoTree.create(DemoVar.notebook)

    DemoVar.prgtext.value = "Done"
    DemoVar.prgindic.numeric += 1

    DemoVar.notebook.compute_size
    DemoVar.notebook.pack(:fill=>:both, :expand=>true, :padx=>4, :pady=>4)
    DemoVar.notebook.raise(DemoVar.notebook.get_page(0))

    DemoVar.mainframe.pack(:fill=>:both, :expand=>true)

    Tk.update_idletasks

    intro.destroy
  end

  def update_font(newfont)
    root = Tk.root
    root[:cursor] = 'watch'
    if newfont != '' && DemoVar.font != newfont
      DemoVar._wfont[:font] = newfont
      DemoVar.notebook[:font] = newfont
      DemoVar.font = newfont
    end
    root[:cursor] = ''
  end

  def _create_intro
    top = TkToplevel.new(:relief=>:raised, :borderwidth=>2)
    top.withdraw
    top.overrideredirect(true)

    ximg  = TkLabel.new(top, :bitmap=>"@#{File.join(DEMODIR,'x1.xbm')}", 
                        :foreground=>'grey90', :background=>'white')
    bwimg = TkLabel.new(ximg, :bitmap=>"@#{File.join(DEMODIR,'bwidget.xbm')}",
                        :foreground=>'grey90', :background=>'white')
    frame = TkFrame.new(ximg, :background=>'white')
    TkLabel.new(frame, :text=>'Loading demo', 
                :background=>'white', :font=>'times 8').pack
    TkLabel.new(frame, :textvariable=>DemoVar.prgtext, 
                :background=>'white', :font=>'times 8', :width=>35).pack
    Tk::BWidget::ProgressBar.new(frame, :width=>50, :height=>10, 
                                 :background=>'white', 
                                 :variable=>DemoVar.prgindic, 
                                 :maximum=>10).pack
    frame.place(:x=>0, :y=>0, :anchor=>:nw)
    bwimg.place(:relx=>1, :rely=>1, :anchor=>:se)
    ximg.pack
    Tk::BWidget.place(top, 0, 0, :center)
    top.deiconify

    top
  end
end

module DemoVar
  Demo = BWidget_Demo.new
end

Tk.mainloop
