Manage Learn to apply best practices and optimize your operations.

Create hotspot buttons on the fly using DXL

Using DXL, learn how to create a hotspot button dynamically and add it to a rich text field on the fly.

In R6, there have been some great improvements in the accessibility of rich text fields and the various items that can exist within them (for example, tables and doc links) through LotusScript, but hotspot buttons are not one of them.

However, using DXL, you can create a hotspot button dynamically and add it to a rich text field on the fly. In this example, the user selects a number of entries from a database library, and buttons to open up each database are created in a new memo.

The code within the buttons is created when a temporary document is processed and imported, each button including the Replica ID for the individual database. The function of the buttons is not as important as the fact that each button was created from scratch.

NOTE: Similar code can be used for creating other design elements on the fly. The easiest way to learn the DXL format is to use the DXL Viewer under Tools in Designer.


Option Public
Option Explicit

' Change this to the ReplicaID of a 
valid Database Library
Const LibraryDBRepID = 

Sub Initialize
' Purpose: Compose a memo with 
one or more buttons containing
' dynamically-created LotusScript using DXL
 On Error Goto ErrorHandler
 Dim s As New NotesSession
 Dim ws As New NotesUIWorkspace
 Dim this_db As NotesDatabase
 Set this_db = s.currentdatabase
' Open the Database Library
 Dim library_db As New NotesDatabase( "", "" )
 If library_db.OpenByReplicaID
( this_db.Server, LibraryDBRepID ) Then
  Print( library_db.Title &
 " was successfully opened" )
  Print( "Unable to open database" )
  Exit Sub
 End If
' Prompt user to select Database documents
 Dim db_coll As NotesDocumentCollection
 Set db_coll = ws.PickListCollection
this_db.Server, _
library_db.FilePath, "Databases by _Title",_
 "Select Database(s)", "Please select 
at least one database:" )
 If db_coll.Count = 0 Then
  Messagebox "No databases selected", 0, "Error"
  Exit Sub
 End If
 Dim strDBRepID As String
 Dim strDBTitle As String
 Dim doc As NotesDocument
 Dim newdoc As NotesDocument
 Dim rtitem As NotesRichTextItem
 Dim nitem As NotesItem
' Open current user's mail file and 
create a new document
 Dim maildb As New NotesDatabase( "", "" )
 Call maildb.OpenMail
 Dim memodoc As 
New NotesDocument(maildb)
 memodoc.form = "Memo"
 memodoc.subject = "Database Access Email"
 Dim body As New NotesRichTextItem
(memodoc, "Body")
 Call body.AppendText
("Here are some database links:")
 Call body.AddNewLine(2)
' Get the first database library document
 Set doc = db_coll.GetFirstDocument
' Loop through all the selected documents, 
creating buttons for each
 While Not ( doc Is Nothing )
' Get the Replica ID of the Database
  strDBRepID = doc.ReplicaID(0)
' It's necessary to replace any ampersands 
in the Database Title with its
' HTML equivalent as DXL can't convert 
special characters such as &, <, and >
' < less than = <
' > greater than = >
' & ampersand = &
  strDBTitle = Replace(doc.Title(0), "&", "&")
  If (strDBRepID = "") Or (strDBTitle = "") Then
' Call the function to create the new 
document with the button and return the 
new document
   Set newdoc = CreateNewButton(s, ws, this_db,
strDBRepID, strDBTitle)
' Get the Rich Text field
   Set nitem = newdoc.GetFirstItem
( "tmpButtonBody" )
   If ( nitem.Type = RICHTEXT ) Then
    Set rtitem = nitem
' Append the newly created button
    Call body.AppendRTItem( rtitem )
' If there's a problem getting the 
Rich Text field, print to the memo
    Call body.AppendText("Error creating button.")
   End If
' Delete the imported document
   Call newdoc.Remove(True)
' Append the Database Title and Owner
   Call body.AddTab(1)
   Call body.AppendText(doc.Title(0))
   Call body.AddTab(1)
   Call body.AppendText("DB Owner: " 
+ doc.DBOwner(0))
   Call body.AddNewLine(1)
  End If
' Get the next document in the collection
  Set doc = db_coll.GetNextDocument (doc)
' Update the Rich Text field
 Call body.Update
' Open the current memo in the UI
 Dim uidoc As NotesUIDocument
 Set uidoc = ws.EditDocument(True, memodoc)
 Exit Sub
 Print Lsi_info(2) + " - Error #" 
& Format$(Err) & " at line " & 
Format$(Erl) & ": " & Error$
 Messagebox Lsi_info(2) + " - Error #"
 & Format$(Err) & " at line " &
Format$(Erl) & ": " & Error$, 0, "Error"
 Exit Sub
