mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
8cccadd659
commit
663b69c5a9
4 changed files with 92 additions and 18 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
|||
Sun Aug 7 01:31:15 2005 Masaki Suketa <masaki.suketa@nifty.ne.jp>
|
||||
|
||||
* ext/win32ole/win32ole.c (WIN32OLE_EVENT#on_event): should set
|
||||
only one event handler.
|
||||
|
||||
* ext/win32ole/tests/testOLEEVENT.rb: ditto.
|
||||
|
||||
* ext/win32ole/tests/testOLEPARAM.rb: remove re-defined
|
||||
test_ole_type_detail method.
|
||||
|
||||
Sat Aug 6 12:35:24 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||
|
||||
* ext/tk/lib/{tk.rb,tk/itemconfig.rb}: configure creates
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
rb_ary_push(ary, data);
|
||||
at = ole_search_event_at(events, event);
|
||||
if (at >= -1) {
|
||||
rb_ary_delete_at(events, at);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue