MODULE HostClipboard;
(**

   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,
      Services, Stores, Views, Documents, OleData, HostWindows;
      
   
   TYPE
      EmptyView = POINTER TO RECORD (Views.View) END;
      
   
   VAR
      cloneAttributes*: BOOLEAN;   (* set by HostCmds, used by Importers *)
      isText*: BOOLEAN;   (* set by HostCmds, used by GetClipView *)
      doc: Documents.Document;   (* contents of clipboard window *)

      isSingleton: BOOLEAN;   (* contents of clipboard is singleton view *)
      width, height: INTEGER;   (* size of clipboard content *)
      empty: Views.View;   (* contents of empty clipboard *)
      cbdata: WinOle.IDataObject;   (* data object registred via OLE *)
      
   
   PROCEDURE Register* (v: Views.View; w, h: INTEGER; isSingle: BOOLEAN);
      VAR res: COM.RESULT;
   BEGIN
      doc.SetView(v, w, h);
      width := w; height := h;
      isSingleton := isSingle;
      cbdata := OleData.ViewData(v, w, h, isSingle);
      res := WinOle.OleSetClipboard(cbdata)
   END Register;
   
   PROCEDURE GetClipView* (
      type: Stores.TypeName; VAR v: Views.View; VAR w, h: INTEGER; VAR isSingle: BOOLEAN
   );
      VAR dobj: WinOle.IDataObject; res: COM.RESULT;
   BEGIN
      v := NIL;
      IF WinOle.OleIsCurrentClipboard(cbdata) = WinApi.S_OK THEN
         v := Views.CopyOf(doc.ThisView(), Views.deep);
         w := width; h := height; isSingle := isSingleton;
         IF (type # "") & ~Services.Is(v, type) THEN v := NIL END
      ELSE
         res := WinOle.OleGetClipboard(dobj);
         IF res >= 0 THEN
            IF isText THEN
               OleData.GetTextDataView(dobj, v, w, h, isSingle)
            ELSE
               OleData.GetDataView(dobj, type, v, w, h, isSingle)
            END;
            IF v # NIL THEN
               doc.SetView(Views.CopyOf(v, Views.deep), w, h);
               width := w; height := h;
               isSingleton := isSingle
            END
         END
      END
   END GetClipView;
   
   PROCEDURE ConvertibleTo* (type: Stores.TypeName): BOOLEAN;
      VAR dobj: WinOle.IDataObject; res: COM.RESULT;
   BEGIN
      IF WinOle.OleIsCurrentClipboard(cbdata) = WinApi.S_OK THEN
         RETURN (type = "") OR Services.Is(doc.ThisView(), type)
      ELSE
         res := WinOle.OleGetClipboard(dobj);
         IF res >= 0 THEN
            RETURN OleData.DataConvTo(dobj, type)
         END
      END;
      RETURN FALSE
   END ConvertibleTo;
   
   PROCEDURE Flush*;
      VAR res: COM.RESULT;
   BEGIN
      IF WinOle.OleIsCurrentClipboard(cbdata) = WinApi.S_OK THEN
         res := WinOle.OleFlushClipboard()
      END
   END Flush;
   
   PROCEDURE Dump*;
      VAR res: COM.RESULT; dobj: WinOle.IDataObject;
   BEGIN
      res := WinOle.OleGetClipboard(dobj);
      OleData.DumpData(dobj)
   END Dump;
   
   
   PROCEDURE (v: EmptyView) Restore (f: Views.Frame; l, t, r, b: INTEGER);
   END Restore;
   
   PROCEDURE Init;

      VAR e: EmptyView;
   BEGIN
      NEW(e); empty := e;
      (* init document to be used to display the clipboard *)
      doc := Documents.dir.New(empty, Views.undefined, Views.undefined);
      HostWindows.OpenClipboard(doc)
   END Init;
   
BEGIN
   Init
END HostClipboard.
   

HostClipboard.Flush
HostClipboard.Dump