# This application is free software; you can redistribute it and/or
# modify it under the terms of the Ruby license defined in the
# COPYING file.
#
# Copyright (C) 2005 Martin DeMello. All rights reserved.
# Load FXRuby: try gem, then Fox 1.2, then Fox 1.0
begin
# try fxruby gem
require 'rubygems'
require_gem 'fxruby', '>= 1.1.0'
require 'fox12'
require 'fox12/colors'
FOXVERSION="1.2"
include Fox
rescue LoadError
# no gem? try fox12 direct.
begin
require "fox12"
require "fox12/colors"
FOXVERSION="1.2"
include Fox
rescue LoadError
# no gem, no fox12? try fox 1.0
require "fox"
require "fox/colors"
# grep for FOXVERSION to find all code that depends on this
FOXVERSION="1.0"
include Fox
FXMenuBar = FXMenubar
FXToolTip = FXTooltip
FXStatusBar = FXStatusbar
end
end
require 'thread'
require 'lib/RiManager'
require 'lib/Recursive_Open_Struct'
require 'lib/Globals'
require 'lib/Packet_List'
require 'lib/Packet_Item'
require 'lib/Empty_Text_Field_Handler'
require 'lib/Icon_Loader'
require 'lib/Search_Engine'
require 'lib/FoxDisplayer'
require 'lib/FoxTextFormatter'
require 'lib/fxirb'
# Responsible for application initialization
class FXri < FXHorizontalFrame
# Initializes the XDCC-application.
def initialize(p, opts=0, x=0 ,y=0 ,w=0 ,h=0 , pl=DEFAULT_SPACING, pr=DEFAULT_SPACING, pt=DEFAULT_SPACING, pb=DEFAULT_SPACING, hs=DEFAULT_SPACING, vs=DEFAULT_SPACING)
super(p, opts, x ,y ,w ,h , pl, pr, pt, pb, hs, vs)
@isLoaded = false
set_default_font
# load icons
icon_loader = Icon_Loader.new(FXApp::instance)
icon_loader.cfg_to_icons($cfg.icons)
@gui = Recursive_Open_Struct.new
@gui.main = self
@data = Recursive_Open_Struct.new
@data.gui_mutex = Mutex.new
build(self)
FXToolTip.new(FXApp::instance, TOOLTIP_NORMAL)
@gui.close
create_data
@data.close
@search_engine = Search_Engine.new(@gui, @data)
# show init message
@data.displayer.display_information($cfg.text.help)
end
# Automatically called when the Fox application is created
def create
super
show
# load items
Thread.new do
# delayed loading, this speeds up freeride's startup.
sleep 1 if $cfg.delayed_loading
@gui.search_field.enabled = false
load_items
@isLoaded = true
@gui.search_field.enabled = true
@gui.search_field.text = ""
end
end
def create_data
@data.displayer = FoxDisplayer.new(@gui.text)
@data.ri_manager = RiManager.new(@data.displayer)
@data.items = Array.new
@desc = nil
end
# Set the default font to the first font of $cfg.app.font.name that is available on this system.
def set_default_font
@font = load_font($cfg.app.font.name)
FXApp::instance.normalFont = @font if @font
end
# Returns the first font of the given array of font names that can be loaded, or nil.
def load_font(font_array)
# load default font
font = nil
font_array.detect do |name|
next if FXFont.listFonts(name).empty?
font = FXFont.new(FXApp::instance, name, $cfg.app.font.size)
end
font
end
# build gui
def build(parent)
FXSplitter.new(parent, SPLITTER_TRACKING|LAYOUT_FILL_X|LAYOUT_FILL_Y) do |base|
FXVerticalFrame.new(base, LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,$cfg.packet_list_width,0, 0,0,0,0,0,0) do |search_frame|
@gui.search_field = FXTextField.new(search_frame, 1, nil, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|FRAME_SUNKEN)
@gui.search_field.connect(SEL_CHANGED) do |*args|
on_search
end
FXVerticalFrame.new(search_frame, FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0,0,0) do |list_frame|
@gui.packet_list = Packet_List.new(@data, list_frame, nil, 0,
ICONLIST_DETAILED|
ICONLIST_COLUMNS|
#ICONLIST_MINI_ICONS|
HSCROLLER_NEVER|
VSCROLLER_ALWAYS|
ICONLIST_BROWSESELECT|
LAYOUT_FILL_X|
LAYOUT_FILL_Y) do |packet_list|
packet_list.add_header($cfg.text.method_name, $cfg.packet_list_width) { |x| make_sortable(x) }
end
@gui.packet_list.setHeaderSize(0, 1000)
end
@gui.search_label = FXLabel.new(search_frame, "", nil, LAYOUT_FILL_X|LABEL_NORMAL|JUSTIFY_RIGHT, 0,0,0,0, 0,0,0,0)
@gui.packet_list.connect(SEL_SELECTED) do |sender, sel, data|
item = sender.getItem(data).packet_item
show_info(item.data)
end
end
split = FXSplitter.new(base, SPLITTER_TRACKING|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_VERTICAL) if $cfg.launch_irb
right = FXHorizontalFrame.new(($cfg.launch_irb ? split : base), FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0,0,0)
@gui.text = FXText.new(right, nil, 0, TEXT_READONLY|TEXT_WORDWRAP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
if $cfg.launch_irb
irb_frame = FXHorizontalFrame.new(split, FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0,0,0)
@irb_frame = irb_frame
@gui.irb = FXIrb.init(irb_frame, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y|TEXT_WORDWRAP|TEXT_SHOWACTIVE)
@gui.irb.setFont(@font) if @font
split.setSplit(0, $cfg.irb_height)
end
font = load_font($cfg.ri_font)
@gui.text.font = font if font
font.create
@gui.text_width = font.fontWidth
@gui.text.connect(SEL_CONFIGURE) do
on_show if @desc
end
# construct hilite styles
@gui.text.styled = true
@gui.text.hiliteStyles = create_styles
end
end
def create_empty_style
hs = FXHiliteStyle.new
hs.activeBackColor = FXColor::White
hs.hiliteBackColor = FXColor::DarkBlue
hs.normalBackColor = FXColor::White
hs.normalForeColor = FXColor::Black
hs.selectBackColor = FXColor::DarkBlue
hs.selectForeColor = FXColor::White
hs.style = 0
hs
end
def create_styles
styles = Array.new
#normal
styles.push create_empty_style
# bold
hs = create_empty_style
hs.style = FXText::STYLE_BOLD
styles.push hs
# H1
hs = create_empty_style
hs.style = FXText::STYLE_UNDERLINE|FXText::STYLE_BOLD
hs.normalForeColor = FXColor::ForestGreen
styles.push hs
# H2
hs = create_empty_style
hs.style = FXText::STYLE_UNDERLINE
hs.normalForeColor = FXColor::ForestGreen
styles.push hs
# H3
hs = create_empty_style
hs.normalForeColor = FXColor::ForestGreen
styles.push hs
# teletype
hs = create_empty_style
hs.normalForeColor = FXColor::DarkCyan
styles.push hs
# code
hs = create_empty_style
hs.activeBackColor = FXColor::LightGrey
hs.normalForeColor = FXColor::DarkGreen
hs.style = FXText::STYLE_UNDERLINE|FXText::STYLE_BOLD
styles.push hs
# emphasis
hs = create_empty_style
hs.normalForeColor = FXColor::DarkCyan
styles.push hs
# class
hs = create_empty_style
hs.style = FXText::STYLE_BOLD
hs.normalForeColor = FXColor::Blue
styles.push hs
styles
end
# loads all ri items
def load_items
@gui.search_field.text = "loading..."
@data.ri_manager.all_names.each do |name|
icon = case name.type
when NameDescriptor::CLASS
$cfg.icons.klass
when NameDescriptor::INSTANCE_METHOD
$cfg.icons.instance_method
when NameDescriptor::CLASS_METHOD
$cfg.icons.class_method
end
item = Packet_Item.new(@gui.packet_list, icon, name.to_s)
@search_engine.update_search_status_text
item.data = name
@data.items.push item
end
@gui.search_field.text = "sorting..."
@gui.packet_list.on_cmd_header(0)
@gui.packet_list.update_header_width
recalc
end
def go_search(string)
@gui.search_field.text = string
on_search
end
def on_search
# do nothing if not fully loaded
return if !@isLoaded
@search_engine.on_search
end
def on_show
begin
w = @gui.text.width / @gui.text_width - 3
w = [w, $cfg.minimum_letters_per_line].max
@data.ri_manager.show(@desc, w)
rescue RiError => e
#puts desc
end
end
def show_info(desc)
@desc = desc
on_show
end
# x beeing the name of the ri doc, like "Set#delete"
# This creates a sortable representation. First class, then class methods, then instance.
def make_sortable(x)
[ x.downcase.gsub("::", " 1 ").gsub("#", " 2 "),
x.downcase,
x]
end
end
if __FILE__ == $0
Thread.abort_on_exception= true
# move to directory of this file, so that icons can load correctly.
Dir.chdir(File.dirname(File.expand_path(__FILE__)))
application = FXApp.new($cfg.app.name, $cfg.app.name)
application.threadsEnabled = true
#application.init(ARGV)
window = FXMainWindow.new(application, $cfg.app.name, nil, nil, DECOR_ALL, 0, 0, $cfg.app.width, $cfg.app.height)
FXri.new(window,FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0,0,0)
application.create
window.show(PLACEMENT_SCREEN)
application.run
end
syntax highlighted by Code2HTML, v. 0.9.1