Windows.Oberon.Clipboard.Mod 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. (* Copyright (c) 1994 - 2000 Emil J. Zeller *)
  2. MODULE Clipboard IN Oberon; (** non-portable / source: Windows.Clipboard.Mod *) (* ejz *)
  3. IMPORT SYSTEM, Kernel32 IN A2, User32 IN A2, Files, (*Displays,*) Display, Strings, Fonts, Texts, Oberon, Gadgets,
  4. Desktops;
  5. (** Windows Clipboard commands. *)
  6. VAR
  7. W: Texts.Writer;
  8. CFOberon: INTEGER;
  9. (** Copy a text stretch to the Clipboard. *)
  10. PROCEDURE PutToClipboard*(T: Texts.Text; beg, end: LONGINT);
  11. VAR
  12. buf: Texts.Buffer; t: Texts.Text;
  13. f: Files.File; r: Files.Rider;
  14. hMem: Kernel32.HGLOBAL; adr: ADDRESS;
  15. size: LONGINT;
  16. R: Texts.Reader; ch: CHAR;
  17. BEGIN
  18. IF User32.OpenClipboard(0) # Kernel32.False THEN
  19. User32.EmptyClipboard();
  20. IF CFOberon # Kernel32.NULL THEN
  21. NEW(buf); Texts.OpenBuf(buf); Texts.Save(T, beg, end, buf);
  22. NEW(t); Texts.Open(t, ""); Texts.Append(t, buf);
  23. f := Files.New(""); Files.Set(r, f, 0); Files.WriteLInt(r, 0);
  24. Texts.Store(t, f, Files.Pos(r), size);
  25. Files.Set(r, f, 0); Files.WriteLInt(r, Files.Length(f)-4);
  26. hMem := Kernel32.GlobalAlloc({Kernel32.GMemMoveable, Kernel32.GMemDDEShare}, Files.Length(f));
  27. adr := Kernel32.GlobalLock(hMem);
  28. Files.Set(r, f, 0); Files.Read(r, ch);
  29. WHILE ~r.eof DO
  30. SYSTEM.PUT(adr, ch); INC(adr);
  31. Files.Read(r, ch)
  32. END;
  33. Kernel32.GlobalUnlock(hMem);
  34. hMem := User32.SetClipboardData(CFOberon, hMem)
  35. END;
  36. Texts.OpenReader(R, T, beg); size := 0;
  37. WHILE Texts.Pos(R) < end DO
  38. Texts.Read(R, ch);
  39. IF R.lib IS Fonts.Font THEN
  40. IF ch = 0DX THEN INC(size, 2) ELSE INC(size) END
  41. END
  42. END;
  43. hMem := Kernel32.GlobalAlloc({Kernel32.GMemMoveable, Kernel32.GMemDDEShare}, size + 1);
  44. adr := Kernel32.GlobalLock(hMem);
  45. Texts.OpenReader(R, T, beg);
  46. WHILE Texts.Pos(R) < end DO
  47. Texts.Read(R, ch);
  48. IF R.lib IS Fonts.Font THEN
  49. SYSTEM.PUT(adr, Strings.OberonToISO[ORD(ch)]); INC(adr);
  50. IF ch = 0DX THEN SYSTEM.PUT(adr, 0AX); INC(adr) END
  51. END
  52. END;
  53. SYSTEM.PUT(adr, 0X);
  54. Kernel32.GlobalUnlock(hMem);
  55. hMem := User32.SetClipboardData(User32.CFText, hMem);
  56. User32.CloseClipboard()
  57. END
  58. END PutToClipboard;
  59. (** Get text data from the Clipboard. *)
  60. PROCEDURE GetFromClipboard*( VAR T: Texts.Text);
  61. VAR
  62. hMem: Kernel32.HGLOBAL; adr: ADDRESS;
  63. f: Files.File; r: Files.Rider;
  64. i: LONGINT;
  65. ch: CHAR;
  66. BEGIN
  67. T := NIL;
  68. IF User32.OpenClipboard(0) # Kernel32.False THEN
  69. hMem := User32.GetClipboardData(CFOberon);
  70. IF hMem # Kernel32.NULL THEN
  71. adr := Kernel32.GlobalLock(hMem);
  72. f := Files.New(""); Files.Set(r, f, 0);
  73. FOR i := 0 TO 3 DO
  74. SYSTEM.GET(adr, ch); INC(adr); Files.Write(r, ch)
  75. END;
  76. Files.Set(r, f, 0); Files.ReadLInt(r, i);
  77. WHILE i > 0 DO
  78. SYSTEM.GET(adr, ch); INC(adr); Files.Write(r, ch);
  79. DEC(i)
  80. END;
  81. Kernel32.GlobalUnlock(hMem);
  82. Files.Set(r, f, 0); Files.ReadLInt(r, i); Files.Read(r, ch);
  83. NEW(T); Texts.Load(T, f, Files.Pos(r), i)
  84. ELSE
  85. hMem := User32.GetClipboardData(User32.CFText);
  86. IF hMem # Kernel32.NULL THEN
  87. NEW(T); Texts.Open(T, "");
  88. adr := Kernel32.GlobalLock(hMem);
  89. SYSTEM.GET(adr, ch); INC(adr);
  90. WHILE ch # 0X DO
  91. Texts.Write(W, Strings.ISOToOberon[ORD(ch)]);
  92. IF ch = 0DX THEN INC(adr) END;
  93. SYSTEM.GET(adr, ch); INC(adr)
  94. END;
  95. Kernel32.GlobalUnlock(hMem);
  96. Texts.Append(T, W.buf)
  97. END
  98. END;
  99. User32.CloseClipboard()
  100. END
  101. END GetFromClipboard;
  102. PROCEDURE GetTextSelection(VAR text: Texts.Text; VAR beg, end: LONGINT);
  103. VAR F: Display.Frame; M: Oberon.SelectMsg;
  104. BEGIN
  105. M.F := NIL; M.id := Oberon.get; M.text := NIL; M.time := -1;
  106. IF Desktops.IsInMenu(Gadgets.context) THEN
  107. F := Desktops.CurDoc(Gadgets.context);
  108. F.handle(F, M)
  109. ELSE
  110. Display.Broadcast(M)
  111. END;
  112. text := M.text; beg := M.beg; end := M.end
  113. END GetTextSelection;
  114. (** Cut text selection. *)
  115. PROCEDURE Cut*;
  116. VAR T: Texts.Text; beg, end: LONGINT;
  117. BEGIN
  118. GetTextSelection(T, beg, end);
  119. IF T # NIL THEN
  120. PutToClipboard(T, beg, end);
  121. Texts.Delete(T, beg, end)
  122. END
  123. END Cut;
  124. (** Copy text selection. *)
  125. PROCEDURE Copy*;
  126. VAR T: Texts.Text; beg, end: LONGINT;
  127. BEGIN
  128. GetTextSelection(T, beg, end);
  129. IF T # NIL THEN PutToClipboard( T, beg, end) END
  130. END Copy;
  131. (** Insert clipboard (text-) contents at caret. *)
  132. PROCEDURE Paste*;
  133. VAR M: Oberon.ConsumeMsg;
  134. BEGIN
  135. GetFromClipboard( M.text);
  136. IF M.text # NIL THEN
  137. M.F := NIL; M.beg := 0; M.end := M.text.len;
  138. Display.Broadcast(M)
  139. END
  140. END Paste;
  141. (*
  142. PROCEDURE PictureThis(this: Displays.Display);
  143. VAR
  144. hDC: User32.HDC;
  145. hBm, hOldBm: GDI32.HBitmap;
  146. BEGIN
  147. IF User32.OpenClipboard(this.hWndParent) # Kernel32.False THEN
  148. hDC := GDI32.CreateCompatibleDC(this.hDC);
  149. hBm := GDI32.CreateCompatibleBitmap(this.hDC, this.width, this.height);
  150. hOldBm := GDI32.SelectObject(hDC, hBm);
  151. GDI32.BitBlt(hDC, 0, 0, this.width, this.height, this.hDC, 0, 0, GDI32.SrcCopy);
  152. User32.EmptyClipboard();
  153. User32.SetClipboardData(User32.CFBitmap, hBm);
  154. User32.CloseClipboard();
  155. GDI32.SelectObject(hDC, hOldBm);
  156. GDI32.DeleteObject(hBm);
  157. GDI32.DeleteDC(hDC)
  158. END
  159. END PictureThis;
  160. *)
  161. PROCEDURE Init;
  162. VAR str: ARRAY 32 OF CHAR;
  163. BEGIN
  164. str := "ETH Oberon, Text";
  165. CFOberon := User32.RegisterClipboardFormat(str)
  166. END Init;
  167. BEGIN
  168. Texts.OpenWriter(W);
  169. Init;
  170. END Clipboard.
  171. Clipboard.Cut
  172. Clipboard.Copy
  173. Clipboard.Paste
  174. Clipboard.Snapshot
  175. System.Free Clipboard ~