SlideShare une entreprise Scribd logo
1  sur  122
Télécharger pour lire hors ligne
08/01/05 / Page 1
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XUL
The future of
user-interfaces
on the web
08/01/05 / Page 2
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
About me
Stefan Neufeind
From Neuss (near Düsseldorf, Germany)
Working for SpeedPartner GmbH
in consulting, development and administration
08/01/05 / Page 3
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Agenda
Background / history
Basics
Simple widgets / elements
Scripting
Trees, RDF, templates
Events
XUL with PHP
Resources
08/01/05 / Page 4
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Skills needed
Basic knowledge about:
HTML / XML
CSS
JavaScript
DOM
Easy to start with, but still quite much to learn
08/01/05 / Page 5
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Tools needed
Mozilla-based browser as runtime
Some texteditor :-)
for more than easy examples:
Javascript-console
Javascript-debugger (“Venkman”)
Component-viewer
DOM-inspector
Docs and references
08/01/05 / Page 6
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Mozilla's way
1998: Netscape opened source-code to public
Code hard to maintain
Multi-platform-basis incomplete for license reasons
Mozilla-project reinvented almost complete backend
Layout-engine Gecko
XPFE (cross-platform frontend)
Targeted at applications, not websites
Based on XUL (XML user-interface language)
08/01/05 / Page 7
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Mozilla, XUL and ... Ghostbusters?
XUL: reference to the film Ghostbusters
ghost of an ancient Sumerian deity called Zuul
(pronounce to rhyme with “cool”)
possesses the character Dana Barrett and declares
"There is no Dana, only Zuul"
XUL usually to define interface, not a document,
so developers adopted slogan "There is no data, only XUL"
08/01/05 / Page 8
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Mozilla, XUL and ... Ghostbusters?
XML-namespace-URI:
http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul
View with XUL-capable application:
"Keymaster" and "Gatekeeper" also references to same plotline
More references to Ghostbusters within Mozilla:
e.g. JavaScript debugger “Venkman” is one of main characters
[thanks to Wikipedia]
08/01/05 / Page 9
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Big picture
XPFE: cross-platform frontend
eXtensible Binding Language (XBL)
to create reusable widgets with XUL/JavaScript.
Chrome
provides user interface parts of application
XPCOM/XPConnect
allow JavaScript (and other scripting languages) to
access/utilize C and C++ libraries
Cross-Platform Install (XPInstall)
to package applications for installing on any platform
08/01/05 / Page 10
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Big picture
XML-based User-interface Language (XUL)
to create the structure and content of application
XUL Templates
to create framework for importing data with RDF/XUL
Resource Description Framework (RDF)
to store data and transmit information
Document Type Definition (DTD)
used for localization and internationalization
08/01/05 / Page 11
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
What is XUL?
Markup-language
Objects as XML-structures
Elements in a DOM-tree
Modification of element-
attributes possible at runtime
Styling using CSS
C++-APIs accessible using
XPCOM
08/01/05 / Page 12
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XML basics
Start with XML-header
Case-sensitive
(window != Window)
Close all tags!
“Empty” tags allowed in some cases; closed immediately
<label value=”Hello” />
Well-formed, unknown tags/attributes ignored
Allows usage of additional features
Include namespaces!
Multiple namespaces supported in one document
08/01/05 / Page 13
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XUL file structure
Well structured XUL-file contains:
XML-version
Reference to style-sheets
DOCTYPE (omitted in some cases)
Namespace-declarations in root-tag
(HTML-namespace optional)
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/"
type="text/css"?>
<!DOCTYPE window>
<window xmlns:html="http://www.w3.org/1999/xhtml"
xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
08/01/05 / Page 14
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
For XPFE application root of document: <window>
<dialog> and <page> also roots (recent XUL specs)
“Boxed layout”:
Basic element is a “box”, contains nested boxes
Size of “box” dependent on size of parent element
Layout dependent on axis (“orientation”)
and direction (“dir”)
08/01/05 / Page 15
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Horizontal orientation
Standard
Sub-elements aligned horizontally after each other
Complete width: Sum of widths of sub-elements
Height: Maximum height of sub-elements
<box orientation="horizontal">
or in short:
<hbox>
08/01/05 / Page 16
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Vertical orientation
Sub-elements aligned vertically after each other (“stacked”)
Width: Maximum width of sub-elements
Complete height: Sum of heights of sub-elements
<box orientation="vertical">
or in short:
<vbox>
08/01/05 / Page 17
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Direction
dir=”ltr” (standard)
For hbox: left-to-right
For vbox: top-to-bottom
dir=”rtl”
For hbox: right-to-left
For vbox: bottom-to-top
08/01/05 / Page 18
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Position of child-elements (along primary axis)
pack=”start” (position at beginning of parent)
pack=”center” (position in middle of parent)
pack=”end” (position at end of parent)
Alignment (along transverse axis; cross-ways to pack)
align=”stretch” (Sub-elements stretched parent width/height)
align=”start”
align=”center”
align=”end”:
08/01/05 / Page 19
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
orientation
dir
pack
align
Standard-attributes of a XUL-layout (“boxed layout”)
08/01/05 / Page 20
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Attribute “flex”:
Distribution of additional size for sub-elements
Sub-elements with flex>0 are enlarged to fit parent
If multiple sub-elements flex>0 exist,
additional size distributed relative to flex-value
Works where align=”stretch” or no align set
flex=0 flex=1 flex=2
08/01/05 / Page 21
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Size of sub-elements can be set equal
equalsize=”always”
equalsize=”never” (Standard)
Only affects sub-elements with flex>0
08/01/05 / Page 22
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Attributes “height” and “width”
Allow giving absolute height/width
Might be overridden in case “flex” is used
Restrictions possible, that even “flex” obeys
minwidth, maxwidth
minheight, maxheight
08/01/05 / Page 23
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Root-element for XUL-document needed
Simplest root-element is an application-window
Allowed attributes:
title (window-title)
Only for top-windows (not in browser):
width
height
screenx, screeny (position on screen)
sizemode (can be “normal”, “minimized” or “maximized”)
08/01/05 / Page 24
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
<?xml version="1.0"?>
<window xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
debug="true">
<hbox align="start">
<vbox flex="1">
<box width="150px" height="150px"/>
</vbox>
<vbox flex="2">
<box width="300px" height="300px"/>
</vbox>
<vbox align="end">
<box width="50px" height="100px"/>
<box width="100px" height="100px"/>
</vbox>
</hbox>
</window>
08/01/05 / Page 25
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Layout basics
Boxes not visible by default
Using visual debugging: debug=”true” in <window>
08/01/05 / Page 26
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Opening XUL-window
Open via URL in your browser
Displays in tab like webpage
URL-inputfield shown, Mozilla-menu available
- or -
Open as top window when starting up
Your XUL-window as top-window
Your menu as top-menu
./mozilla -chrome http://www.example.com/myfirst.xul
08/01/05 / Page 27
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Styling with CSS
CSS-usage similar like in HTML
Using external CSS-files (strongly recommended)
<?xml-stylesheet type="text/css" href="data:text/css,
* {border:1px solid black; padding: 1px;}"?>
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="test2.css"?>
<window xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
Embedded using data-URIs
<button label="Button1" style="color:red;"/>
Inside element-tags
08/01/05 / Page 28
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Styling with CSS
Previous example with CSS-borders
08/01/05 / Page 29
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
data-URIs
Normally URIs point to a resource/file
RFC2397 defines scheme “data:”
data:[<mediatype>][;base64],<data>
Mozilla supports data-URIs, e.g. in href=”...”
Try in browser's location-bar:
data:application/vnd.mozilla.xul+xml,<button xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
label="Click me"/>
08/01/05 / Page 30
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
HTML inside XUL?
Not recommended ... but possible :-)
Using XHTML-namespace explicitly
Use well-formed XHTML
(lowercase tags, remember to close tags, ...)
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/"
type="text/css"?>
<!DOCTYPE window>
<window xmlns:html="http://www.w3.org/1999/xhtml"
xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<button label="XUL-button"/>
<html:input type="button" value="HTML-button"/>
</window>
08/01/05 / Page 31
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Output of text
Multiline-text:
Singleline-text:
<description>some ... text</description>
<description value=”some ... text” />
08/01/05 / Page 32
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Output of text
Used as “name-tag” for other elements (buttons, input, ...)
Not enough space for text?
Attribute “crop” allows using a crop-”ellipse”
“none” reserves needed width for label; does not crop
“start” crops at start of label (e.g. “...zilla”)
“center” crops label in the middle (e.g. “Mo...la”)
“end” crops at end of label (e.g. “Mozil...”)
<label>some ... text</label>
08/01/05 / Page 33
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Images
XUL supports web-formats JPEG, GIF, PNG
Syntax similar to HTML <img> element:
<image src="foo.png" />
<image id="foo" />
#foo {
list-style-image: url("myImage.png");
}
Or use CSS, property pointing to a resource-URL
(e.g. chrome)
08/01/05 / Page 34
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Text-inputs
XUL: <textbox> similar to
HTML: <input type=”text” ...> or <textarea>
<label control="username" value="Username:"/>
<textbox id="username"/>
<label control="password" value="Password:"/>
<textbox id="password" type="password" maxlength="20"/>
<textbox value="Please enter your comment." multiline="true"/>
08/01/05 / Page 35
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Text-inputs
Attributes:
cols, rows, maxlength (chars allowed to enter),
size (chars that can be entered)
multiline, wrap (can be “off”, usually on), readonly, disabled
type: autocomplete, password, timed (typing-timeout-event)
timeout (timeout for type “timed”)
onchange (when changing focus away),
oninput (immediately during char-input)
type=”timed”
Command event fired after char-input and timeout expired
08/01/05 / Page 36
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Focusing / Shortcuts
Usually: Using TAB-key moves focus to next displayed element
Focus moves from last to first element: called “focus ring”
Possible to define different navigation order:
<button label="Button1" tabindex="4"/>
<button label="Button2" tabindex="2"/>
<button label="Button3" tabindex="1"/>
<button label="Button4" tabindex="3"/>
Normal order: 1 2 3 4
With tabindex: 4 2 1 3
08/01/05 / Page 37
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Focusing / Shortcuts
“accesskeys” for selecting a label
Usually either underlined by browser or printed after label
Allows selection of label by ALT+<accesskey> (Win + Linux)
“control” gives focus from label to another element
<label accesskey="A" control=”otherElement”>
Accesskey-test
</label>
08/01/05 / Page 38
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Scripting
Mozilla-products use extended version of JavaScript
Experimental binding for languages like Python exist
but not of “real importance” yet
XUL-documents reflected using a DOM-tree
(Document Object Model)
Additionally internal interfaces available,
depending on rights granted to a script
Scripts possible using event-tags of a XUL-element
or “script”-elements
08/01/05 / Page 39
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Scripting
“type”-attribute optional, but highly recommended
<script type="application/x-javascript">
<![CDATA[
function ShowAlert(text)
{
window.alert(text);
}
]]>
</script>
<script src="toolbox.js" type="application/x-javascript"/>
<script src="chrome://examples/toolbox.js"/>
<script src="http://www.example.com/toolbox.js"/>
Using external scripts
Using “embedded” scripts (enclosed in CDATA-block)
08/01/05 / Page 40
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Scripting
Use id=”...” to identify elements in DOM
(for getElementById() - explained later)
Events similar to HTML
General: onclick, onmouseover, onkeypress
For “window”: onload, onunload, onclose
For “button”: oncommand
<?xml version="1.0"?>
<window xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
title="event basics" id="mainwindow"
onload="alert('Loaded')"
onunload="alert('Unloaded')" />
08/01/05 / Page 41
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Buttons
Clickable XUL-element using “button”
Element and all sub-elements are one clickable button
Allows flexible definition of button-content
All known attributes like “orientation” or “dir” supported
Usually “label” used to define text on a button
Possible to use tag “image” for graphics
Attributes “label” and “image” to element “button”
automatically create sub-elements inside the button
08/01/05 / Page 42
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Buttons
<?xml version="1.0"?>
<window xmlns=
"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript">
<![CDATA[
function ShowAlert(text)
{
window.alert(text);
}
]]>
</script>
<hbox>
<label value="Label1" accesskey="L" control="myButton" />
<button id="myButton" label="Button1" accesskey="B"
oncommand="ShowAlert(this.nodeName)" />
</hbox>
</window>
08/01/05 / Page 43
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Buttons
Sub-elements inside a “button”-element
<button id="myButton" accesskey="B"
oncommand="oncommand(this.nodeName)">
<label value="LabelB1" />
<label value="LabelB2" />
</button>
In HTML “onclick” or “onkeypress” would be used
For button “oncommand” available as well and
will also be triggered using accesskey of label or button
08/01/05 / Page 44
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Buttons
Special button: image with label
image above, below, left or right of label
dir=”normal” Image is left or above label
dir=”reverse” Image is right or below label
orient=”horizontal” or orient=”vertical”
<button label="Bookmarks" image="http://www.example.com/foo.png"
dir="reverse" orient="horizontal"/>
08/01/05 / Page 45
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Additional element-attributes
checked=”true”
Inverts initial state; element is selected, checked, active
disabled=”true”
Element is not available for user-interaction (grayed out)
hidden=”true”
Element not displayed / included in layout
Equivalent to “display: none” in CSS
collapsed=”true”
Element not displayed, but included in layout
Equivalent to “visibility: collapse” in CSS
08/01/05 / Page 46
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Checkboxes
<checkbox id="closeWindow"
label="Close this window when download is complete"
checked="true" />
Similar to checkboxes in HTML
Use XUL-widgets instead of HTML where possible
08/01/05 / Page 47
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Radiogroups
<script>
function updateState() {
var name = document.getElementById("name");
var sindex = document.getElementById("group").selectedIndex;
if (sindex == 0) name.disabled = true;
else name.disabled = false; }
</script>
<radiogroup id="group" onselect="updateState();">
<radio label="Random name" selected="true"/>
<hbox>
<radio label="Specify a name:"/>
<textbox id="name" value="Jim" disabled="true"/>
</hbox>
</radiogroup>
One item selectable at a time
Here used with a small script
08/01/05 / Page 48
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Groupboxes
<groupbox>
<caption label="The Foo Bar Brothers"/>
<description value="Hi, this is Foo"/>
<description value="Hi, this is Bar"/>
</groupbox>
Group elements
<groupbox>
<caption>
<checkbox label="Subscribe me"/>
</caption>
<hbox>
<label control="email" value="Email:"/>
<textbox id="email"/>
</hbox>
</groupbox>
Also “complex” captions allowed
08/01/05 / Page 49
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Grids
Similar to HTML-table; but no output – just tabular layout
Rows or columns can be defined
<grid flex="1">
<columns>
<column flex="3"/>
<column flex="1"/>
</columns>
<rows>
<row>
<button label="OSCON"/>
<button label="Tutorial"/>
</row>
<row>
<button label="Mozilla"/>
<button label="XUL"/>
</row>
</rows>
</grid>
08/01/05 / Page 50
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Splitters
Splits a window/box
Allows resizing of sections
Horizontal or vertical,
depending on parent box
Can be collapsed using “grippy” (optional)
<description value="FooFooFoo" crop="end"/>
<splitter id="splittername" state="open" collapse="before"
resizebefore="closest" resizeafter="closest">
<grippy/>
</splitter>
<description value="BarBarBar" crop="end"/>
08/01/05 / Page 51
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Splitters
Attributes:
state “open” (default) or “collapsed”
Initial state
collapse “before”, “after”, “none”
Side of panel that should collapse when grippy is clicked
resizebefore “closest” (default), “farthest”
Element to resize before splitter
(farthest = element farthest away from splitter)
resizeafter “closest” (default), “farthest”
Element to resize after splitter
08/01/05 / Page 52
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Tabs
Displaying set of “subpages” in one window
Surrounded by a “tabbox”
“tab”: refers to clickable name-tag of a “subpage”
“tabpanel”: holds the “subpage”-content
<tabbox>
<tabs>
[... tab-elements go here ...]
</tabs>
<tabpanels>
[... tabpanel-elements go here ...]
</tabpanels>
</tabbox>
08/01/05 / Page 53
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Tabs
Easy example:
<tabbox flex="1">
<tabs>
<tab id="tab1" label="Foo" selected="true"/>
<tab id="tab2" label="Bar"/>
</tabs>
<tabpanels>
<tabpanel id="tab1Panel" orient="vertical" >
<description value="I like this foo."/>
</tabpanel>
<tabpanel id="tab2Panel" orient="vertical">
<description value="Let's meet at the bar!"/>
</tabpanel>
</tabpanels>
</tabbox>
08/01/05 / Page 54
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Decks
All children displayed at same position
Only one child displayed at a time
Displayed deck selectable via DOM (selectedIndex)
<deck id="myDeck" selectedIndex="1">
<description value="First"/>
<description value="Second"/>
</deck>
<button label="Switch to first"
oncommand="document.getElementById('myDeck').selectedIndex = 0;"/>
08/01/05 / Page 55
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Stacks
Places child-elements on top of each other, back to front
Useful when selectively showing elements
or stacking elements for layout reasons
<stack>
<description value="striked"/>
<description value="-------"
style="color:red; font-weight:bold"/>
</stack>
<stack>
<description value="shadow"
style="padding-left:3px; padding-top:3px;"/>
<description value="shadow"
style="color:red;"/>
</stack>
08/01/05 / Page 56
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Tooltips / Popups
tooltiptext=”...”
Text to display when hovering an element
tooltip=”...”
Takes id of popup to display as tooltip
Popups allow more complex information than text-tooltips
<popup id="helpPopup">
<description value="some text"/>
</popup>
[...]
<button id="myButton" label="myButton" tooltip="helpPopup"/>
08/01/05 / Page 57
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Tooltips / Popups
Popups usually collected in a “popupset”
Can be used to offer context-menues
Position of popups can be given with “position”-tag
position=“before_start” display before element, start-aligned
Positions available:
at_pointer, after_pointer, after_start, after_end,
before_start, before_end, end_after, end_before,
start_after, start_before, overlap (would be start_start)
08/01/05 / Page 58
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Tooltips / Popups
<popupset>
<popup id="contextPopup" position="before_start">
<description value="some text"/>
</popup>
</popupset>
[...]
<button id="myButton" label="myButton" context="contextPopup"/>
08/01/05 / Page 59
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Advanced buttons
Special buttons selectable with attribute “type”
type=”checkbox”
button pushed down on first click, released on second
type=”radio”
from group of buttons only one button active at a time
(attribute “group” identifies group of buttons)
<hbox>
<button type="radio" label="me" group="whom" />
<button type="radio" label="you" group="whom" />
<button type="radio" label="everybody" group="whom" />
</hbox>
08/01/05 / Page 60
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Advanced buttons
Special buttons selectable with attribute “type”
type=”menu” or type=”menu-button”
special marker indicates button will open a menu
“menu”: Menu opened upon button activation
“menu-button”: User must click marker besides button
<hbox>
<button type="menu" label="menu"/>
<button type="menu-button" label="menubutton"/>
</hbox>
08/01/05 / Page 61
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
Toolbars / menus:
Simplified: boxes containing buttons
May have “popups” as submenues
Element “menu” (button, opens a menupopup), contains:
“menupopup”
Container for menucontents
“menuitem”
similar to a “button”
“menuseparator”
08/01/05 / Page 62
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
Attributes allowed in <menu ...> and <menuitem ...>:
accesskey=”...”
oncommand=”...”
disabled=”...”
type=”...” (“radio” or “checkbox”)
checked=”...” (for items of type “radio” or “checkbox”)
class=”...” (anonymous CSS-classes)
(like with buttons - as you might have already guessed)
08/01/05 / Page 63
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
“menupopup”-element:
Attribute “popupanchor”
Anchor of parent-“menu”-element to position relative to
Values: bottomleft (standard), bottomright, topright, and topleft
Attribute “popupalign”
Position of menu relative to anchor
Values: bottomleft, bottomright, topright, and topleft
Good choice for a bottom taskbar might be:
popupanchor=”topleft” popupalign=”bottomleft”
08/01/05 / Page 64
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
Special menu: “menubar”
Only use one “menubar” per window!
(Mac displays menubar in a special way)
For menus in menubar, popupanchor-values except
“bottomleft” ignored because of typical space constraints
08/01/05 / Page 65
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
<menubar>
<menu label="Text" accesskey="T">
<menupopup>
<menu label="Style" accesskey="S">
<menupopup>
<menuitem label="Normal" accesskey="N" type="radio"
name="styleRadio" checked="true"/>
<menuitem label="Bold" accesskey="B" type="radio"
name="styleRadio"/>
</menupopup>
</menu>
<menuseparator/>
<menuitem label="Allow printing" type="checkbox"
checked="true"/>
<menuitem label="Autowrap"/>
</menupopup>
</menu>
</menubar>
08/01/05 / Page 66
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
<menulist>
<menupopup>
<menuitem label="Normal"/>
<menuitem label="Bold"/>
</menupopup>
</menulist>
Toolbars / menus
Special menu: “menulist”
Drop-down list
08/01/05 / Page 67
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
“toolbar” is a special type of box
Toolbars usually inside a “toolbox”-container
Toolbars have “toolbargrippy” besides
Allows to collapse them (give toolbars id=”...” for this to work)
Automatically created
Not supported in Firefox - use Mozilla
2 toolbars collapsed
08/01/05 / Page 68
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Toolbars / menus
<toolbox>
<toolbar id="firstToolbar">
<button label="Button One"/>
<button label="Button Two"/>
</toolbar>
<toolbar id="secondToolbar">
<button label="Button Three"/>
<button label="Button Four"/>
</toolbar>
<toolbar id="thirdToolbar">
<button label="Button Five"/>
<button label="Button Six"/>
</toolbar>
</toolbox>
08/01/05 / Page 69
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Scrolling
Special container “arrowscrollbox”
Allows adding sub-elements than can
be displayed
Shows scrollbuttons and performs scrolling
<arrowscrollbox orient="vertical" flex="1">
<button label="Red"/>
<button label="Blue"/>
<button label="Green"/>
<button label="Yellow"/>
<button label="Orange"/>
<button label="Silver"/>
<button label="Gold"/>
<button label="Black"/>
</arrowscrollbox>
08/01/05 / Page 70
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Lists
List of items
One or more items selectable
Number of items adjustable
Value for each item possible
<listbox>
<listitem label="Red"/>
<listitem label="Green"/>
<listitem label="Blue"/>
<listitem label="White"/>
</listbox>
<listbox rows="2" seltype="multiple">
<listitem label="Red" value="r"/>
<listitem label="Green" value="g"/>
<listitem label="Blue" value="b"/>
<listitem label="White" value="w"/>
</listbox>
08/01/05 / Page 71
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Lists
Lists with multiple columns
Header-row possible
Sort-indicator possible
(does not sort – needs to
be done with scripting)
<listbox rows="3">
<listhead>
<listheader label="Color"
sortDirection="ascending"/>
<listheader label="Vehicle"/>
</listhead>
<listitem>
<listcell label="Green"/>
<listcell label="Boat"/>
</listitem>
<listitem>
<listcell label="Red"/>
<listcell label="Car"/>
</listitem>
</listbox>
08/01/05 / Page 72
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Similar to “listbox” (in a way)
Multiple columns and rows
Column headers
Listbox: any type of content / Tree: only text and images
But offers more advanced features
Nested rows
Expanding / collapsing of rows
...
08/01/05 / Page 73
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Simple tree:
Set of columns (treecol)
Content (treechildren)
Container for rows (treeitem)
Rows / Cells
“Column-picker” to select cols to show
08/01/05 / Page 74
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Attributes for a tree:
“Column-picker” hideable
Usually multiple rows selectable, but single-select possible
Give id=”...” to every column (!!!)
Otherwise showing/hiding columns, selections etc.
might now always work
<tree hidecolumnpicker=”true” />
<tree seltype=”single” />
08/01/05 / Page 75
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
<tree flex="1">
<treecols>
<treecol id="Name" label="Name" flex="1"/>
<treecol id="Email" label="Email" flex="1"/>
</treecols>
<treechildren>
<treeitem>
<treerow>
<treecell label="Zuul"/>
<treecell label="ghost@example.com"/>
</treerow>
</treeitem>
<treeitem> <treerow>
<treecell label="Venkman"/>
<treecell label="buster@example.com"/>
</treerow> </treeitem>
</treechildren>
</tree>
08/01/05 / Page 76
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Hierarchical tree
Multiple levels (0, 1, 2, ...)
Open/close subtrees
Lines connecting rows under same parent
Needed steps:
Make treeitem a “container” to allow open/close
Set primary=”true”-attribute on the first column
(column where open/close and lines will be)
08/01/05 / Page 77
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
<tree flex="1">
<treecols>
<treecol id="Name" label="Name" primary="true" flex="1"/>
<treecol id="Email" label="Email" flex="1"/>
</treecols>
<treechildren>
<treeitem container="true" open="true">
<treerow> <treecell label="Actors"/> </treerow>
<treechildren>
<treeitem> <treerow>
<treecell label="Zuul"/>
<treecell label="zuul@example.com"/>
</treerow> </treeitem>
<treeitem> <treerow>
<treecell label="Venkman"/>
<treecell label="venkman@example.com"/>
</treerow> </treeitem>
</treechildren> </treeitem> </treechildren> </tree>
Trees
08/01/05 / Page 78
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Correct:
Wrong
primary
column:
Container
attribute
not set:
08/01/05 / Page 79
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Hierarchical tree
One treerow + one treechildren per level
Nesting possible
Setting container-attribute important
(containers without children possible)
Attribute open=”true” for container to be initially expanded
08/01/05 / Page 80
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
Advanced features
Reordering of columns:
Adjusting of column-size:
<splitter> between treecols
optionally with class=“tree-splitter” to hide the notch
Again: setting minwidth and maxwidth allowed here
Saving state of columns between sessions: persist = ”...”
width (Column widths), ordinal (position of column),
hidden (Hidden-state of column)
<tree enableColumnDrag="true" />
08/01/05 / Page 81
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
<tree enableColumnDrag="true" flex="1">
<treecols>
<treecol id="Name" label="Name" flex="1" primary="true"
persist="width ordinal hidden"/>
<splitter class="tree-splitter"/>
<treecol id="Email" label="Email" flex="1"
persist="width ordinal hidden"/>
<splitter class="tree-splitter"/>
<treecol id="Job" label="Job" flex="1"
persist="width ordinal hidden"/>
</treecols>
...
08/01/05 / Page 82
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
JavaScript and trees
Selected item for a seltype=”single”-tree
tree-property “currentIndex”
holds index (starting from 0) of current selected element
Selected items for a multi-select-tree
use methods from object at “tree.view.selection”
Number of continous selected ranges: getRangeCount()
Get bounds for range r: getRangeAt(r, start, end)
Indexes start.value to end.value are selected
Checking for certain selection: isSelected(s)
08/01/05 / Page 83
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Trees
JavaScript and trees
Setting selected items
rangeSelect(start, end, bool) bool=add to curr select?
clearRange(start, end)
select(index)
toggleSelect(index)
invertSelection()
selectAll()
08/01/05 / Page 84
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Custom tree views
Built-in content tree view just for few / simple data
Custom view allows:
Large number of rows
Complex data to be shown (e.g. computed)
Create an “empty tree”:
<tree id="squaretree" flex="1">
<treecols>
<treecol id="countcol" label="Count" flex="1"/>
<treecol id="squarecol" label="Square" flex="1"/>
</treecols>
<treechildren/>
</tree>
08/01/05 / Page 85
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Custom tree views
var treeView = {
rowCount : 1000,
getCellText : function(row, column){
if (column == "countcol") return row;
else return row*row;
},
setTree: function(treebox){ this.treebox = treebox; },
isContainer: function(row){ return false; },
isSeparator: function(row){ return false; },
isSorted: function(row){ return false; },
getLevel: function(row){ return 0; },
getImageSrc: function(row,col){ return null; },
getRowProperties: function(row,props){},
getCellProperties: function(row,col,props){},
getColumnProperties: function(colid,col,props){}
};
Create object that implements “nslTreeView”-interface:
08/01/05 / Page 86
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Custom tree views
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="setView();">
<script>
var treeView = { [...] };
function setView()
{
document.getElementById('squaretree').view =
treeView;
}
</script>
<tree id="squaretree" flex="1">
[...]
</tree>
</window>
Creating the window, applying the view:
08/01/05 / Page 87
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Custom tree views
The “nslTreeView”-interface:
Implement in JavaScript-object or using XPCOM-component
Almost 30 methods; For basic view only 10 methods needed
Hierarchical view:
also need to respond to isContainer(row),
isContainerEmpty(row) and isContainerOpen(row)
View must keep track of open-states
Open/close triggers: toggleOpenClose(row)
Methods for hierarchy and linking: getLevel(row),
hasNextSibling(row, afterIndex), getParentIndex(row)
08/01/05 / Page 88
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
RDF (Resource Description Framework)
Format used to store e.g. bookmarks, history, emails
Using existing RDF-sources or RDF stored in XML
(XML is often used for storing – RDF is not by definition in XML)
A set of resources represents e.g. a person
RDF describes relations between resources:
connection of nodes
Nodes are “literals” (actual values)
or “resources” (think of things like objects)
Resources identified by URIs (unique)
08/01/05 / Page 89
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
Name: Keymaster Job: Ghost Gender: male
Name: Gatekeeper Job: Ghost Gender: female
friendOf
actor1
actor2
08/01/05 / Page 90
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
Relationships called “triples” or “arcs”:
actor1 → friendOf → actor2
Parts of a triple called:
subject → predicate → object / target
Subject: always resource; object/target: resource or literal
Subject, predicate and object described using URIs:
http://www.example.com/rdf/actor1
http://www.example.com/rdf/friendOf
http://www.example.com/rdf/actor2
08/01/05 / Page 91
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
Defining a type:
http://www.example.com/rdf/actor1 →
rdf:type → http://www.example.com/rdf/actor
Reference to the RDF-namespace used:
“rdf:type”
here means
“http://www.w3.org/1999/02/22-rdf-syntax-ns#type”
Predicate “type” is defined in the RDF namespace already
08/01/05 / Page 92
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
Lists possible using “rdf:_1”, “rdf:_2”, ...
http://www.example.com/rdf/allActors →
rdf:_1 → http://www.example.com/rdf/actor1
http://www.example.com/rdf/allActors →
rdf:_2 → http://www.example.com/rdf/actor2
List-types: “rdf:Seq” (ordered list), “rdf:Bag” (unordered list),
“rdf:Alt” (list of alternatives)
http://www.example.com/rdf/allActors →
rdf:type → http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq
08/01/05 / Page 93
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
Storing RDF in XML: RDF/XML
RDF-tag as node of XML-document
Declare namespaces
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:actor="http://www.example.com/rdf/actor">
<rdf:Description rdf:about="http://www.example.com/rdf/actor1"
actor:name="Keymaster"
actor:job="ghost"
actor:gender="male"/>
</rdf:RDF>
08/01/05 / Page 94
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
“rdf:Description”: describes a triple
“rdf:about”: specifies the subject of the triple
Giving predicates, here from namespace “actor”
Assigning target values
Also possible to give separate triples for one subject:
<rdf:Description rdf:about="http://www.example.com/rdf/actor1"
actor:name="Keymaster"/>
<rdf:Description rdf:about="http://www.example.com/rdf/actor1"
actor:job="ghost"/>
<rdf:Description rdf:about="http://www.example.com/rdf/actor1"
actor:gender="male"/>
08/01/05 / Page 95
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
<rdf:Description rdf:about="http://www.example.com/rdf/actor1">
<actor:name="Keymaster"/>
<actor:job="ghost"/>
<actor:gender="male"/>
</rdf>
Or use tags to specify predicates:
<rdf:Description rdf:about="http://www.example.com/rdf/actor1"
actor:name="Keymaster"
actor:job="ghost">
<actor:gender="male"/>
</rdf>
Or even mix:
08/01/05 / Page 96
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
<rdf:Description rdf:about="http://www.example.com/rdf/actor1">
actor:name="Keymaster">
<actor:friendOf rdf:resource=http://www.example.com/rdf/actor2"/>
</rdf>
Resource-to-resource triples:
<rdf:Description rdf:about="http://www.example.com/rdf/actor1">
actor:name="Keymaster">
<actor:friendOf>
<rdf:Description
rdf:about="http://www.example.com/rdf/actor2"
actor:name="Gatekeeper"/>
</actor:friendOf>
</rdf>
Or nested:
08/01/05 / Page 97
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
RDF
<rdf:Seq rdf:about="http://www.example.com/rdf/allActors">
<rdf:_1 rdf:resource="http://www.example.com/rdf/actor1"/>
<rdf:_2 rdf:resource="http://www.example.com/rdf/actor2"/>
</rdf:Seq>
Lists in RDF/XML:
<rdf:Seq rdf:about="http://www.example.com/rdf/allActors">
<rdf:li rdf:resource="http://www.example.com/rdf/actor1"/>
<rdf:li rdf:resource="http://www.example.com/rdf/actor2"/>
</rdf:Seq>
Or using automatic numbering of items:
Note for using an RDF APIs:
Reading document translates rdf:li-tags to item-numbers
08/01/05 / Page 98
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Templates
To create elements from datasources
Internal datasource: bookmarks, history, mails
In-memory datasource: Object of nslRDFDataSource
RDF/XML-file
Use: <template> ... </template>
Place <template> in a container for all elements, e.g. a tree
Elements in template repeated for each constructed element
Repeat will start where: uri="rdf:*"
08/01/05 / Page 99
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Templates
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:actor="http://www.example.com/rdf/actor#">
<rdf:Seq rdf:about="http://www.example.com/rdf/allActors">
<rdf:li>
<rdf:Description rdf:about="http://www.example.com/rdf/actor1"
actor:name="Keymaster"
actor:job="ghost"
actor:gender="male"/>
</rdf:li>
<rdf:li>
<rdf:Description rdf:about="http://www.example.com/rdf/actor2"
actor:name="Gatekeeper"
actor:job="ghost"
actor:gender="female"/>
</rdf:li>
</rdf:Seq>
</rdf:RDF> actors.rdf
08/01/05 / Page 100
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Templates
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window xmlns=
”http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<tree id="treefromrdf" flex="1" datasources="actors.rdf"
ref="http://www.example.com/rdf/allActors">
<treecols>
<treecol id="Name" label="Name" primary="true" flex="1"/>
</treecols>
<template>
<treechildren flex="1">
<treeitem uri="rdf:*">
<treerow>
<treecell label="rdf:http://www.example.com/rdf/actor#name"/>
</treerow>
</treeitem>
</treechildren>
</template>
</tree> </window> actors.xul
08/01/05 / Page 101
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Content areas
Displaying HTML or other XUL-files,
embedded as one element into a XUL-window
Simple element: <iframe>
Supports basic features and is “lightweight”
<iframe id="content" src="http://www.mozilla.org" flex="1"/>
Advanced element: <browser>
Similar to <iframe> - but features page history, referers etc.
<browser id="content" src="http://www.mozilla.org" flex="1"/>
Browser with tab-support: <tabbrowser>
Widget that the Mozilla browser uses
<tabbrowser id="content" src="http://www.mozilla.org" flex="1"/>
08/01/05 / Page 102
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Content areas
Types of <browser>-elements
type=”...” NOT set
Browser-content part of current window
XUL-code in loaded content has access to the whole window
type=”content”
Browser-content restricted to it's window
type=”content-primary”
With multiple browsers one is primary
Primary content accessible using “window.content”
<tabbrowser> automatically sets “content” / “content-primary”
“content-primary” is currently selected tab
08/01/05 / Page 103
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
DOM-events
Examples: moving mouse or pressing a key
XUL-elements can trigger certain events
Event transfered as object
Event traverses
element-hierarchy
Note: Some events have
no “bubbling phase”
Clickingbutton
triggersevent
Traversingdown
(“capturingphase”)
Traversingup
(“bubblingphase”)
Window
Document
Box
08/01/05 / Page 104
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Possible to attach listeners at each propagating step
Allows handling events for all sub-elements
Possible to prevent event from propagating further
Listening using element-attributes (e.g. command=”...”)
Easy to use, but only receives bubbling events
Listening to events using addEventListener-method
Possible to listen at any phase
Multiple listeners per event/element
08/01/05 / Page 105
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Event received during bubbling, for all sub-elements
Event-object-property “target”: where event occurred
<vbox oncommand="alert(event.target.tagName);">
<button label="OK"/>
<checkbox label="Show images"/>
</vbox>
Listening in “capturing phase”, using DOM event handler
<button id="okbutton" label="OK"/>
<script>
function buttonPressed(event)
{ alert('Button was pressed!'); }
var button = document.getElementById("okbutton");
button.addEventListener('command', buttonPressed, true);
</script>
Listen in
“capturing phase”?
08/01/05 / Page 106
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Event-object contains (extract):
Constants:
CAPTURING_PHASE, BUBBLING_PHASE
Properties:
eventPhase Current phase of flow
boolean bubbles Can this event bubble?
currentTarget EventTarget who's EventListener
is being processed
target Original EventTarget for event
08/01/05 / Page 107
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Event-object contains (extract):
Methods:
stopPropagation()
Propagation stops on current EventTarget
<hbox oncommand="alert('Box');">
<button label="Button1" oncommand="alert('Button1');"/>
<button label="Button2" oncommand="alert('Button2');"/>
</hbox>
Clicking button1 results in: alert('Button1'); alert('Box');
Propagation not stopped
Processing in bubbling-phase (bottom-up)
08/01/05 / Page 108
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Mouse-events:
click, dblclick, mousedown, mouseup
mouseover, mouseout
mousemove
<script>
function mouseCoords(event)
{
var coordLabel = document.getElementById("coords");
coordLabel.value = event.clientX + ", " + event.clientY;
}
</script>
<box width="100" height="100" onmousemove="mouseCoords(event);"/>
<label id="coords"/>
08/01/05 / Page 109
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Keyboard-shortcuts:
Using accesskey=”...”, as already mentioned
Keyboard-events:
keypress, keydown, keyup
Defining shortcuts for a window
<keyset>
<key id="test-key" modifiers="control,shift" key="T"
oncommand="alert('Test-key pressed');"/>
</keyset>
08/01/05 / Page 110
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Event handling
Keyboard-shortcuts:
Modifiers:
shift, control, alt, control, accel (Win: “control”, Unix: “alt”),
meta (Mac: “command key”; not on all platforms)
Adjusting keys: http://www.mozilla.org/unix/customizing.html
Using defined key-IDs
<keyset>
<key id="cut_cmd" modifiers="accel" key="X"/>
</keyset>
[...]
<menuitem label="Cut" accesskey="t" key="cut_cmd"/>
08/01/05 / Page 111
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Commands
Aim: Separate application tasks and user interface
Design goal: Strict separation, plan functionality before start
Central (or even external) definition of commands
Defined commands can be disabled or otherwise modified
<command id="cmd_greeting" oncommand="alert('Hello user!');"/>
<button label="Greeting" command="cmd_greeting"/>
Events and commands are different (though they interoperate)
Here: Button generates DOM 2 event of type “command”
08/01/05 / Page 112
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XUL with PHP?
Sending the correct mime-header for XUL:
Generating RDF-sources (XML-data) using PHP
RDF-output-drivers for some PEAR-packages in the works
(more hopefully at PHP Conference Frankfurt 2005)
PEAR-package to help create XUL-code:
http://pear.php.net/package/XML_XUL
(Package and examples by Stephan Schmidt)
<?php
header( "Content-type: application/vnd.mozilla.xul+xml" );
?>
08/01/05 / Page 113
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XUL with PHP?
<?php
require_once 'XML/XUL.php';
$doc = &XML_XUL::createDocument( );
$doc->addStylesheet('chrome://global/skin/');
$win = &$doc->createElement('Window', array('title'=> 'Example for
PEAR::XML_XUL'));
$doc->addRoot($win);
$gbox = &$doc->createElement('Groupbox',
array('orient'=>'horizontal', 'height' => 500));
$win->appendChild($gbox);
$gbox->setCaption('The World of Super-Heroes');
08/01/05 / Page 114
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XUL with PHP?
$tree = &$doc->createElement( 'Tree', array( 'flex' => 1 ) );
$tree->setColumns( 3,
array(
'id' => 'hero',
'label' => 'Superhero',
'flex' => 2,
'primary' => 'true'
),
array(
'id' => 'name',
'label' => 'Name',
'flex' => 1
),
array(
'id' => 'surname',
'label' => 'Surname',
'flex' => 1
)
);
08/01/05 / Page 115
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
XUL with PHP?
$tree->addItem(array( 'Green Arrow', 'Oliver', 'Queen' ));
$jla = &$tree->addItem(array( 'JLA' ));
$jla->addItem(array( 'The Flash', 'Wally', 'West' ));
$jla->addItem(array( 'Superman', 'Clark', 'Kent' ));
$reserves = &$jla->addItem(array( 'Reserves' ));
$reserves->addItem(array( 'Nightwing', 'Dick', 'Grayson' ));
$gbox->appendChild( $tree );
/* ... shortened ... */
$doc->send();
}
?>
08/01/05 / Page 116
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Submitting a form
Including form using HTML-namespace works
(but nobody would do that!)
Sending “form” using XUL with XML-RPC or SOAP
(requires elevated rights; see articles in resources-list)
Simple request:
// create object
req = new XMLHttpRequest();
req.open('GET', 'http://www.example.com/myscript.php', false);
// last param: false=wait for request to finish (synchronous)
req.send(null); // param: used for body of a POST-request
// req.status: http-response-code (200=success)
// req.responseText: text of response
08/01/05 / Page 117
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Submitting a form
Asynchronous request:
req = new XMLHttpRequest();
req.open('GET', 'http://www.example.com/myscript.php', true);
req.onreadystatechange = readyStateChangeHandler;
req.setRequestHeader('User-Agent', 'MyAgent'); // optional
req.send(null);
function readyStateChangeHandler () {
if (req.readyState == 4) { // 4=request completed
if(req.status == 200) {
// response available
} else {
// error during request
}
}
};
08/01/05 / Page 118
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Submitting a form
Performing GET-request with variables:
Combine URL and variables before request
[...]
var txt = "?1";
for(var i in this.parms) {
txt = txt+'&'+this.parms[i].name+'='+this.parms[i].value;
}
//Two options here, only uncomment one of these
//GET REQUEST
httpRequest.open("GET", targetURL+txt, false, null, null);
[...]
(taken from complete example by Harry Fücks, available at:
http://www.phppatterns.com/index.php/article/articleview/82/1/2/ )
Consider using a wrapper-library (e.g. jslib):
http://jslib.mozdev.org/libraries/network/http.html
08/01/05 / Page 119
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Future of XUL
Feature-rich and extensible
Localization and customization
Platform-independent
Increasing number of Mozilla-platform-installations
Large community
Free
XUL-like implementations e.g. for Java
Comparison to XAML (Microsoft) ?
08/01/05 / Page 120
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Resources
XUL Programmer's Reference
http://www.mozilla.org/xpfe/xulref/
Creating Applications with Mozilla (complete O'Reilly book)
http://books.mozdev.org/
Tutorials @ XULPlanet
http://www.xulplanet.com/tutorials/
http://developer.mozilla.org/en/docs/XUL_Tutorial
Rapid Application Development with Mozilla
2003, Prentice Hall, by Aussie Nigel McFarlane
Neil's Place – blog on XUL, by Neil Deakin
http://www.xulplanet.com/ndeakin/
XUL widget cheatsheet
http://www.mozilla.org/docs/xul/xulnotes/xulnote_cheatsheet.html
08/01/05 / Page 121
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Resources
Good overview of widget features and variants
http://www.hevanet.com/acorbin/xul/top.xul
XUL and XML-RPC
http://www.phppatterns.com/index.php/article/view/86/1/2
Mozilla and SOAP
http://www.oreillynet.com/pub/a/javascript/synd/2002/08/30/mozillasoapapi.html
http://docs.mandragor.org/files/Misc/Mozilla_applications_en/mozilla-chp-12-sect-9.html
Mozilla Amazon Browser
http://www.infodraft.com/~faser/mab/
http://www.oreillynet.com/pub/a/mozilla/2003/05/02/casestudy2.html
http://en.wikipedia.org/wiki/XUL
http://en.wikipedia.org/wiki/Comparison_of_user_interface_markup_languages
08/01/05 / Page 122
XUL user-interfaces
Stefan Neufeind
O'Reilly OpenSource Convention
2005, Portland, Oregon
Thank you!
Up-to-date slides available at:
http://talks.speedpartner.de/
Questions?
neufeind (at) speedpartner.de

Contenu connexe

Similaire à XUL - The future of user-interfaces on the web

epicenter2010 Open Xml
epicenter2010   Open Xmlepicenter2010   Open Xml
epicenter2010 Open XmlCraig Murphy
 
Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...
Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...
Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...Stephan Eberle
 
Complete WPF Overview Tutorial with Example - iFour Technolab
Complete WPF Overview Tutorial with Example - iFour TechnolabComplete WPF Overview Tutorial with Example - iFour Technolab
Complete WPF Overview Tutorial with Example - iFour TechnolabiFour Technolab Pvt. Ltd.
 
Net framework
Net frameworkNet framework
Net frameworksumit1503
 
Extending XForms with Server-Side Functionality
Extending XForms with Server-Side FunctionalityExtending XForms with Server-Side Functionality
Extending XForms with Server-Side FunctionalityMarkku Laine
 
Building appsinsilverlight4 part_1
Building appsinsilverlight4 part_1Building appsinsilverlight4 part_1
Building appsinsilverlight4 part_1Dennis Perlot
 
DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...
DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...
DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...Deltares
 
OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...
OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...
OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...olberger
 
Flex and .NET Integration
Flex and .NET IntegrationFlex and .NET Integration
Flex and .NET Integrationicaraion
 
XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)
XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)
XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)Beat Signer
 
