Mission has two active participants currently:\n*[[Ralph Thomas|http://www.infinite-imagination.com/]] (ralpht at missioncode.org) wrote all Mission software, except the [[external libraries|wiki:ExternalSoftware]] upon which Mission depends. Ralph writes the [[Mission Engineering Log|http://www.missioncode.org/blog]].\n*[[Rebecca Underwood|http://reality.sgiweb.org/rcu/]] (rcu at missioncode.org) is helping (re)design Mission applications' graphical user interfaces and updating and augmenting the software documentation.\n
!!How to Build the Mission Software\nCurrently (Milestone 003), Mission is supported only on Linux. To build Mission, perform the following steps:\n#Install development packages for: GTK+, GNOME-VFS, GConf, libgphoto2, D-Bus (and its glib library), HAL, libsqlite, libcurl, liblcms and libjpeg (on Ubuntu you can install all of the required packages to build Mission like so: {{{sudo apt-get install g++ gcc libc6-dev-i386 libgtk2.0-dev libgnomevfs2-dev libgconf2-dev libgphoto2-2-dev libdbus-1-dev libdbus-glib-1-dev libhal-dev libsqlite3-dev libcurl3-dev liblcms1-dev libjpeg62-dev libgnome2-dev libart-2.0-dev libattr1-dev}}}). Please note that you ''MUST'' use libsqlite 3.3.6 or later when running Mission Photo (the packaged builds link it in statically).\n#[[Check out Mission from Subversion|//svn.missioncode.org/mission]] or [[grab the latest Mission release|//www.missioncode.org/releases]]\n#Download and extract [[Boost 1.33.1|//www.boost.org]]\n#Copy the contents of {{{boost_1_33_1}}} to {{{mission/external/boost/}}}\n#Apply the patch for Boost: {{{cd mission/external/boost; patch -p1 -g0 -uN < boost_1_33_1_patch_01.txt}}}\n#Build {{{Boost.Jam}}} and copy it to somewhere in $PATH: {{{cd mission/external/boost/tools/build/jam_src; ./build.sh; cp linux.x86/bjam /usr/bin}}} Tell {{{Boost.Build}}} that you want to use GCC by uncommenting the {{{using gcc}}} line in {{{mission/external/boost/tools/build/v2/user-config.jam}}} {{{cd}}} to {{{mission/}}} and run {{{bjam}}} (or {{{bjam release}}} for a non-debug build).\n#Wait while {{{Boost.Jam}}} figures out what to build and then builds it\n#Set up your environment for Mission: {{{ln -s `pwd`/resources ~/.mission}}}}}}<br />OR: install the contents of {{{resources}}} into {{{$PREFIX/share/mission}}} and the binary to {{{$PREFIX/bin/mission-photo}}}.\n#Run {{{`bin/gcc/debug/link-static/threading-multi/user-interface-gui/mission-photo`}}} (or {{{$PREFIX/bin/mission-photo}}}).\nIf you see Photo Organizer, then congratulations! If not, please contact [[eng@missioncode.org|mailto:eng@missioncode.org]].\n
Background: #fff\nForeground: #000\nPrimaryPale: #ddd\nPrimaryLight: #18f\nPrimaryMid: #04b\nPrimaryDark: #014\nSecondaryPale: #ffc\nSecondaryLight: #fe8\nSecondaryMid: #db4\nSecondaryDark: #841\nTertiaryPale: #eee\nTertiaryLight: #ccc\nTertiaryMid: #999\nTertiaryDark: #666\nError: #f88\n
Our motivation for writing DVD Creator is to add to [[Photo Organizer]] the ability to burn a photo slideshow to DVD (to send our photos to friends and family who do not have Internet access or computers).\n\nInitially we will build a tool that takes an Eve description of some menus and outputs something that [[DVDAuthor|http://dvdauthor.sourceforge.net/]] can build a DVD image from. The Adobe Eve layout engine will be employed to lay out DVD menus. Eventually we plan to build DVD Creator into a full DVD creation application.
Before reading this page, you should have read the [[Overview|Overview]] to understand Adam and Eve files and how Mission interacts with them.\n\n!!Binding a Data Pump to a Widget\nMission has four kinds of data pumps. A data pump takes a set of related parameters and returns some data or function results (instead of an Adam cell value).\n\nHere is the syntax for Data Pump:\n{{{\n<data_pump>( <parameter_1>: <value_1>, ..., <parameter_N>: <value_N> )\n}}}\nUsing a widget's {{{`bind`}}} parameter, you can bind the data pump's output to that widget. When the data or result changes, the widget will then update automatically. Widgets can be bound to data pumps that return the same type of data that the widget can show. See the [[Widgets]] documentation for the types of data that different widgets can show.\n\n!!!Available Data Pumps\nThe ''model'' data pump extracts an attribute of a model (in Milestone 001), taking the following parameters:\n*{{{url}}}: the URL of the model (such as "[[file:///home/ralpht|///home/ralpht]]").\n*{{{attribute}}}: the name of the attribute to extract from the model (such as "children").\n\nExample Eve file binding a model data pump to an {{{edit_text}}} widget:\n{{{\nedit_text( bind: model( url: "http://slashdot.org", \n attribute: "name" ) );\n}}}\nThe ''array'' data pump retrieves a single element from an array (in Milestone 002), taking the following parameters:\n*{{{array}}}: the array of interest (such as [1, 2, 3]).\n*{{{index}}}: the index of the array element to return (such as 2).\n\nExample Eve file binding an array data pump to an {{{edit_text}}} widget:\n{{{\nedit_text( bind: array( array: @array_of_strings_in_Adam_cell, \n index: 2 ) );\n}}}\nThe ''assign'' data pump sets an input cell (or another data pump [see the Chaining Data Pumps section below]) to a particular value when invoked as an action (in Milestone 002), taking the following parameters:\n*{{{target}}}: the Adam cell name or data pump to set when invoked (such as @value).\n*{{{value}}}: the value to set into the cell or data pump (such as 17).\n\nUnlike the three other data pumps, the assign data pump does not return a value to the bound widget. Instead it assigns the specified {{{value}}} to the specified {{{target}}}.\n\nExample Eve file binding an assign data pump to a {{{button}}} widget:\n{{{\n/*\n** Assign 17 to @value_in_Adam_cell when the Reset button is clicked.\n*/\nbutton( bind: assign( target: @value_in_Adam_cell, \n value: 17 ), \n name: "Reset" );\n}}}\nThe ''logic'' data pump calculates the result of a logical expression (in Milestone 002), taking the following parameters:\n*{{{expr}}}: the logical expression.\n*Variables mentioned in the logical expression.\n\nThe purpose of the logic data pump is to allow simple Adam logic rules to be declared inline. The rules that the logic data pump represents are those that would typically be in an Adam sheet.\n\nExample Eve file binding a logic data pump to a {{{dynamic_text}}} widget:\n{{{\ndynamic_text( bind: logic( expr: "some_boolean \n ? 'the value is true'\n : 'the value is false';", \n some_boolean: true ) );\n}}}\n!!!Compose Data Pumps\nMission also allows you to compose or embed multiple data pumps inside each other in order to manipulate the data or function results in a sophisticated way before it reaches your (bound) widget to be displayed. For example, if you bound a widget to a file model data pump that reported the size of the file it represents as an integer, then you could embed the model data pump inside another data pump that converted the integer into a string such as "5.2MB". This would offload some widget display complexity.\n\nIn this example Eve file, the result of a model data pump is fed into an assign data pump, which is then bound to a pushbutton widget named "Rename". The overall effect is that when your user clicks the button, the file named "some_path" will be renamed to "new_path":\n{{{\nbutton( bind: assign( target: model( url: "file:///some_path",\n attribute: "name" ), \n value: "new_path" ),\n name: "Rename" );\n}}}\nHere is an example Eve file using a logic data pump that gets one of its parameters from a model data pump:\n{{{\npanel( bind: logic( expr: "type == 'image/jpeg'", \n type: model( url: @selection, \n attribute: 'type' ) ) ) {\n button( name: "Lossless JPEG rotate left" ... );\n ...\n}\n}}}\nIn this example, the result of the model data pump is the type of {{{@selection}}}'s file model. This file type is returned to the logic data pump as the {{{type}}} parameter. Then the logic data pump returns its data (which will be either true or false, depending whether or not the specified file is a JPEG image) to the panel widget. The overall effect is that when the {{{@selection}}} points to a valid JPEG file, the panel will make itself visible and also make visible its "Lossless JPEG rotate left" pushbutton.
[[Welcome]]
Mission uses the following externally developed software:\n*[[Adobe Source Libraries|http://opensource.adobe.com/]] (MIT license).\n*[[C++ Boost|http://www.boost.org/]] libraries ([[Boost license|http://www.boost.org/more/license_info.html]]).\n*[[libeog|http://cvs.gnome.org/viewcvs/f-spot/libeog]] Gtk+ image view widget supporting scaling, scrolling, etc. (GPL license).\n*[[Gtk+|http://www.gtk.org/]] user interface toolkit (LGPL license).\n*[[Assorted Gtk+ widgets|http://missioncode.googlecode.com/svn/trunk/external/gtk-borrowed-widgets/README]] library (GPL license). This library contains widgets taken from other Gtk+ applications. It contains ~GPL-licensed code. It would be nice to re-engineer these widgets and put them under MIT or LGPL license.\n*[[exiftran|source:external/fbida/README]] library (GPL license). This is the insides of the exiftran core. It is used to rotate EXIF images according to the {{{orientation}}} EXIF tag and also to rotate the embedded thumbnail and update the tag at the same time. We would like to have code that accomplishes the same function under LGPL or MIT in the future, too.\n\nFrom Milestone 003 on, Gtk+ is the officially supported toolkit instead of FLTK.
The most recent release of Mission is Milestone 003, however work has continued on Mission Photo since then. For information on what features a given release contains, and what features are planned please see the [[Bug Tracker|http://code.google.com/p/missioncode/issues/list]]. Build instructions for source tarballs are available at [[Build Instructions]].\n\nReleases:\n*[[Milestone 003|http://www.missioncode.org/releases/mission-m003.tar.gz]] (Released September 3, 2006).\n***[[Mission Photo|http://www.missioncode.org/photo/download]] 0.5 was built from the Milestone 003 source.\n***[[Mission Photo|http://www.missioncode.org/photo/download]] 0.5.1 was built from [[Mission Photo 0.5.1 source|http://www.missioncode.org/photo/releases/mission-photo-0.5.1.tar.gz]] (Released September 8, 2006).\n***[[Mission Photo|http://www.missioncode.org/photo/download]] 0.5.2 was built from [[Mission Photo 0.5.2 source|http://missioncode.googlecode.com/files/mission-photo-0.5.2.tar.bz2]] (Released December 23, 2006).\n*[[Milestone 002|http://www.missioncode.org/releases/mission-m002.tar.gz]] (Released April 8, 2006).\n*[[Milestone 001|http://www.missioncode.org/releases/mission-m001.tar.gz]] (Released January 1, 2006).\n*[[Milestone 000|http://www.missioncode.org/releases/mission-m000.tar.gz]] (Released December 3, 2005). Subversion:\n*[[Mission Subversion Repository|http://code.google.com/p/missioncode/source]] Check out the latest and greatest from here.\n\n\n
Before reading this page, you should have read the [[Overview|wiki:Overview]] to understand Adam and Eve files and how Mission interacts with them.\n\n!!Generator\nGenerator creates and maintains a set of views based on the contents of an array. A view is the same as a widget. For example, Generator can be used in an Eve file to create a list of {{{`static_text`}}} widgets like this:\n\n\n{{{\ngenerator( bind: @my_range, iterator: @i ) {\n static_text( name: @i );\n}\n}}}\nHere is the Adam sheet that accompanies the above Eve file:\n\n\n{{{\nsheet generator_example {\n interface:\n my_range : ["good morning", "good afternoon", "good night"];\n}\n}}}\nIn the above example, when the generator runs, it iterates through the {{{`my_range`}}} array, using {{{`@i`}}} as a variable that gets set to the current element in the array, creating a {{{`static_text`}}} widget for each element. With a variable that iterates over the array like this, you can build fairly complicated data bindings easily, like this ({{{`xml`}}} and {{{`xpath`}}} [[DataPumps|wiki:ModelBinder]] to be available in Milestone 002 and later releases):\n\n\n{{{\n/*\n** Generate a listing of books in a library. Assume that the\n** XML data looks like this:\n** <xml>\n** <library>\n** <book>\n** <cover>http://book-covers.com/cover-xyz.jpg</cover>\n** <title>the book's title</title>\n** <author>the book's author</author>\n** </book>\n** ...\n** </library>\n** </xml>\n*/\ngenerator( bind: xpath( attribute( "http://x.com", "data" ),\n "//library/book" ),\n iterator: @book ) {\n row() {\n /*\n ** Draw the book's cover as an icon. Notice that we use\n ** an xpath to get the URL to get the icon from.\n */\n icon( bind: attribute( xpath( @book, "cover/text()" ),\n "data" ) );\n /*\n ** List the title.\n */\n static_text( name: "Title:", \n bind: xpath( @book, "title/text()" ) );\n /*\n ** List the author.\n */\n static_text( name: "Author:", \n bind: xpath( @book, "author/text()" ) );\n }\n}\n}}}\nTo make an icon view or list view, you put a generator inside a scroll view, which is a widget that puts its children inside a scrolled area (see the [[Widgets|wiki:WidgetDocumentation]] page for more on scroll views).\n\nGenerator can create a list of widgets that correspond to a model's children, by binding to the {{{`model`}}} [[DataPump|wiki:ModelBinder]]. For example, to show icons with filenames for the files and directories in {{{`/tmp/`}}} you could use the Generator in your Eve file like this:\n{{{\ndialog( name: "Directory List", grow: true ) {\n scroll( horizontal: align_fill, vertical: align_fill ) {\n table() {\n generator( bind: model( url: "file:///tmp/", \n attribute: "children" ), \n iterator: @i ) {\n row() {\n icon( bind: model( url: @i, attribute: "icon" ), \n size: 22 );\n dynamic_text( bind: model( url: @i, attribute: "name" ) );\n }\n }\n }\n }\n}\n}}}
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
The following mailing lists exist:\n*[[eng@missioncode.org|http://lists.missioncode.org/listinfo.cgi/eng-missioncode.org]] -- the main Mission Engineering list\n
[[Welcome]]\n[[Photo Organizer]]\n[[Engineering Blog|http://www.missioncode.org/blog]]\n[[Source Code|http://code.google.com/p/missioncode/source]]\n[[Bug Tracker|http://code.google.com/p/missioncode/issues/list]]
A Mission-based application has three parts:\n#The {{{`mission`}}} binary, which you can build by following the [[Build Instructions]]\n#A widgetry layout file named {{{`eve`}}} that you write in the Eve syntax\n#A user interface logic file named {{{`adam`}}} that you write in the Adam syntax\nEventually you will be able to put the {{{`eve`}}} and {{{`adam`}}} files in a directory then run your application by typing the following at the command line:\n\n{{{`mission <directory containing your Eve and Adam files>`}}}\n!!Example Eve and Adam Files\nAdam and Eve were developed by [[Adobe Systems Incorporated|//www.adobe.com]]. At a high level, Eve is a widgetry layout engine and Adam is a logic runtime environment.\n\nFor example, here's an Eve file that creates a simple dialog window (example is from the [[Adobe Source Libraries|http://opensource.adobe.com/group__asl__overview.html]] documentation):\n{{{\ndialog(name: "Clipping Path")\n{\n column(child_horizontal: align_fill)\n {\n popup(name: "Path:", bind: @path, items:\n [\n { name: "None", value: empty },\n { name: "Path 1", value: 1 },\n { name: "Path 2", value: 2 }\n ]);\n edit_number(name: "Flatness:", digits: 9, bind: @flatness);\n }\n button(name: "OK", default: true, bind: @result);\n}\n}}}\nWhen instantiated in the "Clipping Path" dialog window, a rollover menu appears with a "Path" label in the first row, a text input appears with a "Flatness" label in the second row, and to the right of both, an "OK" pushbutton appears.\n\nContinuing the example, here's an Adam file that goes with the previous Eve file (example is also from the [[Adobe Source Libraries|http://opensource.adobe.com/group__asl__overview.html]] documentation):\n{{{\nsheet clipping_path\n{\noutput:\nresult <== { path: path, flatness: flatness };\n\ninterface:\nunlink flatness : 0.0 <== (path == empty) ? 0.0 : flatness;\npath : 1;\n}\n}}}\nThis Adam file is called a "sheet" because it's similar to a spreadsheet in concept, in that the named values inside it are called "cells" and can have relationships between them. Your Eve file can have a widget (such as a slider) that binds to a value in your Adam file (such as {{{`path`}}} or {{{`flatness`}}} here) such that the user's interacting with the widget (sliding the slider) causes the bound value to change. Adam then recalculates all the other dependent values (for example, in this Adam file, {{{`flatness`}}} depends on {{{`path`}}}, so if your Eve file has a widget that changes the value of {{{`path`}}} then the {{{`flatness`}}} value will update automatically).\n\nThe Adam file is better than a spreadsheet because Adam has some features that make it very suitable for developing the logic for graphical user interfaces. For example, in your Adam file you can specify legal conditions for a value or a set of values. When the application runs, Adam can tell you the name of a cell that caused a calculated result to be out of range, allowing your application to report to the user specifically which of their input values is invalid. Also\nAdam allows a cell's value to depend on itself ({{{`flatness`}}} depends on {{{`flatness`}}} here).\n!!Example Eve and Adam Files Using Mission\nMission extends the above features by adding new widgets (for example, {{{`icon`}}} as used below) and by adding bindable [[Data Pumps]]. In your Eve file, you can bind any widget to a Mission [[Data Pump|Data Pumps]] and give it some parameters (such as a filename). When the application runs, the [[Data Pump|Data Pumps]] returns the corresponding data (in this case, it may be the file's contents or size or whatever you specified) to the widget, which can then display that result as appropriate. Instead of binding your Eve widget to a named value in an Adam sheet, you can bind your Eve widget to a [[Data Pump|Data Pumps]], which may be a function.\n\nHere's an example of an Eve file that uses a Mission model [[Data Pump|Data Pumps]]:\n{{{\ndialog( name: "Binder Advert" ) {\n row() {\n static_text( name: "The icon of /tmp is:" );\n icon( bind: model( url: "[[file:///tmp|///tmp]]", attribute: "icon" ), \n size: 22);\n }\n}\n}}}\nThe Adam file has no cells, as none of the widgets binds to any cells. Note that this happens to be the shortest valid Adam file (minimum required Adam file) that must accompany an Eve file:\n{{{\nsheet test {}\n}}}\nHere's the simple dialog that these two files generate when run with Mission:\n\nOptionally you can pass named values instead of strings or numbers as the parameters for a [[data pump|Data Pumps]]. Every time the named value changes, the [[Data Pump|Data Pumps]] returns new data if required, and the widget can then show it. Some widgets, like the {{{`edit_text`}}} widget, can set a new value into the [[Data Pump|Data Pumps]], which could change the filename or put new contents into a file, for example.\n!!What's Next\nNow that you've read this far, here's what you can read next to understand more about Mission and how to use it:\n\n*[[Model Design]] -- How to make your GUI application get and set data in a data store (for example, FileModel could be used to access the filesystem in a file manager application, IMModel could be used to access the buddy list in a chat application, or IMAPModel could be used to access the mailbox and email messages in an email application)\n*[[Widgets]] -- What Mission widgets are available to you, beyond those provided by Adobe\n*[[Generator]] -- How to create and use lists or sets of widgets\n
<!--{{{-->\n<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span> \n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>\n<div id='sidebar' style="display:none;">\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>\n<!--}}}-->
This is the engineering home for Photo Organizer. Application users and interested laypersons are invited to read the [[user information|http://www.missioncode.org/photo]].\n!!Features\nPhoto Organizer lets you rate and rotate images, import images from ~USB-attached digital cameras and from filesystems, and publish images to [[Flickr|http://www.flickr.com/]]. A future release may include upload to websites such as [[Yahoo! Photos|http://photos.yahoo.com/]] and Google's [[Picasa Web Albums|http://picasaweb.google.com/]].\n!!Screenshots\n[img[mission-photo-13-aug-2006.jpg]]\n!!Running the Application\nTo run Photo Organizer, do one of the following:\n** Either [[download and install the mission binary|http://www.missioncode.org/photo/download/]] then select Applications > Graphics > Mission Photo from the desktop's main menu.\n** Or [[build and run mission from source|Build Instructions]].\n!!Source\nAs of April 2006, the following two runtime-interpreted text files completely describe and implement the Photo Organizer application:\n* [[/resources/apps/photo/eve|http://missioncode.googlecode.com/svn/trunk/resources/apps/photo/eve]]-- GUI layout description (Eve file)\n* [[/resources/apps/photo/adam|http://missioncode.googlecode.com/svn/trunk/resources/apps/photo/adam]] -- GUI logic description (Adam file)\nFor more information on Adam and Eve files, see [[the Adobe Source Libraries Overview|http://opensource.adobe.com/group__asl__overview.html]] and the Mission [[Widgets|WidgetDocumentation]] documentation.
Most of Mission is OS independent C++, however some parts of it are specific to Linux or GTK+, note that for all of these libraries below, only the GTK+/Linux code is up to date (Mission did previously run on ~MacOS and Windows, but that code is now stale).\n\n!!View\nThe view library contains all of the extra widgets that Mission uses which aren't included with the Adobe Source Libraries. This code lives in {{{view/}}} in the source tree. Implementations of all of these will be required for any new port. The hardest views to implement are probably the image view (which must support zooming and panning the image, as well as reading from a std::streambuf) and the flyweight_generator.\n\n!!!ui-core changes\nI made some very minor changes to the GTK+ implementation of ui-core, but didn't apply the same changes to the ~MacOS or Win32 implementations, these will have to be updated to compile. This code lives in {{{external/adobe/future/widgets}}}.\n\n!!Toolkit (application object)\nThe application object also requires a new implementation for each new platform. It contains the code that jumps into the toolkit main loop and provides related services such as file monitoring and idle time processing. This code lives in {{{toolkit/}}} in the tree.\n\n!!Image import\nOn Linux the gphoto2 library is used to acquire photos from digital cameras. This library might work under ~MacOS. On Windows, WIA should be used. This code lives in {{{apps/photo/}}} in the tree (along with the other Mission Photo specific code).
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'Change TiddlyWiki advanced options'>>
/***\n|''Name:''|SinglePageModePlugin|\n|''Source:''|http://www.TiddlyTools.com/#SinglePageModePlugin|\n|''Author:''|Eric Shulman - ELS Design Studios|\n|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|\n|''~CoreVersion:''|2.0.10|\n\nNormally, as you click on the links in TiddlyWiki, more and more tiddlers are displayed on the page. The order of this tiddler display depends upon when and where you have clicked. Some people like this non-linear method of reading the document, while others have reported that when many tiddlers have been opened, it can get somewhat confusing.\n\n!!!!!Usage\n<<<\nSinglePageMode allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one item displayed at a time. When SinglePageMode is enabled, the title of the current tiddler is automatically displayed in the browser window's titlebar and the browser's location URL is updated with a 'permalink' for the current tiddler so that it is easier to create a browser 'bookmark' for the current tiddler.\n\nEven when SinglePageMode is disabled (i.e., displaying multiple tiddlers is permitted), you can reduce the potential for confusion by enable TopOfPageMode, which forces tiddlers to always open at the top of the page instead of being displayed following the tiddler containing the link that was clicked.\n<<<\n!!!!!Configuration\n<<<\nWhen installed, this plugin automatically adds checkboxes in the AdvancedOptions tiddler so you can enable/disable the plugin behavior. For convenience, these checkboxes are also included here:\n\n<<option chkSinglePageMode>> Display one tiddler at a time\n<<option chkTopOfPageMode>> Always open tiddlers at the top of the page\n<<<\n!!!!!Installation\n<<<\nimport (or copy/paste) the following tiddlers into your document:\n''SinglePageModePlugin'' (tagged with <<tag systemConfig>>)\n^^documentation and javascript for SinglePageMode handling^^\n\nWhen installed, this plugin automatically adds checkboxes in the ''shadow'' AdvancedOptions tiddler so you can enable/disable this behavior. However, if you have customized your AdvancedOptions, you will need to ''manually add these checkboxes to your customized tiddler.''\n<<<\n!!!!!Revision History\n<<<\n''2006.07.04 [2.2.1]'' in hijack for displayTiddlers(), suspend TPM as well as SPM so that DefaultTiddlers displays in the correct order.\n''2006.06.01 [2.2.0]'' added chkTopOfPageMode (TPM) handling\n''2006.02.04 [2.1.1]'' moved global variable declarations to config.* to avoid FireFox 1.5.0.1 crash bug when assigning to globals\n''2005.12.27 [2.1.0]'' hijack displayTiddlers() so that SPM can be suspended during startup while displaying the DefaultTiddlers (or #hash list). Also, corrected initialization for undefined SPM flag to "false", so default behavior is to display multiple tiddlers\n''2005.12.27 [2.0.0]'' Update for TW2.0\n''2005.11.24 [1.1.2]'' When the back and forward buttons are used, the page now changes to match the URL. Based on code added by Clint Checketts\n''2005.10.14 [1.1.1]'' permalink creation now calls encodeTiddlyLink() to handle tiddler titles with spaces in them\n''2005.10.14 [1.1.0]'' added automatic setting of window title and location bar ('auto-permalink'). feature suggestion by David Dickens.\n''2005.10.09 [1.0.1]'' combined documentation and code in a single tiddler\n''2005.08.15 [1.0.0]'' Initial Release\n<<<\n!!!!!Credits\n<<<\nThis feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].\nSupport for BACK/FORWARD buttons adapted from code developed by Clint Checketts\n<<<\n!!!!!Code\n***/\n//{{{\nversion.extensions.SinglePageMode= {major: 2, minor: 2, revision: 1, date: new Date(2006,7,3)};\n\nif (config.options.chkSinglePageMode==undefined) config.options.chkSinglePageMode=true;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkSinglePageMode>> Display one tiddler at a time";\n\nif (config.options.chkTopOfPageMode==undefined) config.options.chkTopOfPageMode=false;\nconfig.shadowTiddlers.AdvancedOptions += "\sn<<option chkTopOfPageMode>> Always open tiddlers at the top of the page";\n\nconfig.SPMTimer = 0;\nconfig.lastURL = window.location.hash;\nfunction checkLastURL()\n{\n if (!config.options.chkSinglePageMode)\n { window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }\n if (config.lastURL == window.location.hash)\n return;\n var tiddlerName = convertUTF8ToUnicode(decodeURI(window.location.hash.substr(1)));\n tiddlerName=tiddlerName.replace(/\s[\s[/,"").replace(/\s]\s]/,""); // strip any [[ ]] bracketing\n if (tiddlerName.length) story.displayTiddler(null,tiddlerName,1,null,null);\n}\n\nif (Story.prototype.SPM_coreDisplayTiddler==undefined) Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;\nStory.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)\n{\n if (config.options.chkSinglePageMode) {\n window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));\n config.lastURL = window.location.hash;\n document.title = wikifyPlain("SiteTitle") + " - " + title;\n story.closeAllTiddlers();\n if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);\n }\n if (config.options.chkTopOfPageMode) { story.closeTiddler(title); window.scrollTo(0,0); srcElement=null; }\n this.SPM_coreDisplayTiddler(srcElement,title,template,animate,slowly)\n}\n\nif (Story.prototype.SPM_coreDisplayTiddlers==undefined) Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;\nStory.prototype.displayTiddlers = function(srcElement,titles,template,unused1,unused2,animate,slowly)\n{\n // suspend single-page mode when displaying multiple tiddlers\n var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;\n var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;\n this.SPM_coreDisplayTiddlers(srcElement,titles,template,unused1,unused2,animate,slowly);\n config.options.chkSinglePageMode=saveSPM; config.options.chkTopOfPageMode=saveTPM;\n}\n//}}}
missioncode.org
http://www.missioncode.org/
/*{{{*/\n* html .tiddler {\n height: 1%;\n}\n\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 1.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 1.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.2em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
<!--{{{-->\n<div class='toolbar' macro='toolbar +editTiddler references'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle' style="display:none;"><span macro='view modifier link'></span>, <span macro='view modified date [[DD MMM YYYY]]'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date [[DD MMM YYYY]]'></span>)</div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags' style="display:none"></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>\n<!--}}}-->
Mission software consists of two parts:\n# An open source, internationalized, cross-platform application foundation, designed to run fast and stably on limited hardware. [[Adobe Source Libraries|http://opensource.adobe.com/]] is the user interface framework.\n# A resource-efficient suite of powerful, concise applications built on that foundation. The applications work together as an integrated environment on Linux and also run individually on Windows, Mac OS and Linux.\n** [[Photo Organizer]] ([[user information|http://www.missioncode.org/photo]]) manages photos from digital cameras and disks.\n** [[DVD Creator]] generates DVD menus and burns videos (such as photo slideshows) to ~DVDs.\nThis site includes the following Mission documentation:\n*''Software Documentation''\n** [[Overview]] -- Basic structure of a Mission application and how to make your own.\n** [[Build Instructions]] -- How to get the Mission source and build it.\n** [[Widgets]] -- Mission-specific widgets and how to use them.\n** [[Binding Widgets to Data Pumps|Data Pumps]] -- How data and function results get glued to Mission widgets.\n**[[Porting Mission to new Platforms|Porting]] -- How to port Mission to a new OS.\n*''About Mission''\n** [[Why Mission]] -- Why we are writing Mission.\n** [[Downloadable Releases]] -- The latest and greatest versions.\n** [[Mailing Lists]] -- Mailing lists related to Mission engineering.\n** [[About Us]] -- List of people and contact information.\n*''Supporting Software''\n** [[Dependencies]] -- Externally developed software that Mission uses.\nMission software is distributed under the [[GNU general public license (GPL)|http://www.gnu.org/licenses/gpl.html]].
!History of Mission\nThe Mission project started in 2003 as an effort to make a usable, resource-efficient desktop environment for Linux. In early 2004, we scaled this back to an email client and wrote the IMAP4 client library. By end of 2004, we had completed a cross-platform GUI toolkit (for Win32 and Mac OS Carbon), a cross-platform GUI test tool (called {{{soy}}}, to be released as a separate tool), and a multi-threaded IMAP model.\n\nIn Febuary 2005, Adobe released [[Adobe Source Libraries|//opensource.adobe.com/]], which offers a far superior way to write GUI software versus the traditional heavyweight C++ style that Mission toolkit had used previously. We replaced the initial Mission toolkit with the Adobe libraries.\n\nRather than require in-depth programming knowledge, Mission allows an intelligent layperson to write a couple of text files (using Adam and Eve is simpler than HTML tagging) and thereby create their own graphical software application. No compilation is required to develop or run the resulting application, just running the {{{`mission`}}} binary with the two text files as input.\n\nSince then, we added a local filesystem model and some new widgets (such as {{{icon}}}, {{{list}}}, {{{image}}}, etc.). As of November 2005, it is possible to write basic applications (such as [[Photo Organizer]]) using startlingly little "code" (for example, as of April 2006, [[Photo Organizer]] is written in only 81 lines: 68 in [[its Eve file|http://missioncode.googlecode.com/svn/trunk/resources/apps/photo/eve]] and 13 in [[its Adam file|http://missioncode.googlecode.com/svn/trunk/resources/apps/photo/adam]]). That seemed a natural time to make the first open-source release.\n\n!Future of Mission\nThe future of Mission lies in developing a set of easy-to-write, -learn, and -use desktop software. Our goal is to develop a set of small useful applications that run individually on any computer, from personal digital assistants (PDAs) and $100 PCs to high-end Macintosh and Windows machines. The Mission team is intrigued by efforts such as the [[One Laptop Per Child|//laptop.org]] project.\n
Before reading this page, you should have read the [[Overview|Overview]] to understand Adam and Eve files and how Mission interacts with them. You might find it useful to read about [[Data Pumps]] to understand the {{{`model( url: ..., attribute: ... )`}}} construct, as well.\n!!Mission Widgets\nMission contains all [[Adobe UI Core|//opensource.adobe.com/group__widget__reference.html]] widgets (about 20), including {{{`progress_bar`}}} and {{{`radio_button`}}}, and extends it with the seven new Mission widgets and concepts.\n!!!Common Widget Attributes\nAll non-container widgets have the following attributes (for simplicity, Mission supports only this subset of attributes, although the Adobe Source Libraries define and support additional attributes for their [[Adobe UI Core|//opensource.adobe.com/group__widget__reference.html]] non-container widgets):\n| ''Attribute'' | | ''Type'' | | ''Default value'' | | ''Description'' |\n| {{{`bind`}}} | |name | |empty | |attached Adam cell or Mission [[Data Pump|Data Pumps]] |\n| {{{`guide_mask`}}} | |array | |[ ] | |whether to align the widget vertically by baseline or horizontally by the end of a widget's name, one of {{{`guide_baseline`}}} or {{{`guide_label`}}} |\n| {{{`horizontal`}}} | |alignment | |{{{`align_left`}}} | |horizontal position of the widget within its container, one of {{{`align_left`}}}, {{{`align_right`}}}, {{{`align_center`}}}, or {{{`align_fill`}}} |\n| {{{`name`}}} | |string | |"" | |displayed name of the widget |\n| {{{`vertical`}}} | |alignment | |{{{`align_top`}}} | |vertical position of the widget within its container, one of {{{`align_top`}}}, {{{`align_bottom`}}}, {{{`align_center`}}}, or {{{`align_fill`}}} |\nAll container widgets have the following attributes (same as for [[Adobe UI Core|//opensource.adobe.com/group__widget__reference.html]] container widgets):\n| ''Attribute'' | | ''Type'' | | ''Default value'' | | ''Description'' |\n| {{{`child_horizontal`}}} | |alignment | |{{{`align_left`}}} | | horizontal position of all child widgets within the container (unless the child widget defines its own {{{`horizontal`}}} alignment), one of {{{`align_left`}}}, {{{`align_right`}}}, {{{`align_center`}}}, or {{{`align_fill`}}} |\n| {{{`child_vertical`}}} | |alignment | |{{{`align_top`}}} | | vertical position of all child widgets within the container (unless the child widget defines its own {{{`vertical`}}} alignment), one of {{{`align_top`}}}, {{{`align_bottom`}}}, {{{`align_center`}}}, or {{{`align_fill`}}} |\n| {{{`placement`}}} | |placement | |{{{`place_column`}}}| | whether the container should lay out its children in a row or a column, one of {{{`place_row`}}} or {{{`place_column`}}} |\n| {{{`spacing`}}} | |number or array | |{{{`space_normal`}}}| | how many pixels of space to put between the children, either a number (the number of pixels) or an array of N-1 numbers (the spaces in pixels between N children) |\nNote that this:\n{{{\ndialog( placement: place_row ) {\n static_text( ... );\n ...\n}\n}}}\nis the same as this:\n{{{\ndialog() {\n row() {\n static_text( ... );\n ...\n }\n}\n}}}\n!!!dynamic_text\nThe {{{`dynamic_text`}}} widget is similar to the {{{`static_text`}}} widget in initial appearance. It can be bound to a string (either in the Adam sheet or through a [[Data Pump|Data Pumps]]) and supports editing in place (this behavior is the same as renaming files in Windows Explorer). Because the string length is dynamic, the {{{`horizontal`}}} attribute should always be set to {{{`align_fill`}}} as in this example:\n{{{\ndynamic_text( horizontal: align_fill, \n bind: model( url: "file:///home/ralpht", \n attribute: "name" ) );\n}}}\n\n!!!generator\nSee [[Generator]].\n!!!icon\nThe {{{`icon`}}} widget or view can draw the icon (small picture) corresponding to a model. Example (as you would write in an Eve file):\n{{{\nicon( bind: model( url: "file://localhost//file", attribute: "icon"), \n size: 22 );\n}}}\nOther than the standard {{{`bind`}}} attribute and standard layout attributes {{{`horizontal`}}} and {{{`vertical`}}}, the icon view also has a {{{`size`}}} attribute for specifying the width and height of the icon in pixels. (All icons are square.) Allowable values are {{{`16`}}}, {{{`22`}}}, {{{`32`}}}, {{{`64`}}} and {{{`128`}}}.\n!!!image (container)\nThe {{{`image`}}} widget can draw an image, scaling it to fit within its bounds. It maintains the aspect ratio of the contained image. Example (as you would write in an Eve file):\n{{{\nimage( bind: model( url: "file://localhost//image", \n attribute: "data") );\n}}}\nThe {{{`image`}}} widget has no attributes other than standard {{{`bind`}}} attribute, container attributes {{{`child_horizontal`}}} and {{{`child_vertical`}}}, and layout attributes {{{`horizontal`}}} and {{{`vertical`}}}.\n!!!item (container), to be renamed selectable\nThe {{{`item`}}} container can be used to make its child widgets selectable. It works a bit like a [[radio_button|//opensource.adobe.com/group__widget__reference.html#wr_container_common_attributes]]. When {{{`item`}}} is clicked, it sets its value into the Adam cell that is specified to {{{`bind`}}}; whenever the value of the Adam cell equals the given {{{`on_value`}}}, the widget draws its background in a different color to indicate that the item is selected. Example (as you would write in an Eve file):\n{{{\nitem( on_value: "unique-text-string", bind: @selection ) \n { ... }\n}}}\nThe {{{`item`}}} widget uses the {{{`on_value`}}} parameter to specify the value ("unique-text-string" in this example) that it puts into the Adam cell to which it's bound ({{{`@selection`}}} in this example).\n!!!scroll (container)\nThe {{{`scroll`}}} widget or view puts scrollbars around its child widgets. This widget is particularly useful for scrolling lists made with the [[Generator]]. Example (as you would write in an Eve file):\n{{{\nscroll( horizontal: align_fill, vertical: align_fill ) {\n column() {\n static_text( name: "Scrolled static text #1" );\n static_text( name: "Scrolled static text #2" );\n ...\n }\n}\n}}}\nThe {{{`scroll`}}} view has {{{`min_width`}}} and {{{`min_height`}}} attributes that can be used (optionally) to assign its minimum width or height in pixels. The {{{`align_fill`}}} attribute can be used to make the {{{`scroll`}}} view occupy all available space and grow when more space becomes available, as shown in the above example.\nUnder certain conditions, you may wish to optimize {{{`scroll`}}} views that are paired up with {{{`generator`}}} widgets. If you know that all the items created by the generator will have exactly the same dimensions, then you can tell the generator to delay creating items that are not visible until they become visible (that is, until the user scrolls the scroll view to reveal them). This can save memory and can make window startup times faster. This virtual behavior can be enabled as in this example Eve file:\n{{{\nscroll( horizontal: align_fill, \n min_height: 200, \n virtual_box: @scrollbox ) {\n table() {\n generator( bind: @items, \n iterator: @i, \n virtual_box: @scrollbox ) {\n static_text( name: @i );\n }\n }\n}\n}}}\nBoth {{{`scroll`}}} and {{{`generator`}}} support the {{{`virtual_box`}}} attribute which binds to a cell in the sheet. The cell must exist (that is, you must have defined it in your Adam file), and paired generators and scroll views must bind to the same cell.\nWhen the {{{`gravity`}}} parameter is set to {{{`true`}}}, then when an item is selected the {{{`scroll`}}} view will scroll automatically to show that item:\n{{{\nscroll( horizontal: align_fill, \n vertical: align_fill, \n gravity: true ) {\n item( ... ) { ... }\n}\n}}}\n\n!!!table (container)\nThe {{{`table`}}} container can be used to put children into a row that wraps when it runs out of horizontal space. Example (as you would write in an Eve file):\n{{{\ntable() {\n ... children, possibly from a generator ...\n}\n}}}\nThe {{{`horizontal`}}} and {{{`vertical`}}} attributes are set to {{{`align_fill`}}} internally, it's not possible to use other alignments (nor does it make sense, use a {{{`row`}}} or {{{`column`}}} instead).\n\n