Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Odi am 30.12.11 - 12:16:06
-
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
-
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
-
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
-
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
-
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)
-
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