# Purpose: Run ri fox gui in a dockpane # # $Id: fox_ri.rb,v 1.5 2005/03/30 14:05:03 ljulliar Exp $ # # Authors: Laurent Julliard # Contributors: # # This file is part of the FreeRIDE project # # 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 Laurent Julliard All rights reserved. # begin require 'rubygems' require_gem 'fxruby', '>= 1.2.0' rescue LoadError require 'fox12' end $: << File.join($FR_CODEBASE,'plugins','rubyide_tools_fox_ri','fxri') require 'rubyide_tools_fox_ri/fxri/fxri' module FreeRIDE; module GUI class RI < Component extend FreeBASE::StandardPlugin include Fox def self.start(plugin) # There can only be one RI session at a time base_slot = plugin["/system/ui/components/RI"] ComponentManager.new(plugin, base_slot, RI, 1) @@ri = nil #--------------------------------------- # After loading fxri we have to do some dirty tricks on fxri # global variables $cfg.app.font.name.unshift(FXApp::instance.normalFont.name) # use FR default font $cfg.ri_font = ["Lucidatypewriter","Bitstream Vera Sans Mono", "Courier New", "Courier"] $cfg.launch_irb = false # do not launch irb $cfg.icons_path = File.join(plugin.plugin_configuration.full_base_path,"icons")# use FR plugin icons $cfg.icons.klass = "class.png" $cfg.icons.class_method = "module.png" $cfg.icons.instance_method = "method.png" $cfg.text.help = %|This is the Ruby Documentation plugin, a graphical interface to the Ruby documentation based on FXri. At any time in the FreeRIDE editor, you can type F1 to get instant help on the keyword below or next to the cursor. FXri also comes with a search engine with quite a few features. Here are several examples: 'Array': Lists all classes with the name Array. Note that upcase words are treated case sensitive, lowercase words insensitive. 'array sort': Everything that contains both array and sort (case insensitive). 'array -Fox': Everything that contain the name array (case insensitive), but not Fox (case sensitive). After searching just press down to browse the search results. Press Tab to move back into the search field. If you have any problems, questions or suggestions about FXri please contact the author at martin.ankerl@gmail.com.| #--------------------------------------- # Handle icons plugin['/system/ui/icons/RI'].subscribe do |event, slot| if event == :notify_slot_add app = plugin['/system/ui/fox/FXApp'].data path = "#{plugin.plugin_configuration.full_base_path}/icons/#{slot.name}.png" if FileTest.exist?(path) slot.data = Fox::FXPNGIcon.new(app, File.open(path, "rb").read) slot.data.create end end end # Create the Run RI command and show it in the # "view" area of the toolbar rather than the "run" area cmd_mgr = plugin["/system/ui/commands"].manager cmd_ri = cmd_mgr.add("App/Run/RunRI","&Ruby Doc") do |cmd_slot| @@ri = RI.new(plugin, base_slot) unless @@ri @@ri.lookup @@ri.show end plugin["/system/ui/keys"].manager.bind("App/Run/RunRI", :F1) cmd_ri.icon = "/system/ui/icons/RI/ri" plugin["/system/ui/current/ToolBar"].manager.add_command("View", "App/Run/RunRI") # Insert the run RI command in the Run menu runmenu = plugin["/system/ui/components/MenuPane/Run_menu"].manager runmenu.add_command("App/Run/RunRI") # Create the "view RI" in the View menu to hide/show the RI pane cmd_view_ri = cmd_mgr.add("App/View/RI","&Ruby Doc","View Ruby Documentation") do |cmd_slot| @@ri.toggle if @@ri end # manage availability of the RI View menu cmd_view_ri.availability = plugin['/system/ui/current'].has_child?('RI') cmd_view_ri.manage_availability do |command| plugin['/system/ui/current'].subscribe do |event, slot| if slot.name=="RI" case event when :notify_slot_link command.availability = true when :notify_slot_unlink command.availability = false end end end end # and attach it to the View menu pane viewmenu = plugin["/system/ui/components/MenuPane/View_menu"].manager viewmenu.add_command("App/View/RI") viewmenu.uncheck("App/View/RI") # Start the RI plugin if it was there at the last session plugin["/system/state/all_plugins_loaded"].subscribe do |event, slot| if slot.data == true if plugin.properties["Open"] # first time re-opening. Don't do a lookup so that # we see the help message @@ri = RI.new(plugin, base_slot) unless @@ri @@ri.show end end end plugin.transition(FreeBASE::RUNNING) end def initialize(plugin, slot) @plugin = plugin @slot = slot @viewmenu = plugin["/system/ui/components/MenuPane/View_menu"].manager @plugin['/system/ui/current'].link('RI',@slot) # Create the RI text frame and reparent it to the dockpane main_window = plugin["/system/ui/fox/FXMainWindow"].data @frm = FXri.new(main_window, FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y,0,0,0,0,0,0,0,0,0,0) @frm.hide @frm.create # Dock the RI frame now that everything is ready @dockpane_slot = plugin['/system/ui/components/DockPane'].manager.add("Ruby Doc") @dockpane_slot.data = @frm @dockpane_slot.manager.dock('south') # When the dockpane informs us that it is opened or closed # adjust the menu item and properties accordingly @dockpane_slot["status"].subscribe do |event, slot| if event == :notify_data_set if @dockpane_slot["status"].data == 'opened' @checked = true @viewmenu.check("App/View/RI") @plugin.properties["Open"] = true elsif @dockpane_slot["status"].data == 'closed' @viewmenu.uncheck("App/View/RI") @checked = false @plugin.properties["Open"] = false end end end setup_actions plugin.log_info << "RI renderer created" end def setup_actions bind_action("lookup", :lookup) end def bind_action(name, meth) @slot["actions/#{name}"].set_proc method(meth) end def lookup(string=nil) show # show dockpane and/or bring to front unless string return unless @plugin['/system/ui/current/EditPane'].is_link_slot? ep_slot = @plugin['/system/ui/current/EditPane'] word,text_before,text_after = ep_slot['actions/help_lookup'].invoke # if there is class/module name before the selected word then look for # both the identifier and the class/module to make for a more accurate #search if text_before =~ /([A-Z][A-Za-z0-9_]*)\.$/ word = "#{$1} #{word}" end string = word end @frm.go_search(string) end def toggle # hide it if visible, show it if invisible @checked ? hide : show end def show @dockpane_slot.manager.show end def hide @dockpane_slot.manager.hide end end end; end