-
Notifications
You must be signed in to change notification settings - Fork 2
/
Views.cp
131 lines (112 loc) · 3.21 KB
/
Views.cp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
MODULE OleViews;
(**
project = "BlackBox"
organization = "www.oberon.ch"
contributors = "Oberon microsystems"
version = "System/Rsrc/About"
copyright = "System/Rsrc/About"
license = "Docu/BB-License"
changes = ""
issues = ""
**)
IMPORT COM, WinApi, WinOle, WinOleAut, CtlT, Properties, Views, Containers, Windows, OleServer, OleClient;
(* client wrappers *)
PROCEDURE NewObjectView* (name: ARRAY OF CHAR): Views.View;
VAR clsid: COM.GUID; res: COM.RESULT;
BEGIN
IF name[0] = "{" THEN res := WinOle.CLSIDFromString(name, clsid)
ELSE res := WinOle.CLSIDFromProgID(name, clsid)
END;
IF res = WinApi.S_OK THEN RETURN OleClient.NewView(clsid)
ELSE RETURN NIL
END
END NewObjectView;
(*
PROCEDURE NewObjectViewFrom* (obj: CtlT.Object): Views.View;
VAR disp: WinOleAut.IDispatch;
BEGIN
disp := CtlT.Disp(obj);
RETURN OleClient.NewViewFrom(disp)
END NewObjectViewFrom;
*)
PROCEDURE NewObjectViewFromClipboard* (): Views.View;
BEGIN
RETURN OleClient.NewViewFromCB()
END NewObjectViewFromClipboard;
PROCEDURE IsObjectView* (v: Views.View): BOOLEAN;
VAR unk: COM.IUnknown;
BEGIN
unk := OleClient.IUnknown(v);
RETURN unk # NIL
END IsObjectView;
PROCEDURE IsAutoView* (v: Views.View): BOOLEAN;
VAR unk: COM.IUnknown; disp: WinOleAut.IDispatch; res: COM.RESULT;
BEGIN
unk := OleClient.IUnknown(v);
IF unk # NIL THEN
res := unk.QueryInterface(COM.ID(disp), disp);
RETURN res = WinApi.S_OK
ELSE RETURN FALSE
END
END IsAutoView;
PROCEDURE OleObject* (v: Views.View): CtlT.Interface;
VAR unk: COM.IUnknown;
BEGIN
unk := OleClient.IUnknown(v);
IF unk # NIL THEN RETURN CtlT.Intfce(unk)
ELSE RETURN NIL
END
END OleObject;
PROCEDURE AutoObject* (v: Views.View): CtlT.Object;
VAR unk: COM.IUnknown; disp: WinOleAut.IDispatch; res: COM.RESULT;
BEGIN
unk := OleClient.IUnknown(v);
IF unk # NIL THEN
res := unk.QueryInterface(COM.ID(disp), disp);
IF res = WinApi.S_OK THEN RETURN CtlT.Obj(disp) END
END;
RETURN NIL
END AutoObject;
PROCEDURE Deposit* (name: ARRAY OF CHAR);
VAR v: Views.View;
BEGIN
v := NewObjectView(name);
IF v # NIL THEN Views.Deposit(v) END
END Deposit;
(*
PROCEDURE Activate*;
VAR v, dv: Views.View; msg: Properties.DoVerbMsg; w: Windows.Window; f: Views.Frame;
BEGIN
v := Containers.FocusSingleton();
IF v # NIL THEN
w := Windows.dir.Focus(TRUE);
IF w # NIL THEN
dv := w.doc.ThisView();
f := Views.ThisFrame(w.frame, dv);
msg.frame := Views.ThisFrame(f, v);
msg.verb := WinOle.OLEIVERB_SHOW;
Views.HandlePropMsg(v, msg)
END
END
END Activate;
*)
PROCEDURE Connect* (sink: CtlT.OutObject; source: Views.View);
VAR iid: COM.GUID; disp: WinOleAut.IDispatch;
BEGIN
sink.GetIID(iid); disp := CtlT.Disp(sink);
OleClient.Connect(source, iid, disp)
END Connect;
(*
(* server wrappers *)
PROCEDURE NewViewObject* (v: Views.View): CtlT.Interface;
BEGIN
ASSERT(v.context = NIL, 20);
END NewViewObject;
PROCEDURE IsViewObject* (i: CtlT.Interface): BOOLEAN;
BEGIN
END IsViewObject;
PROCEDURE View* (i: CtlT.Interface): Views.View;
BEGIN
END View;
*)
END OleViews.