Autor Thema: DocLink (als Text Hotspot) an aktueller Cursorposition des RT Feldes einfügen  (Gelesen 5414 mal)

Offline Odi

  • Frischling
  • *
  • Beiträge: 15
Hallo,

ich benötige mal ein paar Denkanstöße. Das Thema ist hier schon behandelt worden, allerdings ist mir nicht so ganz klar, wie ich erreichen kann, dass im aktuellen UIDoc ein DocLink (Text Hotspot) an der aktuellen Cursorposition eingefügt werden kann.

Die Aktion soll über eine Aktionsschaltfläche erreicht werden, die folgendes abwickelt:

1) Auswahl des zu verlinkenden Dokumentes
2) Eingabe des Textes, der für den Hotspot verwendet werden soll
3) Einfügen des DocLinks als Text Hotspot an der aktuellen Cursorposition des RichText Feldes

Formelsprache mit Copy/Paste des DocLinks über Zwischenablage habe ich verworfen, da ich hier nichts gefunden habe, um einen Text HotSpot zu erstellen.
Oder habe ich hier etwas übersehen?

Über Skript fehlt mir jetzt noch der Denkanstoß, wie ich an der aktuellen Cursorposition etwas einfügen kann.

Olaf
« Letzte Änderung: 25.01.12 - 13:57:40 von Odi »

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Hallo Olaf.

1) Picklist etc sollte bekannt sein
2) Inputbox ebenso
(Irgendwo im Netz hab ich auch mal ein Bsp gesehen, wie man einen Dialog mit einer embedded view baut, find ich aber gerade nicht)

3) ist eigentlich dein Hauptproblem.

Zuerst musst du den Link irgendwie in einem temporären Dokument/RT-Item erzeugen, das geht z.B. mit

- appendDocLink

- addLinkByIds (undokumentiert)
http://www.openntf.org/projects/codebin/codebin.nsf/0/BA573409BC88BA3C88256D4500831493

Beide Methoden haben den Nachteil, dass dies keine Texthotspots sind!

Einen Texthotspot kannst du relativ einfach erzeugen in dem du in ein MIME-Item folgendes HTML schreibst:
<a href="notes://xxx/xxx/xxx">MeinHostpot</a>
und anschließed mittels session.convertMime=true wieder in ein RT-Item konvertierst.
(Zum Umgang mit MIME-Items verweise ich auf diesen Artikel: http://atnotes.de/index.php/topic,52040.0.html)

Allerdings hast du wenig Einfluss, wie Notes das HTML nach RTF konvertiert.

als 4. Möglichkeit bleibt dir noch DXL, damit hast du alle Freiheiten, allerdings muss das temporäre Dokument gespeichert werden (hierzu eignen sich u.U. Benutzerprofildokumente) und auch die Umsetzung ist nicht trivial:
1. Mach einen DXL-Export eines Beispieldokuments mit einem Link und schau dir an wie das aufgebaut ist.
2. Entferne alle nicht benötigten Infos/Items
3. Ersetze UNID/ReplicaID sowie Linktext und Linkziel durch Platzhalter. Dieser String kommt in deinen Code

Beim Erzeugen eines Links ersetzt du dann UNID/ReplicaID durch die des Profildokuments (das Dokument wird dann überschrieben) sowie Linktext und Linkziel durch die entsprechenden Werte.

Nun solltest du es geschafft haben, ein Dokument zu erstellen, das den Link enthält. Diesen musst du jetzt an der Cursorpos. einfügen.
Dies geht einfach mit Copy&Paste. Du öffnest das Dok in einer Dialogbox. per Formelsprache springst du in das Feld, kopierst alles in die Zwischenablage und schließt die Dialogbox wieder.
Einfügen tust du das dann mit uiDoc.paste

Als Alternative zur Zwischenablage kannst du evtl auch folgende Methode verweden
http://www.qtzar.com/blogs/qtzar.nsf/blog.xsp?entry=DSLH-7NRK85&SessionID=CNFLZXUWFB


Guten Rutsch

Roland





- DXL-Import (sehr
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Odi

  • Frischling
  • *
  • Beiträge: 15
Hallo,

erst mal danke für die Hinweise von Roland. Leider bin ich wg. eines anderen Projektes erst heute dazu gekommen hier weiter zu testen.

Folgendes habe ich umgesetzt:

1) Es gibt ein Profildokument mit einem RichText Feld, in dem ein "korrekt" formatierter (ohne Rahmen) Text Hotspot gespeichert ist.
2) Im Backend wird ein temporäres Dokument erstellt, in welches das RichText Feld aus dem Profildokument mittels rtiTemplate.CopyItemToDocument(doc, "RichTextWithHotspot") kopiert wird.
3) Ein weiteres RichText Feld wird im temporären Dokument erzeugt, in das mittels rtiSource.AppendDocLink(docSource) der Link auf das mittels PickListCollection gewählte Dokument eingefügt wird.
4) Im ersten RichText Feld (Template) werden im Link DbReplicaID,  DocUNID und ViewUNID mit den Werten aus dem unter 3) erzeugten Link versehen.
5) Das temporäre Dokument wird gespeichert.
6) Das erste RichText Feld aus dem temporären Dokument wird nun mittels uiDoc.ImportItem(tempDoc, "RichTextWithHotspot") in das geöffnete Dokument an Cursorposition eingefügt.

