# Purpose: Setup and initialize the dock bar gui interfaces
#
# $Id: dockbar.rb,v 1.6 2004/10/19 22:13:47 ljulliar Exp $
#
# Authors: Laurent Julliard <laurent AT moldus DOT org>
# 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) 2002 Laurent Julliard. All rights reserved.
#
module FreeRIDE
module FoxRenderer
##
# This is the class that renders dockbars using
# FOX.
#
class DockBar
extend FreeBASE::StandardPlugin
def DockBar.start(plugin)
component_slot = plugin["/system/ui/components/DockBar"]
component_slot.subscribe do |event, slot|
if (event == :notify_slot_add && slot.parent == component_slot)
Renderer.new(plugin, slot)
end
end
component_slot.each_slot { |slot| slot.notify(:notify_slot_add) }
# Now only is the plugin ready
plugin.transition(FreeBASE::RUNNING)
end
##
# Each instance of this class is responsible for rendering a dockbar component
#
class Renderer
include Fox
attr_reader :plugin, :tab, :frame
def initialize(plugin, slot)
@plugin = plugin
@slot = slot
@where = @slot.name # east, west, south
@resizeWidth = @plugin.properties["West/Width"]
@resizeHeight = @plugin.properties["South/Height"]
@resizeWidth ||= 200
@resizeHeight ||= 200
@plugin.log_info << "DockBar #{@slot.name} started"
db_slot = plugin["/system/ui/fox/dockbar/#{@where}"]
@parentFrame = db_slot["frame"].data
case @where
when 'west'
@parentFrame.width = 0 if @parentFrame.width < 6
@tb = FXTabBook.new(@parentFrame, nil, 0,
(LAYOUT_SIDE_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_Y|TABBOOK_BOTTOMTABS)
)
@parentFrame.connect(SEL_UPDATE) do |sender, sel, ptr|
if @parentFrame.width > 6 && @parentFrame.width != @resizeWidth && sender == @parentFrame
@resizeWidth = @parentFrame.width
@plugin.properties["West/Width"] = @resizeWidth
end
0
end
when 'south'
@parentFrame.height = 0 if @parentFrame.height < 6
@tb = FXTabBook.new(@parentFrame, nil, 0,
(LAYOUT_FILL_X| LAYOUT_FILL_Y|TABBOOK_BOTTOMTABS)
)
@parentFrame.connect(SEL_UPDATE) do |sender, sel, ptr|
if @parentFrame.height > 6 && @parentFrame.height != @resizeHeight && sender == @parentFrame
@resizeHeight = @parentFrame.height
@plugin.properties["South/Height"] = @resizeHeight
end
0
end
else
@plugin.log_error << "unknow dockbar '#{@where}'"
end
@tb.padRight = 0
@tb.padTop = 0
@tb.padLeft = 0
@tb.padBottom = 0
@tb.create if @tb
db_slot["tabbook"].data = @tb
setup_actions
@plugin.log_info << "DockBar #{@slot.name} created"
end
def setup_actions
bind_action("show", :show)
bind_action("hide", :hide)
bind_action("current", :current)
end
def bind_action(name, meth)
@slot["actions/#{name}"].set_proc method(meth)
end
def show
all_hidden = true
(@tb.numChildren-1).downto(0) do |i|
tab = @tb.childAtIndex(i)
if (tab.kind_of? Fox::FXTabItem) && tab.shown
all_hidden = false; break
end
end
return if all_hidden
case @where
when 'west'
if @parentFrame.width < 20
@parentFrame.width = @resizeWidth
@parentFrame.show
end
when 'south'
if @parentFrame.height < 20
@parentFrame.height = @resizeHeight
@parentFrame.show
end
end
end
def hide
(@tb.numChildren-1).downto(0) do |i|
tab = @tb.childAtIndex(i)
return if (tab.kind_of? Fox::FXTabItem) && tab.shown
end
case @where
when 'west'
@resizeWidth = @parentFrame.width unless @parentFrame.width==0
@parentFrame.width = 0
@parentFrame.hide
when 'south'
@resizeHeight = @parentFrame.height unless @parentFrame.height==0
@parentFrame.height = 0
@parentFrame.hide
end
end
##
# return the dockpane object (manager) that is currently
# visible in this DockBar
#
def current
@tb.childAtIndex(@tb.getCurrent).userData
end
end
end
end
end
syntax highlighted by Code2HTML, v. 0.9.1