summaryrefslogtreecommitdiff
path: root/ext/tk/lib/tkextlib/blt/component.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ext/tk/lib/tkextlib/blt/component.rb')
-rw-r--r--ext/tk/lib/tkextlib/blt/component.rb1285
1 files changed, 1285 insertions, 0 deletions
diff --git a/ext/tk/lib/tkextlib/blt/component.rb b/ext/tk/lib/tkextlib/blt/component.rb
new file mode 100644
index 0000000000..417c1d454b
--- /dev/null
+++ b/ext/tk/lib/tkextlib/blt/component.rb
@@ -0,0 +1,1285 @@
+#
+# 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']
+ end
+ private :__item_strval_optkeys
+
+ def _item_listval_optkeys(id)
+ ['bindtags']
+ end
+ private :__item_listval_optkeys
+
+ def __item_numlistval_optkeys(id)
+ ['dashes']
+ end
+ private :__item_numlistval_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 ]
+ [self.path, id[0], 'configure', id[1]]
+ 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', id], option)
+ end
+ def axis_configure(id, slot, value=None)
+ itemconfigure(['axis', id], slot, value)
+ end
+ def axis_configinfo(id, slot=nil)
+ itemconfiginfo(['axis', id], slot)
+ end
+ def current_axis_configinfo(id, slot=nil)
+ current_itemconfiginfo(['axis', 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', id], option)
+ end
+ def element_configure(id, slot, value=None)
+ itemconfigure(['element', id], slot, value)
+ end
+ def element_configinfo(id, slot=nil)
+ itemconfiginfo(['element', id], slot)
+ end
+ def current_element_configinfo(id, slot=nil)
+ current_itemconfiginfo(['element', 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', id], option)
+ end
+ def pen_configure(id, slot, value=None)
+ itemconfigure(['pen', id], slot, value)
+ end
+ def pen_configinfo(id, slot=nil)
+ itemconfiginfo(['pen', id], slot)
+ end
+ def current_pen_configinfo(id, slot=nil)
+ current_itemconfiginfo(['pen', 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', id], option)
+ end
+ def marker_configure(id, slot, value=None)
+ itemconfigure(['marker', id], slot, value)
+ end
+ def marker_configinfo(id, slot=nil)
+ itemconfiginfo(['marker', id], slot)
+ end
+ def current_marker_configinfo(id, slot=nil)
+ current_itemconfiginfo(['marker', 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(tagOrId, option)
+ if option == 'bindtags' || option == :bindtags
+ ret.collect{|tag| TkBindTag.id2obj(tag)}
+ else
+ ret
+ end
+ end
+ def itemconfiginfo(tagOrId, slot = nil)
+ ret = __itemconfiginfo(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
+ inf = ret.assoc('bindtags')
+ inf[-2] = inf[-2].collect{|tag| TkBindTag.id2obj(tag)}
+ inf[-1] = inf[-1].collect{|tag| TkBindTag.id2obj(tag)}
+ 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(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
+ @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)
+ 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 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?
+ end
+
+ def id
+ 'crosshairs'
+ end
+
+ def to_eval
+ 'crosshairs'
+ 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
+ OBJ_ID = ['blt_chart_element'.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, 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
+ @parent = @chart = chart
+ @cpath = @chart.path
+ Element::OBJ_TBL[@cpath][@element] = self
+ keys = _symbolkey2str(keys)
+ unless keys.delete['without_creating']
+ @chart.element_create(@element, keys)
+ end
+ end
+
+ def id
+ @id
+ end
+
+ def to_eval
+ @id
+ end
+
+ def cget(option)
+ @chart.element_cget(@id, option)
+ end
+ def configure(key, value=None)
+ @chart.element_configure(@id, key, value)
+ self
+ end
+ def configinfo(key=nil)
+ @chart.element_configinfo(@id, key)
+ end
+ def current_configinfo(key=nil)
+ @chart.current_element_configinfo(@id, key)
+ end
+
+ def activate(*args)
+ @chart.element_activate(@id, *args)
+ self
+ end
+
+ def closest(x, y, var, keys={})
+ @chart.element_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 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?
+ end
+
+ def id
+ 'grid'
+ end
+
+ def to_eval
+ 'grid'
+ 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?
+ end
+
+ def id
+ 'legend'
+ end
+
+ def to_eval
+ 'legend'
+ 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)
+ self
+ end
+
+ def deactivate(*args)
+ @chart.legend_deactivate(*args)
+ self
+ 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
+ @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)
+ 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?
+ end
+
+ def id
+ 'postscript'
+ end
+
+ def to_eval
+ 'postscript'
+ 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)
+ }
+
+ 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, 'create',
+ self::MarkerTypeName, *args)
+ chart.marker_configure(idnum, fontkeys) unless fontkeys.empty?
+ idnum.to_i # 'item id' is an integer number
+ end
+
+ def initialize(parent, *args)
+ @parent = @chart = parent
+ @path = parent.path
+
+ @id = create_self(*args) # an integer number as 'item id'
+ unless Tk::BLT::PlotComponent::MarkerID_TBL[@path]
+ Tk::BLT::PlotComponent::MarkerID_TBL[@path] = {}
+ end
+ Tk::BLT::PlotComponent::MarkerID_TBL[@path][@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])
+ 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])
+ 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 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 marker_create(type, *args)
+ type.create(self, *args)
+ 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{|axis|
+ 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
+ Axis.id2obj(self, tk_send('axis', 'use', tagid(id), tagid(target)))
+ else
+ 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_activate(id, *indices)
+ tk_send('element', 'activate', tagid(id), *indices)
+ self
+ end
+ def element_closest(x, y, var, *args)
+ if args[-1].kind_of?(Hash)
+ keys = args.pop
+ bool(tk_send('element', 'activate', x, y, var,
+ *(hash_kv(keys).concat(args))))
+ else
+ bool(tk_send('element', 'activate', x, y, var, *args))
+ 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{|elem|
+ Element.id2obj(self, elem)
+ }
+ end
+ def element_show(*names)
+ if names.empty?
+ simplelist(tk_send('element', 'show'))
+ else
+ tk_send('element', 'show', *names)
+ self
+ end
+ end
+ def element_type(id)
+ tk_send('element', '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_activate(*pats)
+ tk_send('legend', 'activate', *pats)
+ self
+ end
+ def legend_deactivate(*pats)
+ tk_send('legend', 'deactivate', *pats)
+ self
+ end
+ def legend_get(pos, y=nil)
+ if y
+ Element.id2obj(self, tk_send('legend', 'get', _at(pos, y)))
+ else
+ Element.id2obj(self, tk_send('legend', 'get', pos))
+ end
+ 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{|pen|
+ 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_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{|id|
+ Marker.id2obj(self, id)
+ }
+ end
+ def marker_type(id)
+ tk_send('marker', 'type', tagid(id))
+ end
+
+ ###################
+
+ alias line_cget element_cget
+ alias line_configure element_configure
+ alias line_configinfo element_configinfo
+ alias current_line_configinfo current_element_configinfo
+ alias line_bind element_bind
+ alias line_bind_append element_bind_append
+ alias line_bind_remove element_bind_remove
+ alias line_bindinfo element_bindinfo
+
+ ###################
+
+ def xaxis_cget(option)
+ axis_cget('xaxis', option)
+ end
+ def xaxis_configure(slot, value=None)
+ axis_configure('xaxis', slot, value)
+ end
+ def xaxis_configinfo(slot=nil)
+ axis_configinfo('xaxis', slot)
+ end
+ def current_xaxis_configinfo(slot=nil)
+ current_axis_configinfo('xaxis', slot)
+ end
+ def xaxis_invtransform(val)
+ axis_invtransform('xaxis', val)
+ end
+ def xaxis_limits
+ axis_limits('xaxis')
+ end
+ def xaxis_transform(val)
+ axis_transform('xaxis', val)
+ end
+ def xaxis_use(target=nil)
+ axis_use('xaxis', target)
+ end
+
+ def x2axis_cget(option)
+ axis_cget('x2axis', option)
+ end
+ def x2axis_configure(slot, value=None)
+ axis_configure('x2axis', slot, value)
+ end
+ def x2axis_configinfo(slot=nil)
+ axis_configinfo('x2axis', slot)
+ end
+ def current_x2axis_configinfo(slot=nil)
+ current_axis_configinfo('x2axis', slot)
+ end
+ def x2axis_invtransform(val)
+ axis_invtransform('x2axis', val)
+ end
+ def x2axis_limits
+ axis_limits('x2axis')
+ end
+ def x2axis_transform(val)
+ axis_transform('x2axis', val)
+ end
+ def x2axis_use(target=nil)
+ axis_use('x2axis', target)
+ end
+
+ def yaxis_cget(option)
+ axis_cget('yaxis', option)
+ end
+ def yaxis_configure(slot, value=None)
+ axis_configure('yaxis', slot, value)
+ end
+ def yaxis_configinfo(slot=nil)
+ axis_configinfo('yaxis', slot)
+ end
+ def current_yaxis_configinfo(slot=nil)
+ current_axis_configinfo('yaxis', slot)
+ end
+ def yaxis_invtransform(val)
+ axis_invtransform('yaxis', val)
+ end
+ def yaxis_limits
+ axis_limits('yaxis')
+ end
+ def yaxis_transform(val)
+ axis_transform('yaxis', val)
+ end
+ def yaxis_use(target=nil)
+ axis_use('yaxis', target)
+ end
+
+ def y2axis_cget(option)
+ axis_cget('y2axis', option)
+ end
+ def y2axis_configure(slot, value=None)
+ axis_configure('y2axis', slot, value)
+ end
+ def y2axis_configinfo(slot=nil)
+ axis_configinfo('y2axis', slot)
+ end
+ def current_y2axis_configinfo(slot=nil)
+ current_axis_configinfo('y2axis', slot)
+ end
+ def y2axis_invtransform(val)
+ axis_invtransform('y2axis', val)
+ end
+ def y2axis_limits
+ axis_limits('y2axis')
+ end
+ def y2axis_transform(val)
+ axis_transform('y2axis', val)
+ end
+ def y2axis_use(target=nil)
+ axis_use('y2axis', target)
+ end
+ end
+end