End Sub

Function CreateNewButton(s As 
NotesSession, ws As NotesUIWorkspace, 
this_db As
NotesDatabase, strDBRepID As String, 
strDBTitle As String) As NotesDocument
' Purpose: Build a document using DXL 
and import into the current database and
return the new document
 On Error Goto ErrorHandler
 Dim newdoc As NotesDocument
 Dim stream As NotesStream
 Dim dmp As NotesDXLImporter
 Set stream = s.CreateStream
' Build the DXL document including the 
button in the Rich Text field
 stream.WriteText {<&xml
 version='1.0' encoding='utf-8' ?>
  <database xmlns=
   <databaseinfo replicaid="} + 
this_db.ReplicaID +
   <document form="tmpButtonProfile">
     <item name='tmpButtonBody'>

<button width="2in" widthtype="fitcontent"
 wraptext="true" bgcolor="system"
 type="normal" default="false" edge=
"rounded" readingorder="lefttoright">
<font size="9pt" style="bold" name="Arial" 
pitch="variable" truetype="true"
familyid="20" />
<code event="options">
<code event="click"><lotusscript>
Sub Click(Source As Button)
'} + strDBTitle + { Access Button

 On Error Goto ErrorHandler

 Dim ws As New NotesUIWorkspace
 Dim session As New NotesSession
 Dim this_db As NotesDatabase
 Dim strDBRepID As String, strDBTitle
 As String, CurrentServer As String
 Dim newdb As New NotesDatabase("", "")

 Set this_db = session.CurrentDatabase
 CurrentServer = this_db.Server
' build internal variables from external variables
 strDBRepID = ModRepID("} + strDBRepID + {")
 strDBTitle = "} + strDBTitle + {"
' attempt to open database on current server
 If newdb.OpenByReplicaID
( CurrentServer, strDBRepID ) Then
  Call ws.OpenDatabase 
( CurrentServer, newdb.FilePath, "", "",
True, False )
' prompt user if unsuccessful
  Messagebox "Can't open " + 
strDBTitle + Chr(10) + " on " +
CurrentServer + _
   ".  Please contact the Help Desk."
 End If
 Exit Sub


 Messagebox "Error #" + 
Format$(Err) + " at line " + Format$(Erl) + ": "
+ Error$, 0, "ERROR"
 Print "Error #" + Format$(Err) + " 
at line " + Format$(Erl) + ": " +
 Exit Sub
<code event="ModRepID">
Function ModRepID
(strDatabaseRepID As String) As String
' remove colon from Replica ID 
and return result

 Dim FindColon As Integer
 Dim RepIDStart As String
 Dim RepIDEnd As String

 FindColon = Instr(1, strDatabaseRepID, ":")
 If FindColon > 0 Then
  RepIDStart = Mid(strDatabaseRepID, 1, 
FindColon - 1)
  RepIDEnd = Mid(strDatabaseRepID, 
FindColon + 1)
  strDatabaseRepID = RepIDStart + 
 End If
 ModRepId = strDatabaseRepID

End Function

' Import new document with button
 into current database
 Set dmp = s.CreateDXLImporter
(stream, this_db)
 dmp.DocumentImportOption = 
' Get the NoteID of the newly created document
 Dim tmpNoteID As String
 tmpNoteID = dmp.GetFirstImportedNoteID( )
' Get the document by the NoteID and return it
 Set newdoc = 
 If Not (newdoc Is Nothing) Then
  Set CreateNewButton = newdoc
  Messagebox "New document could
 not be found.", 0, "ERROR"
 End If
 Exit Function
' If there's a problem processing the 
DXL, you will be prompted with the Row
and Column
 Msgbox dmp.Log
 Print Lsi_info(2) + " - Error #" & Format$(Err) 
& " at line " & 
Format$(Erl) & ": " & Error$
 Messagebox Lsi_info(2) + " - Error #" 
& Format$(Err) & " at line " &
Format$(Erl) & ": " & Error$, 0, "Error"
 Exit Function
End Function

Do you have comments on this tip? Let us know.

This tip was submitted to the tip exchange by member Bryce Berry. Please let others know how useful it is via the rating scale at the end of the tip. Do you have a useful Notes/Domino tip or code to share? Submit it to our monthly tip contest and you could win a prize and a spot in our Hall of Fame.

Dig Deeper on XML and Web Services for Lotus Notes Domino



  • Favorite iSeries cheat sheets

    Here you'll find a collection of valuable cheat sheets gathered from across the iSeries/ community. These cheat ...

  • HTML cheat sheet

    This is a really cool cheat sheet if you're looking to learn more about HTML. You'll find just about everything you every wanted ...

  • Carol Woodbury: Security

    Carol Woodbury