
BBjHtmlEdit
Description
In BBj 16.0 and higher, the BBjHtmlEdit control implements a rich text editor backed by HTML.
Setting the STBL("!OPTIONS") JAVAFX_HTMLEDIT option to TRUE makes the BBjHtmlEdit control use JavaFX (if available). In this configuration, the BBjHtmlEdit uses an embedded WebKit browser, with support for HTML5, CSS, and JavaScript.
In BBj 19.0 and higher, setting the STBL("!OPTIONS") CHROMIUM_HTMLEDIT option to TRUE makes the BBjHtmlEdit control use a Chromium engine (if available). In this configuration, the BBjHtmlEdit uses an embedded Chromium-based web browser, with support for HTML5, CSS, and JavaScript.
Access to the JAVAFX_HTMLEDIT and CHROMIUM_HTMLEDIT features requires an active Software Asset Management (SAM) subscription. See Benefits of ‘Software Asset Management' Feature Line. |
Implemented Interfaces
Creation
BBjAPI > BBjSysGui > BBjWindow > BBjHtmlEdit
A BBjHtmlEdit object is created through the following BBjWindow methods:
Return Value |
Method |
---|---|
BBjHtmlEdit |
addHtmlEdit(int ID, int x, int y, int width, int height, string html) |
BBjHtmlEdit |
addHtmlEdit(int ID, int x, int y, int width, int height, string html, string flags) |
Methods of BBjHtmlEdit
Return Value |
Method |
---|---|
BBjVector | getAvailableSpellCheckLanguages() |
BBjVector | getAvailableStates() |
boolean |
|
string |
|
string |
|
string | getLocale() |
BBjVector | getLocales() |
string |
|
string | getSpellCheckLanguage() |
boolean | getState(String state) |
string |
getText() |
boolean | isSpellChecked() |
void |
setBasicToolbar(boolean basicToolbar) |
void |
setBasicToolbarStyles(BBjVector styles) |
void | setLocale(string locale) |
void |
setPlainText(string text) |
void | setState(String state, Boolean value) |
void | setSpellChecked(boolean spellChecked) |
void | setSpellCheckLanguage(string language) |
void |
setText(string text) |
Methods of BBjHtmlEdit implemented for Focusable
Return Value |
Method |
---|---|
boolean |
|
void |
setFocusable(boolean p_focus) |
Methods of BBjHtmlEdit implemented for TabTraversable
Return Value |
Method |
---|---|
boolean |
|
void |
setTabTraversable(boolean trav) |
Methods of BBjHtmlEdit inherited from BBjControl
Events
Callback Code |
Object-oriented Event |
Read Record Event |
Code |
---|---|---|---|
ON_EDIT_MODIFY |
e |
||
ON_GAINED_FOCUS |
f |
||
ON_LOST_FOCUS |
f |
||
ON_MOUSE_ENTER |
E |
||
ON_MOUSE_EXIT |
E |
||
ON_PAGE_LOADED |
x |
||
ON_POPUP_REQUEST |
r |
||
ON_RIGHT_MOUSE_DOWN |
R |
||
ON_STATE_CHANGE | BBjStateChangeEvent | State Change Event | x |
CSS
The visual appearance of BUI controls is defined using CSS (cascading style sheets) rules. Easily change the default colors, border, and other settings by customizing these rules, all without changing any application code. See CSS API for a high-level overview of BUI CSS.
The BBjHtmlEdit control is a <div> containing an editor component consisting of a toolbar and an editing area. The BBjHtmlEdit defines the following CSS style names:
.BBjHtmlEdit (the top level control)
.BBjHtmlEdit.bbj-disabled (the control is disabled)
Most of the styling happens internally within the editor component; these CSS selectors can only apply minimal additional styling, and some rules may require the use of!importantto override internal editor rules.
STBL Options for BBjHtmlEdit
The BBjHtmlEdit can be configured through STBL options to be either an embedded WebKit browser using JavaFX, or an embedded Chromium-based browser. Using the Chromium browser engine is limited to the operating systems and platforms on which the Chromium engine is supported.
To change the type of browser used by the BBjHtmlEdit, use the STBL("!OPTIONS") JAVAFX_HTMLVIEW option and the STBL("!OPTIONS") CHROMIUM_HTMLEDIT option.
Access to the JAVAFX_HTMLEDIT and CHROMIUM_HTMLEDIT features requires an active Software Asset Management (SAM) subscription. See Benefits of ‘Software Asset Management' Feature Line.
If the Chromium-based BBjHtmlEdit is used, the STBL("!CHROMIUM_DIR") string can specify a preferred client-side directory to extract the Chromium binaries. This can be particularly useful in a BBj environment that runs concurrent thin client sessions against multiple servers, where it may be necessary to specify a different Chromium directory for each server.
Version History
Remarks
None.
Constants inherited from BBjControl
Example
BBjHtmlEdit Example
rem ' BBjHtmlEdit
sysgui = unt
open (sysgui)"X0"
sysgui! = bbjapi().getSysGui()
window! = sysgui!.addWindow(50,50,900,500,"BBjHtmlEdit",$00090083$)
window!.setCallback(window!.ON_CLOSE,"eoj")
window!.setCallback(window!.ON_RESIZE,"resize")
rem ' $0001$ = disabled, $0010$ = invisible
rem ' $0002$ = minimized toolbar, $0004$ = basic toolbar
flags$ = $0000$
basic = 0, minimized = 0
if minimized then flags$ = ior(flags$,$0002$)
if basic then flags$ = ior(flags$,$0004$)
text$ = "<html><head><style>p{margin:0;padding:0;}</style><title>BASIS</title></head><body>"
img$ = "https://www.basis.cloud/sites/basis.com/files/images/BusJGBetter.jpg"
text$ = text$ + "<img src="""+img$+""">"
url$ = "https://documentation.basis.cloud/BASISHelp/WebHelp/bbjobjects/Window/bbjhtmledit/BBjHtmlEdit.htm"
text$ = text$ + "<p>This is a <a href="""+url$+""">BBjHtmlEdit</a>."
text$ = text$ + "</body></html>"
rem goto oops
text = unt
open (text,err=oops)"htmledit.html"
readrecord (text,siz=999999)text$
close (unt)
oops:
client = 0
if info(3,6)<>"5" and info(3,6)<>"6" then
client = msgbox("BBjHtmlEdit Client",7+32+512,"BBjHtmlEdit","Swing","JavaFX","Chromium")
switch client
case 1; rem ' Swing
print stbl("!OPTIONS","CHROMIUM_HTMLEDIT=FALSE",ERR=*NEXT)
print stbl("!OPTIONS","JAVAFX_HTMLEDIT=FALSE",ERR=*NEXT)
break
case 2; rem ' JavaFX
print stbl("!OPTIONS","CHROMIUM_HTMLEDIT=FALSE",ERR=*NEXT)
print stbl("!OPTIONS","JAVAFX_HTMLEDIT=TRUE",ERR=*NEXT)
break
case 3; rem ' Chromium
print stbl("!OPTIONS","CHROMIUM_HTMLEDIT=TRUE",ERR=*NEXT)
print stbl("!OPTIONS","JAVAFX_HTMLEDIT=TRUE",ERR=*NEXT)
break
swend
endif
htmledit! = window!.addHtmlEdit(100,25,75,850,400,text$,flags$)
print "getClientType: ",htmledit!.getClientType(err=*next)
print "getClientVersion: ",htmledit!.getClientVersion(err=*next)
title$ = window!.getTitle() + " " + htmledit!.getClientType(err=*next) + " " + htmledit!.getClientVersion(err=*next)
window!.setTitle(title$)
htmledit!.setCallback(htmledit!.ON_PAGE_LOADED,"page")
htmledit!.setCallback(htmledit!.ON_EDIT_MODIFY,"modify")
font! = sysgui!.makeFont("Sans Serif",9,0)
clientfilesystem! = null()
clientfilesystem! = bbjapi().getThinClient(err=*next).getClientFileSystem(err=*next)
flags$ = iff(clientfilesystem!=null(),$0001$,$0000$)
clientfile! = window!.addButton(101,25,25,120,25,"Open Client File",flags$)
clientfile!.setFont(font!)
clientfile!.setCallback(clientfile!.ON_BUTTON_PUSH,"clientfile")
serverfile! = window!.addButton(102,150,25,120,25,"Open Server File",$$)
serverfile!.setFont(font!)
serverfile!.setCallback(serverfile!.ON_BUTTON_PUSH,"serverfile")
newHtml! = window!.addButton(103,275,25,120,25,"New HTML Doc",$$)
newHtml!.setFont(font!)
newHtml!.setCallback(newHtml!.ON_BUTTON_PUSH,"newHtml")
newText! = window!.addButton(104,400,25,120,25,"New Text Doc",$$)
newText!.setFont(font!)
newText!.setCallback(newText!.ON_BUTTON_PUSH,"newText")
getText! = window!.addButton(105,525,25,120,25,"getText (HTML)",$$)
getText!.setFont(font!)
getText!.setCallback(getText!.ON_BUTTON_PUSH,"getText")
getPlainText! = window!.addButton(106,650,25,120,25,"getPlainText",$$)
getPlainText!.setFont(font!)
getPlainText!.setCallback(getPlainText!.ON_BUTTON_PUSH,"getPlainText")
getImage! = window!.addButton(107,775,25,120,25,"getImage",$$)
getImage!.setFont(font!)
getImage!.setCallback(getImage!.ON_BUTTON_PUSH,"getImage")
window!.setVisible(1)
showText = sysgui!.getAvailableContext()
isDirty = 0
process_events
eoj:
release
page:
gosub event
if isDirty then
text$ = htmledit!.getPlainText()
title$ = "BBjHtmlEdit::getPlainText"
isDirty = 0
gosub showText
else
htmledit!.focus()
endif
return
resize:
gosub event
width = event!.getWidth() - 50
height = event!.getHeight() - 100
htmledit!.setSize(width,height)
print width,height
wait 0
htmledit!.focus()
return
event:
event! = sysgui!.getLastEvent()
print event!.getEventName()," ",event!.getControl()
return
clientfile:
filter$ = "All Files (*.*)"+$0a$+"*.*"
filter$ = filter$ + $0a$ + "HTML"+$0a$+"*.htm;*.html"
filter$ = filter$ + $0a$ + "Text" + $0a$+"*.txt;*.src"
clientfile$ = fileopen("Open Client File","","","",filter$,mode="client")
if pos("::"=clientfile$) then return
clientfile! = clientfilesystem!.getClientFile(clientfile$)
serverfile$ = clientfile!.copyFromClient()
serverfile = unt
open (serverfile,err=*return)serverfile$
bytes = dec(fin(serverfile)(1,4))
text$ = ""
if bytes then readrecord (serverfile,siz=bytes)text$
close (serverfile)
if fnIsText(clientfile$,text$) then
htmledit!.setPlainText(text$); rem ' text
else
htmledit!.setText(text$); rem ' html
endif
return
serverfile:
filter$ = "All Files (*.*)"+$0a$+"*.*"
filter$ = filter$ + $0a$ + "HTML"+$0a$+"*.htm;*.html"
filter$ = filter$ + $0a$ + "Text" + $0a$+"*.txt;*.src"
serverfile$ = fileopen("Open Server File","","","",filter$,mode="server")
if pos("::"=serverfile$) then return
serverfile = unt
open (serverfile,err=*return)serverfile$
bytes = dec(fin(serverfile)(1,4))
text$ = ""
if bytes then readrecord (serverfile,siz=bytes)text$
close (serverfile)
if fnIsText(serverfile$,text$) then
htmledit!.setPlainText(text$); rem ' text
else
htmledit!.setText(text$); rem ' html
endif
return
newHtml:
new$ = "<html><head><style>p{margin:0;padding:0;}</style></head><body></body></html>"
htmledit!.setText(new$)
return
newText:
htmledit!.setPlainText(new String($000a00a0000a$,"UTF-16"))
return
getText:
text$ = htmledit!.getText()
title$ = "BBjHtmlEdit::getText"
gosub showText
return
getPlainText:
if isDirty then return
isDirty = htmledit!.isDirty()
if isDirty then return
text$ = htmledit!.getPlainText()
title$ = "BBjHtmlEdit::getPlainText"
gosub showText
return
getImage:
image = unt
format$ = "png"
image! = htmledit!.getImage()
image$ = image!.getBytes(format$)
path$ = System.getProperty("user.home")+"/Desktop/"
open (image,mode="O_CREATE,O_TRUNC")path$+"html.png"
writerecord (image)image$
close (image)
return
showText:
gosub closeShowText
x = window!.getX() + 25
y = window!.getY() + 25
w = window!.getWidth()
h = window!.getHeight()
showText! = sysgui!.addWindow(showText,x,y,w,h,title$,$000b0003$)
showText!.setCallback(showText!.ON_CLOSE,"closeShowText")
cedit! = showText!.addCEdit(101,0,0,0,0,text$,$0182$)
return
closeShowText:
if showText!<>null() then showText!.destroy(err=*next); showText! = null()
return
def fnIsText(_f$,_t$)
rem ' treat this file (filename = _f$, contents = _t$) as plain text?
rem ' this can be whatever combination of tests works for you.
print "fnIsText ",_f$," (bytes=",str(len(_t$)),"): ",
if pos("<html>"=cvs(_t$,8))=1 then print "<html> = html"; return 0
_f$ = cvs(_f$,8); rem ' lowercase
if pos(".html"=_f$,-1)=len(_f$)-4 then print ".html = html"; return 0
if pos(".htm"=_f$,-1)=len(_f$)-3 then print ".htm = html"; return 0
if pos(".txt"=_f$,-1)=len(_f$)-3 then print ".txt = text"; return 1
if pos(".src"=_f$,-1)=len(_f$)-3 then print ".src = text"; return 1
if pos(".properties"=_f$,-1)=len(_f$)-10 then print ".properties = text"; return 1
print "default to text"; return 1; rem ' pick a default
fnend
modify:
event! = sysgui!.getLastEvent()
print event!.getEventName()," ",event!.getText()
return
See Also
CALLBACK Verb - Register BBj Subroutine
See the BBj Object Diagram for an illustration of the relationship between BBj Objects.