Skip to content
Snippets Groups Projects
raabrowser.rb 5.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • require 'fox16'
    require 'cgi'
    require 'soap/wsdlDriver'
    
    include Fox
    
    class RAABrowserWindow < FXMainWindow
      
      def initialize(app)
        # Initialize base class
        super(app, "Ruby Application Archive", :opts => DECOR_ALL, :width => 600, :height => 600)
    
        # Contents
        contents = FXHorizontalFrame.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y)
    
        # Horizontal splitter
        splitter = FXSplitter.new(contents, (LAYOUT_SIDE_TOP|LAYOUT_FILL_X|
        LAYOUT_FILL_Y|SPLITTER_TRACKING|SPLITTER_HORIZONTAL))
    
        # Create a sunken frame to hold the tree list
        groupbox = FXGroupBox.new(splitter, "Contents",
        LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_GROOVE)
        frame = FXHorizontalFrame.new(groupbox,
        LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK)
    
        # Create the empty tree list
        @treeList = FXTreeList.new(frame,
          :opts => TREELIST_BROWSESELECT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_ROOT_BOXES|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        @treeList.connect(SEL_COMMAND) do |sender, sel, item|
          if @treeList.isItemLeaf(item)
            getApp().beginWaitCursor do
              begin
                gem = @raa.gem(item.text)
                @category.value = gem.category.major + "/" + gem.category.minor
                @projectName.value = gem.project.name
                @version.value = gem.project.version
                @status.value = gem.project.status
                @lastUpdate.value = gem.updated.strftime("%F %T GMT")
                @owner.value = "#{gem.owner.name} (#{gem.owner.email.to_s})"
                @homepage.value = gem.project.url.to_s
                @download.value = gem.project.download.to_s
                @license.value = gem.project.license
                @description.value = CGI::unescapeHTML(gem.project.description).gsub(/\r\n/, "\n")
              rescue SOAP::PostUnavailableError => ex
                getApp().endWaitCursor
                FXMessageBox.error(self, MBOX_OK, "SOAP Error", ex.message)
              end
            end
          end
        end
    
        # Set up data targets for the product-specific information
        @category = FXDataTarget.new("")
        @projectName = FXDataTarget.new("")
        @version = FXDataTarget.new("")
        @status = FXDataTarget.new("")
        @lastUpdate = FXDataTarget.new("")
        @owner = FXDataTarget.new("")
        @homepage = FXDataTarget.new("")
        @download = FXDataTarget.new("")
        @license = FXDataTarget.new("")
        @description = FXDataTarget.new("")
        
        # Information appears on the right-hand side
        infoFrame = FXVerticalFrame.new(splitter, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_RIGHT|FRAME_SUNKEN|FRAME_THICK)
    
        infoBox = FXGroupBox.new(infoFrame, "Info", GROUPBOX_NORMAL|LAYOUT_FILL_X|FRAME_GROOVE)
        infoMatrix = FXMatrix.new(infoBox, 2, MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        FXLabel.new(infoMatrix, "Category:")
        FXTextField.new(infoMatrix, 20, @category, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Project name:")
        FXTextField.new(infoMatrix, 20, @projectName, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Version:")
        FXTextField.new(infoMatrix, 20, @version, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Status:")
        FXTextField.new(infoMatrix, 20, @status, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Last update:")
        FXTextField.new(infoMatrix, 20, @lastUpdate, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Owner:")
        FXTextField.new(infoMatrix, 20, @owner, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Homepage:")
        FXTextField.new(infoMatrix, 20, @homepage, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "Download:")
        FXTextField.new(infoMatrix, 20, @download, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
        FXLabel.new(infoMatrix, "License:")
        FXTextField.new(infoMatrix, 20, @license, FXDataTarget::ID_VALUE, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
    
        descriptionBox = FXGroupBox.new(infoFrame, "Description", GROUPBOX_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_GROOVE)
        descriptionFrame = FXHorizontalFrame.new(descriptionBox, FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        FXText.new(descriptionFrame, @description, FXDataTarget::ID_VALUE, TEXT_READONLY|TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
          
        # Initialize the service
        @raa = SOAP::WSDLDriverFactory.new("http://www2.ruby-lang.org/xmlns/soap/interface/RAA/0.0.4/").create_rpc_driver
        
        # Set up the product tree list
        @productTree = @raa.tree_by_category
        @productTree.keys.sort.each do |sectionName|
          sectionHash = @productTree[sectionName]
          sectionItem = @treeList.appendItem(nil, sectionName)
          sectionHash.keys.sort.each do |categoryName|
            categoryArray = sectionHash[categoryName]
            categoryItem = @treeList.appendItem(sectionItem, categoryName)
            categoryArray.each do |productName|
              productItem = @treeList.appendItem(categoryItem, productName)
            end
          end
        end
      end
      
      def create
        super
        @treeList.parent.parent.setWidth(@treeList.font.getTextWidth('M'*24))
        show(PLACEMENT_SCREEN)
      end
    end
    
    if __FILE__ == $0
      app = FXApp.new("RAABrowser", "FoxTest")
      RAABrowserWindow.new(app)
      app.create
      app.run
    end