diff options
author | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-23 16:23:30 +0000 |
---|---|---|
committer | nagai <nagai@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-23 16:23:30 +0000 |
commit | 6eb09c3d046a0cd9b7e33b48cfa51df30e7463a7 (patch) | |
tree | 38ed808ead0eb486ab852e7a7f14bf2f7ab237ad /ext/tk/lib/tkextlib/blt/component.rb | |
parent | 4b5138d8888ad958ffc882f79d386083b5175da4 (diff) |
* ext/tk/lib/tkextlib/blt.rb: add BLT extension support
* ext/tk/lib/tkextlib/blt/*.rb: ditto
* ext/tk/lib/tkextlib/blt/tile/*.rb: ditto
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@7645 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/tk/lib/tkextlib/blt/component.rb')
-rw-r--r-- | ext/tk/lib/tkextlib/blt/component.rb | 1285 |
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 |