XFormsDB: An XForms-Based Framework for Simplifying Web Application Development
XFormsDB: An XForms-Based Framework for Simplifying Web Application DevelopmentXFormsDB: An XForms-Based Framework for Simplifying Web Application Development
XFormsDB: An XForms-Based Framework for Simplifying Web Application DevelopmentMarkku Laine
 
Apachecon 2011 stanbol_ogrisel
Apachecon 2011 stanbol_ogriselApachecon 2011 stanbol_ogrisel
Apachecon 2011 stanbol_ogriselNuxeo
 
Apache Stanbol 
and the Web of Data - ApacheCon 2011
Apache Stanbol 
and the Web of Data - ApacheCon 2011Apache Stanbol 
and the Web of Data - ApacheCon 2011
Apache Stanbol 
and the Web of Data - ApacheCon 2011Nuxeo
 
Open Cloud Computing Interface Presentation
Open Cloud Computing Interface PresentationOpen Cloud Computing Interface Presentation
Open Cloud Computing Interface PresentationIntel Corporation
 
At the Crossroads of HPC and Cloud Computing with Openstack
At the Crossroads of HPC and Cloud Computing with OpenstackAt the Crossroads of HPC and Cloud Computing with Openstack
At the Crossroads of HPC and Cloud Computing with OpenstackRyan Aydelott
 

