summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorsuke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-08-06 16:35:38 +0000
committersuke <suke@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-08-06 16:35:38 +0000
commit663b69c5a97dfb000c25d925853a76b51ac7533b (patch)
tree4f6b87f4032f0bd3063ff0e00c15d8eacbcc2303 /ext
parent8cccadd659536072e9f11feabd1bcd6a13c78cbb (diff)
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
Diffstat (limited to 'ext')
-rw-r--r--ext/win32ole/tests/testOLEEVENT.rb40
-rw-r--r--ext/win32ole/tests/testOLEPARAM.rb9
-rw-r--r--ext/win32ole/win32ole.c51
3 files changed, 82 insertions, 18 deletions
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;
}