From 663b69c5a97dfb000c25d925853a76b51ac7533b Mon Sep 17 00:00:00 2001 From: suke Date: Sat, 6 Aug 2005 16:35:38 +0000 Subject: should set only one handler in WIN32OLE_EVENT#on_event git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/win32ole/tests/testOLEEVENT.rb | 40 ++++++++++++++++++++++++++++++ ext/win32ole/tests/testOLEPARAM.rb | 9 ------- ext/win32ole/win32ole.c | 51 +++++++++++++++++++++++++++++++------- 3 files changed, 82 insertions(+), 18 deletions(-) (limited to 'ext') diff --git a/ext/win32ole/tests/testOLEEVENT.rb b/ext/win32ole/tests/testOLEEVENT.rb index 15b7ca8413..368794b150 100644 --- a/ext/win32ole/tests/testOLEEVENT.rb +++ b/ext/win32ole/tests/testOLEEVENT.rb @@ -5,6 +5,7 @@ class TestWIN32OLE_EVENT < RUNIT::TestCase def setup @excel = WIN32OLE.new("Excel.Application") @excel.visible = true + @event = "" end def test_on_event book = @excel.workbooks.Add @@ -24,6 +25,45 @@ class TestWIN32OLE_EVENT < RUNIT::TestCase end assert_equal("OK", value) end + + def handler1 + @event += "handler1" + end + def handler2 + @event += "handler2" + end + + def test_on_event2 + book = @excel.workbooks.Add + begin + ev = WIN32OLE_EVENT.new(book, 'WorkbookEvents') + ev.on_event('SheetChange'){|arg1, arg2| + handler1 + } + ev.on_event('SheetChange'){|arg1, arg2| + handler2 + } + book.Worksheets(1).Range("A1").value = "OK" + ensure + book.saved = true + end + assert_equal("handler2", @event) + end + + def test_on_event3 + book = @excel.workbooks.Add + begin + ev = WIN32OLE_EVENT.new(book, 'WorkbookEvents') + ev.on_event{ handler1 } + ev.on_event{ handler2 } + book.Worksheets(1).Range("A1").value = "OK" + ensure + book.saved = true + end + assert_equal("handler2", @event) + end + + def teardown @excel.quit @excel = nil diff --git a/ext/win32ole/tests/testOLEPARAM.rb b/ext/win32ole/tests/testOLEPARAM.rb index 685b548aa5..4014fadbfc 100644 --- a/ext/win32ole/tests/testOLEPARAM.rb +++ b/ext/win32ole/tests/testOLEPARAM.rb @@ -62,13 +62,4 @@ class TestOLEPARAM < RUNIT::TestCase f = methods.find {|m| m.name == 'SaveAs'} assert(f.params[0].optional?) end - def test_ole_type_detail - classes = WIN32OLE_TYPE.ole_classes(MS_EXCEL_TYPELIB) - methods = classes.find {|c| c.name == 'Worksheet'}.ole_methods - f = methods.find {|m| m.name == 'SaveAs'} - assert_equal(nil, f.params[0].default) - methods = classes.find {|c| c.name == 'Workbook'}.ole_methods - f = methods.find {|m| m.name == 'SaveAs'} - assert_equal(1, f.params[6].default) - end end diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 45ea0199b5..56580183fa 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -78,7 +78,7 @@ #define WC2VSTR(x) ole_wc2vstr((x), TRUE) -#define WIN32OLE_VERSION "0.6.2" +#define WIN32OLE_VERSION "0.6.3" typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX) (REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*); @@ -4859,6 +4859,33 @@ STDMETHODIMP EVENTSINK_GetIDsOfNames( return DISP_E_UNKNOWNNAME; } +static long +ole_search_event_at(ary, ev) + VALUE ary; + VALUE ev; +{ + VALUE event; + VALUE def_event; + VALUE event_name; + long i, len; + long ret = -1; + def_event = Qnil; + len = RARRAY(ary)->len; + for(i = 0; i < len; i++) { + event = rb_ary_entry(ary, i); + event_name = rb_ary_entry(event, 1); + if(NIL_P(event_name) && NIL_P(ev)) { + ret = i; + break; + } + else if (rb_str_cmp(ev, event_name) == 0) { + ret = i; + break; + } + } + return ret; +} + static VALUE ole_search_event(ary, ev, is_default) VALUE ary; @@ -4868,7 +4895,7 @@ ole_search_event(ary, ev, is_default) VALUE event; VALUE def_event; VALUE event_name; - int i, len; + long i, len; *is_default = FALSE; def_event = Qnil; len = RARRAY(ary)->len; @@ -5414,16 +5441,22 @@ fev_s_msg_loop(klass) static void -add_event_call_back(obj, data) +add_event_call_back(obj, event, data) VALUE obj; + VALUE event; VALUE data; { - VALUE ary = rb_ivar_get(obj, id_events); - if (NIL_P(ary) || TYPE(ary) != T_ARRAY) { - ary = rb_ary_new(); - rb_ivar_set(obj, id_events, ary); + long at; + VALUE events = rb_ivar_get(obj, id_events); + if (NIL_P(events) || TYPE(events) != T_ARRAY) { + events = rb_ary_new(); + rb_ivar_set(obj, id_events, events); + } + at = ole_search_event_at(events, event); + if (at >= -1) { + rb_ary_delete_at(events, at); } - rb_ary_push(ary, data); + rb_ary_push(events, data); } static VALUE @@ -5439,7 +5472,7 @@ ev_on_event(argc, argv, self, is_ary_arg) Check_SafeStr(event); } data = rb_ary_new3(4, rb_block_proc(), event, args, is_ary_arg); - add_event_call_back(self, data); + add_event_call_back(self, event, data); return Qnil; } -- cgit v1.2.3