Genii Weblog
Ogres have layers, and now the Sessions db does as well
Thu 20 Jan 2005, 01:32 PM
Tweetby Ben Langhinrichs
Like Shrek with his layers, Notes/Domino 6.x and abive has layers, and ever since Notes 6 was released, I have thought it would be fun to create an application using them, but I have never gotten around to it. Recently, Mike Midas wrote about a case where he used layers, and it appealed to me so much I had him add them to the Lotusphere 2005 Sessions DB in Version 3. Here is a sneak peek:
It is an interesting experiment. Let me know what you think.
Here is the code used. I don't know how redable this will be in here, so I left the agent in the Sessions database itself if you want to take a look (I color coded this, but it exceeded the limit for the blog, so I made it plain again):
'Create location subforms:
Option Public
Option Declare
Uselsx "*lsxrtc"
Option Declare
Uselsx "*lsxrtc"
Dim layer_count As Integer
Dim repid As String
Dim viewid As String
Dim room_w As Integer
Dim computed_x As Integer
Dim computed_y As Integer
Dim layer_id As String
Dim sublayer As GeniiRTChunk
Dim pos As Integer
Dim linktext As String
Dim url As String
Dim repid As String
Dim viewid As String
Dim room_w As Integer
Dim computed_x As Integer
Dim computed_y As Integer
Dim layer_id As String
Dim sublayer As GeniiRTChunk
Dim pos As Integer
Dim linktext As String
Dim url As String
Sub Initialize
' *** Notes backend class objects
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim collection As NotesDocumentCollection
Dim view As NotesView
Dim viewnav As NotesViewNavigator
Dim viewentry As NotesViewEntry
' *** These four "constants" are critical. They determine the width and height of a
' *** unit, and therefore the width and height of everything around then, and the number of
' *** rows and columns to create. In this version, they cannot be altered, as we have taken an
' *** image of the original to save space. Now there is just one layer with a graphic.
Dim w As Integer
Dim h As Integer
Dim rows As Integer
Dim columns As Integer
Dim full_w As Integer
Dim full_h As Integer
w = 10
h = 20
rows = 13
columns = 14
layer_count = 0
room_w = 120
full_w = (w*(columns*4))+room_w
full_h = (h*rows)+40
' *** Midas Rich Text LSX class objects
Dim gSession As New GeniiSession
Dim rtitem As GeniiRTItem
Dim rtchunk As GeniiRTChunk
Dim rtLayer As GeniiRTChunk
' *** Notes backend class objects
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim collection As NotesDocumentCollection
Dim view As NotesView
Dim viewnav As NotesViewNavigator
Dim viewentry As NotesViewEntry
' *** These four "constants" are critical. They determine the width and height of a
' *** unit, and therefore the width and height of everything around then, and the number of
' *** rows and columns to create. In this version, they cannot be altered, as we have taken an
' *** image of the original to save space. Now there is just one layer with a graphic.
Dim w As Integer
Dim h As Integer
Dim rows As Integer
Dim columns As Integer
Dim full_w As Integer
Dim full_h As Integer
w = 10
h = 20
rows = 13
columns = 14
layer_count = 0
room_w = 120
full_w = (w*(columns*4))+room_w
full_h = (h*rows)+40
' *** Midas Rich Text LSX class objects
Dim gSession As New GeniiSession
Dim rtitem As GeniiRTItem
Dim rtchunk As GeniiRTChunk
Dim rtLayer As GeniiRTChunk
' *** Miscellaneous processing vars
Dim col As Integer
Dim cols As Integer
Dim row As Integer
Dim loca As String
Dim timestr As String
' *** Cycle through the selected documents
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument
While Not (doc Is Nothing)
repid = db.ReplicaID
viewid = db.GetView("BySessionID").UniversalID
loca = doc.SessionLocation(0)
If Left(loca, 3) = "Y&B" Then
loca = "Y-B"+Right(loca, Len(loca)-3)
End If
loca = doc.SessionDate(0)+" in "+loca
Set rtitem = New GeniiRTItem
' *** Check to see if the subform already exists. If so, just skip it
rtitem.SuppressMessages = True
Call rtitem.ConnectSubformBody(db.Server, db.FilePath, loca)
If rtitem.IsConnected Then
Goto skipit
End If
Delete rtitem
' *** Create a subform of the appropriate name
Set rtitem = gSession.CreateSubform(db.Server, db.FilePath, loca, "Overwrite='Yes'")
Call rtitem.DefineFont("Arial")
Call rtitem.DefineFont("Verdana")
rtitem.URLFont = "7pt White Verdana'"
rtitem.HyperlinkFont = "7pt White Verdana'"
rtitem.ActionHotspotFont = "7pt White Verdana'"
Set rtchunk = rtitem.DefineChunk("Everything")
rtchunk.SetImpliedProperties = True
rtchunk.ParagraphStyle = "LeftMarginOffset=1 RightMarginPercent=100"
rtchunk.Font = "Arial 1pt"
Call rtchunk.AppendLayer("auto", "auto", "300px", "678px", 0, |LayerHTMLID='Layer' BackgroundImage='sched.gif' BackgroundColor='White' Text=' '|, "LeftMarginPercent=0 FirstLineLeftMarginPercent=0 RightMarginPercent=100" )
Set rtLayer = rtitem.DefineChunk("Inside Layer 1")
rtLayer.SetImpliedProperties = True
Set view = db.GetView("(embedded byLocDay)")
Set viewnav = view.CreateViewNavFromCategory(doc.SessionDate(0)+":"+doc.SessionLocation(0))
Set viewentry = viewnav.GetFirst
While Not (viewentry Is Nothing)
row = 0
' *** Use the session ID to figure out which track, and thus which row
Select Case Left(viewentry.Document.SessionID(0), 2)
Case "JM"
row =13
Case "BD"
rtitem.HyperlinkFont = "7pt White Verdana'"
rtitem.ActionHotspotFont = "7pt White Verdana'"
Set rtchunk = rtitem.DefineChunk("Everything")
rtchunk.SetImpliedProperties = True
rtchunk.ParagraphStyle = "LeftMarginOffset=1 RightMarginPercent=100"
rtchunk.Font = "Arial 1pt"
Call rtchunk.AppendLayer("auto", "auto", "300px", "678px", 0, |LayerHTMLID='Layer' BackgroundImage='sched.gif' BackgroundColor='White' Text=' '|, "LeftMarginPercent=0 FirstLineLeftMarginPercent=0 RightMarginPercent=100" )
Set rtLayer = rtitem.DefineChunk("Inside Layer 1")
rtLayer.SetImpliedProperties = True
Set view = db.GetView("(embedded byLocDay)")
Set viewnav = view.CreateViewNavFromCategory(doc.SessionDate(0)+":"+doc.SessionLocation(0))
Set viewentry = viewnav.GetFirst
While Not (viewentry Is Nothing)
row = 0
' *** Use the session ID to figure out which track, and thus which row
Select Case Left(viewentry.Document.SessionID(0), 2)
Case "JM"
row =13
Case "BD"
row = 12
Case "ST"
row = 11
Case "AD"
row = 10
Case "ID"
row = 9
Case "BP"
row = 8
Case "CS"
row = 7
Case "GU"
row = 6
Case "FR"
row = 5
Case "BO"
row = 4
Case "CF"
row = 3
Case "SP"
row = 2
Case "HN"
row =1
End Select
' *** Use the time range to figure out which column to start and and how many to use
' *** In a "real" application, I would use NotesDateTime objects and calculate all of
' *** this, but it was easier to brute force this for right now
col = 0
cols = 0
Select Case viewentry.ColumnValues(2)
Case " 7:00am - 8:00am"
col = 0
cols = 4
Case " 8:00am - 10:00am"
col =4
cols = 8
Case " 8:30am - 9:30am"
col =6
cols = 4
Case " 8:30am - 10:15am"
col =6
cols = 7
Case "10:00am - 11:00am"
col =12
cols = 4
Case "10:30am - 12:30pm"
col =14
cols = 8
Case "11:00am - 12:00pm"
col =16
cols = 4
Case "11:00am - 12:15pm"
Case "ST"
row = 11
Case "AD"
row = 10
Case "ID"
row = 9
Case "BP"
row = 8
Case "CS"
row = 7
Case "GU"
row = 6
Case "FR"
row = 5
Case "BO"
row = 4
Case "CF"
row = 3
Case "SP"
row = 2
Case "HN"
row =1
End Select
' *** Use the time range to figure out which column to start and and how many to use
' *** In a "real" application, I would use NotesDateTime objects and calculate all of
' *** this, but it was easier to brute force this for right now
col = 0
cols = 0
Select Case viewentry.ColumnValues(2)
Case " 7:00am - 8:00am"
col = 0
cols = 4
Case " 8:00am - 10:00am"
col =4
cols = 8
Case " 8:30am - 9:30am"
col =6
cols = 4
Case " 8:30am - 10:15am"
col =6
cols = 7
Case "10:00am - 11:00am"
col =12
cols = 4
Case "10:30am - 12:30pm"
col =14
cols = 8
Case "11:00am - 12:00pm"
col =16
cols = 4
Case "11:00am - 12:15pm"
col =16
cols = 5
Case "11:15am - 12:15pm"
col =17
cols = 4
Case "12:00pm - 1:00pm"
col =20
cols = 4
Case " 1:00pm - 2:00pm"
col =24
cols = 4
Case " 1:30pm - 2:30pm"
col =26
cols = 4
Case " 1:30pm - 2:45pm"
col =26
cols = 5
Case " 1:30pm - 3:30pm"
col =26
cols = 8
Case " 1:45pm - 3:00pm"
col =27
cols = 5
Case " 2:15pm - 3:15pm"
col =29
cols = 4
Case " 2:30pm - 4:15pm"
col =30
cols = 7
Case " 3:00pm - 4:00pm"
col =32
cols = 4
Case " 3:00pm - 4:15pm"
col =32
cols = 5
Case " 3:45pm - 4:45pm"
col =35
cols = 4
Case " 4:00pm - 6:00pm"
col =36
cols = 8
Case " 4:15pm - 5:15pm"
col =37
cols = 4
Case " 4:45pm - 6:00pm"
col =39
cols = 5
Case " 5:00pm - 6:00pm"
col =40
cols = 4
Case " 5:45pm - 7:00pm"
col =43
cols = 5
Case " 6:15pm - 7:30pm"
col =45
cols = 5
Case "11:15am - 12:15pm"
col =17
cols = 4
Case "12:00pm - 1:00pm"
col =20
cols = 4
Case " 1:00pm - 2:00pm"
col =24
cols = 4
Case " 1:30pm - 2:30pm"
col =26
cols = 4
Case " 1:30pm - 2:45pm"
col =26
cols = 5
Case " 1:30pm - 3:30pm"
col =26
cols = 8
Case " 1:45pm - 3:00pm"
col =27
cols = 5
Case " 2:15pm - 3:15pm"
col =29
cols = 4
Case " 2:30pm - 4:15pm"
col =30
cols = 7
Case " 3:00pm - 4:00pm"
col =32
cols = 4
Case " 3:00pm - 4:15pm"
col =32
cols = 5
Case " 3:45pm - 4:45pm"
col =35
cols = 4
Case " 4:00pm - 6:00pm"
col =36
cols = 8
Case " 4:15pm - 5:15pm"
col =37
cols = 4
Case " 4:45pm - 6:00pm"
col =39
cols = 5
Case " 5:00pm - 6:00pm"
col =40
cols = 4
Case " 5:45pm - 7:00pm"
col =43
cols = 5
Case " 6:15pm - 7:30pm"
col =45
cols = 5
Case " 7:45pm - 9:00pm"
col =51
cols = 5
Case Else
Print "Need slot for " + viewentry.ColumnValues(2)
End Select
' *** Create a layer for the specified track and times, using the session id as the text and
' *** the title and speakers as the mouseover text
If cols > 0 Then
Call CreateCell(rtLayer, col*w, (w*cols)-1, ((row+1)*h), (h-1), full_w, full_h, "Red", _
viewentry.Document.SessionID(0)+"|"+viewentry.ColumnValues(3)+" ("+Join(viewentry.Document.Speaker, ", ")+")", "7pt White Verdana'", "Justify=Center LeftMarginPercent=0 FirstLineLeftMarginPercent=0 RightMarginPercent=100", "", 0)
End If
Set viewentry = viewnav.GetNext(viewentry)
Wend
rtitem.Save
skipit:
Delete rtitem
Set doc = collection.GetNextDocument(doc)
Wend
End Sub
Case " 7:45pm - 9:00pm"
col =51
cols = 5
Case Else
Print "Need slot for " + viewentry.ColumnValues(2)
End Select
' *** Create a layer for the specified track and times, using the session id as the text and
' *** the title and speakers as the mouseover text
If cols > 0 Then
Call CreateCell(rtLayer, col*w, (w*cols)-1, ((row+1)*h), (h-1), full_w, full_h, "Red", _
viewentry.Document.SessionID(0)+"|"+viewentry.ColumnValues(3)+" ("+Join(viewentry.Document.Speaker, ", ")+")", "7pt White Verdana'", "Justify=Center LeftMarginPercent=0 FirstLineLeftMarginPercent=0 RightMarginPercent=100", "", 0)
End If
Set viewentry = viewnav.GetNext(viewentry)
Wend
rtitem.Save
skipit:
Delete rtitem
Set doc = collection.GetNextDocument(doc)
Wend
End Sub
Sub CreateCell(rtLayer As GeniiRTChunk, x As Integer, xlen As Integer, y As Integer, ylen As Integer, max_x As Integer, max_y As Integer, color As String, textval As String, font As String, parastyle As String, hideformula As String, zindex As Integer)
' *** Use our special synax to create a mouse over hotspot
pos = Instr(textval, "|")
If pos > 0 Then
linktext=Left(textval, pos-1)
url = Mid(textval, pos+1, Len(textval)-pos)
pos = Instr(url, |"|)
While pos > 0
Mid$(url, pos, 1) = |'|
pos = Instr(url, |"|)
Wend
textval = ""
Else
linktext = ""
url = ""
End If
computed_x = x+room_w
computed_y = max_y-y
layer_count = layer_count + 1
layer_id = "L"+Cstr(layer_count)
Call rtLayer.AppendLayer(Cstr(computed_y)+"px", Cstr(computed_x)+"px", Cstr(ylen)+"px", Cstr(xlen)+"px", zindex, |LayerHTMLID='|+layer_id+|' BackgroundColor='|+color+|' Text='|+textval+|' TextFont='|+font+|'|, parastyle)
If linktext <> "" Then
' *** Using the ability to find a named layer, get a handle on the layer to set the hotspot.
Set sublayer = rtLayer.RTItem.Everything.FindNamedChunk(True, "Layer", layer_id, "Exact")
If Not (sublayer Is Nothing) Then
Call sublayer.ZoomIn("Text 1")
sublayer.GetLastTarget
Call sublayer.AppendHotspot("Mouseover", |"|+url+|"|, "", linktext)
pos = Instr(textval, "|")
If pos > 0 Then
linktext=Left(textval, pos-1)
url = Mid(textval, pos+1, Len(textval)-pos)
pos = Instr(url, |"|)
While pos > 0
Mid$(url, pos, 1) = |'|
pos = Instr(url, |"|)
Wend
textval = ""
Else
linktext = ""
url = ""
End If
computed_x = x+room_w
computed_y = max_y-y
layer_count = layer_count + 1
layer_id = "L"+Cstr(layer_count)
Call rtLayer.AppendLayer(Cstr(computed_y)+"px", Cstr(computed_x)+"px", Cstr(ylen)+"px", Cstr(xlen)+"px", zindex, |LayerHTMLID='|+layer_id+|' BackgroundColor='|+color+|' Text='|+textval+|' TextFont='|+font+|'|, parastyle)
If linktext <> "" Then
' *** Using the ability to find a named layer, get a handle on the layer to set the hotspot.
Set sublayer = rtLayer.RTItem.Everything.FindNamedChunk(True, "Layer", layer_id, "Exact")
If Not (sublayer Is Nothing) Then
Call sublayer.ZoomIn("Text 1")
sublayer.GetLastTarget
Call sublayer.AppendHotspot("Mouseover", |"|+url+|"|, "", linktext)
Call sublayer.ZoomOut()
End If
End If
End Sub
End If
End If
End Sub
Copyright © 2005 Genii Software Ltd.
What has been said:
273.1. Stan Rogers (01/20/2005 11:40 AM)
Looks more like a parfait to me.
273.2. Duffbert (01/21/2005 07:26 AM)
and we all know *everyone* loves parfait!