1204 lines
38 KiB
Plaintext
1204 lines
38 KiB
Plaintext
Function O4WI_FORMDESIGNER_TEMPLATE_XXX(ACTION, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, status)
|
|
*#!Precompile
|
|
|
|
|
|
/*
|
|
* This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without
|
|
* written permission from Revelation Technologies, Inc.
|
|
!
|
|
*
|
|
* VERSION : 1.0
|
|
*
|
|
*
|
|
* AUTHOR : Revelation Software, Inc. All Rights Reserved.
|
|
*
|
|
* CREATED : July 18, 2019
|
|
*
|
|
*
|
|
!
|
|
*
|
|
* REVISION HISTORY (Most CURRENT first) :
|
|
*
|
|
* DATE IMPLEMENTOR FUNCTION
|
|
* -------- ----------- --------
|
|
*
|
|
*/
|
|
*
|
|
$Insert o4wcommon
|
|
$Insert o4wequates
|
|
$Insert O4W_COMMUTER_COMMON
|
|
$Insert O4W_DESIGN_FORM_EQUATES
|
|
|
|
Declare Function Repository, Function, RTI_VERIFY_PROC
|
|
|
|
If Assigned(ACTION) Else ACTION = ""
|
|
If Assigned(param1) Else param1 = ""
|
|
If Assigned(param2) Else param2 = ""
|
|
If Assigned(param3) Else param3 = ""
|
|
If Assigned(param4) Else param4 = ""
|
|
If Assigned(param5) Else param5 = ""
|
|
If Assigned(param6) Else param6 = ""
|
|
If Assigned(param7) Else param7 = ""
|
|
If Assigned(param8) Else param8 = ""
|
|
If Assigned(param9) Else param9 = ""
|
|
If Assigned(param10) Else param10 = ""
|
|
If Assigned(param11) Else param11 = ""
|
|
If Assigned(status) Else status = ""
|
|
|
|
RSLT = ""
|
|
If Not(Num(ACTION)) Or ACTION < TEMPLATEWIDGET_ACTION_MIN_VALUE$ Or ACTION > TEMPLATEWIDGET_ACTION_MAX_VALUE$ Then
|
|
rslt = WIDGET_ACTION_INVALID$
|
|
End Else
|
|
On action Gosub doTemplateInfo,doQuickDraw,doCreate,doFormProperties
|
|
End
|
|
|
|
Return RSLT
|
|
|
|
doTemplateInfo:
|
|
* no parameters passed in
|
|
param1 = "Example Code"
|
|
rslt = "O4WI_FORMDESIGNER_TEMPLATE_XXX" ;* our ID
|
|
Return
|
|
|
|
doFormProperties:
|
|
* passed headerInfo (if asked to draw the form for real) or nothing (if just getting the tab IDs and Name(s))
|
|
headerInfo = param1
|
|
* if we have any overall "form" properties we need for this type of form, we could add them here...
|
|
If headerInfo = "" Then
|
|
* looking for the name(s) and tab id(s) of the tab(s) we wish to add
|
|
rslt<1> = ""; * tab id(s) (@VM delimited)
|
|
rslt<2> = "" ;* tab name(s) (@VM delimited)
|
|
End Else
|
|
* actually draw the tab(s)
|
|
End
|
|
Return
|
|
|
|
doQuickDraw:
|
|
* passed table, fields, tableStyle, textfields, textSearch, textResults, formfields, tabInfo, searchFields, resultFields, metafields)
|
|
table = param1
|
|
fields = param2
|
|
tableStyle = param3
|
|
textfields = param4
|
|
textSearch = param5
|
|
textResults = param6
|
|
formfields = param7
|
|
tabInfo = param8
|
|
searchFields = param9
|
|
resultFields = param10
|
|
metafields = param11
|
|
unselectedFields = Xlate("DICT.":table, "%FIELDS%", 3, "X")
|
|
unselectedFields = Insert(unselectedFields, 1, 1, 0, "@ID")
|
|
num.fields = dcount(fields, @VM)
|
|
For each.Field = 1 To num.fields
|
|
this.Field = fields<1, each.Field>
|
|
Locate this.Field In unselectedFields<1> using @VM setting dummy Then
|
|
unselectedFields = Delete(unselectedFields, 1, dummy, 0)
|
|
End
|
|
Next each.Field
|
|
num.unselected = dcount(unselectedFields, @VM)
|
|
tabOpts = " "
|
|
tabOpts<2> = "0"
|
|
tabOpts<1,-1> = "General":@VM:"Next Tab"
|
|
tabOpts<2,-1> = "-1":@VM:"1"
|
|
fieldTypes = "Textbox":@VM:"Listbox":@VM:"Checkbox":@VM:"Radio Buttons":@VM:"Text":@VM:"Date Picker":@VM:"Time Picker":@VM:"Toggle":@VM:"None/Not Used"
|
|
fieldCodes = "1":@VM:"2":@VM:"3":@VM:"4":@VM:"5":@VM:"6":@VM:"7":@VM:"9":@VM:"0"
|
|
helpID = 1
|
|
* draw our quickdraw tables in the qfMain section (if we have more than one page, use o4wtabs with qfMain being the "host" for the tabs)
|
|
o4wsectionstart("qfMain")
|
|
O4WHeader("Please select and re-order the form field(s)...", 5)
|
|
helpText = "Please select the field(s) that you wish to display and/or allow the user to update. Also choose the type of element you wish to use for this field. "
|
|
helpText := " For fields that offer multiple choices (like list boxes), you can choose the options once the form has been displayed."
|
|
helpText:= " Arrange the fields in the order you wish them to be displayed; pay particular attention to keep associated multivalue fields together if you wish them to be placed into the same table."
|
|
helpText:= "You can specify which tab the element should be placed on - the general tab is located above the individual tabs, or you can choose next tab to create a new tab. "
|
|
helpText := " You can optionally suppress the use of tabs entirely if you wish."
|
|
helpID += 1; Gosub addQFHelp
|
|
O4WBreak()
|
|
o4wtablestart("qfMainTable", tableStyle)
|
|
o4wtableheader("Field")
|
|
o4wtableheader("Field Type")
|
|
o4wtableheader("Put in tab...")
|
|
passedInfo = textFields; Gosub reArrangeFieldsForWizard
|
|
For each.Field = 1 To num.sfields
|
|
this.field = sortedfields<1, each.field>
|
|
fieldType = formFields<1, each.Field>
|
|
o4wsetcell(each.Field, 1)
|
|
o4wtext(this.field)
|
|
o4wstore(this.Field, "tForm")
|
|
o4wsetcell()
|
|
If fieldType = "" then
|
|
fieldType = "1"
|
|
dInfo = Xlate("DICT.":table, this.Field, "", "X")
|
|
If dInfo = "" Then
|
|
dInfo = Xlate("SYSDICT", this.Field, "", "X")
|
|
end
|
|
convCd = dInfo<7>
|
|
Begin Case
|
|
Case convCd[1,1] = "D"
|
|
fieldType = "6"
|
|
Case convCd[1,2] = "MT"
|
|
fieldType = "7"
|
|
Case convCd[1,1] = "B"
|
|
fieldType = "9"
|
|
*Case convCd[1,2] = "MR"
|
|
* fieldType = "8"
|
|
Case dInfo<1> <> "F"
|
|
fieldType = "5"
|
|
End Case
|
|
end
|
|
O4WLISTBOXSTART("ftype", "qfMainTable_":each.Field, o4wmarkedoptions("", fieldType))
|
|
o4wlistbox(fieldTypes, fieldCodes, "ftype")
|
|
o4wlistboxend()
|
|
o4wsetcell()
|
|
this.tab = tabInfo<1, each.field>
|
|
o4wlistbox(tabOpts<1>, tabOpts<2>, "ttype", "", "", o4wmarkedoptions("", this.tab))
|
|
O4WSetCell("+1")
|
|
Next each.Field
|
|
CNTR = num.sfields
|
|
For each.Field = 1 To num.sunselected
|
|
cntr+=1
|
|
o4wsetcell(cntr)
|
|
o4wtablemodify(cntr, "", "unselected")
|
|
this.field = sortedUnusedFields<1, each.field>
|
|
o4wtext(this.field)
|
|
o4wstore(this.Field, "tForm")
|
|
o4wsetcell()
|
|
O4WLISTBOXSTART("ftype", "qfMainTable_us":each.Field, o4wmarkedoptions("", "0"))
|
|
o4wlistbox(fieldTypes, fieldCodes, "ftype")
|
|
o4wlistboxend()
|
|
o4wsetcell()
|
|
o4wlistbox(tabOpts<1>, tabOpts<2>, "ttype")
|
|
Next each.Field
|
|
o4wsetcell("+1")
|
|
o4wtableend("qfMainTable")
|
|
o4wqualifyevent("$", "hide", ".unselected")
|
|
o4wlink("Show/Hide additional fields", O4W_LINKTYPE_LOCAL$, "#", "", "BTN_TOGGLE")
|
|
o4wqualifyevent("BTN_TOGGLE", "toggle", ".unselected")
|
|
o4wbreak()
|
|
o4wbreak()
|
|
o4wbreak()
|
|
o4wbreak()
|
|
bNoTab = ""
|
|
If tabInfo = "" And textFields <> "" Then
|
|
bNoTab = "1"
|
|
end
|
|
o4wcheckbox("Don't use tabs", "1", "notabs", "notabs", o4wmarkedoptions(bNoTab))
|
|
o4wbreak()
|
|
promptValue = metaFields<1,1>
|
|
o4wlistboxstart("metaFields_prompt", "metaFields_prompt_main", o4wmarkedoptions("", promptValue))
|
|
o4wlistbox("Put labels next to fields", "prompt_sidexside", "metaFields_prompt")
|
|
o4wlistbox("Put labels above fields", "prompt_overunder", "metaFields_prompt")
|
|
o4wlistbox("Use inline prompts (suppress labels)", "prompt_inline", "metaFields_prompt")
|
|
o4wlistboxend()
|
|
o4wbreak()
|
|
bClassic = metaFields<1,2> + 0
|
|
o4wcheckbox("Use 'classic' user interface on desktop", "use_classic", "metaFields_ui", "", o4wmarkedOptions(bClassic))
|
|
o4wsectionend("qfMain")
|
|
Return
|
|
|
|
doCreate:
|
|
* generate the page(s) from the quickdraw results
|
|
custom_names = ""
|
|
custom_values = ""
|
|
custom_names_label = ""
|
|
custom_values_label = ""
|
|
Gosub getLayoutValues
|
|
cntr = 1
|
|
maxPage = 1
|
|
dim pages(5)
|
|
mat pages = ""
|
|
sectionIsMV = 0
|
|
linkURL = ""
|
|
newTabList = ""
|
|
tabList = ""
|
|
bInDisplayPage = 0
|
|
copyright_text = "(c) ":Field(Oconv(DATE(), "D4/"), "/", 3)
|
|
overrideLabels = ""
|
|
makeSubsection = ""
|
|
* passed newForm, table, varfields, formFields, searchFields, resultFields
|
|
newForm = param1
|
|
table = param2
|
|
varfields=param3
|
|
formFields=param4
|
|
searchFields=param5
|
|
resultFields=param6
|
|
headerText = TABLE:" Entry Form"
|
|
num.fields = dcount(varfields<1>, @VM)
|
|
|
|
newForm<HEADER_PAGES$> = "Form Details"
|
|
newForm<HEADER_PAGE_TYPE$> = "details"
|
|
currPage = 1
|
|
fields = varFields<1>
|
|
* organize based on tab information
|
|
Gosub orgTabs
|
|
target = formFields<1>
|
|
tabList = formFields<2>
|
|
bInDisplayPage = 1
|
|
Gosub addFields
|
|
* add in buttons to save/delete/cancel/etc.
|
|
btnURL = ""
|
|
row += 1
|
|
btnList = ""
|
|
ourCol = 0
|
|
btnList<1,-1> = "Save"
|
|
btnList<2,-1> = "BTN_SAVE"
|
|
btnList<3,-1> = ourCol
|
|
btnList<4,-1> = 0
|
|
ourCol += defGridWidth
|
|
btnList<1,-1> = "Cancel"
|
|
btnList<2,-1> = "BTN_CANCEL"
|
|
btnList<3,-1> = ourCol
|
|
btnList<4,-1> = 0
|
|
ourCol += defGridWidth
|
|
this.field.name = copyright_text; Gosub addFooterWithButtons
|
|
* wrap up the form definition
|
|
newForm<HEADER_NEXT_ID$> = cntr
|
|
For each.page = 1 To maxPage
|
|
newForm := @RM:pages(each.page)
|
|
Next each.page
|
|
rslt = newForm
|
|
return
|
|
|
|
addQFHelp:
|
|
* passed helpText, helpID
|
|
o4wbreak()
|
|
o4wlink("Help...", O4W_LINKTYPE_LOCAL$, "#", "", "BTN_HELP":helpID)
|
|
o4wtext("<<<":@VM, "help":helpID:"_b", "toggleMe":helpID)
|
|
o4wtext(helpText:@VM:@VM, "help":helpID, "toggleMe":helpID)
|
|
o4wqualifyevent("$", "hide", "help":helpID:"_b")
|
|
o4wqualifyevent("$", "hide", "help":helpID)
|
|
o4wqualifyevent("BTN_HELP":helpID, "toggle", ".toggleMe":helpID)
|
|
o4wbreak()
|
|
Return
|
|
|
|
rearrangeFieldsForWizard:
|
|
* passed: passedInfo (selected values - if any)
|
|
* returns: updated sortedFields, sortedUnusedFields
|
|
sortedFields = fields
|
|
sortedUnusedFields = unselectedFields
|
|
If passedInfo <> "" Then
|
|
num.text = dcount(passedInfo, @VM)
|
|
For each.text = 1 To num.text
|
|
this.text = passedInfo<1, each.text>
|
|
Locate this.text In sortedFields<1> using @VM setting dummy Then
|
|
sortedFields = Delete(sortedFields, 1, dummy, 0)
|
|
End Else Locate this.text In sortedUnusedFields<1> using @VM setting dummy Then
|
|
sortedUnusedFields = Delete(sortedUnusedFields, 1, dummy, 0)
|
|
End
|
|
Next each.text
|
|
If sortedFields <> "" Then
|
|
sortedFields = passedInfo:@VM:sortedFields
|
|
End Else
|
|
sortedFields = passedInfo
|
|
End
|
|
end
|
|
num.sFields = dcount(sortedFields, @VM)
|
|
num.sUnselected = dcount(sortedUnusedFields, @VM)
|
|
Return
|
|
|
|
addFields:
|
|
pages(currPage)<FORMINFO_ID$, 1> = OVERALL_FORM_ID$:"_":currpage
|
|
pages(currPage)<FORMINFO_TYPE$> = CONTROL_TYPE_DIV$
|
|
pages(currPage)<FORMINFO_POSN$> = "0":@svm:"0":@svm:"12":@svm:"20"
|
|
pages(currPage)<FORMINFO_NEXT_POSN$> = "0":@svm:"0"
|
|
parent = ""
|
|
tabParent = ""
|
|
parentID = ""
|
|
overallParent = OVERALL_FORM_ID$:"_":currpage
|
|
currParent = overallParent
|
|
lastTab = ""
|
|
sizeStack = ""
|
|
* Put up a header
|
|
Gosub addHeader
|
|
addFields2:
|
|
* Now add in all the other fields
|
|
assoc = ""
|
|
row = 1
|
|
bDone = 0
|
|
If MakeSubSection <> "" Then
|
|
* make a section, and put these fields inside of it
|
|
Gosub addSubSection
|
|
End
|
|
num.fields = dcount(fields, @VM)
|
|
For each.Field = 1 To num.fields
|
|
this.Field.name = fields<1, each.Field>
|
|
this.field.type = target<1, each.Field>
|
|
this.field.label = overrideLabels<1, each.Field>
|
|
this.tab = tabList<1, each.Field>
|
|
dict.info = ""
|
|
grid.width = defGridWidth
|
|
If this.field.type <> "0" then
|
|
If this.tab <> lastTab Then
|
|
If parent <> "" Then
|
|
* tables can't cross tabs - close out any pending table
|
|
Gosub endTable
|
|
parent = ""
|
|
assoc = ""
|
|
end
|
|
If lastTab <> "" Then
|
|
Gosub endSpecificTab
|
|
End Else
|
|
* first time through? create our parent element
|
|
Gosub startTabs
|
|
end
|
|
lastTab = this.tab
|
|
Gosub startSpecificTab
|
|
currParent = specificTab
|
|
end
|
|
dict.info = Xlate("DICT.":table, this.field.name, "", "X")
|
|
If this.field.label = "" Then
|
|
this.field.label = dict.info<3>
|
|
If this.field.label = "" Then
|
|
this.field.label = this.field.name
|
|
End
|
|
end
|
|
width = dict.info<10> + 0
|
|
If width = 0 Then width = 1
|
|
screen.part = int(80/width)
|
|
grid.width = int(12 / screen.part)
|
|
If grid.width < defGridWidth Then
|
|
grid.width = defGridWidth
|
|
end
|
|
this.assoc = dict.info<36>
|
|
isMV = 0
|
|
Begin Case
|
|
Case sectionIsMV
|
|
isMV = 1
|
|
Case dict.info<4> _eqc "M" And this.assoc <> ""
|
|
isMV = 1
|
|
Case dict.info<4> _eqc "M"
|
|
* no association name - is this a control type that supports MV fields?
|
|
If this.field.type = "2" Or this.field.type = "3" Then
|
|
* yes, this type can be MV "by itself", not in a table
|
|
End Else
|
|
isMV = 1 ;* this must be put in a table
|
|
* don't let it be associated with anyone else, though
|
|
this.assoc = this.field.name
|
|
end
|
|
End case
|
|
if isMV Then
|
|
If parent <> "" And this.assoc <> assoc And Not(sectionIsMV) Then
|
|
* end the current table and begin a new one
|
|
Gosub endTable
|
|
parent = ""
|
|
end
|
|
If parent = "" Then
|
|
* create new parent element
|
|
Gosub startTable
|
|
parent = tableID
|
|
assoc = this.assoc
|
|
End
|
|
lPosn = "" ;* label handled specially here
|
|
Gosub addTableColumn
|
|
parentID = newColumnID
|
|
* recalc our width now that we're in a table
|
|
grid.width = int(12 / screen.part)
|
|
If grid.width < defGridWidth Then
|
|
grid.width = defGridWidth
|
|
end
|
|
end else
|
|
parentID = currParent
|
|
lPosn = newForm<HEADER_DEFAULT_LABELTYPE$>
|
|
If parent <> "" Then
|
|
* wrap up the parent element from the last MV
|
|
Gosub endTable
|
|
* recalc our width now that we're out of the table
|
|
grid.width = int(12 / screen.part)
|
|
If grid.width < defGridWidth Then
|
|
grid.width = defGridWidth
|
|
end
|
|
end
|
|
parent = ""
|
|
End
|
|
ourLink = ""
|
|
ourLinkType = ""
|
|
If bDone = 0 Then
|
|
ourLink = linkURL
|
|
ourLinkType = O4W_LINKTYPE_LOCAL$
|
|
End
|
|
Gosub addField
|
|
bDone = 1
|
|
end
|
|
Next each.Field
|
|
If parent <> "" Then
|
|
* wrap up the parent element from the last MV
|
|
Gosub endTable
|
|
End
|
|
If lastTab <> "" Then
|
|
Gosub endSpecificTab
|
|
End
|
|
If tabParent <> "" Then
|
|
* wrap up the tab element
|
|
Gosub endTab
|
|
End
|
|
If makeSubSection <> "" Then
|
|
Gosub endSection
|
|
makeSubSection = ""
|
|
end
|
|
* set 'next posn' for the parent container
|
|
pages(currPage)<FORMINFO_NEXT_POSN$, 1, FORMINFO_NEXT_POSN_ROW$> = ROW+1
|
|
Return
|
|
|
|
addSubSection:
|
|
* build a sub section of type "makeSubSection"; set our currParent to it
|
|
parentID = currParent
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = row
|
|
row += 1
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = DEFAULT_TABLE_HEIGHT$ ;* MAX_GRID_HEIGHT$
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = MAX_GRID_WIDTH$ - 2
|
|
bDataBind = 0
|
|
type = makeSubSection
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
Gosub addElement
|
|
saveSectionParent = parentID
|
|
currParent = thisID
|
|
parentID = currParent
|
|
saveSectionRow = row
|
|
row = 0
|
|
ourcol = 0
|
|
Return
|
|
|
|
endSection:
|
|
* make sure all section elements are updated
|
|
row = saveSectionRow + DEFAULT_TABLE_HEIGHT$ ;* MAX_GRID_HEIGHT$
|
|
parentID = saveSectionParent
|
|
currParent = saveSectionParent
|
|
Return
|
|
|
|
|
|
addField:
|
|
* given this.field.name, this.field.type, dict.info, parentID, currPage, table, mode, maxID
|
|
* populate pages(currPage)
|
|
associated = ""
|
|
bNeedLabel = 0
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
lPlacement = newForm<HEADER_DEFAULT_LABELTYPE$>
|
|
this.label = this.field.label
|
|
convert @VM:@SVM:@TM to " " in this.label
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = row
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = grid.width
|
|
bDataBind = 1
|
|
ourHeight = defGridHeight
|
|
Begin Case
|
|
Case this.field.type = "0"
|
|
* ignore this one
|
|
return
|
|
Case this.field.type = "1"
|
|
* textbox and label
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_INPUT_TEXT$
|
|
Case this.Field.type = "2"
|
|
* listbox and label
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_SELECT_MENU$
|
|
Case this.field.type = "3"
|
|
* checkbox and label
|
|
bNeedLabel = 0 ;* don't need label - we get the field set
|
|
type = CONTROL_TYPE_CHECK_SET$
|
|
ourHeight = 3
|
|
Case this.field.type = "4"
|
|
* radio button and label
|
|
bNeedLabel = 0 ;* don't need label - we get the field set
|
|
type = CONTROL_TYPE_RADIO_SET$
|
|
ourHeight = 3
|
|
Case this.field.type = "5"
|
|
* plain text
|
|
bNeedLabel = 1
|
|
this.label = "^" ;* just show the current value
|
|
type = CONTROL_TYPE_TEXT$
|
|
Case this.field.type = "6"
|
|
* date picker
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_DATEPICKER$
|
|
conv = dict.info<7>
|
|
delimChar = ""
|
|
euroFlag = ""
|
|
If conv[1,1] = "D" Then
|
|
* do we have a delimiter?
|
|
delim = ""
|
|
ccntr = 2
|
|
next.char = conv[2,1]
|
|
If next.char <> "E" And Num(next.char) Then
|
|
ccntr = 3
|
|
next.char = conv[3,1]
|
|
End
|
|
If Not(Index("EFGHIJQWASML",NEXT.CHAR,1)) And next.char <> "" Then
|
|
* yes, this is a delimiter
|
|
delimChar = next.char
|
|
ccntr += 1
|
|
End
|
|
If conv[ccntr,1] = "E" Then
|
|
* European format
|
|
euroFlag = "1"
|
|
End
|
|
End
|
|
If delimChar <> "" Then
|
|
custom_names<-1> = WIDGET_MSG_DATE_DELIM$
|
|
custom_values<-1> = delimChar
|
|
End
|
|
If euroFlag <> "" Then
|
|
custom_names<-1> = WIDGET_MSG_DATE_EURO$
|
|
custom_values<-1> = euroFlag
|
|
end
|
|
Case this.field.type = "7"
|
|
* time picker
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_TIMEPICKER$
|
|
show24 = ""
|
|
showSeconds = ""
|
|
conv = dict.info<7>
|
|
If conv[1,2] = "MT" then
|
|
If indexc(conv, "H", 1) = 0 then
|
|
* not in 12 hour format - allow for 24 hour def'n
|
|
show24 = "1"
|
|
End
|
|
If indexc(conv, "S", 1) Then
|
|
* show seconds too
|
|
showSeconds = "1"
|
|
End
|
|
end
|
|
If show24 <> "" Then
|
|
custom_names<-1> = WIDGET_MSG_TIME_24HR$
|
|
custom_values<-1> = show24
|
|
End
|
|
If showSeconds <> "" Then
|
|
custom_names<-1> = WIDGET_MSG_TIME_SECONDS$
|
|
custom_values<-1> = showSeconds
|
|
end
|
|
|
|
Case this.field.type = "8"
|
|
* NOT USED
|
|
*bNeedLabel = 1
|
|
*type = CONTROL_TYPE_INPUT_NUMBER$
|
|
Case this.field.type = "9"
|
|
* toggle
|
|
bNeedLabel = 0
|
|
type = CONTROL_TYPE_M_TOGGLE$
|
|
ourHeight = 3
|
|
Case this.field.type = "10"
|
|
* button
|
|
bNeedLabel = 0
|
|
type = CONTROL_TYPE_BUTTON$
|
|
Case this.field.type = "11"
|
|
* file upload
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_INPUT_FILE$
|
|
Case this.field.type = "12"
|
|
* text area
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_INPUT_AREA$
|
|
Case this.field.type = "13"
|
|
* color picker
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_COLORPICKER$
|
|
Case this.field.type = "14"
|
|
* password and label
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_INPUT_TEXT$
|
|
custom_names<-1> = WIDGET_MSG_SPECIAL_STYLE$
|
|
custom_values<-1> = "password"
|
|
Case this.field.type = "15"
|
|
* hidden field
|
|
bNeedLabel = 0
|
|
type = CONTROL_TYPE_INPUT_TEXT$
|
|
custom_names<-1> = WIDGET_MSG_SPECIAL_STYLE$
|
|
custom_values<-1> = "hidden"
|
|
Case this.field.type = "16"
|
|
* image
|
|
bNeedLabel = 1
|
|
type = CONTROL_TYPE_IMAGE$
|
|
End Case
|
|
If IsMV Then
|
|
* never show label for MV fields - already done in table
|
|
bNeedLabel = 0
|
|
lPlacement = WIDGET_LABEL_POSN_NONE$
|
|
End
|
|
promptText = ""
|
|
addClass = ""
|
|
If lPlacement = WIDGET_LABEL_POSN_INLINE$ Then
|
|
bNeedLabel = 0
|
|
promptText = this.label
|
|
End
|
|
row += ourHeight
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = ourHeight
|
|
addBefore = ""
|
|
Gosub addElement2 ;* we already have our label
|
|
If bNeedLabel Then
|
|
posn = newposn ;* remember the location of our data element
|
|
custom_names = custom_names_label
|
|
custom_values = custom_values_label
|
|
elementID = thisID
|
|
associated = thisID ;* mark the label's associated field
|
|
bDataBind = 0
|
|
Gosub createLabel
|
|
end
|
|
Return
|
|
|
|
AddElement:
|
|
this.label = this.field.label
|
|
convert @VM:@SVM:@TM to " " in this.label
|
|
AddElement2: * entry point if this.label is already set
|
|
names = ""
|
|
values = ""
|
|
names<1> = WIDGET_MSG_LABEL$
|
|
values<1> = this.label
|
|
names<2> = WIDGET_MSG_LINK$
|
|
If ourLink <> "" Then
|
|
values<2> = "1"
|
|
names<3> = WIDGET_MSG_LINK_URL$
|
|
values<3> = ourLink
|
|
names<4> = WIDGET_MSG_LINK_TYPE$
|
|
values<4> = ourLinkType
|
|
End Else
|
|
values<2> = "0"
|
|
End
|
|
names<-1> = WIDGET_MSG_LABEL_PLACEMENT$
|
|
VALUES<-1> = lPlacement
|
|
this.size = dict.info<10>
|
|
If this.size <> "" then
|
|
names<-1> = WIDGET_MSG_SIZE$
|
|
values<-1> = this.size
|
|
end
|
|
If bDataBind Then
|
|
If table <> "" then
|
|
names<-1> = WIDGET_MSG_DB_TABLE$
|
|
values<-1> = table
|
|
End
|
|
If this.field.name <> "" then
|
|
names<-1> = WIDGET_MSG_DB_FIELD$
|
|
values<-1> = this.field.name
|
|
names<-1> = WIDGET_MSG_NAME$
|
|
values<-1> = this.field.name
|
|
end
|
|
names<-1> = WIDGET_MSG_DB_RO$
|
|
isRO = 0
|
|
If (dict.info<1> _eqc "S") And bInDisplayPage Then
|
|
isRO = 2 ;* make it unchangeable
|
|
end
|
|
values<-1> = isRO
|
|
If dict.info<4> _eqc "M" then
|
|
names<-1> = WIDGET_MSG_DB_MV$
|
|
values<-1> = "1"
|
|
end
|
|
names<-1> = WIDGET_MSG_SET_SHOWNONE$
|
|
values<-1> = Not(bInDisplayPage)
|
|
names<-1> = WIDGET_MSG_CONTROL_ALIGN$
|
|
values<-1> = "0" ;* assume all controls will left align
|
|
names<-1> = WIDGET_MSG_FONT_ALIGN$
|
|
align = "0"
|
|
If dict.info<9> = "R" Then
|
|
align = "2"
|
|
End Else If dict.info<9> = "C" Or dict.info<9> = "T" Then
|
|
align = "1"
|
|
end
|
|
values<-1> = align
|
|
If promptText <> "" Then
|
|
names<-1> = WIDGET_MSG_PROMPT$
|
|
values<-1> = promptText
|
|
End
|
|
If addClass <> "" Then
|
|
names<-1> = WIDGET_MSG_CLASS_ADD$
|
|
values<-1>= addClass
|
|
end
|
|
End
|
|
names<-1> = custom_names
|
|
values<-1> = custom_values
|
|
custom_names = ""
|
|
custom_values = ""
|
|
newForm<HEADER_NEXT_ID$> = cntr ;* make sure this is up to date
|
|
newPosn = o4wi_formdesigner_widget_new(newForm, pages(currPage), thisID, parentID, type, prop_locn, associated, bProtected, addBefore, names, values)
|
|
* maxID may have changed - be sure to refresh it
|
|
cntr = newForm<HEADER_NEXT_ID$>
|
|
Return
|
|
|
|
createLabel:
|
|
* create the label element
|
|
If lPosn = "" Then Return ;* don't put the label element on at all
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
TYPE = CONTROL_TYPE_TEXT$
|
|
prop_locn = pages(currPage)<FORMINFO_POSN$, posn> ;* let the label assume the 'landing position' from the user
|
|
aelement_locn = prop_locn
|
|
If lPosn = WIDGET_LABEL_POSN_SXS$ Then
|
|
* side-by-side
|
|
* Change the size of the label so it's "standard size"
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = defGridWidth ;* so everything lines up in the columns
|
|
* now move the associated element so it's in the right place
|
|
aelement_locn<1,1, FORMINFO_POSN_COL$> = prop_locn<1,1, FORMINFO_POSN_COL$> + defGridWidth
|
|
End Else
|
|
* over/under
|
|
aelement_locn<1,1, FORMINFO_POSN_ROW$> = prop_locn<1,1, FORMINFO_POSN_ROW$> + prop_locn<1,1,FORMINFO_POSN_HEIGHT$>
|
|
* adjust our "next position to use"
|
|
row += prop_locn<1,1,FORMINFO_POSN_HEIGHT$>
|
|
* and finally set our height to 1 (by default the label should only be 1 high)
|
|
aelement_locn<1,1,FORMINFO_POSN_HEIGHT$> = 1
|
|
End
|
|
pages(currPage)<FORMINFO_POSN$, posn> = aelement_locn
|
|
bProtected = 0
|
|
lPlacement = lPosn
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = "1"
|
|
Gosub addElement
|
|
pages(currPage)<FORMINFO_ASSOCIATED$, posn> = thisID ;* tell our associated control who we are
|
|
pages(currPage)<FORMINFO_LABEL_TYPE$, posn> = "2" ;* and that they are the "master"
|
|
Return
|
|
|
|
startTable:
|
|
* create new table element as parent For these
|
|
parentID = currParent
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = row
|
|
row += 1
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = DEFAULT_TABLE_HEIGHT$ ;* MAX_GRID_HEIGHT$
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = MAX_GRID_WIDTH$ - 2
|
|
bDataBind = 0
|
|
tableID = thisID
|
|
type = CONTROL_TYPE_TABLE$
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
Gosub addElement
|
|
If sectionIsMV = 2 Then
|
|
* mark this as a multiRecord table
|
|
names = WIDGET_MSG_TBL_TYPE$
|
|
values = "2"
|
|
Gosub updateTable
|
|
End
|
|
saveTableRow = row
|
|
sizeStack = Insert(sizeStack, 1, 0, 0, defGridWidth)
|
|
defGridWidth = MAX_GRID_WIDTH$ - 2
|
|
Return
|
|
|
|
|
|
addTableColumn:
|
|
* add a new child div To the parent table
|
|
newColName = this.field.label
|
|
convert @VM:@SVM:@TM to " " in newColName
|
|
newColumnID = ""
|
|
names = ""
|
|
values = ""
|
|
names<1> = WIDGET_MSG_TBL_COLUMN_ADD$
|
|
values<1> = newColName
|
|
newForm<HEADER_NEXT_ID$> = cntr ;* make sure this is up to date
|
|
Gosub updateTable
|
|
* maxID may have changed - be sure to refresh it
|
|
cntr = newForm<HEADER_NEXT_ID$>
|
|
* return our new column ID
|
|
newColumnID = pInfo
|
|
* make sure our children are full sized
|
|
defGridWidth = MAX_GRID_WIDTH$ - 2
|
|
* And reset our row to the top of the column
|
|
row = 0
|
|
Return
|
|
|
|
updateTable:
|
|
* let the element update itself
|
|
supportName = UCASE(DESIGN_SUPPORT_PREFIX$:CONTROL_TYPE_TABLE$)
|
|
IF RTI_VERIFY_PROC(supportName, 0, 5) = 0 THEN
|
|
* failed
|
|
CALL SET_STATUS(0)
|
|
END Else
|
|
pInfo = Function(@supportName(WIDGET_ACTION_UPDATE$, newForm, pages(currPage), tableID, "", names, values))
|
|
End
|
|
return
|
|
|
|
endTable:
|
|
* make sure all table elements are updated
|
|
row = saveTableRow + DEFAULT_TABLE_HEIGHT$ ;* MAX_GRID_HEIGHT$
|
|
defGridWidth = sizeStack<1>
|
|
sizeStack = Delete(sizeStack, 1, 0, 0)
|
|
Return
|
|
|
|
addButton:
|
|
* passed btn (text), btnID, btnURL (optional), ourCol, Row, btnType
|
|
parentID = OVERALL_FORM_ID$:"_":currpage
|
|
addButton2:
|
|
* entry point for different parents
|
|
type = btnType
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = ourCol
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = row
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = defGridHeight
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = defGridWidth
|
|
bDataBind = 0
|
|
associated = ""
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
Gosub addElement
|
|
* let the element update itself
|
|
supportName = UCASE(DESIGN_SUPPORT_PREFIX$:type)
|
|
IF RTI_VERIFY_PROC(supportName, 0, 5) = 0 THEN
|
|
CALL SET_STATUS(0)
|
|
END Else
|
|
names = ""
|
|
values = ""
|
|
names<1> = WIDGET_MSG_LABEL$
|
|
values<1> = btn
|
|
names<2> = WIDGET_MSG_LINK$
|
|
If btnURL = "" Then
|
|
values<2> = 0
|
|
End else
|
|
values<2> = 1
|
|
names<3> = WIDGET_MSG_LINK_URL$
|
|
values<3> = btnURL
|
|
names<4> = WIDGET_MSG_LINK_TYPE$
|
|
values<4> = O4W_LINKTYPE_LOCAL$
|
|
End
|
|
names<-1> = WIDGET_MSG_BTN_DEFAULT$
|
|
values<-1> = bDefault
|
|
newForm<HEADER_NEXT_ID$> = cntr ;* make sure this is up to date
|
|
pInfo = Function(@supportName(WIDGET_ACTION_UPDATE$, newForm, pages(currPage), thisID, "", names, values))
|
|
* maxID may have changed - be sure to refresh it
|
|
cntr = newForm<HEADER_NEXT_ID$>
|
|
end
|
|
|
|
Return
|
|
|
|
orgTabs: * reorganize fields so that each tab is sequential In the list
|
|
* passed: fields, formFields<1> (field types) and formFields<2> (tabs)
|
|
* sets newTabList, updates formFields, updates fields
|
|
num.names = dcount(fields, @VM)
|
|
formTypes = formFields<1>
|
|
tabList = formFields<2>
|
|
If tablist = "" Or tablist = str("0":@VM, num.names-1):"0" then
|
|
* nothing to do here - no tabs
|
|
formFields<2> = ""
|
|
Return
|
|
End
|
|
newTabList = ""
|
|
currTabNum = 0
|
|
For each.name = 1 To num.names
|
|
this.name = fields<1, each.name>
|
|
this.tab = tabList<1, each.name>
|
|
this.type = formTypes<1, each.name>
|
|
Begin Case
|
|
Case this.tab = "0" And newTabList <> ""
|
|
* unchanged
|
|
tabNum = currTabNum
|
|
Case this.tab = "-1"
|
|
* general
|
|
TabNum = -1
|
|
currTabNum = tabNum
|
|
Case this.tab = "1" Or newTabList = ""
|
|
* new tab
|
|
currTabNum += 1
|
|
tabNum = currTabNum
|
|
End Case
|
|
Locate tabNum In newTabList<1> by "AR" using @VM setting posn then
|
|
newTabList<2, posn, -1> = this.name
|
|
newTabList<3,posn,-1> = this.type
|
|
End Else
|
|
newTabList = Insert(newTabList, 1, posn, 0, tabNum)
|
|
newTabList = Insert(newTabList, 2, posn, 0, this.name)
|
|
newTabList = Insert(newTabList, 3, posn, 0, this.type)
|
|
End
|
|
Next each.name
|
|
* rebuild the list
|
|
num.tabs = dcount(newTabList<1>, @VM)
|
|
nlist = ""
|
|
list1 = ""
|
|
list2 = ""
|
|
tabcntr = 1
|
|
For each.tab = 1 To num.tabs
|
|
this.tab = newTabList<1, each.tab>
|
|
If this.tab = "-1" Then
|
|
this.tab = ""
|
|
End Else
|
|
this.tab = "Tab ":tabcntr
|
|
tabcntr += 1
|
|
End
|
|
these.names = newTabList<2, each.tab>
|
|
these.types = newTabList<3, each.tab>
|
|
num.names = dcount(these.names, @SVM)
|
|
Convert @SVM To @VM In these.names
|
|
Convert @SVM To @VM In these.types
|
|
nList := these.names:@VM
|
|
list1 := these.types:@VM
|
|
list2 := str(this.tab:@VM, num.names)
|
|
Next each.tab
|
|
formFields<1> = list1[1, Len(list1)-1]
|
|
formFields<2> = list2[1, Len(list2)-1]
|
|
fields = nList[1, Len(nList)-1]
|
|
Return
|
|
|
|
startTabs: * determine number of tabs, And create parent And children tab elements
|
|
* passed tabList, newTabList
|
|
* sets tabParent
|
|
parentID = currParent
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = row
|
|
row += 1
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = MAX_GRID_HEIGHT$
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = MAX_GRID_WIDTH$-2
|
|
bDataBind = 0
|
|
tableID = thisID
|
|
type = CONTROL_TYPE_TAB$
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
Gosub addElement
|
|
tabParent = thisID
|
|
currParent = thisID
|
|
savedRow = row
|
|
Return
|
|
|
|
Return
|
|
|
|
startSpecificTab: * create child tab element
|
|
* passed lastTab, sets specificTab
|
|
* let the element update itself
|
|
supportName = UCASE(DESIGN_SUPPORT_PREFIX$:CONTROL_TYPE_TAB$)
|
|
IF RTI_VERIFY_PROC(supportName, 0, 5) = 0 THEN
|
|
* failed
|
|
CALL SET_STATUS(0)
|
|
END Else
|
|
newForm<HEADER_NEXT_ID$> = cntr ;* make sure this is up to date
|
|
names = WIDGET_MSG_TBL_COLUMN_ADD$
|
|
values = lastTab
|
|
pInfo = Function(@supportName(WIDGET_ACTION_UPDATE$, newForm, pages(currPage), tabParent,"", names, values))
|
|
* maxID may have changed - be sure to refresh it
|
|
cntr = newForm<HEADER_NEXT_ID$>
|
|
* return our new column ID
|
|
specificTab = pInfo
|
|
* and reset our position to top row
|
|
row = 0
|
|
End
|
|
Return
|
|
|
|
endSpecificTab: * close child tab element
|
|
* passed lastTab
|
|
row = savedRow + MAX_GRID_HEIGHT$
|
|
Return
|
|
|
|
endTab: * close overall tab element
|
|
* passed tabParent
|
|
row = savedRow + MAX_GRID_HEIGHT$
|
|
Return
|
|
|
|
getLayoutValues:
|
|
call Set_Status(0)
|
|
layoutInformation = Repository("ACCESS", @APPID<1>:"*APPROW**O4WCODES:FORMDESIGNER_LAYOUT")
|
|
call Set_Status(0)
|
|
If layoutInformation = "" Then
|
|
layoutInformation = Xlate("O4WCODES", "FORMDESIGNER_LAYOUT", "", "X")
|
|
End
|
|
maxGridWidth = layoutInformation<CONFIG_GRID_SIZE_MAX$,1>
|
|
If maxGridWidth = "" Then
|
|
maxGridWidth = MAX_GRID_WIDTH$
|
|
End
|
|
maxGridHeight = layoutInformation<CONFIG_GRID_SIZE_MAX$,2>
|
|
If maxGridHeight = "" Then
|
|
maxGridHeight = MAX_GRID_HEIGHT$
|
|
End
|
|
|
|
defGridWidth = layoutInformation<CONFIG_GRID_SIZE_ELEMENT$,1>
|
|
If defGridWidth = "" Then
|
|
defGridWidth = DEFAULT_GRID_WIDTH$
|
|
End
|
|
defGridHeight = layoutInformation<CONFIG_GRID_SIZE_ELEMENT$,2>
|
|
If defGridHeight = "" Then
|
|
defGridHeight = DEFAULT_GRID_HEIGHT$
|
|
End
|
|
defGridContainerWidth = layoutInformation<CONFIG_GRID_SIZE_CONTAINER$,1>
|
|
If defGridContainerWidth = "" Then
|
|
defGridContainerWidth = DEFAULT_GRID_CONTAINER_WIDTH$
|
|
End
|
|
defGridContainerHeight = layoutInformation<CONFIG_GRID_SIZE_CONTAINER$,2>
|
|
If defGridContainerHeight = "" Then
|
|
defGridContainerHeight = DEFAULT_GRID_CONTAINER_HEIGHT$
|
|
End
|
|
|
|
cellHeight = layoutInformation<CONFIG_CELL_HEIGHT$>
|
|
If cellHeight = "" Then
|
|
cellHeight = DEFAULT_GRID_CELL_HEIGHT$
|
|
End
|
|
Return
|
|
|
|
addFooterWithButtons:
|
|
* btnList<1,x> = list of button text
|
|
* btnList<2,x> = associated list of button IDs
|
|
* btnList<3,x> = associated list of button positions
|
|
* btnList<4,x> = associated list of "is default button?" flags
|
|
* this.field.name = footer text
|
|
* first, create the mobile footer itself
|
|
save.defGridHeight = defGridHeight
|
|
defGridHeight = 2 * defGridHeight
|
|
footer.text = this.field.name
|
|
this.field.name = "" ;* create without any header text
|
|
Gosub addFooter2
|
|
footerID = thisID
|
|
defGridHeight = save.defGridHeight
|
|
* save all the 'real' values
|
|
save.parentID = parentID
|
|
save.parent = parent
|
|
save.tabParent = tabParent
|
|
save.overallParent = overallParent
|
|
save.currParent = currParent
|
|
save.lastTab = lastTab
|
|
save.row = row
|
|
* next, make a 'button set' to hold the buttons
|
|
parentID = footerID
|
|
type = CONTROL_TYPE_BUTTON_SET$
|
|
associated = ""
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = 0
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = defGridHeight
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = maxGridWidth
|
|
this.field.value = ""
|
|
dict.info = ""
|
|
dict.info<10> = 5
|
|
isMV = 0
|
|
bDataBind = 0
|
|
ourLink = ""
|
|
ourLinkType = ""
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
this.field.label = ""
|
|
Gosub addElement
|
|
bsetID = thisID
|
|
* next, put our buttons inside
|
|
parentID = bsetID
|
|
row = 0
|
|
btnType = CONTROL_TYPE_BUTTON$
|
|
num.buttons = dcount(btnList<1>, @VM)
|
|
save.defGridWidth = defGridWidth
|
|
defGridWidth = int(maxGridWidth / num.buttons)
|
|
ourCol = 0
|
|
For each.btn = 1 To num.buttons
|
|
btn = btnList<1, each.btn>
|
|
btnID = btnList<2, each.btn>
|
|
* ourCol = btnList<3, each.btn>
|
|
bDefault = btnList<4, each.btn>
|
|
Gosub addButton2
|
|
ourCol += defGridWidth
|
|
Next each.btn
|
|
defGridWidth = save.defGridWidth
|
|
* finally, put an explicit header inside
|
|
parentID = footerID
|
|
type = CONTROL_TYPE_HEADER$
|
|
associated = ""
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = 1
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = defGridHeight
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = maxGridWidth
|
|
this.field.value = ""
|
|
dict.info = ""
|
|
dict.info<10> = 5
|
|
isMV = 0
|
|
bDataBind = 0
|
|
ourLink = ""
|
|
ourLinkType = ""
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
this.field.label = footer.text
|
|
Gosub addElement
|
|
* restore everything
|
|
parentID = save.parentID
|
|
parent = save.parent
|
|
tabParent = save.tabParent
|
|
overallParent = save.overallParent
|
|
currParent = save.currParent
|
|
lastTab = save.lastTab
|
|
row = save.row
|
|
return
|
|
|
|
addFooter:
|
|
* add in a footer section
|
|
this.field.name = copyright_text
|
|
addFooter2:
|
|
hfRow = row + 5
|
|
If hfRow < MAX_GRID_HEIGHT$ Then
|
|
hfRow = MAX_GRID_HEIGHT$
|
|
end
|
|
hfSize = 5
|
|
type = CONTROL_TYPE_M_FOOTER$
|
|
custom_names<1,-1> = WIDGET_MSG_MOB_FIXED$
|
|
custom_values<1,-1> = "1"
|
|
Goto addHeaderFooter
|
|
|
|
addHeader:
|
|
this.field.name = headerText
|
|
hfRow = "0"
|
|
hfSize = "3"
|
|
type = CONTROL_TYPE_M_HEADER$
|
|
* fall through
|
|
|
|
addHeaderFooter:
|
|
* passed type, hfRow, hfSize, this.field.name
|
|
save.parentID = parentID
|
|
save.parent = parent
|
|
save.tabParent = tabParent
|
|
save.overallParent = overallParent
|
|
save.currParent = currParent
|
|
save.lastTab = lastTab
|
|
associated = ""
|
|
parentID = OVERALL_FORM_ID$:"_":currpage
|
|
thisID = ELEMENT_PREFIX$:CNTR
|
|
cntr += 1
|
|
bProtected = 0
|
|
prop_locn = ""
|
|
prop_locn<1,1,FORMINFO_POSN_COL$> = "0"
|
|
prop_locn<1,1,FORMINFO_POSN_ROW$> = hfRow
|
|
prop_locn<1,1,FORMINFO_POSN_HEIGHT$> = defGridHeight
|
|
prop_locn<1,1,FORMINFO_POSN_WIDTH$> = maxGridWidth
|
|
this.field.value = ""
|
|
dict.info = ""
|
|
dict.info<10> = hfSize
|
|
isMV = 0
|
|
bDataBind = 0
|
|
ourLink = ""
|
|
ourLinkType = ""
|
|
lPlacement = WIDGET_LABEL_POSN_SXS$
|
|
promptText = ""
|
|
addClass = ""
|
|
addBefore = ""
|
|
this.field.label = this.field.name
|
|
Gosub addElement
|
|
parentID = save.parentID
|
|
parent = save.parent
|
|
tabParent = save.tabParent
|
|
overallParent = save.overallParent
|
|
currParent = save.currParent
|
|
lastTab = save.lastTab
|
|
Return
|
|
|