Irgendwie scheint bei Aktion 6) die Linkinformation nicht korrekt übertragen zu werden. Testet man den Link, so landet man sonst wo, nur nicht beim gewünschten Dokument. Bearbeitet man den Hotspot, so fällt ggü. manuell erzeugten Hotspots auf, dass hier keine Information über den Link enthalten ist.

Schaut man sich das temporäre Dokument nach der Speicherung (Punkt 5) an, so ist noch alles korrekt. Der Link funktioniert.

Habe ich etwas übersehen, oder hat jemand ein ähnliches Verhalten festgestellt?
Liegt es an der undokumentierten Methode uiDoc.ImportItem() ?

Gruß
Olaf


Sub CreateDocLink (uiDoc As NotesUIDocument)
    Dim session As New NotesSession
    Dim db As NotesDatabase

    Set db = session.CurrentDatabase


    'Check and get profile document with formatted link template
    Dim docTemplate As NotesDocument
    Set docTemplate = GetLinkTemplateDocument()
    If (docTemplate Is Nothing) Then
        MessageBox "Profildokument '$LinkTemplate' existiert nicht."
        Exit Sub
    End If
   

    'Get document for that a link should be created
    Dim docLinkSource As NotesDocument
    Dim linkText As String
    linkText = "<Hier Text des Links eingeben>"
    Set docLinkSource = GetLinkDocument()
    If (docLinkSource Is Nothing) Then
        Exit Sub
    End If
    If (docLinkSource.HasItem("Subject")) Then
        Dim itemValue As Variant
        itemValue = docLinkSource.GetItemValue("Subject")
        If (itemValue(0) <> "") Then
            linkText = itemValue(0)
        End If
    End If
   
   
    'Create temporary document (docTemp) with two rich text fields
   
    '1. RT field with link from template (docTemplate)
    '2. RT field with link to selected document (docLinkSource) 
    Dim docTemp As New NotesDocument(db)
    Dim rtiTempLinkSource As New NotesRichTextItem(docTemp, "tmpLinkSource")
    docTemp.Form = "newLink"
    '1. RT field "NotesLink" with template link from docTemplate
    Dim rtiTemplate As Variant
    Set rtiTemplate = docTemplate.GetFirstItem("NotesLink")
    Call rtiTemplate.CopyItemToDocument( docTemp, "tmpLinkTemplate" )
    '2. RT field with link to docLinkSource
    Call rtiTempLinkSource.AppendDocLink(docLinkSource, "Öffnet Dokument", linkText)
    Call docTemp.Save(True, False)
   
   
    'Refresh link information in template link and save temporary document
   
    'Get link information for docLinkSource
    Dim rtnavTempLinkSource As NotesRichTextNavigator
    Dim rtdoclinkTempLinkSource As NotesRichTextDocLink
    Dim dbReplicaId As String
    Dim docUNID As String
    Dim viewUNID As String
    Set rtiTempLinkSource = docTemp.GetFirstItem("tmpLinkSource")
    Set rtnavTempLinkSource = rtiTempLinkSource.CreateNavigator
    Set rtdoclinkTempLinkSource = rtnavTempLinkSource.Getfirstelement(RTELEM_TYPE_DOCLINK)
    dbReplicaId = rtdoclinkTempLinkSource.DbReplicaID
    docUNID = rtdoclinkTempLinkSource.DocUNID
    viewUNID = rtdoclinkTempLinkSource.ViewUNID
    'Refresh link information in template link
    Dim rtiTempTemplate As NotesRichTextItem
    Dim rtnavTempTemplate As NotesRichTextNavigator
    Dim rtdoclinkTempTemplate As NotesRichTextDocLink
    Set rtiTempTemplate = docTemp.GetFirstItem("tmpLinkTemplate")
    Set rtnavTempTemplate = rtiTempTemplate.CreateNavigator
    Set rtdoclinkTempTemplate = rtnavTempTemplate.Getfirstelement(RTELEM_TYPE_DOCLINK)
    rtdoclinkTempTemplate.DbReplicaID = dbReplicaId
    rtdoclinkTempTemplate.DocUNID = docUNID
    rtdoclinkTempTemplate.ViewUNID = viewUNID
    'rtdoclinkTemplate.Displaycomment = ""
    'TODO: Setzen Hotspot Text und Comment
    Call docTemp.Save(True, False)
   
    Call uiDoc.ImportItem(docTemp, "tmpLinkTemplate")
    'Call docTemp.Remove(True)

