Skip to content
Snippets Groups Projects
tabbook.rb 5.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env ruby
    
    require 'fox16'
    
    include Fox
    
    class TabBookWindow < FXMainWindow
    
      def initialize(app)
        # Call the base class initializer first
        super(app, "Tab Book Test", :opts => DECOR_ALL, :width => 600, :height => 400)
    
        # Make a tooltip
        FXToolTip.new(getApp())
    
        # Menubar appears along the top of the main window
        menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
    
        # Separator
        FXHorizontalSeparator.new(self,
          LAYOUT_SIDE_TOP|LAYOUT_FILL_X|SEPARATOR_GROOVE)
    
        # Contents
        contents = FXHorizontalFrame.new(self,
          LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y|PACK_UNIFORM_WIDTH)
      
        # Switcher
        @tabbook = FXTabBook.new(contents,:opts => LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_RIGHT)
      
        # First item is a list
        @tab1 = FXTabItem.new(@tabbook, "&Simple List", nil)
        listframe = FXHorizontalFrame.new(@tabbook, FRAME_THICK|FRAME_RAISED)
        simplelist = FXList.new(listframe, :opts => LIST_EXTENDEDSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        simplelist.appendItem("First Entry")
        simplelist.appendItem("Second Entry")
        simplelist.appendItem("Third Entry")
        simplelist.appendItem("Fourth Entry")
          
        # Second item is a file list
        @tab2 = FXTabItem.new(@tabbook, "F&ile List", nil)
        @fileframe = FXHorizontalFrame.new(@tabbook, FRAME_THICK|FRAME_RAISED)
        filelist = FXFileList.new(@fileframe, :opts => ICONLIST_EXTENDEDSELECT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        
        # Third item is a directory list
        @tab3 = FXTabItem.new(@tabbook, "T&ree List", nil)
        dirframe = FXHorizontalFrame.new(@tabbook, FRAME_THICK|FRAME_RAISED)
        dirlist = FXDirList.new(dirframe,
          :opts => DIRLIST_SHOWFILES|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        
        # File Menu
        filemenu = FXMenuPane.new(self)
        FXMenuCommand.new(filemenu, "&Simple List", nil,
          @tabbook, FXTabBar::ID_OPEN_FIRST+0)
        FXMenuCommand.new(filemenu, "F&ile List", nil,
          @tabbook, FXTabBar::ID_OPEN_FIRST+1)
        FXMenuCommand.new(filemenu, "T&ree List", nil,
          @tabbook, FXTabBar::ID_OPEN_FIRST+2)
        FXMenuCommand.new(filemenu, "&Quit\tCtl-Q", nil,
          getApp(), FXApp::ID_QUIT)
        FXMenuTitle.new(menubar, "&File", nil, filemenu)
        
        # Tab side
        tabmenu = FXMenuPane.new(self)
        hideShow = FXMenuCheck.new(tabmenu, "Hide/Show Tab 2")
        hideShow.connect(SEL_COMMAND) {
          if @tab2.shown?
            @tab2.hide
            @fileframe.hide
          else
            @tab2.show
            @fileframe.show
          end
          @tab2.recalc
          @fileframe.recalc
        }
        hideShow.connect(SEL_UPDATE) { hideShow.check = @tab2.shown? }
        
        FXMenuSeparator.new(tabmenu)
        
        topTabsCmd = FXMenuRadio.new(tabmenu, "&Top Tabs")
        topTabsCmd.connect(SEL_COMMAND) do
          @tabbook.tabStyle = TABBOOK_TOPTABS
          @tab1.tabOrientation = TAB_TOP
          @tab2.tabOrientation = TAB_TOP
          @tab3.tabOrientation = TAB_TOP
        end
        topTabsCmd.connect(SEL_UPDATE) do |sender, sel, ptr|
          sender.check = (@tabbook.tabStyle == TABBOOK_TOPTABS)
        end
        
        bottomTabsCmd = FXMenuRadio.new(tabmenu, "&Bottom Tabs")
        bottomTabsCmd.connect(SEL_COMMAND) do
          @tabbook.tabStyle = TABBOOK_BOTTOMTABS
          @tab1.tabOrientation = TAB_BOTTOM
          @tab2.tabOrientation = TAB_BOTTOM
          @tab3.tabOrientation = TAB_BOTTOM
        end
        bottomTabsCmd.connect(SEL_UPDATE) do |sender, sel, ptr|
          sender.check = (@tabbook.tabStyle == TABBOOK_BOTTOMTABS)
        end
        
        leftTabsCmd = FXMenuRadio.new(tabmenu, "&Left Tabs")
        leftTabsCmd.connect(SEL_COMMAND) do
          @tabbook.tabStyle = TABBOOK_LEFTTABS
          @tab1.tabOrientation = TAB_LEFT
          @tab2.tabOrientation = TAB_LEFT
          @tab3.tabOrientation = TAB_LEFT
        end
        leftTabsCmd.connect(SEL_UPDATE) do |sender, sel, ptr|
          sender.check = (@tabbook.tabStyle == TABBOOK_LEFTTABS)
        end
        
        rightTabsCmd = FXMenuRadio.new(tabmenu, "&Right Tabs")
        rightTabsCmd.connect(SEL_COMMAND) do
          @tabbook.tabStyle = TABBOOK_RIGHTTABS
          @tab1.tabOrientation = TAB_RIGHT
          @tab2.tabOrientation = TAB_RIGHT
          @tab3.tabOrientation = TAB_RIGHT
        end
        rightTabsCmd.connect(SEL_UPDATE) do |sender, sel, ptr|
          sender.check = (@tabbook.tabStyle == TABBOOK_RIGHTTABS)
        end
        
        FXMenuSeparator.new(tabmenu)
        
        addTabCmd = FXMenuCommand.new(tabmenu, "Add Tab")
        addTabCmd.connect(SEL_COMMAND) do
          FXTabItem.new(@tabbook, "New Tab")
          FXHorizontalFrame.new(@tabbook, FRAME_THICK|FRAME_RAISED) do |hf|
            FXLabel.new(hf, "Always add tab item and contents together.", :opts => LAYOUT_FILL)
          end
          @tabbook.create # realize widgets
          @tabbook.recalc # mark parent layout dirty
        end
        
        removeTabCmd = FXMenuCommand.new(tabmenu, "Remove Last Tab")
        removeTabCmd.connect(SEL_COMMAND) do
          numTabs = @tabbook.numChildren/2
          doomedTab = numTabs - 1
          @tabbook.removeChild(@tabbook.childAtIndex(2*doomedTab+1))
          @tabbook.removeChild(@tabbook.childAtIndex(2*doomedTab))
        end
    
        FXMenuTitle.new(menubar, "&Tab Placement", nil, tabmenu)
      end
    
      def create
        super
        show(PLACEMENT_SCREEN)
      end
    end
    
    if __FILE__ == $0
      # Make an application
      application = FXApp.new("TabBook", "FoxTest")
    
      # Build the main window
      TabBookWindow.new(application)
    
      # Create the application and its windows
      application.create
    
      # Run
      application.run
    end