Similaire à XUL - The future of user-interfaces on the web (20)

epicenter2010 Open Xml
epicenter2010   Open Xmlepicenter2010   Open Xml
epicenter2010 Open Xml
 
Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...
Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...
Sphinx: An Industrial Strength Tool Platform Fostering Model-driven Developme...
 
Complete WPF Overview Tutorial with Example - iFour Technolab
Complete WPF Overview Tutorial with Example - iFour TechnolabComplete WPF Overview Tutorial with Example - iFour Technolab
Complete WPF Overview Tutorial with Example - iFour Technolab
 
PHP and Silverlight
PHP and SilverlightPHP and Silverlight
PHP and Silverlight
 
Net framework
Net frameworkNet framework
Net framework
 
Silverlight Training
Silverlight TrainingSilverlight Training
Silverlight Training
 
Extending XForms with Server-Side Functionality
Extending XForms with Server-Side FunctionalityExtending XForms with Server-Side Functionality
Extending XForms with Server-Side Functionality
 
Building appsinsilverlight4 part_1
Building appsinsilverlight4 part_1Building appsinsilverlight4 part_1
Building appsinsilverlight4 part_1
 
Eye Os(Cloud Opearating System)
Eye Os(Cloud Opearating System)Eye Os(Cloud Opearating System)
Eye Os(Cloud Opearating System)
 
DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...
DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...
DSD-INT 2014 - OpenMI symposium - OpenMI and other model coupling standards, ...
 
OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...
OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...
OSLC (Open Services for Lifecycle Collaboration): open standard for interoper...
 
PHPExcel and OPENXML4J
PHPExcel and OPENXML4JPHPExcel and OPENXML4J
PHPExcel and OPENXML4J
 
Flex and .NET Integration
Flex and .NET IntegrationFlex and .NET Integration
Flex and .NET Integration
 
XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)
XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)
XML and XML Applications - Lecture 04 - Web Information Systems (WE-DINF-11912)
 
XFormsDB: An XForms-Based Framework for Simplifying Web Application Development
XFormsDB: An XForms-Based Framework for Simplifying Web Application DevelopmentXFormsDB: An XForms-Based Framework for Simplifying Web Application Development
XFormsDB: An XForms-Based Framework for Simplifying Web Application Development
 
Apachecon 2011 stanbol_ogrisel
Apachecon 2011 stanbol_ogriselApachecon 2011 stanbol_ogrisel
Apachecon 2011 stanbol_ogrisel
 
Apache Stanbol 
and the Web of Data - ApacheCon 2011
Apache Stanbol 
and the Web of Data - ApacheCon 2011Apache Stanbol 
and the Web of Data - ApacheCon 2011
Apache Stanbol 
and the Web of Data - ApacheCon 2011
 
Xen Overview Q3 2009
Xen Overview Q3 2009Xen Overview Q3 2009
Xen Overview Q3 2009
 
Open Cloud Computing Interface Presentation
Open Cloud Computing Interface PresentationOpen Cloud Computing Interface Presentation
Open Cloud Computing Interface Presentation
 
At the Crossroads of HPC and Cloud Computing with Openstack
At the Crossroads of HPC and Cloud Computing with OpenstackAt the Crossroads of HPC and Cloud Computing with Openstack
At the Crossroads of HPC and Cloud Computing with Openstack
 

Plus de SpeedPartner GmbH

Extbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobierenExtbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobierenSpeedPartner GmbH
 
Professional reports with SVG
Professional reports with SVGProfessional reports with SVG
Professional reports with SVGSpeedPartner GmbH
 
Websockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-ApplikationenWebsockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-ApplikationenSpeedPartner GmbH
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishSpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-Domain.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-DomainSpeedPartner GmbH
 
Leben und Arbeiten in einer Community
Leben und Arbeiten in einer CommunityLeben und Arbeiten in einer Community
Leben und Arbeiten in einer CommunitySpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishSpeedPartner GmbH
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSpeedPartner GmbH
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSpeedPartner GmbH
 
Deploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerationsDeploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerationsSpeedPartner GmbH
 

Plus de SpeedPartner GmbH (20)

Extbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobierenExtbase/Fluid: Kennenlernen und ausprobieren
Extbase/Fluid: Kennenlernen und ausprobieren
 
Professional reports with SVG
Professional reports with SVGProfessional reports with SVG
Professional reports with SVG
 
Secure PHP environment
Secure PHP environmentSecure PHP environment
Secure PHP environment
 
PHP-Applikationen mit PEAR
PHP-Applikationen mit PEARPHP-Applikationen mit PEAR
PHP-Applikationen mit PEAR
 
PHP-Entwicklung mit PEAR
PHP-Entwicklung mit PEARPHP-Entwicklung mit PEAR
PHP-Entwicklung mit PEAR
 
Websockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-ApplikationenWebsockets: Leichtgewichtige Verbindungen für Web-Applikationen
Websockets: Leichtgewichtige Verbindungen für Web-Applikationen
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
News from PEAR
News from PEARNews from PEAR
News from PEAR
 
PEAR - An introduction
PEAR - An introductionPEAR - An introduction
PEAR - An introduction
 
Suchmaschinen-Optimierung
Suchmaschinen-OptimierungSuchmaschinen-Optimierung
Suchmaschinen-Optimierung
 
.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-Domain.EU – eine neue Top-Level-Domain
.EU – eine neue Top-Level-Domain
 
Leben und Arbeiten in einer Community
Leben und Arbeiten in einer CommunityLeben und Arbeiten in einer Community
Leben und Arbeiten in einer Community
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
Web-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnishWeb-Performance-Optimierung mit varnish
Web-Performance-Optimierung mit varnish
 
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeasSystem-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
System-Management-Trio: Zentrale Verwaltung mit facter, puppet und augeas
 
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen EinsatzSicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
Sicherer Wegweiser im Internet: DNSSEC im praktischen Einsatz
 
Deploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerationsDeploying IPv6 - planning, common pitfalls and security-considerations
Deploying IPv6 - planning, common pitfalls and security-considerations
 

Dernier

Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 

Dernier (20)

Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 

XUL - The future of user-interfaces on the web

  • 1. 08/01/05 / Page 1 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XUL The future of user-interfaces on the web
  • 2. 08/01/05 / Page 2 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon About me Stefan Neufeind From Neuss (near Düsseldorf, Germany) Working for SpeedPartner GmbH in consulting, development and administration
  • 3. 08/01/05 / Page 3 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Agenda Background / history Basics Simple widgets / elements Scripting Trees, RDF, templates Events XUL with PHP Resources
  • 4. 08/01/05 / Page 4 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Skills needed Basic knowledge about: HTML / XML CSS JavaScript DOM Easy to start with, but still quite much to learn
  • 5. 08/01/05 / Page 5 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Tools needed Mozilla-based browser as runtime Some texteditor :-) for more than easy examples: Javascript-console Javascript-debugger (“Venkman”) Component-viewer DOM-inspector Docs and references
  • 6. 08/01/05 / Page 6 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Mozilla's way 1998: Netscape opened source-code to public Code hard to maintain Multi-platform-basis incomplete for license reasons Mozilla-project reinvented almost complete backend Layout-engine Gecko XPFE (cross-platform frontend) Targeted at applications, not websites Based on XUL (XML user-interface language)
  • 7. 08/01/05 / Page 7 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Mozilla, XUL and ... Ghostbusters? XUL: reference to the film Ghostbusters ghost of an ancient Sumerian deity called Zuul (pronounce to rhyme with “cool”) possesses the character Dana Barrett and declares "There is no Dana, only Zuul" XUL usually to define interface, not a document, so developers adopted slogan "There is no data, only XUL"
  • 8. 08/01/05 / Page 8 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Mozilla, XUL and ... Ghostbusters? XML-namespace-URI: http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul View with XUL-capable application: "Keymaster" and "Gatekeeper" also references to same plotline More references to Ghostbusters within Mozilla: e.g. JavaScript debugger “Venkman” is one of main characters [thanks to Wikipedia]
  • 9. 08/01/05 / Page 9 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Big picture XPFE: cross-platform frontend eXtensible Binding Language (XBL) to create reusable widgets with XUL/JavaScript. Chrome provides user interface parts of application XPCOM/XPConnect allow JavaScript (and other scripting languages) to access/utilize C and C++ libraries Cross-Platform Install (XPInstall) to package applications for installing on any platform
  • 10. 08/01/05 / Page 10 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Big picture XML-based User-interface Language (XUL) to create the structure and content of application XUL Templates to create framework for importing data with RDF/XUL Resource Description Framework (RDF) to store data and transmit information Document Type Definition (DTD) used for localization and internationalization
  • 11. 08/01/05 / Page 11 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon What is XUL? Markup-language Objects as XML-structures Elements in a DOM-tree Modification of element- attributes possible at runtime Styling using CSS C++-APIs accessible using XPCOM
  • 12. 08/01/05 / Page 12 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XML basics Start with XML-header Case-sensitive (window != Window) Close all tags! “Empty” tags allowed in some cases; closed immediately <label value=”Hello” /> Well-formed, unknown tags/attributes ignored Allows usage of additional features Include namespaces! Multiple namespaces supported in one document
  • 13. 08/01/05 / Page 13 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XUL file structure Well structured XUL-file contains: XML-version Reference to style-sheets DOCTYPE (omitted in some cases) Namespace-declarations in root-tag (HTML-namespace optional) <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <!DOCTYPE window> <window xmlns:html="http://www.w3.org/1999/xhtml" xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
  • 14. 08/01/05 / Page 14 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics For XPFE application root of document: <window> <dialog> and <page> also roots (recent XUL specs) “Boxed layout”: Basic element is a “box”, contains nested boxes Size of “box” dependent on size of parent element Layout dependent on axis (“orientation”) and direction (“dir”)
  • 15. 08/01/05 / Page 15 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Horizontal orientation Standard Sub-elements aligned horizontally after each other Complete width: Sum of widths of sub-elements Height: Maximum height of sub-elements <box orientation="horizontal"> or in short: <hbox>
  • 16. 08/01/05 / Page 16 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Vertical orientation Sub-elements aligned vertically after each other (“stacked”) Width: Maximum width of sub-elements Complete height: Sum of heights of sub-elements <box orientation="vertical"> or in short: <vbox>
  • 17. 08/01/05 / Page 17 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Direction dir=”ltr” (standard) For hbox: left-to-right For vbox: top-to-bottom dir=”rtl” For hbox: right-to-left For vbox: bottom-to-top
  • 18. 08/01/05 / Page 18 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Position of child-elements (along primary axis) pack=”start” (position at beginning of parent) pack=”center” (position in middle of parent) pack=”end” (position at end of parent) Alignment (along transverse axis; cross-ways to pack) align=”stretch” (Sub-elements stretched parent width/height) align=”start” align=”center” align=”end”:
  • 19. 08/01/05 / Page 19 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics orientation dir pack align Standard-attributes of a XUL-layout (“boxed layout”)
  • 20. 08/01/05 / Page 20 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Attribute “flex”: Distribution of additional size for sub-elements Sub-elements with flex>0 are enlarged to fit parent If multiple sub-elements flex>0 exist, additional size distributed relative to flex-value Works where align=”stretch” or no align set flex=0 flex=1 flex=2
  • 21. 08/01/05 / Page 21 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Size of sub-elements can be set equal equalsize=”always” equalsize=”never” (Standard) Only affects sub-elements with flex>0
  • 22. 08/01/05 / Page 22 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Attributes “height” and “width” Allow giving absolute height/width Might be overridden in case “flex” is used Restrictions possible, that even “flex” obeys minwidth, maxwidth minheight, maxheight
  • 23. 08/01/05 / Page 23 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Root-element for XUL-document needed Simplest root-element is an application-window Allowed attributes: title (window-title) Only for top-windows (not in browser): width height screenx, screeny (position on screen) sizemode (can be “normal”, “minimized” or “maximized”)
  • 24. 08/01/05 / Page 24 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics <?xml version="1.0"?> <window xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" debug="true"> <hbox align="start"> <vbox flex="1"> <box width="150px" height="150px"/> </vbox> <vbox flex="2"> <box width="300px" height="300px"/> </vbox> <vbox align="end"> <box width="50px" height="100px"/> <box width="100px" height="100px"/> </vbox> </hbox> </window>
  • 25. 08/01/05 / Page 25 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Layout basics Boxes not visible by default Using visual debugging: debug=”true” in <window>
  • 26. 08/01/05 / Page 26 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Opening XUL-window Open via URL in your browser Displays in tab like webpage URL-inputfield shown, Mozilla-menu available - or - Open as top window when starting up Your XUL-window as top-window Your menu as top-menu ./mozilla -chrome http://www.example.com/myfirst.xul
  • 27. 08/01/05 / Page 27 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Styling with CSS CSS-usage similar like in HTML Using external CSS-files (strongly recommended) <?xml-stylesheet type="text/css" href="data:text/css, * {border:1px solid black; padding: 1px;}"?> <?xml version="1.0"?> <?xml-stylesheet type="text/css" href="test2.css"?> <window xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/> Embedded using data-URIs <button label="Button1" style="color:red;"/> Inside element-tags
  • 28. 08/01/05 / Page 28 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Styling with CSS Previous example with CSS-borders
  • 29. 08/01/05 / Page 29 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon data-URIs Normally URIs point to a resource/file RFC2397 defines scheme “data:” data:[<mediatype>][;base64],<data> Mozilla supports data-URIs, e.g. in href=”...” Try in browser's location-bar: data:application/vnd.mozilla.xul+xml,<button xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" label="Click me"/>
  • 30. 08/01/05 / Page 30 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon HTML inside XUL? Not recommended ... but possible :-) Using XHTML-namespace explicitly Use well-formed XHTML (lowercase tags, remember to close tags, ...) <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <!DOCTYPE window> <window xmlns:html="http://www.w3.org/1999/xhtml" xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <button label="XUL-button"/> <html:input type="button" value="HTML-button"/> </window>
  • 31. 08/01/05 / Page 31 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Output of text Multiline-text: Singleline-text: <description>some ... text</description> <description value=”some ... text” />
  • 32. 08/01/05 / Page 32 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Output of text Used as “name-tag” for other elements (buttons, input, ...) Not enough space for text? Attribute “crop” allows using a crop-”ellipse” “none” reserves needed width for label; does not crop “start” crops at start of label (e.g. “...zilla”) “center” crops label in the middle (e.g. “Mo...la”) “end” crops at end of label (e.g. “Mozil...”) <label>some ... text</label>
  • 33. 08/01/05 / Page 33 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Images XUL supports web-formats JPEG, GIF, PNG Syntax similar to HTML <img> element: <image src="foo.png" /> <image id="foo" /> #foo { list-style-image: url("myImage.png"); } Or use CSS, property pointing to a resource-URL (e.g. chrome)
  • 34. 08/01/05 / Page 34 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Text-inputs XUL: <textbox> similar to HTML: <input type=”text” ...> or <textarea> <label control="username" value="Username:"/> <textbox id="username"/> <label control="password" value="Password:"/> <textbox id="password" type="password" maxlength="20"/> <textbox value="Please enter your comment." multiline="true"/>
  • 35. 08/01/05 / Page 35 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Text-inputs Attributes: cols, rows, maxlength (chars allowed to enter), size (chars that can be entered) multiline, wrap (can be “off”, usually on), readonly, disabled type: autocomplete, password, timed (typing-timeout-event) timeout (timeout for type “timed”) onchange (when changing focus away), oninput (immediately during char-input) type=”timed” Command event fired after char-input and timeout expired
  • 36. 08/01/05 / Page 36 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Focusing / Shortcuts Usually: Using TAB-key moves focus to next displayed element Focus moves from last to first element: called “focus ring” Possible to define different navigation order: <button label="Button1" tabindex="4"/> <button label="Button2" tabindex="2"/> <button label="Button3" tabindex="1"/> <button label="Button4" tabindex="3"/> Normal order: 1 2 3 4 With tabindex: 4 2 1 3
  • 37. 08/01/05 / Page 37 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Focusing / Shortcuts “accesskeys” for selecting a label Usually either underlined by browser or printed after label Allows selection of label by ALT+<accesskey> (Win + Linux) “control” gives focus from label to another element <label accesskey="A" control=”otherElement”> Accesskey-test </label>
  • 38. 08/01/05 / Page 38 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Scripting Mozilla-products use extended version of JavaScript Experimental binding for languages like Python exist but not of “real importance” yet XUL-documents reflected using a DOM-tree (Document Object Model) Additionally internal interfaces available, depending on rights granted to a script Scripts possible using event-tags of a XUL-element or “script”-elements
  • 39. 08/01/05 / Page 39 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Scripting “type”-attribute optional, but highly recommended <script type="application/x-javascript"> <![CDATA[ function ShowAlert(text) { window.alert(text); } ]]> </script> <script src="toolbox.js" type="application/x-javascript"/> <script src="chrome://examples/toolbox.js"/> <script src="http://www.example.com/toolbox.js"/> Using external scripts Using “embedded” scripts (enclosed in CDATA-block)
  • 40. 08/01/05 / Page 40 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Scripting Use id=”...” to identify elements in DOM (for getElementById() - explained later) Events similar to HTML General: onclick, onmouseover, onkeypress For “window”: onload, onunload, onclose For “button”: oncommand <?xml version="1.0"?> <window xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="event basics" id="mainwindow" onload="alert('Loaded')" onunload="alert('Unloaded')" />
  • 41. 08/01/05 / Page 41 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Buttons Clickable XUL-element using “button” Element and all sub-elements are one clickable button Allows flexible definition of button-content All known attributes like “orientation” or “dir” supported Usually “label” used to define text on a button Possible to use tag “image” for graphics Attributes “label” and “image” to element “button” automatically create sub-elements inside the button
  • 42. 08/01/05 / Page 42 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Buttons <?xml version="1.0"?> <window xmlns= "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript"> <![CDATA[ function ShowAlert(text) { window.alert(text); } ]]> </script> <hbox> <label value="Label1" accesskey="L" control="myButton" /> <button id="myButton" label="Button1" accesskey="B" oncommand="ShowAlert(this.nodeName)" /> </hbox> </window>
  • 43. 08/01/05 / Page 43 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Buttons Sub-elements inside a “button”-element <button id="myButton" accesskey="B" oncommand="oncommand(this.nodeName)"> <label value="LabelB1" /> <label value="LabelB2" /> </button> In HTML “onclick” or “onkeypress” would be used For button “oncommand” available as well and will also be triggered using accesskey of label or button
  • 44. 08/01/05 / Page 44 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Buttons Special button: image with label image above, below, left or right of label dir=”normal” Image is left or above label dir=”reverse” Image is right or below label orient=”horizontal” or orient=”vertical” <button label="Bookmarks" image="http://www.example.com/foo.png" dir="reverse" orient="horizontal"/>
  • 45. 08/01/05 / Page 45 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Additional element-attributes checked=”true” Inverts initial state; element is selected, checked, active disabled=”true” Element is not available for user-interaction (grayed out) hidden=”true” Element not displayed / included in layout Equivalent to “display: none” in CSS collapsed=”true” Element not displayed, but included in layout Equivalent to “visibility: collapse” in CSS
  • 46. 08/01/05 / Page 46 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Checkboxes <checkbox id="closeWindow" label="Close this window when download is complete" checked="true" /> Similar to checkboxes in HTML Use XUL-widgets instead of HTML where possible
  • 47. 08/01/05 / Page 47 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Radiogroups <script> function updateState() { var name = document.getElementById("name"); var sindex = document.getElementById("group").selectedIndex; if (sindex == 0) name.disabled = true; else name.disabled = false; } </script> <radiogroup id="group" onselect="updateState();"> <radio label="Random name" selected="true"/> <hbox> <radio label="Specify a name:"/> <textbox id="name" value="Jim" disabled="true"/> </hbox> </radiogroup> One item selectable at a time Here used with a small script
  • 48. 08/01/05 / Page 48 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Groupboxes <groupbox> <caption label="The Foo Bar Brothers"/> <description value="Hi, this is Foo"/> <description value="Hi, this is Bar"/> </groupbox> Group elements <groupbox> <caption> <checkbox label="Subscribe me"/> </caption> <hbox> <label control="email" value="Email:"/> <textbox id="email"/> </hbox> </groupbox> Also “complex” captions allowed
  • 49. 08/01/05 / Page 49 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Grids Similar to HTML-table; but no output – just tabular layout Rows or columns can be defined <grid flex="1"> <columns> <column flex="3"/> <column flex="1"/> </columns> <rows> <row> <button label="OSCON"/> <button label="Tutorial"/> </row> <row> <button label="Mozilla"/> <button label="XUL"/> </row> </rows> </grid>
  • 50. 08/01/05 / Page 50 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Splitters Splits a window/box Allows resizing of sections Horizontal or vertical, depending on parent box Can be collapsed using “grippy” (optional) <description value="FooFooFoo" crop="end"/> <splitter id="splittername" state="open" collapse="before" resizebefore="closest" resizeafter="closest"> <grippy/> </splitter> <description value="BarBarBar" crop="end"/>
  • 51. 08/01/05 / Page 51 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Splitters Attributes: state “open” (default) or “collapsed” Initial state collapse “before”, “after”, “none” Side of panel that should collapse when grippy is clicked resizebefore “closest” (default), “farthest” Element to resize before splitter (farthest = element farthest away from splitter) resizeafter “closest” (default), “farthest” Element to resize after splitter
  • 52. 08/01/05 / Page 52 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Tabs Displaying set of “subpages” in one window Surrounded by a “tabbox” “tab”: refers to clickable name-tag of a “subpage” “tabpanel”: holds the “subpage”-content <tabbox> <tabs> [... tab-elements go here ...] </tabs> <tabpanels> [... tabpanel-elements go here ...] </tabpanels> </tabbox>
  • 53. 08/01/05 / Page 53 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Tabs Easy example: <tabbox flex="1"> <tabs> <tab id="tab1" label="Foo" selected="true"/> <tab id="tab2" label="Bar"/> </tabs> <tabpanels> <tabpanel id="tab1Panel" orient="vertical" > <description value="I like this foo."/> </tabpanel> <tabpanel id="tab2Panel" orient="vertical"> <description value="Let's meet at the bar!"/> </tabpanel> </tabpanels> </tabbox>
  • 54. 08/01/05 / Page 54 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Decks All children displayed at same position Only one child displayed at a time Displayed deck selectable via DOM (selectedIndex) <deck id="myDeck" selectedIndex="1"> <description value="First"/> <description value="Second"/> </deck> <button label="Switch to first" oncommand="document.getElementById('myDeck').selectedIndex = 0;"/>
  • 55. 08/01/05 / Page 55 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Stacks Places child-elements on top of each other, back to front Useful when selectively showing elements or stacking elements for layout reasons <stack> <description value="striked"/> <description value="-------" style="color:red; font-weight:bold"/> </stack> <stack> <description value="shadow" style="padding-left:3px; padding-top:3px;"/> <description value="shadow" style="color:red;"/> </stack>
  • 56. 08/01/05 / Page 56 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Tooltips / Popups tooltiptext=”...” Text to display when hovering an element tooltip=”...” Takes id of popup to display as tooltip Popups allow more complex information than text-tooltips <popup id="helpPopup"> <description value="some text"/> </popup> [...] <button id="myButton" label="myButton" tooltip="helpPopup"/>
  • 57. 08/01/05 / Page 57 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Tooltips / Popups Popups usually collected in a “popupset” Can be used to offer context-menues Position of popups can be given with “position”-tag position=“before_start” display before element, start-aligned Positions available: at_pointer, after_pointer, after_start, after_end, before_start, before_end, end_after, end_before, start_after, start_before, overlap (would be start_start)
  • 58. 08/01/05 / Page 58 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Tooltips / Popups <popupset> <popup id="contextPopup" position="before_start"> <description value="some text"/> </popup> </popupset> [...] <button id="myButton" label="myButton" context="contextPopup"/>
  • 59. 08/01/05 / Page 59 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Advanced buttons Special buttons selectable with attribute “type” type=”checkbox” button pushed down on first click, released on second type=”radio” from group of buttons only one button active at a time (attribute “group” identifies group of buttons) <hbox> <button type="radio" label="me" group="whom" /> <button type="radio" label="you" group="whom" /> <button type="radio" label="everybody" group="whom" /> </hbox>
  • 60. 08/01/05 / Page 60 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Advanced buttons Special buttons selectable with attribute “type” type=”menu” or type=”menu-button” special marker indicates button will open a menu “menu”: Menu opened upon button activation “menu-button”: User must click marker besides button <hbox> <button type="menu" label="menu"/> <button type="menu-button" label="menubutton"/> </hbox>
  • 61. 08/01/05 / Page 61 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus Toolbars / menus: Simplified: boxes containing buttons May have “popups” as submenues Element “menu” (button, opens a menupopup), contains: “menupopup” Container for menucontents “menuitem” similar to a “button” “menuseparator”
  • 62. 08/01/05 / Page 62 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus Attributes allowed in <menu ...> and <menuitem ...>: accesskey=”...” oncommand=”...” disabled=”...” type=”...” (“radio” or “checkbox”) checked=”...” (for items of type “radio” or “checkbox”) class=”...” (anonymous CSS-classes) (like with buttons - as you might have already guessed)
  • 63. 08/01/05 / Page 63 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus “menupopup”-element: Attribute “popupanchor” Anchor of parent-“menu”-element to position relative to Values: bottomleft (standard), bottomright, topright, and topleft Attribute “popupalign” Position of menu relative to anchor Values: bottomleft, bottomright, topright, and topleft Good choice for a bottom taskbar might be: popupanchor=”topleft” popupalign=”bottomleft”
  • 64. 08/01/05 / Page 64 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus Special menu: “menubar” Only use one “menubar” per window! (Mac displays menubar in a special way) For menus in menubar, popupanchor-values except “bottomleft” ignored because of typical space constraints
  • 65. 08/01/05 / Page 65 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus <menubar> <menu label="Text" accesskey="T"> <menupopup> <menu label="Style" accesskey="S"> <menupopup> <menuitem label="Normal" accesskey="N" type="radio" name="styleRadio" checked="true"/> <menuitem label="Bold" accesskey="B" type="radio" name="styleRadio"/> </menupopup> </menu> <menuseparator/> <menuitem label="Allow printing" type="checkbox" checked="true"/> <menuitem label="Autowrap"/> </menupopup> </menu> </menubar>
  • 66. 08/01/05 / Page 66 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon <menulist> <menupopup> <menuitem label="Normal"/> <menuitem label="Bold"/> </menupopup> </menulist> Toolbars / menus Special menu: “menulist” Drop-down list
  • 67. 08/01/05 / Page 67 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus “toolbar” is a special type of box Toolbars usually inside a “toolbox”-container Toolbars have “toolbargrippy” besides Allows to collapse them (give toolbars id=”...” for this to work) Automatically created Not supported in Firefox - use Mozilla 2 toolbars collapsed
  • 68. 08/01/05 / Page 68 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Toolbars / menus <toolbox> <toolbar id="firstToolbar"> <button label="Button One"/> <button label="Button Two"/> </toolbar> <toolbar id="secondToolbar"> <button label="Button Three"/> <button label="Button Four"/> </toolbar> <toolbar id="thirdToolbar"> <button label="Button Five"/> <button label="Button Six"/> </toolbar> </toolbox>
  • 69. 08/01/05 / Page 69 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Scrolling Special container “arrowscrollbox” Allows adding sub-elements than can be displayed Shows scrollbuttons and performs scrolling <arrowscrollbox orient="vertical" flex="1"> <button label="Red"/> <button label="Blue"/> <button label="Green"/> <button label="Yellow"/> <button label="Orange"/> <button label="Silver"/> <button label="Gold"/> <button label="Black"/> </arrowscrollbox>
  • 70. 08/01/05 / Page 70 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Lists List of items One or more items selectable Number of items adjustable Value for each item possible <listbox> <listitem label="Red"/> <listitem label="Green"/> <listitem label="Blue"/> <listitem label="White"/> </listbox> <listbox rows="2" seltype="multiple"> <listitem label="Red" value="r"/> <listitem label="Green" value="g"/> <listitem label="Blue" value="b"/> <listitem label="White" value="w"/> </listbox>
  • 71. 08/01/05 / Page 71 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Lists Lists with multiple columns Header-row possible Sort-indicator possible (does not sort – needs to be done with scripting) <listbox rows="3"> <listhead> <listheader label="Color" sortDirection="ascending"/> <listheader label="Vehicle"/> </listhead> <listitem> <listcell label="Green"/> <listcell label="Boat"/> </listitem> <listitem> <listcell label="Red"/> <listcell label="Car"/> </listitem> </listbox>
  • 72. 08/01/05 / Page 72 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Similar to “listbox” (in a way) Multiple columns and rows Column headers Listbox: any type of content / Tree: only text and images But offers more advanced features Nested rows Expanding / collapsing of rows ...
  • 73. 08/01/05 / Page 73 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Simple tree: Set of columns (treecol) Content (treechildren) Container for rows (treeitem) Rows / Cells “Column-picker” to select cols to show
  • 74. 08/01/05 / Page 74 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Attributes for a tree: “Column-picker” hideable Usually multiple rows selectable, but single-select possible Give id=”...” to every column (!!!) Otherwise showing/hiding columns, selections etc. might now always work <tree hidecolumnpicker=”true” /> <tree seltype=”single” />
  • 75. 08/01/05 / Page 75 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees <tree flex="1"> <treecols> <treecol id="Name" label="Name" flex="1"/> <treecol id="Email" label="Email" flex="1"/> </treecols> <treechildren> <treeitem> <treerow> <treecell label="Zuul"/> <treecell label="ghost@example.com"/> </treerow> </treeitem> <treeitem> <treerow> <treecell label="Venkman"/> <treecell label="buster@example.com"/> </treerow> </treeitem> </treechildren> </tree>
  • 76. 08/01/05 / Page 76 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Hierarchical tree Multiple levels (0, 1, 2, ...) Open/close subtrees Lines connecting rows under same parent Needed steps: Make treeitem a “container” to allow open/close Set primary=”true”-attribute on the first column (column where open/close and lines will be)
  • 77. 08/01/05 / Page 77 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon <tree flex="1"> <treecols> <treecol id="Name" label="Name" primary="true" flex="1"/> <treecol id="Email" label="Email" flex="1"/> </treecols> <treechildren> <treeitem container="true" open="true"> <treerow> <treecell label="Actors"/> </treerow> <treechildren> <treeitem> <treerow> <treecell label="Zuul"/> <treecell label="zuul@example.com"/> </treerow> </treeitem> <treeitem> <treerow> <treecell label="Venkman"/> <treecell label="venkman@example.com"/> </treerow> </treeitem> </treechildren> </treeitem> </treechildren> </tree> Trees
  • 78. 08/01/05 / Page 78 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Correct: Wrong primary column: Container attribute not set:
  • 79. 08/01/05 / Page 79 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Hierarchical tree One treerow + one treechildren per level Nesting possible Setting container-attribute important (containers without children possible) Attribute open=”true” for container to be initially expanded
  • 80. 08/01/05 / Page 80 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees Advanced features Reordering of columns: Adjusting of column-size: <splitter> between treecols optionally with class=“tree-splitter” to hide the notch Again: setting minwidth and maxwidth allowed here Saving state of columns between sessions: persist = ”...” width (Column widths), ordinal (position of column), hidden (Hidden-state of column) <tree enableColumnDrag="true" />
  • 81. 08/01/05 / Page 81 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees <tree enableColumnDrag="true" flex="1"> <treecols> <treecol id="Name" label="Name" flex="1" primary="true" persist="width ordinal hidden"/> <splitter class="tree-splitter"/> <treecol id="Email" label="Email" flex="1" persist="width ordinal hidden"/> <splitter class="tree-splitter"/> <treecol id="Job" label="Job" flex="1" persist="width ordinal hidden"/> </treecols> ...
  • 82. 08/01/05 / Page 82 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees JavaScript and trees Selected item for a seltype=”single”-tree tree-property “currentIndex” holds index (starting from 0) of current selected element Selected items for a multi-select-tree use methods from object at “tree.view.selection” Number of continous selected ranges: getRangeCount() Get bounds for range r: getRangeAt(r, start, end) Indexes start.value to end.value are selected Checking for certain selection: isSelected(s)
  • 83. 08/01/05 / Page 83 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Trees JavaScript and trees Setting selected items rangeSelect(start, end, bool) bool=add to curr select? clearRange(start, end) select(index) toggleSelect(index) invertSelection() selectAll()
  • 84. 08/01/05 / Page 84 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Custom tree views Built-in content tree view just for few / simple data Custom view allows: Large number of rows Complex data to be shown (e.g. computed) Create an “empty tree”: <tree id="squaretree" flex="1"> <treecols> <treecol id="countcol" label="Count" flex="1"/> <treecol id="squarecol" label="Square" flex="1"/> </treecols> <treechildren/> </tree>
  • 85. 08/01/05 / Page 85 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Custom tree views var treeView = { rowCount : 1000, getCellText : function(row, column){ if (column == "countcol") return row; else return row*row; }, setTree: function(treebox){ this.treebox = treebox; }, isContainer: function(row){ return false; }, isSeparator: function(row){ return false; }, isSorted: function(row){ return false; }, getLevel: function(row){ return 0; }, getImageSrc: function(row,col){ return null; }, getRowProperties: function(row,props){}, getCellProperties: function(row,col,props){}, getColumnProperties: function(colid,col,props){} }; Create object that implements “nslTreeView”-interface:
  • 86. 08/01/05 / Page 86 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Custom tree views <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window xmlns:html="http://www.w3.org/1999/xhtml" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="setView();"> <script> var treeView = { [...] }; function setView() { document.getElementById('squaretree').view = treeView; } </script> <tree id="squaretree" flex="1"> [...] </tree> </window> Creating the window, applying the view:
  • 87. 08/01/05 / Page 87 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Custom tree views The “nslTreeView”-interface: Implement in JavaScript-object or using XPCOM-component Almost 30 methods; For basic view only 10 methods needed Hierarchical view: also need to respond to isContainer(row), isContainerEmpty(row) and isContainerOpen(row) View must keep track of open-states Open/close triggers: toggleOpenClose(row) Methods for hierarchy and linking: getLevel(row), hasNextSibling(row, afterIndex), getParentIndex(row)
  • 88. 08/01/05 / Page 88 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF RDF (Resource Description Framework) Format used to store e.g. bookmarks, history, emails Using existing RDF-sources or RDF stored in XML (XML is often used for storing – RDF is not by definition in XML) A set of resources represents e.g. a person RDF describes relations between resources: connection of nodes Nodes are “literals” (actual values) or “resources” (think of things like objects) Resources identified by URIs (unique)
  • 89. 08/01/05 / Page 89 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF Name: Keymaster Job: Ghost Gender: male Name: Gatekeeper Job: Ghost Gender: female friendOf actor1 actor2
  • 90. 08/01/05 / Page 90 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF Relationships called “triples” or “arcs”: actor1 → friendOf → actor2 Parts of a triple called: subject → predicate → object / target Subject: always resource; object/target: resource or literal Subject, predicate and object described using URIs: http://www.example.com/rdf/actor1 http://www.example.com/rdf/friendOf http://www.example.com/rdf/actor2
  • 91. 08/01/05 / Page 91 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF Defining a type: http://www.example.com/rdf/actor1 → rdf:type → http://www.example.com/rdf/actor Reference to the RDF-namespace used: “rdf:type” here means “http://www.w3.org/1999/02/22-rdf-syntax-ns#type” Predicate “type” is defined in the RDF namespace already
  • 92. 08/01/05 / Page 92 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF Lists possible using “rdf:_1”, “rdf:_2”, ... http://www.example.com/rdf/allActors → rdf:_1 → http://www.example.com/rdf/actor1 http://www.example.com/rdf/allActors → rdf:_2 → http://www.example.com/rdf/actor2 List-types: “rdf:Seq” (ordered list), “rdf:Bag” (unordered list), “rdf:Alt” (list of alternatives) http://www.example.com/rdf/allActors → rdf:type → http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq
  • 93. 08/01/05 / Page 93 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF Storing RDF in XML: RDF/XML RDF-tag as node of XML-document Declare namespaces <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:actor="http://www.example.com/rdf/actor"> <rdf:Description rdf:about="http://www.example.com/rdf/actor1" actor:name="Keymaster" actor:job="ghost" actor:gender="male"/> </rdf:RDF>
  • 94. 08/01/05 / Page 94 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF “rdf:Description”: describes a triple “rdf:about”: specifies the subject of the triple Giving predicates, here from namespace “actor” Assigning target values Also possible to give separate triples for one subject: <rdf:Description rdf:about="http://www.example.com/rdf/actor1" actor:name="Keymaster"/> <rdf:Description rdf:about="http://www.example.com/rdf/actor1" actor:job="ghost"/> <rdf:Description rdf:about="http://www.example.com/rdf/actor1" actor:gender="male"/>
  • 95. 08/01/05 / Page 95 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF <rdf:Description rdf:about="http://www.example.com/rdf/actor1"> <actor:name="Keymaster"/> <actor:job="ghost"/> <actor:gender="male"/> </rdf> Or use tags to specify predicates: <rdf:Description rdf:about="http://www.example.com/rdf/actor1" actor:name="Keymaster" actor:job="ghost"> <actor:gender="male"/> </rdf> Or even mix:
  • 96. 08/01/05 / Page 96 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF <rdf:Description rdf:about="http://www.example.com/rdf/actor1"> actor:name="Keymaster"> <actor:friendOf rdf:resource=http://www.example.com/rdf/actor2"/> </rdf> Resource-to-resource triples: <rdf:Description rdf:about="http://www.example.com/rdf/actor1"> actor:name="Keymaster"> <actor:friendOf> <rdf:Description rdf:about="http://www.example.com/rdf/actor2" actor:name="Gatekeeper"/> </actor:friendOf> </rdf> Or nested:
  • 97. 08/01/05 / Page 97 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon RDF <rdf:Seq rdf:about="http://www.example.com/rdf/allActors"> <rdf:_1 rdf:resource="http://www.example.com/rdf/actor1"/> <rdf:_2 rdf:resource="http://www.example.com/rdf/actor2"/> </rdf:Seq> Lists in RDF/XML: <rdf:Seq rdf:about="http://www.example.com/rdf/allActors"> <rdf:li rdf:resource="http://www.example.com/rdf/actor1"/> <rdf:li rdf:resource="http://www.example.com/rdf/actor2"/> </rdf:Seq> Or using automatic numbering of items: Note for using an RDF APIs: Reading document translates rdf:li-tags to item-numbers
  • 98. 08/01/05 / Page 98 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Templates To create elements from datasources Internal datasource: bookmarks, history, mails In-memory datasource: Object of nslRDFDataSource RDF/XML-file Use: <template> ... </template> Place <template> in a container for all elements, e.g. a tree Elements in template repeated for each constructed element Repeat will start where: uri="rdf:*"
  • 99. 08/01/05 / Page 99 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Templates <?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:actor="http://www.example.com/rdf/actor#"> <rdf:Seq rdf:about="http://www.example.com/rdf/allActors"> <rdf:li> <rdf:Description rdf:about="http://www.example.com/rdf/actor1" actor:name="Keymaster" actor:job="ghost" actor:gender="male"/> </rdf:li> <rdf:li> <rdf:Description rdf:about="http://www.example.com/rdf/actor2" actor:name="Gatekeeper" actor:job="ghost" actor:gender="female"/> </rdf:li> </rdf:Seq> </rdf:RDF> actors.rdf
  • 100. 08/01/05 / Page 100 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Templates <?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window xmlns= ”http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <tree id="treefromrdf" flex="1" datasources="actors.rdf" ref="http://www.example.com/rdf/allActors"> <treecols> <treecol id="Name" label="Name" primary="true" flex="1"/> </treecols> <template> <treechildren flex="1"> <treeitem uri="rdf:*"> <treerow> <treecell label="rdf:http://www.example.com/rdf/actor#name"/> </treerow> </treeitem> </treechildren> </template> </tree> </window> actors.xul
  • 101. 08/01/05 / Page 101 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Content areas Displaying HTML or other XUL-files, embedded as one element into a XUL-window Simple element: <iframe> Supports basic features and is “lightweight” <iframe id="content" src="http://www.mozilla.org" flex="1"/> Advanced element: <browser> Similar to <iframe> - but features page history, referers etc. <browser id="content" src="http://www.mozilla.org" flex="1"/> Browser with tab-support: <tabbrowser> Widget that the Mozilla browser uses <tabbrowser id="content" src="http://www.mozilla.org" flex="1"/>
  • 102. 08/01/05 / Page 102 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Content areas Types of <browser>-elements type=”...” NOT set Browser-content part of current window XUL-code in loaded content has access to the whole window type=”content” Browser-content restricted to it's window type=”content-primary” With multiple browsers one is primary Primary content accessible using “window.content” <tabbrowser> automatically sets “content” / “content-primary” “content-primary” is currently selected tab
  • 103. 08/01/05 / Page 103 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling DOM-events Examples: moving mouse or pressing a key XUL-elements can trigger certain events Event transfered as object Event traverses element-hierarchy Note: Some events have no “bubbling phase” Clickingbutton triggersevent Traversingdown (“capturingphase”) Traversingup (“bubblingphase”) Window Document Box
  • 104. 08/01/05 / Page 104 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Possible to attach listeners at each propagating step Allows handling events for all sub-elements Possible to prevent event from propagating further Listening using element-attributes (e.g. command=”...”) Easy to use, but only receives bubbling events Listening to events using addEventListener-method Possible to listen at any phase Multiple listeners per event/element
  • 105. 08/01/05 / Page 105 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Event received during bubbling, for all sub-elements Event-object-property “target”: where event occurred <vbox oncommand="alert(event.target.tagName);"> <button label="OK"/> <checkbox label="Show images"/> </vbox> Listening in “capturing phase”, using DOM event handler <button id="okbutton" label="OK"/> <script> function buttonPressed(event) { alert('Button was pressed!'); } var button = document.getElementById("okbutton"); button.addEventListener('command', buttonPressed, true); </script> Listen in “capturing phase”?
  • 106. 08/01/05 / Page 106 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Event-object contains (extract): Constants: CAPTURING_PHASE, BUBBLING_PHASE Properties: eventPhase Current phase of flow boolean bubbles Can this event bubble? currentTarget EventTarget who's EventListener is being processed target Original EventTarget for event
  • 107. 08/01/05 / Page 107 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Event-object contains (extract): Methods: stopPropagation() Propagation stops on current EventTarget <hbox oncommand="alert('Box');"> <button label="Button1" oncommand="alert('Button1');"/> <button label="Button2" oncommand="alert('Button2');"/> </hbox> Clicking button1 results in: alert('Button1'); alert('Box'); Propagation not stopped Processing in bubbling-phase (bottom-up)
  • 108. 08/01/05 / Page 108 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Mouse-events: click, dblclick, mousedown, mouseup mouseover, mouseout mousemove <script> function mouseCoords(event) { var coordLabel = document.getElementById("coords"); coordLabel.value = event.clientX + ", " + event.clientY; } </script> <box width="100" height="100" onmousemove="mouseCoords(event);"/> <label id="coords"/>
  • 109. 08/01/05 / Page 109 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Keyboard-shortcuts: Using accesskey=”...”, as already mentioned Keyboard-events: keypress, keydown, keyup Defining shortcuts for a window <keyset> <key id="test-key" modifiers="control,shift" key="T" oncommand="alert('Test-key pressed');"/> </keyset>
  • 110. 08/01/05 / Page 110 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Event handling Keyboard-shortcuts: Modifiers: shift, control, alt, control, accel (Win: “control”, Unix: “alt”), meta (Mac: “command key”; not on all platforms) Adjusting keys: http://www.mozilla.org/unix/customizing.html Using defined key-IDs <keyset> <key id="cut_cmd" modifiers="accel" key="X"/> </keyset> [...] <menuitem label="Cut" accesskey="t" key="cut_cmd"/>
  • 111. 08/01/05 / Page 111 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Commands Aim: Separate application tasks and user interface Design goal: Strict separation, plan functionality before start Central (or even external) definition of commands Defined commands can be disabled or otherwise modified <command id="cmd_greeting" oncommand="alert('Hello user!');"/> <button label="Greeting" command="cmd_greeting"/> Events and commands are different (though they interoperate) Here: Button generates DOM 2 event of type “command”
  • 112. 08/01/05 / Page 112 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XUL with PHP? Sending the correct mime-header for XUL: Generating RDF-sources (XML-data) using PHP RDF-output-drivers for some PEAR-packages in the works (more hopefully at PHP Conference Frankfurt 2005) PEAR-package to help create XUL-code: http://pear.php.net/package/XML_XUL (Package and examples by Stephan Schmidt) <?php header( "Content-type: application/vnd.mozilla.xul+xml" ); ?>
  • 113. 08/01/05 / Page 113 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XUL with PHP? <?php require_once 'XML/XUL.php'; $doc = &XML_XUL::createDocument( ); $doc->addStylesheet('chrome://global/skin/'); $win = &$doc->createElement('Window', array('title'=> 'Example for PEAR::XML_XUL')); $doc->addRoot($win); $gbox = &$doc->createElement('Groupbox', array('orient'=>'horizontal', 'height' => 500)); $win->appendChild($gbox); $gbox->setCaption('The World of Super-Heroes');
  • 114. 08/01/05 / Page 114 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XUL with PHP? $tree = &$doc->createElement( 'Tree', array( 'flex' => 1 ) ); $tree->setColumns( 3, array( 'id' => 'hero', 'label' => 'Superhero', 'flex' => 2, 'primary' => 'true' ), array( 'id' => 'name', 'label' => 'Name', 'flex' => 1 ), array( 'id' => 'surname', 'label' => 'Surname', 'flex' => 1 ) );
  • 115. 08/01/05 / Page 115 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon XUL with PHP? $tree->addItem(array( 'Green Arrow', 'Oliver', 'Queen' )); $jla = &$tree->addItem(array( 'JLA' )); $jla->addItem(array( 'The Flash', 'Wally', 'West' )); $jla->addItem(array( 'Superman', 'Clark', 'Kent' )); $reserves = &$jla->addItem(array( 'Reserves' )); $reserves->addItem(array( 'Nightwing', 'Dick', 'Grayson' )); $gbox->appendChild( $tree ); /* ... shortened ... */ $doc->send(); } ?>
  • 116. 08/01/05 / Page 116 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Submitting a form Including form using HTML-namespace works (but nobody would do that!) Sending “form” using XUL with XML-RPC or SOAP (requires elevated rights; see articles in resources-list) Simple request: // create object req = new XMLHttpRequest(); req.open('GET', 'http://www.example.com/myscript.php', false); // last param: false=wait for request to finish (synchronous) req.send(null); // param: used for body of a POST-request // req.status: http-response-code (200=success) // req.responseText: text of response
  • 117. 08/01/05 / Page 117 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Submitting a form Asynchronous request: req = new XMLHttpRequest(); req.open('GET', 'http://www.example.com/myscript.php', true); req.onreadystatechange = readyStateChangeHandler; req.setRequestHeader('User-Agent', 'MyAgent'); // optional req.send(null); function readyStateChangeHandler () { if (req.readyState == 4) { // 4=request completed if(req.status == 200) { // response available } else { // error during request } } };
  • 118. 08/01/05 / Page 118 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Submitting a form Performing GET-request with variables: Combine URL and variables before request [...] var txt = "?1"; for(var i in this.parms) { txt = txt+'&'+this.parms[i].name+'='+this.parms[i].value; } //Two options here, only uncomment one of these //GET REQUEST httpRequest.open("GET", targetURL+txt, false, null, null); [...] (taken from complete example by Harry Fücks, available at: http://www.phppatterns.com/index.php/article/articleview/82/1/2/ ) Consider using a wrapper-library (e.g. jslib): http://jslib.mozdev.org/libraries/network/http.html
  • 119. 08/01/05 / Page 119 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Future of XUL Feature-rich and extensible Localization and customization Platform-independent Increasing number of Mozilla-platform-installations Large community Free XUL-like implementations e.g. for Java Comparison to XAML (Microsoft) ?
  • 120. 08/01/05 / Page 120 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Resources XUL Programmer's Reference http://www.mozilla.org/xpfe/xulref/ Creating Applications with Mozilla (complete O'Reilly book) http://books.mozdev.org/ Tutorials @ XULPlanet http://www.xulplanet.com/tutorials/ http://developer.mozilla.org/en/docs/XUL_Tutorial Rapid Application Development with Mozilla 2003, Prentice Hall, by Aussie Nigel McFarlane Neil's Place – blog on XUL, by Neil Deakin http://www.xulplanet.com/ndeakin/ XUL widget cheatsheet http://www.mozilla.org/docs/xul/xulnotes/xulnote_cheatsheet.html
  • 121. 08/01/05 / Page 121 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Resources Good overview of widget features and variants http://www.hevanet.com/acorbin/xul/top.xul XUL and XML-RPC http://www.phppatterns.com/index.php/article/view/86/1/2 Mozilla and SOAP http://www.oreillynet.com/pub/a/javascript/synd/2002/08/30/mozillasoapapi.html http://docs.mandragor.org/files/Misc/Mozilla_applications_en/mozilla-chp-12-sect-9.html Mozilla Amazon Browser http://www.infodraft.com/~faser/mab/ http://www.oreillynet.com/pub/a/mozilla/2003/05/02/casestudy2.html http://en.wikipedia.org/wiki/XUL http://en.wikipedia.org/wiki/Comparison_of_user_interface_markup_languages
  • 122. 08/01/05 / Page 122 XUL user-interfaces Stefan Neufeind O'Reilly OpenSource Convention 2005, Portland, Oregon Thank you! Up-to-date slides available at: http://talks.speedpartner.de/ Questions? neufeind (at) speedpartner.de