From 441546edcfbb1b346c87b69c5f578d1a0e522e06 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Mon, 7 Jul 2008 07:36:34 +0000 Subject: add tag v1_8_6_269 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_6_269@17937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ruby_1_8_6/ext/tk/lib/tkextlib/blt/component.rb | 1835 +++++++++++++++++++++++ 1 file changed, 1835 insertions(+) create mode 100644 ruby_1_8_6/ext/tk/lib/tkextlib/blt/component.rb (limited to 'ruby_1_8_6/ext/tk/lib/tkextlib/blt/component.rb') diff --git a/ruby_1_8_6/ext/tk/lib/tkextlib/blt/component.rb b/ruby_1_8_6/ext/tk/lib/tkextlib/blt/component.rb new file mode 100644 index 0000000000..ad78a5430b --- /dev/null +++ b/ruby_1_8_6/ext/tk/lib/tkextlib/blt/component.rb @@ -0,0 +1,1835 @@ +# +# tkextlib/blt/component.rb +# by Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) +# + +require 'tk' +require 'tkextlib/blt.rb' + +module Tk::BLT + module PlotComponent + include TkItemConfigMethod + + module OptKeys + def __item_font_optkeys(id) + ['font', 'tickfont', 'titlefont'] + end + private :__item_font_optkeys + + def __item_numstrval_optkeys(id) + ['xoffset', 'yoffset'] + end + private :__item_numstrval_optkeys + + def __item_boolval_optkeys(id) + ['hide', 'under', 'descending', 'logscale', 'loose', 'showticks', + 'titlealternate', 'scalesymbols', 'minor', 'raised', + 'center', 'decoration', 'landscape', 'maxpect'] + end + private :__item_boolval_optkeys + + def __item_strval_optkeys(id) + ['text', 'label', 'limits', 'title', + 'show', 'file', 'maskdata', 'maskfile', + 'color', 'titlecolor', 'fill', 'outline', 'offdash'] + end + private :__item_strval_optkeys + + def __item_listval_optkeys(id) + ['bindtags'] + end + private :__item_listval_optkeys + + def __item_numlistval_optkeys(id) + ['dashes', 'majorticks', 'minorticks'] + end + private :__item_numlistval_optkeys + + def __item_tkvariable_optkeys(id) + ['variable', 'textvariable', 'colormap', 'fontmap'] + end + private :__item_tkvariable_optkeys + end + + include OptKeys + + def __item_cget_cmd(id) + if id.kind_of?(Array) + # id := [ type, name ] + [self.path, id[0], 'cget', id[1]] + else + [self.path, id, 'cget'] + end + end + private :__item_cget_cmd + + def __item_config_cmd(id) + if id.kind_of?(Array) + # id := [ type, name, ... ] + type, *names = id + [self.path, type, 'configure'].concat(names) + else + [self.path, id, 'configure'] + end + end + private :__item_config_cmd + + def __item_pathname(id) + if id.kind_of?(Array) + id = tagid(id[1]) + end + [self.path, id].join(';') + end + private :__item_pathname + + def axis_cget(id, option) + ret = itemcget(['axis', tagid(id)], option) + end + def axis_configure(*args) + slot = args.pop + if slot.kind_of?(Hash) + value = None + slot = _symbolkey2str(slot) + if cmd = slot.delete('command') + slot['command'] = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + else + value = slot + slot = args.pop + if slot == :command || slot == 'command' + cmd = value + value = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + end + id_list = args.flatten.collect!{|id| tagid(id)}.unshift('axis') + itemconfigure(id_list, slot, value) + end + def axis_configinfo(id, slot=nil) + itemconfiginfo(['axis', tagid(id)], slot) + end + def current_axis_configinfo(id, slot=nil) + current_itemconfiginfo(['axis', tagid(id)], slot) + end + + def crosshairs_cget(option) + itemcget('crosshairs', option) + end + def crosshairs_configure(slot, value=None) + itemconfigure('crosshairs', slot, value) + end + def crosshairs_configinfo(slot=nil) + itemconfiginfo('crosshairs', slot) + end + def current_crosshairs_configinfo(slot=nil) + current_itemconfiginfo('crosshairs', slot) + end + + def element_cget(id, option) + itemcget(['element', tagid(id)], option) + end + def element_configure(*args) + slot = args.pop + if slot.kind_of?(Hash) + value = None + else + value = slot + slot = args.pop + end + id_list = args.flatten.collect!{|id| tagid(id)}.unshift('element') + itemconfigure(id_list, slot, value) + end + def element_configinfo(id, slot=nil) + itemconfiginfo(['element', tagid(id)], slot) + end + def current_element_configinfo(id, slot=nil) + current_itemconfiginfo(['element', tagid(id)], slot) + end + + def bar_cget(id, option) + itemcget(['bar', tagid(id)], option) + end + def bar_configure(*args) + slot = args.pop + if slot.kind_of?(Hash) + value = None + else + value = slot + slot = args.pop + end + id_list = args.flatten.collect!{|id| tagid(id)}.unshift('bar') + itemconfigure(id_list, slot, value) + end + def bar_configinfo(id, slot=nil) + itemconfiginfo(['bar', tagid(id)], slot) + end + def current_bar_configinfo(id, slot=nil) + current_itemconfiginfo(['bar', tagid(id)], slot) + end + + def line_cget(id, option) + itemcget(['line', tagid(id)], option) + end + def line_configure(*args) + slot = args.pop + if slot.kind_of?(Hash) + value = None + else + value = slot + slot = args.pop + end + id_list = args.flatten.collect!{|id| tagid(id)}.unshift('line') + itemconfigure(id_list, slot, value) + end + def line_configinfo(id, slot=nil) + itemconfiginfo(['line', tagid(id)], slot) + end + def current_line_configinfo(id, slot=nil) + current_itemconfiginfo(['line', tagid(id)], slot) + end + + def gridline_cget(option) + itemcget('grid', option) + end + def gridline_configure(slot, value=None) + itemconfigure('grid', slot, value) + end + def gridline_configinfo(slot=nil) + itemconfiginfo('grid', slot) + end + def current_gridline_configinfo(slot=nil) + current_itemconfiginfo('grid', slot) + end + + def legend_cget(option) + itemcget('legend', option) + end + def legend_configure(slot, value=None) + itemconfigure('legend', slot, value) + end + def legend_configinfo(slot=nil) + itemconfiginfo('legend', slot) + end + def current_legend_configinfo(slot=nil) + current_itemconfiginfo('legend', slot) + end + + def pen_cget(id, option) + itemcget(['pen', tagid(id)], option) + end + def pen_configure(*args) + slot = args.pop + if slot.kind_of?(Hash) + value = None + else + value = slot + slot = args.pop + end + id_list = args.flatten.collect!{|id| tagid(id)}.unshift('pen') + itemconfigure(id_list, slot, value) + end + def pen_configinfo(id, slot=nil) + itemconfiginfo(['pen', tagid(id)], slot) + end + def current_pen_configinfo(id, slot=nil) + current_itemconfiginfo(['pen', tagid(id)], slot) + end + + def postscript_cget(option) + itemcget('postscript', option) + end + def postscript_configure(slot, value=None) + itemconfigure('postscript', slot, value) + end + def postscript_configinfo(slot=nil) + itemconfiginfo('postscript', slot) + end + def current_postscript_configinfo(slot=nil) + current_itemconfiginfo('postscript', slot) + end + + def marker_cget(id, option) + itemcget(['marker', tagid(id)], option) + end + def marker_configure(*args) + slot = args.pop + if slot.kind_of?(Hash) + value = None + else + value = slot + slot = args.pop + end + id_list = args.flatten.collect!{|id| tagid(id)}.unshift('marker') + itemconfigure(id_list, slot, value) + end + def marker_configinfo(id, slot=nil) + itemconfiginfo(['marker', tagid(id)], slot) + end + def current_marker_configinfo(id, slot=nil) + current_itemconfiginfo(['marker', tagid(id)], slot) + end + + alias __itemcget itemcget + alias __itemconfiginfo itemconfiginfo + alias __current_itemconfiginfo current_itemconfiginfo + private :__itemcget, :__itemconfiginfo, :__current_itemconfiginfo + + def itemcget(tagOrId, option) + ret = __itemcget(tagid(tagOrId), option) + if option == 'bindtags' || option == :bindtags + ret.collect{|tag| TkBindTag.id2obj(tag)} + else + ret + end + end + def itemconfiginfo(tagOrId, slot = nil) + ret = __itemconfiginfo(tagid(tagOrId), slot) + + if TkComm::GET_CONFIGINFO_AS_ARRAY + if slot + if slot == 'bindtags' || slot == :bindtags + ret[-2] = ret[-2].collect{|tag| TkBindTag.id2obj(tag)} + ret[-1] = ret[-1].collect{|tag| TkBindTag.id2obj(tag)} + end + else + if (inf = ret.assoc('bindtags')) + inf[-2] = inf[-2].collect{|tag| TkBindTag.id2obj(tag)} + inf[-1] = inf[-1].collect{|tag| TkBindTag.id2obj(tag)} + end + end + + else # ! TkComm::GET_CONFIGINFO_AS_ARRAY + if (inf = ret['bindtags']) + inf[-2] = inf[-2].collect{|tag| TkBindTag.id2obj(tag)} + inf[-1] = inf[-1].collect{|tag| TkBindTag.id2obj(tag)} + ret['bindtags'] = inf + end + end + + ret + end + def current_itemconfiginfo(tagOrId, slot = nil) + ret = __current_itemconfiginfo(tagid(tagOrId), slot) + + if (val = ret['bindtags']) + ret['bindtags'] = val.collect{|tag| TkBindTag.id2obj(tag)} + end + + ret + end + + private :itemcget, :itemconfigure + private :itemconfiginfo, :current_itemconfiginfo + + ################# + + class Axis < TkObject + OBJ_ID = ['blt_chart_axis'.freeze, '00000'.taint].freeze + OBJ_TBL={} + + def self.id2obj(chart, id) + cpath = chart.path + return id unless OBJ_TBL[cpath] + OBJ_TBL[cpath][id]? OBJ_TBL[cpath][id]: id + end + + def self.new(chart, axis=nil, keys={}) + if axis.kind_of?(Hash) + keys = axis + axis = nil + end + OBJ_TBL[chart.path] = {} unless OBJ_TBL[chart.path] + return OBJ_TBL[chart.path][axis] if axis && OBJ_TBL[chart.path][axis] + super(chart, axis, keys) + end + + def initialize(chart, axis=nil, keys={}) + if axis.kind_of?(Hash) + keys = axis + axis = nil + end + if axis + @axis = @id = axis.to_s + else + @axis = @id = OBJ_ID.join(TkCore::INTERP._ip_id_).freeze + OBJ_ID[1].succ! + end + @path = @id + @parent = @chart = chart + @cpath = @chart.path + Axis::OBJ_TBL[@cpath][@axis] = self + keys = _symbolkey2str(keys) + unless keys.delete('without_creating') + # @chart.axis_create(@axis, keys) + tk_call(@chart, 'axis', 'create', @axis, keys) + end + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.axis_cget(@id, option) + end + def configure(key, value=None) + @chart.axis_configure(@id, key, value) + self + end + def configinfo(key=nil) + @chart.axis_configinfo(@id, key) + end + def current_configinfo(key=nil) + @chart.current_axis_configinfo(@id, key) + end + + def command(cmd=nil, &b) + if cmd + configure('command', cmd) + elsif b + configure('command', Proc.new(&b)) + else + cget('command') + end + end + + def delete + @chart.axis_delete(@id) + self + end + + def invtransform(val) + @chart.axis_invtransform(@id, val) + end + + def limits + @chart.axis_limits(@id) + end + + def name + @axis + end + + def transform(val) + @chart.axis_transform(@id, val) + end + + def view + @chart.axis_view(@id) + self + end + + def use(name=None) # if @id == xaxis | x2axis | yaxis | y2axis + @chart.axis_use(@id, name) + end + + def use_as(axis) # axis := xaxis | x2axis | yaxis | y2axis + @chart.axis_use(axis, @id) + end + end + + ################# + + class Crosshairs < TkObject + OBJ_TBL={} + + def self.new(chart, keys={}) + return OBJ_TBL[chart.path] if OBJ_TBL[chart.path] + super(chart, keys) + end + + def initialize(chart, keys={}) + @parent = @chart = chart + @cpath = @chart.path + Crosshairs::OBJ_TBL[@cpath] = self + @chart.crosshair_configure(keys) unless keys.empty? + @path = @id = 'crosshairs' + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.crosshair_cget(option) + end + def configure(key, value=None) + @chart.crosshair_configure(key, value) + self + end + def configinfo(key=nil) + @chart.crosshair_configinfo(key) + end + def current_configinfo(key=nil) + @chart.current_crosshair_configinfo(key) + end + + def off + @chart.crosshair_off + self + end + def on + @chart.crosshair_on + self + end + def toggle + @chart.crosshair_toggle + self + end + end + + ################# + + class Element < TkObject + extend Tk + extend TkItemFontOptkeys + extend TkItemConfigOptkeys + + extend Tk::BLT::PlotComponent::OptKeys + + ElementTypeName = 'element' + ElementTypeToClass = { ElementTypeName=>self } + ElementID_TBL = TkCore::INTERP.create_table + + TkCore::INTERP.init_ip_env{ ElementID_TBL.clear } + + OBJ_ID = ['blt_chart_element'.freeze, '00000'.taint].freeze + OBJ_TBL={} + + def Element.type2class(type) + ElementTypeToClass[type] + end + + def Element.id2obj(chart, id) + cpath = chart.path + return id unless OBJ_TBL[cpath] + OBJ_TBL[cpath][id]? OBJ_TBL[cpath][id]: id + end + + def self.new(chart, element=nil, keys={}) + if element.kind_of?(Hash) + keys = element + element = nil + end + OBJ_TBL[chart.path] = {} unless OBJ_TBL[chart.path] + if element && OBJ_TBL[chart.path][element] + return OBJ_TBL[chart.path][element] + end + super(chart, element, keys) + end + + def initialize(chart, element=nil, keys={}) + if element.kind_of?(Hash) + keys = element + element = nil + end + if element + @element = @id = element.to_s + else + @element = @id = OBJ_ID.join(TkCore::INTERP._ip_id_).freeze + OBJ_ID[1].succ! + end + @path = @id + @parent = @chart = chart + @cpath = @chart.path + @typename = self.class::ElementTypeName + Element::OBJ_TBL[@cpath][@element] = self + keys = _symbolkey2str(keys) + unless keys.delete('without_creating') + # @chart.element_create(@element, keys) + tk_call(@chart, @typename, 'create', @element, keys) + end + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + # @chart.element_cget(@id, option) + @chart.__send__(@typename + '_cget', @id, option) + end + def configure(key, value=None) + # @chart.element_configure(@id, key, value) + @chart.__send__(@typename + '_configure', @id, key, value) + self + end + def configinfo(key=nil) + # @chart.element_configinfo(@id, key) + @chart.__send__(@typename + '_configinfo', @id, key) + end + def current_configinfo(key=nil) + # @chart.current_element_configinfo(@id, key) + @chart.__send__('current_' << @typename << '_configinfo', @id, key) + end + + def activate(*args) + @chart.element_activate(@id, *args) + end + + def closest(x, y, var, keys={}) + # @chart.element_closest(x, y, var, @id, keys) + @chart.__send__(@typename + '_closest', x, y, var, @id, keys) + end + + def deactivate + @chart.element_deactivate(@id) + self + end + + def delete + @chart.element_delete(@id) + self + end + + def exist? + @chart.element_exist?(@id) + end + + def name + @element + end + + def type + @chart.element_type(@id) + end + end + + class Bar < Element + ElementTypeName = 'bar'.freeze + ElementTypeToClass[ElementTypeName] = self + end + class Line < Element + ElementTypeName = 'line'.freeze + ElementTypeToClass[ElementTypeName] = self + end + + ################# + + class GridLine < TkObject + OBJ_TBL={} + + def self.new(chart, keys={}) + return OBJ_TBL[chart.path] if OBJ_TBL[chart.path] + super(chart, keys) + end + + def initialize(chart, keys={}) + @parent = @chart = chart + @cpath = @chart.path + GridLine::OBJ_TBL[@cpath] = self + @chart.gridline_configure(keys) unless keys.empty? + @path = @id = 'grid' + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.gridline_cget(option) + end + def configure(key, value=None) + @chart.gridline_configure(key, value) + self + end + def configinfo(key=nil) + @chart.gridline_configinfo(key) + end + def current_configinfo(key=nil) + @chart.current_gridline_configinfo(key) + end + + def off + @chart.gridline_off + self + end + def on + @chart.gridline_on + self + end + def toggle + @chart.gridline_toggle + self + end + end + + ################# + + class Legend < TkObject + OBJ_TBL={} + + def self.new(chart, keys={}) + return OBJ_TBL[chart.path] if OBJ_TBL[chart.path] + super(chart, keys) + end + + def initialize(chart, keys={}) + @parent = @chart = chart + @cpath = @chart.path + Crosshairs::OBJ_TBL[@cpath] = self + @chart.crosshair_configure(keys) unless keys.empty? + @path = @id = 'legend' + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.legend_cget(option) + end + def configure(key, value=None) + @chart.legend_configure(key, value) + self + end + def configinfo(key=nil) + @chart.legend_configinfo(key) + end + def current_configinfo(key=nil) + @chart.current_legend_configinfo(key) + end + + def activate(*args) + @chart.legend_activate(*args) + end + + def deactivate(*args) + @chart.legend_deactivate(*args) + end + + def get(pos, y=nil) + @chart.legend_get(pos, y) + end + end + + ################# + + class Pen < TkObject + OBJ_ID = ['blt_chart_pen'.freeze, '00000'.taint].freeze + OBJ_TBL={} + + def self.id2obj(chart, id) + cpath = chart.path + return id unless OBJ_TBL[cpath] + OBJ_TBL[cpath][id]? OBJ_TBL[cpath][id]: id + end + + def self.new(chart, pen=nil, keys={}) + if pen.kind_of?(Hash) + keys = pen + pen = nil + end + OBJ_TBL[chart.path] = {} unless OBJ_TBL[chart.path] + return OBJ_TBL[chart.path][pen] if pen && OBJ_TBL[chart.path][pen] + super(chart, pen, keys) + end + + def initialize(chart, pen=nil, keys={}) + if pen.kind_of?(Hash) + keys = pen + pen = nil + end + if pen + @pen = @id = pen.to_s + else + @pen = @id = OBJ_ID.join(TkCore::INTERP._ip_id_).freeze + OBJ_ID[1].succ! + end + @path = @id + @parent = @chart = chart + @cpath = @chart.path + Pen::OBJ_TBL[@cpath][@pen] = self + keys = _symbolkey2str(keys) + unless keys.delete('without_creating') + # @chart.pen_create(@pen, keys) + tk_call(@chart, 'pen', 'create', @pen, keys) + end + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.pen_cget(@id, option) + end + def configure(key, value=None) + @chart.pen_configure(@id, key, value) + self + end + def configinfo(key=nil) + @chart.pen_configinfo(@id, key) + end + def current_configinfo(key=nil) + @chart.current_pen_configinfo(@id, key) + end + + def delete + @chart.pen_delete(@id) + self + end + + def name + @pen + end + end + + ################# + + class Postscript < TkObject + OBJ_TBL={} + + def self.new(chart, keys={}) + return OBJ_TBL[chart.path] if OBJ_TBL[chart.path] + super(chart, keys) + end + + def initialize(chart, keys={}) + @parent = @chart = chart + @cpath = @chart.path + Postscript::OBJ_TBL[@cpath] = self + @chart.postscript_configure(keys) unless keys.empty? + @path = @id = 'postscript' + end + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.postscript_cget(option) + end + def configure(key, value=None) + @chart.postscript_configure(key, value) + self + end + def configinfo(key=nil) + @chart.postscript_configinfo(key) + end + def current_configinfo(key=nil) + @chart.current_postscript_configinfo(key) + end + + def output(file=nil, keys={}) + if file.kind_of?(Hash) + keys = file + file = nil + end + + ret = @chart.postscript_output(file, keys) + + if file + self + else + ret + end + end + end + + ################# + class Marker < TkObject + extend Tk + extend TkItemFontOptkeys + extend TkItemConfigOptkeys + + extend Tk::BLT::PlotComponent::OptKeys + + MarkerTypeName = nil + MarkerTypeToClass = {} + MarkerID_TBL = TkCore::INTERP.create_table + + TkCore::INTERP.init_ip_env{ MarkerID_TBL.clear } + + def Marker.type2class(type) + MarkerTypeToClass[type] + end + + def Marker.id2obj(chart, id) + cpath = chart.path + return id unless MarkerID_TBL[cpath] + MarkerID_TBL[cpath][id]? MarkerID_TBL[cpath][id]: id + end + + def self._parse_create_args(keys) + fontkeys = {} + methodkeys = {} + if keys.kind_of? Hash + keys = _symbolkey2str(keys) + + __item_font_optkeys(nil).each{|key| + fkey = key.to_s + fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey) + + fkey = "kanji#{key}" + fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey) + + fkey = "latin#{key}" + fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey) + + fkey = "ascii#{key}" + fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey) + } + + __item_methodcall_optkeys(nil).each{|key| + key = key.to_s + methodkeys[key] = keys.delete(key) if keys.key?(key) + } + + __item_ruby2val_optkeys(nil).each{|key, method| + key = key.to_s + keys[key] = method.call(keys[key]) if keys.has_key?(key) + } + + args = itemconfig_hash_kv(nil, keys) + else + args = [] + end + + [args, fontkeys] + end + private_class_method :_parse_create_args + + def self.create(chart, keys={}) + unless self::MarkerTypeName + fail RuntimeError, "#{self} is an abstract class" + end + args, fontkeys = _parse_create_args(keys) + idnum = tk_call_without_enc(chart.path, 'marker', 'create', + self::MarkerTypeName, *args) + chart.marker_configure(idnum, fontkeys) unless fontkeys.empty? + idnum.to_i # 'item id' is an integer number + end + + def self.create_type(chart, type, keys={}) + args, fontkeys = _parse_create_args(keys) + idnum = tk_call_without_enc(chart.path, 'marker', 'create', + type, *args) + chart.marker_configure(idnum, fontkeys) unless fontkeys.empty? + id = idnum.to_i # 'item id' is an integer number + obj = self.allocate + obj.instance_eval{ + @parent = @chart = chart + @cpath = chart.path + @id = id + unless Tk::BLT::PlotComponent::Marker::MarkerID_TBL[@cpath] + Tk::BLT::PlotComponent::Marker::MarkerID_TBL[@cpath] = {} + end + Tk::BLT::PlotComponent::Marker::MarkerID_TBL[@cpath][@id] = self + } + obj + end + + def initialize(parent, *args) + @parent = @chart = parent + @cpath = parent.path + + @path = @id = create_self(*args) # an integer number as 'item id' + unless Tk::BLT::PlotComponent::Marker::MarkerID_TBL[@cpath] + Tk::BLT::PlotComponent::Marker::MarkerID_TBL[@cpath] = {} + end + Tk::BLT::PlotComponent::Marker::MarkerID_TBL[@cpath][@id] = self + end + def create_self(*args) + self.class.create(@chart, *args) # return an integer as 'item id' + end + private :create_self + + def id + @id + end + + def to_eval + @id + end + + def cget(option) + @chart.marker_cget(@id, option) + end + def configure(key, value=None) + @chart.marker_configure(@id, key, value) + self + end + def configinfo(key=nil) + @chart.marker_configinfo(@id, key) + end + def current_configinfo(key=nil) + @chart.current_marker_configinfo(@id, key) + end + + def after(target=None) + @chart.marker_after(@id, target) + end + + def before(target=None) + @chart.marker_before(@id, target) + end + + def delete + @chart.marker_delete(@id) + end + + def exist? + @chart.marker_exist(@id) + end + + def type + @chart.marker_type(@id) + end + end + + class TextMarker < Marker + MarkerTypeName = 'text'.freeze + MarkerTypeToClass[MarkerTypeName] = self + end + class LineMarker < Marker + MarkerTypeName = 'line'.freeze + MarkerTypeToClass[MarkerTypeName] = self + end + class BitmapMarker < Marker + MarkerTypeName = 'bitmap'.freeze + MarkerTypeToClass[MarkerTypeName] = self + end + class ImageMarker < Marker + MarkerTypeName = 'image'.freeze + MarkerTypeToClass[MarkerTypeName] = self + end + class PolygonMarker < Marker + MarkerTypeName = 'polygon'.freeze + MarkerTypeToClass[MarkerTypeName] = self + end + class WindowMarker < Marker + MarkerTypeName = 'window'.freeze + MarkerTypeToClass[MarkerTypeName] = self + end + + ################# + + def __destroy_hook__ + Axis::OBJ_TBL.delete(@path) + Crosshairs::OBJ_TBL.delete(@path) + Element::OBJ_TBL.delete(@path) + GridLine::OBJ_TBL.delete(@path) + Legend::OBJ_TBL.delete(@path) + Pen::OBJ_TBL.delete(@path) + Postscript::OBJ_TBL.delete(@path) + Marker::OBJ_TBL.delete(@path) + super() + end + + ################# + + def tagid(tag) + if tag.kind_of?(Axis) || + tag.kind_of?(Crosshairs) || + tag.kind_of?(Element) || + tag.kind_of?(GridLine) || + tag.kind_of?(Legend) || + tag.kind_of?(Pen) || + tag.kind_of?(Postscript) || + tag.kind_of?(Marker) + tag.id + else + tag # maybe an Array of configure paramters + end + end + + def _component_bind(target, tag, context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind([path, target, 'bind', tagid(tag)], context, cmd, *args) + self + end + def _component_bind_append(target, tag, context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind_append([path, target, 'bind', tagid(tag)], context, cmd, *args) + self + end + def _component_bind_remove(target, tag, context) + _bind_remove([path, target, 'bind', tagid(tag)], context) + self + end + def _component_bindinfo(target, tag, context=nil) + _bindinfo([path, target, 'bind', tagid(tag)], context) + end + private :_component_bind, :_component_bind_append + private :_component_bind_remove, :_component_bindinfo + + def axis_bind(tag, context, *args) + _component_bind('axis', tag, context, *args) + end + def axis_bind_append(tag, context, *args) + _component_bind_append('axis', tag, context, *args) + end + def axis_bind_remove(tag, context) + _component_bind_remove('axis', tag, context) + end + def axis_bindinfo(tag, context=nil) + _component_bindinfo('axis', tag, context) + end + + def element_bind(tag, context, *args) + _component_bind('element', tag, context, *args) + end + def element_bind_append(tag, context, *args) + _component_bind_append('element', tag, context, *args) + end + def element_bind_remove(tag, context) + _component_bind_remove('element', tag, context) + end + def element_bindinfo(tag, context=nil) + _component_bindinfo('element', tag, context) + end + + def bar_bind(tag, context, *args) + _component_bind('bar', tag, context, *args) + end + def bar_bind_append(tag, context, *args) + _component_bind_append('bar', tag, context, *args) + end + def bar_bind_remove(tag, context) + _component_bind_remove('bar', tag, context) + end + def bar_bindinfo(tag, context=nil) + _component_bindinfo('bar', tag, context) + end + + def line_bind(tag, context, *args) + _component_bind('line', tag, context, *args) + end + def line_bind_append(tag, context, *args) + _component_bind_append('line', tag, context, *args) + end + def line_bind_remove(tag, context) + _component_bind_remove('line', tag, context) + end + def line_bindinfo(tag, context=nil) + _component_bindinfo('line', tag, context) + end + + def legend_bind(tag, context, *args) + _component_bind('legend', tag, context, *args) + end + def legend_bind_append(tag, context, *args) + _component_bind_append('legend', tag, context, *args) + end + def legend_bind_remove(tag, context) + _component_bind_remove('legend', tag, context) + end + def legend_bindinfo(tag, context=nil) + _component_bindinfo('legend', tag, context) + end + + def marker_bind(tag, context, *args) + _component_bind('marker', tag, context, *args) + end + def marker_bind_append(tag, context, *args) + _component_bind_append('marker', tag, context, *args) + end + def marker_bind_remove(tag, context) + _component_bind_remove('marker', tag, context) + end + def marker_bindinfo(tag, context=nil) + _component_bindinfo('marker', tag, context) + end + + ################### + + def axis_create(id=nil, keys={}) + # tk_send('axis', 'create', tagid(id), keys) + Tk::BLT::PlotComponent::Axis.new(self, tagid(id), keys) + end + def axis_delete(*ids) + tk_send('axis', 'delete', *(ids.collect{|id| tagid(id)})) + self + end + def axis_invtransform(id, val) + list(tk_send('axis', 'invtransform', tagid(id), val)) + end + def axis_limits(id) + list(tk_send('axis', 'limits', tagid(id))) + end + def axis_names(*pats) + simplelist(tk_send('axis', 'names', + *(pats.collect{|pat| tagid(pat)}))).collect{|axis| + Tk::BLT::PlotComponent::Axis.id2obj(self, axis) + } + end + def axis_transform(id, val) + list(tk_send('axis', 'transform', tagid(id), val)) + end + def axis_view(id) + tk_send('axis', 'view', tagid(id)) + self + end + def axis_use(id, target=nil) + if target + Tk::BLT::PlotComponent::Axis.id2obj(self, + tk_send('axis', 'use', + tagid(id), tagid(target))) + else + Tk::BLT::PlotComponent::Axis.id2obj(self, + tk_send('axis', 'use', tagid(id))) + end + end + + ################### + + def crosshairs_off + tk_send_without_enc('crosshairs', 'off') + self + end + def crosshairs_on + tk_send_without_enc('crosshairs', 'on') + self + end + def crosshairs_toggle + tk_send_without_enc('crosshairs', 'toggle') + self + end + + ################### + + def element_create(id=nil, keys={}) + # tk_send('element', 'create', tagid(id), keys) + Tk::BLT::PlotComponent::Element.new(self, tagid(id), keys) + end + def element_activate(*args) + if args.empty? + list(tk_send('element', 'activate')).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + else + # id, *indices + id = args.shift + tk_send('element', 'activate', tagid(id), *args) + end + end + def element_closest(x, y, var, *args) + if args[-1].kind_of?(Hash) + keys = args.pop + bool(tk_send('element', 'closest', x, y, var, + *(hash_kv(keys).concat(args.collect{|id| tagid(id)})))) + else + bool(tk_send('element', 'closest', x, y, var, + *(args.collect{|id| tagid(id)}))) + end + end + def element_deactivate(*ids) + tk_send('element', 'deactivate', *(ids.collect{|id| tagid(id)})) + self + end + def element_delete(*ids) + tk_send('element', 'delete', *(ids.collect{|id| tagid(id)})) + self + end + def element_exist?(id) + bool(tk_send('element', 'exists', tagid(id))) + end + def element_names(*pats) + simplelist(tk_send('element', 'names', + *(pats.collect{|pat| tagid(pat)}))).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + end + def element_show(*names) + if names.empty? + simplelist(tk_send('element', 'show')) + else + tk_send('element', 'show', *(names.collect{|n| tagid(n)})) + self + end + end + def element_type(id) + tk_send('element', 'type', tagid(id)) + end + + ################### + + def bar_create(id=nil, keys={}) + # tk_send('bar', 'create', tagid(id), keys) + Tk::BLT::PlotComponent::Bar.new(self, tagid(id), keys) + end + alias bar bar_create + def bar_activate(*args) + if args.empty? + list(tk_send('bar', 'activate')).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + else + # id, *indices + id = args.shift + tk_send('bar', 'activate', tagid(id), *args) + end + end + def bar_closest(x, y, var, *args) + if args[-1].kind_of?(Hash) + keys = args.pop + bool(tk_send('bar', 'closest', x, y, var, + *(hash_kv(keys).concat(args.collect{|id| tagid(id)})))) + else + bool(tk_send('bar', 'closest', x, y, var, + *(args.collect{|id| tagid(id)}))) + end + end + def bar_deactivate(*ids) + tk_send('bar', 'deactivate', *(ids.collect{|id| tagid(id)})) + self + end + def bar_delete(*ids) + tk_send('bar', 'delete', *(ids.collect{|id| tagid(id)})) + self + end + def bar_exist?(id) + bool(tk_send('bar', 'exists', tagid(id))) + end + def bar_names(*pats) + simplelist(tk_send('bar', 'names', + *(pats.collect{|pat| tagid(pat)}))).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + end + def bar_show(*names) + if names.empty? + simplelist(tk_send('bar', 'show')) + else + tk_send('bar', 'show', *(names.collect{|n| tagid(n)})) + self + end + end + def bar_type(id) + tk_send('bar', 'type', tagid(id)) + end + + ################### + + def line_create(id=nil, keys={}) + # tk_send('line', 'create', tagid(id), keys) + Tk::BLT::PlotComponent::Line.new(self, tagid(id), keys) + end + alias bar line_create + def line_activate(*args) + if args.empty? + list(tk_send('line', 'activate')).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + else + # id, *indices + id = args.shift + tk_send('line', 'activate', tagid(id), *args) + end + end + def line_closest(x, y, var, *args) + if args[-1].kind_of?(Hash) + keys = args.pop + bool(tk_send('line', 'closest', x, y, var, + *(hash_kv(keys).concat(args.collect{|id| tagid(id)})))) + else + bool(tk_send('line', 'closest', x, y, var, + *(args.collect{|id| tagid(id)}))) + end + end + def line_deactivate(*ids) + tk_send('line', 'deactivate', *(ids.collect{|id| tagid(id)})) + self + end + def line_delete(*ids) + tk_send('line', 'delete', *(ids.collect{|id| tagid(id)})) + self + end + def line_exist?(id) + bool(tk_send('line', 'exists', tagid(id))) + end + def line_names(*pats) + simplelist(tk_send('line', 'names', + *(pats.collect{|pat| tagid(pat)}))).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + end + def line_show(*names) + if names.empty? + simplelist(tk_send('line', 'show')) + else + tk_send('line', 'show', *(names.collect{|n| tagid(n)})) + self + end + end + def line_type(id) + tk_send('line', 'type', tagid(id)) + end + + ################### + + def gridline_off + tk_send_without_enc('grid', 'off') + self + end + def gridline_on + tk_send_without_enc('grid', 'on') + self + end + def gridline_toggle + tk_send_without_enc('grid', 'toggle') + self + end + + ################### + + def legend_window_create(parent=nil, keys=nil) + if parent.kind_of?(Hash) + keys = _symbolkey2str(parent) + parent = keys.delete('parent') + widgetname = keys.delete('widgetname') + keys.delete('without_creating') + elsif keys + keys = _symbolkey2str(keys) + widgetname = keys.delete('widgetname') + keys.delete('without_creating') + end + + legend = self.class.new(parent, :without_creating=>true, + :widgetname=>widgetname) + class << legend + def __destroy_hook__ + TkCore::INTERP.tk_windows.delete(@path) + end + end + + if keys + self.legend_configure(keys.update('position'=>legend)) + else + self.legend_configure('position'=>legend) + end + legend + end + + def legend_activate(*pats) + list(tk_send('legend', 'activate', + *(pats.collect{|pat| tagid(pat)}))).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + end + def legend_deactivate(*pats) + list(tk_send('legend', 'deactivate', + *(pats.collect{|pat| tagid(pat)}))).collect{|elem| + Tk::BLT::PlotComponent::Element.id2obj(self, elem) + } + end + def legend_get(pos, y=nil) + if y + Tk::BLT::PlotComponent::Element.id2obj(self, + tk_send('legend', 'get', + _at(pos, y))) + else + Tk::BLT::PlotComponent::Element.id2obj(self, + tk_send('legend', 'get', pos)) + end + end + + ################### + + def pen_create(id=nil, keys={}) + # tk_send('pen', 'create', tagid(id), keys) + Tk::BLT::PlotComponent::Pen.new(self, tagid(id), keys) + end + def pen_delete(*ids) + tk_send('pen', 'delete', *(ids.collect{|id| tagid(id)})) + self + end + def pen_names(*pats) + simplelist(tk_send('pen', 'names', + *(pats.collect{|pat| tagid(pat)}))).collect{|pen| + Tk::BLT::PlotComponent::Pen.id2obj(self, pen) + } + end + + ################### + + def postscript_output(file=nil, keys={}) + if file.kind_of?(Hash) + keys = file + file = nil + end + + if file + tk_send('postscript', 'output', file, keys) + self + else + tk_send('postscript', 'output', keys) + end + end + + ################### + + def marker_create(type, keys={}) + case type + when :text, 'text' + Tk::BLT::PlotComponent::TextMarker.new(self, keys) + when :line, 'line' + Tk::BLT::PlotComponent::LineMarker.new(self, keys) + when :bitmap, 'bitmap' + Tk::BLT::PlotComponent::BitmapMarker.new(self, keys) + when :image, 'image' + Tk::BLT::PlotComponent::ImageMarker.new(self, keys) + when :polygon, 'polygon' + Tk::BLT::PlotComponent::PolygonMarker.new(self, keys) + when :window, 'window' + Tk::BLT::PlotComponent::WindowMarker.new(self, keys) + else + if type.kind_of?(Tk::BLT::PlotComponent::Marker) + type.new(self, keys) + else + Tk::BLT::PlotComponent::Marker.create_type(self, type, keys) + end + end + end + def marker_after(id, target=nil) + if target + tk_send_without_enc('marker', 'after', tagid(id), tagid(target)) + else + tk_send_without_enc('marker', 'after', tagid(id)) + end + self + end + def marker_before(id, target=None) + if target + tk_send_without_enc('marker', 'before', tagid(id), tagid(target)) + else + tk_send_without_enc('marker', 'before', tagid(id)) + end + self + end + def marker_delete(*ids) + tk_send('marker', 'delete', *(ids.collect{|id| tagid(id)})) + self + end + def marker_exist?(id) + bool(tk_send('marker', 'exists', tagid(id))) + end + def marker_names(*pats) + simplelist(tk_send('marker', 'names', + *(pats.collect{|pat| tagid(pat)}))).collect{|id| + Tk::BLT::PlotComponent::Marker.id2obj(self, id) + } + end + def marker_type(id) + tk_send('marker', 'type', tagid(id)) + end + + ################### + + def xaxis_cget(option) + itemcget('xaxis', option) + end + def xaxis_configure(slot, value=None) + if slot.kind_of?(Hash) + slot = _symbolkey2str(slot) + if cmd = slot.delete('command') + slot['command'] = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + elsif slot == :command || slot == 'command' + cmd = value + value = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + itemconfigure('xaxis', slot, value) + end + def xaxis_configinfo(slot=nil) + itemconfiginfo('xaxis', slot) + end + def current_xaxis_configinfo(slot=nil) + current_itemconfiginfo('xaxis', slot) + end + def xaxis_bind(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind([path, 'xaxis', 'bind'], context, cmd, *args) + self + end + def xaxis_bind_append(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind_append([path, 'xaxis', 'bind'], context, cmd, *args) + self + end + def xaxis_bind_remove(context) + _bind_remove([path, 'xaxis', 'bind'], context) + self + end + def xaxis_bindinfo(context=nil) + _bindinfo([path, 'xaxis', 'bind'], context) + end + def xaxis_invtransform(val) + list(tk_send('xaxis', 'invtransform', val)) + end + def xaxis_limits + list(tk_send('xaxis', 'limits')) + end + def xaxis_transform(val) + list(tk_send('xaxis', 'transform', val)) + end + def xaxis_use(target=nil) + if target + Tk::BLT::PlotComponent::Axis.id2obj(self, + tk_send('xaxis', 'use', + tagid(target))) + else + Tk::BLT::PlotComponent::Axis.id2obj(self, tk_send('xaxis', 'use')) + end + end + + def x2axis_cget(option) + itemcget('x2axis', option) + end + def x2axis_configure(slot, value=None) + if slot.kind_of?(Hash) + slot = _symbolkey2str(slot) + if cmd = slot.delete('command') + slot['command'] = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + elsif slot == :command || slot == 'command' + cmd = value + value = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + itemconfigure('x2axis', slot, value) + end + def x2axis_configinfo(slot=nil) + itemconfiginfo('x2axis', slot) + end + def current_x2axis_configinfo(slot=nil) + current_itemconfiginfo('x2axis', slot) + end + def x2axis_bind(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind([path, 'x2axis', 'bind'], context, cmd, *args) + self + end + def x2axis_bind_append(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind_append([path, 'x2axis', 'bind'], context, cmd, *args) + self + end + def x2axis_bind_remove(context) + _bind_remove([path, 'x2axis', 'bind'], context) + self + end + def x2axis_bindinfo(context=nil) + _bindinfo([path, 'x2axis', 'bind'], context) + end + def x2axis_invtransform(val) + list(tk_send('x2axis', 'invtransform', val)) + end + def x2axis_limits + list(tk_send('x2axis', 'limits')) + end + def x2axis_transform(val) + list(tk_send('x2axis', 'transform', val)) + end + def x2axis_use(target=nil) + if target + Tk::BLT::PlotComponent::Axis.id2obj(self, + tk_send('x2axis', 'use', + tagid(target))) + else + Tk::BLT::PlotComponent::Axis.id2obj(self, tk_send('x2axis', 'use')) + end + end + + def yaxis_cget(option) + itemcget('yaxis', option) + end + def yaxis_configure(slot, value=None) + if slot.kind_of?(Hash) + slot = _symbolkey2str(slot) + if cmd = slot.delete('command') + slot['command'] = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + elsif slot == :command || slot == 'command' + cmd = value + value = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + itemconfigure('yaxis', slot, value) + end + def yaxis_configinfo(slot=nil) + itemconfiginfo('yaxis', slot) + end + def current_yaxis_configinfo(slot=nil) + current_itemconfiginfo('yaxis', slot) + end + def yaxis_bind(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind([path, 'yaxis', 'bind'], context, cmd, *args) + self + end + def yaxis_bind_append(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind_append([path, 'yaxis', 'bind'], context, cmd, *args) + self + end + def yaxis_bind_remove(context) + _bind_remove([path, 'yaxis', 'bind'], context) + self + end + def yaxis_bindinfo(context=nil) + _bindinfo([path, 'yaxis', 'bind'], context) + end + def yaxis_invtransform(val) + list(tk_send('yaxis', 'invtransform', val)) + end + def yaxis_limits + list(tk_send('yaxis', 'limits')) + end + def yaxis_transform(val) + list(tk_send('yaxis', 'transform', val)) + end + def yaxis_use(target=nil) + if target + Tk::BLT::PlotComponent::Axis.id2obj(self, + tk_send('yaxis', 'use', + tagid(target))) + else + Tk::BLT::PlotComponent::Axis.id2obj(self, tk_send('yaxis', 'use')) + end + end + + def y2axis_cget(option) + itemcget('y2axis', option) + end + def y2axis_configure(slot, value=None) + if slot.kind_of?(Hash) + slot = _symbolkey2str(slot) + if cmd = slot.delete('command') + slot['command'] = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + elsif slot == :command || slot == 'command' + cmd = value + value = proc{|w, tick| + cmd.call(TkComm.window(w), TkComm.num_or_str(tick)) + } + end + itemconfigure('y2axis', slot, value) + end + def y2axis_configinfo(slot=nil) + axis_configinfo('y2axis', slot) + end + def current_y2axis_configinfo(slot=nil) + current_itemconfiginfo('y2axis', slot) + end + def y2axis_bind(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind([path, 'y2axis', 'bind'], context, cmd, *args) + self + end + def y2axis_bind_append(context, *args) + if TkComm._callback_entry?(args[0]) || !block_given? + cmd = args.shift + else + cmd = Proc.new + end + _bind_append([path, 'y2axis', 'bind'], context, cmd, *args) + self + end + def y2axis_bind_remove(context) + _bind_remove([path, 'y2axis', 'bind'], context) + self + end + def y2axis_bindinfo(context=nil) + _bindinfo([path, 'y2axis', 'bind'], context) + end + def y2axis_invtransform(val) + list(tk_send('y2axis', 'invtransform', val)) + end + def y2axis_limits + list(tk_send('y2axis', 'limits')) + end + def y2axis_transform(val) + list(tk_send('y2axis', 'transform', val)) + end + def y2axis_use(target=nil) + if target + Tk::BLT::PlotComponent::Axis.id2obj(self, + tk_send('y2axis', 'use', + tagid(target))) + else + Tk::BLT::PlotComponent::Axis.id2obj(self, tk_send('y2axis', 'use')) + end + end + end +end -- cgit v1.2.3