End Sub

« Letzte Änderung: 24.01.12 - 15:36:50 von Odi »

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
ich seh in deinem ganzen Code kein rti.update(), bzw. rti.compact()
Meine Erfahrung hat gezeigt, dass man jedes RT-Item, welches man verändert hat, vor dem Speichern compacten/updaten soll, da es sonst zu solchen merkwürdigen Verhalten kommt.
Bau mal ein rtiTempLinkSource.update() und ein rtiTempTemplate.update() vor die entsprechenden Save-Befehle

und wie gesagt, ImportItem ist undokumentiert, wenn der Fehler darin liegt, hast du schlechte Karten

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline Odi

  • Frischling
  • *
  • Beiträge: 15
Ein rti.update() hilft da leider auch nicht.

Das hätte mich allerdings auch etwas gewundert, da wie gesagt das temporäre Backend Dokument alles so enthielt wie es sollte. Da hatte ich über eine Testmaske bereits geprüft. Es liegt also im Inneren der Funktion uiDoc.ImportItem(...).

Ich habe es jetzt so gelöst, dass ich das tempöräre Dokument im UI öffne, den Cursor auf das RichText Feld ("tmpLinkTemplate") mit dem angepassten Hotspot positioniere, in die Zwischenablage kopiere und dann im Zieldokument einfüge. Der Anwender bemerkt das zwischenzeitliche Öffnen eines weiteren Dokumentes nicht.

Call uiDoc.ImportItem(doc, "tmpLinkTemplate")

wurde also ersetzt durch

Dim ws As New NotesUIWorkspace
Dim uiTempDoc As NotesUIDocument
Set uiTempDoc = ws.Editdocument(True, docTemp)
Call uiTempDoc.GotoField( "tmpLinkTemplate" )
Call uiTempDoc.Selectall()
Call uiTempDoc.Copy()
Call uiDoc.Paste()
Call uiTempDoc.Close(true)
Call docTemp.Remove(True)



Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
gut zu wissen... ja, das ist dann wohl die Krux an importItem
(rein interessehalber, haben die beteiligten Dokumente ein $Links-Feld? Such mal hier nach "$Links" )

ich hab das übrigens mal so ähnlich über eine Dialogbox gemacht, der Nachteil ist allerdings, dass du dir dir die Zwischenablage überschreibst
(was für viele Anwender verschmerzbar ist, da die sowieso nicht damit arbeiten  ;D )

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz