<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://cegui.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Capek</id>
		<title>CEGUI Wiki - Crazy Eddie's GUI System (Open Source) - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://cegui.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Capek"/>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/Special:Contributions/Capek"/>
		<updated>2026-05-18T15:35:07Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=PyCEGUI&amp;diff=4364</id>
		<title>PyCEGUI</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=PyCEGUI&amp;diff=4364"/>
				<updated>2011-03-13T13:33:55Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}} {{VersionAtLeast|0.7.5}}&lt;br /&gt;
&lt;br /&gt;
Since CEGUI 0.7.5 official python bindings are provided. The main reason for that is that the new CEGUI tools are written completely in python. As a nice side effect, everybody can use the bindings standalone in their python only apps as well as embedded python apps for scripting and what not.&lt;br /&gt;
&lt;br /&gt;
== Where to get the bindings? ==&lt;br /&gt;
We provide ready to go packages for win32 platform since it's fairly hard to get things going there. You can get them at [http://pypi.python.org/pypi/PyCEGUI/0.7.5 the pypi repository]. For other platforms, please just download the SDK and use bindings you find there. You can also use Win32 bindings from the SDK if you use embedded python, it can be easier than installing the aforementioned package.&lt;br /&gt;
&lt;br /&gt;
== Base app ==&lt;br /&gt;
I will provide a little base application below so you know the basics of how to use CEGUI in python environment. OpenGL is used in the base app.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
from OpenGL.GL import *&lt;br /&gt;
from OpenGL.GLU import *&lt;br /&gt;
from OpenGL.GLUT import *&lt;br /&gt;
&lt;br /&gt;
# you must have PyCEGUI python package installed (see pypi repository)&lt;br /&gt;
# or you must make it work yourself using binary bindings from SDK&lt;br /&gt;
import PyCEGUI&lt;br /&gt;
import PyCEGUIOpenGLRenderer&lt;br /&gt;
&lt;br /&gt;
CEGUI_PATH = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class BaseApp(object):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        glutInit(sys.argv)&lt;br /&gt;
        glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA)&lt;br /&gt;
        glutInitWindowSize(1280, 1024)&lt;br /&gt;
        glutInitWindowPosition(100, 100)&lt;br /&gt;
        glutCreateWindow(&amp;quot;Crazy Eddie's GUI Mk-2 - glut Base Application&amp;quot;)&lt;br /&gt;
        glutSetCursor(GLUT_CURSOR_NONE)&lt;br /&gt;
        &lt;br /&gt;
        glutDisplayFunc(self.displayFunc)&lt;br /&gt;
        glutReshapeFunc(self.reshapeFunc)&lt;br /&gt;
        glutMouseFunc(self.mouseFunc)&lt;br /&gt;
        glutMotionFunc(self.mouseMotionFunc)&lt;br /&gt;
        glutPassiveMotionFunc(self.mouseMotionFunc)&lt;br /&gt;
    &lt;br /&gt;
        PyCEGUIOpenGLRenderer.OpenGLRenderer.bootstrapSystem()&lt;br /&gt;
        &lt;br /&gt;
    def __del__(self):&lt;br /&gt;
        PyCEGUIOpenGLRenderer.OpenGLRenderer.destroySystem()&lt;br /&gt;
        &lt;br /&gt;
    def initialiseResources(self):&lt;br /&gt;
        rp = PyCEGUI.System.getSingleton().getResourceProvider()&lt;br /&gt;
&lt;br /&gt;
        rp.setResourceGroupDirectory(&amp;quot;schemes&amp;quot;, CEGUI_PATH + &amp;quot;/datafiles/schemes&amp;quot;)&lt;br /&gt;
        rp.setResourceGroupDirectory(&amp;quot;imagesets&amp;quot;, CEGUI_PATH + &amp;quot;/datafiles/imagesets&amp;quot;)&lt;br /&gt;
        rp.setResourceGroupDirectory(&amp;quot;fonts&amp;quot;, CEGUI_PATH + &amp;quot;/datafiles/fonts&amp;quot;)&lt;br /&gt;
        rp.setResourceGroupDirectory(&amp;quot;layouts&amp;quot;, CEGUI_PATH + &amp;quot;/datafiles/layouts&amp;quot;)&lt;br /&gt;
        rp.setResourceGroupDirectory(&amp;quot;looknfeels&amp;quot;, CEGUI_PATH + &amp;quot;/datafiles/looknfeel&amp;quot;)&lt;br /&gt;
        rp.setResourceGroupDirectory(&amp;quot;schemas&amp;quot;, CEGUI_PATH + &amp;quot;/datafiles/xml_schemas&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        PyCEGUI.Imageset.setDefaultResourceGroup(&amp;quot;imagesets&amp;quot;)&lt;br /&gt;
        PyCEGUI.Font.setDefaultResourceGroup(&amp;quot;fonts&amp;quot;)&lt;br /&gt;
        PyCEGUI.Scheme.setDefaultResourceGroup(&amp;quot;schemes&amp;quot;)&lt;br /&gt;
        PyCEGUI.WidgetLookManager.setDefaultResourceGroup(&amp;quot;looknfeels&amp;quot;)&lt;br /&gt;
        PyCEGUI.WindowManager.setDefaultResourceGroup(&amp;quot;layouts&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        parser = PyCEGUI.System.getSingleton().getXMLParser()&lt;br /&gt;
        if parser.isPropertyPresent(&amp;quot;SchemaDefaultResourceGroup&amp;quot;):&lt;br /&gt;
            parser.setProperty(&amp;quot;SchemaDefaultResourceGroup&amp;quot;, &amp;quot;schemas&amp;quot;)     &lt;br /&gt;
        &lt;br /&gt;
    def setupUI(self):&lt;br /&gt;
        PyCEGUI.SchemeManager.getSingleton().create(&amp;quot;VanillaSkin.scheme&amp;quot;)&lt;br /&gt;
        PyCEGUI.SchemeManager.getSingleton().create(&amp;quot;TaharezLook.scheme&amp;quot;)&lt;br /&gt;
        PyCEGUI.System.getSingleton().setDefaultMouseCursor(&amp;quot;Vanilla-Images&amp;quot;, &amp;quot;MouseArrow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        root = PyCEGUI.WindowManager.getSingleton().loadWindowLayout(&amp;quot;VanillaWindows.layout&amp;quot;)&lt;br /&gt;
        PyCEGUI.System.getSingleton().setGUISheet(root)&lt;br /&gt;
        &lt;br /&gt;
        self.wnd = PyCEGUI.WindowManager.getSingleton().createWindow(&amp;quot;TaharezLook/FrameWindow&amp;quot;, &amp;quot;Demo Window&amp;quot;)&lt;br /&gt;
        root.addChildWindow(self.wnd)&lt;br /&gt;
         &lt;br /&gt;
    def run(self):&lt;br /&gt;
        self.initialiseResources()&lt;br /&gt;
        self.setupUI()&lt;br /&gt;
    &lt;br /&gt;
        self.lastFrameTime = glutGet(GLUT_ELAPSED_TIME)&lt;br /&gt;
        self.updateFPS = 0&lt;br /&gt;
        glutMainLoop()&lt;br /&gt;
        &lt;br /&gt;
    def displayFunc(self):&lt;br /&gt;
        thisTime = glutGet(GLUT_ELAPSED_TIME)&lt;br /&gt;
        elapsed = (thisTime - self.lastFrameTime) / 1000.0&lt;br /&gt;
        self.lastFrameTime = thisTime&lt;br /&gt;
        self.updateFPS = self.updateFPS - elapsed&lt;br /&gt;
        &lt;br /&gt;
        PyCEGUI.System.getSingleton().injectTimePulse(elapsed)&lt;br /&gt;
&lt;br /&gt;
        # do rendering for this frame.&lt;br /&gt;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)&lt;br /&gt;
        PyCEGUI.System.getSingleton().renderGUI()&lt;br /&gt;
        glutPostRedisplay()&lt;br /&gt;
        glutSwapBuffers()&lt;br /&gt;
    &lt;br /&gt;
    def reshapeFunc(self, width, height):&lt;br /&gt;
        glViewport(0, 0, width, height)&lt;br /&gt;
        glMatrixMode(GL_PROJECTION)&lt;br /&gt;
        glLoadIdentity()&lt;br /&gt;
        gluPerspective(60.0, width / height, 1.0, 50.0)&lt;br /&gt;
        glMatrixMode(GL_MODELVIEW)&lt;br /&gt;
        PyCEGUI.System.getSingleton().notifyDisplaySizeChanged(PyCEGUI.Size(width, height))&lt;br /&gt;
        &lt;br /&gt;
    def mouseFunc(self, button, state, x, y):&lt;br /&gt;
        if button == GLUT_LEFT_BUTTON:&lt;br /&gt;
            if state == GLUT_UP:&lt;br /&gt;
                PyCEGUI.System.getSingleton().injectMouseButtonUp(PyCEGUI.LeftButton)&lt;br /&gt;
            else:&lt;br /&gt;
                PyCEGUI.System.getSingleton().injectMouseButtonDown(PyCEGUI.LeftButton)&lt;br /&gt;
                &lt;br /&gt;
        elif button == GLUT_RIGHT_BUTTON:&lt;br /&gt;
            if state == GLUT_UP:&lt;br /&gt;
                PyCEGUI.System.getSingleton().injectMouseButtonUp(PyCEGUI.RightButton)&lt;br /&gt;
            else:&lt;br /&gt;
                PyCEGUI.System.getSingleton().injectMouseButtonDown(PyCEGUI.RightButton)&lt;br /&gt;
        &lt;br /&gt;
    def mouseMotionFunc(self, x, y):&lt;br /&gt;
        PyCEGUI.System.getSingleton().injectMousePosition(x, y)&lt;br /&gt;
&lt;br /&gt;
app = BaseApp()&lt;br /&gt;
app.run()&lt;br /&gt;
del app&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I must say that this app isn't perfect or complete but it will get you going. You might want to make it exception safe and add keyboard injection. If you do that, please post it back here for others to benefit.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
Since the API is resembling the C++ version as closely as possible (mainly to avoid confusion and as easy switch between C++ and Python as possible), doxygen API docs apply for most of the classes. Doxygen comments are also extracted and added to __doc__ of all the python classes and methods, using python docstrings is therefore possible but not perfect.&lt;br /&gt;
&lt;br /&gt;
== Subscriptions ==&lt;br /&gt;
One major thing that isn't documented in doxygen or other wiki docs and that is important in python is how subscriptions work.&lt;br /&gt;
&lt;br /&gt;
Subscribing to listenerClass:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
wnd.subscribeEvent(PyCEGUI.Window.EventMouseEnters, listenerClass, &amp;quot;methodInThatClass&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subscribing to a free function:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
wnd.subscribeEvent(PyCEGUI.Window.EventMouseEnters, PythonModule.freeFunction)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User Data ==&lt;br /&gt;
CEGUI has setUserData and getUserData methods in several classes. This is not exposed to Python at all. You can do something much much nicer and comfier in Python though:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
a = PyCEGUI.ListboxTextItem(&amp;quot;SSSS&amp;quot;)&lt;br /&gt;
a.myUserData = &amp;quot;AAAAA&amp;quot; # myUserData can be anything, player, ship, whatever&lt;br /&gt;
print a.myUserData # prints AAAAA&lt;br /&gt;
&lt;br /&gt;
# you can ofcourse have more of these user data custom attributes&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
'''These do NOT persist when you pass them to C++ and back, I have to figure out a way to make them persist :-/ --[[User:Kulik]]'''&lt;br /&gt;
&lt;br /&gt;
== Implementation ==&lt;br /&gt;
We use py++ and boost::python. It allows rapid development of the bindings and a very easy maintenance. It may be a bit slower than SWIG and definitely slower than hand written bindings but since both of these won't happen, please don't cry about that fact (unless you are willing to create and maintain those). The slowness is very unlikely to be noticeable at all unless you do synthetic tests.&lt;br /&gt;
&lt;br /&gt;
== Caveats ==&lt;br /&gt;
C++ allows you to shoot yourself in a lot of ways whilst python is very limited in this area. For example if you create a window, get it and store the reference in python variable, then destroy the window, the python variable will hold a dangling pointer. This is something you have to take care of unfortunately, there is no way for us to handle this unless we affect the C++ interface which would hinder performance for C++ users. It's not that hard to handle this and unless you do something really unusual, you probably aren't going to trigger it.&lt;br /&gt;
&lt;br /&gt;
== Panda3D integration ==&lt;br /&gt;
morgul has integrated CEGUI with Panda via these bindings - [http://www.panda3d.org/forums/viewtopic.php?t=10814 Pure python Panda CEGUI integration]&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Performance_tips&amp;diff=4363</id>
		<title>Performance tips</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Performance_tips&amp;diff=4363"/>
				<updated>2011-03-13T13:33:45Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}} {{VersionBadge|0.8}}&lt;br /&gt;
&lt;br /&gt;
This page provides some generic tips on getting the most performance out of CEGUI. People often claim that CEGUI is slow and don't realise it could be them doing something wrong. I will try to gather some areas where people claim CEGUI is slow and &amp;quot;just sucks&amp;quot; and try to provide tips about what is wrong.&lt;br /&gt;
&lt;br /&gt;
== Debug vs Release mode ==&lt;br /&gt;
The performance difference between Debug and Release (optimisations enabled) CEGUI can be quite dramatic. Ensure you run everything in release mode when judging performance.&lt;br /&gt;
&lt;br /&gt;
== Small tiled images ==&lt;br /&gt;
A very common mistake. If you have a very small (lets say 1px * 1px image) in your imageset and you set your looknfeel to tile that image over 100 px, CEGUI has to generate a lot of triangles to fulfil your wishes! This will lead into very bad performance and should be avoided. Tiling is fine but keep it under control!&lt;br /&gt;
&lt;br /&gt;
(Note: Stretching doesn't have the same caveat, you can stretch 1px image over as many pixels as you want with just 2 triangles and one batch.)&lt;br /&gt;
&lt;br /&gt;
== [[Imageset]]s &amp;amp; Texture atlases ==&lt;br /&gt;
Texture switching is a very expensive operation, which is why CEGUI uses [[Imageset|imagesets]]. [[Imageset]]s allows you to put more images on one texture ([[imageset]] ~= texture atlas), thus (potentially) lowering the amount of texture switches when rendering. If you however are from the &amp;quot;[[Imageset]]s suck, it sucks that CEGUI uses them!&amp;quot; and use one bitmap file and one [[imageset]] per image, you might expect very poor performance (many many texture switches even when rendering a single widgets - all corners are in separate file, also batching is simply not possible since you need a separate texture per every rectangle, so one widget might end up being 20 batches or even more!).&lt;br /&gt;
&lt;br /&gt;
Bottom line is: Use [[Imageset|imagesets]], don't hate on them! And if you hate on them and use separate files, stop whining that CEGUI is slow and sucks :-D&lt;br /&gt;
&lt;br /&gt;
(Note: CEGUI 0.8 will completely change the way imagesets work. We will have images, these will simply have a reference to texture file and UV coords of the rectangle we should use in the texture file, .imageset files will still load though, so all of this still applies, furthermore the new [[CEED]] editor will support automatic imageset/atlas creation from multiple files to lessen the imageset maintenance pain)&lt;br /&gt;
&lt;br /&gt;
== Problem: Loading layouts takes few seconds and halts my application! ==&lt;br /&gt;
This is a complaint I have seen multiple times. The reporter usually has a dialog that in its constructor loads a XML layout off the HDD and constructs its hierarchy based on that. Depending on how the layout is complex, this can indeed take a few seconds (depending on many many factors). What is flawed about this is the fact that the user loads the layout always when the dialog is constructed. Wouldn't it be better if we loaded the layout once, stored it somewhere and reused that whenever the dialog has to reappear instead of deleting the layout when user closes the dialog and loading it from scratch when it's opened?&lt;br /&gt;
&lt;br /&gt;
There are two ways of avoiding this. If the dialog is modal and can only appear once, it pays off to just load it, set it to invisible and the show/hide as necessary. This is the fastest solution.&lt;br /&gt;
&lt;br /&gt;
If you need multiple instances of the dialog, you need to clone the widget tree somehow. This is why Widget (Window in 0.7 and previous) ::clone method has been implemented (only CEGUI 0.7.5 and newer!). It allows you to clone the entire widget hiearchy. The idea is to load this when the dialog is first used (or even when loading the application, depends on how the dialog is used). Store the widget pointer somewhere (could be a static member variable in the Dialog class) and upon construction, just clone the hierarchy and add the cloned widget while leaving the original alone for further cloning.&lt;br /&gt;
(TODO: add some example code)&lt;br /&gt;
&lt;br /&gt;
== Speeding up a rarely changing info window (or any widget) with complex elements inside it ==&lt;br /&gt;
CEGUI allows caching. This is done with the &amp;quot;AutoRenderingSurface&amp;quot; property. What this means is that the widget gets rendered once with its child widgets (the entire hierarchy). The result is stored in a texture and from this moment on, whenever rendering needs to be done, just one quad with the texture is drawn. When widgets change inside, it invalidates the cache and everything is redrawn from scratch. This is especially useful for complex deep hierarchy widgets that users rarely interact with or aren't interactive at all.&lt;br /&gt;
&lt;br /&gt;
Caveat: The texture caching causes the widget to hard clip its children to its dimensions! That means that a combobox at the bottom of a frame window will get &amp;quot;cut&amp;quot; when you open the options of it. This is likely to get fixed but as of now (5th January 2011) it's still a problem in both 0.7 and 0.8.&lt;br /&gt;
&lt;br /&gt;
== A quick and (relatively) painless way to get roughly 40% performance increase in certain areas (0.8 only!) ==&lt;br /&gt;
By default, CEGUI uses no custom allocators at all. That means the plain old new and delete. You can set the allocator to anything you want but we recommend nedmalloc. It's a very robust memory allocator tailored to give maximum performance. It speeds things up especially when initialising, loading layouts, creating windows, ... Give it a try. See [[Memory Allocation]] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;br /&gt;
[[Category:WIP]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_User_Data&amp;diff=4362</id>
		<title>CEGUI In Practice - User Data</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_User_Data&amp;diff=4362"/>
				<updated>2011-03-13T12:38:06Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|7}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CEGUI InPractice 7 ==&lt;br /&gt;
&lt;br /&gt;
This tutorial will be a short tutorial, as i will show how to do a small addon to the previous tutorial [[CEGUI In Practice - A Game Console]] showing you how to associate the ConsoleRoot with our GameConsoleWindow class. While not terribly useful in this situation, it can demonstrate a useful feature that you likely will use in your own game.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== UserData ====&lt;br /&gt;
&lt;br /&gt;
User data in CEGUI is basically a void pointer. This allows you to assign a custom structure or variable to each cegui window. This is extremely useful as it allows you to greater incorporate CEGUI into your development. For the previous example we created a Class to encompass our Console window which was great as it allowed us to easily encapsulate all the CEGUI windows and their handlers into a neat and easy to use function. It was pretty easy to go from GameConsoleWindow to each of the classes (by accessing the m_ConsoleWindow in the class and getChild() method). However, its not so easy to from the CEGUI::Window back up to the class level without recompiling CEGUI and creating custom widgets, unless you use userData. &lt;br /&gt;
&lt;br /&gt;
Its almost so easy to use that its a waste of wiki space to show this, but regardless I see alot of posts about it on the IRC channel. Here is a line we would add to our CreateCEGUIWindow(); function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::CreateCEGUIWindow()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  &lt;br /&gt;
            CEGUI::System::getSingleton().getGUISheet()-&amp;gt;addChildWindow(m_ConsoleWindow);&lt;br /&gt;
            (this)-&amp;gt;RegisterHandlers();&lt;br /&gt;
            m_ConsoleWindow-&amp;gt;setUserData(this);    // &amp;lt;------ Add this line&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That adds a pointer to the class we're currently in, which is an instance of GameConsoleWindow. Note tho, it stores this as a void* so when we go back to this pointer later, it will not know what type of data this is, so you will need to cast it back:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
     GameConsoleWindow *ConsoleClass = NULL;&lt;br /&gt;
&lt;br /&gt;
     ConsoleClass = static_cast&amp;lt;GameConsoleWindow*&amp;gt;(m_ConsoleWindow-&amp;gt;getUserData());&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will convert the void* we stored above, into the ConsoleClass pointer. You could probably use dynamic_cast but then you'd need to turn on RTT, which is not always required for performance reasons. Regardless you can see how easily this is done. We will use this in a later tutorial demonstrating how to implement an inventory system.&lt;br /&gt;
&lt;br /&gt;
Until next time..&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_Game_Console&amp;diff=4361</id>
		<title>CEGUI In Practice - A Game Console</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_Game_Console&amp;diff=4361"/>
				<updated>2011-03-13T12:37:54Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|6}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI InPractice 6 ==&lt;br /&gt;
&lt;br /&gt;
Welcome back! This tutorial we will put together the knowledge from the past few chapters to create a functioning Console window. The last few tutorials have given us the basics. Now its time to put that knowledge to use and make something we can use in our game.&lt;br /&gt;
&lt;br /&gt;
==== Game Plan ====&lt;br /&gt;
&lt;br /&gt;
Okay, now lets look at what we need to do. We will want to be able to type in commands, press the send button, and have them output into the text box. We will also probably want to acknowledge when enter is pressed as thats the 'normal' feel of typing into a chat.&lt;br /&gt;
&lt;br /&gt;
We discussed earlier how to send input to CEGUI ([[CEGUI In Practice - Managing input]]), so we will have to assume that you have that working (and probably built the application structure behind it). We will also assume you used the previous tutorial's layout file and naming for the console window ( [[CEGUI In Practice - Using .layout files]]).&lt;br /&gt;
&lt;br /&gt;
Due to the fact that we are getting to a slightly more advanced implementation of CEGUI here, and because we may want the ConsoleWindow to do other more useful things (like parsing strings for /say commands) I'm going to create a class to encompass the CEGUI ConsoleWindow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class GameConsoleWindow&lt;br /&gt;
{&lt;br /&gt;
    public:&lt;br /&gt;
       GameConsoleWindow();                   // Constructor&lt;br /&gt;
    private:&lt;br /&gt;
       void CreateCEGUIWindow();                                  // The function which will load in the CEGUI Window and register event handlers&lt;br /&gt;
       void RegisterHandlers();                                   // Register our handler functions&lt;br /&gt;
       void Handle_TextSubmitted(const CEGUI::EventArgs &amp;amp;e);      // Handle when we press Enter after typing&lt;br /&gt;
       void Handle_SendButtonPressed(const CEGUI::EventArgs &amp;amp;e);  // Handle when we press the Send button         &lt;br /&gt;
       void ParseText(CEGUI::String inMsg);                       // Parse the text the user submitted.&lt;br /&gt;
       void OutputText(CEGUI::String inMsg,                       // Post the message to the ChatHistory listbox.&lt;br /&gt;
              CEGUI::Colour colour = CEGUI::Colour( 0xFFFFFFFF)); //   with a white color default&lt;br /&gt;
       &lt;br /&gt;
       CEGUI::Window *m_ConsoleWindow;                            // This will be a pointer to the ConsoleRoot window.&lt;br /&gt;
       CEGUI::String sNamePrefix;                                  // This will be the prefix name we give the layout&lt;br /&gt;
       static int iInstanceNumber;                                 // This will be the instance number for this class. &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright, so that will be our class. It might look daunting, but don't worry it will all make sense in the end.&lt;br /&gt;
&lt;br /&gt;
==== The Constructor ====&lt;br /&gt;
&lt;br /&gt;
I'm going to use the constructor as the main point of automation here. And while I believe it is normally bad practice to call functions which could potentially fail within a constructor, i'm going to anyway for ease of this tutorial. We will have it Initialize some variables, and then call the CreateCEGUIWindow function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
GameConsoleWindow::GameConsoleWindow()&lt;br /&gt;
{&lt;br /&gt;
   m_ConsoleWindow = NULL;       // Always good practice to initialize a pointer to a NULL value, helps when switching to Release Builds.&lt;br /&gt;
   iInstanceNumber = 0;&lt;br /&gt;
   sNamePrefix = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Setting up the Window ====&lt;br /&gt;
&lt;br /&gt;
Now we need to setup the window. We have done this before in the .layout tutorial so we will do it again here. However, we mentioned before that you could use a prefix when loading a .layout to avoid name conflicts if you load multiple layouts. So we need to account for that. Will we need multiple consoles? Who knows, might as well build it in while we're designing it right?&lt;br /&gt;
&lt;br /&gt;
Lets write the CreateCEGUIWindow function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::CreateCEGUIWindow()&lt;br /&gt;
{&lt;br /&gt;
	// Get a local pointer to the CEGUI Window Manager, Purely for convenience to reduce typing&lt;br /&gt;
	CEGUI::WindowManager *pWindowManager = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
&lt;br /&gt;
        // Now before we load anything, lets increase our instance number to ensure no conflicts.  &lt;br /&gt;
        // I like the format #_ConsoleRoot so thats how i'm gonna make the prefix.  This simply&lt;br /&gt;
        // Increments the iInstanceNumber then puts it + a _ into the sNamePrefix string. &lt;br /&gt;
        sNamePrefix = ++iInstanceNumber + &amp;quot;_&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        // Now that we can ensure that we have a safe prefix, and won't have any naming conflicts lets create the window&lt;br /&gt;
        // and assign it to our member window pointer m_ConsoleWindow&lt;br /&gt;
        m_ConsoleWindow = pWindowManager-&amp;gt;loadWindowLayout(inLayoutName,sNamePrefix);&lt;br /&gt;
&lt;br /&gt;
        // Being a good programmer, its a good idea to ensure that we got a valid window back. &lt;br /&gt;
        if (m_ConsoleWindow)&lt;br /&gt;
        {&lt;br /&gt;
            // Lets add our new window to the Root GUI Window&lt;br /&gt;
            CEGUI::System::getSingleton().getGUISheet()-&amp;gt;addChildWindow(m_ConsoleWindow);&lt;br /&gt;
            // Now register the handlers for the events (Clicking, typing, etc)&lt;br /&gt;
            (this)-&amp;gt;RegisterHandlers();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Something bad happened and we didn't successfully create the window lets output the information&lt;br /&gt;
            CEGUI::Logger::getSingleton().logEvent(&amp;quot;Error: Unable to load the ConsoleWindow from .layout&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright so that created the window. And after the window was created, we Registered its handlers. Lets look at how we go about&lt;br /&gt;
registering those handlers. Below is the RegisterHandlers function, it will probably look familiar if you have been reading along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::RegisterHandlers()&lt;br /&gt;
{&lt;br /&gt;
    // Alright now we need to register the handlers.  We mentioned above we want to acknowledge when the user presses Enter, and &lt;br /&gt;
      // when they click the 'Send' button.  So we need to register each of those events&lt;br /&gt;
&lt;br /&gt;
    // First lets register the Send button.  Our buttons name is &amp;quot;ConsoleRoot/SendButton&amp;quot;, but don't forget we prepended a name to      &lt;br /&gt;
      // all the windows which were loaded.  So we need to take that into account here.&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/SendButton&amp;quot;)-&amp;gt;subscribeEvent(&lt;br /&gt;
                        CEGUI::PushButton::EventClicked,    // If we recall our button was of type CEGUI::PushButton in the .scheme&lt;br /&gt;
                                                            // and we want to acknowledge the EventClicked action.&lt;br /&gt;
                        CEGUI::Event::Subscriber(           // What function to call when this is clicked.  Remember, all functions &lt;br /&gt;
                                                            // are contained within (this) class.&lt;br /&gt;
                        &amp;amp;GameConsoleWindow::Handle_SendButtonPressed,  // Call Handle_SendButtonPressed member of GameConsoleWindow&lt;br /&gt;
                        this));                             // Using (this) instance we're in right now&lt;br /&gt;
&lt;br /&gt;
    // Now for the TextSubmitted, we will be registering the event on the edit box, which is where the users cursor will be when   &lt;br /&gt;
      //they press Enter.  I'm not going to break this down as much, because I believe that is very ugly to read, but was a good  &lt;br /&gt;
      //way of expressing it.  Here is the function call.&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;subscribeEvent(CEGUI::Editbox::EventMouseClick,&lt;br /&gt;
                        CEGUI::Event::Subscriber(&amp;amp;GameConsoleWindow::Handle_TextSubmitted,this));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That last line looks pretty ugly, but remember if you include namespace CEGUI; you won't have all those Ugly CEGUI:: prefixing all the code. As you can see, once you get the hang of registering events its pretty easy. One thing to note, is there are more than one way to account for certain actions. On the button, you could also have registered for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    CEGUI::PushButton::EventMouseClick&lt;br /&gt;
    CEGUI::PushButton::EventMouseButtonDown&lt;br /&gt;
    CEGUI::PushButton::EventMouseButtonUp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Depending on what result you were looking for, and where you wanted the action to take place. For example, windows interfaces usually react on the MouseButtonUp, allowing the user to click it, and then slide off the mouse if it wasn't what they really wanted to press.&lt;br /&gt;
&lt;br /&gt;
==== The Handlers ====&lt;br /&gt;
&lt;br /&gt;
Now that we have registered the events, we need to actually write the functions which will handle those events. We need to handle both the Text Submitted, and the SendButton's event. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::Handle_TextSubmitted(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
    // The following line of code is not really needed in this particular example, but is good to show.  The EventArgs by itself &lt;br /&gt;
     // only has limited uses. You will find it more useful to cast this to another type of Event.  In this case WindowEventArgs&lt;br /&gt;
     // could be much more useful as we are dealing with a CEGUI::Window.  Notably, this will allow you access to the .window&lt;br /&gt;
     // member of the argument, which will have a pointer to the window which called the event.  You can imagine that would be&lt;br /&gt;
     // useful!&lt;br /&gt;
    const CEGUI::WindowEventArgs* args = static_cast&amp;lt;const CEGUI::WindowEventArgs*&amp;gt;(&amp;amp;e);&lt;br /&gt;
&lt;br /&gt;
    // Now we need to get the text that is in the edit box right now.&lt;br /&gt;
    CEGUI::String Msg = mWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;getText();&lt;br /&gt;
&lt;br /&gt;
    // Since we have that string, lets send it to the TextParser which will handle it from here&lt;br /&gt;
    (this)-&amp;gt;ParseText(Msg);&lt;br /&gt;
&lt;br /&gt;
    // Now that we've finished with the text, we need to ensure that we clear out the EditBox.  This is what we would expect&lt;br /&gt;
      // To happen after we press enter&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you might be wondering why we didn't just Parse the text in here? Well If the user presses Enter, or presses the Send button the text will either way have to be parsed, and it will be parsed in the same manner. So why write the same code twice?&lt;br /&gt;
&lt;br /&gt;
Below is the code for handling the SendButton being pressed. I know I just harped on rewriting code, and this will ironically look alot like the Code for when text has been submitted. But thats because we don't really need the button to do much. We probably could have just had the ButtonPress trigger the Handle_TextSubmitted above when we registered the handlers, but what if we wanted a clicking noise to be played when the player pressed the button? Then we would need a seperate handler for the Send button. Anyway 'nuff said, lets show the code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::Handle_SendButtonPressed(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
    CEGUI::String Msg = mWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;getText();&lt;br /&gt;
    (this)-&amp;gt;ParseText(Msg);&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parsing that Text ====&lt;br /&gt;
&lt;br /&gt;
This portion is not going to be so much CEGUI Related as it will be string manipulation. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void GameConsoleWindow::ParseText(CEGUI::String inMsg); &lt;br /&gt;
&lt;br /&gt;
       // I personally like working with std::string. So i'm going to convert it here.&lt;br /&gt;
       std::string inString = inMsg.c_str();&lt;br /&gt;
&lt;br /&gt;
	if (inString.length() &amp;gt;= 1) // Be sure we got a string longer than 0&lt;br /&gt;
	{&lt;br /&gt;
		if (inString.at(0) == '/') // Check if the first letter is a 'command'&lt;br /&gt;
		{&lt;br /&gt;
			std::string::size_type commandEnd = inString.find(&amp;quot; &amp;quot;, 1);&lt;br /&gt;
			std::string command = inString.substr(1, commandEnd - 1);&lt;br /&gt;
			std::string commandArgs = inString.substr(commandEnd + 1, inString.length() - (commandEnd + 1));&lt;br /&gt;
			//convert command to lower case&lt;br /&gt;
			for(std::string::size_type i=0; i &amp;lt; command.length(); i++)&lt;br /&gt;
			{&lt;br /&gt;
				command[i] = tolower(command[i]);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Begin processing&lt;br /&gt;
&lt;br /&gt;
			if (command == &amp;quot;say&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				std::string outString = &amp;quot;You:&amp;quot; + inString; // Append our 'name' to the message we'll display in the list&lt;br /&gt;
                         	mConsole-&amp;gt;OutputMessage(outString);&lt;br /&gt;
			}&lt;br /&gt;
			else if (command == &amp;quot;quit&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				// do a /quit &lt;br /&gt;
			}&lt;br /&gt;
			else if (command == &amp;quot;help&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				// do a /help&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				std::string outString = &amp;quot;&amp;lt;&amp;quot; + inString + &amp;quot;&amp;gt; is an invalid command.&amp;quot;;&lt;br /&gt;
				(this)-&amp;gt;OutputText(outString,CEGUI::Colour(1.0f,0.0f,0.0f)); // With red ANGRY colors!&lt;br /&gt;
			}&lt;br /&gt;
		} // End if /&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
	 (this)-&amp;gt;OutputText(inString); // no commands, just output what they wrote&lt;br /&gt;
		}&lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Phew, thats kinda an annoying function isn't it? Well, the point to note is that it checks for a forward slash, if it finds one then it enters the if/else conditions to see if it found an applicable command. If it does it does something. In this example it handles the actions right there, if you were to write it a little more advanced, it could goto a (this)-&amp;gt;ShowHelp() or (this)-&amp;gt;QuitGame(). &lt;br /&gt;
&lt;br /&gt;
The point to note is the OutputText. That will add the items to the ListBox of Chat history. We will work on that function now.&lt;br /&gt;
&lt;br /&gt;
==== OutputText ====&lt;br /&gt;
&lt;br /&gt;
A point to note here. A CEGUI::Listbox window doesn't naturally word wrap. And wordwrapping is a very nice thing to have in a chat window, as everyone has different resolutions on their screens, and some people REALLY like to ramble! (But not this magnificant author of course!). So we will use a Custom created widget which is available on the forums [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=10&amp;amp;t=4322]. you could use a normal listbox, but you wouldn't get word-wrapping.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; &lt;br /&gt;
void GameConsoleWindow::OutputText(std::string message, CEGUI::Colour colour)&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
	// Get a pointer to the ChatBox so we don't have to use this ugly getChild function everytime.&lt;br /&gt;
	CEGUI::Listbox *outputWindow = static_cast&amp;lt;CEGUI::Listbox*&amp;gt;(m_ConsoleWindow-&amp;gt;getChild(&amp;quot;ConsoleRoot/ChatBox&amp;quot;));&lt;br /&gt;
	&lt;br /&gt;
	CEGUI::FormattedListboxTextItem *newItem=0; // This will hold the actual text and will be the listbox segment / item&lt;br /&gt;
&lt;br /&gt;
	newItem = new CEGUI::FormattedListboxTextItem(message,CEGUI::HTF_WORDWRAP_LEFT_ALIGNED); // Instance the Item with Left&lt;br /&gt;
                                                                                                   //   wordwrapped alignment&lt;br /&gt;
	newItem-&amp;gt;setTextColours(colour); // Set the text color&lt;br /&gt;
	outputWindow-&amp;gt;addItem(newItem); // Add the new ListBoxTextItem to the ListBox&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
And that ladies and gentleman, is our Console box. Not too terrible was it? Now of course, remember there are many ways to skin the proverbial cat. This is just an example of ways to do things. If you would like some homework, you could investigate why the SendButton does weird things when you drag and resize the window. I'll give you a hint, look at the way we're defining how big the ConsoleRoot is and where its child windows are placed... and what implications we might have by using relative scales for things.. Okay, i guess that was a big hint wasn't it! &lt;br /&gt;
&lt;br /&gt;
Till next time...&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_User_Data&amp;diff=4323</id>
		<title>CEGUI In Practice - User Data</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_User_Data&amp;diff=4323"/>
				<updated>2011-03-07T12:39:51Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CEGUI InPractice 7 ==&lt;br /&gt;
&lt;br /&gt;
This tutorial will be a short tutorial, as i will show how to do a small addon to the previous tutorial [[CEGUI In Practice - A Game Console]] showing you how to associate the ConsoleRoot with our GameConsoleWindow class. While not terribly useful in this situation, it can demonstrate a useful feature that you likely will use in your own game.&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_Main_Menu&amp;diff=4315</id>
		<title>The Main Menu</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_Main_Menu&amp;diff=4315"/>
				<updated>2011-03-06T01:38:23Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}} {{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
So, you've probably read all the Beginner Guide to X tutorials (if not then go back and read them !), your sitting there still feeling lost, and you can't find exactly how to bring all the stuff you've read together to make a simple GUI. I too found it specially hard to wrap everything together when starting out and hopefully this article should help address this problem for others, I'm still a beginner so there might be a few errors, but for the most part the code has been tested. This tutorial will be rather Ogre oriented since thats what I use, I'll try to keep things a little generic though.&lt;br /&gt;
&lt;br /&gt;
This tutorial was last updated on: 7th January 2008 by CrazyEddie&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
For tutorial purposes, we will quickly run over the Initialisation part (as this has been addressed in other tutorials more thoroughly and is usually engine specific). I will not litter the tutorial with unlrelated code like framelisteners, includes and other stuff. We will be making a main menu which is basicly just a collection of buttons and a StaticImage for background, but it is cruical that you have read the following tutorials and understood them, specially the file types.&lt;br /&gt;
[[http://www.cegui.org.uk/wiki/index.php/Tutorials#CrazyEddie.27s_Beginner_Guides CrazyEddie's Beginner Guides ]]&lt;br /&gt;
[[http://www.ogre3d.org/wiki/index.php/Basic_Tutorial_6 Ogre's Basic Tutorial 6]]&lt;br /&gt;
&lt;br /&gt;
== Creating the Menu: A plan of action ==&lt;br /&gt;
There are 3 ways to go about this, one way is to hardcode the menu (which is a bad idea unless you don't want your menu to be customisable), the 2nd way is to use although uses an xml based approach by writing layout files, imageset files..etc. The 3rd way is to use the falagard system which is subset of the 2nd approach, but expands even more on the functionality by offering the .looknfeel files which allow you to skin any existing scheme or even create your own. &lt;br /&gt;
&lt;br /&gt;
=== Prerequisites ===&lt;br /&gt;
Ok, before we get started we need to have a few things initialised first, other then Ogre root, scene manager, framelistener....etc. If you've read [[http://www.ogre3d.org/wiki/index.php/Basic_Tutorial_6 basic tutorial 6]] you'll see that we need to have the following defiendone of the looks loaded as well as a font. I'll be using TaharezLook and tahoma-12 for this tutorial, but I'll load the font at a later stage in the tutorial. I'll only use CEGUI:: in this area, but I'll drop using it since it'll be obvious where to use it after a while. Just assume I've used using namespace CEGUI; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Initialisation Area&lt;br /&gt;
CEGUI::OgreCEGUIRenderer* mGUIRenderer = new CEGUI::OgreCEGUIRenderer(Root::getSingleton().getAutoCreatedWindow(), Ogre::RENDER_QUEUE_OVERLAY, false, 3000);&lt;br /&gt;
CEGUI::System* mGUISystem = new CEGUI::System(mGUIRenderer);&lt;br /&gt;
CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative); // this is recommended to help with debugging, but not neccessary&lt;br /&gt;
&lt;br /&gt;
CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
mGUISystem-&amp;gt;setDefaultMouseCursor((CEGUI::utf8*)&amp;quot;TaharezLook&amp;quot;, (CEGUI::utf8*)&amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
CEGUI::Window* mRootWindow= CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)&amp;quot;DefaultWindow&amp;quot;, (CEGUI::utf8*)&amp;quot;RootWindow&amp;quot;);  &lt;br /&gt;
mGUISystem-&amp;gt;setGUISheet(mRootWindow); // set active Window&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: Casting string params to UTF8* isn't neccessary, if your application will only use english (latin based languages), it shouldn't be of any use. But if you want to use other languages which are not covered by the ascii chart, you can use the utf8 cast. I won't be using it for this tutorial, but it should be obvious where you can use it&lt;br /&gt;
*Note 2: While its totally legal to use different windows and have children assigned to them, I prefer to have a single root window in which all other windows are childs to it. I initialise it as DefaultWindow* to set it apart from other window types&lt;br /&gt;
*Note 3: You can start your app without initialising a font, so long as you use a Window that doesn't use fonts (e.g: StaticImages)&lt;br /&gt;
&lt;br /&gt;
==== Includes ====&lt;br /&gt;
As I said earlier, I won't be adding #include lines to the tutorial's code to make it smaller. But here is a helpful tip that should spare you wasted time looking for which header to include. &lt;br /&gt;
Unless you #included &amp;quot;CEGUI.h&amp;quot;, you'll need to #include a header when you use a CEGUI class. Since the naming convention of CEGUI is rather helpful. You can almost always count on that class being in &amp;quot;CEGUI'''ClassName'''.h&amp;quot;. Make sure to make the first letter of the word upper case. If the class is 2 words, then each first letter is upper case. Like so&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;CEGUISchemeManager.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUIFontManager.h&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
....etc :)&lt;br /&gt;
&lt;br /&gt;
=== The Code Approach ===&lt;br /&gt;
&lt;br /&gt;
There are a few things you'll constantly need when writing a menu, assuming your gui code is in a different class, we'll attempt to get pointers to them at the beginning of the code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
WindowManager* Wmgr = WindowManager::getSingletonPtr();&lt;br /&gt;
System* mGUISystem = System::getSingletonPtr();&lt;br /&gt;
Window* myRoot = Wmgr-&amp;gt;getWindow(&amp;quot;RootWindow&amp;quot;); // get default window&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== The Menu code ====&lt;br /&gt;
Anyways, now that we got that out of the way, lets get started. I'll write code, then explain it below&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Menu Background&lt;br /&gt;
Window* MenuBackground = Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/StaticImage&amp;quot;, &amp;quot;Background&amp;quot;);&lt;br /&gt;
myRoot-&amp;gt;addChildWindow( MenuBackground );&lt;br /&gt;
MenuBackground-&amp;gt;setPosition( UVector2( UDim( 0.0f, 0.0f ), UDim( 0.0f, 0.0f) ) );&lt;br /&gt;
MenuBackground-&amp;gt;setSize( UVector2( UDim( 1.0f, 0.0f ), UDim( 1.0f, 0.0f ) ) );  // full screen&lt;br /&gt;
&lt;br /&gt;
// New game Button &lt;br /&gt;
PushButton* NewGame = (PushButton*)Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;NewGame&amp;quot;);&lt;br /&gt;
MenuBackground-&amp;gt;addChildWindow( NewGame );&lt;br /&gt;
NewGame-&amp;gt;setPosition( UVector2( UDim( 0.2f, 0.0f), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
NewGame-&amp;gt;setSize( UVector2( UDim( 0.4f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
&lt;br /&gt;
// Load game Button &lt;br /&gt;
PushButton* LoadGame= (PushButton*)Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;LoadGame&amp;quot;);&lt;br /&gt;
MenuBackground-&amp;gt;addChildWindow( LoadGame );&lt;br /&gt;
LoadGame-&amp;gt;setPosition( UVector2( UDim( 0.2f, 0.0f ), UDim( 0.45f, 0.0f ) ) );&lt;br /&gt;
LoadGame-&amp;gt;setSize( UVector2( UDim( 0.4f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
&lt;br /&gt;
// Quit game Button &lt;br /&gt;
PushButton* QuitGame= (PushButton*)Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;QuitGame&amp;quot;);&lt;br /&gt;
MenuBackground-&amp;gt;addChildWindow( QuitGame );&lt;br /&gt;
QuitGame-&amp;gt;setPosition( UVector2( UDim( 0.2f, 0.0f ), UDim( 0.7f, 0.0f ) ) );&lt;br /&gt;
QuitGame-&amp;gt;setSize( UVector2( UDim( 0.4f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
&lt;br /&gt;
mGUISystem-&amp;gt;setGUISheet(myRoot); // this line is redundant since you didn't change gui sheets, but its here to make sure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will create a menu with 3 empty buttons positioned below each other with an empty background. You always need to define the starting position of the window (the top left edge) and how big the window will be. If you don't you'll never see the window.&lt;br /&gt;
You'll see that the 3 buttons are childs of the Background Menu window, which is a child of the RootWindow.&lt;br /&gt;
&lt;br /&gt;
==== Changing the look ====&lt;br /&gt;
But this is no fun, we want to set Images to the buttons, display text on them, perhaps even use tooltips. The menu isn't really usable this way. But before we start jumping into things, we must do a few things first.&lt;br /&gt;
&lt;br /&gt;
===== Using Fonts ===== &lt;br /&gt;
Before we use text, we'll need to define a font. If you've already done that then skip forward. If not then please add this line to your initialisation code in Prerequisites area.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if(!FontManager::getSingleton().isFontPresent(&amp;quot;Tahoma-12&amp;quot;))&lt;br /&gt;
  FontManager::getSingleton().createFont(&amp;quot;Tahoma-12.font&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To add a text line for a button you use:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ButtonPtr-&amp;gt;setText(&amp;quot;foo&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Tooltips =====&lt;br /&gt;
Now that we've defined a font, we should define tooltips as well in initialisation area. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
myGUISystem-&amp;gt;setDefaultTooltip(&amp;quot;TaharezLook/Tooltip&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should usually just leave this with initialisation along with initialisation. You'll need to inject time pulses each frame though, that was explained here already [[ToolTips]].&lt;br /&gt;
To add a tooltip for a button you use:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ButtonPtr-&amp;gt;setTooltipText(&amp;quot;foo&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Using Images =====&lt;br /&gt;
Before using images, we need to define an imageset. You can skip forward to the [[http://www.cegui.org.uk/wiki/index.php/The_Main_Menu#Imagesets imageset explanation in the XML area]] to understand what it means. &lt;br /&gt;
&lt;br /&gt;
Note that you could easily create a full image from a texture using the line below, the auto-created image will be called &amp;quot;full_image&amp;quot;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Imageset* foo = ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;NameOfImageset&amp;quot;, &amp;quot;Image.jpg&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But if you want to split it up it'll be alittle harder. You'll need to define a texture&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Texture* texturePtr = System::getSingleton().getRenderer()-&amp;gt;createTexture(&amp;quot;ImageFile.jpg&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
Imageset* MenuImageset = ImagesetManager::getSingleton().createImageset(&amp;quot;ImageName&amp;quot;, texturePtr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since I'm no artist, we'll just assume we have 2 image files, one with the background image and the other with the different button states (make sure they're loaded in resources.cfg). While there are 4 different states( Normal, Hover, pushed &amp;amp; Disabled) we'll just use 2 different looks (to avoid writing more similar code), one for normal &amp;amp; the other will be shared amongst Hover, Pushed &amp;amp; disabled. The 2nd image will contain the different looks for the button, indicating Up or Down states, check the illustration figure below. Each of the 2 images will have its own imageset.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;15&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ MenuButtons.jpg&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Button Up&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Button Down&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Imageset* MenuImageset = ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;Background&amp;quot;,&amp;quot;MenuBackground.jpg&amp;quot;);&lt;br /&gt;
Texture* texturePtr = System::getSingleton().getRenderer()-&amp;gt;createTexture(&amp;quot;MenuButtons.jpg&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
Imageset* MenuImageset = ImagesetManager::getSingleton().createImageset(&amp;quot;Buttons&amp;quot;, texturePtr);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have our imagesets, we'll need define images in each. The first we'll need to define an the Background image, which will be full size. For the 2nd imageset we'll need to split it up and define 2 images inside of it. One for Button Up, and one for Button Down.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
MenuImageset-&amp;gt;defineImage(&amp;quot;Background&amp;quot;, Point(0.0f,0.0f), Size( 1.0f, 1.0f ), Point(0.0f,0.0f)); // Whole Image&lt;br /&gt;
ButtonsImageset-&amp;gt;defineImage(&amp;quot;ButtonUp&amp;quot;, Point(0.0f,0.0f), Size( 1.0f, 0.5f ), Point(0.0f,0.0f)); // Top half of image&lt;br /&gt;
ButtonsImageset-&amp;gt;defineImage(&amp;quot;ButtonDown&amp;quot;, Point(0.0f,0.5f), Size( 1.0f, 0.5f ), Point(0.0f,0.0f)); // Bottom Half&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
now that we have images defined, we can easily apply them to a window that supports images.  Note the value (second) string used here - is is of the format &amp;quot;set:&amp;lt;imageset name&amp;gt; image:&amp;lt;image name&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Window-&amp;gt;setProperty( &amp;quot;Image&amp;quot;, &amp;quot;set:ImagesetName image:ImageName&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wrapping It all up ====&lt;br /&gt;
Now lets write the code above again with the new adjustments&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*** Stuff you need to do in the initialisation phase ***/&lt;br /&gt;
if(!FontManager::getSingleton().isFontPresent(&amp;quot;Tahoma-12&amp;quot;))&lt;br /&gt;
  FontManager::getSingleton().createFont(&amp;quot;Tahoma-12.font&amp;quot;);&lt;br /&gt;
mGUISystem-&amp;gt;setDefaultTooltip(&amp;quot;TaharezLook/Tooltip&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Creating Imagesets and defining images&lt;br /&gt;
Imageset* MenuImageset = ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;Background&amp;quot;,&amp;quot;MenuBackground.jpg&amp;quot;);&lt;br /&gt;
Texture* texturePtr = System::getSingleton().getRenderer()-&amp;gt;createTexture(&amp;quot;MenuButtons.jpg&amp;quot;, &amp;quot;&amp;quot;); // default resource group&lt;br /&gt;
Imageset* ButtonsImageset = ImagesetManager::getSingleton().createImageset(&amp;quot;Buttons&amp;quot;, texturePtr);&lt;br /&gt;
ButtonsImageset-&amp;gt;defineImage(&amp;quot;ButtonUp&amp;quot;, Point(0.0f,0.0f), Size( 0.5f, 0.5f ), Point(0.0f,0.0f)); &lt;br /&gt;
ButtonsImageset-&amp;gt;defineImage(&amp;quot;ButtonDown&amp;quot;, Point(0.0f,0.5f), Size( 0.5f, 0.5f ), Point(0.0f,0.0f));&lt;br /&gt;
&lt;br /&gt;
/*** the menu code ***/&lt;br /&gt;
Window* MenuBackground = Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/StaticImage&amp;quot;, &amp;quot;Background&amp;quot;);&lt;br /&gt;
myRoot-&amp;gt;addChildWindow( MenuBackground );&lt;br /&gt;
MenuBackground-&amp;gt;setPosition( UVector2( UDim( 0.0f, 0.0f), UDim( 0.0f, 0.0f ) ) );&lt;br /&gt;
MenuBackground-&amp;gt;setSize( UVector2( UDim( 1.0f, 0.0f), UDim( 1.0f, 0.0f ) ) );  // full screen&lt;br /&gt;
// this is the preferred way to set the image.&lt;br /&gt;
MenuBackground-&amp;gt;setProperty( &amp;quot;Image&amp;quot;, &amp;quot;set:Background image:full_image&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
PushButton* NewGame = (PushButton*)Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;NewGame&amp;quot;);&lt;br /&gt;
MenuBackground-&amp;gt;addChildWindow( NewGame );&lt;br /&gt;
NewGame-&amp;gt;setPosition( UVector2( UDim( 0.2f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
NewGame-&amp;gt;setSize( UVector2( UDim( 0.4f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
NewGame-&amp;gt;setText(&amp;quot;New Game&amp;quot;);&lt;br /&gt;
NewGame-&amp;gt;setProperty( &amp;quot;NormalImage&amp;quot;, &amp;quot;set:Buttons image:ButtonUp&amp;quot; );&lt;br /&gt;
NewGame-&amp;gt;setProperty( &amp;quot;HoverImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
NewGame-&amp;gt;setProperty( &amp;quot;PushedImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
PushButton* LoadGame = (PushButton*)Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;LoadGame&amp;quot;);&lt;br /&gt;
MenuBackground-&amp;gt;addChildWindow( LoadGame );&lt;br /&gt;
LoadGame-&amp;gt;setPosition( UVector2( UDim(0.2f, 0.0f ), UDim( 0.45f, 0.0f ) ) );&lt;br /&gt;
LoadGame-&amp;gt;setSize( UVector2( UDim(0.4f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
LoadGame-&amp;gt;setText(&amp;quot;Load Game&amp;quot;);&lt;br /&gt;
LoadGame-&amp;gt;setTooltipText(&amp;quot;Disabled, not implemented yet&amp;quot;);&lt;br /&gt;
LoadGame-&amp;gt;disable();&lt;br /&gt;
LoadGame-&amp;gt;setProperty( &amp;quot;NormalImage&amp;quot;, &amp;quot;set:Buttons image:ButtonUp&amp;quot; );&lt;br /&gt;
LoadGame-&amp;gt;setProperty( &amp;quot;HoverImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
LoadGame-&amp;gt;setProperty( &amp;quot;PushedImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
LoadGame-&amp;gt;setProperty( &amp;quot;DisabledImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
PushButton* QuitGame= (PushButton*)Wmgr-&amp;gt;createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;QuitGame&amp;quot;);&lt;br /&gt;
MenuBackground-&amp;gt;addChildWindow( QuitGame );&lt;br /&gt;
QuitGame-&amp;gt;setPosition( UVector2( UDim( 0.2f, 0.0f ), UDim( 0.7f, 0.0f ) ) );&lt;br /&gt;
QuitGame-&amp;gt;setSize( UVector2( UDim( 0.4f, 0.0f ), UDim( 0.2f, 0.0f ) ) );&lt;br /&gt;
QuitGame-&amp;gt;setText(&amp;quot;Quit Game&amp;quot;);&lt;br /&gt;
QuitGame-&amp;gt;setProperty( &amp;quot;NormalImage&amp;quot;, &amp;quot;set:Buttons image:ButtonUp&amp;quot; );&lt;br /&gt;
QuitGame-&amp;gt;setProperty( &amp;quot;HoverImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
QuitGame-&amp;gt;setProperty( &amp;quot;PushedImage&amp;quot;, &amp;quot;set:Buttons image:ButtonDown&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now go ahead and test, doesn't that look much better ? It looks more like a proper menu now. You could start handling events from here on (explained later).&lt;br /&gt;
But this way isn't really very good. Should you want to change anything in the menu, you'll have to edit several lines of code &amp;amp; recompile your application. Besides, just making a menu as simple as that took about 50 lines of code, there must be a simpler way.&lt;br /&gt;
&lt;br /&gt;
=== XML based approach (non-falagard way) ===&lt;br /&gt;
&lt;br /&gt;
This way is much more efficient then hard-coding the menu. Its less code, easier to edit and use as well. I personally think this way is even better then using the falagard system if you're just after doing small and simple menu's, despite the fact falagard is supposed to be better performance wise and more flexible.&lt;br /&gt;
Before we start we need &lt;br /&gt;
&lt;br /&gt;
*Note 1: The .xsd files included in the cegui datafiles aren't needed if you're using Ogre. Ogre uses a different XML parser (tinyXML) which doesn't use these files so feel free to remove them, but if you're not using ogre and you didn't specify a different xml parser, you'll need those files.&lt;br /&gt;
&lt;br /&gt;
==== XML Crash Course ====&lt;br /&gt;
&lt;br /&gt;
If you're familiar with xml, feel free to skip this area (or better yet, rewrite it to make it more helpful).&lt;br /&gt;
&lt;br /&gt;
A code line is usually encapsulated in &amp;lt; &amp;gt;. To start a declare a new type you can use &amp;lt;Type/&amp;gt; or &amp;lt;Type&amp;gt; &amp;lt;/Type&amp;gt;. The first way should be used to declare objects that don't have too many settings. e.g:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Image Name=&amp;quot;Background&amp;quot; XPos=&amp;quot;0.0&amp;quot; YPos=&amp;quot;0.0&amp;quot; Width=&amp;quot;800&amp;quot; Height=&amp;quot;600&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
As you've probably noticed, you can set its settings in the same line. As for the second way, it should be used to open up bigger types. e.g:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;NewGame&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.2,0.0},{0.45,0.0},{0.6,0.0},{0.65,0.0}}&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can start nesting types in other types, you should be able to pickup the rest of the basics from xml files included with CEGUI and the ones in this tutorial.&lt;br /&gt;
 &lt;br /&gt;
*Note 1: Please use a proper text editor and not notepad or wordpad, there are many available for free online, using google would be a good time here :).&lt;br /&gt;
&lt;br /&gt;
==== XML File types ====&lt;br /&gt;
Now I'll explain the filetypes (copied from the beginner tutorial to loading data) and thier uses, there are 3 types. .layout .imageset .scheme ( there is a 4th one .looknfeel used with falagard)&lt;br /&gt;
While you can just call them .xml and be done with it, this way makes it more clearer.&lt;br /&gt;
&lt;br /&gt;
===== Imagesets =====&lt;br /&gt;
&lt;br /&gt;
Effectively, an Imageset is just a collection of defined regions upon the source image / texture file (which is also specified in the Imageset definition). Each of these defined regions has a unique name and is known within the system as an Image. An Image as defined in an Imageset is the basic level of imagery used by CEGUI. By modifying the source image / texture file and also the position and size of the defined regions within the Imageset files you can easily change the appearance of what gets drawn by CEGUI. &lt;br /&gt;
&lt;br /&gt;
Since each imageset cannot contain more then one Image file. We'll have to make 2 imageset files. For both images, we'll assume the width and hieght are 512x512. But for the second image, we'll assume it has 4 different button images inside instead of just 2 like the code part of tutorial, each button image is 1/4 the size of the full image. The only reason behind this is its much easier to assign &amp;amp; define images now. Here is an illustration figure for the 2nd image&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;10&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ MenuButtons.jpg&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Button Up&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Button Down&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Button Highlighted&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | Button Greyed Out&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* MenuBackground.imageset&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Imageset Name=&amp;quot;Background&amp;quot; Imagefile=&amp;quot;MenuBackground.jpg&amp;quot; NativeHorzRes=&amp;quot;800&amp;quot; NativeVertRes=&amp;quot;600&amp;quot; AutoScaled=&amp;quot;true&amp;quot; ResourceGroup=&amp;quot;General&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Image Name=&amp;quot;Background&amp;quot; XPos=&amp;quot;0.0&amp;quot; YPos=&amp;quot;0.0&amp;quot; Width=&amp;quot;512&amp;quot; Height=&amp;quot;512&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Imageset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* MenuButtons.imageset&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
  &amp;lt;Imageset Name=&amp;quot;Buttons&amp;quot; Imagefile=&amp;quot;MenuButtons.jpg&amp;quot; NativeHorzRes=&amp;quot;800&amp;quot; NativeVertRes=&amp;quot;600&amp;quot; AutoScaled=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Image Name=&amp;quot;ButtonUp&amp;quot; XPos=&amp;quot;0.0&amp;quot; YPos=&amp;quot;0.0&amp;quot; Width=&amp;quot;512&amp;quot; Height=&amp;quot;128&amp;quot; /&amp;gt;&lt;br /&gt;
 	&amp;lt;Image Name=&amp;quot;ButtonDown&amp;quot; XPos=&amp;quot;0.0&amp;quot; YPos=&amp;quot;128.0&amp;quot; Width=&amp;quot;512&amp;quot; Height=&amp;quot;128&amp;quot; /&amp;gt;&lt;br /&gt;
 	&amp;lt;Image Name=&amp;quot;ButtonDisabled&amp;quot; XPos=&amp;quot;0.0&amp;quot; YPos=&amp;quot;256.0&amp;quot; Width=&amp;quot;512&amp;quot; Height=&amp;quot;128&amp;quot; /&amp;gt;&lt;br /&gt;
 	&amp;lt;Image Name=&amp;quot;ButtonHighlighted&amp;quot; XPos=&amp;quot;0.0&amp;quot; YPos=&amp;quot;384.14&amp;quot; Width=&amp;quot;512&amp;quot; Height=&amp;quot;128&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Imageset&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
While the ResourceGroup=&amp;quot;&amp;quot; line isn't necessary, I just added it so you can see where to use it.&lt;br /&gt;
To load Imagesets by code you do &lt;br /&gt;
 ImagesetManager::getSingleton().createImageset( &amp;quot;MenuBackground.imageset&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
===== Layouts =====&lt;br /&gt;
&lt;br /&gt;
A layout file contains an XML representation of a window layout. Each nested 'Window' element defines a window or widget to be created, the 'Property' elements define the desired settings and property values for each window defined. &lt;br /&gt;
&lt;br /&gt;
* Menu.layout&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUILayout&amp;gt;&lt;br /&gt;
     &amp;lt;Window Type=&amp;quot;WindowsLook/StaticImage&amp;quot; Name=&amp;quot;Menu/Background&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Property Name=&amp;quot;UnifiedSize&amp;quot; Value=&amp;quot;{{1.0,0},{1.0,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property Name=&amp;quot;Image&amp;quot; Value=&amp;quot;set:Background image:Background&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
         &amp;lt;Window Type=&amp;quot;WindowsLook/Button&amp;quot; Name=&amp;quot;Menu/NewGame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.2,0.0},{0.2,0.0},{0.6,0.0},{0.4,0.0}}&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;NormalImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonUp&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;HoverImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonDisabled&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;PushedImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonHighlighted&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;DisabledImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonDisabled&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;Tooltip&amp;quot; Value=&amp;quot;Start a new game&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Window&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
         &amp;lt;Window Type=&amp;quot;WindowsLook/Button&amp;quot; Name=&amp;quot;Menu/LoadGame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.2,0.0},{0.45,0.0},{0.6,0.0},{0.65,0.0}}&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;NormalImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonUp&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;HoverImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonDisabled&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;PushedImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonHighlighted&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;DisabledImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonDisabled&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;Tooltip&amp;quot; Value=&amp;quot;Not implemented yet&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Window&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
         &amp;lt;Window Type=&amp;quot;WindowsLook/Button&amp;quot; Name=&amp;quot;Menu/QuitGame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.2,0.0},{0.7,0.0},{0.6,0.0},{0.9,0.0}}&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;NormalImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonUp&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;HoverImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonDisabled&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;PushedImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonHighlighted&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;DisabledImage&amp;quot; Value=&amp;quot;set:Buttons image:ButtonDisabled&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property Name=&amp;quot;Tooltip&amp;quot; Value=&amp;quot;Exit To Desktop&amp;quot;/&amp;gt;&lt;br /&gt;
          &amp;lt;/Window&amp;gt;&lt;br /&gt;
     &amp;lt;/Window&amp;gt;&lt;br /&gt;
 &amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This does basicly all the stuff we did in the code portion of the tutorial. The only new term here is UnifiedAreaRect, the first pair defines where the XPos starts, the 3rd defines where it ends. Same goes for 2nd &amp;amp; 4th but for YPos&lt;br /&gt;
 &lt;br /&gt;
To load a .layout file in code you do&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 Window* Menu = WindowManager::getSingleton().loadWindowLayout(&amp;quot;Menu.layout&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Note 1: There is an editor file for layouts written by scriptkid, its preferable if you get it from CVS and build it, but its possible to get the binaries from the downloads area in the cegui website. While its rather limited atm, it allows you to create and place the various widgets and export into a .layout file. It doesn't support custom images as of yet (8/12/2005).&lt;br /&gt;
*Note 2: Since the layout file is usually the most error prone, I usually encase it in a try catch statement to catch any parsing exceptions and pause on them. If you don't do that you won't get informed of errors when they happen, which could lead to other errors happening and crashing ultimatley.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
	Window* Menu = WindowManager::getSingleton().loadWindowLayout(&amp;quot;Menu.layout&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
catch(CEGUI::Exception &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
 OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, string(e.getMessage().c_str()), &amp;quot;Error Parsing Menu&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Schemes =====&lt;br /&gt;
&lt;br /&gt;
A Scheme is a means to group other data files together, it's also the most convenient way to load and register widget types. A Scheme can contain one or more of the following (which will be loaded and initialised when the scheme is loaded): &lt;br /&gt;
Imageset &lt;br /&gt;
Window Set &lt;br /&gt;
Window Alias &lt;br /&gt;
A 'Window Set' basically specifies the name of a loadable module or skin(.dll , .so, .looknfeel), and a set of widgets contained within that modules that you wish to register with the system. A 'Window Alias' provides a means to refer to a window / widget type by alternative names, it can also be used to 'hide' an already registered widget type with another widget type (so that other widget type gets used instead). &lt;br /&gt;
&lt;br /&gt;
This file isn't totally needed in the current approach, we're just using it here as a means of grouping imagesets for loading. However this file will be used in greater detail in the [[Falagard]] system. &lt;br /&gt;
&lt;br /&gt;
* GameGUI.scheme&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;GameGUI&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Imageset Name=&amp;quot;Background&amp;quot; Filename=&amp;quot;MenuButtons.imageset&amp;quot; ResourceGroup=&amp;quot;General&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;Imageset Name=&amp;quot;Buttons&amp;quot; Filename=&amp;quot;MenuButtons.imageset&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This simply just loads the 2 imagesets. To load the scheme by code you use&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
SchemeManager::getSingleton().loadScheme(&amp;quot;GameGUI.scheme);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Wrapping It all up ====&lt;br /&gt;
&lt;br /&gt;
Save the xml files above and add them somewhere in your Resource hierarchy (which should be your media folder unless you changed it).&lt;br /&gt;
&lt;br /&gt;
Now for the code portion, the initialisation area will remain the same. However, you'll need to have this line before your menu code&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
SchemeManager::getSingleton().loadScheme(&amp;quot;GameGUI.scheme);&lt;br /&gt;
// Or you could do this if you skip the scheme part&lt;br /&gt;
//ImagesetManager::getSingleton().createImageset( &amp;quot;MenuBackground.imageset&amp;quot;);&lt;br /&gt;
//ImagesetManager::getSingleton().createImageset( &amp;quot;MenuButtons.imageset&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now its time to write the menu code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
WindowManager* Wmgr = WindowManager::getSingletonPtr();&lt;br /&gt;
System* mGUISystem = System::getSingletonPtr();&lt;br /&gt;
Window* myRoot = Wmgr-&amp;gt;getWindow(&amp;quot;RootWindow&amp;quot;); // get default window&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
	Window* Menu = Wmgr-&amp;gt;loadWindowLayout(&amp;quot;Menu.layout&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
catch(CEGUI::Exception &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, string(e.getMessage().c_str()), &amp;quot;Error Parsing Menu&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
myRoot-&amp;gt;addChildWindow(Menu);&lt;br /&gt;
GUISys-&amp;gt;setGUISheet(myRoot); // this line is redundant since you didn't change gui sheets, but its here to make sure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And thats it ! 50 lines of code are now alittle less then 10 lines. The menu is now easily editable by editing the xml files without the need of recompiling. Should any errors occur, checking the cegui.log should be very handy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Falagard]] Way &amp;amp; the looknfeel system ===&lt;br /&gt;
TO DO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Handling events for the menu ==&lt;br /&gt;
Ok, so we've seen how to make our menu. But so far we can only look at it, we can't use it. Here we'll learn how to start subscribing events and handle them. To start handling events we need to have pointers for each menu button you want handled (even the background if you want to do anything special). If you've followed the code approach, you should already have them. Otherwise, we'll need to start getting them. Simply do this for each button&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
PushButton* Button1 = (PushButton*)wmgr-&amp;gt;getWindow(&amp;quot;Widget Reference Name&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have pointers to the buttons we wan't to handle. You need to subscribe it to a function that will do the &amp;quot;handling&amp;quot;. If you're function is a global function (or not part of a class). you do this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Button1 -&amp;gt;subscribeEvent(PushButton::EventClicked, HandleButton1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it is part of a class you do this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Button1-&amp;gt;subscribeEvent(PushButton::EventClicked, Event::Subscriber(&amp;amp;ClassName::HandleButton1, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What this does is tell the Window to trigger function HandleButton1() should EventClicked happen. There are much more events which you can find out about them from the API reference.&lt;br /&gt;
&lt;br /&gt;
Now here is a typical action &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool HandleButton1(const EventArgs&amp;amp; e)&lt;br /&gt;
{&lt;br /&gt;
  //Code you want Button1 to do&lt;br /&gt;
  return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once the event is triggered, HandleButton1 is called and an EventArgs is passed to it. This has some useful info you might need to operate on, &lt;br /&gt;
&lt;br /&gt;
*Note 1 : the function needs to be of type bool and return true. it also needs to take one parameter only and thats const CEGUI::EventArgs&amp;amp;&lt;br /&gt;
&lt;br /&gt;
=== What you need in your Frame Listener ===&lt;br /&gt;
&lt;br /&gt;
But wait a minute, CEGUI doesn't detect keyboard &amp;amp; mouse input itself. This means none of the code above will work just yet, we'll need to inject Input as we get it. So you'll have to modify your framelistener to do so. This part is based in portion from [[http://www.ogre3d.org/wiki/index.php/Basic_Tutorial_6 basic tutorial 6]]. This area is heavily ogre specific btw for those who didn't notice&lt;br /&gt;
&lt;br /&gt;
First you'll need to subclass your framelistener (or whatever class handles your input) from KeyListener, MouseMotionListener &amp;amp; MouseListener then overload the pure virtual functions(check the ogre api to see which functions you'll need to overload)&lt;br /&gt;
Here is a list off all of them (might be some more), some of them you don't need to inject so provide empty &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Helper function&lt;br /&gt;
ConvertOgreButtonToCEGUI(int ButtonID);&lt;br /&gt;
&lt;br /&gt;
//key listener&lt;br /&gt;
void keyPressed(KeyEvent *e);&lt;br /&gt;
void keyClicked(KeyEvent *e);&lt;br /&gt;
void keyReleased(KeyEvent *e);&lt;br /&gt;
&lt;br /&gt;
//mouse motion listener&lt;br /&gt;
void mouseMoved(MouseEvent *e);&lt;br /&gt;
void mouseDragMoved(MouseEvent *e){}&lt;br /&gt;
void mouseDragged(MouseEvent *e);&lt;br /&gt;
 &lt;br /&gt;
// mouse listener&lt;br /&gt;
void mouseReleased (MouseEvent *e);&lt;br /&gt;
void mousePressed (MouseEvent *e);&lt;br /&gt;
void mouseClicked (MouseEvent *e){};&lt;br /&gt;
void mouseEntered (MouseEvent *e){};&lt;br /&gt;
void mouseExited (MouseEvent *e){};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
here is thier implementations&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
MouseButton YourInputListenerClass::ConvertOgreButtonToCEGUI(int ButtonID)&lt;br /&gt;
{&lt;br /&gt;
   switch (ButtonID)&lt;br /&gt;
   {&lt;br /&gt;
   case MouseEvent::BUTTON0_MASK:&lt;br /&gt;
       return CEGUI::LeftButton;&lt;br /&gt;
   case MouseEvent::BUTTON1_MASK:&lt;br /&gt;
       return CEGUI::RightButton;&lt;br /&gt;
   case MouseEvent::BUTTON2_MASK:&lt;br /&gt;
       return CEGUI::MiddleButton;&lt;br /&gt;
   case MouseEvent::BUTTON3_MASK:&lt;br /&gt;
       return CEGUI::X1Button;&lt;br /&gt;
   default:&lt;br /&gt;
       return CEGUI::LeftButton;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
void YourInputListenerClass::keyPressed(KeyEvent *e)&lt;br /&gt;
{&lt;br /&gt;
	mGUISystem-&amp;gt;injectKeyDown(e-&amp;gt;getKey());   // I'm not totally sure about this area, can someone confirm ?&lt;br /&gt;
	mGUISystem-&amp;gt;injectChar(e-&amp;gt;getKeyChar());&lt;br /&gt;
	e-&amp;gt;consume();&lt;br /&gt;
}&lt;br /&gt;
void YourInputListenerClass::keyReleased(KeyEvent *e)&lt;br /&gt;
{&lt;br /&gt;
	mGUISystem-&amp;gt;injectKeyUp(e-&amp;gt;getKey());&lt;br /&gt;
	e-&amp;gt;consume();&lt;br /&gt;
}&lt;br /&gt;
void YourInputListenerClass::mouseMoved (MouseEvent *e)&lt;br /&gt;
{&lt;br /&gt;
	mGUISystem-&amp;gt;injectMouseMove(e-&amp;gt;getRelX() * mGUIRenderer -&amp;gt;getWidth(),e-&amp;gt;getRelY() * GuiRenderer-&amp;gt;getHeight());&lt;br /&gt;
	e-&amp;gt;consume();&lt;br /&gt;
}&lt;br /&gt;
void YourInputListenerClass::mousePressed (MouseEvent *e)&lt;br /&gt;
{&lt;br /&gt;
	mGUISystem-&amp;gt;injectMouseButtonDown(ConvertOgreButtonToCEGUI(e-&amp;gt;getButtonID()));&lt;br /&gt;
	e-&amp;gt;consume();&lt;br /&gt;
}&lt;br /&gt;
void YourInputListenerClass::mouseReleased(MouseEvent *e)&lt;br /&gt;
{&lt;br /&gt;
 	mGUISystem-&amp;gt;injectMouseButtonUp(ConvertOgreButtonToCEGUI(e-&amp;gt;getButtonID()));&lt;br /&gt;
 	e-&amp;gt;consume();&lt;br /&gt;
}&lt;br /&gt;
void YourInputListenerClass::mouseDragged (MouseEvent *e) &lt;br /&gt;
{ &lt;br /&gt;
	mouseMoved(e);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Handling events for the layout approach ===&lt;br /&gt;
I'll show an example based on the layout approach, you could easily adapt it to any of the other approaches.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// handler functions declarations&lt;br /&gt;
bool handleNewGame(const EventArgs&amp;amp; e);&lt;br /&gt;
bool handleQuit(const EventArgs&amp;amp; e);&lt;br /&gt;
bool handleHover(const EventArgs&amp;amp; e);&lt;br /&gt;
&lt;br /&gt;
WindowManager* Wmgr = WindowManager::getSingletonPtr();&lt;br /&gt;
System* mGUISystem = System::getSingletonPtr();&lt;br /&gt;
Window* myRoot = Wmgr-&amp;gt;getWindow(&amp;quot;RootWindow&amp;quot;); // get default window&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
	Window* Menu = Wmgr-&amp;gt;loadWindowLayout(&amp;quot;Menu.layout&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
catch(CEGUI::Exception &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, string(e.getMessage().c_str()), &amp;quot;Error Parsing Menu&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
myRoot-&amp;gt;addChildWindow(Menu);&lt;br /&gt;
mGUISystem-&amp;gt;setGUISheet(myRoot); &lt;br /&gt;
&lt;br /&gt;
bool handleNewGame(const EventArgs&amp;amp; e)&lt;br /&gt;
{&lt;br /&gt;
    // your project specific code to start game&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool handleHover(const EventArgs&amp;amp; e)&lt;br /&gt;
{&lt;br /&gt;
    // Play a beep sound &lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool handleQuit(const EventArgs&amp;amp; e)&lt;br /&gt;
{&lt;br /&gt;
    // your engine specific code to shut down&lt;br /&gt;
    Root::getSingleton().queueEndRendering(); // ogre specific&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Thats it. Theoritically it should work. Now go ahead and try :)&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Now it should be easy to and clear to beginner users how to begin making use of CEGUI, you can easily extend what you've learnt here to start making more complex GUIs.&lt;br /&gt;
If you find that something isn't clear or you want help with it you can post on the forums or join the #cegui channel on IRC (freenode server). I usually idle on IRC often, nick MandM.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=PropertyFinder&amp;diff=4314</id>
		<title>PropertyFinder</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=PropertyFinder&amp;diff=4314"/>
				<updated>2011-03-06T01:38:13Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
This code creates a tool to list the properties associated with the widgets of a scheme.  It loads the .scheme files from within the Scheme directory and displays the widgets defined within that scheme.  Selecting a widget will list every property associated to that widget by default.  And selecting a property will display its help.&lt;br /&gt;
&lt;br /&gt;
Please discuss this snippet within the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=11670#11670 Property Finder] thread.  The properties for widgets are presented in [[Property reference for TaharezLook]], [[Property reference for WindowsLook]], [[Property reference for Vanilla]] and [[Property reference for OgreTray]].  The CEGUI API also [http://www.cegui.org.uk/api_reference/classCEGUI_1_1Property.html lists the properties].&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
==== PropertyFinder.h ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _PropertyFinder_h_&lt;br /&gt;
#define _PropertyFinder_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;CEGuiSample.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUIDefaultResourceProvider.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;map&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class DemoSample : public CEGuiSample&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    bool initialiseSample()&lt;br /&gt;
    {&lt;br /&gt;
        using namespace CEGUI;&lt;br /&gt;
&lt;br /&gt;
        // The executable is stored within &amp;lt;cegui&amp;gt;/bin&lt;br /&gt;
        // The following will change the location of the datafiles from their default of&lt;br /&gt;
        // ../datafiles (which works well for the samples) to &amp;lt;cegui&amp;gt;/samples/datafiles&lt;br /&gt;
        DefaultResourceProvider* rp = reinterpret_cast&amp;lt;DefaultResourceProvider*&amp;gt;(System::getSingleton().getResourceProvider());&lt;br /&gt;
        rp-&amp;gt;setResourceGroupDirectory(&amp;quot;fonts&amp;quot;,          &amp;quot;../samples/datafiles/fonts/&amp;quot;);&lt;br /&gt;
        rp-&amp;gt;setResourceGroupDirectory(&amp;quot;imagesets&amp;quot;,      &amp;quot;../samples/datafiles/imagesets/&amp;quot;);&lt;br /&gt;
        rp-&amp;gt;setResourceGroupDirectory(&amp;quot;layouts&amp;quot;,        &amp;quot;c:/programming/_Projects/CeguiTestBed/&amp;quot;);&lt;br /&gt;
        rp-&amp;gt;setResourceGroupDirectory(&amp;quot;looknfeels&amp;quot;,     &amp;quot;../samples/datafiles/looknfeel/&amp;quot;);&lt;br /&gt;
        rp-&amp;gt;setResourceGroupDirectory(&amp;quot;lua_scripts&amp;quot;,    &amp;quot;../samples/datafiles/lua_scripts/&amp;quot;);&lt;br /&gt;
        rp-&amp;gt;setResourceGroupDirectory(&amp;quot;schemes&amp;quot;,        &amp;quot;../samples/datafiles/schemes/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            // Retrieve the window manager&lt;br /&gt;
            WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
            // Load the TaharezLook scheme and set up the default mouse cursor and font&lt;br /&gt;
            Scheme* currentScheme = &amp;amp;SchemeManager::getSingleton().create(&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
            System::getSingleton().setDefaultMouseCursor(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
            FontManager::getSingleton().create(&amp;quot;DejaVuSans-10.font&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            // Set the GUI Sheet&lt;br /&gt;
            Window* sheet = winMgr.createWindow(&amp;quot;DefaultWindow&amp;quot;, &amp;quot;root_wnd&amp;quot;);&lt;br /&gt;
            System::getSingleton().setGUISheet(sheet);&lt;br /&gt;
&lt;br /&gt;
            // Load a layout&lt;br /&gt;
            Window* guiLayout = winMgr.loadWindowLayout(&amp;quot;PropertyFinder.layout&amp;quot;);&lt;br /&gt;
            sheet-&amp;gt;addChildWindow(guiLayout);&lt;br /&gt;
&lt;br /&gt;
            // Retrieve the handle to the often used widgets&lt;br /&gt;
            mSchemes = static_cast&amp;lt;CEGUI::Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/SchemeList&amp;quot;));&lt;br /&gt;
            mWidgets = static_cast&amp;lt;CEGUI::Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/WidgetList&amp;quot;));&lt;br /&gt;
            mProperties = static_cast&amp;lt;CEGUI::Listbox*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/Properties&amp;quot;));&lt;br /&gt;
            mInformation = static_cast&amp;lt;CEGUI::MultiLineEditbox*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/Information&amp;quot;));&lt;br /&gt;
            mRadioButton = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/ExportWiki&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
            // Configure the schemes&lt;br /&gt;
            mSchemes-&amp;gt;subscribeEvent(Combobox::EventTextChanged,            Event::Subscriber(&amp;amp;DemoSample::onSchemeChanged, this));&lt;br /&gt;
            mSchemes-&amp;gt;subscribeEvent(Combobox::EventListSelectionAccepted,  Event::Subscriber(&amp;amp;DemoSample::onSchemeChanged, this));&lt;br /&gt;
            mSchemes-&amp;gt;setSortingEnabled(true);&lt;br /&gt;
&lt;br /&gt;
            // Configure the widgets&lt;br /&gt;
            mWidgets-&amp;gt;subscribeEvent(Combobox::EventTextChanged,            Event::Subscriber(&amp;amp;DemoSample::onWidgetChanged, this));&lt;br /&gt;
            mWidgets-&amp;gt;subscribeEvent(Combobox::EventListSelectionAccepted,  Event::Subscriber(&amp;amp;DemoSample::onWidgetChanged, this));&lt;br /&gt;
            mWidgets-&amp;gt;setSortingEnabled(true);&lt;br /&gt;
&lt;br /&gt;
            // Configure the properties&lt;br /&gt;
            mProperties-&amp;gt;setSortingEnabled(true);&lt;br /&gt;
            mProperties-&amp;gt;setMultiselectEnabled(false);&lt;br /&gt;
            mProperties-&amp;gt;subscribeEvent(Listbox::EventSelectionChanged,     Event::Subscriber(&amp;amp;DemoSample::onPropertyChanged,   this));&lt;br /&gt;
&lt;br /&gt;
            // Configure the export&lt;br /&gt;
            CEGUI::PushButton* btnExport = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/Export&amp;quot;));&lt;br /&gt;
            btnExport-&amp;gt;subscribeEvent(PushButton::EventClicked,             Event::Subscriber(&amp;amp;DemoSample::onExport,            this));&lt;br /&gt;
            mRadioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
            mRadioButton-&amp;gt;setID(Wiki);&lt;br /&gt;
            mRadioButton-&amp;gt;setSelected(true);&lt;br /&gt;
            CEGUI::RadioButton* radioButton = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/ExportHtml&amp;quot;));&lt;br /&gt;
            radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
            radioButton-&amp;gt;setID(Html);&lt;br /&gt;
            radioButton-&amp;gt;setSelected(false);&lt;br /&gt;
            radioButton = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;PropertyFinder/ExportXml&amp;quot;));&lt;br /&gt;
            radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
            radioButton-&amp;gt;setID(Xml);&lt;br /&gt;
            radioButton-&amp;gt;setSelected(false);&lt;br /&gt;
&lt;br /&gt;
            // Load every scheme&lt;br /&gt;
            loadEverySchemes(currentScheme);&lt;br /&gt;
        }&lt;br /&gt;
        catch (Exception &amp;amp;e)&lt;br /&gt;
        {&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
            MessageBox(NULL, e.getMessage().c_str(), &amp;quot;Error initializing the demo&amp;quot;, MB_OK | MB_ICONERROR | MB_TASKMODAL);&lt;br /&gt;
#else&lt;br /&gt;
            std::cerr &amp;lt;&amp;lt; &amp;quot;Error initializing the demo:&amp;quot; &amp;lt;&amp;lt; e.getMessage().c_str() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
#endif&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void cleanupSample(void)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void loadEverySchemes(CEGUI::Scheme* pCurrentScheme)&lt;br /&gt;
    {&lt;br /&gt;
        CEGUI::SchemeManager::getSingleton().createAll(&amp;quot;*.scheme&amp;quot;, &amp;quot;schemes&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Parse the loaded schemes and determine their internal names (as widget prefixes)&lt;br /&gt;
        const CEGUI::String separator(&amp;quot;/&amp;quot;);&lt;br /&gt;
        CEGUI::String currentFal;&lt;br /&gt;
        CEGUI::String::size_type pos;&lt;br /&gt;
        CEGUI::String newLook, currentLook;&lt;br /&gt;
        CEGUI::String widget;&lt;br /&gt;
        CEGUI::WindowFactoryManager::FalagardMappingIterator itFalagardMapping = CEGUI::WindowFactoryManager::getSingleton().getFalagardMappingIterator();&lt;br /&gt;
&lt;br /&gt;
        while (!itFalagardMapping.isAtEnd())&lt;br /&gt;
        {&lt;br /&gt;
            currentFal = itFalagardMapping.getCurrentKey();&lt;br /&gt;
            pos = currentFal.find(separator);&lt;br /&gt;
            newLook = currentFal.substr(0, pos);&lt;br /&gt;
&lt;br /&gt;
            if (currentLook.compare(newLook) != 0)&lt;br /&gt;
            {&lt;br /&gt;
                currentLook = newLook;&lt;br /&gt;
                addScheme(newLook);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            itFalagardMapping++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Select the &amp;quot;current&amp;quot; scheme&lt;br /&gt;
        CEGUI::ListboxItem* current = mSchemes-&amp;gt;findItemWithText(pCurrentScheme-&amp;gt;getName(), 0);&lt;br /&gt;
&lt;br /&gt;
        if (current)&lt;br /&gt;
        {&lt;br /&gt;
            mSchemes-&amp;gt;setText(pCurrentScheme-&amp;gt;getName());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void addScheme(const CEGUI::String&amp;amp; pScheme)&lt;br /&gt;
    {&lt;br /&gt;
        if (!mSchemes-&amp;gt;findItemWithText(pScheme, 0))&lt;br /&gt;
        {&lt;br /&gt;
            // This scheme has not yet been added&lt;br /&gt;
            CEGUI::ListboxTextItem* schemeItem = new CEGUI::ListboxTextItem(pScheme);&lt;br /&gt;
            schemeItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
            mSchemes-&amp;gt;addItem(schemeItem);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool onSchemeChanged(const CEGUI::EventArgs&amp;amp; args)&lt;br /&gt;
    {&lt;br /&gt;
        // Refresh the widget list&lt;br /&gt;
        mWidgets-&amp;gt;resetList();&lt;br /&gt;
        getWidgets(mSchemes-&amp;gt;getText());&lt;br /&gt;
&lt;br /&gt;
        CEGUI::ListboxTextItem* widgetItem;&lt;br /&gt;
        WidgetList::iterator itWidgetList;&lt;br /&gt;
&lt;br /&gt;
        for (itWidgetList = mWidgetList.begin(); itWidgetList != mWidgetList.end(); itWidgetList++)&lt;br /&gt;
        {&lt;br /&gt;
            widgetItem = new CEGUI::ListboxTextItem((*itWidgetList));&lt;br /&gt;
            widgetItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
            mWidgets-&amp;gt;addItem(widgetItem);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Select the first widget&lt;br /&gt;
        if (mWidgets-&amp;gt;getItemCount() &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            mWidgets-&amp;gt;setText(mWidgets-&amp;gt;getListboxItemFromIndex(0)-&amp;gt;getText());&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            mWidgets-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void getWidgets(const CEGUI::String&amp;amp; pScheme)&lt;br /&gt;
    {&lt;br /&gt;
        mWidgetList.clear();&lt;br /&gt;
&lt;br /&gt;
        const CEGUI::String separator(&amp;quot;/&amp;quot;);&lt;br /&gt;
        CEGUI::String currentFal;&lt;br /&gt;
        CEGUI::String::size_type pos;&lt;br /&gt;
        CEGUI::String newLook;&lt;br /&gt;
        CEGUI::String widget;&lt;br /&gt;
        CEGUI::WindowFactoryManager::FalagardMappingIterator itFalagardMapping = CEGUI::WindowFactoryManager::getSingleton().getFalagardMappingIterator();&lt;br /&gt;
&lt;br /&gt;
        while (!itFalagardMapping.isAtEnd())&lt;br /&gt;
        {&lt;br /&gt;
            currentFal = itFalagardMapping.getCurrentKey();&lt;br /&gt;
            pos = currentFal.find(separator);&lt;br /&gt;
            newLook = currentFal.substr(0, pos);&lt;br /&gt;
&lt;br /&gt;
            if (pScheme.compare(newLook) == 0)&lt;br /&gt;
            {&lt;br /&gt;
                widget = currentFal.substr(pos + 1);&lt;br /&gt;
                mWidgetList.push_back(widget);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            itFalagardMapping++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        std::sort(mWidgetList.begin(), mWidgetList.end());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool onWidgetChanged(const CEGUI::EventArgs&amp;amp; args)&lt;br /&gt;
    {&lt;br /&gt;
        // Refresh the property list&lt;br /&gt;
        mProperties-&amp;gt;resetList();&lt;br /&gt;
        getProperties(mSchemes-&amp;gt;getText(), mWidgets-&amp;gt;getText());&lt;br /&gt;
&lt;br /&gt;
        CEGUI::ListboxTextItem* propertyItem;&lt;br /&gt;
        PropertyList::iterator itPropertyList;&lt;br /&gt;
&lt;br /&gt;
        for (itPropertyList = mPropertyList.begin(); itPropertyList != mPropertyList.end(); itPropertyList++)&lt;br /&gt;
        {&lt;br /&gt;
            propertyItem = new CEGUI::ListboxTextItem((*itPropertyList).first);&lt;br /&gt;
            propertyItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            if ((*itPropertyList).second.falagard)&lt;br /&gt;
            {&lt;br /&gt;
                propertyItem-&amp;gt;setTextColours(CEGUI::colour(1.0f, 1.0f, .5f));&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            mProperties-&amp;gt;addItem(propertyItem);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Select the first property&lt;br /&gt;
        if (mProperties-&amp;gt;getItemCount() &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            CEGUI::ListboxItem* selectedProperty = mProperties-&amp;gt;getListboxItemFromIndex(0);&lt;br /&gt;
            mProperties-&amp;gt;setItemSelectState(selectedProperty, true);&lt;br /&gt;
            mProperties-&amp;gt;ensureItemIsVisible(selectedProperty);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            mInformation-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void getProperties(const CEGUI::String&amp;amp; pScheme, const CEGUI::String&amp;amp; pWidget)&lt;br /&gt;
    {&lt;br /&gt;
        const CEGUI::String separator(&amp;quot;/&amp;quot;);&lt;br /&gt;
        mPropertyList.clear();&lt;br /&gt;
&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            CEGUI::Window* widget = CEGUI::WindowManager::getSingleton().createWindow(pScheme + separator + pWidget);&lt;br /&gt;
            CEGUI::PropertySet::Iterator itPropertySet = ((CEGUI::PropertySet*) widget)-&amp;gt;getIterator();&lt;br /&gt;
&lt;br /&gt;
            while (!itPropertySet.isAtEnd())&lt;br /&gt;
            {&lt;br /&gt;
                PropertyInfo pi;&lt;br /&gt;
                pi.help = (*itPropertySet)-&amp;gt;getHelp();&lt;br /&gt;
                pi.falagard = dynamic_cast&amp;lt;CEGUI::PropertyDefinition*&amp;gt;(*itPropertySet) != 0;&lt;br /&gt;
                mPropertyList[itPropertySet.getCurrentKey()] = pi;&lt;br /&gt;
                itPropertySet++;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            CEGUI::WindowManager::getSingleton().destroyWindow(widget);&lt;br /&gt;
        }&lt;br /&gt;
        catch (...)&lt;br /&gt;
        {&lt;br /&gt;
            // Silently ignore errors&lt;br /&gt;
            // TaharezLook/TabPane generates one such error&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool onPropertyChanged(const CEGUI::EventArgs&amp;amp; args)&lt;br /&gt;
    {&lt;br /&gt;
        // Display the appropriate help information&lt;br /&gt;
        CEGUI::ListboxItem* selectedItem = mProperties-&amp;gt;getFirstSelectedItem();&lt;br /&gt;
&lt;br /&gt;
        if (selectedItem)&lt;br /&gt;
        {&lt;br /&gt;
            PropertyList::iterator itPropertyList = mPropertyList.find(selectedItem-&amp;gt;getText());&lt;br /&gt;
&lt;br /&gt;
            if (itPropertyList != mPropertyList.end())&lt;br /&gt;
            {&lt;br /&gt;
                mInformation-&amp;gt;setText((*itPropertyList).second.help);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            mInformation-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    bool onExport(const CEGUI::EventArgs&amp;amp; args)&lt;br /&gt;
    {&lt;br /&gt;
        CEGUI::uint exportType = mRadioButton-&amp;gt;getSelectedButtonInGroup()-&amp;gt;getID();&lt;br /&gt;
&lt;br /&gt;
        switch (exportType)&lt;br /&gt;
        {&lt;br /&gt;
        case Wiki:&lt;br /&gt;
            ExportWiki();&lt;br /&gt;
            break;&lt;br /&gt;
        case Html:&lt;br /&gt;
            ExportHtml();&lt;br /&gt;
            break;&lt;br /&gt;
        case Xml:&lt;br /&gt;
            ExportXml();&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void ExportWiki()&lt;br /&gt;
    {&lt;br /&gt;
        std::ofstream out(&amp;quot;PropertyFinder.txt&amp;quot;);&lt;br /&gt;
        const CEGUI::String sectionHeader(&amp;quot;===&amp;quot;);&lt;br /&gt;
        const CEGUI::String widgetHeader(&amp;quot;====&amp;quot;);&lt;br /&gt;
        const CEGUI::String propertyHeader(&amp;quot;====&amp;quot;);&lt;br /&gt;
        const CEGUI::String falagardColor(&amp;quot;bgcolor=\&amp;quot;#FFBF00\&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        PropertyList completePropertyList;&lt;br /&gt;
&lt;br /&gt;
        CEGUI::String schemeName;&lt;br /&gt;
        WidgetList::iterator itWidgetList;&lt;br /&gt;
        PropertyList::iterator itPropertyList;&lt;br /&gt;
&lt;br /&gt;
        const int propertiesPerLine = 5;&lt;br /&gt;
        int propertiesOnLine;&lt;br /&gt;
&lt;br /&gt;
        /******************* Option 1 *******************/&lt;br /&gt;
        // Export every detected scheme&lt;br /&gt;
        /*&lt;br /&gt;
        for(size_t schemeItem = 0; schemeItem &amp;lt; mSchemes-&amp;gt;getItemCount(); schemeItem++)&lt;br /&gt;
        {&lt;br /&gt;
            schemeName = mSchemes-&amp;gt;getListboxItemFromIndex(schemeItem)-&amp;gt;getText();&lt;br /&gt;
            getWidgets(schemeName);&lt;br /&gt;
            if(mWidgetList.size() == 0)&lt;br /&gt;
            {&lt;br /&gt;
                continue;&lt;br /&gt;
            }&lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        /******************* Option 2 *******************/&lt;br /&gt;
        // Only export the currently selected scheme&lt;br /&gt;
        {&lt;br /&gt;
            schemeName = mSchemes-&amp;gt;getText();&lt;br /&gt;
            getWidgets(schemeName);&lt;br /&gt;
            /************** End of the options **************/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            out &amp;lt;&amp;lt; sectionHeader&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot; &amp;quot;&lt;br /&gt;
            &amp;lt;&amp;lt; schemeName&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot; &amp;quot;&lt;br /&gt;
            &amp;lt;&amp;lt; sectionHeader&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            for (itWidgetList = mWidgetList.begin(); itWidgetList != mWidgetList.end(); itWidgetList++)&lt;br /&gt;
            {&lt;br /&gt;
                getProperties(schemeName, (*itWidgetList));&lt;br /&gt;
&lt;br /&gt;
                if (mPropertyList.size() == 0)&lt;br /&gt;
                {&lt;br /&gt;
                    continue;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                out &amp;lt;&amp;lt; widgetHeader&lt;br /&gt;
                &amp;lt;&amp;lt; &amp;quot; &amp;quot;&lt;br /&gt;
                &amp;lt;&amp;lt; (*itWidgetList)&lt;br /&gt;
                &amp;lt;&amp;lt; &amp;quot; &amp;quot;&lt;br /&gt;
                &amp;lt;&amp;lt; widgetHeader&lt;br /&gt;
                &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                propertiesOnLine = 0;&lt;br /&gt;
                out &amp;lt;&amp;lt; &amp;quot;{| class=\&amp;quot;wikitable\&amp;quot;  border=\&amp;quot;1\&amp;quot; \n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                for (itPropertyList = mPropertyList.begin(); itPropertyList != mPropertyList.end(); itPropertyList++)&lt;br /&gt;
                {&lt;br /&gt;
                    if (propertiesOnLine == propertiesPerLine)&lt;br /&gt;
                    {&lt;br /&gt;
                        out &amp;lt;&amp;lt; &amp;quot;|-\n&amp;quot;;&lt;br /&gt;
                        propertiesOnLine = 0;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    out &amp;lt;&amp;lt; &amp;quot;| &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    if ((*itPropertyList).second.falagard)&lt;br /&gt;
                    {&lt;br /&gt;
                        out &amp;lt;&amp;lt; falagardColor&lt;br /&gt;
                        &amp;lt;&amp;lt; &amp;quot; | &amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    out &amp;lt;&amp;lt;  &amp;quot;[[#&amp;quot;&lt;br /&gt;
                    &amp;lt;&amp;lt; (*itPropertyList).first&lt;br /&gt;
                    &amp;lt;&amp;lt; &amp;quot;]]\n&amp;quot;;&lt;br /&gt;
                    ++propertiesOnLine;&lt;br /&gt;
&lt;br /&gt;
                    if (completePropertyList.find((*itPropertyList).first) == completePropertyList.end())&lt;br /&gt;
                    {&lt;br /&gt;
                        completePropertyList[(*itPropertyList).first] = (*itPropertyList).second;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                out &amp;lt;&amp;lt; &amp;quot;|}\n\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        out &amp;lt;&amp;lt; sectionHeader&lt;br /&gt;
        &amp;lt;&amp;lt; &amp;quot; Properties &amp;quot;&lt;br /&gt;
        &amp;lt;&amp;lt; sectionHeader&lt;br /&gt;
        &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
        const CEGUI::String falagardKeyword(&amp;quot;Falagard&amp;quot;);&lt;br /&gt;
        CEGUI::String::size_type falagardPos;&lt;br /&gt;
        CEGUI::String propertyDescription;&lt;br /&gt;
        PropertyList::iterator itCompletePropertyList;&lt;br /&gt;
&lt;br /&gt;
        for (itCompletePropertyList = completePropertyList.begin();&lt;br /&gt;
                itCompletePropertyList != completePropertyList.end();&lt;br /&gt;
                itCompletePropertyList++)&lt;br /&gt;
        {&lt;br /&gt;
            out &amp;lt;&amp;lt; propertyHeader&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot; &amp;quot;&lt;br /&gt;
            &amp;lt;&amp;lt; (*itCompletePropertyList).first&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot; &amp;quot;&lt;br /&gt;
            &amp;lt;&amp;lt; propertyHeader&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            propertyDescription = (*itCompletePropertyList).second.help;&lt;br /&gt;
            falagardPos = (*itCompletePropertyList).second.help.find(falagardKeyword);&lt;br /&gt;
&lt;br /&gt;
            if (falagardPos != CEGUI::String::npos)&lt;br /&gt;
            {&lt;br /&gt;
                propertyDescription = propertyDescription.replace(falagardPos,&lt;br /&gt;
                                      falagardKeyword.length(),&lt;br /&gt;
                                      &amp;quot;&amp;lt;font COLOR=\&amp;quot;#FFBF00\&amp;quot;&amp;gt;Falagard&amp;lt;/font&amp;gt;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            out &amp;lt;&amp;lt; propertyDescription&lt;br /&gt;
            &amp;lt;&amp;lt; &amp;quot;\n\n&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        out.close();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void ExportHtml()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void ExportXml()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
&lt;br /&gt;
    // Widget containing the list of schemes&lt;br /&gt;
    CEGUI::Combobox* mSchemes;&lt;br /&gt;
&lt;br /&gt;
    // Widget containing the list of widgets in a scheme&lt;br /&gt;
    CEGUI::Combobox* mWidgets;&lt;br /&gt;
&lt;br /&gt;
    // Widget containing the list of properties&lt;br /&gt;
    CEGUI::Listbox* mProperties;&lt;br /&gt;
&lt;br /&gt;
    // Type of list of widgets for a scheme&lt;br /&gt;
    typedef std::vector&amp;lt;CEGUI::String&amp;gt; WidgetList;&lt;br /&gt;
&lt;br /&gt;
    // List of widgets for a scheme&lt;br /&gt;
    WidgetList mWidgetList;&lt;br /&gt;
&lt;br /&gt;
    // Struct holding info for a property&lt;br /&gt;
    struct PropertyInfo&lt;br /&gt;
    {&lt;br /&gt;
        CEGUI::String help;&lt;br /&gt;
        bool falagard;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    // Type of list of properties for a widget &amp;lt;property, help&amp;gt;&lt;br /&gt;
    typedef std::map&amp;lt;CEGUI::String, PropertyInfo&amp;gt;  PropertyList;&lt;br /&gt;
&lt;br /&gt;
    // List of properties for a widget&lt;br /&gt;
    PropertyList mPropertyList;&lt;br /&gt;
&lt;br /&gt;
    // Widget displaying additional information on a property&lt;br /&gt;
    CEGUI::MultiLineEditbox* mInformation;&lt;br /&gt;
&lt;br /&gt;
    // Radiobutton part of a group&lt;br /&gt;
    CEGUI::RadioButton* mRadioButton;&lt;br /&gt;
&lt;br /&gt;
    // Defines the types of export&lt;br /&gt;
    enum ExportType {Wiki, Html, Xml};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif // _PropertyFinder_h_&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Main.cpp ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
	#define WIN32_LEAN_AND_MEAN&lt;br /&gt;
	#define NOMINMAX&lt;br /&gt;
	#include &amp;quot;windows.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;PropertyFinder.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)&lt;br /&gt;
#else&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
#endif&lt;br /&gt;
{&lt;br /&gt;
    DemoSample app;&lt;br /&gt;
    int i = app.run();&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== PropertyFinder.layout ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GUILayout &amp;gt;&lt;br /&gt;
    &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;PropertyFinder&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Property Finder&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;InheritsAlpha&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.0643816,0},{0.0124997,0},{0.903446,0},{0.891667,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;PropertyFinder/SchemeLabel&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Scheme:&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.019553,0},{0.0836117,0},{0.114991,0},{0.146434,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Combobox&amp;quot; Name=&amp;quot;PropertyFinder/SchemeList&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ReadOnly&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.116201,0},{0.0836117,0},{0.440692,0},{0.84974,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxEditTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;PropertyFinder/WidgetLabel&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Widget:&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.473929,0},{0.0836117,0},{0.569368,0},{0.146434,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Combobox&amp;quot; Name=&amp;quot;PropertyFinder/WidgetList&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ReadOnly&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.570578,0},{0.0836117,0},{0.969551,0},{0.823935,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxEditTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Listbox&amp;quot; Name=&amp;quot;PropertyFinder/Properties&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.019553,0},{0.164195,0},{0.440692,0},{0.89201,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/MultiLineEditbox&amp;quot; Name=&amp;quot;PropertyFinder/Information&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;&amp;lt;/Property&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ReadOnly&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.473929,0},{0.164195,0},{0.969551,0},{0.89201,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;PropertyFinder/Export&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Export&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.019553,0},{0.904265,0},{0.161971,0},{0.983649,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;PropertyFinder/ExportWiki&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Wiki&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Selected&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.186517,0},{0.904265,0},{0.251611,0},{0.981279,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;PropertyFinder/ExportHtml&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;HTML&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.271818,0},{0.904265,0},{0.336911,0},{0.98128,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;PropertyFinder/ExportXml&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;XML&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.357547,0},{0.904265,0},{0.42264,0},{0.98128,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
    &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Most_important_events&amp;diff=4313</id>
		<title>Most important events</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Most_important_events&amp;diff=4313"/>
				<updated>2011-03-06T01:38:03Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}} {{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
This article is going to show you the most important and useful events of each widget.&lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
I'm only going to change the initialiseSample function for each widget + adding some others.&lt;br /&gt;
==== EventGalore.h ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _EventGalore_h_&lt;br /&gt;
#define _EventGalore_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;CEGuiSample.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class EventGalore : public CEGuiSample&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   bool initialiseSample()&lt;br /&gt;
   {&lt;br /&gt;
       try&lt;br /&gt;
       {&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		&lt;br /&gt;
		WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
		// Load the TaharezLook scheme and set up the default mouse cursor and font&lt;br /&gt;
		SchemeManager::getSingleton().loadScheme(&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
		System::getSingleton().setDefaultMouseCursor(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
		if(!FontManager::getSingleton().isFontPresent(&amp;quot;Commonwealth-10&amp;quot;))&lt;br /&gt;
			FontManager::getSingleton().createFont(&amp;quot;Commonwealth-10.font&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// Set the GUI Sheet&lt;br /&gt;
		Window* sheet = winMgr.createWindow(&amp;quot;DefaultWindow&amp;quot;, &amp;quot;root_wnd&amp;quot;);&lt;br /&gt;
		System::getSingleton().setGUISheet(sheet);&lt;br /&gt;
&lt;br /&gt;
		// Place here the code from the widgets, place functions below this function.&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
	catch(CEGUI::Exception &amp;amp;e)&lt;br /&gt;
	{&lt;br /&gt;
		#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
			MessageBox(NULL, e.getMessage().c_str(), &amp;quot;Error initializing the demo&amp;quot;, MB_OK | MB_ICONERROR | MB_TASKMODAL);&lt;br /&gt;
		#else&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;Error initializing the demo:&amp;quot; &amp;lt;&amp;lt; e.getMessage().c_str() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
   }&lt;br /&gt;
   void cleanupSample(void)&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
};&lt;br /&gt;
#endif // _EventGalore_h_&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
	#define WIN32_LEAN_AND_MEAN&lt;br /&gt;
	#define NOMINMAX&lt;br /&gt;
	#include &amp;quot;windows.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;EventGalore.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)&lt;br /&gt;
#else&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
#endif&lt;br /&gt;
{&lt;br /&gt;
    EventGalore app;&lt;br /&gt;
    return app.run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Widgets ===&lt;br /&gt;
&lt;br /&gt;
==== Window ====&lt;br /&gt;
&lt;br /&gt;
The Window widget is a important baseclass, all widgets inherit this class. It has lots 'n lots of events, where a few are introduced by other widgets, and where many are unimportant. If a event is taken from this Window class, it is mentioned.&lt;br /&gt;
&lt;br /&gt;
* EventDragDropItemEnters - Fired when a drag and drop item floats over the window.&lt;br /&gt;
* EventDragDropItemLeaves - Fired when a drag and drop item floats out of the window.&lt;br /&gt;
* EventDragDropItemDropped - Fired when the item has been dropped on the window.&lt;br /&gt;
&lt;br /&gt;
==== PushButton ====&lt;br /&gt;
&lt;br /&gt;
The button is a simple, expected widget. It contains only one important event, but we are going to add a few more.&lt;br /&gt;
&lt;br /&gt;
* EventClicked - Fired when the button has been clicked.&lt;br /&gt;
* EventMouseEnters - Fired when the mouse enters the widget. Inherited from Window.&lt;br /&gt;
* EventMouseLeaves - Fired when the mouse leaves the widget. Inherited from Window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
PushButton * pushButton = static_cast&amp;lt;PushButton*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;Button1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(pb);&lt;br /&gt;
pushButton-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
pushButton-&amp;gt;setSize(UVector2(cegui_reldim(0.2f), cegui_reldim(0.08f)));&lt;br /&gt;
pushButton-&amp;gt;setText(&amp;quot;Hey! Come here!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
pushButton-&amp;gt;subscribeEvent(PushButton::EventClicked, Event::Subscriber(&amp;amp;EventGalore::onPushButtonClicked, this));&lt;br /&gt;
pushButton-&amp;gt;subscribeEvent(PushButton::EventMouseEnters, Event::Subscriber(&amp;amp;EventGalore::onMouseEnters, this));&lt;br /&gt;
pushButton-&amp;gt;subscribeEvent(PushButton::EventMouseLeaves, Event::Subscriber(&amp;amp;EventGalore::onMouseLeaves, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onPushButtonClicked(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Our button has been clicked!&lt;br /&gt;
	CEGUI::PushButton * pushButton = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Button1&amp;quot;));&lt;br /&gt;
	pushButton-&amp;gt;setText(&amp;quot;We got clicked!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseEnters(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Mouse has entered the button. (Hover)&lt;br /&gt;
	CEGUI::PushButton * pushButton = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Button1&amp;quot;));&lt;br /&gt;
	pushButton-&amp;gt;setText(&amp;quot;Now click!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseLeaves(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Mouse has left the button.&lt;br /&gt;
	CEGUI::PushButton * pushButton = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Button1&amp;quot;));&lt;br /&gt;
	// Back to its original state!&lt;br /&gt;
	pushButton-&amp;gt;setText(&amp;quot;Hey! Come here!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Listbox ====&lt;br /&gt;
&lt;br /&gt;
The listbox is a very useful listing widget. Only has one important event.&lt;br /&gt;
&lt;br /&gt;
* EventSelectionChanged - Fired when a or another item has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Listbox * listBox = static_cast&amp;lt;Listbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Listbox&amp;quot;, &amp;quot;Listbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(listBox);&lt;br /&gt;
&lt;br /&gt;
listBox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
listBox-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.4f)));&lt;br /&gt;
			&lt;br /&gt;
ListboxTextItem * listBoxItem = new ListboxTextItem(&amp;quot;Our very first item.&amp;quot;, 1);&lt;br /&gt;
listBoxItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
listBox-&amp;gt;addItem(listBoxItem);&lt;br /&gt;
&lt;br /&gt;
listBoxItem = new ListboxTextItem(&amp;quot;Our second item.&amp;quot;, 2);&lt;br /&gt;
listBoxItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
listBox-&amp;gt;addItem(listBoxItem);&lt;br /&gt;
&lt;br /&gt;
listBox-&amp;gt;subscribeEvent(Listbox::EventSelectionChanged, Event::Subscriber(&amp;amp;EventGalore::onSelectionChanged, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onSelectionChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
        // The selection has changed.&lt;br /&gt;
	CEGUI::Listbox * listBox = static_cast&amp;lt;CEGUI::Listbox*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Listbox1&amp;quot;));&lt;br /&gt;
	// Get the item we selected&lt;br /&gt;
	CEGUI::ListboxItem * selectedItem = listBox-&amp;gt;getFirstSelectedItem();&lt;br /&gt;
	selectedItem-&amp;gt;setText(&amp;quot;Oh we got selected!&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Checkbox ====&lt;br /&gt;
&lt;br /&gt;
A checkable item useful for boolean(true or false) 'questions'.&lt;br /&gt;
&lt;br /&gt;
* EventCheckStateChanged - Fired when the checkbox got checked or un-checked.&lt;br /&gt;
* EventMouseEnters - Fired when the mouse hovers over the checkbox. Inherited from Window.&lt;br /&gt;
* EventMouseLeaves - Fired when the mouse moves out of the checkbox. Inherited from Window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Checkbox * checkBox = static_cast&amp;lt;Checkbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Checkbox&amp;quot;, &amp;quot;Checkbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(checkBox);&lt;br /&gt;
checkBox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
checkBox-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.1f)));&lt;br /&gt;
&lt;br /&gt;
// A question where people can only answer yes or no (true or false)&lt;br /&gt;
checkBox-&amp;gt;setText(&amp;quot;Hey! Do you want to be rich?&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
checkBox-&amp;gt;subscribeEvent(Checkbox::EventCheckStateChanged, Event::Subscriber(&amp;amp;EventGalore::onCheckStateChanged, this));&lt;br /&gt;
checkBox-&amp;gt;subscribeEvent(Checkbox::EventMouseEnters, Event::Subscriber(&amp;amp;EventGalore::onMouseEnters, this));&lt;br /&gt;
checkBox-&amp;gt;subscribeEvent(Checkbox::EventMouseLeaves, Event::Subscriber(&amp;amp;EventGalore::onMouseLeaves, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onCheckStateChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Our item has been checked or unchecked, update our item accordingly.&lt;br /&gt;
	updateCheckbox();&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseEnters(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The mouse has entered, update the checkbox accordingly.&lt;br /&gt;
	updateCheckbox();		&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseLeaves(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::Checkbox * checkBox = static_cast&amp;lt;CEGUI::Checkbox*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Checkbox1&amp;quot;));&lt;br /&gt;
	// Reset&lt;br /&gt;
	checkBox-&amp;gt;setText(&amp;quot;Hey! Do you want to be rich?&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
void updateCheckbox()&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::Checkbox * checkBox = static_cast&amp;lt;CEGUI::Checkbox*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Checkbox1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (checkBox-&amp;gt;isSelected())&lt;br /&gt;
	{&lt;br /&gt;
		// Our checkbox is selected, so someone has previously said 'yes'.&lt;br /&gt;
		checkBox-&amp;gt;setText(&amp;quot;Click to choose no!&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		// Our item is not selected, so someone hasn't done anything yet, or it has been previously&lt;br /&gt;
		// unchecked.&lt;br /&gt;
		checkBox-&amp;gt;setText(&amp;quot;Click to choose yes!&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This might confuse at first sight. Let me go through this here, in steps.&lt;br /&gt;
* First, our checkbox is created and our mouse remains still.&lt;br /&gt;
* Second, the mouse enters the checkbox, updateCheckbox is called. In this case, our checkbox isn't selected by default, so the text becomes 'Click to choose yes!'.&lt;br /&gt;
* Third, we click. The onCheckStateChanged function is called, and that function calls updateCheckbox again to instantly change the text again. We have clicked the checkbox, while it wasn't previously checked, this means its checked now. Text becomes 'Click to choose no!'.&lt;br /&gt;
* Fourth, we move our mouse away from the checkbox. The onMouseLeaves function is called, where we reset the text to our question.&lt;br /&gt;
&lt;br /&gt;
==== RadioButton ====&lt;br /&gt;
&lt;br /&gt;
Similar to Checkbox, only it can be grouped, and once selected, it cannot be unselected (except when another button has been selected). Note, in this case, both functions are called when you click the unselected radiobutton. This is because one is unselected and one is selected.&lt;br /&gt;
&lt;br /&gt;
* EventSelectStateChanged - Fired when the radiobutton has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
RadioButton * radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/RadioButton&amp;quot;, &amp;quot;RadioButton1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(radioButton);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
radioButton-&amp;gt;setSize(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
radioButton-&amp;gt;setText(&amp;quot;Yes&amp;quot;);&lt;br /&gt;
radioButton-&amp;gt;setGroupID(0);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;subscribeEvent(RadioButton::EventSelectStateChanged, Event::Subscriber(&amp;amp;EventGalore::onButton1SelectChanged, this));&lt;br /&gt;
// To make sure the event is fired.&lt;br /&gt;
radioButton-&amp;gt;setSelected(true);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/RadioButton&amp;quot;, &amp;quot;RadioButton2&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(radioButton);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.2f)));&lt;br /&gt;
radioButton-&amp;gt;setSize(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
radioButton-&amp;gt;setText(&amp;quot;No&amp;quot;);&lt;br /&gt;
radioButton-&amp;gt;setGroupID(0);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;subscribeEvent(RadioButton::EventSelectStateChanged, Event::Subscriber(&amp;amp;EventGalore::onButton2SelectChanged, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onButton1SelectChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::RadioButton * radioButton1 = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;RadioButton1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (radioButton1-&amp;gt;isSelected())&lt;br /&gt;
	{&lt;br /&gt;
		// This one just got selected.&lt;br /&gt;
		radioButton1-&amp;gt;setText(&amp;quot;Ok then. Yes it is.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		// This one got unselected. Reset it.&lt;br /&gt;
		radioButton1-&amp;gt;setText(&amp;quot;Yes&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onButton2SelectChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// We have chosen no.&lt;br /&gt;
	CEGUI::RadioButton * radioButton2 = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;RadioButton2&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (radioButton2-&amp;gt;isSelected())&lt;br /&gt;
	{&lt;br /&gt;
		// This one just got selected.&lt;br /&gt;
		radioButton2-&amp;gt;setText(&amp;quot;Ok then. No it is.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		// This one got unselected. Reset it.&lt;br /&gt;
		radioButton2-&amp;gt;setText(&amp;quot;No&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Editbox ====&lt;br /&gt;
&lt;br /&gt;
A simple editable box where text can be entered.&lt;br /&gt;
&lt;br /&gt;
* EventTextAccepted - Fired when someone has pressed TAB or RETURN, or when someone has clicked another window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Editbox * editBox = static_cast&amp;lt;Editbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Editbox&amp;quot;, &amp;quot;Editbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(editBox);&lt;br /&gt;
&lt;br /&gt;
editBox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
editBox-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.1f)));&lt;br /&gt;
editBox-&amp;gt;setText(&amp;quot;Edit me!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
editBox-&amp;gt;subscribeEvent(Editbox::EventTextAccepted, Event::Subscriber(&amp;amp;EventGalore::onTextAccepted, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onTextAccepted(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Our text has been accepted by either deactivating it or pressing tab or enter.&lt;br /&gt;
	CEGUI::Editbox * editBox = static_cast&amp;lt;CEGUI::Editbox*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;Editbox1&amp;quot;));&lt;br /&gt;
	// So we got the text here, do something with it. Lets just..put the text back in reverse order.&lt;br /&gt;
	CEGUI::String currentText = editBox-&amp;gt;getText();&lt;br /&gt;
&lt;br /&gt;
	std::string finalString;&lt;br /&gt;
&lt;br /&gt;
	CEGUI::String::reverse_iterator ppkNode = currentText.rbegin();&lt;br /&gt;
	CEGUI::String::reverse_iterator ppkEnd = currentText.rend();&lt;br /&gt;
&lt;br /&gt;
	for (; ppkNode != ppkEnd; ++ppkNode)&lt;br /&gt;
	{&lt;br /&gt;
		finalString.push_back((*ppkNode));&lt;br /&gt;
	}&lt;br /&gt;
	editBox-&amp;gt;setText(finalString);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MultiLineEditbox ====&lt;br /&gt;
&lt;br /&gt;
This widget is pretty much the same as editbox, but allows more lines.&lt;br /&gt;
&lt;br /&gt;
* EventTextChanged - Fired when text has been changed. Inherited from window.&lt;br /&gt;
&lt;br /&gt;
This widget doesn't have the event TextAccepted, so you'll need to 'apply' the input by a button for example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
MultiLineEditbox * multiLineEditbox = static_cast&amp;lt;MultiLineEditbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/MultiLineEditbox&amp;quot;, &amp;quot;MultiEditbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(multiLineEditbox);&lt;br /&gt;
multiLineEditbox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
multiLineEditbox-&amp;gt;setSize(UVector2(cegui_reldim(0.3f), cegui_reldim(0.3f)));&lt;br /&gt;
multiLineEditbox-&amp;gt;setText(&amp;quot;Now edit me!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
multiLineEditbox-&amp;gt;subscribeEvent(MultiLineEditbox::EventTextChanged, Event::Subscriber(&amp;amp;EventGalore::onTextChanged, this));&lt;br /&gt;
&lt;br /&gt;
// This text is going to show the result.&lt;br /&gt;
Window * textWindow = winMgr.createWindow(&amp;quot;TaharezLook/StaticText&amp;quot;, &amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
sheet-&amp;gt;addChildWindow(textWindow);&lt;br /&gt;
textWindow-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.5f)));&lt;br /&gt;
textWindow-&amp;gt;setSize(UVector2(cegui_reldim(0.6f), cegui_reldim(0.1f)));&lt;br /&gt;
textWindow-&amp;gt;setText(&amp;quot;Now edit me!&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onTextChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::MultiLineEditbox * multiLineEditbox = static_cast&amp;lt;CEGUI::MultiLineEditbox*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;MultiEditbox1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * textWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	textWindow-&amp;gt;setText(multiLineEditbox-&amp;gt;getText());&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notice what happens when you enter text on another line though :)&lt;br /&gt;
&lt;br /&gt;
==== FrameWindow ====&lt;br /&gt;
&lt;br /&gt;
This is a window where you usually put your widgets on.&lt;br /&gt;
&lt;br /&gt;
* EventCloseClicked - Fired when the 'X' in the upper right corner is clicked (of the Framewindow).&lt;br /&gt;
* EventRollupToggled - Fired when the window gets rolled up, or rolled down.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
FrameWindow * frameWindow = static_cast&amp;lt;FrameWindow*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/FrameWindow&amp;quot;, &amp;quot;FrameWindow1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(frameWindow)&lt;br /&gt;
frameWindow-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
frameWindow-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.4f)));&lt;br /&gt;
frameWindow-&amp;gt;setText(&amp;quot;Our window&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
frameWindow-&amp;gt;subscribeEvent(FrameWindow::EventCloseClicked, Event::Subscriber(&amp;amp;EventGalore::onCloseClicked, this));&lt;br /&gt;
frameWindow-&amp;gt;subscribeEvent(FrameWindow::EventRollupToggled, Event::Subscriber(&amp;amp;EventGalore::onRollupToggled, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onCloseClicked(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Someone has clicked the upper right 'X'.&lt;br /&gt;
&lt;br /&gt;
	// We don't HAVE to cast to FrameWindow, as the method we are going to use to close the window&lt;br /&gt;
	// is available in Window, but for the sake of clarity...&lt;br /&gt;
	CEGUI::FrameWindow * frameWindow = static_cast&amp;lt;CEGUI::FrameWindow*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;FrameWindow1&amp;quot;));&lt;br /&gt;
	frameWindow-&amp;gt;destroy();&lt;br /&gt;
	// Note: Dont try to delete the pointer.&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onRollupToggled(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::FrameWindow * frameWindow = static_cast&amp;lt;CEGUI::FrameWindow*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;FrameWindow1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (frameWindow-&amp;gt;isRolledup())&lt;br /&gt;
	{&lt;br /&gt;
		frameWindow-&amp;gt;setText(&amp;quot;Rolled up&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		frameWindow-&amp;gt;setText(&amp;quot;Our window&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ProgressBar ====&lt;br /&gt;
&lt;br /&gt;
A progress widget.&lt;br /&gt;
&lt;br /&gt;
* EventProgressDone - Fired when the progress bar reaches 100%(1.0f).&lt;br /&gt;
* EventProgressChanged - Fired when the progress changes.&lt;br /&gt;
* EventMouseClick - Fired when someone clicked on the window. Inherited from Window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ProgressBar * progressBar = static_cast&amp;lt;ProgressBar*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/ProgressBar&amp;quot;, &amp;quot;ProgressBar1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(progressBar);&lt;br /&gt;
progressBar-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
progressBar-&amp;gt;setSize(UVector2(cegui_reldim(0.5f), cegui_reldim(0.04f)));&lt;br /&gt;
&lt;br /&gt;
progressBar-&amp;gt;subscribeEvent(ProgressBar::EventProgressDone, Event::Subscriber(&amp;amp;EventGalore::onProgressDone, this));&lt;br /&gt;
progressBar-&amp;gt;subscribeEvent(ProgressBar::EventProgressChanged, Event::Subscriber(&amp;amp;EventGalore::onProgressChanged, this));&lt;br /&gt;
progressBar-&amp;gt;subscribeEvent(ProgressBar::EventMouseClick, Event::Subscriber(&amp;amp;EventGalore::onMouseClick, this));&lt;br /&gt;
&lt;br /&gt;
Window * resultWindow = winMgr.createWindow(&amp;quot;TaharezLook/StaticText&amp;quot;, &amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
sheet-&amp;gt;addChildWindow(resultWindow);&lt;br /&gt;
resultWindow-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.05f)));&lt;br /&gt;
resultWindow-&amp;gt;setSize(UVector2(cegui_reldim(0.5f), cegui_reldim(0.06f)));&lt;br /&gt;
resultWindow-&amp;gt;setText(&amp;quot;Lets start progressing!&amp;quot;);&lt;br /&gt;
resultWindow-&amp;gt;setProperty(&amp;quot;FrameEnabled&amp;quot;, &amp;quot;false&amp;quot;);&lt;br /&gt;
resultWindow-&amp;gt;setProperty(&amp;quot;BackgroundEnabled&amp;quot;, &amp;quot;false&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onProgressDone(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The progress bar is full.&lt;br /&gt;
	CEGUI::Window * resultWindow = CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(&amp;quot;We are done!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onProgressChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The progress changed.&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::ProgressBar * progressBar = static_cast&amp;lt;CEGUI::ProgressBar*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;ProgressBar1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * resultWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	float progress = progressBar-&amp;gt;getProgress();&lt;br /&gt;
	int finalProgress = static_cast&amp;lt;int&amp;gt;(progress*100);&lt;br /&gt;
	std::stringstream resultStr;&lt;br /&gt;
	resultStr &amp;lt;&amp;lt; &amp;quot;Progress: &amp;quot; &amp;lt;&amp;lt; finalProgress &amp;lt;&amp;lt; &amp;quot;%&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(resultStr.str());&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseClick(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::ProgressBar * progressBar = static_cast&amp;lt;CEGUI::ProgressBar*&amp;gt;(CEGUI::WindowManager::getSingleton().getWindow(&amp;quot;ProgressBar1&amp;quot;));&lt;br /&gt;
	progressBar-&amp;gt;setProgress(progressBar-&amp;gt;getProgress() + 0.05f);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider ====&lt;br /&gt;
&lt;br /&gt;
A widget which accepts input though moving a 'thumb' between a range.&lt;br /&gt;
&lt;br /&gt;
* EventValueChanged - Fired when the slider's thumb has moved one step left or right.&lt;br /&gt;
* EventThumbTrackEnded - Fired when the user stops moving the slider's thumb. Handy when a change causes an CPU expensive operation, because now you only catch the 'final' change.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Slider * slider = static_cast&amp;lt;Slider*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Slider&amp;quot;, &amp;quot;Slider1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(slider);&lt;br /&gt;
slider-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
slider-&amp;gt;setSize(UVector2(cegui_reldim(0.5f), cegui_reldim(0.04f)));&lt;br /&gt;
slider-&amp;gt;setMaxValue(1.0f);&lt;br /&gt;
slider-&amp;gt;setClickStep(0.1f);&lt;br /&gt;
slider-&amp;gt;setCurrentValue(0.5f); // Start half way&lt;br /&gt;
&lt;br /&gt;
slider-&amp;gt;subscribeEvent(Slider::EventValueChanged, Event::Subscriber(&amp;amp;EventGalore::onSliderValueChanged, this));&lt;br /&gt;
slider-&amp;gt;subscribeEvent(Slider::EventProgressChanged, Event::Subscriber(&amp;amp;EventGalore::onSliderChangeEnded, this));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onSliderValueChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The slider moved.&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::Slider * slider = static_cast&amp;lt;CEGUI::Slider*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;Slider1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * resultWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        std::stringstream resultStr;&lt;br /&gt;
	resultStr &amp;lt;&amp;lt; &amp;quot;Moved to: &amp;quot; &amp;lt;&amp;lt; slider-&amp;gt;getCurrentValue();&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(resultStr);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onSliderChangeEnded(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The slider stopped moving (user released mouse)&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::Slider * slider = static_cast&amp;lt;CEGUI::Slider*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;Slider1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * resultWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        std::stringstream resultStr;&lt;br /&gt;
	resultStr &amp;lt;&amp;lt; &amp;quot;Moving stopped at: &amp;quot; &amp;lt;&amp;lt; slider-&amp;gt;getCurrentValue();&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(resultStr);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spinner ====&lt;br /&gt;
&lt;br /&gt;
==== MultiColumnList ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;br /&gt;
[[Category:WIP]]&lt;br /&gt;
[[Category:Update requested]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=DirectInput_to_CEGUI_utf32&amp;diff=4312</id>
		<title>DirectInput to CEGUI utf32</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=DirectInput_to_CEGUI_utf32&amp;diff=4312"/>
				<updated>2011-03-06T01:37:52Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}} {{VersionBadge|0.5}} {{VersionBadge|0.6}} {{VersionBadge|0.7}}&lt;br /&gt;
&lt;br /&gt;
This function converts DirectInput's scan codes into a utf32 character value compatible with the injectChar() function. It converts both simple characters as well as characters composed of a dead key as well as a single character, simplifying multi-lingual support. The value of zero is returned if a character could not be converted.&lt;br /&gt;
&lt;br /&gt;
Some characters are composed by two keystrokes; a dead key followed by a simple key. An example with the French (Canada) keyboard is the letter è, which is composed of the dead key (diacritic) ALT-[ followed by the letter e. In order to correctly generate the letter è the dead key must be converted from a standalone diacritic to a combining diacritic. The unicode character set specifies the combining diacritics in the range of 0x300 to 0x36F. This current implementation only supports 5 diacritic, making the following code compatible with both English and French languages. The list of combining diacritics can be obtained from http://www.fileformat.info/info/unicode/block/combining_diacritical_marks/images.htm&lt;br /&gt;
&lt;br /&gt;
By default CEGUI only loads a portion of the character set specified in a font. The following code loads the entire Latin character set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 CEGUI::Font* guiFont = CEGUI::FontManager::getSingleton().createFont(&amp;quot;Arial&amp;quot;, &amp;quot;c:/windows/fonts/arial.ttf&amp;quot;, 16, CEGUI::Default);&lt;br /&gt;
 guiFont-&amp;gt;defineFontGlyphs(0x0020, 0x0323); // Latin character set&lt;br /&gt;
 mGUISystem-&amp;gt;setDefaultFont(guiFont);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Character Map (charmap.exe) tool is very useful when trying to figure out the range of characters needed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 CEGUI::utf32 keycodeToUTF32( unsigned int scanCode)&lt;br /&gt;
 {&lt;br /&gt;
 	CEGUI::utf32 utf = 0;&lt;br /&gt;
 &lt;br /&gt;
 	BYTE keyboardState[256];&lt;br /&gt;
 	unsigned char ucBuffer[3];&lt;br /&gt;
 	static WCHAR deadKey = '\0';&lt;br /&gt;
 &lt;br /&gt;
 	// Retrieve the keyboard layout in order to perform the necessary convertions&lt;br /&gt;
 	HKL hklKeyboardLayout = GetKeyboardLayout(0); // 0 means current thread &lt;br /&gt;
 	// This seemingly cannot fail &lt;br /&gt;
 	// If this value is cached then the application must respond to WM_INPUTLANGCHANGE &lt;br /&gt;
 &lt;br /&gt;
 	// Retrieve the keyboard state&lt;br /&gt;
 	// Handles CAPS-lock and SHIFT states&lt;br /&gt;
 	if (GetKeyboardState(keyboardState) == FALSE)&lt;br /&gt;
 		return utf;&lt;br /&gt;
 &lt;br /&gt;
 	/* 0. Convert virtual-key code into a scan code&lt;br /&gt;
        1. Convert scan code into a virtual-key code&lt;br /&gt;
 	      Does not distinguish between left- and right-hand keys.&lt;br /&gt;
        2. Convert virtual-key code into an unshifted character value&lt;br /&gt;
 	      in the low order word of the return value. Dead keys (diacritics)&lt;br /&gt;
 		  are indicated by setting the top bit of the return value.&lt;br /&gt;
        3. Windows NT/2000/XP: Convert scan code into a virtual-key&lt;br /&gt;
 	      Distinguishes between left- and right-hand keys.*/&lt;br /&gt;
 	UINT virtualKey = MapVirtualKeyEx(scanCode, 3, hklKeyboardLayout);&lt;br /&gt;
 	if (virtualKey == 0) // No translation possible&lt;br /&gt;
 		return utf;&lt;br /&gt;
 &lt;br /&gt;
     /* Parameter 5:&lt;br /&gt;
 		0. No menu is active&lt;br /&gt;
 		1. A menu is active&lt;br /&gt;
        Return values:&lt;br /&gt;
 		Negative. Returned a dead key&lt;br /&gt;
 		0. No translation available&lt;br /&gt;
 		1. A translation exists &lt;br /&gt;
 		2. Dead-key could not be combined with character 	*/&lt;br /&gt;
 	int ascii = ToAsciiEx(virtualKey, scanCode, keyboardState, (LPWORD) ucBuffer, 0, hklKeyboardLayout);&lt;br /&gt;
 	if(deadKey != '\0' &amp;amp;&amp;amp; ascii == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		// A dead key is stored and we have just converted a character key&lt;br /&gt;
 		// Combine the two into a single character&lt;br /&gt;
 		WCHAR wcBuffer[3];&lt;br /&gt;
 		WCHAR out[3];&lt;br /&gt;
 		wcBuffer[0] = ucBuffer[0];&lt;br /&gt;
 		wcBuffer[1] = deadKey;&lt;br /&gt;
 		wcBuffer[2] = '\0';&lt;br /&gt;
 		if( FoldStringW(MAP_PRECOMPOSED, (LPWSTR) wcBuffer, 3, (LPWSTR) out, 3) )&lt;br /&gt;
 			utf = out[0];&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			// FoldStringW failed&lt;br /&gt;
 			DWORD dw = GetLastError();&lt;br /&gt;
 			switch(dw)&lt;br /&gt;
 			{&lt;br /&gt;
 			case ERROR_INSUFFICIENT_BUFFER:&lt;br /&gt;
 			case ERROR_INVALID_FLAGS:&lt;br /&gt;
 			case ERROR_INVALID_PARAMETER:&lt;br /&gt;
 				break;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		deadKey = '\0';&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (ascii == 1)&lt;br /&gt;
 	{&lt;br /&gt;
 		// We have a single character&lt;br /&gt;
 		utf = ucBuffer[0];&lt;br /&gt;
 		deadKey = '\0';&lt;br /&gt;
 	}&lt;br /&gt;
 	else&lt;br /&gt;
 	{&lt;br /&gt;
 		// Convert a non-combining diacritical mark into a combining diacritical mark&lt;br /&gt;
 		switch(ucBuffer[0])&lt;br /&gt;
 		{&lt;br /&gt;
 		case 0x5E: // Circumflex accent: â&lt;br /&gt;
 			deadKey = 0x302;&lt;br /&gt;
 			break;&lt;br /&gt;
 		case 0x60: // Grave accent: à&lt;br /&gt;
 			deadKey = 0x300;&lt;br /&gt;
 			break;&lt;br /&gt;
 		case 0xA8: // Diaeresis: ü&lt;br /&gt;
 			deadKey = 0x308;&lt;br /&gt;
 			break;&lt;br /&gt;
 		case 0xB4: // Acute accent: é&lt;br /&gt;
 			deadKey = 0x301;&lt;br /&gt;
 			break;&lt;br /&gt;
 		case 0xB8: // Cedilla: ç&lt;br /&gt;
 			deadKey = 0x327;&lt;br /&gt;
 			break;&lt;br /&gt;
 		default:&lt;br /&gt;
 			deadKey = ucBuffer[0];&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	return utf;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Create_a_CheckListboxItem&amp;diff=4311</id>
		<title>Create a CheckListboxItem</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Create_a_CheckListboxItem&amp;diff=4311"/>
				<updated>2011-03-06T01:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes you need a list where the items are checkable. The ItemListbox introduced in CEGUI 0.5 accepts all sorts of items, as long as they inherit ItemEntry. I'm going to teach you how to create a CheckListboxItem to put in your list.&lt;br /&gt;
&lt;br /&gt;
== Getting started! ==&lt;br /&gt;
I'm assuming you are just using a standard imageset, with a standard scheme (currently TaharezLook and WindowsLook are supported).&lt;br /&gt;
&lt;br /&gt;
We are first going to get started by writing the looknfeel entry. This is the most important part of this tutorial, as its basically 70% of what we need to do to achieve our goal. First of all, this entry has a few states:&lt;br /&gt;
&lt;br /&gt;
# Enabled: How the item looks when the item is enabled.&lt;br /&gt;
# Disabled: How the item looks when the item is disabled.&lt;br /&gt;
# SelectedEnabled: How the item looks when the item is selected and is enabled.&lt;br /&gt;
# SelectedDisabled: How the item looks when the item is selected and is disabled.&lt;br /&gt;
&lt;br /&gt;
== Writing the requirements ==&lt;br /&gt;
&lt;br /&gt;
Open the appriopiate looknfeel file (WindowsLook.looknfeel or TaharezLook.looknfeel), and place this at the bottom (inside the [[Falagard]] tags though!)&lt;br /&gt;
&lt;br /&gt;
''' Our start '''&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We first need to define a WidgetLook, this is where all the action happens in. It takes one attribute, name. This is simply the name of the widget you are defining. Now we are going to add the states. These states are necessary for the item to respond to certain events. For example, when the item is disabled, the state Disabled is used.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We define a state via StateImagery. It requires the attribute name which specifies what state its in. Don't worry about Layer for now. Section is always used. This part takes care of actually changing the look. It requires a attribute section, this is actually WHAT to change, in this case the label. TextColour is a simple colour (black), we will define it below. Now as you can see the Enabled state just sets the text colour to black, thats all it does. Same goes for Disabled (remember this is an item, items are not commonly disabled).&lt;br /&gt;
&lt;br /&gt;
Now we are going to take a look at the other two states.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These states pretty much speak for themselves altough there are more sections listed. Section not only defines what to change, also defines what needs to be shown. In the Enabled state we dont want it to look like its selected, so there is no selection section. Note that the order of which you put the Sections are also the Z order. In this case we are putting the selection image first, and then text. If we would do it the other way around, we wouldn't see the text.&lt;br /&gt;
&lt;br /&gt;
Now we are going to add the definitions of some colours and property's.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;TextColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectedTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionBrush&amp;quot; initialValue=&amp;quot;set:WindowsLook image:Background&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionColour&amp;quot; initialValue=&amp;quot;FF3030FF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;Selectable&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Our first PropertyDefinition just defines a text for a colour used in the StateImagery sections. Same goes for the other PropertyDefinitions except the SelectionBrush. Instead of defining a colour, it defines a image. In this case it uses the WindowsLook Background image defined in the imageset. Then we got a Property, which simply implies some sort of setting. In this case, we make it a item by adding the Property 'Selectable' and setting it to true as we want it to act like an item.&lt;br /&gt;
&lt;br /&gt;
== Writing the functional parts ==&lt;br /&gt;
&lt;br /&gt;
We now need to add the parts where the background, text and the selection gets drawn. This seems hard, but isn't actually. We are going to start off with a NamedArea. This is required for a listbox item as the listbox needs to know how big the item is to fit it into the list. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;TextColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectedTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionBrush&amp;quot; initialValue=&amp;quot;set:WindowsLook image:Background&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionColour&amp;quot; initialValue=&amp;quot;FF3030FF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;Selectable&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;b&amp;gt;&amp;lt;NamedArea name=&amp;quot;ContentSize&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Width&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;HorzExtent&amp;quot; padding=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Height&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;LineSpacing&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I am assuming you know what the basics like the Area, Dim and such. Though FontDim is used to change the size of the item depending on a label. The part we just added now defines the size of the item.&lt;br /&gt;
Instead of adding the whole code here again, I'm only showing the additions from now on.&lt;br /&gt;
&lt;br /&gt;
Ok! Now we are going to add the actual Checkbox. This is crucial for our goal, as it allows the item to be checked upon click. We dont have to write the states and all that for the Checkbox, we just use Child! Just place this under our NamedArea and above the first StateImagery.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Child type =&amp;quot;WindowsLook/Checkbox&amp;quot; nameSuffix=&amp;quot;__auto__checkbox&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Area&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;LeftEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;AbsoluteDim value=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;TopEdge&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Height&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;/Area&amp;gt;&lt;br /&gt;
 &amp;lt;/Child&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This adds a WindowsLook/Checkbox to our item. The suffix is necessary to make the name unique. the rest is pretty straight forward - it adds the checkbox on the left side of the item, starting from 3 pixels to make it look smooth.&lt;br /&gt;
&lt;br /&gt;
Now we need a label, this part is simple and I will not spend as much time on clarifying it, it basically explains itself.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;-3&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The TextComponent simply states this this can contain text. The Dim's are just positioning. Note the LeftEdge, the label starts at 18 pixels from the left. This is because the first ~15 pixels are occupied by the checkbox.&lt;br /&gt;
&lt;br /&gt;
Now something important! The selection image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;ImageProperty name=&amp;quot;SelectionBrush&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;ColourProperty name=&amp;quot;SelectionColour&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we give it the name selection, as used in the StateImagery. The Area part is just positioning and fitting again. The Dim's used there simply make sure the whole item is filled. ImageProperty defines the image to use. We have defined SelectionBrush at the top of our WidgetLook. It simply fills the Area with that image now. ColourProperty colours the image, we have also defined SelectionColour at the top of the WidgetLook. VertFormat and HorzFormat are stretched, if its not stretched, it will only draw one pixel of the image, making it near invisible. Stretching it just makes sure the whole area is covered.&lt;br /&gt;
&lt;br /&gt;
That was it! We wrote our looknfeel entry!!&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;TextColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectedTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionBrush&amp;quot; initialValue=&amp;quot;set:WindowsLook image:Background&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionColour&amp;quot; initialValue=&amp;quot;FF3030FF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;Selectable&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;NamedArea name=&amp;quot;ContentSize&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Width&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;HorzExtent&amp;quot; padding=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Height&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;LineSpacing&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
     &amp;lt;Child type =&amp;quot;WindowsLook/Checkbox&amp;quot; nameSuffix=&amp;quot;__auto__checkbox&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;LeftEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;TopEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Height&amp;quot;/&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/Child&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;-3&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;ImageProperty name=&amp;quot;SelectionBrush&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;ColourProperty name=&amp;quot;SelectionColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pfew am I glad thats done. &lt;br /&gt;
&lt;br /&gt;
== Coding our item ==&lt;br /&gt;
&lt;br /&gt;
We have come to the part where we actually try out our new item. We need to do a few things to call this one finished. First, we need to create the CheckListboxItem class. Then we are going to add the window factory to the system. Last but not least is adding the [[Falagard]] mapping. We'll start with the CheckListboxItem class.&lt;br /&gt;
&lt;br /&gt;
==== CheckListItem.h ====&lt;br /&gt;
 #ifndef _CHECKLISTITEM_&lt;br /&gt;
 #define _CHECKLISTITEM_&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;CEGUI.h&amp;gt;&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
     class CheckListboxItem : public ItemEntry&lt;br /&gt;
     {&lt;br /&gt;
     protected:&lt;br /&gt;
     public:&lt;br /&gt;
         CheckListboxItem(const String &amp;amp;type, const String &amp;amp;name);&lt;br /&gt;
         virtual ~CheckListboxItem();&lt;br /&gt;
         static const String WidgetTypeName;&lt;br /&gt;
    };&lt;br /&gt;
    CEGUI_DECLARE_WINDOW_FACTORY(CheckListboxItem)&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
As you can see, this class inherits ItemEntry. This is necessary as its THE thing that makes this item working properly. Pay special attention to '''CEGUI_DECLARE_WINDOW_FACTORY(CheckListboxItem)'''. This tells CEGUI that we are declarating the window.&lt;br /&gt;
&lt;br /&gt;
==== CheckListItem.cpp ====&lt;br /&gt;
 #include &amp;quot;CheckListItem.h&amp;quot;&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI_DEFINE_WINDOW_FACTORY(CheckListboxItem)&lt;br /&gt;
     const String CheckListboxItem::WidgetTypeName(&amp;quot;CEGUI/CheckListboxItem&amp;quot;);&lt;br /&gt;
     CheckListboxItem::CheckListboxItem(const String &amp;amp;type, const String &amp;amp;name) :&lt;br /&gt;
             ItemEntry(type, name)&lt;br /&gt;
     {&lt;br /&gt;
     }&lt;br /&gt;
     CheckListboxItem::~CheckListboxItem()&lt;br /&gt;
     {&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''CEGUI_DEFINE_WINDOW_FACTORY(CheckListboxItem)''' is quite important here. It tells CEGUI where we are placing the code that comes with the window. As you can see this class is quite empty, you are, of course, free to add anything you like to this class - these are just the mere basics.&lt;br /&gt;
&lt;br /&gt;
Now, there is one more important thing to do. Register this window properly in CEGUI.&lt;br /&gt;
&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
 void bindCEGUI()&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI::WindowFactoryManager&amp;amp; wfMgr = CEGUI::WindowFactoryManager::getSingleton();&lt;br /&gt;
     wfMgr.addFactory(&amp;amp;CEGUI_WINDOW_FACTORY(CheckListboxItem));&lt;br /&gt;
     wfMgr.addFalagardWindowMapping(&amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;CEGUI/ItemEntry&amp;quot;, &amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;Falagard/ItemEntry&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
addFalagardWindowMappings parameters are as follows: Name, Type, LooknFeel, WindowRenderer. Just put this code somewhere in your main file or on another place that you are sure is executed before using our new item. Also note, in order to use '''CEGUI_WINDOW_FACTORY()''' you need to be in the CEGUI namespace.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;SDLLoader.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;CheckListItem.h&amp;quot;&lt;br /&gt;
 void doStuff();&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
 void bindCEGUI()&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI::WindowFactoryManager&amp;amp; wfMgr = CEGUI::WindowFactoryManager::getSingleton();&lt;br /&gt;
     wfMgr.addFactory(&amp;amp;CEGUI_WINDOW_FACTORY(CheckListboxItem));&lt;br /&gt;
     wfMgr.addFalagardWindowMapping(&amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;CEGUI/ItemEntry&amp;quot;, &amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;Falagard/ItemEntry&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
 int main (int argc, char **argv) &lt;br /&gt;
 {&lt;br /&gt;
     SDLLoader sdl;&lt;br /&gt;
     sdl.init();&lt;br /&gt;
     CEGUI::bindCEGUI();&lt;br /&gt;
     doStuff();&lt;br /&gt;
     sdl.main_loop();&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 void doStuff()&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI::System * m_System = CEGUI::System::getSingletonPtr();&lt;br /&gt;
     CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Insane);&lt;br /&gt;
     CEGUI::WindowManager * m_WndMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
     CEGUI::Window * m_Root = m_System-&amp;gt;getGUISheet();&lt;br /&gt;
     &amp;lt;br /&amp;gt;&lt;br /&gt;
     CEGUI::ItemListbox * lb = (CEGUI::ItemListbox*)m_WndMgr-&amp;gt;createWindow(&amp;quot;WindowsLook/ItemListbox&amp;quot;, &amp;quot;Lol&amp;quot;);&lt;br /&gt;
     lb-&amp;gt;setSize(CEGUI::UVector2(CEGUI::UDim(0.3f, 0.0f), CEGUI::UDim(0.3f, 0.0f)));&lt;br /&gt;
     lb-&amp;gt;setPosition(CEGUI::UVector2(CEGUI::UDim(0.1f, 0.0f), CEGUI::UDim(0.1f, 0.0f)));&lt;br /&gt;
     m_Root-&amp;gt;addChildWindow(lb);&lt;br /&gt;
     &amp;lt;br /&amp;gt;&lt;br /&gt;
     CEGUI::CheckListboxItem * check = (CEGUI::CheckListboxItem*)m_WndMgr-&amp;gt;createWindow(&amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;Test&amp;quot;);&lt;br /&gt;
     check-&amp;gt;setText(&amp;quot;Test&amp;quot;);&lt;br /&gt;
     lb-&amp;gt;addChildWindow(check);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
As you can see in the main function, the function that registers the window is called before actually creating it. Dont pay any attention to the sdl initiation - it's just my personal test environment.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have just created a CheckListboxItem. This was a very good practice because you also learned the technique required to write a completely new widget.&lt;br /&gt;
&lt;br /&gt;
Please contact me if you have any question, comments, feedback - anything, email me at [mailto:levia@openfrag.org levia at openfrag dot com].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Levia]] 21:10, 5 April 2007 (GMT+1)&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Using_.layout_files&amp;diff=4310</id>
		<title>CEGUI In Practice - Using .layout files</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Using_.layout_files&amp;diff=4310"/>
				<updated>2011-03-06T01:37:33Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|5}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI InPractice 5 ==&lt;br /&gt;
&lt;br /&gt;
In this tutorial we will introduce how to use the .layout file.  This is likely what will be used for larger scale projects, where the art team isn't going to want to wait for you to recompile the source for every change they make.&lt;br /&gt;
&lt;br /&gt;
==== Meet the Layout ====&lt;br /&gt;
&lt;br /&gt;
The Layout file (.layout) is an xml file.  There exists at least two editors for layouts.  The first one is the  [[Downloads|CEGUI LayoutEditor]] This is a fairly mature editor.  Unfortunately it is deprecated and has not received any updates in sometime.  There is a new Editor (CEGUI Layout Editor 2) which is available from the SVN.  For the usage of this tutorial tho, we will not be using an editor and will be manipulating the .layout file with a plain old text editor.&lt;br /&gt;
&lt;br /&gt;
First thing to note, is its an XML file.  So proper XML formatting is required.  Second, is that it is hierarchical just like CEGUI.  We will work towards writing a Simple Console here.  I have created a console layout, and that will be the goal of this tutorial, to make a console editor like you would find in the various MMORPG's.  This is what we'll make today:&lt;br /&gt;
&lt;br /&gt;
[[File:TutorialInPractice-Console.jpg]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Attached is the layout:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;GUILayout &amp;gt;&lt;br /&gt;
    &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;ConsoleRoot&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Chat Window&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;DejaVuSans-10&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.114991,0},{0.358182,0},{0.519469,0},{0.775455,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;ConsoleRoot/EditBox&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.0201637,0},{0.787097,0},{0.694549,0},{0.957693,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TextParsingEnabled&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;ConsoleRoot/SendButton&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Send&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.732211,0},{0.812349,0},{0.928283,0},{0.946832,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Listbox&amp;quot; Name=&amp;quot;ConsoleRoot/ChatBox&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.00534809,0},{0.0131038,0},{0.949636,0},{0.762443,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
    &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Okay, i'll admit. I cheated and used a LayoutEditor for this. But i'm allowed to, I know what I'm doing otherwise, so do don't back talk me and do your homework.&lt;br /&gt;
&lt;br /&gt;
Erm.  Anyway, lets look at the setup of the .layout file.&lt;br /&gt;
&lt;br /&gt;
the first line &amp;lt;xml..&amp;gt;  Is just the XML Declaration, and is not important for us.&lt;br /&gt;
&lt;br /&gt;
the next line &amp;lt;GUILayout &amp;gt;  begins the .layout file as far as CEGUI is concerned.&lt;br /&gt;
&lt;br /&gt;
Next up is: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;ConsoleRoot&amp;quot; &amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
This is where the meat begins.  As you can see we're creating a window of type &amp;quot;TaharezLook/FrameWindow&amp;quot; with the name &amp;quot;ConsoleRoot&amp;quot; the next lines:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;      &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Chat Window&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;DejaVuSans-10&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.114991,0},{0.358182,0},{0.519469,0},{0.775455,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Change various PropertySets on that new framewindow.  It sets the font, Titlebar and the area.  these could also be done in code by calling:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::Window::setProperty(&amp;quot;TitlebarFont&amp;quot;,&amp;quot;DejaVuSans-10&amp;quot;);&amp;lt;/source&amp;gt;&lt;br /&gt;
So as you can see, the scripts can be very useful allowing us to change properties outside of the code.  Giving the artists a great deal of usability!&lt;br /&gt;
&lt;br /&gt;
Anyway, the next line is &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;       &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;ConsoleRoot/EditBox&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.0201637,0},{0.787097,0},{0.694549,0},{0.957693,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TextParsingEnabled&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll notice this is before the &amp;lt;/Window&amp;gt; of the ConsoleRoot, so it will be created as a child in of ConsoleRoot when the script is loaded in CEGUI. Can you tell what kind of window this will be? It will be an edit box. Thats the portion of the Console Window where the user will be able to type in what they want to say. I'm not going to go into detail about the rest of the windows, as they are pretty similar to the above examples. But &amp;quot;ConsoleRoot/SendButton&amp;quot; will be the send button, and &amp;quot;ConsoleRoot/ChatBox&amp;quot; will be where the chat messages will display to.&lt;br /&gt;
&lt;br /&gt;
[Note: As you can see I adopted the Naming scheme of Parent/Child window names. This is NOT required, but I think it helps make things easier to read on code side while debugging. You wouldn't want to just name it EditBox as that would be a pretty Common name, and may conflict with other windows you create later on in the application.]&lt;br /&gt;
&lt;br /&gt;
==== Applying our knowledge ====&lt;br /&gt;
&lt;br /&gt;
Now that we have gotten an introduction to the .layout file, we should learn how to implement this knowledge. How to get the layout file to show up in CEGUI.&lt;br /&gt;
&lt;br /&gt;
This code will load the layout into a new window:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::Window *newWindow = CEGUI::WindowManager::getSingleton().loadWindowLayout(&amp;quot;MyConsole&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pretty self explanetory. There is something to note tho, you can add a prefix to the names in this .layout file. This would be useful if you're going to add the same .layout multiple times, because after the first load you'd get name conflicts. It would find a previous &amp;quot;ConsoleRoot&amp;quot; for example. So by calling this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::Window *newWindow = CEGUI::WindowManager::getSingleton().loadWindowLayout(&amp;quot;MyConsole&amp;quot;,&amp;quot;second_&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It would append &amp;quot;second_&amp;quot; to the window names (ie. &amp;quot;second_ConsoleRoot&amp;quot;); This will prevent naming errors.&lt;br /&gt;
&lt;br /&gt;
Now if we ran this right now would we be able to see the window?&lt;br /&gt;
&lt;br /&gt;
Nope. We havn't attached it to the window hierarchy have we?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::System::getSingleton().getGUISheet()-&amp;gt;addChildWindow(newWindow);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
Well we showed how to load a .layout file. Sofar now we know how to Start the system with Ogre, create a window and understand properties, add input, process events, and load layouts. In the next tutorial we will apply this knowledge to create a console which actually does something! Till next time.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Managing_input&amp;diff=4309</id>
		<title>CEGUI In Practice - Managing input</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Managing_input&amp;diff=4309"/>
				<updated>2011-03-06T01:37:22Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|3}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI In-Practice ==&lt;br /&gt;
&lt;br /&gt;
Once again Welcome back! In this tutorial we will learn how to interact with the CEGUI System at runtime, a VERY useful feature to have for a Graphical User '''Interface'''! &lt;br /&gt;
&lt;br /&gt;
CEGUI Has been designed to work on many systems, using many different renderers. As such it is tied to no particular input system. Unfortunately for us to demonstrate how to interact with CEGUI, we need to pick one and USE it don't we? So I have decided to use OIS [http://sourceforge.net/projects/wgois/]. Although I will attempt to keep OIS Specific functions and structures seperate, if they slip in, there is the reference to the system I'm using.&lt;br /&gt;
&lt;br /&gt;
==== Input Injection ====&lt;br /&gt;
&lt;br /&gt;
The first thing to note, is that not surprisingly CEGUI has made it easy to deal with inputing user actions into CEGUI. Whenever an action happens (User typing, hitting Escape, clicking a button) CEGUI will need to be informed about it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::System::injectKeyDown(uint key_code); // Tells CEGUI Key has been Pressed&lt;br /&gt;
CEGUI::System::injectKeyUp(uint key_code); // Tells CEGUI Key has been Released&lt;br /&gt;
&lt;br /&gt;
CEGUI::System::injectChar(utf32 code_point); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Inject keydown/up are good for sending Shift, controls, enters, etc. While the injectChar is pretty self explanatory for what it means, it injects a 'letter'.&lt;br /&gt;
&lt;br /&gt;
Handling the mouse works in a similiar method as above. The following code shows how you would inform CEGUI about a Left Mouse Button Keypress.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::System::injectMouseButtonDown(CEGUI::MouseButton::LeftButton);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can imagine, there is a injectMouseButtonUp() as well for letting CEGUI know when the mouse is released.&lt;br /&gt;
&lt;br /&gt;
And what about when the mouse itself moves? Of course thats covered&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::System::injectMouseMove(float delta_x, float delta_y);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The delta is in Screen pixels that the mouse moved since the last CEGUI Update. &lt;br /&gt;
&lt;br /&gt;
Up until know, we haven't actually given CEGUI any processor time. If we're going to be moving a mouse, or clicking buttons, we're going to want CEGUI to display these actions. So we need to let CEGUI know how much time has passed since its last render.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::System::injectTimePulse(float timeElapsed);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allows you to inject a time pulse, based on the number of Seconds that have passed. However often you update CEGUI is up to you, but most games will want to update the GUI by injectingTime pulses during every update cycle. If you're building more of a Tool Application you might not need constant updates.&lt;br /&gt;
&lt;br /&gt;
==== On ward! ====&lt;br /&gt;
&lt;br /&gt;
I'm going to assume that you are using OIS and are knowledgable about its uses. Here are two functions which will allow you to interact with CEGUI&lt;br /&gt;
&lt;br /&gt;
The following will input keypresses when typing. It injects the key down and up actions (By key code) and the characters that associate with those keypresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void InjectOISKey(bool bButtonDown, OIS::KeyEvent inKey)&lt;br /&gt;
{&lt;br /&gt;
	if (bButtonDown)&lt;br /&gt;
	{&lt;br /&gt;
		CEGUI::System::getSingleton().injectKeyDown(inKey.key);&lt;br /&gt;
		CEGUI::System::getSingleton().injectChar(inKey.text);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		CEGUI::System::getSingleton().injectKeyUp(inKey.key);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following function will handle injection of OIS Mouse Button presses and releases&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void InjectOISMouseButton(bool bButtonDown, OIS::MouseButtonID inButton)&lt;br /&gt;
{&lt;br /&gt;
	if (bButtonDown == true)&lt;br /&gt;
	{&lt;br /&gt;
		switch (inButton)&lt;br /&gt;
		{&lt;br /&gt;
		case OIS::MB_Left:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MouseButton::LeftButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Middle:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MouseButton::MiddleButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Right:&lt;br /&gt;
			mSystem-&amp;gt;injectMouseButtonDown(CEGUI::MouseButton::RightButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Button3:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MouseButton::X1Button);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Button4:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MouseButton::X2Button);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_NULL:	&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else // bButtonDown = false&lt;br /&gt;
	{&lt;br /&gt;
		switch (inButton)&lt;br /&gt;
		{&lt;br /&gt;
		case OIS::MB_Left:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MouseButton::LeftButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Middle:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MouseButton::MiddleButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Right:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MouseButton::RightButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Button3:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MouseButton::X1Button);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_Button4:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MouseButton::X2Button);&lt;br /&gt;
			break;&lt;br /&gt;
		case OIS::MB_NULL:	&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This above function will Convert a OIS Input for the mouse and change it to CEGUI. Right now the codes match, but if they ever change it will provide an example of how to use OIS with CEGUI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
Understandably this section is a little quicker. But it gives you information about how to start interacting with CEGUI. The next tutorial will teach us how to actually deal with keypresses and make interesting things happen. Until then!&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Introduction&amp;diff=4308</id>
		<title>CEGUI In Practice - Introduction</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Introduction&amp;diff=4308"/>
				<updated>2011-03-06T01:37:13Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|1}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI In-Practice ==&lt;br /&gt;
&lt;br /&gt;
Welcome to the first in a series of tutorials based on how to use CEGUI.  The majority of the tutorials will be done in code.  I may attempt to sprinkle in uses of .layouts throughout the tutorial.  But once you understand how to use many of the Widgets in code it becomes easy to use them via script.&lt;br /&gt;
&lt;br /&gt;
[Please note, I am an Ogre3d user, so the initial setup will be how to bootstrap and start with ogre3d.]&lt;br /&gt;
&lt;br /&gt;
=== Introducing CEGUI ===&lt;br /&gt;
First notes, CEGUI uses a number of Singleton classes.  These, if not experienced with singletons, allow global access to a Class globally in the code, while ensuring only a 'single'ton instance is ever created.  The following are the Singletons we will be using&lt;br /&gt;
in this example.&lt;br /&gt;
&lt;br /&gt;
'''CEGIU::{{DoxygenClass|System|0.7}}''' - The big Kahuna.  This contains many of the functions for setting and getting defaults.  &amp;lt;br /&amp;gt;&lt;br /&gt;
'''CEGUI::{{DoxygenClass|WindowManager|0.7}}''' - Manages the windows of CEGUI.  If a new window is going to be created or Deleted WindowManager is gonna be your class.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''CEGUI::{{DoxygenClass|SchemeManager|0.7}}''' - Manages Schemes. &amp;lt;br /&amp;gt;&lt;br /&gt;
'''CEGUI::{{DoxygenClass|FontManager|0.7}}''' - Manages the different fonts you will use in your application. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Getting Started ====&lt;br /&gt;
&lt;br /&gt;
Lets jump in and get some stuff setup.  The first thing we need to do is get the system up and running.  Since I am an Ogre user, I will show the code to get the system up and running with ogre. There are methods of getting it started for numerous other Rendering systems.  Shown here [[The Beginner Guide to Getting CEGUI Rendering]]. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Ogre3d Method is shown here:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::OgreRenderer *renderer = new CEGUI::OgreRenderer::bootstrapSystem();&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[Note: This is a newer method using the bootstrapSystem, this was introduced in CEGUI 0.7.1.  There are examples on this wiki using older versions of CEGUI.  Please make note of which version you are using] &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code creates an instance of the Ogre3d Render interface between Ogre3d and CEGUI.  You will not need to deal with this much after the above code has been run.  This creates the link which Ogre will use to render CEGUI.  Please note, you will want to call this if Ogre is auto-creating the render window ( pretty common ).  If you are manually creating the Ogre3d window, you will need to use the ''CEGUI::OgreRenderer::bootstrapSystem(Ogre::RenderWindow *)'' overload. &lt;br /&gt;
&lt;br /&gt;
And additional point to mention, is that the bootstrapSystem() will create an instance of CEGUI::System.  This is important as if you already have created CEGUI::System, an exception will be thrown.&lt;br /&gt;
&lt;br /&gt;
==== Oh there will be scripts ====&lt;br /&gt;
&lt;br /&gt;
Now that we've called the very meager function above.  We need to cover some very basic information about CEGUI before we proceed.&lt;br /&gt;
&lt;br /&gt;
CEGUI is a VERY heavily scripted library.  Much of what defines the artistic content of CEGUI is defined in various .xml files.  The beginning script we will mention is the '''Scheme''' (*.scheme).  Every widget you will use in your GUI will be defined in the .scheme file. It will also contain information for about subscripts which will be used, described below. Later tutorials will describe this file in greater detail. Below is an example if you run across one:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;GUIScheme Name=&amp;quot;TaharezLook&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Imageset Filename=&amp;quot;TaharezLook.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;Font Filename=&amp;quot;DejaVuSans-10.font&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;LookNFeel Filename=&amp;quot;TaharezLook.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;WindowRendererSet Filename=&amp;quot;CEGUIFalagardWRBase&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;FalagardMapping WindowType=&amp;quot;TaharezLook/Button&amp;quot;      TargetType=&amp;quot;CEGUI/PushButton&amp;quot;  Renderer=&amp;quot;Falagard/Button&amp;quot;       LookNFeel=&amp;quot;TaharezLook/Button&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;FalagardMapping WindowType=&amp;quot;TaharezLook/Checkbox&amp;quot;    TargetType=&amp;quot;CEGUI/Checkbox&amp;quot;    Renderer=&amp;quot;Falagard/ToggleButton&amp;quot; LookNFeel=&amp;quot;TaharezLook/Checkbox&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/GUIScheme&amp;gt;&amp;lt;/source&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next script we will mention is the '''Layouts''' (*.layout).  This is also an xml file, and will defines the layout (obviously!) of the window we want to display on the screen.  For example, if we wanted a to create a Chat window, we would probably have a ChatWindow.layout file somewhere. This would describe how the window looks (How big, where on the screen its displayed, etc), where the typing box would be located within this window, and where the button to 'send' the chat message would be.  Below is a quick example of what a .layout file looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;GUILayout &amp;gt;&lt;br /&gt;
    &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;ConsoleRoot&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Chat Window&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;DejaVuSans-10&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.114991,0},{0.358182,0},{0.519469,0},{0.775455,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;ConsoleRoot/EditBox&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.0201637,0},{0.787097,0},{0.694549,0},{0.957693,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TextParsingEnabled&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/GUILayout&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
Another script which is useful to mention is a '''Font''' (*.font). This describes fonts which will be used in cegui. Below is an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;Font Name=&amp;quot;DejaVuSans-10&amp;quot; Filename=&amp;quot;DejaVuSans.ttf&amp;quot; Type=&amp;quot;FreeType&amp;quot; Size=&amp;quot;10&amp;quot; NativeHorzRes=&amp;quot;800&amp;quot; NativeVertRes=&amp;quot;600&amp;quot; AutoScaled=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lastly, '''LookNFeel''' (*.looknfeel). This is a fairly evil looking file, and to save everyone from nightmarish horrors, I will not post an example (and to save space). This is the file which determines how every widget (CEGUI speak for window/object/item) looks and acts. For example, what it looks like when you mouse over a button, or how to build the border and background of a Window. Each scheme will generally have its own LookNFeel to allow more customization of the basic construction of CEGUI Widgets.&lt;br /&gt;
&lt;br /&gt;
Another important script is the '''Imageset''' (*.imageset). This is the file which determines the visuals of each widget. In CEGUI the visual part of a widget which the user see's is a small X/Y coordinate on a larger texture file. For example, a basic Button will have the graphics defined in a .imageset to be a certain position on a texture image (*.png, *.bmp, *.jpg, etc) with a certain height and width. It may be located at Pixel 100x320 and be 50x50 in size. This will be defined in the imageset. Below is an example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
&amp;lt;Imageset Name=&amp;quot;TaharezLook&amp;quot; Imagefile=&amp;quot;TaharezLook.tga&amp;quot; NativeHorzRes=&amp;quot;800&amp;quot; NativeVertRes=&amp;quot;600&amp;quot; AutoScaled=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;Image Name=&amp;quot;MouseArrow&amp;quot; XPos=&amp;quot;138&amp;quot; YPos=&amp;quot;127&amp;quot; Width=&amp;quot;31&amp;quot; Height=&amp;quot;25&amp;quot; XOffset=&amp;quot;0&amp;quot; YOffset=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/Imageset&amp;gt;&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lastly, '''LookNFeel''' (*.looknfeel). This is a fairly evil looking file, and to save everyone from nightmarish horrors, I will not post an example (and to save space). This is the file which determines how every widget (CEGUI speak for window/object/item) looks and acts. For example, what it looks like when you mouse over a button, or how to build the border and background of a Window. Each scheme will generally have its own LookNFeel to allow more customization of the basic construction of CEGUI Widgets.&lt;br /&gt;
&lt;br /&gt;
==== Back to Getting Started ====&lt;br /&gt;
&lt;br /&gt;
Now that we have a minimal idea about what scripts CEGUI uses (and don't worry, they make more sense and are less intimidating as you proceede. You will likely use .layout the most in the beginning) lets start doing something useful!&lt;br /&gt;
&lt;br /&gt;
Where we left off, CEGUI was just started. But in and of itself, it doesn't know what you want to do. First thing we should do is tell it what Scheme we want to use. As mentioned above, a .Scheme contains a listing of Widget and Other scripts to include. a Scheem can include an Imageset, looknFeel, and font to use. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Load the scheme&lt;br /&gt;
	CEGUI::SchemeManager::getSingleton().create( &amp;quot;TaharezLook.scheme&amp;quot; );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you wanted to use an imageset or Font which is not designated in the .Scheme file its easy to do. Simply use the associated manager to load them. Since i'm trying my best to keep this as an introductory tutorial, I'll keep to the mission and explain these managers in a later tutorial.&lt;br /&gt;
&lt;br /&gt;
Next up, lets define a few defaults:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	// Set the defaults&lt;br /&gt;
	CEGUI::System::getSingleton().setDefaultFont( &amp;quot;DejaVuSans-10&amp;quot; );&lt;br /&gt;
	CEGUI::System::getSingleton().setDefaultMouseCursor( &amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot; );&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These calls will summon the CEGUI::System from global scope and set the DefaultFont, and the default Mouse Cursor. If you reference TaharezLook.scheme (located in the cegui/datafiles/schemes folder). You will see that it loaded a font named DejaVuSans-10.font with the &amp;lt;font&amp;gt; tag in the .scheme. The MouseArrow is found inside the imageset called &amp;quot;TharezLook&amp;quot; under the tag of &amp;quot;MouseArrow&amp;quot;. Pretty self explanetory I'd hope.&lt;br /&gt;
&lt;br /&gt;
Alright, now CEGUI knows about some basic defaults we want to use. Lets create a window which will be the Root window we will put everything on from here on out.&lt;br /&gt;
&lt;br /&gt;
CEGUI uses a Parent/Child system for organizing the windows. So the first useful thing to do is create a parent which all other windows will be the child&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::Window* myRoot = CEGUI::WindowManager::getSingleton().createWindow( &amp;quot;DefaultWindow&amp;quot;, &amp;quot;_MasterRoot&amp;quot; );&lt;br /&gt;
 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above function calls upon the WindowManager singleton, and creates a window of type &amp;quot;DefaultWindow&amp;quot; named &amp;quot;_MasterRoot&amp;quot;. The default window is just that. a default window, which is blank (or transparent). You can give the root window any name you like, however, i like using _MasterRoot as its unlikely any other window I ever use will have the name. &lt;br /&gt;
&lt;br /&gt;
Now that we have created the window, we need to set it as the root window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::System::getSingleton().setGUISheet( myRoot );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This calls upon the system, and assigns myRoot as the default window. Recall myRoot was created above with the name &amp;quot;_MasterRoot&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
While not a super exciting tutorial. At this point CEGUI is now setup, and we could begin adding windows and doing such GUI shenanigans as making windows, buttons, clicking, and fun. Later tutorials will demonstrate how to have CEGUI Recognize clicking, dragging of windows, typing, and more! Thanks for reading!&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Creating_widgets&amp;diff=4307</id>
		<title>CEGUI In Practice - Creating widgets</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_Creating_widgets&amp;diff=4307"/>
				<updated>2011-03-06T01:37:02Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|2}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI In-Practice 2 ==&lt;br /&gt;
&lt;br /&gt;
Welcome back.  This is the second installment of CEGUI In-Practice tutorial series.  In this we will build upon the previous tutorial, [[CEGUI In Practice - Introduction]].  We will show how to create Widgets and manage them.&lt;br /&gt;
&lt;br /&gt;
=== The Widget ===&lt;br /&gt;
&lt;br /&gt;
In the last example we showed how to bootstrap the system with Ogre, and gave a brief introduction to CEGUI's script files.  Now we will work on understanding what a widget is and how to use them.  Lets jump in and create a window which will display a box with an image in the middle of the screen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::Window *myImageWindow = CEGUI::WindowManager::getSingleton().createWindow(&amp;quot;TaharezLook/StaticImage&amp;quot;,&amp;quot;PrettyWindow&amp;quot; ); &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CEGUI uses numerous derived classes code-side to create windows.  The base class CEGUI::Window is the generic window. the CEGUI::WindowManager calls a factory class when creating a window which returns the windows pointer. The first argument, &amp;quot;TaharezLook/StaticImage&amp;quot; tells the factory what kind of window to make.  These windows are defined in .scheme, which are subsequently defined more depth in other .xml files. The second argument is the name which the window will have.  &lt;br /&gt;
&lt;br /&gt;
[Note: As a point to note, there is no strict requirement on naming of windows, except to avoid repeat names.  Some users tend to prefer a naming convention using ParentName/ChildName.  ie.  &amp;quot;ConsoleWindow/SendButton&amp;quot; or &amp;quot;_MasterRoot/HealthBar&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Once we have created the window, myImageWindow will be a pointer to a CEGUI::{{DoxygenClass|DefaultWindow|0.7}} which is derived from CEGUI::{{DoxygenClass|Window|0.7}}. If you look in the .scheme file you can see can see what a Widget is derived from via the TargetType= tag.&lt;br /&gt;
&lt;br /&gt;
Next we need to set some properties for this window. There are two ways of doing this. The first is via the propertyset, or the second way by calling the function. The latter way can be more annoying at times, as you may have to cast the window to the correct type to get access to the member functions, but may be more intuitive depending on how you think.&lt;br /&gt;
&lt;br /&gt;
=== The Unified Dimension System ===&lt;br /&gt;
&lt;br /&gt;
We created our widget, now we need to position it and define its size. Lets do that via code shall we?&lt;br /&gt;
&lt;br /&gt;
Before we jump in too far, we need to understand how CEGUI Handles positions. CEGUI Uses a Unified Dimension system. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::UDim(scale,offset)&amp;lt;/source&amp;gt;&lt;br /&gt;
The first number is the relative point on the screen between (0,1). So if we were looking at the X axis (left to right on the screen) a UDim(0.5,0) would be Halfway across the screen with zero pixels offset. Udim(0.0,50) would be starting at the left side of the screen +50 pixels. You can combine them too Udim(0.75,10) would be 3/4 of the way across the screen, with an additional 10 pixels.&lt;br /&gt;
&lt;br /&gt;
A point on the screen (or a UVector2) is made up of two UDims:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::UVector2(UDim x,UDim y)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As such, a CEGUI::Rect is as you would imagine, 4 UDims&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::URect(CEGUI::Udim left,CEGUI::Udim top,CEGUI::Udim right,CEGUI::Udim bottom)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So now that we know how positions are done, lets move our created window to the middle of the screen:&lt;br /&gt;
==== The Widget in Practice ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;myImageWindow-&amp;gt;setPosition(CEGUI::UVector2(CEGUI::UDim(0.5,0),CEGUI::UDim(0.5,0)));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That may look a little ugly but break it down. setPosition takes a UVector2, and each UVector2 is made up of an X and Y Udim, which is made up of a Scale and Absolute float. &lt;br /&gt;
&lt;br /&gt;
So, we have moved our window to the middle of the screen.. but CEGUI doesn't know how big to make it? So set its size to 150 pixels by 100 pixels [Note: I dropped the namespace for this to increase readability]. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;myImageWindow-&amp;gt;setSize(UVector2(UDim(0,150),UDim(0,100)));&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case we specified the Udim using 0 for scales, and the actual pixel size in the absolute argument. The Absolute argument is additive to the scale, and in this case we didn't want to have the size be affected by the scale argument. If we were creating a splash screen that took up the entire window, we would likely want the size to be UVector2(UDim(1,0),UDim(1,0) with the position being at UVector2(Udim(0,0), UDim(0,0).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now that we have created the window to the size we want. We need to tell it what image to display! That we will do by using the PropertySet as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
myImageWindow-&amp;gt;setProperty(&amp;quot;Image&amp;quot;,&amp;quot;set:TaharezLook image:full_image&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first agument is what Property we want to set, and the second argument is what value to set. The second argument is a string broken into two pieces in this example. We need to know what ImageSet we are looking in, which is referenced following the 'set:' portion. And then the image via the 'image:' portion. In this case we want it to show the full_image.&lt;br /&gt;
&lt;br /&gt;
 A Listing of properties for TaharezLook is available here [http://cegui.org.uk/static/TaharezLookProperties.html]&lt;br /&gt;
&lt;br /&gt;
Now that we have created the window. We need to attach it to the current root window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::System::getGUISheet()-&amp;gt;addChildWindow(myImageWindow);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will allow the Window to be displayed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
So with this quick tutorial we got a very short introduction to PropertySet usage (Important!) and a little bit about how the Unified Dimension System in CEGUI Works. While still not terribly useful, we're beginning to understand how to use some of CEGUI's faculties. Next up, we'll learn how to get some interactivity from this thing.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_push_button&amp;diff=4306</id>
		<title>CEGUI In Practice - A push button</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_push_button&amp;diff=4306"/>
				<updated>2011-03-06T01:36:52Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|4}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI In-Practice 4 ==&lt;br /&gt;
&lt;br /&gt;
Hello hello, you're making good headway through these tutorials! Alright, last lesson we got a glimpse of how to send input to CEGUI. This is useful, because today we're going to make a button. And not just any button, but a button which makes something happen! I know, exciting.&lt;br /&gt;
&lt;br /&gt;
==== Some groundwork ====&lt;br /&gt;
&lt;br /&gt;
First we need to look into how CEGUI handles event control. &lt;br /&gt;
&lt;br /&gt;
CEGUI is based around the Event/Subscriber method. Meaning, something (A button, an edit box, a list box) fires off an event (MouseClick,Text Accepted, or Selection), and something else (The Application Class, another CEGUI Widget, anything!) is informed about it. It does this via the &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::Window::subscribeEvent(const String&amp;amp; name,Event::Subscriber subscriber) &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first argument is the Event that you wish to keep track of. Events are static const strings. You will find these in the respective header files for CEGUI Widget types. (Example CEGUIPushButton contains CEGUI::PushButton::EventClicked)&lt;br /&gt;
&lt;br /&gt;
The second argument if the subscriber which will be called whenever this event occurs. &lt;br /&gt;
&lt;br /&gt;
Lets suppose give an example of how to register our character to jump whenever a button is pressed. First lets create our Button whcih will make our character jump. Although this is bad coding style, we will create the button in global scope for ease of this example. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::Window *gJumpBtnWindow = NULL;&lt;br /&gt;
&lt;br /&gt;
void CreateJumpButton()&lt;br /&gt;
{&lt;br /&gt;
  gJumpBtnWindow = CEGUI::WindowManager::getSingleton().createWindow(&amp;quot;TaharezLook/Button&amp;quot;,&amp;quot;JumpPushButton&amp;quot;);  // Create Window&lt;br /&gt;
  gJumpBtnWindow-&amp;gt;setPosition(CEGUI::UVector2(CEGUI::UDim(0.75,0),CEGUI::UDim(0.50,0));&lt;br /&gt;
  gJumpBtnWindow-&amp;gt;setSize(CEGUI::UVector2(CEGUI::UDim(0,50),CEGUI::UDim(0,50));&lt;br /&gt;
  gJumpBtnWindow-&amp;gt;setText(&amp;quot;Jump!&amp;quot;);&lt;br /&gt;
  CEGUI::System::getSingleton().getGUISheet()-&amp;gt;addChildWindow(gJumpBtnWindow);  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above code Creates the button of type &amp;quot;TaharezLook/Button&amp;quot;, as exists in the .scheme file. Then it gives it the name of &amp;quot;JumpPushButton&amp;quot;. And sets its size and position, followed by attaching it to the root GUI Window. this is review from two tutorials ago. However, the setText one is new. Its pretty Self explanetory I would assume, but it Sets the text for windows. PushButtons, EditBoxes, FrameWindows, etc all have a spot to display text and this function will do it.&lt;br /&gt;
&lt;br /&gt;
now that we have created our button, lets create a class that will recieve this JumpPushButton's events. Please rememeber this is an example. In your application It likely won't be this simple! &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
class OurPlayer&lt;br /&gt;
{&lt;br /&gt;
   public:&lt;br /&gt;
    OurPlayer()&lt;br /&gt;
    {&lt;br /&gt;
     RegisterForEvents();   // Call our Register function&lt;br /&gt;
    };&lt;br /&gt;
    bool Jump(const CEGUI::EventArgs&amp;amp; /*e*/){};        // Jump for joy&lt;br /&gt;
   private:&lt;br /&gt;
    RegisterForEvents()&lt;br /&gt;
    {&lt;br /&gt;
       gJumpBtnWindow-&amp;gt;subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&amp;amp;OurPlayer::Jump,this));&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright, thats a neat little class right? I don't know how you're going to make your character jump, so you get to fill in that information, i'm just gonna show you how to interact with the GUI! &lt;br /&gt;
&lt;br /&gt;
Alright, the really interesting line here is the RegisterForEvents() function. You may or may not have dealt with EventSubscribers before in other applications, so I will give a very brief intro to them. &lt;br /&gt;
&lt;br /&gt;
Basically, they work by creating a structure which is supplied to CEGUI stating what function to call, and where to get an instance of a member that has that function. the first argument, &amp;amp;OurPlayer::Jump states that we want to use the function Jump which is a member of OurPlayer. The problem is it doesn't know WHICH OurPlayer we want to use? What if we are playing split screen and we have two OurPlayer classes? One for the Left player and one for the Right player? Now we need to specify which player. There is the second argument. in C++ '''this''' returns a pointer to the class execution is currently in. So since we're registering this event within a class, we tell it to use this, which will reference the class that called RegisterForEvents(); &lt;br /&gt;
&lt;br /&gt;
If we had created as follows:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
OurPlayer *leftPlayer;&lt;br /&gt;
OurPlayer *rightPlayer;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then we would call the function like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
gJumpBtnWindow-&amp;gt;subscribeEvent(CEGUI::PushButton::EventClicked,CEGUI::Event::Subscriber(&amp;amp;OurPlayer::Jump,leftPlayer));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So as you can see this allows for alot of possibilities. There are also events for:&lt;br /&gt;
&lt;br /&gt;
* MouseClicked, &lt;br /&gt;
* MouseEnters, &lt;br /&gt;
* MouseLeaves,&lt;br /&gt;
* EventActivated,&lt;br /&gt;
* EventTextChanged,&lt;br /&gt;
* EventAlphaChanged,&lt;br /&gt;
* EventSized&lt;br /&gt;
&lt;br /&gt;
Just to name a few. There is a Huge listing of events which all windows inherit in CEGUIWindow.h&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
hopefully this tutorial showed you how to implement events in cegui. They really are the mechanism which all things happen. Once you master how to use events, the rest of the GUI becomes so easy to use, as most user interactions are event driven. While you may not use them all, there are even events for Rotating windows and dropping windows on other windows! Just think of the possibilities. Until next time Happy Clicking!&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_Game_Console&amp;diff=4305</id>
		<title>CEGUI In Practice - A Game Console</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_Game_Console&amp;diff=4305"/>
				<updated>2011-03-06T01:36:42Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: because references rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|6}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI InPractice 6 ==&lt;br /&gt;
&lt;br /&gt;
Welcome back! This tutorial we will put together the knowledge from the past few chapters to create a functioning Console window. The last few tutorials have given us the basics. Now its time to put that knowledge to use and make something we can use in our game.&lt;br /&gt;
&lt;br /&gt;
==== Game Plan ====&lt;br /&gt;
&lt;br /&gt;
Okay, now lets look at what we need to do. We will want to be able to type in commands, press the send button, and have them output into the text box. We will also probably want to acknowledge when enter is pressed as thats the 'normal' feel of typing into a chat.&lt;br /&gt;
&lt;br /&gt;
We discussed earlier how to send input to CEGUI ([[CEGUI In Practice - Managing input]]), so we will have to assume that you have that working (and probably built the application structure behind it). We will also assume you used the previous tutorial's layout file and naming for the console window ( [[CEGUI In Practice - Using .layout files]]).&lt;br /&gt;
&lt;br /&gt;
Due to the fact that we are getting to a slightly more advanced implementation of CEGUI here, and because we may want the ConsoleWindow to do other more useful things (like parsing strings for /say commands) I'm going to create a class to encompass the CEGUI ConsoleWindow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class GameConsoleWindow&lt;br /&gt;
{&lt;br /&gt;
    public:&lt;br /&gt;
       GameConsoleWindow();                   // Constructor&lt;br /&gt;
    private:&lt;br /&gt;
       void CreateCEGUIWindow();                                  // The function which will load in the CEGUI Window and register event handlers&lt;br /&gt;
       void RegisterHandlers();                                   // Register our handler functions&lt;br /&gt;
       void Handle_TextSubmitted(const CEGUI::EventArgs &amp;amp;e);      // Handle when we press Enter after typing&lt;br /&gt;
       void Handle_SendButtonPressed(const CEGUI::EventArgs &amp;amp;e);  // Handle when we press the Send button         &lt;br /&gt;
       void ParseText(CEGUI::String inMsg);                       // Parse the text the user submitted.&lt;br /&gt;
       void OutputText(CEGUI::String inMsg,                       // Post the message to the ChatHistory listbox.&lt;br /&gt;
              CEGUI::Colour colour = CEGUI::Colour( 0xFFFFFFFF)); //   with a white color default&lt;br /&gt;
       &lt;br /&gt;
       CEGUI::Window *m_ConsoleWindow;                            // This will be a pointer to the ConsoleRoot window.&lt;br /&gt;
       CEGUI::String sNamePrefix;                                  // This will be the prefix name we give the layout&lt;br /&gt;
       static int iInstanceNumber;                                 // This will be the instance number for this class. &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright, so that will be our class. It might look daunting, but don't worry it will all make sense in the end.&lt;br /&gt;
&lt;br /&gt;
==== The Constructor ====&lt;br /&gt;
&lt;br /&gt;
I'm going to use the constructor as the main point of automation here.  And while I believe it is normally bad practice to call functions which could potentially fail within a constructor, i'm going to anyway for ease of this tutorial.  We will have it Initialize some variables, and then call the CreateCEGUIWindow function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
GameConsoleWindow::GameConsoleWindow()&lt;br /&gt;
{&lt;br /&gt;
   m_ConsoleWindow = NULL;       // Always good practice to initialize a pointer to a NULL value, helps when switching to Release Builds.&lt;br /&gt;
   iInstanceNumber = 0;&lt;br /&gt;
   sNamePrefix = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Setting up the Window ====&lt;br /&gt;
&lt;br /&gt;
Now we need to setup the window. We have done this before in the .layout tutorial so we will do it again here. However, we mentioned before that you could use a prefix when loading a .layout to avoid name conflicts if you load multiple layouts. So we need to account for that. Will we need multiple consoles? Who knows, might as well build it in while we're designing it right?&lt;br /&gt;
&lt;br /&gt;
Lets write the CreateCEGUIWindow function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::CreateCEGUIWindow()&lt;br /&gt;
{&lt;br /&gt;
	// Get a local pointer to the CEGUI Window Manager, Purely for convenience to reduce typing&lt;br /&gt;
	CEGUI::WindowManager *pWindowManager = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
&lt;br /&gt;
        // Now before we load anything, lets increase our instance number to ensure no conflicts.  &lt;br /&gt;
        // I like the format #_ConsoleRoot so thats how i'm gonna make the prefix.  This simply&lt;br /&gt;
        // Increments the iInstanceNumber then puts it + a _ into the sNamePrefix string. &lt;br /&gt;
        sNamePrefix = ++iInstanceNumber + &amp;quot;_&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        // Now that we can ensure that we have a safe prefix, and won't have any naming conflicts lets create the window&lt;br /&gt;
        // and assign it to our member window pointer m_ConsoleWindow&lt;br /&gt;
        m_ConsoleWindow = pWindowManager-&amp;gt;loadWindowLayout(inLayoutName,sNamePrefix);&lt;br /&gt;
&lt;br /&gt;
        // Being a good programmer, its a good idea to ensure that we got a valid window back. &lt;br /&gt;
        if (m_ConsoleWindow)&lt;br /&gt;
        {&lt;br /&gt;
            // Lets add our new window to the Root GUI Window&lt;br /&gt;
            CEGUI::System::getSingleton().getGUISheet()-&amp;gt;addChildWindow(m_ConsoleWindow);&lt;br /&gt;
            // Now register the handlers for the events (Clicking, typing, etc)&lt;br /&gt;
            (this)-&amp;gt;RegisterHandlers();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Something bad happened and we didn't successfully create the window lets output the information&lt;br /&gt;
            CEGUI::Logger::getSingleton().logEvent(&amp;quot;Error: Unable to load the ConsoleWindow from .layout&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright so that created the window. And after the window was created, we Registered its handlers. Lets look at how we go about&lt;br /&gt;
registering those handlers. Below is the RegisterHandlers function, it will probably look familiar if you have been reading along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::RegisterHandlers()&lt;br /&gt;
{&lt;br /&gt;
    // Alright now we need to register the handlers.  We mentioned above we want to acknowledge when the user presses Enter, and &lt;br /&gt;
      // when they click the 'Send' button.  So we need to register each of those events&lt;br /&gt;
&lt;br /&gt;
    // First lets register the Send button.  Our buttons name is &amp;quot;ConsoleRoot/SendButton&amp;quot;, but don't forget we prepended a name to      &lt;br /&gt;
      // all the windows which were loaded.  So we need to take that into account here.&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/SendButton&amp;quot;)-&amp;gt;subscribeEvent(&lt;br /&gt;
                        CEGUI::PushButton::EventClicked,    // If we recall our button was of type CEGUI::PushButton in the .scheme&lt;br /&gt;
                                                            // and we want to acknowledge the EventClicked action.&lt;br /&gt;
                        CEGUI::Event::Subscriber(           // What function to call when this is clicked.  Remember, all functions &lt;br /&gt;
                                                            // are contained within (this) class.&lt;br /&gt;
                        &amp;amp;GameConsoleWindow::Handle_SendButtonPressed,  // Call Handle_SendButtonPressed member of GameConsoleWindow&lt;br /&gt;
                        this));                             // Using (this) instance we're in right now&lt;br /&gt;
&lt;br /&gt;
    // Now for the TextSubmitted, we will be registering the event on the edit box, which is where the users cursor will be when   &lt;br /&gt;
      //they press Enter.  I'm not going to break this down as much, because I believe that is very ugly to read, but was a good  &lt;br /&gt;
      //way of expressing it.  Here is the function call.&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;subscribeEvent(CEGUI::Editbox::EventMouseClick,&lt;br /&gt;
                        CEGUI::Event::Subscriber(&amp;amp;GameConsoleWindow::Handle_TextSubmitted,this));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That last line looks pretty ugly, but remember if you include namespace CEGUI; you won't have all those Ugly CEGUI:: prefixing all the code.  As you can see, once you get the hang of registering events its pretty easy.  One thing to note, is there are more than one way to account for certain actions.  On the button, you could also have registered for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    CEGUI::PushButton::EventMouseClick&lt;br /&gt;
    CEGUI::PushButton::EventMouseButtonDown&lt;br /&gt;
    CEGUI::PushButton::EventMouseButtonUp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Depending on what result you were looking for, and where you wanted the action to take place.  For example, windows interfaces usually react on the MouseButtonUp, allowing the user to click it, and then slide off the mouse if it wasn't what they really wanted to press.&lt;br /&gt;
&lt;br /&gt;
==== The Handlers ====&lt;br /&gt;
&lt;br /&gt;
Now that we have registered the events, we need to actually write the functions which will handle those events.  We need to handle both the Text Submitted, and the SendButton's event.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::Handle_TextSubmitted(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
    // The following line of code is not really needed in this particular example, but is good to show.  The EventArgs by itself &lt;br /&gt;
     // only has limited uses. You will find it more useful to cast this to another type of Event.  In this case WindowEventArgs&lt;br /&gt;
     // could be much more useful as we are dealing with a CEGUI::Window.  Notably, this will allow you access to the .window&lt;br /&gt;
     // member of the argument, which will have a pointer to the window which called the event.  You can imagine that would be&lt;br /&gt;
     // useful!&lt;br /&gt;
    const CEGUI::WindowEventArgs* args = static_cast&amp;lt;const CEGUI::WindowEventArgs*&amp;gt;(&amp;amp;e);&lt;br /&gt;
&lt;br /&gt;
    // Now we need to get the text that is in the edit box right now.&lt;br /&gt;
    CEGUI::String Msg = mWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;getText();&lt;br /&gt;
&lt;br /&gt;
    // Since we have that string, lets send it to the TextParser which will handle it from here&lt;br /&gt;
    (this)-&amp;gt;ParseText(Msg);&lt;br /&gt;
&lt;br /&gt;
    // Now that we've finished with the text, we need to ensure that we clear out the EditBox.  This is what we would expect&lt;br /&gt;
      // To happen after we press enter&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you might be wondering why we didn't just Parse the text in here?  Well If the user presses Enter, or presses the Send button the text will either way have to be parsed, and it will be parsed in the same manner.  So why write the same code twice?&lt;br /&gt;
&lt;br /&gt;
Below is the code for handling the SendButton being pressed.  I know I just harped on rewriting code, and this will ironically look alot like the Code for when text has been submitted.  But thats because we don't really need the button to do much.  We probably could have just had the ButtonPress trigger the Handle_TextSubmitted above when we registered the handlers, but what if we wanted a clicking noise to be played when the player pressed the button?  Then we would need a seperate handler for the Send button.  Anyway 'nuff said, lets show the code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::Handle_SendButtonPressed(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
    CEGUI::String Msg = mWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;getText();&lt;br /&gt;
    (this)-&amp;gt;ParseText(Msg);&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;setText(&amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parsing that Text ====&lt;br /&gt;
&lt;br /&gt;
This portion is not going to be so much CEGUI Related as it will be string manipulation.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void GameConsoleWindow::ParseText(CEGUI::String inMsg); &lt;br /&gt;
&lt;br /&gt;
       // I personally like working with std::string. So i'm going to convert it here.&lt;br /&gt;
       std::string inString = inMsg.c_str();&lt;br /&gt;
&lt;br /&gt;
	if (inString.length() &amp;gt;= 1) // Be sure we got a string longer than 0&lt;br /&gt;
	{&lt;br /&gt;
		if (inString.at(0) == '/') // Check if the first letter is a 'command'&lt;br /&gt;
		{&lt;br /&gt;
			std::string::size_type commandEnd = inString.find(&amp;quot; &amp;quot;, 1);&lt;br /&gt;
			std::string command = inString.substr(1, commandEnd - 1);&lt;br /&gt;
			std::string commandArgs = inString.substr(commandEnd + 1, inString.length() - (commandEnd + 1));&lt;br /&gt;
			//convert command to lower case&lt;br /&gt;
			for(std::string::size_type i=0; i &amp;lt; command.length(); i++)&lt;br /&gt;
			{&lt;br /&gt;
				command[i] = tolower(command[i]);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Begin processing&lt;br /&gt;
&lt;br /&gt;
			if (command == &amp;quot;say&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				std::string outString = &amp;quot;You:&amp;quot; + inString;  // Append our 'name' to the message we'll display in the list&lt;br /&gt;
                         	mConsole-&amp;gt;OutputMessage(outString);&lt;br /&gt;
			}&lt;br /&gt;
			else if (command == &amp;quot;quit&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				// do a /quit &lt;br /&gt;
			}&lt;br /&gt;
			else if (command == &amp;quot;help&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				// do a /help&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				std::string outString = &amp;quot;&amp;lt;&amp;quot; + inString + &amp;quot;&amp;gt; is an invalid command.&amp;quot;;&lt;br /&gt;
				(this)-&amp;gt;OutputText(outString,CEGUI::Colour(1.0f,0.0f,0.0f));  // With red ANGRY colors!&lt;br /&gt;
			}&lt;br /&gt;
		} // End if /&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
	            (this)-&amp;gt;OutputText(inString);  // no commands, just output what they wrote&lt;br /&gt;
		}&lt;br /&gt;
	}  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Phew, thats kinda an annoying function isn't it?  Well, the point to note is that it checks for a forward slash, if it finds one then it enters the if/else conditions to see if it found an applicable command.  If it does it does something.  In this example it handles the actions right there, if you were to write it a little more advanced, it could goto a (this)-&amp;gt;ShowHelp() or (this)-&amp;gt;QuitGame().  &lt;br /&gt;
&lt;br /&gt;
The point to note is the OutputText.  That will add the items to the ListBox of Chat history.  We will work on that function now.&lt;br /&gt;
&lt;br /&gt;
==== OutputText ====&lt;br /&gt;
&lt;br /&gt;
A point to note here.  A CEGUI::Listbox window doesn't naturally word wrap.  And wordwrapping is a very nice thing to have in a chat window, as everyone has different resolutions on their screens, and some people REALLY like to ramble! (But not this magnificant author of course!).  So we will use a Custom created widget which is available on the forums [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=10&amp;amp;t=4322].  you could use a normal listbox, but you wouldn't get word-wrapping.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; &lt;br /&gt;
void GameConsoleWindow::OutputText(std::string message, CEGUI::Colour colour)&lt;br /&gt;
{&lt;br /&gt;
	&lt;br /&gt;
	// Get a pointer to the ChatBox so we don't have to use this ugly getChild function everytime.&lt;br /&gt;
	CEGUI::Listbox *outputWindow =  static_cast&amp;lt;CEGUI::Listbox*&amp;gt;(m_ConsoleWindow-&amp;gt;getChild(&amp;quot;ConsoleRoot/ChatBox&amp;quot;));&lt;br /&gt;
	&lt;br /&gt;
	CEGUI::FormattedListboxTextItem *newItem=0;       // This will hold the actual text and will be the listbox segment / item&lt;br /&gt;
&lt;br /&gt;
	newItem = new CEGUI::FormattedListboxTextItem(message,CEGUI::HTF_WORDWRAP_LEFT_ALIGNED);   // Instance the Item with Left&lt;br /&gt;
                                                                                                   //   wordwrapped alignment&lt;br /&gt;
	newItem-&amp;gt;setTextColours(colour);                // Set the text color&lt;br /&gt;
	outputWindow-&amp;gt;addItem(newItem);                 // Add the new ListBoxTextItem to the ListBox&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Conclusion ====&lt;br /&gt;
&lt;br /&gt;
And that ladies and gentleman, is our Console box.  Not too terrible was it? Now of course, remember there are many ways to skin the proverbial cat.  This is just an example of ways to do things.  If you would like some homework, you could investigate why the SendButton does weird things when you drag and resize the window.  I'll give you a hint, look at the way we're defining how big the ConsoleRoot is and where its child windows are placed...  and what implications we might have by using relative scales for things..  Okay, i guess that was a big hint wasn't it!  &lt;br /&gt;
&lt;br /&gt;
Till next time...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=DialogPositions&amp;diff=4293</id>
		<title>DialogPositions</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=DialogPositions&amp;diff=4293"/>
				<updated>2011-03-05T12:55:21Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Fixing double redirect to Dialog Configurations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Dialog Configurations]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_Game_Console&amp;diff=4283</id>
		<title>CEGUI In Practice - A Game Console</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CEGUI_In_Practice_-_A_Game_Console&amp;diff=4283"/>
				<updated>2011-03-04T20:09:20Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}}&lt;br /&gt;
{{Series|CEGUI In Practice|6}}&lt;br /&gt;
&lt;br /&gt;
== CEGUI InPractice 6 ==&lt;br /&gt;
&lt;br /&gt;
Welcome back! This tutorial we will put together the knowledge from the past few chapters to create a functioning Console window. The last few tutorials have given us the basics. Now its time to put that knowledge to use and make something we can use in our game.&lt;br /&gt;
&lt;br /&gt;
==== Game Plan ====&lt;br /&gt;
&lt;br /&gt;
Okay, now lets look at what we need to do. We will want to be able to type in commands, press the send button, and have them output into the text box. We will also probably want to acknowledge when enter is pressed as thats the 'normal' feel of typing into a chat.&lt;br /&gt;
&lt;br /&gt;
We discussed earlier how to send input to CEGUI ([[CEGUI In Practice - Managing input]]), so we will have to assume that you have that working (and probably built the application structure behind it). We will also assume you used the previous tutorial's layout file and naming for the console window ( [[CEGUI In Practice - Using .layout files]]).&lt;br /&gt;
&lt;br /&gt;
Due to the fact that we are getting to a slightly more advanced implementation of CEGUI here, and because we may want the ConsoleWindow to do other more useful things (like parsing strings for /say commands) I'm going to create a class to encompass the CEGUI ConsoleWindow.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class GameConsoleWindow&lt;br /&gt;
{&lt;br /&gt;
    public:&lt;br /&gt;
       GameConsoleWindow();                   // Constructor&lt;br /&gt;
    private:&lt;br /&gt;
       void CreateCEGUIWindow();                                  // The function which will load in the CEGUI Window and register event handlers&lt;br /&gt;
       void RegisterHandlers();                                   // Register our handler functions&lt;br /&gt;
       void Handle_TextSubmitted(const CEGUI::EventArgs &amp;amp;e);      // Handle when we press Enter after typing&lt;br /&gt;
       void Handle_SendButtonPressed(const CEGUI::EventArgs &amp;amp;e);  // Handle when we press the Send button         &lt;br /&gt;
       void ParseText(CEGUI::String inMsg);                       // Parse the text the user submitted.&lt;br /&gt;
       void OutputText(CEGUI::String inMsg);                      // Post the message to the ChatHistory listbox.&lt;br /&gt;
       &lt;br /&gt;
       CEGUI::Window *m_ConsoleWindow;                            // This will be a pointer to the ConsoleRoot window.&lt;br /&gt;
       CEGUI::String sNamePrefix;                                  // This will be the prefix name we give the layout&lt;br /&gt;
       static int iInstanceNumber;                                 // This will be the instance number for this class. &lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright, so that will be our class. It might look daunting, but don't worry it will all make sense in the end.&lt;br /&gt;
&lt;br /&gt;
==== Setting up the Window ====&lt;br /&gt;
&lt;br /&gt;
Now we need to setup the window. We have done this before in the .layout tutorial so we will do it again here. However, we mentioned before that you could use a prefix when loading a .layout to avoid name conflicts if you load multiple layouts. So we need to account for that. Will we need multiple consoles? Who knows, might as well build it in while we're designing it right?&lt;br /&gt;
&lt;br /&gt;
Lets write the CreateCEGUIWindow function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::CreateCEGUIWindow()&lt;br /&gt;
{&lt;br /&gt;
	// Get a local pointer to the CEGUI Window Manager, Purely for convenience to reduce typing&lt;br /&gt;
	CEGUI::WindowManager *pWindowManager = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
&lt;br /&gt;
        // Now before we load anything, lets increase our instance number to ensure no conflicts.  &lt;br /&gt;
        // I like the format #_ConsoleRoot so thats how i'm gonna make the prefix.  This simply&lt;br /&gt;
        // Increments the iInstanceNumber then puts it + a _ into the sNamePrefix string. &lt;br /&gt;
        sNamePrefix = ++iInstanceNumber + &amp;quot;_&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        // Now that we can ensure that we have a safe prefix, and won't have any naming conflicts lets create the window&lt;br /&gt;
        // and assign it to our member window pointer m_ConsoleWindow&lt;br /&gt;
        m_ConsoleWindow = pWindowManager-&amp;gt;loadWindowLayout(inLayoutName,sNamePrefix);&lt;br /&gt;
&lt;br /&gt;
        // Being a good programmer, its a good idea to ensure that we got a valid window back. &lt;br /&gt;
        if (m_ConsoleWindow)&lt;br /&gt;
        {&lt;br /&gt;
            // Lets add our new window to the Root GUI Window&lt;br /&gt;
            CEGUI::System::getSingletonPtr()-&amp;gt;getGUISheet()-&amp;gt;addChildWindow(m_ConsoleWindow);&lt;br /&gt;
            // Now register the handlers for the events (Clicking, typing, etc)&lt;br /&gt;
            (this)-&amp;gt;RegisterHandlers();&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Something bad happened and we didn't successfully create the window lets output the information&lt;br /&gt;
            CEGUI::Logger::getSingletonPtr()-&amp;gt;logEvent(&amp;quot;Error: Unable to load the ConsoleWindow from .layout&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alright so that created the window. And after the window was created, we Registered its handlers. Lets look at how we go about&lt;br /&gt;
registering those handlers. Below is the RegisterHandlers function, it will probably look familiar if you have been reading along:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void GameConsoleWindow::RegisterHandlers()&lt;br /&gt;
{&lt;br /&gt;
    // Alright now we need to register the handlers.  We mentioned above we want to acknowledge when the user presses Enter, and &lt;br /&gt;
      // when they click the 'Send' button.  So we need to register each of those events&lt;br /&gt;
&lt;br /&gt;
    // First lets register the Send button.  Our buttons name is &amp;quot;ConsoleRoot/SendButton&amp;quot;, but don't forget we prepended a name to      &lt;br /&gt;
      // all the windows which were loaded.  So we need to take that into account here.&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/SendButton&amp;quot;)-&amp;gt;subscribeEvent(&lt;br /&gt;
                        CEGUI::PushButton::EventClicked,    // If we recall our button was of type CEGUI::PushButton in the .scheme&lt;br /&gt;
                                                            // and we want to acknowledge the EventClicked action.&lt;br /&gt;
                        CEGUI::Event::Subscriber(           // What function to call when this is clicked.  Remember, all functions &lt;br /&gt;
                                                            // are contained within (this) class.&lt;br /&gt;
                        &amp;amp;GameConsoleWindow::Handle_SendButtonPressed,  // Call Handle_SendButtonPressed member of GameConsoleWindow&lt;br /&gt;
                        this));                             // Using (this) instance we're in right now&lt;br /&gt;
&lt;br /&gt;
    // Now for the TextSubmitted, we will be registering the event on the edit box, which is where the users cursor will be when   &lt;br /&gt;
      //they press Enter.  I'm not going to break this down as much, because I believe that is very ugly to read, but was a good  &lt;br /&gt;
      //way of expressing it.  Here is the function call.&lt;br /&gt;
    m_ConsoleWindow-&amp;gt;getChild(sNamePrefix + &amp;quot;ConsoleRoot/EditBox&amp;quot;)-&amp;gt;subscribeEvent(CEGUI::Editbox::EventMouseClick,&lt;br /&gt;
                        CEGUI::Event::Subscriber(&amp;amp;GameConsoleWindow::Handle_TextSubmitted,this));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 That last line looks pretty ugly, but remember if you include namespace CEGUI; you won't have all those Ugly CEGUI:: prefixing all the code.  As you can see, once you get the hang of registering events its pretty easy.  One thing to note, is there are more than one way to account for certain actions.  On the button, you could also have registered for:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    CEGUI::PushButton::EventMouseClick&lt;br /&gt;
    CEGUI::PushButton::EventMouseButtonDown&lt;br /&gt;
    CEGUI::PushButton::EventMouseButtonUp&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 depending on what result you were looking for, and where you wanted the action to take place.  For example, windows interfaces usually react on the MouseButtonUp, allowing the user to click it, and then slide off the mouse if it wasn't what they really wanted to press.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Dynamic_Fonts&amp;diff=4279</id>
		<title>Dynamic Fonts</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Dynamic_Fonts&amp;diff=4279"/>
				<updated>2011-03-04T17:39:39Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}} {{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
The datafiles\fonts folder contains static font definitions such as Commonwealth-10.font.  The XML contents of that file specify one particular font, mainly a logical name (Commonwealth-10), a filename (Commonv2c.ttf), and a size (10).  To load this static font definition you'd write the following line of code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::FontManager::getSingleton().createFont(&amp;quot;Commonwealth-10.font&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This works well, but sometimes you need to display a same font in various sizes. One approach is to create multiple .font files, one per font size.  But there is a better approach, a way to dynamically create fonts.&lt;br /&gt;
&lt;br /&gt;
Please post comments or questions on the message board thread for the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=13350 DynamicFont]&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
&lt;br /&gt;
==== DynamicFont.h ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _DynamicFont_h_&lt;br /&gt;
#define _DynamicFont_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;CEGuiSample.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUI.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUIXMLAttributes.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DemoSample : public CEGuiSample&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    bool initialiseSample()&lt;br /&gt;
	{&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			// Retrieve the window manager&lt;br /&gt;
			WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
			// Load the TaharezLook scheme and set up the default mouse cursor and font&lt;br /&gt;
			SchemeManager::getSingleton().loadScheme(&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
			System::getSingleton().setDefaultMouseCursor(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
			if(!FontManager::getSingleton().isFontPresent(&amp;quot;Commonwealth-10&amp;quot;))&lt;br /&gt;
				FontManager::getSingleton().createFont(&amp;quot;Commonwealth-10.font&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Set the GUI Sheet&lt;br /&gt;
			Window* sheet = winMgr.createWindow(&amp;quot;DefaultWindow&amp;quot;, &amp;quot;root_wnd&amp;quot;);&lt;br /&gt;
			System::getSingleton().setGUISheet(sheet);&lt;br /&gt;
&lt;br /&gt;
			// Load a layout&lt;br /&gt;
			Window* guiLayout = winMgr.loadWindowLayout(&amp;quot;DynamicFont.layout&amp;quot;);&lt;br /&gt;
			sheet-&amp;gt;addChildWindow(guiLayout);&lt;br /&gt;
&lt;br /&gt;
			// Configure the event for the list of created fonts&lt;br /&gt;
			CEGUI::Combobox* existingFonts = static_cast&amp;lt;CEGUI::Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;DynamicFont/Fonts&amp;quot;));&lt;br /&gt;
			existingFonts-&amp;gt;subscribeEvent(CEGUI::Combobox::EventListSelectionAccepted,	CEGUI::Event::Subscriber(&amp;amp;DemoSample::eventSelectExistingFont, this)); &lt;br /&gt;
&lt;br /&gt;
			// Configure the event for the add button&lt;br /&gt;
			CEGUI::PushButton* add = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(winMgr.getWindow(&amp;quot;DynamicFont/Add&amp;quot;));&lt;br /&gt;
			add-&amp;gt;subscribeEvent(CEGUI::PushButton::EventMouseClick,	CEGUI::Event::Subscriber(&amp;amp;DemoSample::eventAddFont, this)); &lt;br /&gt;
&lt;br /&gt;
			// Add the font previously created&lt;br /&gt;
			addExistingFont(&amp;quot;Commonwealth-10&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		catch(Exception &amp;amp;e)&lt;br /&gt;
		{&lt;br /&gt;
			#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
				MessageBox(NULL, e.getMessage().c_str(), &amp;quot;Error initializing the demo&amp;quot;, MB_OK | MB_ICONERROR | MB_TASKMODAL);&lt;br /&gt;
			#else&lt;br /&gt;
				std::cerr &amp;lt;&amp;lt; &amp;quot;Error initializing the demo:&amp;quot; &amp;lt;&amp;lt; e.getMessage().c_str() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
			#endif&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void cleanupSample(void)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	bool eventAddFont(const CEGUI::EventArgs&amp;amp; args)&lt;br /&gt;
	{&lt;br /&gt;
		// Add a font from the specified parameters&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
&lt;br /&gt;
		WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
		Window* nameText = winMgr.getWindow(&amp;quot;DynamicFont/Name&amp;quot;);&lt;br /&gt;
		Window* filenameText = winMgr.getWindow(&amp;quot;DynamicFont/Filename&amp;quot;);&lt;br /&gt;
		Window* sizeText = winMgr.getWindow(&amp;quot;DynamicFont/Size&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		setFont(nameText-&amp;gt;getText(), filenameText-&amp;gt;getText(), sizeText-&amp;gt;getText());&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void addExistingFont(const CEGUI::String&amp;amp; pName)&lt;br /&gt;
	{&lt;br /&gt;
		// Once a font has been created we add it to the combobox of fonts&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
		Combobox* existingFonts = static_cast&amp;lt;CEGUI::Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;DynamicFont/Fonts&amp;quot;));&lt;br /&gt;
		ListboxTextItem* itemCombobox = new ListboxTextItem(pName);&lt;br /&gt;
		itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
		itemCombobox-&amp;gt;setSelected(true);&lt;br /&gt;
		existingFonts-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	bool eventSelectExistingFont(const CEGUI::EventArgs&amp;amp; args)&lt;br /&gt;
	{&lt;br /&gt;
		// Use an already created font&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
		Combobox* existingFonts = static_cast&amp;lt;CEGUI::Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;DynamicFont/Fonts&amp;quot;));&lt;br /&gt;
		setFont(existingFonts-&amp;gt;getText(), &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void setFont(const CEGUI::String&amp;amp; pName, const CEGUI::String&amp;amp; pFilename, const CEGUI::String&amp;amp; pSize)&lt;br /&gt;
	{&lt;br /&gt;
		// Set the font displayed within the multiline editbox&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
&lt;br /&gt;
		String sampleText(pName);&lt;br /&gt;
&lt;br /&gt;
		WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
		CEGUI::Window* text = winMgr.getWindow(&amp;quot;DynamicFont/Text&amp;quot;);&lt;br /&gt;
		Font* font;&lt;br /&gt;
&lt;br /&gt;
		if(FontManager::getSingleton().isFontPresent(pName))&lt;br /&gt;
		{&lt;br /&gt;
			// Select a previously created font&lt;br /&gt;
			font = FontManager::getSingleton().getFont(pName);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			// Dynamically create a new font&lt;br /&gt;
			XMLAttributes xmlAttributes;&lt;br /&gt;
&lt;br /&gt;
			// Attributes specified within CEGUIFont.cpp&lt;br /&gt;
			xmlAttributes.add(&amp;quot;Name&amp;quot;, pName);&lt;br /&gt;
			xmlAttributes.add(&amp;quot;Filename&amp;quot;, pFilename);&lt;br /&gt;
			xmlAttributes.add(&amp;quot;ResourceGroup&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
			xmlAttributes.add(&amp;quot;AutoScaled&amp;quot;, &amp;quot;true&amp;quot;);&lt;br /&gt;
			xmlAttributes.add(&amp;quot;NativeHorzRes&amp;quot;, &amp;quot;800&amp;quot;);&lt;br /&gt;
			xmlAttributes.add(&amp;quot;NativeVertRes&amp;quot;, &amp;quot;600&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Attributes specified within CEGUIXMLAttributes.cpp&lt;br /&gt;
			xmlAttributes.add(&amp;quot;Size&amp;quot;, pSize);&lt;br /&gt;
			xmlAttributes.add(&amp;quot;AntiAlias&amp;quot;, &amp;quot;true&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			try&lt;br /&gt;
			{&lt;br /&gt;
				font = FontManager::getSingleton().createFont(&amp;quot;FreeType&amp;quot;, xmlAttributes);&lt;br /&gt;
				if(font)&lt;br /&gt;
				{&lt;br /&gt;
					font-&amp;gt;load(); // This function must be used&lt;br /&gt;
					addExistingFont(pName);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			catch(Exception &amp;amp;e)&lt;br /&gt;
			{&lt;br /&gt;
				// Display the error message&lt;br /&gt;
				sampleText = e.getMessage();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		text-&amp;gt;setFont(font);&lt;br /&gt;
		text-&amp;gt;setText(sampleText);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif // _DynamicFont_h_&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
	#define WIN32_LEAN_AND_MEAN&lt;br /&gt;
	#define NOMINMAX&lt;br /&gt;
	#include &amp;quot;windows.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;DynamicFont.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)&lt;br /&gt;
#else&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
#endif&lt;br /&gt;
{&lt;br /&gt;
    DemoSample app;&lt;br /&gt;
    return app.run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DynamicFont.layout ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GUILayout &amp;gt;&lt;br /&gt;
    &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;DynamicFont&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Dynamic Font&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;InheritsAlpha&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.02,0},{0.054167,0},{0.98,0},{0.781251,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/MultiLineEditbox&amp;quot; Name=&amp;quot;DynamicFont/Text&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;/Property&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ReadOnly&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.01,0},{0.075,0},{0.99,0},{0.715617,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;DynamicFont/NameLabel&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Name:&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;HorzFormatting&amp;quot; Value=&amp;quot;RightAligned&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.018409,0},{0.881661,0},{0.0809004,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;DynamicFont/Name&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.0809,0},{0.881661,0},{0.328819,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;DynamicFont/FilenameLabel&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Filename:&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;HorzFormatting&amp;quot; Value=&amp;quot;RightAligned&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.347544,0},{0.881661,0},{0.438807,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;DynamicFont/Filename&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.438807,0},{0.881661,0},{0.713682,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;DynamicFont/SizeLabel&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Size:&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;HorzFormatting&amp;quot; Value=&amp;quot;RightAligned&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.731982,0},{0.881661,0},{0.793499,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;DynamicFont/Size&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.793499,0},{0.881661,0},{0.858294,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;DynamicFont/Add&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Add&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.867109,0},{0.881661,0},{0.974324,0},{0.968338,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;DynamicFont/FontsLabel&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Fonts:&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;HorzFormatting&amp;quot; Value=&amp;quot;RightAligned&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.018409,0},{0.768338,0},{0.0859395,0},{0.855015,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/Combobox&amp;quot; Name=&amp;quot;DynamicFont/Fonts&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ReadOnly&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.085939,0},{0.768338,0},{0.974324,0},{0.994412,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MaxEditTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
    &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=CELayout_Editor_-_Getting_Started_/_Building&amp;diff=4253</id>
		<title>CELayout Editor - Getting Started / Building</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=CELayout_Editor_-_Getting_Started_/_Building&amp;diff=4253"/>
				<updated>2011-03-04T16:12:27Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Robot: Cosmetic changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
This page tries to get you up and running with the layout editor. It will explain both the use of a distribution, and downloading from SVN. If you have problems, don't hesitate to visit the forums. And besides, you may alter this page with any information you think will be helpful to future readers of this page.&lt;br /&gt;
Some parts might be a little too verbose, but better safe then sorry ;-) If you're done reading, don't forget to read the [http://www.cegui.org.uk/wiki/index.php/Manual manual].&lt;br /&gt;
&lt;br /&gt;
== Using a distribution ==&lt;br /&gt;
&lt;br /&gt;
This is the recommended way. The distributions are stable and compatible with official CEGUI library releases. For example the 0.4.1 editor will work fine (&amp;quot;proven&amp;quot;) with the 0.4.1 CEGUI release. Visit the [http://www.cegui.org.uk/wiki/index.php/Downloads download page] for Windows installer(s) and Linux source distribution(s). Before installing a new version, it is recommeded that you uninstall a previous version first, because files might get removed in newer versions and such.&lt;br /&gt;
On windows you can stop reading now. Linux and/or SVN users must read on for a bit more.&lt;br /&gt;
&lt;br /&gt;
== Compiling yourself ==&lt;br /&gt;
If you are a non-windows user, or prefer SVN access over distributions, you must follow the steps mentioned in this topic.&lt;br /&gt;
&lt;br /&gt;
=== Setup CEGUI ===&lt;br /&gt;
Please see the [http://www.cegui.org.uk/wiki/index.php/HOWTO:_Obtain_the_library_source_from_subversion CEGUI download info] for downloading and compiling the cegui library.&lt;br /&gt;
&lt;br /&gt;
= Compile WxWidgets =&lt;br /&gt;
&lt;br /&gt;
This topic explains how to get and setup this cross-platform application framework.&lt;br /&gt;
&lt;br /&gt;
Distributions for many platforms can be found [http://www.wxwidgets.org/downld2.htm here].&lt;br /&gt;
&lt;br /&gt;
== On Windows ==&lt;br /&gt;
&lt;br /&gt;
=== Recommended: WxWidgets (2.8.11) ===&lt;br /&gt;
&lt;br /&gt;
* [http://prdownloads.sourceforge.net/wxwindows/wxWidgets-2.8.11.zip Download as .zip]&lt;br /&gt;
* I recommend applying the following change manually in the file '''wxWidgets-2.8.11\src\msw\stdpaths.cpp''' :&lt;br /&gt;
In the function '''wxString wxStandardPaths::GetAppDir()''' ( starting at line 249 ) delete the lines 253 - 263 which should be equal to the following code snippet:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// allow running the apps directly from build directory in debug builds&lt;br /&gt;
#ifdef __WXDEBUG__&lt;br /&gt;
    wxString lastdir;&lt;br /&gt;
    if ( fn.GetDirCount() )&lt;br /&gt;
    {&lt;br /&gt;
        lastdir = fn.GetDirs().Last();&lt;br /&gt;
        lastdir.MakeLower();&lt;br /&gt;
        if ( lastdir.Matches(_T(&amp;quot;debug*&amp;quot;)) || lastdir.Matches(_T(&amp;quot;vc_msw*&amp;quot;)) )&lt;br /&gt;
            fn.RemoveLastDir();&lt;br /&gt;
    }&lt;br /&gt;
#endif // __WXDEBUG__&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Deleting those lines will fix a bug leading to inconsistency between debug and release and allows you to load the splash screen png-file directly from the debug directory, same as it is the case for release. Otherwise, for the debug configuration the splash screen will be loaded from the bin directory (one level above).&lt;br /&gt;
* For compiling you have two options:&lt;br /&gt;
** Option 1 (fast): Compile using Visual Studio command line&lt;br /&gt;
*** Open the VS command line ( Start-&amp;gt;All Programs-&amp;gt;Microsoft Visual Studio-&amp;gt;Visual Studio Tools-&amp;gt;Visual Studio command line )&lt;br /&gt;
*** In the command line change to the build directory '''wxWidgets-2.8.11\build\msw''' (example: &amp;quot;'''cd C:\wxWidgets-2.8.11\build\msw'''&amp;quot;)&lt;br /&gt;
*** To compile the debug configuration enter '''nmake -f makefile.vc BUILD=debug UNICODE=1 USE_OPENGL=1'''&lt;br /&gt;
*** To compile the release configuration enter '''nmake -f makefile.vc BUILD=release UNICODE=1 USE_OPENGL=1'''&lt;br /&gt;
** Option 2: Compile using the Visual Studio solution:&lt;br /&gt;
*** Change the lines '''#define wxUSE_GLCANVAS 0''' to '''#define wxUSE_GLCANVAS 1''' in the following files:&lt;br /&gt;
*** '''wxWidgets-2.8.11\include\wx\msw\setup.h'''&lt;br /&gt;
*** '''wxWidgets-2.8.11\include\wx\msw\setup0.h'''&lt;br /&gt;
*** '''wxWidgets-2.8.11\include\wx\univ\setup.h'''&lt;br /&gt;
*** Start '''wxWidgets-2.8.11\build\msw\wx.dsw''' (if saving the project afterwards, you can open wx.sln for later use cases)&lt;br /&gt;
*** Build all projects in &amp;quot;Unicode Debug&amp;quot; and &amp;quot;Unicode Release&amp;quot; configurations&lt;br /&gt;
&lt;br /&gt;
=== WxWidgets (2.9.0) ===&lt;br /&gt;
* '''NOTE:''' Appearently this release doesn't work well with the editor yet. Please use 2.8.10 as latest 'safe' release.&lt;br /&gt;
* Download [http://www.wxwidgets.org/downloads/ wxAll].&lt;br /&gt;
* Edit '''wxWidgets-2.9.0\include\wx\msw\setup.h''', '''wxWidgets-2.9.0\include\wx\msw\setup0.h''' and '''wxWidgets-2.9.0\include\wx\univ\setup.h''' to change from '''#define wxUSE_GLCANVAS 0''' to '''#define wxUSE_GLCANVAS 1'''.&lt;br /&gt;
* Build '''wxWidgets-2.9.0\build\msw\wx.dsw''' (Appearently recent wx releases include solutions for vc7, 8 and 9 too).&lt;br /&gt;
* More unknown changes???&lt;br /&gt;
&lt;br /&gt;
=== WxWidgets (2.8.3 - 2.8.10) ===&lt;br /&gt;
&lt;br /&gt;
* Download [http://www.wxwidgets.org/downloads/ wxAll].&lt;br /&gt;
* Edit '''wxWidgets-2.8.3\include\wx\msw\setup0.h''' and '''wxWidgets-2.8.3\include\wx\univ\setup.h''' to change from '''#define wxUSE_GLCANVAS 0''' to '''#define wxUSE_GLCANVAS 1'''.&lt;br /&gt;
* Build '''wxWidgets-2.8.3\build\msw\wx.dsw'''&lt;br /&gt;
* More unknown changes???&lt;br /&gt;
&lt;br /&gt;
=== WxWidgets (2.6.4) ===&lt;br /&gt;
&lt;br /&gt;
* Download [http://www.wxwidgets.org/downloads/ wxAll].&lt;br /&gt;
* Edit '''wxWidgets-2.6.4\include\wx\msw\setup.h''' and '''wxWidgets-2.6.4\include\wx\univ\setup.h''' to change from '''#define wxUSE_GLCANVAS 0''' to '''#define wxUSE_GLCANVAS 1'''.&lt;br /&gt;
* Build '''wxWidgets-2.6.4\build\msw\wx.dsw'''&lt;br /&gt;
&lt;br /&gt;
'''Note: '''I (scriptkid) always use the regular 'unicode debug' and 'unicode release' builds. But i assume that the DLLs will work fine too. If it hasn't been done so already, add 'include/msvc' and include to the include build paths and 'lib/vc_lib' to the library paths in Visual Studio.&lt;br /&gt;
&lt;br /&gt;
=== WxWidgets (less than 2.6.4) ===&lt;br /&gt;
&lt;br /&gt;
Because of issues I had compiling wxWidgets properly, I'm going to go into more depth for using Visual Studio 7.1 or 8.0 to do so. (Jouninkomiko 05-20-2006)&lt;br /&gt;
&lt;br /&gt;
* Because the editor uses the wxGLCanvas, open include/msvc/wx/setup.h, and change the define for wxUSE_GLCANVAS from 0 to 1.&lt;br /&gt;
** Within the src/wxWindows.dsw solution you'll find this setting inside the wxWindows project, under Headers/Setup/setup.h&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''NOTE:''' Another Windows specific step-by-step guide was posted in the forums by [[User:fjeronimo|fjeronimo]] and can be read here: http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2760&lt;br /&gt;
&lt;br /&gt;
== On Linux ==&lt;br /&gt;
* Enter ./configure --with-opengl --enable-unicode&lt;br /&gt;
* Enter make&lt;br /&gt;
* Enter make install&lt;br /&gt;
&lt;br /&gt;
=== Setup the editor ===&lt;br /&gt;
This topic explains how to get and setup the editor from sources.&lt;br /&gt;
&lt;br /&gt;
==== Checkout ====&lt;br /&gt;
If you use a non-command line utility such as TortoiseSVN, you can choose one of these URLs to respectively checkout the HEAD or one of the stable branches.&lt;br /&gt;
 http'''s'''://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk&lt;br /&gt;
 http'''s'''://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/branches/v-0-4-1&lt;br /&gt;
 http'''s'''://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/branches/before_wxwidgets&lt;br /&gt;
&lt;br /&gt;
Or, from the command line (same order):&lt;br /&gt;
 svn co http'''s'''://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk MyEditorFolder&lt;br /&gt;
 svn co http'''s'''://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/branches/v-0-4-1 MyEditorFolder&lt;br /&gt;
 svn co http'''s'''://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/branches/before_wxwidgets MyEditorFolder&lt;br /&gt;
&lt;br /&gt;
Retreiving is always &amp;quot;anonymous&amp;quot;, so it should work immediately.&lt;br /&gt;
&lt;br /&gt;
==== Compile ====&lt;br /&gt;
&lt;br /&gt;
On windows:&lt;br /&gt;
* Open vc++6/CELayoutEditor.dsw (VS6) or vc++6/CELayoutEditor.sln (VS7.1). Conversions should happen automatically when opening on newer versions. Make sure that you add the directories 'wxWidgets-x.x.x\include' and 'wxWidgets-x.x.x\include\msvc' to your Include Directories, and 'wxWidgets-x.x.x\lib\vc_lib' to your Library Directories.&lt;br /&gt;
* Also add CEGUI-0.5.0 to the project include folders.&lt;br /&gt;
* Also add CEGUI-0.5.0\include to the project include folders.&lt;br /&gt;
* Build either Debug or Release.&lt;br /&gt;
&lt;br /&gt;
On Linux:&lt;br /&gt;
* Enter ./bootstrap&lt;br /&gt;
* Enter ./configure&lt;br /&gt;
* Enter make&lt;br /&gt;
* Enter make install&lt;br /&gt;
* Optionally set the CELAYOUTEDITOR_DATAPATH environment variable to point the editor to the correct 'datafiles' directory. If you do not set this variable, the editor will default to the location where it thinks the datafiles were installed (this will be typically be something like /usr/local/share/CELayoutEditor/datafiles). See the configuration file for additional details.&lt;br /&gt;
&lt;br /&gt;
Hopefully, we will have a mac-compatible project or makefile in the future as well, so watch this space! :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup CELayoutEditor ==&lt;br /&gt;
&lt;br /&gt;
* If using the Visual Studio solution: go to the '''Project Settings''' and under '''Debugging''' set '''$(TargetDir)''' as the '''working directory''' for your configurations ('''Debug''' and '''Release''').&lt;br /&gt;
&lt;br /&gt;
* Get all the '''CEGUI dll s''' you need and place them in your working directories. ( e.g. in '''C:\CELayoutEditor\bin\debug''' and '''C:\CELayoutEditor\bin\release''' if &amp;quot;C:\CELayoutEditor&amp;quot; is your checkout directory). You will also need '''SILLY.dll''' and '''SILLY_d.dll''' from the CEGUI dependencies respectively placed in the release and debug directories.&lt;br /&gt;
&lt;br /&gt;
* Now after compiling, the CELayoutEditor should be ready to start and working. Everything regarding the .ini files and handling the editor should be covered in the manual.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Changes_and_Porting_Tips_for_0.5.0&amp;diff=4246</id>
		<title>Changes and Porting Tips for 0.5.0</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Changes_and_Porting_Tips_for_0.5.0&amp;diff=4246"/>
				<updated>2011-03-04T14:37:03Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: SILLY interlinks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}}&lt;br /&gt;
&lt;br /&gt;
Note that this is incomplete, work in progress, documentation.&lt;br /&gt;
&lt;br /&gt;
= Release =&lt;br /&gt;
&lt;br /&gt;
* 0.5.0 stable Released on November the 6th 2006: [[CEGUI Downloads 0.5.0|goto download page]]&lt;br /&gt;
* 0.5.0 RC1 Released on June the 20th 2006: [[Downloads 0.5.0-RC1|goto download page]]&lt;br /&gt;
* 0.5.0 RC2 Released on August the 13th 2006: [[Downloads 0.5.0-RC2|goto download page]]&lt;br /&gt;
&lt;br /&gt;
= ChangeLog =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Release 0.5.0 (Final)&lt;br /&gt;
=====================&lt;br /&gt;
Added: TaharezLook was missing ItemListbox and ListboxItem windows &amp;amp; skin&lt;br /&gt;
definitions.&lt;br /&gt;
Added: Partial CEGUI support for MingW. It is now possible to build CEGUI under&lt;br /&gt;
mingw with support for OpenGL renderer. This approach is going to be generalized&lt;br /&gt;
later to the other renderer and wiki page explaining the process will follows.&lt;br /&gt;
Added: Missing functions in WindowFactoryManager Lua bindings. Incomplete&lt;br /&gt;
FalagardWindowMapping binding as well.&lt;br /&gt;
Added: Lua binding for OutStream: FileStream (minimal std::ofstream).&lt;br /&gt;
Added: XML writing function in Lua bindings.&lt;br /&gt;
Added: --enable-debug in configure script instead of using CPPFLAGS=-DDEBUG&lt;br /&gt;
./configure ...&lt;br /&gt;
Added: premake files for Minesweeper sample and minor fixes to make it run in&lt;br /&gt;
windows.&lt;br /&gt;
Added: the minesweeper demo&lt;br /&gt;
Added: missing doxyfile in order to be in make dist&lt;br /&gt;
Added: ScrollablePane sample&lt;br /&gt;
&lt;br /&gt;
Removed: Empty Font 'implData' header files we no longer use.&lt;br /&gt;
Removed: [[Falagard]] skinning manual is now a part of the CEGUI manuals&lt;br /&gt;
sub-project, so is no longer included here as a pdf.&lt;br /&gt;
&lt;br /&gt;
Modified: Changed Demo7 to use the layout XML file instead of hard-coded window&lt;br /&gt;
creation.&lt;br /&gt;
Modified: Demo7Window.layout now uses the new ItemListbox, with items defined&lt;br /&gt;
within the layout, as the Listbox as opposed to the old style list with&lt;br /&gt;
hard-coded items.&lt;br /&gt;
Modified: Win32CEGuiRendererSelector:&lt;br /&gt;
- It is now possible to navigate to the Combobox via keyboard.&lt;br /&gt;
- First available renderer is pre-selected into the dialog.&lt;br /&gt;
- With a single renderer available, it is auto-selected and dialog is not shown.&lt;br /&gt;
Modified: Changed compile order under autotools so CEGUIBase is made before&lt;br /&gt;
things that use it - related to forthcoming cross-compile support.&lt;br /&gt;
Modified Added some missing bits and a whole load of other stuff to 'make dist'&lt;br /&gt;
to ease a more unified approach to creating packages for the various platforms.&lt;br /&gt;
Modified: Renamed tolua++bin/remake_pkg..bat to remove extra period&lt;br /&gt;
Modified: Changed Russian text in FontDemo sample - the old text apparently&lt;br /&gt;
potentially offensive. Thanks to 'Sanya' for the updated text.&lt;br /&gt;
Modified: The RefCounted template now has the CEGUIEXPORT macro as it avoids&lt;br /&gt;
warnings in client code when using MSVC.&lt;br /&gt;
Modified: Promote Expat to be the second prefered parser under linux in order to&lt;br /&gt;
act the same under linux and Win32. Note that the prefered parser is still&lt;br /&gt;
Xerces. The parser order is now the following : Xerces, Expat, Libxml, TinyXML.&lt;br /&gt;
Modified: WidgetComponent had a nasty misspelling of 'Alignemnt'.&lt;br /&gt;
Modified: MSVC no longer uses CEGUIConfig.h and CEGUISamplesConfig.h for&lt;br /&gt;
anything&lt;br /&gt;
Modified: Premake scripts are now much more flexible.&lt;br /&gt;
&lt;br /&gt;
Coding Standards: Removed various occurrences of the NULL macro.&lt;br /&gt;
&lt;br /&gt;
Docs: Added note to docs for Spinner regarding the lame state of floating point&lt;br /&gt;
support.&lt;br /&gt;
&lt;br /&gt;
Bug Fix: ListHeader settings for sizing, moving, and clicking were not properly&lt;br /&gt;
set on newly created segments.&lt;br /&gt;
Bug Fix: Resolved issue where the algorithm that ensured font textures were&lt;br /&gt;
filled would actually end up trying to render every glyph within a font.&lt;br /&gt;
Bug Fix: ItemListBase::insertItem was not setting the ItemEntry::d_ownerList&lt;br /&gt;
member correctly.&lt;br /&gt;
Bug Fix: Added another 'special case' to Spinner::getValueFromText to support&lt;br /&gt;
typing an initial decimal point.&lt;br /&gt;
Bug Fix: Sometimes compound widgets did not get their components layed out&lt;br /&gt;
properly when adding the widget to its parent.&lt;br /&gt;
Bug Fix: The way in which properties would set a window to use the DefaultFont&lt;br /&gt;
was incorrect; it explicitly set it to the name of the current default, as&lt;br /&gt;
opposed to a 'floating default'.&lt;br /&gt;
Bug Fix: FontDim did not work correctly since re-calculation of the layout was&lt;br /&gt;
not triggered in response to the font being changed.  Added this code to&lt;br /&gt;
Window::onFontChanged - although more elegant / selective solutions might be&lt;br /&gt;
considered later on.&lt;br /&gt;
Bug Fix: Added code so that all windows using default font get notified of a&lt;br /&gt;
change in the default via the normal channel (Window::onFontChanged).&lt;br /&gt;
Bug Fix: There was an issue regarding auto-repeat of mouse button down events&lt;br /&gt;
not getting their state reset if the mouse button was released outside of the&lt;br /&gt;
window getting the auto-repeat events.&lt;br /&gt;
Bug Fix: CEGuiSample.cpp did not get all required includes with certain renderer&lt;br /&gt;
combinations.&lt;br /&gt;
Bug Fix: Range emplyed by FreeTypeFont::rasterize was exclusive of the start&lt;br /&gt;
element; first glyph of every page loaded was missed!&lt;br /&gt;
Bug Fix: CEGUI::Window did not properly clean-up a custom tooltip if it created&lt;br /&gt;
one.&lt;br /&gt;
Bug Fix: Calculation of number of glyph pages in Font::setMaxCodepoint was&lt;br /&gt;
incorrect.&lt;br /&gt;
Bug Fix: When the OpenGL renderer was disabled by ./configure, the [[SILLY]] codec&lt;br /&gt;
was still being built.&lt;br /&gt;
Bug Fix: When the OpenGL renderer was disabled by ./configure, the requirement&lt;br /&gt;
for a default ImageCodec was still enforced.&lt;br /&gt;
Bug Fix: case of included file in Win32CEGuiRendererSelector.cpp changed ready&lt;br /&gt;
to support cross-compiling in post 0.5.0 versions.&lt;br /&gt;
Bug Fix: Support was broken in the Samples framework for newer versions of Ogre.&lt;br /&gt;
Bug Fix: The cegui_reldim and cegui_absdim macros were missing the CEGUI&lt;br /&gt;
namespace qualifier.&lt;br /&gt;
Bug Fix: When a glyph failed to load in FreeTypeFont, although we logged the&lt;br /&gt;
error we did not work around the issue of the missing glyph image, so a seg&lt;br /&gt;
fault was generated upon attempted use of those missing images. This addresses&lt;br /&gt;
the issue by creating dummy images for missing font glyphs which use a zero&lt;br /&gt;
size. Mantis #0000125.&lt;br /&gt;
Bug Fix: RefCounted would call AddRef when the wrapped pointer and its counter&lt;br /&gt;
were null.&lt;br /&gt;
Bug Fix: Event::ScopedConnection would call members of BoundSlot using a&lt;br /&gt;
potentially null RefCounted pointer.&lt;br /&gt;
Bug Fix: In C++ a namespace does not have a semicolon after the closing brace.&lt;br /&gt;
Bug Fix: Nasty memory leak in DevIL image codec. thanx to mafm on IRC.&lt;br /&gt;
Bug Fix: fixed a small error in the comment of CEGUI_DECLARE_WINDOW_FACTORY&lt;br /&gt;
Bug Fix: Tab control did not require to hear about multi-clicks on the&lt;br /&gt;
TabControl scroll buttons. Patch from zap. Mantis #0000117.&lt;br /&gt;
Bug Fix: Issue with utf8 missing conversion in TinyXML and libXML&lt;br /&gt;
Bug Fix: Added missing public visibility specifier to ScopedConnection class&lt;br /&gt;
members.&lt;br /&gt;
Bug Fix: premake files were not enabling Xerces correctly in the samples.&lt;br /&gt;
Bug Fix: TabControlDemo layout split up. We dont allow multiple root windows in&lt;br /&gt;
a layout when using a validating XML parser.&lt;br /&gt;
Bug Fix: Falagard.xsd was missing new type attribute for PropertyDim.&lt;br /&gt;
Bug Fix: PropertyLinkDefinition was not writing XML properly (no base class&lt;br /&gt;
writing).&lt;br /&gt;
Bug Fix: Bugs in [[Falagard]] XML writing.&lt;br /&gt;
Bug Fix: Spinner would throw an exception when a lone minus sign was entered.&lt;br /&gt;
Mantis ticket #110.&lt;br /&gt;
Bug Fix: Input capture bug that broke Combobx - introduced by patch #82.&lt;br /&gt;
Bug Fix: ScrollablePane would cause exceptions on destruction. Mantis ticket&lt;br /&gt;
#83.&lt;br /&gt;
Bug Fix: a bug in the premake improvements where samples would not generate&lt;br /&gt;
properly.&lt;br /&gt;
Bug Fix: A number of CEGUI exceptions were being caught by value instead of&lt;br /&gt;
reference.&lt;br /&gt;
Bug Fix: OpenGL renderer now also disables texture coordinate generation.&lt;br /&gt;
Bug Fix: Irrlicht sample driver now quits on the escape key like the rest.&lt;br /&gt;
Bug Fix: Updates and fixes to resolve the NPOT texture source data issue (mantis&lt;br /&gt;
#45) in a relatively consistent way - at least for the 0.5.x releases.&lt;br /&gt;
&lt;br /&gt;
Release 0.5.0-RC2&lt;br /&gt;
=================&lt;br /&gt;
Added: single colour support to PropertyHelper::stringToColourRect&lt;br /&gt;
Added: missing support to Irrlicht renderer for creating a texture with a given size.&lt;br /&gt;
Added: Updates to renderers for D3D8.1 and D3D9 to report correct values for 'original' size and actual texture size.  (Related to Mantis ticket #45).&lt;br /&gt;
Added: Support for using user defined image codec by name (using dso) or directly throught a pointer to an existing image codec.&lt;br /&gt;
Added: Long property export (allows for properties containing multiple lines).&lt;br /&gt;
Added: Helper methods to Window to return EventSet::Iterator and PropertySet::Iterator objects.&lt;br /&gt;
Added: Reworked TabControl by zap.  Mantis #82.&lt;br /&gt;
Added: TabControlDemo sample.  Mantis #82.&lt;br /&gt;
Added: Danish language in the FontDemo sample.&lt;br /&gt;
Added: Output of summary of configure results (for configure based builds)&lt;br /&gt;
Added: Texture extra size information to CEGUI::Texture in order to be able to handle scaled/stretched textures within Imageset.&lt;br /&gt;
Added: Texture Scaling support in IrrlichRenderer &lt;br /&gt;
&lt;br /&gt;
Removed: Empty source file CEGUIVector.cpp&lt;br /&gt;
Removed: TabPane files.&lt;br /&gt;
&lt;br /&gt;
Modified: Behaviour of Editbox so that EventCharacterKey events are only marked as handled if the key press actually resulted in a change to the Editbox text string. (Related to Mantis #59)&lt;br /&gt;
Modified: Replaced all getWindow&amp;lt;something&amp;gt; with get&amp;lt;something&amp;gt;&lt;br /&gt;
Modified: Replaced all setWindow&amp;lt;something&amp;gt; with set&amp;lt;something&amp;gt;&lt;br /&gt;
Modified: EventSet::EventIterator now known as EventSet::Iterator&lt;br /&gt;
Modified: PropertySet::PropertyIterator now known as PropertySet::Iterator&lt;br /&gt;
Modified: ImageCodec modules are now DynamicModule &lt;br /&gt;
Modified: [[Falagard]] PropertyDim now supports a type attribute for UDim properties.  Mantis #82.&lt;br /&gt;
Modified: Improved TabControl imagery.  Mantis #82.&lt;br /&gt;
Modified: autotools makefiles now symlink the sample binaries (to avoid having to do 'make install').  Mantis #82.&lt;br /&gt;
Modified: PropertyHelper now uses snprintf instead of std::ostringstream again.  Mantis #82.&lt;br /&gt;
Modified: Removed static Makefile for tolua++cegui generator tool and switched to autotools style build, with enable/disable configure option, for tolua++cegui generator tool&lt;br /&gt;
Modified: Moved tolua++ into its own dir, removed lua_and_tolua++&lt;br /&gt;
Modified: Externalised our use of the Lua library&lt;br /&gt;
Modified: premake updates&lt;br /&gt;
Modified: Updated AUTHORS file.&lt;br /&gt;
Modified: Remove exec file attribute on Falagard.xsd &lt;br /&gt;
Modified: XMLRefSchema/Font.xsd for font rewrite&lt;br /&gt;
Modified: LuaScriptModule public headers no longer need include lua.h included.&lt;br /&gt;
Modified: Made a bunch of warnings go away in MSVC in the new font code.&lt;br /&gt;
Modified: Deleted the remaining old msvc project files.&lt;br /&gt;
&lt;br /&gt;
Bug Fix: Clean the XMLSerialization code: remove empty autowindow &lt;br /&gt;
Bug Fix: Added missing glDisable(GL_FOG); in gl renderer&lt;br /&gt;
Bug Fix: Irrlicht and D3D8.1 renderer modules would keep live pointers to Texture objects that failed to fully initialise (file or size errors for example)  Mantis #43.&lt;br /&gt;
Bug Fix: Disable texture stages we do not use in Direct3D renderers. (Mantis #95)&lt;br /&gt;
Bug Fix: Mouse cursor z value.  Mantis #49 &lt;br /&gt;
Bug Fix: Imagset XML attribute for image file name is 'Imagefile' and not 'Filename'.&lt;br /&gt;
Bug Fix: normal attributes use 'true', only properties sometimes use 'True'.&lt;br /&gt;
Bug Fix: Global default resource group was not being used by DefaultResourceProvider.&lt;br /&gt;
Bug Fix: XML output from CEGUI::Image class.&lt;br /&gt;
Bug Fix: Imageset scaling issue when renderer automatically scales the image #45 (this is currently a partial fix)&lt;br /&gt;
Bug Fix: IrrlichtRenderer - Mouse event error.  Mantis #98.&lt;br /&gt;
Bug Fix: IrrlichtRenderer - size error in addQuad.  Mantis #99.&lt;br /&gt;
Bug Fix: IrrlichtRenderer - Sample driver had linker lib name wrong for renderer module.  Mantis #100.&lt;br /&gt;
Bug Fix: TinyXMLParser bug.  Mantis Tracker #57 &lt;br /&gt;
Bug Fix: a bug in the openglrenderer cleanup related to image codec. &lt;br /&gt;
Bug Fix: Install renderer module includes at the same place as in Win32 (linux / mac autotools) &lt;br /&gt;
Bug Fix: OpenGL sample driver did not inject middle mouse up (injected it as down).  Mantis #82.&lt;br /&gt;
Bug Fix: Corrected some mistakes in the [[Falagard]] Lua bindings&lt;br /&gt;
Bug Fix: Apparently in some cases OpenGLRenderer needs NOMINMAX in Win32 (Mantis #63)&lt;br /&gt;
Bug Fix: FreeTypeFont did not free the font data properly, also fixes a potential infinite loop in FreeTypeFont (Mantis #60)&lt;br /&gt;
Bug Fix: FairChar font texture was not power of 2 (Mantis #64)&lt;br /&gt;
Bug Fix: SliderThumb incorrectly mapped in some schemes (mantis #88)&lt;br /&gt;
Bug Fix: Updated Irrlicht renderer to work with 0.5.0 codebase.&lt;br /&gt;
Bug Fix: some missing data &lt;br /&gt;
Bug Fix: DirectX 8.1 sample driver&lt;br /&gt;
Bug Fix: some missing files in the make dist command (Mantis #89)&lt;br /&gt;
Bug Fix: Change the name of an enumeration value in schema Font.xsd.&lt;br /&gt;
Bug Fix: Memory leak in Font.&lt;br /&gt;
Bug Fix: Lua bindings was missing ImagesetManager::createImagesetFromImageFile + some missing tolua_throws modifiers&lt;br /&gt;
&lt;br /&gt;
== Release 0.5.0-RC1 ==&lt;br /&gt;
Various internal code cleanups:&lt;br /&gt;
- Removal of unrequired utf8* casts on string literals.&lt;br /&gt;
- Removed use of NULL macro from the library code.&lt;br /&gt;
- Code refactorings to Font class. Removes some instances of repeated code, and makes &lt;br /&gt;
some methods shorter / cleaner.&lt;br /&gt;
- Split large methods in Scheme into smaller, more managable, chunks.&lt;br /&gt;
- Removed all the System constructor overloads and replaced with a single method.&lt;br /&gt;
- Removed string literals for component widget names which were scattered throughout t&lt;br /&gt;
he widget code.&lt;br /&gt;
- Replaced virtually all member fields holding pointers to component widgets with gett&lt;br /&gt;
er methods (which basically allows those widgets to be replaced without the parent kno&lt;br /&gt;
wing or caring).&lt;br /&gt;
- Refactoring of XML handler to remove huge if/else if/else construct.&lt;br /&gt;
- Refectored large if / else if / else constructs in all non-falagard XML handlers to &lt;br /&gt;
use a member function for each element type (rather than having all code in one huge f&lt;br /&gt;
unction).&lt;br /&gt;
- Event system has been rewritten from scratch.&lt;br /&gt;
- Font system has been rewritten.&lt;br /&gt;
&lt;br /&gt;
Added &amp;quot;PushedOff&amp;quot; rendering state for button based widgets and MenuItem.&lt;br /&gt;
Added: Ability to rename windows.&lt;br /&gt;
Added: CEGUISamplesConfig.h file to allow configuration of samples framework independe&lt;br /&gt;
ntly of the main config (saves recompiling everything just to change some sample setti&lt;br /&gt;
ng).&lt;br /&gt;
Added: FPS readout to OpenGL base app in the samples framework.&lt;br /&gt;
Added: &amp;quot;PropertyLinkDefinition&amp;quot; element for [[Falagard]] system.&lt;br /&gt;
Added: &amp;quot;controlPropery&amp;quot; attribute to SectionSpecififations under falagard to enable re&lt;br /&gt;
nering of section imagery to be controled via a named boolean property.&lt;br /&gt;
Added: mouse pass through feature in Window, to ignore mouse events. Nice for making a&lt;br /&gt;
 DefaultWindow transparent to the mouse regarding picking windows behind it.&lt;br /&gt;
Added: MSVC++ auto-linking for Ogre base app in samples framework.&lt;br /&gt;
Added: grab/restoreTextures in the OpenGL renderer to cache texture image data, and la&lt;br /&gt;
ter restore it.&lt;br /&gt;
Added: Abstracted Logger interface to support user created custom loggers. (SF patch #&lt;br /&gt;
1414121 by zap)&lt;br /&gt;
Added: DefaultLogger implementation (SF patch #1414121 by zap)&lt;br /&gt;
Added: page up/down key functionality to MultiLineEditbox (SF patch #1347376 by Dalfy)&lt;br /&gt;
Added: small script to recreate the binding generator for tolua++&lt;br /&gt;
Added: customized tolua++ binary. For exception handling support in generated binding &lt;br /&gt;
code.&lt;br /&gt;
Added: missing exception definitions file needed to generate the bindings.&lt;br /&gt;
Added: README with instructions on how to generate the bindings.&lt;br /&gt;
Added: Documentation for some of the new features in the bundled tolua++ generator.&lt;br /&gt;
Added: When subscribing to events from &amp;quot;inside&amp;quot; Lua a self object can be registered as&lt;br /&gt;
 well to be passed along with the EventArgs.&lt;br /&gt;
Added: New WindowRenderer system, replacing previous system where the Window sub-class&lt;br /&gt;
 controlled the rendering process.&lt;br /&gt;
Added: Major update of the LuaScriptModule to support anonymous functions.&lt;br /&gt;
Added: Exception handling has been added for some functions.&lt;br /&gt;
Added: [[Falagard]] derivatives of DefaultWindow, DragContainer and ItemEntry with minimal&lt;br /&gt;
 StateImagery.&lt;br /&gt;
Added: executeEventHandler now accepts functions that are table fields.&lt;br /&gt;
Added: Text node support to both parser (Xerces and TinyXML)&lt;br /&gt;
Added: AutoWindow tag to xml layouts to fetch a window created by the look'n'feel or t&lt;br /&gt;
he base widget itself.&lt;br /&gt;
Added: Window::isAutoWindow member that returns true if the window has &amp;quot;__auto_&amp;quot; in it&lt;br /&gt;
s name. (a flag is set in the constructor). It's faster than checking the actual strin&lt;br /&gt;
g.&lt;br /&gt;
Added: A setting to Window to specify that it should never write XML no matter what if&lt;br /&gt;
 activated. Tooltips get this set by default by System.&lt;br /&gt;
Added: A property ban list to provide a system for mapping which properties should (no&lt;br /&gt;
t) be written to XML. In the respective addProperties member functions checks have bee&lt;br /&gt;
n added and some properties are banned if we are an auto window.&lt;br /&gt;
Added: Default resource group support to Xerces for use when loading schema files.&lt;br /&gt;
Added: Default resource group support to ScriptingModule, and implemented its use in &lt;br /&gt;
the CEGUILua module.&lt;br /&gt;
Added: DynamicModule class to wrap access to a dynamically linked / loaded module.&lt;br /&gt;
Added: New dynamic libraries for Xerces, Expat TinyXMLParser, and libxml Parsers.&lt;br /&gt;
Added: TextProperty and FontProperty elements for [[Falagard]] text components.&lt;br /&gt;
Added: New ItemListBase based ItemListbox widget. For Window based listbox items.&lt;br /&gt;
Added: XML Serialization class for all XML writing.&lt;br /&gt;
Added: Recursive versions of Window::getChild and isChild by ID. They are called getCh&lt;br /&gt;
ildRecursive and isChildRecursive. Reason for the explicit naming is that it's a pretty expensive operation and should not be used unless necessary.&lt;br /&gt;
Added: Lots of missing members in the Lua bindings.&lt;br /&gt;
Added: setlocale(LC_NUMERIC, &amp;quot;C&amp;quot;); to the System constructor as we depend on this beha&lt;br /&gt;
viour.&lt;br /&gt;
Added: setVisible member to CEGUI::MouseCursor.&lt;br /&gt;
Added: bat files to make it easier for Windows users to regenerate the Lua bindings an&lt;br /&gt;
d tolua++cegui.&lt;br /&gt;
Added: ImageCodec support to the OpenGL renderer. This allows users to easily write a &lt;br /&gt;
custom image loader. TGA, [[SILLY]], DevIL, Corona and FreeImage codecs are supplied.&lt;br /&gt;
Added: const version of getDataPtr in RawDataContainer.&lt;br /&gt;
Added: premake scripts to generate MSVC solutions.&lt;br /&gt;
Added: ClippedContainer for situations where more specialized clipping is required.&lt;br /&gt;
&lt;br /&gt;
Modified: Placed the integrated TinyXML into its own namespace (CEGUITinyXML) to preve&lt;br /&gt;
nt clashes in projects using another copy of TinyXML. (Patch #1294002).&lt;br /&gt;
Modified: Changed EventSet to operate without needing events to be pre-added, much lik&lt;br /&gt;
e GlabalEventSet always did.&lt;br /&gt;
Modified: Removal of mass pre-specification of events for all classes using events.&lt;br /&gt;
Modified: Cflags to add include dir for CEGUI in CEGUI.pc.in (allows use of &amp;lt;CEGUI/...&lt;br /&gt;
&amp;gt; form of include statement).&lt;br /&gt;
Modified: The &amp;quot;Lua and tolua++&amp;quot; module has been made a DLL on Windows machines.&lt;br /&gt;
Modified: Renamed System::setTooltip to System::setDefaultTooltip (Mantis #1Cool.&lt;br /&gt;
Modified: In the lua module, updated Window with casting helpers as member functions. &lt;br /&gt;
eg. w:toFrameWindow()&lt;br /&gt;
Modified: Removed the Static,StaticText and StaticImage from CEGUIBase and implemented&lt;br /&gt;
 them in FalagardBase instead.&lt;br /&gt;
Modified: Updated to tolua++ 1.0.92&lt;br /&gt;
Modified: Moved LuaFunctor into its own files&lt;br /&gt;
Modified: Reimplemented the &amp;quot;late binding&amp;quot; effect from the v04 Lua module. In v04 the &lt;br /&gt;
function is always looked up by name. In CVS HEAD the actual Lua function is reference&lt;br /&gt;
d, but now this will only occur the first time the event is triggered. This means that it's no longer necessary to have a function defined to subscribe it to an event. As l&lt;br /&gt;
ong as the function has been created before the event occurs everything will be good S&lt;br /&gt;
mile&lt;br /&gt;
Modified: Moved subscribeScriptedEvent into ScriptModule to allow more customized scri&lt;br /&gt;
pt subscription functionality.&lt;br /&gt;
Modified: Made the layout XML handler use subscribeScriptedEvent for Event tags instea&lt;br /&gt;
d of subscribeEvent with ScriptFunctor&lt;br /&gt;
Modified: Removal of &amp;quot;tolua_outside&amp;quot; stuff that was no longer needed.&lt;br /&gt;
Modified: Moved the declaration/definition of base window factories into its own files&lt;br /&gt;
.&lt;br /&gt;
Modified: Removal of WidgetSets folder, and its contents.&lt;br /&gt;
Modified: Removed unnecessary getSingleton and getSingletonPtr from manager classes.&lt;br /&gt;
Modified: The script module now throws ScriptException.&lt;br /&gt;
Modified: Removal of TextItem as falagard now handles that exclusively.&lt;br /&gt;
Modified: Moved all rendering member functions out of base classes an into [[Falagard]] re&lt;br /&gt;
ndering classes.&lt;br /&gt;
Modified: Removal of virtually all rendering and layout related Window properties from&lt;br /&gt;
 CEGUIBase - a few are moved to FalagardBase, the rest must be implemented via XML.&lt;br /&gt;
Modified: Removal of TaharezLook and WindowsLook modules from the system.&lt;br /&gt;
Modified: Removal of MetricsMode system, and all non-unified interface and properties &lt;br /&gt;
from Window (and related fixes to other classes).&lt;br /&gt;
Modified: Elimination of RenderableElement and derived classes.&lt;br /&gt;
Modified: Moved to a C preprocessor macro system for widget module creation.&lt;br /&gt;
Modified: Removal of abstract createXXX methods from widget base classes - the looknfe&lt;br /&gt;
el system now auto-creates these widgets when specified within the XML.&lt;br /&gt;
Modified: Updated to TinyXML 2.4.3 in order to allow CDATA section in XML text node (v&lt;br /&gt;
erbatim text)&lt;br /&gt;
Modified: GUILayout handler in order to support long value in properties.&lt;br /&gt;
Modified: Made the XML writing system aware of falagard when determining property defa&lt;br /&gt;
ult values.&lt;br /&gt;
Modified: Switched PropertyHelper to use std::ostringstream as the output is much nice&lt;br /&gt;
r. Changed property default values to the new format where needed.&lt;br /&gt;
Modified: Better error reporting for dynamic module load failures.&lt;br /&gt;
Modified: Switched to using external pcre library. Removed embedded copy of pcre.&lt;br /&gt;
Modified: Switched system to use dynamic libs for XML parsers with programatically con&lt;br /&gt;
figurable default.&lt;br /&gt;
Modified: FactoryModule to use DynamicModule.&lt;br /&gt;
Modified: Resolved issue with unneeded member qualification (Patch #1454773).&lt;br /&gt;
Modified: Made String::ptr a public member.&lt;br /&gt;
Modified: The bundled tolua++cegui binding generator will now generate a lua_CEGUI.cpp&lt;br /&gt;
 that compiles out-of-the-box on Windows&lt;br /&gt;
Modified: Removed the DataContainer template class, and made it into just RawDataConta&lt;br /&gt;
iner, non templated.&lt;br /&gt;
Modified: Optimized FalagardMultiLineEditbox to only cache visible lines when renderin&lt;br /&gt;
g.&lt;br /&gt;
Modified: Optimized ButtonBase and MenuItem updateInternalState. Mantis #44&lt;br /&gt;
Modified: Moved the renderers to their own folder named RendererModules.&lt;br /&gt;
Modified: Optimized picking and rendering by caching screen space rectangles.&lt;br /&gt;
Modified: Applied zap's rewrite of the Font system. Patch #1508321&lt;br /&gt;
Modified: Texture::loadFromMemory now takes a Texture::PixelFormat parameter. RGB and &lt;br /&gt;
RGBA are currently required. Fixes Patch #1455523 as well. 3rd party renderer modules &lt;br /&gt;
needs to be updated.&lt;br /&gt;
&lt;br /&gt;
Bug fix: OpenGLRenderer was producing errors and not cleaning up state changes properl&lt;br /&gt;
y (thanx muhkuh25)&lt;br /&gt;
Bug fix: OpenGLRenderer was broken when compiled for x86-64.&lt;br /&gt;
Bug Fix: ListboxItem::getOwnerWindow should be const&lt;br /&gt;
Bug Fix: ListboxItem::getOwnerWindow should not take a Window* argument.&lt;br /&gt;
Bug Fix: Scheme::resourcesLoaded was always returning true.&lt;br /&gt;
Bug Fix: PropertyHelper::stringToImage was not handling empty string case.&lt;br /&gt;
Bug Fix: Editbox::onCharacter was setting the event as handled even if nothing was don&lt;br /&gt;
e.&lt;br /&gt;
Bug Fix: Added shift/ctrl/alt support to the OpenGL sample driver (injects LeftXXX)&lt;br /&gt;
Bug Fix: The command line renderer selector does no longer ask if there is only one re&lt;br /&gt;
nderer available.&lt;br /&gt;
Bug Fix: Fixed window resizing for the OpenGL Sample driver.&lt;br /&gt;
Bug Fix: fixed const correctness for &amp;quot;String::utf8_stream_len&amp;quot; SF patch #1367423&lt;br /&gt;
Bug Fix: Detect &amp;quot;window-&amp;gt;addChildWindow(window);&amp;quot; and do nothing instead of actually t&lt;br /&gt;
rying.&lt;br /&gt;
Bug Fix: Added missing performChildWindowLayout to Scrollbar::onScrollConfigChanged to&lt;br /&gt;
 allow making a look'n'feel with a thumb that sizes to indicate document size.&lt;br /&gt;
Bug fix: const correctness for Window::getLookNFeel&lt;br /&gt;
Bug fix: FrameWindow, isTitlebarEnabled and isCloseButtonEnabled were return the oppos&lt;br /&gt;
ite of what they should.&lt;br /&gt;
Bug Fix: FrameWindow should do relayout if text changes to allow using a fontdim in th&lt;br /&gt;
e titlebar dimensions.&lt;br /&gt;
Bug Fix: Changing the default mouse cursor in the System object will now update the cu&lt;br /&gt;
rsor immediately where appropriate. (Ticket #17).&lt;br /&gt;
Bug Fix: Fixed case in StaticText where default text area was always used if frame was&lt;br /&gt;
 disabled.&lt;br /&gt;
Bug Fix: Image offsets were'nt being properly handled for the corners in FrameComponen&lt;br /&gt;
t.&lt;br /&gt;
Bug Fix: MultiColumnList would always use item string when sorting, instead of vitual &lt;br /&gt;
operators on users custom items.&lt;br /&gt;
Bug Fix: System::getWindowContainingMouse would return incorrect Window if called from&lt;br /&gt;
 within Window::EventMouseLeaves handlers.&lt;br /&gt;
Bug Fix: Order of static data creation in C++ is unspecified; we can't have globally d&lt;br /&gt;
efined static data that relies on other such static data within the same module.&lt;br /&gt;
Bug Fix: Falagard/ProgressBar was broken when vertical or reversed-horizontal.&lt;br /&gt;
Bug Fix: Corruption of window registry when rename failed (Patch #1450623).&lt;br /&gt;
Bug Fix: Initialisation issue with TabControl trying to access child widgets before th&lt;br /&gt;
ey are created. (Patch #1391727).&lt;br /&gt;
Buf Fix: CEGUI::Window::setModalState(true) removes the modal state from a modal windo&lt;br /&gt;
w. Mantis #42&lt;br /&gt;
Bug Fix: MultiColumnList getNextSelection bug. Mantis #47&lt;br /&gt;
Bug Fix: System subscriber to renderer event but does not unsubscribe on destruction. &lt;br /&gt;
Mantis #48&lt;br /&gt;
Bug Fix: OpenGL and DirectX9 renderers were not handling error correctly when creating&lt;br /&gt;
 textures.&lt;br /&gt;
Bug Fix: Bug in LuaScriptModule where executeScriptFile did not unload the file data b&lt;br /&gt;
uffer correctly in case of an exception (thanks gcarlton).&lt;br /&gt;
Bug Fix: A bug in ItemListBase::resetList_impl where calling resetList would crash (th&lt;br /&gt;
anks Turtle).&lt;br /&gt;
Bug Fix: Typo in TabPane::testClassName_impl (&amp;quot;Tabpane&amp;quot; instead of &amp;quot;TabPane&amp;quot;).&lt;br /&gt;
Bug Fix: Big Endian inconsistency in CEGUI::colour.&lt;br /&gt;
Bug Fix: CEGUI::Window was not detaching the tooltip during destruction. Mantis #38&lt;br /&gt;
Bug Fix: FrameWindow was consuming all LeftButton up events. Down events were affected&lt;br /&gt;
 as well, and now only consume if the event started drag sizing.&lt;br /&gt;
Bug Fix: DragContainer would overwrite any new position applied to the DragContainer d&lt;br /&gt;
uring the DragDropItemDropped event. Mantis #53&lt;br /&gt;
Bug Fix: The OpenGL sample driver could cause a stack overflow. Patch #1507826&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Porting Notes =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The 0.5.0 release of Crazy Eddie's GUI System is the first of what will likely be a series of releases containing breaking changes for client code and data files. We feel these breaking changes are required as we move closer to the 1.0 release of CEGUI, and also as the design and usage patterns for CEGUI change; the results are a generally more streamlined system as we move from one idiom to another, as opposed to becoming more and more bloated due to retaining vast amounts of code and kludges for backward compatibility reasons.&lt;br /&gt;
&lt;br /&gt;
This document is a general overview and guide to the breaking changes between the 0.4.x series of releases and the 0.5.0 release. As and when other breaking releases are made, additional documentation will be provided as necessary.&lt;br /&gt;
&lt;br /&gt;
== CELayoutUpgrader ==&lt;br /&gt;
&lt;br /&gt;
[[CELayoutUpgrader]] is a python script that can upgrade XML layout files to the Unified Coordinate System. It should help to ease the porting process.&lt;br /&gt;
&lt;br /&gt;
== Changes and Porting ==&lt;br /&gt;
This section is intended as a general overview of the breaking changes made. Blah, blah, blah.&lt;br /&gt;
&lt;br /&gt;
=== Code Changes ===&lt;br /&gt;
This sub-section details changes made to the CEGUI system code and API which will affect client code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== The new WindowRenderer system ====&lt;br /&gt;
One of the main issues with the previous widget module approach, was that it became exceptionally difficult to sub-class a widget type where some custom behavioural changes or additions were required. &lt;br /&gt;
 *** TODO ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CEGUI::System Constructor ====&lt;br /&gt;
The overloaded constructors for the main CEGUI::System object have been removed and replaced with a single, unified, constructor. Using the new constructor it is still possible to do all the things that used to be possible, while making the whole system construction process a little more uniform.&lt;br /&gt;
&lt;br /&gt;
The new constructor has the form:&lt;br /&gt;
 System(Renderer* renderer,&lt;br /&gt;
       ResourceProvider* resourceProvider = 0,&lt;br /&gt;
       XMLParser* xmlParser = 0,&lt;br /&gt;
       ScriptModule* scriptModule = 0,&lt;br /&gt;
       const String&amp;amp; configFile = &amp;quot;&amp;quot;,&lt;br /&gt;
       const String&amp;amp; logFile = &amp;quot;CEGUI.log&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
As can be seen, the Renderer module is, of course, still mandatory, though you are free to provide all or none of the other optional arguments and passing in 0 where no object, or no custom object, is required.&lt;br /&gt;
&lt;br /&gt;
For the most basic uses of the system, where only the Renderer is passed in, no changes will be required. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== System::setTooltip changed to System::setDefaultTooltip ====&lt;br /&gt;
The member function&lt;br /&gt;
 System::setTooltip&lt;br /&gt;
has been renamed as&lt;br /&gt;
 System::setDefaultTooltip&lt;br /&gt;
this was a change for API consistency. Update your code to use the new name for this member.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Window MetricsMode removed ====&lt;br /&gt;
The concept of a singular 'MetricsMode' for a window is now obsolete and is replaced with the 'Unified' metrics system (which comprises of both a relative 'scale' value and an absolute 'offset' value).&lt;br /&gt;
&lt;br /&gt;
The class members, properties and all associated items affecting MetricsMode have been removed from the system and the use of the Unified metrics system is now mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Window Metrics and other conversion members removed ====&lt;br /&gt;
Member functions in the Window class that were concerned with converting values between the various metric modes have all been removed.&lt;br /&gt;
There may still be the need to perform some conversions of co-ordinates, so this functionality is now provided by the external utility class CEGUI::CoordConverter.&lt;br /&gt;
Window Size and Positioning&lt;br /&gt;
&lt;br /&gt;
Due to the removal of the MetricsMode concept, and the now mandatory use of 'Unified' co-ordinate values, the means by which you specify size and position is now by using the unified co-ordinate types: UDim, UVector2 and URect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=2px cellspacing=0&lt;br /&gt;
| style=&amp;quot;color: #ffffff; background-color: #ff5555; border: solid 1px #000000;&amp;quot; | '''The information in the following section has been updated again since RC1 was issued - early adopters will need to update their code again to use SVN trunk code and the upcoming RC2.'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* getXPosition, getWindowXPosition, getRelativeXPosition and getAbsoluteXPosition members are replaced with a single getXPosition member returning a UDim.&lt;br /&gt;
* getYPosition, getWindowYPosition, getRelativeYPosition and getAbsoluteYPosition members are replaced with a single getYPosition member returning a UDim.&lt;br /&gt;
* getPosition, getWindowPosition, getRelativePosition and getAbsolutePosition members are replaced with a single getPosition member returning a UVector2.&lt;br /&gt;
* getWidth, getWindowWidth, getRelativeWidth and getAbsoluteWidth members are replaced with a single getWidth member returning a Udim.&lt;br /&gt;
* getHeight, getWindowHeight, getRelativeHeight and getAbsoluteHeight members are replaced with a single getHeight member returning a UDim.&lt;br /&gt;
* getSize, getWindowSize, getRelativeSize and getAbsoluteSize members are replaced with a single getSize member returning a UVector2&lt;br /&gt;
* getRect, getWindowArea, getRelativeRect and getAbsoluteRect members are replaced with a single getArea member returning a URect.&lt;br /&gt;
* getMaximumSize and getWindowMaxSize members are replaced with a single getMaxSize member returning a UVector2.&lt;br /&gt;
* getMinimumSize and getWindowMinSize members are replaced with a single getMinSize member returnung a UVector2.&lt;br /&gt;
&lt;br /&gt;
* setWidth and setWindowWidth members are replaced with a single setWidth member taking a UDim.&lt;br /&gt;
* setHeight and setWindowHeight members are replaced with a single setHeight member taking a UDim.&lt;br /&gt;
* setSize and setWindowSize members are replaced with a single setSize member taking a UVector2.&lt;br /&gt;
* setXPosition and setWindowXPosition members are replaced with a single setXPosition member taking a UDim.&lt;br /&gt;
* setYPosition and setWindowYPosition members are replaced with a single setYPosition member taking a UDim.&lt;br /&gt;
* setPosition and setWindowPosition members are replaced with a single setPosition member taking a UVector2.&lt;br /&gt;
* setAreaRect, setRect and setWindowArea members are replaced with setArea members accepting the following options:&lt;br /&gt;
** Four UDims; specifying x position, y position, width and height.&lt;br /&gt;
** Two UVector2s; specifying position and size.&lt;br /&gt;
** A single URect defining the area.&lt;br /&gt;
* setMaximumSize and setWindowMaxSize members are replaced with a single setMaxSize member taking a UVector2.&lt;br /&gt;
* setMinimumSize and setWindowMinSize members are replaced with a single setMinSize member taking a UVector2.&lt;br /&gt;
&lt;br /&gt;
==== Component Widget creation abstract members ====&lt;br /&gt;
If you have sub-classed any Window types in order to create a new “Widget Module”, part of your responsibility was to provide implementations for various abstract member functions whose job it was to create the various component widgets required by the container window. These members were typically named createXXX (for example, Combobox::createEditbox).&lt;br /&gt;
&lt;br /&gt;
These abstract member functions and the internal calls to them have all been removed from the system. The component widgets are now specified within the looknfeel xml files are are automatically created by the [[Falagard]] looknfeel system as and when required.&lt;br /&gt;
You should remove any code that creates these component widgets and add appropriate &amp;lt;Child&amp;gt; tags to your looknfeel xml files instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Component Widget member fields ====&lt;br /&gt;
If you had sub-classed any of the Window types, either to provide some modified behaviour or perhaps for a “Widget Module” as part of creating a custom look, you would previously have had access to some member variables that held pointers to component widgets of the more complicated widget types (for example, the Scrollbar widget would have held pointers to the two PushButton widgets and the Thumb widget that it was composed of). These members have now been removed and replaced with 'getter' member functions; this is important because in the future the actual Window objects used for these component parts may not be valid for the entire life of the containing Window. That is, the component Windows may get destroyed and re-created, thus invalidating any cached pointers.&lt;br /&gt;
&lt;br /&gt;
The old member variables and the getter function that replaces them are listed here:&lt;br /&gt;
 *** TODO ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RenderableElement, RenderableImage and RenderableFrame classes ====&lt;br /&gt;
These classes have all been removed from the system entirely. Everything that these classes achieved with regards to rendering for window and widget types can now be done via the [[Falagard]] looknfeel system.&lt;br /&gt;
&lt;br /&gt;
For window based rendering, you should remove your use of Renderable* classes in favour of ImageryComponent and FrameComponent elements in your looknfeel xml files.&lt;br /&gt;
If you were using the Renderable* classes to perform rendering outside of the window rendering systems, you will now need to find alternative, custom, means to do this. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Static, StaticImage and StaticText classes ====&lt;br /&gt;
These classes are now removed from the base system and have been implemented as WindowRenderer classes. Generally, your interface to these widget types should now use a simple default window and the properties system.&lt;br /&gt;
&lt;br /&gt;
The look'n'feel spec for these two widgets have changed as well.&lt;br /&gt;
&lt;br /&gt;
StaticImage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        The LookNFeel should provide the following:&lt;br /&gt;
&lt;br /&gt;
        States:&lt;br /&gt;
            - Enabled                     - basic rendering for enabled state.&lt;br /&gt;
            - Disabled                    - basic rendering for disabled state.&lt;br /&gt;
            - EnabledFrame                - frame rendering for enabled state&lt;br /&gt;
            - DisabledFrame               - frame rendering for disabled state.&lt;br /&gt;
            - WithFrameEnabledBackground  - backdrop rendering for enabled state with frame enabled.&lt;br /&gt;
            - WithFrameDisabledBackground - backdrop rendering for disabled state with frame enabled.&lt;br /&gt;
            - NoFrameEnabledBackground    - backdrop rendering for enabled state with frame disabled.&lt;br /&gt;
            - NoFrameDisabledBackground   - backdrop rendering for disabled state with frame disabled.&lt;br /&gt;
            - WithFrameImage              - image rendering when frame is enabled&lt;br /&gt;
            - NoFrameImage                - image rendering when frame is disabled (defaults to WithFrameImage if not present)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
StaticText:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        The LookNFeel should provide the following:&lt;br /&gt;
&lt;br /&gt;
        States:&lt;br /&gt;
            - Enabled                     - basic rendering for enabled state.&lt;br /&gt;
            - Disabled                    - basic rendering for disabled state.&lt;br /&gt;
            - EnabledFrame                - frame rendering for enabled state&lt;br /&gt;
            - DisabledFrame               - frame rendering for disabled state.&lt;br /&gt;
            - WithFrameEnabledBackground  - backdrop rendering for enabled state with frame enabled.&lt;br /&gt;
            - WithFrameDisabledBackground - backdrop rendering for disabled state with frame enabled.&lt;br /&gt;
            - NoFrameEnabledBackground    - backdrop rendering for enabled state with frame disabled.&lt;br /&gt;
            - NoFrameDisabledBackground   - backdrop rendering for disabled state with frame disabled.&lt;br /&gt;
&lt;br /&gt;
        Named Areas (missing areas will default to 'WithFrameTextRenderArea'):&lt;br /&gt;
            WithFrameTextRenderArea&lt;br /&gt;
            WithFrameTextRenderAreaHScroll&lt;br /&gt;
            WithFrameTextRenderAreaVScroll&lt;br /&gt;
            WithFrameTextRenderAreaHVScroll&lt;br /&gt;
            NoFrameTextRenderArea&lt;br /&gt;
            NoFrameTextRenderAreaHScroll&lt;br /&gt;
            NoFrameTextRenderAreaVScroll&lt;br /&gt;
            NoFrameTextRenderAreaHVScroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dynamic addition of Events to Windows and other EventSet based objects ====&lt;br /&gt;
It used to be that all available Event objects would be pre-added to an EventSet when it was constructed. When an Event was accessed which had not been added to the EventSet an appropriate exception was thrown.&lt;br /&gt;
&lt;br /&gt;
This behaviour has now changed. Events are only added to an EventSet when a handler for that event is first subscribed. A side effect of this is that EventSet does now not throw exceptions, either when firing a non-existing Event (now reclassified as simply an event which has no subscribers), or when subscribing to an Event that does not yet exist, since the Event is now automatically created and added to the EventSet.&lt;br /&gt;
&lt;br /&gt;
If your code currently relies on exceptions being thrown by the events system, you will need to change this to a more pro-active approach (by manually checking if an event exists yet), instead of reactive (catching exceptions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== TinyXML moved to CEGUITinyXML namespace ====&lt;br /&gt;
If you were for some reason using our integrated copy of TinyXML directly in your application, we have moved this module into the namespace 'CEGUITinyXML'. This was done to avoid clashes and conflicts where the client contained its own copy of TinyXML.&lt;br /&gt;
&lt;br /&gt;
To continue to directly use the integrated TinyXML, just add the namespace qualifier where appropriate.&lt;br /&gt;
&lt;br /&gt;
If you are just using the TinyXML based implementation of CEGUI::XMLParser, you do not need to change anything.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data File Changes ===&lt;br /&gt;
This sub-section details changes that will affect the xml data files used with CEGUI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Updated XSD files for Xerces ====&lt;br /&gt;
Even the most rudimentary changes to the xml formats we use mean that if you're using the Xerces-C, or other, validating XML parser, then you will need to update you projects to use the new .xsd files. These are collected together for convenience in the XMLRefSchema subdirectory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Falagard]] Additions ===&lt;br /&gt;
From lack of a better place to put this I'll list the additions that have been made to [[Falagard]] here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PropertyLinkDefinition'''&lt;br /&gt;
New element that will create a property that is a link to another property of a child window.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* type (type, optional and not currently used for anything)&lt;br /&gt;
* name (name of the property link)&lt;br /&gt;
* widget (name suffix of the child widget to link to)&lt;br /&gt;
* targetProperty (the target property to link to. Optional, will default to ''name'' if not given)&lt;br /&gt;
* initialValue (starting value for the property. Optional, will default to empty)&lt;br /&gt;
* layoutOnWrite (will make the widget redo the child layout when the property is written. Optional, defaults to ''false'')&lt;br /&gt;
* redrawOnWrite (will make the widget redraw when the property is written. Optional, default to ''false'')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''controlProperty'''&lt;br /&gt;
&lt;br /&gt;
New attribute added to ''Section''. Value is the name of a property, and if specified the Section will only render when the property has a value of ''True''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TextComponent'''&lt;br /&gt;
&lt;br /&gt;
Two new sub-elements are now valid for ''TextComponent''.&lt;br /&gt;
&lt;br /&gt;
''TextProperty'', and ''FontProperty''. Must be specified in that order after the (optional) ''Text'' element.&lt;br /&gt;
Both have one required attribute ''name'' which takes the name of a property which will contain the text to draw, or the name of the font to use for rendering.&lt;br /&gt;
&lt;br /&gt;
In case these new elements are used along with the ''Text'' element, the string and font specified in the ''Text'' element will be used as defaults if the ''TextProperty'' or ''FontProperty'' evaluates to empty strings.&lt;br /&gt;
&lt;br /&gt;
=== Font system changes ===&lt;br /&gt;
&lt;br /&gt;
* There's no notion of '''StartCodepoint''' and '''EndCodepoint''', or '''glyph set''' anymore. Font render glyphs on the fly as required: if you ask to display &amp;quot;A&amp;quot; it renders a small subset of glyphs (256 codepoints surrounding the missing glyph usually, but can render extra glyphs out of the range to conserve texture space).&lt;br /&gt;
* The Font class is now an abstract class and there are two implementations: FreeTypeFont and PixmapFont.&lt;br /&gt;
** FreeTypeFont uses the FreeType library and can display TTF, FON, PCF/BDF, PS fonts (and possibly others). I have ensured that bitmap fonts work, since bitmap fonts should be handled a little different from outline fonts.&lt;br /&gt;
** PixmapFont uses an Imageset with the glyphs and can display colorful glyphs (which FreeType cannot due to its grayscale nature). However, it's more primitive, but can be useful for things like logos, loading messages etc.&lt;br /&gt;
* The Font class is now a PropertySet, so specialized classes derived from Font can add their own properties (such as PointSize for FreeType fonts which don't have sense for Imageset-based fonts). Here's a list of available properties:&lt;br /&gt;
** All font classes: Name, FileName, NativeRes, ResourceGroup, AutoScaled&lt;br /&gt;
** FreeTypeFont: PointSize, Antialiased&lt;br /&gt;
** PixmapFont: Imageset, Mapping&lt;br /&gt;
* Fixed a number of (vertical) font positioning errors: the font wasn't properly centered within its LineAdvance range.&lt;br /&gt;
* Added several new fonts: DejaVuSans (taken from the DejaVu project, http://dejavu.sf.net), fkp (a X11 bitmap font from http://artwizaleczapka.sf.net), FairChar (a Imageset-based font which I made from some old GIF file I found on my HD :-).&lt;br /&gt;
* A FontDemo sample which shows several properties of the new Font class.&lt;br /&gt;
&lt;br /&gt;
The above changes resulted in some slight changes to the format of the XML .font files:&lt;br /&gt;
&lt;br /&gt;
* GlyphSet, GlyphRange, Glyph sections of the Font are gone&lt;br /&gt;
* The possible values of the Type attribute are now:&lt;br /&gt;
** FreeType (instead of Dynamic)&lt;br /&gt;
** Pixmap (instead of Static)&lt;br /&gt;
* The FirstCodepoint and LastCodepoint attributes of the Font section were removed&lt;br /&gt;
&lt;br /&gt;
After you change your .font files as mentioned above, they should work without problems.&lt;br /&gt;
&lt;br /&gt;
=== Iterator Changes ===&lt;br /&gt;
* EventSet::EventIterator is changed to EventSet::Iterator&lt;br /&gt;
* PropertySet::PropertyIterator is changed to PropertySet::Iterator&lt;br /&gt;
&lt;br /&gt;
=== Convert Point to UVector2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::Point(_x, _y)&amp;lt;/source&amp;gt;&lt;br /&gt;
becomes&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::UVector2(CEGUI::UDim(_x,0), CEGUI::UDim(_y,0))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To be continued...&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=News_Archive&amp;diff=4245</id>
		<title>News Archive</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=News_Archive&amp;diff=4245"/>
				<updated>2011-03-04T14:34:38Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: SILLY interlinks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== CEGUI Version 0.7.5 released! by ''' [[User:Crazyeddie|Crazyeddie]] 20th November 2010 ===&lt;br /&gt;
Read all the details in the [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=6&amp;amp;t=5280 official announcement].&lt;br /&gt;
&lt;br /&gt;
=== CEGUI Version 0.7.4 released! by ''' [[User:Crazyeddie|Crazyeddie]] 11th October 2010 ===&lt;br /&gt;
Emergency fix for 0.7.3 release! [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=6&amp;amp;t=5182 official announcement].&lt;br /&gt;
&lt;br /&gt;
=== CEGUI Version 0.7.3 released! by ''' [[User:Crazyeddie|Crazyeddie]] 8th October 2010 ===&lt;br /&gt;
Read all the details in the [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=6&amp;amp;t=5182 official announcement].&lt;br /&gt;
&lt;br /&gt;
=== CEGUI Version 0.7.2 released! by ''' [[User:Crazyeddie|Crazyeddie]] 29th August 2010 ===&lt;br /&gt;
Read all the details in the [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=6&amp;amp;t=5096 official announcement].&lt;br /&gt;
&lt;br /&gt;
=== CELayoutEditor 0.7.1 released for Windows! by ''' [[User:scriptkid|scriptkid]] 1th January 2010 ===&lt;br /&gt;
See the [[CELayoutEditor Downloads 0.7.1]] page for the link.&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Pirate Princess&amp;quot; (game) released! by ''' [[User:scriptkid|scriptkid]] 25th November 2009 ===&lt;br /&gt;
Pirate Princess is a semi-casual word game based adventure, just finished and on sale. Of course it uses CEGUI (a lot!). Check out the website:&lt;br /&gt;
[http://www.moonpod.com/English/about_pirateprincess.php Pirate Princess - A word game based adventure!].&lt;br /&gt;
&lt;br /&gt;
=== CEGUI 0.7.1 is Released! by ''' [[User:scriptkid|scriptkid]] 26th October 2009 ===&lt;br /&gt;
See the [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=6&amp;amp;t=4443 details here]&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Cube Combat&amp;quot; (game) released! by ''' [[User:scriptkid|scriptkid]] 20th October 2009 ===&lt;br /&gt;
Cube Combat is a bomberman remake game, which uses CEGUI. It looks &amp;amp; feels nice and polished. Check out the website:&lt;br /&gt;
[http://www.cubecombat.net Cube Combat - A 3D bomberman remake!].&lt;br /&gt;
&lt;br /&gt;
=== CEGUI 0.7.0 is Released! by ''' [[User:CrazyEddie|CrazyEddie]] 20th September 2009 ===&lt;br /&gt;
See the [http://www.cegui.org.uk/phpBB2/viewtopic.php?f=6&amp;amp;t=4340 details here]&lt;br /&gt;
&lt;br /&gt;
=== CEGUI 0.6.3 release of the Layout Editor! by ''' [[User:scriptkid|scriptkid]] 9th June 2009 ===&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Snakeworlds&amp;quot; (game) released! by ''' [[User:scriptkid|scriptkid]] 3rd April 2009 ===&lt;br /&gt;
Snakeworlds is a snake remake game, which uses CEGUI. Check out the website:&lt;br /&gt;
[http://www.snakeworldsgame.com Snakeworlds - A spherical snake game!].&lt;br /&gt;
&lt;br /&gt;
=== CEGUI 0.6.2 Released! by ''' [[User:CrazyEddie|CrazyEddie]] 3rd December 2008 ===&lt;br /&gt;
&lt;br /&gt;
Read the [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=3712/ buzz]&lt;br /&gt;
&lt;br /&gt;
=== New 0.6.x in-progress LayoutEditor! by ''' [[User:scriptkid|scriptkid]] 2th August 2008 ===&lt;br /&gt;
&lt;br /&gt;
See the [[CELayoutEditor Downloads 0.6.x]] page for the link (bottom of the page!).&lt;br /&gt;
&lt;br /&gt;
=== New 0.6.x in-progress LayoutEditor! by ''' [[User:scriptkid|scriptkid]] 7th May 2008 ===&lt;br /&gt;
&lt;br /&gt;
See the [[CELayoutEditor Downloads 0.6.0]] page for the link (bottom of the page!).&lt;br /&gt;
&lt;br /&gt;
=== New 0.6.0 Release of CEGUI and tools! by ''' The CEGUI Development Team 27th March 2008 ===&lt;br /&gt;
The Crazy Eddie's GUI System project (crayzedsgui on sourceforge.net) is pleased to announce the release of version 0.6.0 of the Crazy Eddie's GUI System library and associated CELayoutEditor and CEImagesetEditor tools.&lt;br /&gt;
&lt;br /&gt;
Founded in 2003, Crazy Eddie's GUI System has consistently been one of the favourite choices for the serious game or multimedia developer needing a mature, stable and flexible rendered GUI solution. The library is open source, highly configurable and offers virtually unrivalled skinning opportunities via its &amp;quot;Falagard&amp;quot; XML skinning system. Crazy Eddie's GUI System library is released under the MIT license, thus offering the ultimate flexibility for all usage scenarios.&lt;br /&gt;
&lt;br /&gt;
The 0.6.0 release comes some 16 months after the previous release, and marks the official return of Paul D Turner (CrazyEddie) as project leader and as a permanent member on the development team.&lt;br /&gt;
&lt;br /&gt;
For more information about Crazy Eddie's GUI System see the project website at http://www.cegui.org.uk. Support requests for the library and associated tools, in the first instance, should be directed at the Crazy Eddie's GUI System project forums at http://forums.cegui.org.uk.&lt;br /&gt;
&lt;br /&gt;
You can get the files at the [[Downloads|CEGUI Downloads page]].&lt;br /&gt;
&lt;br /&gt;
See also this forum thread: http://www.cegui.org.uk/phpBB2/viewtopic.php?p=13973&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New MSVC++ 9 binary packages for CEGUI and [[SILLY]] by ''' [[User:CrazyEddie|CrazyEddie]] 3rd February 2008 ===&lt;br /&gt;
We have released binary dependency packages and pre-built SDK packages for both [[SILLY]] 0.1.0 and CEGUI 0.5.0b for use with Microsoft's Visual C++ 9 (2008 edition) compiler.&lt;br /&gt;
&lt;br /&gt;
See the [[Downloads]] page and the announcement on the [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2965 forums] for additional information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New CELayoutEditor SVN trunk update by ''' [[User:fjeronimo|fjeronimo]] 18th December 2007 ===&lt;br /&gt;
A new update that adds new features to the property grid, improves exception handling, adds version information and more misc stuff has been committed to the CELayoutEditor SVN trunk.&lt;br /&gt;
&lt;br /&gt;
More details can be found in the following [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2825/ forum entry].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New CEImagesetEditor SVN trunk update by ''' [[User:fjeronimo|fjeronimo]] 10th December 2007 ===&lt;br /&gt;
A new update that adds VS2003 &amp;amp; VS2005 solutions and modifies configuration settings has been &lt;br /&gt;
committed to the CEImagesetEditor SVN trunk.&lt;br /&gt;
&lt;br /&gt;
More details can be found in the following [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2822/ forum entry].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New CELayoutEditor SVN trunk update by ''' [[User:fjeronimo|fjeronimo]] 06th December 2007 ===&lt;br /&gt;
A new update that adds Vectored Exception Handling (VEH) support, stack trace info to all thrown exceptions and&lt;br /&gt;
other misc stuff has been committed to the CELayoutEditor SVN trunk.&lt;br /&gt;
&lt;br /&gt;
More details can be found in the following [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2821/ forum entry].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New Widget: GroupBox ''' [[User:Scriptkid|Scriptkid]] 02th December 2007 ===&lt;br /&gt;
A new update adds Levia's GroupBox to the trunk. Thanks to Levia!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New CEGUI SVN trunk update by ''' [[User:fjeronimo|fjeronimo]] 30th November 2007 ===&lt;br /&gt;
A new update that adds RTTI info to debug builds and performs some logger modifications has been committed to the CEGUI SVN trunk.&lt;br /&gt;
&lt;br /&gt;
More details can be found in the following [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2816/ forum entry].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New CELayoutEditor SVN trunk update by ''' [[User:fjeronimo|fjeronimo]] 22th November 2007 ===&lt;br /&gt;
A new update that includes important bug fixes and internal changes that increase performance and code quality has been committed to the CELayoutEditor SVN trunk.&lt;br /&gt;
&lt;br /&gt;
More details can be found in the following [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2811/ forum entry].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New CEGUI SVN trunk update by ''' [[User:fjeronimo|fjeronimo]] 10th November 2007 ===&lt;br /&gt;
A new update that adds type, file name and line number to all thrown exceptions has been committed to the CEGUI SVN trunk.&lt;br /&gt;
&lt;br /&gt;
More details can be found in the following [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=2799/ forum entry].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== New developments by ''' [[User:Scriptkid|Scriptkid]] 06th November 2007 ===&lt;br /&gt;
Starting a few weeks ago, new development is being done on CEGUI, mainly on its tools. User [[User:fjeronimo|fjeronimo]] has made some valuable modifications already. Besides that, we are moving through the Mantis list and verifying+fixing bugs. We will keep you up-to-date regarding these matters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Release of 0.5.0b source packages by [[User:CrazyEddie|CrazyEddie]] 28th November 2006 ===&lt;br /&gt;
We have issued new versions of the 0.5.0 source packages - the previous ones were missing the files for the Microsoft Direct3D based renderer modules, the packages contain no other changes Thanks go to dmail for raising this issue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Release of 0.5.0b binary packages for Win32 by [[User:CrazyEddie|CrazyEddie]] 14th November 2006 ===&lt;br /&gt;
The Win32 binary dependency and SDK packages released on the 6th contained an inconsistency related to the [[SILLY]] library. Today I have issued a new set of binary packages which have been fixed - the new version is known as 0.5.0b, and contains no other changes. Many thanks to forum member vasmann for alerting me to the issue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Release of 0.5.0 stable by [[User:CrazyEddie|CrazyEddie]] 6th November 2006 ===&lt;br /&gt;
It has been almost a year in the making, but it is finally here! The CEGUI development team is immensely proud to announce the release of Crazy Eddie's GUI System 0.5.0 - the first stable release of code in the 0.5.x series.&lt;br /&gt;
&lt;br /&gt;
There are pretty vast changes in this release from the previous stable (0.4.1) - many of these changes are breaking, so please agian review [[Changes and Porting Tips for 0.5.0|Release Notes 0.5.X]] to see details of most of these changes.&lt;br /&gt;
&lt;br /&gt;
This release consists of various files that you may need, depending on your usage of the system. We are providing source packages, documentation packages, dependency packages, and binary SDK packages (for VC7.1 and VC8).&lt;br /&gt;
&lt;br /&gt;
To coincide with this release, we are also happy to announce a stable 0.1.0 release of Simple Image Loading LibrarY (SILLY), and the 0.5.0 release of the CELayoutEditor. Please see the [[Downloads|downloads page]] for full details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CEGUI 0.5.0 Release Candidate 2 by [[User:Dalfy|Dalfy]] 13 august 2006 ===&lt;br /&gt;
We are pleased to announce the second release candidate of the 0.5 branches of CEGUI. There has been a lot of changes between 0.4.1 and 0.5.0. They are listed in [[Changes and Porting Tips for 0.5.0|Release Notes 0.5.X]]. Please have a try at it and help us get a final release soon. Check the download page. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== CEGUI 0.5.0 Release Candidate 1 by [[User:Dalfy|Dalfy]] 20 June 2006 ===&lt;br /&gt;
We are pleased to announce the first release candidate of the 0.5 branches of CEGUI. There has been a lot of changes between 0.4.1 and 0.5.0. They are listed in [[Changes and Porting Tips for 0.5.0|Release Notes 0.5.X]]. Please have a try at it and help us get a final release soon by sending a lot of bug report in Mantis bug tracker. The download page for CEGUI-0.5.0-RC1 contains some typos but most link are already valid and mirrored on sourceforge. The link on the download page are going to be fixed during the day. &lt;br /&gt;
&lt;br /&gt;
For any question regarding this release you can use either the forum either irc. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Migration to Subversion by [[User:CrazyEddie|CrazyEddie]] 11:13, 3 April 2006 (PDT) ===&lt;br /&gt;
We have taken the decision to migrate the code for main CEGUI Mk-2 library and the CELayoutEditor tool from using the CVS revision control system, over to Subversion (SVN). If you're using the stable releases, this will not affect you at all. If you're using code out of some branch of CVS, then you will need to switch to SVN instead - we will not be maintaining both repositories. You will find that for general usage, CVS and SVN are similar, and have similar commands. For Windows users, we heartily recommend the use of [http://tortoisesvn.tigris.org/ TortoiseSVN].&lt;br /&gt;
&lt;br /&gt;
For full details of how to obtain the source code from the subversion repository, please see the page [[Obtaining the library source from Subversion|HOWTO: Obtain the library source from subversion]]&lt;br /&gt;
&lt;br /&gt;
All 'ceguiaddons' projects will continue to use CVS for revision control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Site Moved (again) ===&lt;br /&gt;
We have now moved the site back to the sourceforge servers, and made a few changes as to the way the site is handled in general - as you have probably noticed!&lt;br /&gt;
&lt;br /&gt;
Basically the main 'content' areas of the site are now entirely wiki based, and we also have a few other bits installed to handle certain requirements where the wiki is less suited to the task.&lt;br /&gt;
&lt;br /&gt;
The features of the new site are:&lt;br /&gt;
* Wiki based system for all main site content&lt;br /&gt;
* phpBB2 being used for community forums&lt;br /&gt;
* Coppermine based gallery&lt;br /&gt;
* Mantis for all bug and feature tracking&lt;br /&gt;
* Single, unified, log-in for all site areas&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Changes_and_Porting_Tips_for_0.5.0&amp;diff=4244</id>
		<title>Changes and Porting Tips for 0.5.0</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Changes_and_Porting_Tips_for_0.5.0&amp;diff=4244"/>
				<updated>2011-03-04T14:34:29Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: SILLY interlinks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}}&lt;br /&gt;
&lt;br /&gt;
Note that this is incomplete, work in progress, documentation.&lt;br /&gt;
&lt;br /&gt;
= Release =&lt;br /&gt;
&lt;br /&gt;
* 0.5.0 stable Released on November the 6th 2006: [[CEGUI Downloads 0.5.0|goto download page]]&lt;br /&gt;
* 0.5.0 RC1 Released on June the 20th 2006: [[Downloads 0.5.0-RC1|goto download page]]&lt;br /&gt;
* 0.5.0 RC2 Released on August the 13th 2006: [[Downloads 0.5.0-RC2|goto download page]]&lt;br /&gt;
&lt;br /&gt;
= ChangeLog =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Release 0.5.0 (Final)&lt;br /&gt;
=====================&lt;br /&gt;
Added: TaharezLook was missing ItemListbox and ListboxItem windows &amp;amp; skin&lt;br /&gt;
definitions.&lt;br /&gt;
Added: Partial CEGUI support for MingW. It is now possible to build CEGUI under&lt;br /&gt;
mingw with support for OpenGL renderer. This approach is going to be generalized&lt;br /&gt;
later to the other renderer and wiki page explaining the process will follows.&lt;br /&gt;
Added: Missing functions in WindowFactoryManager Lua bindings. Incomplete&lt;br /&gt;
FalagardWindowMapping binding as well.&lt;br /&gt;
Added: Lua binding for OutStream: FileStream (minimal std::ofstream).&lt;br /&gt;
Added: XML writing function in Lua bindings.&lt;br /&gt;
Added: --enable-debug in configure script instead of using CPPFLAGS=-DDEBUG&lt;br /&gt;
./configure ...&lt;br /&gt;
Added: premake files for Minesweeper sample and minor fixes to make it run in&lt;br /&gt;
windows.&lt;br /&gt;
Added: the minesweeper demo&lt;br /&gt;
Added: missing doxyfile in order to be in make dist&lt;br /&gt;
Added: ScrollablePane sample&lt;br /&gt;
&lt;br /&gt;
Removed: Empty Font 'implData' header files we no longer use.&lt;br /&gt;
Removed: [[Falagard]] skinning manual is now a part of the CEGUI manuals&lt;br /&gt;
sub-project, so is no longer included here as a pdf.&lt;br /&gt;
&lt;br /&gt;
Modified: Changed Demo7 to use the layout XML file instead of hard-coded window&lt;br /&gt;
creation.&lt;br /&gt;
Modified: Demo7Window.layout now uses the new ItemListbox, with items defined&lt;br /&gt;
within the layout, as the Listbox as opposed to the old style list with&lt;br /&gt;
hard-coded items.&lt;br /&gt;
Modified: Win32CEGuiRendererSelector:&lt;br /&gt;
- It is now possible to navigate to the Combobox via keyboard.&lt;br /&gt;
- First available renderer is pre-selected into the dialog.&lt;br /&gt;
- With a single renderer available, it is auto-selected and dialog is not shown.&lt;br /&gt;
Modified: Changed compile order under autotools so CEGUIBase is made before&lt;br /&gt;
things that use it - related to forthcoming cross-compile support.&lt;br /&gt;
Modified Added some missing bits and a whole load of other stuff to 'make dist'&lt;br /&gt;
to ease a more unified approach to creating packages for the various platforms.&lt;br /&gt;
Modified: Renamed tolua++bin/remake_pkg..bat to remove extra period&lt;br /&gt;
Modified: Changed Russian text in FontDemo sample - the old text apparently&lt;br /&gt;
potentially offensive. Thanks to 'Sanya' for the updated text.&lt;br /&gt;
Modified: The RefCounted template now has the CEGUIEXPORT macro as it avoids&lt;br /&gt;
warnings in client code when using MSVC.&lt;br /&gt;
Modified: Promote Expat to be the second prefered parser under linux in order to&lt;br /&gt;
act the same under linux and Win32. Note that the prefered parser is still&lt;br /&gt;
Xerces. The parser order is now the following : Xerces, Expat, Libxml, TinyXML.&lt;br /&gt;
Modified: WidgetComponent had a nasty misspelling of 'Alignemnt'.&lt;br /&gt;
Modified: MSVC no longer uses CEGUIConfig.h and CEGUISamplesConfig.h for&lt;br /&gt;
anything&lt;br /&gt;
Modified: Premake scripts are now much more flexible.&lt;br /&gt;
&lt;br /&gt;
Coding Standards: Removed various occurrences of the NULL macro.&lt;br /&gt;
&lt;br /&gt;
Docs: Added note to docs for Spinner regarding the lame state of floating point&lt;br /&gt;
support.&lt;br /&gt;
&lt;br /&gt;
Bug Fix: ListHeader settings for sizing, moving, and clicking were not properly&lt;br /&gt;
set on newly created segments.&lt;br /&gt;
Bug Fix: Resolved issue where the algorithm that ensured font textures were&lt;br /&gt;
filled would actually end up trying to render every glyph within a font.&lt;br /&gt;
Bug Fix: ItemListBase::insertItem was not setting the ItemEntry::d_ownerList&lt;br /&gt;
member correctly.&lt;br /&gt;
Bug Fix: Added another 'special case' to Spinner::getValueFromText to support&lt;br /&gt;
typing an initial decimal point.&lt;br /&gt;
Bug Fix: Sometimes compound widgets did not get their components layed out&lt;br /&gt;
properly when adding the widget to its parent.&lt;br /&gt;
Bug Fix: The way in which properties would set a window to use the DefaultFont&lt;br /&gt;
was incorrect; it explicitly set it to the name of the current default, as&lt;br /&gt;
opposed to a 'floating default'.&lt;br /&gt;
Bug Fix: FontDim did not work correctly since re-calculation of the layout was&lt;br /&gt;
not triggered in response to the font being changed.  Added this code to&lt;br /&gt;
Window::onFontChanged - although more elegant / selective solutions might be&lt;br /&gt;
considered later on.&lt;br /&gt;
Bug Fix: Added code so that all windows using default font get notified of a&lt;br /&gt;
change in the default via the normal channel (Window::onFontChanged).&lt;br /&gt;
Bug Fix: There was an issue regarding auto-repeat of mouse button down events&lt;br /&gt;
not getting their state reset if the mouse button was released outside of the&lt;br /&gt;
window getting the auto-repeat events.&lt;br /&gt;
Bug Fix: CEGuiSample.cpp did not get all required includes with certain renderer&lt;br /&gt;
combinations.&lt;br /&gt;
Bug Fix: Range emplyed by FreeTypeFont::rasterize was exclusive of the start&lt;br /&gt;
element; first glyph of every page loaded was missed!&lt;br /&gt;
Bug Fix: CEGUI::Window did not properly clean-up a custom tooltip if it created&lt;br /&gt;
one.&lt;br /&gt;
Bug Fix: Calculation of number of glyph pages in Font::setMaxCodepoint was&lt;br /&gt;
incorrect.&lt;br /&gt;
Bug Fix: When the OpenGL renderer was disabled by ./configure, the [[SILLY]] codec&lt;br /&gt;
was still being built.&lt;br /&gt;
Bug Fix: When the OpenGL renderer was disabled by ./configure, the requirement&lt;br /&gt;
for a default ImageCodec was still enforced.&lt;br /&gt;
Bug Fix: case of included file in Win32CEGuiRendererSelector.cpp changed ready&lt;br /&gt;
to support cross-compiling in post 0.5.0 versions.&lt;br /&gt;
Bug Fix: Support was broken in the Samples framework for newer versions of Ogre.&lt;br /&gt;
Bug Fix: The cegui_reldim and cegui_absdim macros were missing the CEGUI&lt;br /&gt;
namespace qualifier.&lt;br /&gt;
Bug Fix: When a glyph failed to load in FreeTypeFont, although we logged the&lt;br /&gt;
error we did not work around the issue of the missing glyph image, so a seg&lt;br /&gt;
fault was generated upon attempted use of those missing images. This addresses&lt;br /&gt;
the issue by creating dummy images for missing font glyphs which use a zero&lt;br /&gt;
size. Mantis #0000125.&lt;br /&gt;
Bug Fix: RefCounted would call AddRef when the wrapped pointer and its counter&lt;br /&gt;
were null.&lt;br /&gt;
Bug Fix: Event::ScopedConnection would call members of BoundSlot using a&lt;br /&gt;
potentially null RefCounted pointer.&lt;br /&gt;
Bug Fix: In C++ a namespace does not have a semicolon after the closing brace.&lt;br /&gt;
Bug Fix: Nasty memory leak in DevIL image codec. thanx to mafm on IRC.&lt;br /&gt;
Bug Fix: fixed a small error in the comment of CEGUI_DECLARE_WINDOW_FACTORY&lt;br /&gt;
Bug Fix: Tab control did not require to hear about multi-clicks on the&lt;br /&gt;
TabControl scroll buttons. Patch from zap. Mantis #0000117.&lt;br /&gt;
Bug Fix: Issue with utf8 missing conversion in TinyXML and libXML&lt;br /&gt;
Bug Fix: Added missing public visibility specifier to ScopedConnection class&lt;br /&gt;
members.&lt;br /&gt;
Bug Fix: premake files were not enabling Xerces correctly in the samples.&lt;br /&gt;
Bug Fix: TabControlDemo layout split up. We dont allow multiple root windows in&lt;br /&gt;
a layout when using a validating XML parser.&lt;br /&gt;
Bug Fix: Falagard.xsd was missing new type attribute for PropertyDim.&lt;br /&gt;
Bug Fix: PropertyLinkDefinition was not writing XML properly (no base class&lt;br /&gt;
writing).&lt;br /&gt;
Bug Fix: Bugs in [[Falagard]] XML writing.&lt;br /&gt;
Bug Fix: Spinner would throw an exception when a lone minus sign was entered.&lt;br /&gt;
Mantis ticket #110.&lt;br /&gt;
Bug Fix: Input capture bug that broke Combobx - introduced by patch #82.&lt;br /&gt;
Bug Fix: ScrollablePane would cause exceptions on destruction. Mantis ticket&lt;br /&gt;
#83.&lt;br /&gt;
Bug Fix: a bug in the premake improvements where samples would not generate&lt;br /&gt;
properly.&lt;br /&gt;
Bug Fix: A number of CEGUI exceptions were being caught by value instead of&lt;br /&gt;
reference.&lt;br /&gt;
Bug Fix: OpenGL renderer now also disables texture coordinate generation.&lt;br /&gt;
Bug Fix: Irrlicht sample driver now quits on the escape key like the rest.&lt;br /&gt;
Bug Fix: Updates and fixes to resolve the NPOT texture source data issue (mantis&lt;br /&gt;
#45) in a relatively consistent way - at least for the 0.5.x releases.&lt;br /&gt;
&lt;br /&gt;
Release 0.5.0-RC2&lt;br /&gt;
=================&lt;br /&gt;
Added: single colour support to PropertyHelper::stringToColourRect&lt;br /&gt;
Added: missing support to Irrlicht renderer for creating a texture with a given size.&lt;br /&gt;
Added: Updates to renderers for D3D8.1 and D3D9 to report correct values for 'original' size and actual texture size.  (Related to Mantis ticket #45).&lt;br /&gt;
Added: Support for using user defined image codec by name (using dso) or directly throught a pointer to an existing image codec.&lt;br /&gt;
Added: Long property export (allows for properties containing multiple lines).&lt;br /&gt;
Added: Helper methods to Window to return EventSet::Iterator and PropertySet::Iterator objects.&lt;br /&gt;
Added: Reworked TabControl by zap.  Mantis #82.&lt;br /&gt;
Added: TabControlDemo sample.  Mantis #82.&lt;br /&gt;
Added: Danish language in the FontDemo sample.&lt;br /&gt;
Added: Output of summary of configure results (for configure based builds)&lt;br /&gt;
Added: Texture extra size information to CEGUI::Texture in order to be able to handle scaled/stretched textures within Imageset.&lt;br /&gt;
Added: Texture Scaling support in IrrlichRenderer &lt;br /&gt;
&lt;br /&gt;
Removed: Empty source file CEGUIVector.cpp&lt;br /&gt;
Removed: TabPane files.&lt;br /&gt;
&lt;br /&gt;
Modified: Behaviour of Editbox so that EventCharacterKey events are only marked as handled if the key press actually resulted in a change to the Editbox text string. (Related to Mantis #59)&lt;br /&gt;
Modified: Replaced all getWindow&amp;lt;something&amp;gt; with get&amp;lt;something&amp;gt;&lt;br /&gt;
Modified: Replaced all setWindow&amp;lt;something&amp;gt; with set&amp;lt;something&amp;gt;&lt;br /&gt;
Modified: EventSet::EventIterator now known as EventSet::Iterator&lt;br /&gt;
Modified: PropertySet::PropertyIterator now known as PropertySet::Iterator&lt;br /&gt;
Modified: ImageCodec modules are now DynamicModule &lt;br /&gt;
Modified: [[Falagard]] PropertyDim now supports a type attribute for UDim properties.  Mantis #82.&lt;br /&gt;
Modified: Improved TabControl imagery.  Mantis #82.&lt;br /&gt;
Modified: autotools makefiles now symlink the sample binaries (to avoid having to do 'make install').  Mantis #82.&lt;br /&gt;
Modified: PropertyHelper now uses snprintf instead of std::ostringstream again.  Mantis #82.&lt;br /&gt;
Modified: Removed static Makefile for tolua++cegui generator tool and switched to autotools style build, with enable/disable configure option, for tolua++cegui generator tool&lt;br /&gt;
Modified: Moved tolua++ into its own dir, removed lua_and_tolua++&lt;br /&gt;
Modified: Externalised our use of the Lua library&lt;br /&gt;
Modified: premake updates&lt;br /&gt;
Modified: Updated AUTHORS file.&lt;br /&gt;
Modified: Remove exec file attribute on Falagard.xsd &lt;br /&gt;
Modified: XMLRefSchema/Font.xsd for font rewrite&lt;br /&gt;
Modified: LuaScriptModule public headers no longer need include lua.h included.&lt;br /&gt;
Modified: Made a bunch of warnings go away in MSVC in the new font code.&lt;br /&gt;
Modified: Deleted the remaining old msvc project files.&lt;br /&gt;
&lt;br /&gt;
Bug Fix: Clean the XMLSerialization code: remove empty autowindow &lt;br /&gt;
Bug Fix: Added missing glDisable(GL_FOG); in gl renderer&lt;br /&gt;
Bug Fix: Irrlicht and D3D8.1 renderer modules would keep live pointers to Texture objects that failed to fully initialise (file or size errors for example)  Mantis #43.&lt;br /&gt;
Bug Fix: Disable texture stages we do not use in Direct3D renderers. (Mantis #95)&lt;br /&gt;
Bug Fix: Mouse cursor z value.  Mantis #49 &lt;br /&gt;
Bug Fix: Imagset XML attribute for image file name is 'Imagefile' and not 'Filename'.&lt;br /&gt;
Bug Fix: normal attributes use 'true', only properties sometimes use 'True'.&lt;br /&gt;
Bug Fix: Global default resource group was not being used by DefaultResourceProvider.&lt;br /&gt;
Bug Fix: XML output from CEGUI::Image class.&lt;br /&gt;
Bug Fix: Imageset scaling issue when renderer automatically scales the image #45 (this is currently a partial fix)&lt;br /&gt;
Bug Fix: IrrlichtRenderer - Mouse event error.  Mantis #98.&lt;br /&gt;
Bug Fix: IrrlichtRenderer - size error in addQuad.  Mantis #99.&lt;br /&gt;
Bug Fix: IrrlichtRenderer - Sample driver had linker lib name wrong for renderer module.  Mantis #100.&lt;br /&gt;
Bug Fix: TinyXMLParser bug.  Mantis Tracker #57 &lt;br /&gt;
Bug Fix: a bug in the openglrenderer cleanup related to image codec. &lt;br /&gt;
Bug Fix: Install renderer module includes at the same place as in Win32 (linux / mac autotools) &lt;br /&gt;
Bug Fix: OpenGL sample driver did not inject middle mouse up (injected it as down).  Mantis #82.&lt;br /&gt;
Bug Fix: Corrected some mistakes in the [[Falagard]] Lua bindings&lt;br /&gt;
Bug Fix: Apparently in some cases OpenGLRenderer needs NOMINMAX in Win32 (Mantis #63)&lt;br /&gt;
Bug Fix: FreeTypeFont did not free the font data properly, also fixes a potential infinite loop in FreeTypeFont (Mantis #60)&lt;br /&gt;
Bug Fix: FairChar font texture was not power of 2 (Mantis #64)&lt;br /&gt;
Bug Fix: SliderThumb incorrectly mapped in some schemes (mantis #88)&lt;br /&gt;
Bug Fix: Updated Irrlicht renderer to work with 0.5.0 codebase.&lt;br /&gt;
Bug Fix: some missing data &lt;br /&gt;
Bug Fix: DirectX 8.1 sample driver&lt;br /&gt;
Bug Fix: some missing files in the make dist command (Mantis #89)&lt;br /&gt;
Bug Fix: Change the name of an enumeration value in schema Font.xsd.&lt;br /&gt;
Bug Fix: Memory leak in Font.&lt;br /&gt;
Bug Fix: Lua bindings was missing ImagesetManager::createImagesetFromImageFile + some missing tolua_throws modifiers&lt;br /&gt;
&lt;br /&gt;
== Release 0.5.0-RC1 ==&lt;br /&gt;
Various internal code cleanups:&lt;br /&gt;
- Removal of unrequired utf8* casts on string literals.&lt;br /&gt;
- Removed use of NULL macro from the library code.&lt;br /&gt;
- Code refactorings to Font class. Removes some instances of repeated code, and makes &lt;br /&gt;
some methods shorter / cleaner.&lt;br /&gt;
- Split large methods in Scheme into smaller, more managable, chunks.&lt;br /&gt;
- Removed all the System constructor overloads and replaced with a single method.&lt;br /&gt;
- Removed string literals for component widget names which were scattered throughout t&lt;br /&gt;
he widget code.&lt;br /&gt;
- Replaced virtually all member fields holding pointers to component widgets with gett&lt;br /&gt;
er methods (which basically allows those widgets to be replaced without the parent kno&lt;br /&gt;
wing or caring).&lt;br /&gt;
- Refactoring of XML handler to remove huge if/else if/else construct.&lt;br /&gt;
- Refectored large if / else if / else constructs in all non-falagard XML handlers to &lt;br /&gt;
use a member function for each element type (rather than having all code in one huge f&lt;br /&gt;
unction).&lt;br /&gt;
- Event system has been rewritten from scratch.&lt;br /&gt;
- Font system has been rewritten.&lt;br /&gt;
&lt;br /&gt;
Added &amp;quot;PushedOff&amp;quot; rendering state for button based widgets and MenuItem.&lt;br /&gt;
Added: Ability to rename windows.&lt;br /&gt;
Added: CEGUISamplesConfig.h file to allow configuration of samples framework independe&lt;br /&gt;
ntly of the main config (saves recompiling everything just to change some sample setti&lt;br /&gt;
ng).&lt;br /&gt;
Added: FPS readout to OpenGL base app in the samples framework.&lt;br /&gt;
Added: &amp;quot;PropertyLinkDefinition&amp;quot; element for [[Falagard]] system.&lt;br /&gt;
Added: &amp;quot;controlPropery&amp;quot; attribute to SectionSpecififations under falagard to enable re&lt;br /&gt;
nering of section imagery to be controled via a named boolean property.&lt;br /&gt;
Added: mouse pass through feature in Window, to ignore mouse events. Nice for making a&lt;br /&gt;
 DefaultWindow transparent to the mouse regarding picking windows behind it.&lt;br /&gt;
Added: MSVC++ auto-linking for Ogre base app in samples framework.&lt;br /&gt;
Added: grab/restoreTextures in the OpenGL renderer to cache texture image data, and la&lt;br /&gt;
ter restore it.&lt;br /&gt;
Added: Abstracted Logger interface to support user created custom loggers. (SF patch #&lt;br /&gt;
1414121 by zap)&lt;br /&gt;
Added: DefaultLogger implementation (SF patch #1414121 by zap)&lt;br /&gt;
Added: page up/down key functionality to MultiLineEditbox (SF patch #1347376 by Dalfy)&lt;br /&gt;
Added: small script to recreate the binding generator for tolua++&lt;br /&gt;
Added: customized tolua++ binary. For exception handling support in generated binding &lt;br /&gt;
code.&lt;br /&gt;
Added: missing exception definitions file needed to generate the bindings.&lt;br /&gt;
Added: README with instructions on how to generate the bindings.&lt;br /&gt;
Added: Documentation for some of the new features in the bundled tolua++ generator.&lt;br /&gt;
Added: When subscribing to events from &amp;quot;inside&amp;quot; Lua a self object can be registered as&lt;br /&gt;
 well to be passed along with the EventArgs.&lt;br /&gt;
Added: New WindowRenderer system, replacing previous system where the Window sub-class&lt;br /&gt;
 controlled the rendering process.&lt;br /&gt;
Added: Major update of the LuaScriptModule to support anonymous functions.&lt;br /&gt;
Added: Exception handling has been added for some functions.&lt;br /&gt;
Added: [[Falagard]] derivatives of DefaultWindow, DragContainer and ItemEntry with minimal&lt;br /&gt;
 StateImagery.&lt;br /&gt;
Added: executeEventHandler now accepts functions that are table fields.&lt;br /&gt;
Added: Text node support to both parser (Xerces and TinyXML)&lt;br /&gt;
Added: AutoWindow tag to xml layouts to fetch a window created by the look'n'feel or t&lt;br /&gt;
he base widget itself.&lt;br /&gt;
Added: Window::isAutoWindow member that returns true if the window has &amp;quot;__auto_&amp;quot; in it&lt;br /&gt;
s name. (a flag is set in the constructor). It's faster than checking the actual strin&lt;br /&gt;
g.&lt;br /&gt;
Added: A setting to Window to specify that it should never write XML no matter what if&lt;br /&gt;
 activated. Tooltips get this set by default by System.&lt;br /&gt;
Added: A property ban list to provide a system for mapping which properties should (no&lt;br /&gt;
t) be written to XML. In the respective addProperties member functions checks have bee&lt;br /&gt;
n added and some properties are banned if we are an auto window.&lt;br /&gt;
Added: Default resource group support to Xerces for use when loading schema files.&lt;br /&gt;
Added: Default resource group support to ScriptingModule, and implemented its use in &lt;br /&gt;
the CEGUILua module.&lt;br /&gt;
Added: DynamicModule class to wrap access to a dynamically linked / loaded module.&lt;br /&gt;
Added: New dynamic libraries for Xerces, Expat TinyXMLParser, and libxml Parsers.&lt;br /&gt;
Added: TextProperty and FontProperty elements for [[Falagard]] text components.&lt;br /&gt;
Added: New ItemListBase based ItemListbox widget. For Window based listbox items.&lt;br /&gt;
Added: XML Serialization class for all XML writing.&lt;br /&gt;
Added: Recursive versions of Window::getChild and isChild by ID. They are called getCh&lt;br /&gt;
ildRecursive and isChildRecursive. Reason for the explicit naming is that it's a pretty expensive operation and should not be used unless necessary.&lt;br /&gt;
Added: Lots of missing members in the Lua bindings.&lt;br /&gt;
Added: setlocale(LC_NUMERIC, &amp;quot;C&amp;quot;); to the System constructor as we depend on this beha&lt;br /&gt;
viour.&lt;br /&gt;
Added: setVisible member to CEGUI::MouseCursor.&lt;br /&gt;
Added: bat files to make it easier for Windows users to regenerate the Lua bindings an&lt;br /&gt;
d tolua++cegui.&lt;br /&gt;
Added: ImageCodec support to the OpenGL renderer. This allows users to easily write a &lt;br /&gt;
custom image loader. TGA, SILLY, DevIL, Corona and FreeImage codecs are supplied.&lt;br /&gt;
Added: const version of getDataPtr in RawDataContainer.&lt;br /&gt;
Added: premake scripts to generate MSVC solutions.&lt;br /&gt;
Added: ClippedContainer for situations where more specialized clipping is required.&lt;br /&gt;
&lt;br /&gt;
Modified: Placed the integrated TinyXML into its own namespace (CEGUITinyXML) to preve&lt;br /&gt;
nt clashes in projects using another copy of TinyXML. (Patch #1294002).&lt;br /&gt;
Modified: Changed EventSet to operate without needing events to be pre-added, much lik&lt;br /&gt;
e GlabalEventSet always did.&lt;br /&gt;
Modified: Removal of mass pre-specification of events for all classes using events.&lt;br /&gt;
Modified: Cflags to add include dir for CEGUI in CEGUI.pc.in (allows use of &amp;lt;CEGUI/...&lt;br /&gt;
&amp;gt; form of include statement).&lt;br /&gt;
Modified: The &amp;quot;Lua and tolua++&amp;quot; module has been made a DLL on Windows machines.&lt;br /&gt;
Modified: Renamed System::setTooltip to System::setDefaultTooltip (Mantis #1Cool.&lt;br /&gt;
Modified: In the lua module, updated Window with casting helpers as member functions. &lt;br /&gt;
eg. w:toFrameWindow()&lt;br /&gt;
Modified: Removed the Static,StaticText and StaticImage from CEGUIBase and implemented&lt;br /&gt;
 them in FalagardBase instead.&lt;br /&gt;
Modified: Updated to tolua++ 1.0.92&lt;br /&gt;
Modified: Moved LuaFunctor into its own files&lt;br /&gt;
Modified: Reimplemented the &amp;quot;late binding&amp;quot; effect from the v04 Lua module. In v04 the &lt;br /&gt;
function is always looked up by name. In CVS HEAD the actual Lua function is reference&lt;br /&gt;
d, but now this will only occur the first time the event is triggered. This means that it's no longer necessary to have a function defined to subscribe it to an event. As l&lt;br /&gt;
ong as the function has been created before the event occurs everything will be good S&lt;br /&gt;
mile&lt;br /&gt;
Modified: Moved subscribeScriptedEvent into ScriptModule to allow more customized scri&lt;br /&gt;
pt subscription functionality.&lt;br /&gt;
Modified: Made the layout XML handler use subscribeScriptedEvent for Event tags instea&lt;br /&gt;
d of subscribeEvent with ScriptFunctor&lt;br /&gt;
Modified: Removal of &amp;quot;tolua_outside&amp;quot; stuff that was no longer needed.&lt;br /&gt;
Modified: Moved the declaration/definition of base window factories into its own files&lt;br /&gt;
.&lt;br /&gt;
Modified: Removal of WidgetSets folder, and its contents.&lt;br /&gt;
Modified: Removed unnecessary getSingleton and getSingletonPtr from manager classes.&lt;br /&gt;
Modified: The script module now throws ScriptException.&lt;br /&gt;
Modified: Removal of TextItem as falagard now handles that exclusively.&lt;br /&gt;
Modified: Moved all rendering member functions out of base classes an into [[Falagard]] re&lt;br /&gt;
ndering classes.&lt;br /&gt;
Modified: Removal of virtually all rendering and layout related Window properties from&lt;br /&gt;
 CEGUIBase - a few are moved to FalagardBase, the rest must be implemented via XML.&lt;br /&gt;
Modified: Removal of TaharezLook and WindowsLook modules from the system.&lt;br /&gt;
Modified: Removal of MetricsMode system, and all non-unified interface and properties &lt;br /&gt;
from Window (and related fixes to other classes).&lt;br /&gt;
Modified: Elimination of RenderableElement and derived classes.&lt;br /&gt;
Modified: Moved to a C preprocessor macro system for widget module creation.&lt;br /&gt;
Modified: Removal of abstract createXXX methods from widget base classes - the looknfe&lt;br /&gt;
el system now auto-creates these widgets when specified within the XML.&lt;br /&gt;
Modified: Updated to TinyXML 2.4.3 in order to allow CDATA section in XML text node (v&lt;br /&gt;
erbatim text)&lt;br /&gt;
Modified: GUILayout handler in order to support long value in properties.&lt;br /&gt;
Modified: Made the XML writing system aware of falagard when determining property defa&lt;br /&gt;
ult values.&lt;br /&gt;
Modified: Switched PropertyHelper to use std::ostringstream as the output is much nice&lt;br /&gt;
r. Changed property default values to the new format where needed.&lt;br /&gt;
Modified: Better error reporting for dynamic module load failures.&lt;br /&gt;
Modified: Switched to using external pcre library. Removed embedded copy of pcre.&lt;br /&gt;
Modified: Switched system to use dynamic libs for XML parsers with programatically con&lt;br /&gt;
figurable default.&lt;br /&gt;
Modified: FactoryModule to use DynamicModule.&lt;br /&gt;
Modified: Resolved issue with unneeded member qualification (Patch #1454773).&lt;br /&gt;
Modified: Made String::ptr a public member.&lt;br /&gt;
Modified: The bundled tolua++cegui binding generator will now generate a lua_CEGUI.cpp&lt;br /&gt;
 that compiles out-of-the-box on Windows&lt;br /&gt;
Modified: Removed the DataContainer template class, and made it into just RawDataConta&lt;br /&gt;
iner, non templated.&lt;br /&gt;
Modified: Optimized FalagardMultiLineEditbox to only cache visible lines when renderin&lt;br /&gt;
g.&lt;br /&gt;
Modified: Optimized ButtonBase and MenuItem updateInternalState. Mantis #44&lt;br /&gt;
Modified: Moved the renderers to their own folder named RendererModules.&lt;br /&gt;
Modified: Optimized picking and rendering by caching screen space rectangles.&lt;br /&gt;
Modified: Applied zap's rewrite of the Font system. Patch #1508321&lt;br /&gt;
Modified: Texture::loadFromMemory now takes a Texture::PixelFormat parameter. RGB and &lt;br /&gt;
RGBA are currently required. Fixes Patch #1455523 as well. 3rd party renderer modules &lt;br /&gt;
needs to be updated.&lt;br /&gt;
&lt;br /&gt;
Bug fix: OpenGLRenderer was producing errors and not cleaning up state changes properl&lt;br /&gt;
y (thanx muhkuh25)&lt;br /&gt;
Bug fix: OpenGLRenderer was broken when compiled for x86-64.&lt;br /&gt;
Bug Fix: ListboxItem::getOwnerWindow should be const&lt;br /&gt;
Bug Fix: ListboxItem::getOwnerWindow should not take a Window* argument.&lt;br /&gt;
Bug Fix: Scheme::resourcesLoaded was always returning true.&lt;br /&gt;
Bug Fix: PropertyHelper::stringToImage was not handling empty string case.&lt;br /&gt;
Bug Fix: Editbox::onCharacter was setting the event as handled even if nothing was don&lt;br /&gt;
e.&lt;br /&gt;
Bug Fix: Added shift/ctrl/alt support to the OpenGL sample driver (injects LeftXXX)&lt;br /&gt;
Bug Fix: The command line renderer selector does no longer ask if there is only one re&lt;br /&gt;
nderer available.&lt;br /&gt;
Bug Fix: Fixed window resizing for the OpenGL Sample driver.&lt;br /&gt;
Bug Fix: fixed const correctness for &amp;quot;String::utf8_stream_len&amp;quot; SF patch #1367423&lt;br /&gt;
Bug Fix: Detect &amp;quot;window-&amp;gt;addChildWindow(window);&amp;quot; and do nothing instead of actually t&lt;br /&gt;
rying.&lt;br /&gt;
Bug Fix: Added missing performChildWindowLayout to Scrollbar::onScrollConfigChanged to&lt;br /&gt;
 allow making a look'n'feel with a thumb that sizes to indicate document size.&lt;br /&gt;
Bug fix: const correctness for Window::getLookNFeel&lt;br /&gt;
Bug fix: FrameWindow, isTitlebarEnabled and isCloseButtonEnabled were return the oppos&lt;br /&gt;
ite of what they should.&lt;br /&gt;
Bug Fix: FrameWindow should do relayout if text changes to allow using a fontdim in th&lt;br /&gt;
e titlebar dimensions.&lt;br /&gt;
Bug Fix: Changing the default mouse cursor in the System object will now update the cu&lt;br /&gt;
rsor immediately where appropriate. (Ticket #17).&lt;br /&gt;
Bug Fix: Fixed case in StaticText where default text area was always used if frame was&lt;br /&gt;
 disabled.&lt;br /&gt;
Bug Fix: Image offsets were'nt being properly handled for the corners in FrameComponen&lt;br /&gt;
t.&lt;br /&gt;
Bug Fix: MultiColumnList would always use item string when sorting, instead of vitual &lt;br /&gt;
operators on users custom items.&lt;br /&gt;
Bug Fix: System::getWindowContainingMouse would return incorrect Window if called from&lt;br /&gt;
 within Window::EventMouseLeaves handlers.&lt;br /&gt;
Bug Fix: Order of static data creation in C++ is unspecified; we can't have globally d&lt;br /&gt;
efined static data that relies on other such static data within the same module.&lt;br /&gt;
Bug Fix: Falagard/ProgressBar was broken when vertical or reversed-horizontal.&lt;br /&gt;
Bug Fix: Corruption of window registry when rename failed (Patch #1450623).&lt;br /&gt;
Bug Fix: Initialisation issue with TabControl trying to access child widgets before th&lt;br /&gt;
ey are created. (Patch #1391727).&lt;br /&gt;
Buf Fix: CEGUI::Window::setModalState(true) removes the modal state from a modal windo&lt;br /&gt;
w. Mantis #42&lt;br /&gt;
Bug Fix: MultiColumnList getNextSelection bug. Mantis #47&lt;br /&gt;
Bug Fix: System subscriber to renderer event but does not unsubscribe on destruction. &lt;br /&gt;
Mantis #48&lt;br /&gt;
Bug Fix: OpenGL and DirectX9 renderers were not handling error correctly when creating&lt;br /&gt;
 textures.&lt;br /&gt;
Bug Fix: Bug in LuaScriptModule where executeScriptFile did not unload the file data b&lt;br /&gt;
uffer correctly in case of an exception (thanks gcarlton).&lt;br /&gt;
Bug Fix: A bug in ItemListBase::resetList_impl where calling resetList would crash (th&lt;br /&gt;
anks Turtle).&lt;br /&gt;
Bug Fix: Typo in TabPane::testClassName_impl (&amp;quot;Tabpane&amp;quot; instead of &amp;quot;TabPane&amp;quot;).&lt;br /&gt;
Bug Fix: Big Endian inconsistency in CEGUI::colour.&lt;br /&gt;
Bug Fix: CEGUI::Window was not detaching the tooltip during destruction. Mantis #38&lt;br /&gt;
Bug Fix: FrameWindow was consuming all LeftButton up events. Down events were affected&lt;br /&gt;
 as well, and now only consume if the event started drag sizing.&lt;br /&gt;
Bug Fix: DragContainer would overwrite any new position applied to the DragContainer d&lt;br /&gt;
uring the DragDropItemDropped event. Mantis #53&lt;br /&gt;
Bug Fix: The OpenGL sample driver could cause a stack overflow. Patch #1507826&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Porting Notes =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The 0.5.0 release of Crazy Eddie's GUI System is the first of what will likely be a series of releases containing breaking changes for client code and data files. We feel these breaking changes are required as we move closer to the 1.0 release of CEGUI, and also as the design and usage patterns for CEGUI change; the results are a generally more streamlined system as we move from one idiom to another, as opposed to becoming more and more bloated due to retaining vast amounts of code and kludges for backward compatibility reasons.&lt;br /&gt;
&lt;br /&gt;
This document is a general overview and guide to the breaking changes between the 0.4.x series of releases and the 0.5.0 release. As and when other breaking releases are made, additional documentation will be provided as necessary.&lt;br /&gt;
&lt;br /&gt;
== CELayoutUpgrader ==&lt;br /&gt;
&lt;br /&gt;
[[CELayoutUpgrader]] is a python script that can upgrade XML layout files to the Unified Coordinate System. It should help to ease the porting process.&lt;br /&gt;
&lt;br /&gt;
== Changes and Porting ==&lt;br /&gt;
This section is intended as a general overview of the breaking changes made. Blah, blah, blah.&lt;br /&gt;
&lt;br /&gt;
=== Code Changes ===&lt;br /&gt;
This sub-section details changes made to the CEGUI system code and API which will affect client code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== The new WindowRenderer system ====&lt;br /&gt;
One of the main issues with the previous widget module approach, was that it became exceptionally difficult to sub-class a widget type where some custom behavioural changes or additions were required. &lt;br /&gt;
 *** TODO ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== CEGUI::System Constructor ====&lt;br /&gt;
The overloaded constructors for the main CEGUI::System object have been removed and replaced with a single, unified, constructor. Using the new constructor it is still possible to do all the things that used to be possible, while making the whole system construction process a little more uniform.&lt;br /&gt;
&lt;br /&gt;
The new constructor has the form:&lt;br /&gt;
 System(Renderer* renderer,&lt;br /&gt;
       ResourceProvider* resourceProvider = 0,&lt;br /&gt;
       XMLParser* xmlParser = 0,&lt;br /&gt;
       ScriptModule* scriptModule = 0,&lt;br /&gt;
       const String&amp;amp; configFile = &amp;quot;&amp;quot;,&lt;br /&gt;
       const String&amp;amp; logFile = &amp;quot;CEGUI.log&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
As can be seen, the Renderer module is, of course, still mandatory, though you are free to provide all or none of the other optional arguments and passing in 0 where no object, or no custom object, is required.&lt;br /&gt;
&lt;br /&gt;
For the most basic uses of the system, where only the Renderer is passed in, no changes will be required. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== System::setTooltip changed to System::setDefaultTooltip ====&lt;br /&gt;
The member function&lt;br /&gt;
 System::setTooltip&lt;br /&gt;
has been renamed as&lt;br /&gt;
 System::setDefaultTooltip&lt;br /&gt;
this was a change for API consistency. Update your code to use the new name for this member.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Window MetricsMode removed ====&lt;br /&gt;
The concept of a singular 'MetricsMode' for a window is now obsolete and is replaced with the 'Unified' metrics system (which comprises of both a relative 'scale' value and an absolute 'offset' value).&lt;br /&gt;
&lt;br /&gt;
The class members, properties and all associated items affecting MetricsMode have been removed from the system and the use of the Unified metrics system is now mandatory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Window Metrics and other conversion members removed ====&lt;br /&gt;
Member functions in the Window class that were concerned with converting values between the various metric modes have all been removed.&lt;br /&gt;
There may still be the need to perform some conversions of co-ordinates, so this functionality is now provided by the external utility class CEGUI::CoordConverter.&lt;br /&gt;
Window Size and Positioning&lt;br /&gt;
&lt;br /&gt;
Due to the removal of the MetricsMode concept, and the now mandatory use of 'Unified' co-ordinate values, the means by which you specify size and position is now by using the unified co-ordinate types: UDim, UVector2 and URect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=2px cellspacing=0&lt;br /&gt;
| style=&amp;quot;color: #ffffff; background-color: #ff5555; border: solid 1px #000000;&amp;quot; | '''The information in the following section has been updated again since RC1 was issued - early adopters will need to update their code again to use SVN trunk code and the upcoming RC2.'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* getXPosition, getWindowXPosition, getRelativeXPosition and getAbsoluteXPosition members are replaced with a single getXPosition member returning a UDim.&lt;br /&gt;
* getYPosition, getWindowYPosition, getRelativeYPosition and getAbsoluteYPosition members are replaced with a single getYPosition member returning a UDim.&lt;br /&gt;
* getPosition, getWindowPosition, getRelativePosition and getAbsolutePosition members are replaced with a single getPosition member returning a UVector2.&lt;br /&gt;
* getWidth, getWindowWidth, getRelativeWidth and getAbsoluteWidth members are replaced with a single getWidth member returning a Udim.&lt;br /&gt;
* getHeight, getWindowHeight, getRelativeHeight and getAbsoluteHeight members are replaced with a single getHeight member returning a UDim.&lt;br /&gt;
* getSize, getWindowSize, getRelativeSize and getAbsoluteSize members are replaced with a single getSize member returning a UVector2&lt;br /&gt;
* getRect, getWindowArea, getRelativeRect and getAbsoluteRect members are replaced with a single getArea member returning a URect.&lt;br /&gt;
* getMaximumSize and getWindowMaxSize members are replaced with a single getMaxSize member returning a UVector2.&lt;br /&gt;
* getMinimumSize and getWindowMinSize members are replaced with a single getMinSize member returnung a UVector2.&lt;br /&gt;
&lt;br /&gt;
* setWidth and setWindowWidth members are replaced with a single setWidth member taking a UDim.&lt;br /&gt;
* setHeight and setWindowHeight members are replaced with a single setHeight member taking a UDim.&lt;br /&gt;
* setSize and setWindowSize members are replaced with a single setSize member taking a UVector2.&lt;br /&gt;
* setXPosition and setWindowXPosition members are replaced with a single setXPosition member taking a UDim.&lt;br /&gt;
* setYPosition and setWindowYPosition members are replaced with a single setYPosition member taking a UDim.&lt;br /&gt;
* setPosition and setWindowPosition members are replaced with a single setPosition member taking a UVector2.&lt;br /&gt;
* setAreaRect, setRect and setWindowArea members are replaced with setArea members accepting the following options:&lt;br /&gt;
** Four UDims; specifying x position, y position, width and height.&lt;br /&gt;
** Two UVector2s; specifying position and size.&lt;br /&gt;
** A single URect defining the area.&lt;br /&gt;
* setMaximumSize and setWindowMaxSize members are replaced with a single setMaxSize member taking a UVector2.&lt;br /&gt;
* setMinimumSize and setWindowMinSize members are replaced with a single setMinSize member taking a UVector2.&lt;br /&gt;
&lt;br /&gt;
==== Component Widget creation abstract members ====&lt;br /&gt;
If you have sub-classed any Window types in order to create a new “Widget Module”, part of your responsibility was to provide implementations for various abstract member functions whose job it was to create the various component widgets required by the container window. These members were typically named createXXX (for example, Combobox::createEditbox).&lt;br /&gt;
&lt;br /&gt;
These abstract member functions and the internal calls to them have all been removed from the system. The component widgets are now specified within the looknfeel xml files are are automatically created by the [[Falagard]] looknfeel system as and when required.&lt;br /&gt;
You should remove any code that creates these component widgets and add appropriate &amp;lt;Child&amp;gt; tags to your looknfeel xml files instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Component Widget member fields ====&lt;br /&gt;
If you had sub-classed any of the Window types, either to provide some modified behaviour or perhaps for a “Widget Module” as part of creating a custom look, you would previously have had access to some member variables that held pointers to component widgets of the more complicated widget types (for example, the Scrollbar widget would have held pointers to the two PushButton widgets and the Thumb widget that it was composed of). These members have now been removed and replaced with 'getter' member functions; this is important because in the future the actual Window objects used for these component parts may not be valid for the entire life of the containing Window. That is, the component Windows may get destroyed and re-created, thus invalidating any cached pointers.&lt;br /&gt;
&lt;br /&gt;
The old member variables and the getter function that replaces them are listed here:&lt;br /&gt;
 *** TODO ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RenderableElement, RenderableImage and RenderableFrame classes ====&lt;br /&gt;
These classes have all been removed from the system entirely. Everything that these classes achieved with regards to rendering for window and widget types can now be done via the [[Falagard]] looknfeel system.&lt;br /&gt;
&lt;br /&gt;
For window based rendering, you should remove your use of Renderable* classes in favour of ImageryComponent and FrameComponent elements in your looknfeel xml files.&lt;br /&gt;
If you were using the Renderable* classes to perform rendering outside of the window rendering systems, you will now need to find alternative, custom, means to do this. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Static, StaticImage and StaticText classes ====&lt;br /&gt;
These classes are now removed from the base system and have been implemented as WindowRenderer classes. Generally, your interface to these widget types should now use a simple default window and the properties system.&lt;br /&gt;
&lt;br /&gt;
The look'n'feel spec for these two widgets have changed as well.&lt;br /&gt;
&lt;br /&gt;
StaticImage:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        The LookNFeel should provide the following:&lt;br /&gt;
&lt;br /&gt;
        States:&lt;br /&gt;
            - Enabled                     - basic rendering for enabled state.&lt;br /&gt;
            - Disabled                    - basic rendering for disabled state.&lt;br /&gt;
            - EnabledFrame                - frame rendering for enabled state&lt;br /&gt;
            - DisabledFrame               - frame rendering for disabled state.&lt;br /&gt;
            - WithFrameEnabledBackground  - backdrop rendering for enabled state with frame enabled.&lt;br /&gt;
            - WithFrameDisabledBackground - backdrop rendering for disabled state with frame enabled.&lt;br /&gt;
            - NoFrameEnabledBackground    - backdrop rendering for enabled state with frame disabled.&lt;br /&gt;
            - NoFrameDisabledBackground   - backdrop rendering for disabled state with frame disabled.&lt;br /&gt;
            - WithFrameImage              - image rendering when frame is enabled&lt;br /&gt;
            - NoFrameImage                - image rendering when frame is disabled (defaults to WithFrameImage if not present)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
StaticText:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        The LookNFeel should provide the following:&lt;br /&gt;
&lt;br /&gt;
        States:&lt;br /&gt;
            - Enabled                     - basic rendering for enabled state.&lt;br /&gt;
            - Disabled                    - basic rendering for disabled state.&lt;br /&gt;
            - EnabledFrame                - frame rendering for enabled state&lt;br /&gt;
            - DisabledFrame               - frame rendering for disabled state.&lt;br /&gt;
            - WithFrameEnabledBackground  - backdrop rendering for enabled state with frame enabled.&lt;br /&gt;
            - WithFrameDisabledBackground - backdrop rendering for disabled state with frame enabled.&lt;br /&gt;
            - NoFrameEnabledBackground    - backdrop rendering for enabled state with frame disabled.&lt;br /&gt;
            - NoFrameDisabledBackground   - backdrop rendering for disabled state with frame disabled.&lt;br /&gt;
&lt;br /&gt;
        Named Areas (missing areas will default to 'WithFrameTextRenderArea'):&lt;br /&gt;
            WithFrameTextRenderArea&lt;br /&gt;
            WithFrameTextRenderAreaHScroll&lt;br /&gt;
            WithFrameTextRenderAreaVScroll&lt;br /&gt;
            WithFrameTextRenderAreaHVScroll&lt;br /&gt;
            NoFrameTextRenderArea&lt;br /&gt;
            NoFrameTextRenderAreaHScroll&lt;br /&gt;
            NoFrameTextRenderAreaVScroll&lt;br /&gt;
            NoFrameTextRenderAreaHVScroll&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dynamic addition of Events to Windows and other EventSet based objects ====&lt;br /&gt;
It used to be that all available Event objects would be pre-added to an EventSet when it was constructed. When an Event was accessed which had not been added to the EventSet an appropriate exception was thrown.&lt;br /&gt;
&lt;br /&gt;
This behaviour has now changed. Events are only added to an EventSet when a handler for that event is first subscribed. A side effect of this is that EventSet does now not throw exceptions, either when firing a non-existing Event (now reclassified as simply an event which has no subscribers), or when subscribing to an Event that does not yet exist, since the Event is now automatically created and added to the EventSet.&lt;br /&gt;
&lt;br /&gt;
If your code currently relies on exceptions being thrown by the events system, you will need to change this to a more pro-active approach (by manually checking if an event exists yet), instead of reactive (catching exceptions).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== TinyXML moved to CEGUITinyXML namespace ====&lt;br /&gt;
If you were for some reason using our integrated copy of TinyXML directly in your application, we have moved this module into the namespace 'CEGUITinyXML'. This was done to avoid clashes and conflicts where the client contained its own copy of TinyXML.&lt;br /&gt;
&lt;br /&gt;
To continue to directly use the integrated TinyXML, just add the namespace qualifier where appropriate.&lt;br /&gt;
&lt;br /&gt;
If you are just using the TinyXML based implementation of CEGUI::XMLParser, you do not need to change anything.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Data File Changes ===&lt;br /&gt;
This sub-section details changes that will affect the xml data files used with CEGUI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Updated XSD files for Xerces ====&lt;br /&gt;
Even the most rudimentary changes to the xml formats we use mean that if you're using the Xerces-C, or other, validating XML parser, then you will need to update you projects to use the new .xsd files. These are collected together for convenience in the XMLRefSchema subdirectory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== [[Falagard]] Additions ===&lt;br /&gt;
From lack of a better place to put this I'll list the additions that have been made to [[Falagard]] here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''PropertyLinkDefinition'''&lt;br /&gt;
New element that will create a property that is a link to another property of a child window.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* type (type, optional and not currently used for anything)&lt;br /&gt;
* name (name of the property link)&lt;br /&gt;
* widget (name suffix of the child widget to link to)&lt;br /&gt;
* targetProperty (the target property to link to. Optional, will default to ''name'' if not given)&lt;br /&gt;
* initialValue (starting value for the property. Optional, will default to empty)&lt;br /&gt;
* layoutOnWrite (will make the widget redo the child layout when the property is written. Optional, defaults to ''false'')&lt;br /&gt;
* redrawOnWrite (will make the widget redraw when the property is written. Optional, default to ''false'')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''controlProperty'''&lt;br /&gt;
&lt;br /&gt;
New attribute added to ''Section''. Value is the name of a property, and if specified the Section will only render when the property has a value of ''True''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TextComponent'''&lt;br /&gt;
&lt;br /&gt;
Two new sub-elements are now valid for ''TextComponent''.&lt;br /&gt;
&lt;br /&gt;
''TextProperty'', and ''FontProperty''. Must be specified in that order after the (optional) ''Text'' element.&lt;br /&gt;
Both have one required attribute ''name'' which takes the name of a property which will contain the text to draw, or the name of the font to use for rendering.&lt;br /&gt;
&lt;br /&gt;
In case these new elements are used along with the ''Text'' element, the string and font specified in the ''Text'' element will be used as defaults if the ''TextProperty'' or ''FontProperty'' evaluates to empty strings.&lt;br /&gt;
&lt;br /&gt;
=== Font system changes ===&lt;br /&gt;
&lt;br /&gt;
* There's no notion of '''StartCodepoint''' and '''EndCodepoint''', or '''glyph set''' anymore. Font render glyphs on the fly as required: if you ask to display &amp;quot;A&amp;quot; it renders a small subset of glyphs (256 codepoints surrounding the missing glyph usually, but can render extra glyphs out of the range to conserve texture space).&lt;br /&gt;
* The Font class is now an abstract class and there are two implementations: FreeTypeFont and PixmapFont.&lt;br /&gt;
** FreeTypeFont uses the FreeType library and can display TTF, FON, PCF/BDF, PS fonts (and possibly others). I have ensured that bitmap fonts work, since bitmap fonts should be handled a little different from outline fonts.&lt;br /&gt;
** PixmapFont uses an Imageset with the glyphs and can display colorful glyphs (which FreeType cannot due to its grayscale nature). However, it's more primitive, but can be useful for things like logos, loading messages etc.&lt;br /&gt;
* The Font class is now a PropertySet, so specialized classes derived from Font can add their own properties (such as PointSize for FreeType fonts which don't have sense for Imageset-based fonts). Here's a list of available properties:&lt;br /&gt;
** All font classes: Name, FileName, NativeRes, ResourceGroup, AutoScaled&lt;br /&gt;
** FreeTypeFont: PointSize, Antialiased&lt;br /&gt;
** PixmapFont: Imageset, Mapping&lt;br /&gt;
* Fixed a number of (vertical) font positioning errors: the font wasn't properly centered within its LineAdvance range.&lt;br /&gt;
* Added several new fonts: DejaVuSans (taken from the DejaVu project, http://dejavu.sf.net), fkp (a X11 bitmap font from http://artwizaleczapka.sf.net), FairChar (a Imageset-based font which I made from some old GIF file I found on my HD :-).&lt;br /&gt;
* A FontDemo sample which shows several properties of the new Font class.&lt;br /&gt;
&lt;br /&gt;
The above changes resulted in some slight changes to the format of the XML .font files:&lt;br /&gt;
&lt;br /&gt;
* GlyphSet, GlyphRange, Glyph sections of the Font are gone&lt;br /&gt;
* The possible values of the Type attribute are now:&lt;br /&gt;
** FreeType (instead of Dynamic)&lt;br /&gt;
** Pixmap (instead of Static)&lt;br /&gt;
* The FirstCodepoint and LastCodepoint attributes of the Font section were removed&lt;br /&gt;
&lt;br /&gt;
After you change your .font files as mentioned above, they should work without problems.&lt;br /&gt;
&lt;br /&gt;
=== Iterator Changes ===&lt;br /&gt;
* EventSet::EventIterator is changed to EventSet::Iterator&lt;br /&gt;
* PropertySet::PropertyIterator is changed to PropertySet::Iterator&lt;br /&gt;
&lt;br /&gt;
=== Convert Point to UVector2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::Point(_x, _y)&amp;lt;/source&amp;gt;&lt;br /&gt;
becomes&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;CEGUI::UVector2(CEGUI::UDim(_x,0), CEGUI::UDim(_y,0))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To be continued...&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Build_from_source_for_Linux&amp;diff=4243</id>
		<title>Build from source for Linux</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Build_from_source_for_Linux&amp;diff=4243"/>
				<updated>2011-03-04T14:34:18Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: SILLY interlinks&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}}&lt;br /&gt;
&lt;br /&gt;
I happened to notice that this article needed to be written and I was about to install CEGUI from source right now, so I thought I'd document the steps I used, in hopes that they may be useful to somebody.&lt;br /&gt;
&lt;br /&gt;
I'm on ubuntu 6.06 (Dapper)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need:&amp;lt;br /&amp;gt;&lt;br /&gt;
- A C++ compiler (g++ in my case)&amp;lt;br /&amp;gt;&lt;br /&gt;
- Linux Makefile&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First you need to download the latest source tarball. I think it's a good idea to keep all the libraries you install from source in a directory, so you can re-compile later with different options if you wish. /home/user/Installs in my case.&lt;br /&gt;
Move the downloaded tar to your &amp;quot;installs directory&amp;quot; and extract it with:&amp;lt;br /&amp;gt;&lt;br /&gt;
tar xzf CEGUI-0.5.0b.tar.gz&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enter the CEGUI file:&amp;lt;br /&amp;gt;&lt;br /&gt;
cd CEGUI-0.5.0/&amp;lt;br /&amp;gt;&lt;br /&gt;
and type &amp;lt;br /&amp;gt;&lt;br /&gt;
./configure --help&amp;lt;br /&amp;gt;&lt;br /&gt;
Scroll up a bit and take a look at the available compile options. Pay special attention to the optional ones, so you can make sure that you get all the features you need.&lt;br /&gt;
then type&amp;lt;br /&amp;gt;&lt;br /&gt;
./configure&amp;lt;br /&amp;gt;&lt;br /&gt;
If everything worked you should get a summary of the build you are going to make. If you don't get the summary, it's probably because you don't have the libraries CEGUI needs to compile. Make sure you have the _DEVELOPMENT_ libraries installed. If you are not happy with the summary, run configure again and use the options from the help section to tweak it.&amp;lt;br /&amp;gt;&lt;br /&gt;
Here is what I got.&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
 ************************************************&lt;br /&gt;
 * Crazy Eddie's GUI System - Configuration Results Summary&lt;br /&gt;
 ************************************************&lt;br /&gt;
&lt;br /&gt;
 * Library Release Version:                              0.5.0&lt;br /&gt;
 *&lt;br /&gt;
 * Code options:&lt;br /&gt;
 *         Building CEGUI in debug mode:                 no&lt;br /&gt;
 *&lt;br /&gt;
 * Renderer Modules:&lt;br /&gt;
 *         Building OpenGL Renderer:                     yes&lt;br /&gt;
 *         Building Irrlict Renderer:                    no&lt;br /&gt;
 *&lt;br /&gt;
 * Image Loading Codec Modules (currently for OpenGL Renderer only):&lt;br /&gt;
 *         Building Corona Image Codec:                  no&lt;br /&gt;
 *         Building DevIL Image Codec:                   no&lt;br /&gt;
 *         Building FreeImage Image Codec:               no&lt;br /&gt;
 *         Building [[SILLY]] Image Codec:                   no&lt;br /&gt;
 *         Building TGA Image Codec:                     yes&lt;br /&gt;
 *&lt;br /&gt;
 *         Default Image Codec will be:                  TGAImageCodec&lt;br /&gt;
 *&lt;br /&gt;
 * XML Parser Modules:&lt;br /&gt;
 *         Building TinyXMLParser:                       yes&lt;br /&gt;
 *         Building ExpatParser:                         no&lt;br /&gt;
 *         Building LibXMLParser:                        no&lt;br /&gt;
 *         Building XercesParser:                        no&lt;br /&gt;
 *&lt;br /&gt;
 *         Default XML Parser is:                        TinyXMLParser&lt;br /&gt;
 *&lt;br /&gt;
 * Scripting:&lt;br /&gt;
 *         Building Lua scripting module:                no&lt;br /&gt;
 *         Building tolua++cegui generator:              no&lt;br /&gt;
 *&lt;br /&gt;
 * Samples Framework:&lt;br /&gt;
 *         Building Samples:                             yes&lt;br /&gt;
 *         GTK2 based dialog for renderer selection:     no&lt;br /&gt;
 *         OpenGL Renderer available in samples:         yes&lt;br /&gt;
 *         Irrlict Renderer available in samples:        no&lt;br /&gt;
 *         Ogre3D Renderer available in samples:         no&lt;br /&gt;
 ************************************************&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
the next part is easy, just type 'make' then 'make install'.&amp;lt;br /&amp;gt;&lt;br /&gt;
In practice you'll need root privileges to install the files, so with ubuntu:&amp;lt;br /&amp;gt;&lt;br /&gt;
sudo make install&amp;lt;br /&amp;gt;&lt;br /&gt;
or in gentoo for example:&amp;lt;br /&amp;gt;&lt;br /&gt;
su&amp;lt;br /&amp;gt;&lt;br /&gt;
make install&amp;lt;br /&amp;gt;&lt;br /&gt;
Hope this helps.&lt;br /&gt;
&lt;br /&gt;
Note: If you're in Gentoo or Saboyan, configure might incorrectly detect your C++ preprocessor as &amp;quot;gcc -E&amp;quot;, which will cause Irrlicht to fail. If you need Irrlicht, try:&lt;br /&gt;
$ CC=&amp;quot;g++&amp;quot; ./configure&lt;br /&gt;
Enjoy!&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Adding_ImageSets_to_the_CEGUI_LayoutEditor_0.6.X&amp;diff=4227</id>
		<title>Adding ImageSets to the CEGUI LayoutEditor 0.6.X</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Adding_ImageSets_to_the_CEGUI_LayoutEditor_0.6.X&amp;diff=4227"/>
				<updated>2011-03-04T00:17:54Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot-aided spell checker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
If you have made your own [[Imageset files|ImageSet]] which you'd like to access from the CELayoutEditor, you need to place it in your corresponding datafiles directory.&lt;br /&gt;
&lt;br /&gt;
To find your directory, open your CELayoutEditor.ini file and look for this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ImagesetsPath=C:\Program Files\CELayoutEditor 0.6.3b\datafiles/imagesets/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(If you don't have an INI file yet, launch the editor at least once. More details can be found in the editor's [[CELayoutEditor Manual|manual]]).&lt;br /&gt;
&lt;br /&gt;
Copy your own Imageset file (including the actual image which it uses!) to that directory and restart the editor. Now it will 'pick it up' automatically, like it does for fonts as well.&lt;br /&gt;
&lt;br /&gt;
Finally, to use an image in the editor, goto the property grid (in the dialog) and use the following format:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;set:setName image:imgName&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Where 'setName' is equal to the 'name=xxx' part in your XML file, and the image is one of the defined images by name. Just like you'd do in a layout file directly or in code via the 'setProperty' method for images.&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Sample_code_for_all_Widgets&amp;diff=4226</id>
		<title>Sample code for all Widgets</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Sample_code_for_all_Widgets&amp;diff=4226"/>
				<updated>2011-03-03T23:57:26Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}} {{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
This code goes through every widget and demonstrates how to retrieve and set their data as well as some of their particularities.  Please post comments or questions on the message board thread for the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=7967#7967 Widget Galore]&lt;br /&gt;
&lt;br /&gt;
=== Widgets ===&lt;br /&gt;
&lt;br /&gt;
==== General ====&lt;br /&gt;
A widget can be enabled/disabled via setEnabled().  Disabling a widget prevents the user from activating it and manipulating its contents.  A widget can be hidden/shown via setVisible().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tooltip ====&lt;br /&gt;
A Tooltip widget displays text when the mouse has been hovering over a widget for a certain amount of time.  This widget requires that time be injected within CEGUI via injectTimePulse().&lt;br /&gt;
&lt;br /&gt;
The graphical aspect (the scheme) of the tooltip can be specified via setTooltip().  The amount of hovering time required to activate the tooltip can be specified via setHoverTime().  The amount of time the tooltip is displayed can be specified via setDisplayTime().  And the fade transition time can be specified via setFadeTime(); this affects both the fade in and the fade out times.  The tooltip text of a widget can be specified via setTooltipText().  Please note that some complex widgets are composed of several widgets.  In order to have a tooltip text displayed while hovering over any region of the complex widget then every component widget needs to have a tooltip text specified.  For example a Spinner widget is composed of an Editbox widget and two Button widgets. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== StaticText ====&lt;br /&gt;
There is no StaticText within CEGUI but type of widget can be obtained via the DefaultWindow class.&lt;br /&gt;
&lt;br /&gt;
The currently displayed text can be specified via setText().  The colour of this text can be specified via the &amp;quot;TextColours&amp;quot; property.  The value of this property contains 4 colour definitions: top left, top right, bottom left, and bottom right.  Each colour is specified as a two-digit hexadecimal value of the format AARRGGBB (alpha, red, green, blue).  The text is aligned vertically via the &amp;quot;VertFormatting&amp;quot; property with a value of TopAligned, BottomAligned, or VertCentred.  The text is aligned horizontally via the &amp;quot;HorzFormatting&amp;quot; property with a value of LeftAligned, RightAligned, HorzCentred, HorzJustified, WordWrapLeftAligned, WordWrapRightAligned, WordWrapCentred, or WordWrapJustified.&lt;br /&gt;
&lt;br /&gt;
==== StaticImage ====&lt;br /&gt;
There is no StaticImage within CEGUI but type of widget can be obtained via the DefaultWindow class.&lt;br /&gt;
&lt;br /&gt;
The currently displayed image can be specified via the &amp;quot;Image&amp;quot; property.  This property takes two parameters, the imageset (&amp;quot;set&amp;quot;) and the image name (&amp;quot;image&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== ProgressBar ====&lt;br /&gt;
A ProgressBar widget displays a progression; it does not receive inputs from a user.&lt;br /&gt;
&lt;br /&gt;
The current progress can be specified via setProgress().  Progress can be advanced through steps.  The step size can be specified via setStepSize() and a step performed via step().  Progress can be adjusted by a delta value via adjustProgress().  The current progress value can be obtained via getProgress().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Button ====&lt;br /&gt;
A Button widget displays a text and receives an activation instruction from the user.&lt;br /&gt;
&lt;br /&gt;
The text can be specified via setText().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ScrollablePane ====&lt;br /&gt;
A ScrollablePane widget displays contents that can be scrolled.  Contents can be added via addChildWindow().  When that content exceeds the dimensions of the ScrollablePane then scrollbars appear to allow the use to view and interact with that hidden content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Checkbox ====&lt;br /&gt;
A Checkbox widget controls a boolean value; true when checked and false when unchecked.  This value can be obtained via isSelected() and specified via setSelected(true) to check or setSelected(false) to uncheck.&lt;br /&gt;
&lt;br /&gt;
==== Spinner ====&lt;br /&gt;
A Spinner widget controls a numerical values (float) through an editbox or the use of the increment or decrement buttons.&lt;br /&gt;
&lt;br /&gt;
This value is bounded within a minimum and a maximum by calling setMinimumValue() and setMaximumValue().  The arrow buttons increment or decrement the value by the amount specified with setStepSize().  The numerical value can be displayed in four formats:  FloatingPoint, Integer, Hexadecimal, Octal.  &lt;br /&gt;
&lt;br /&gt;
The current value is obtained via getCurrentValue() and specified via setCurrentValue().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Editbox ====&lt;br /&gt;
An Editbox widget controls printable character values; letters, numbers, punctuations, and symbols.  &lt;br /&gt;
&lt;br /&gt;
The maximal number of characters that can be specified is bound by setMaxTextLength().  The value can be set to readable only (modifications by users are not allowed) via setReadOnly(true).  The value can be masked via setTextMasked() and the default value of * can be modified via setMaskCodePoint().&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getText() and specified via setText().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Slider ====&lt;br /&gt;
A Slider widget controls a numerical value (float) through the position of a &amp;quot;thumb&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This value is bounded within a maximum by setMaxValue(); the minimum value is set to 0.0f.  The thumb can be dragged to the desired position or moved by clicking on either side of the thumb.  The increment or decrement value is set by setClickStep().&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getCurrentValue() and specified via setCurrentValue().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scrollbar ====&lt;br /&gt;
A Scrollbar widget controls a numerical value (float) through the position of a &amp;quot;thumb&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This value is bounded within a maximum by setDocumentSize(); the minimum value is set to 0.0f.  The thumb can be dragged to the desired position or moved by clicking on either side of the thumb.  The increment or decrement value is set by setPageSize().  The arrow buttons increment or decrement the value by the amount specified with setStepSize().&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getScrollPosition() and specified via setScrollPosition().  Note that the actual maximum value that the scrollbar will return is set by the following formula: document_size - page_size.  Thus, a document of size 100 and a page size of 10 will have a value from 0 to 90.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiLineEditbox ====&lt;br /&gt;
A MultiLineEditbox widget controls printable character values; letters, numbers, punctuations, and symbols.&lt;br /&gt;
&lt;br /&gt;
Unlike the Editbox widget there is no maximal number of characters that can be specified.  The value can be set to readable only (modifications by users are not allowed) via setReadOnly(true).  Text can be automatically wrapped via a call to setWordWrapping(true).&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getText() and specified via setText().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RadioButton ====&lt;br /&gt;
A RadioButton widget controls a single selection among many choices.&lt;br /&gt;
&lt;br /&gt;
The choices are grouped by calling setGroupID().  Only one RadioButton per group ID can be selected; this widget does not support multiple selection.  However it is possible for a choice to possess no decision; initially every RadioButton of a group is unselected.&lt;br /&gt;
&lt;br /&gt;
The currently selected RadioButton can be obtained via getSelectedButtonInGroup().  This RadioButton pointer can then be used to query the ID via getID(), the text (visible label of the RadioButton) via getText(), or user data via getUserData().  A RadioButton can be selected via setSelected(true).  Passing false will deselect the RadioButton, potentially making every RadioButton of the group unselected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Listbox ====&lt;br /&gt;
A Listbox widget controls either a single selection or multiple selections among many choices.  Multiple selections are enabled via setMultiselectEnabled().&lt;br /&gt;
&lt;br /&gt;
The choices are listbox text items (ListboxTextItem) added to the listbox via addItem().  These do not possess a selection indicator by default; one must be specified via setSelectionBrushImage().  The call to ensureItemIsVisible() ensures that the item is visible; the listbox will automatically scroll down if necessary.  The text of the ListboxTextItem can be changed via the setText() function.  However this new text will not be displayed until you call the Listbox's handleUpdatedItemData() function.&lt;br /&gt;
&lt;br /&gt;
The selected ListboxItem can be obtained via getFirstSelectedItem() and subsequent selections through getNextSelected().  A selection can be specified via setItemSelectState().&lt;br /&gt;
&lt;br /&gt;
It is possible for a Listbox to contain list items that are not simply composed of text.  [http://www.cegui.org.uk/wiki/index.php/Create_a_CheckListboxItem CheckListboxItem] demonstrates this advanced feature.  Another approach would be to simulate the behavior of a listbox such that each row is composed of various widgets.  [[PseudoListbox]] demonstrates this.&lt;br /&gt;
&lt;br /&gt;
==== Combobox ====&lt;br /&gt;
A Combobox widget controls a single selection among many choices.&lt;br /&gt;
&lt;br /&gt;
The choices are listbox text items (ListboxTextItem) added to the combobox via addItem().  These do not possess a selection indicator by default; one must be specified via setSelectionBrushImage().&lt;br /&gt;
&lt;br /&gt;
The value of the text within the Editbox can be obtained via getText() and the last selected ListboxItem can be obtained via getSelectedItem().  However there is no guarantee that both are synchronized; typing text within the Editbox will not automatically select the corresponding ListboxItem.  Fortunately the reverse is not true; selecting a ListboxItem will place that text within the Editbox.  Placing the Editbox in read-only mode with setReadOnly(true) can avoid problems.  The current value can be specified via listboxTextItem-&amp;gt;setSelected(true) and a setText(itemCombobox-&amp;gt;getText()).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiColumnList ====&lt;br /&gt;
A MultiColumnList widget controls controls either a single selection or multiple selections among many choices.  Multiple selections are enabled via setSelectionMode(MultiColumnList::RowMultiple).&lt;br /&gt;
&lt;br /&gt;
A MultiColumnList widget may contain a single column or multiple columns.  Columns are added via addColumn(), specifying a label, a column ID, and a column width.&lt;br /&gt;
&lt;br /&gt;
Three steps are required to add a row.  The first step is to add a new row with addRow().  The second step is to create a ListboxTextItem for each cell of the row and specify the selection indicator via setSelectionBrushImage().  The third step is to add the newly created ListboxTextItem to the MultiColumnList via setItem(), specifying the ListboxTextItem, the column ID, and the row ID.&lt;br /&gt;
&lt;br /&gt;
The selected row can be obtained via getFirstSelectedItem() and subsequent selections through getNextSelected().  This will iterate through every selected cell, returning each selected ListboxTextItem .  A selection can be specified via setItemSelectState(); by setting the selection mode to rows (either RowSingle or RowMultiple) you actually only need to select the ListboxTextItem of the first column.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== TabControl ====&lt;br /&gt;
A TabControl widget allows multiple windows to be displayed one at a time, via tab buttons.&lt;br /&gt;
&lt;br /&gt;
Two objects must be created within the Layout Editor to generate a functional tab control.  The first is a window of type &amp;quot;TabControl&amp;quot;.  This will be the parent window of the tab buttons as well as the pages.  The second is a window of type &amp;quot;DefaultWindow&amp;quot;.  This window will be placed within the TabControl (in code via addTab(), not through the Layout Editor) and will specify the contents of a page.  Widgets are to be placed within these TabPane via the Layout Editor.  The &amp;quot;TabButton&amp;quot; windows are not to be specified via the Layout Editor since they will be automatically created when a TabPane is added to the TabControl.&lt;br /&gt;
&lt;br /&gt;
In this demo the TabControl widget was placed within a FrameWindow.  This is not a requirement.  It could have just easily been placed alongside the widgets of the other window.&lt;br /&gt;
&lt;br /&gt;
==== Menu &amp;amp; Popup Menu ====&lt;br /&gt;
&lt;br /&gt;
See [[Menu and Popup]]&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
&lt;br /&gt;
==== WidgetGalore.h ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _WidgetGalore_h_&lt;br /&gt;
#define _WidgetGalore_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;CEGuiSample.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DemoSample : public CEGuiSample&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    bool initialiseSample()&lt;br /&gt;
	{&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			// Retrieve the window manager&lt;br /&gt;
			WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
			// Load the TaharezLook scheme and set up the default mouse cursor and font&lt;br /&gt;
			SchemeManager::getSingleton().loadScheme(&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
			System::getSingleton().setDefaultMouseCursor(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
			if(!FontManager::getSingleton().isFontPresent(&amp;quot;Commonwealth-10&amp;quot;))&lt;br /&gt;
				FontManager::getSingleton().createFont(&amp;quot;Commonwealth-10.font&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Set the GUI Sheet&lt;br /&gt;
			Window* sheet = winMgr.createWindow(&amp;quot;DefaultWindow&amp;quot;, &amp;quot;root_wnd&amp;quot;);&lt;br /&gt;
			System::getSingleton().setGUISheet(sheet);&lt;br /&gt;
&lt;br /&gt;
			// Load a layout&lt;br /&gt;
			Window* guiLayout = winMgr.loadWindowLayout(&amp;quot;WidgetGalore.layout&amp;quot;);&lt;br /&gt;
			sheet-&amp;gt;addChildWindow(guiLayout);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			/* Tooltip */&lt;br /&gt;
			System::getSingleton().setDefaultTooltip(&amp;quot;TaharezLook/Tooltip&amp;quot;); // Set the name of the default tooltip&lt;br /&gt;
			Tooltip* tooltip = System::getSingleton().getDefaultTooltip();&lt;br /&gt;
			tooltip-&amp;gt;setHoverTime(0.5f); // Display the tooltip after the mouse has been hovering over the widget for half a second&lt;br /&gt;
			tooltip-&amp;gt;setDisplayTime(10.0f); // Display for 15 seconds then disappear&lt;br /&gt;
			tooltip-&amp;gt;setFadeTime(1.0f); // Duration of the transition between fully visible and fully invisible&lt;br /&gt;
			// To set the tooltip text for a window simply call setTooltipText()   see staticText for an example&lt;br /&gt;
&lt;br /&gt;
			/* StaticText */&lt;br /&gt;
			DefaultWindow* staticText = static_cast&amp;lt;DefaultWindow*&amp;gt;(winMgr.getWindow(&amp;quot;StaticText&amp;quot;));&lt;br /&gt;
			staticText-&amp;gt;setText(&amp;quot;Red Static Text&amp;quot;);&lt;br /&gt;
			// Colours are specified as aarrggbb in Hexadecimal&lt;br /&gt;
			// Where aa is alpha, rr is red, gg is green, and bb is blue &lt;br /&gt;
			// tl: top left,  tr: top right,  bl: bottom left,  br: bottom right&lt;br /&gt;
			staticText-&amp;gt;setProperty(&amp;quot;TextColours&amp;quot;, &amp;quot;tl:FFFF0000 tr:FFFF0000 bl:FFFF0000 br:FFFF0000&amp;quot;);&lt;br /&gt;
			staticText-&amp;gt;setProperty(&amp;quot;VertFormatting&amp;quot;, &amp;quot;VertCentred&amp;quot;); // TopAligned, BottomAligned, VertCentred&lt;br /&gt;
			staticText-&amp;gt;setProperty(&amp;quot;HorzFormatting&amp;quot;, &amp;quot;HorzCentred&amp;quot;); // LeftAligned, RightAligned, HorzCentred&lt;br /&gt;
				// HorzJustified, WordWrapLeftAligned, WordWrapRightAligned, WordWrapCentred, WordWrapJustified&lt;br /&gt;
			staticText-&amp;gt;setTooltipText(&amp;quot;This is a StaticText widget&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			/* StaticImage */&lt;br /&gt;
			ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;ImageForStaticImage&amp;quot;, &amp;quot;GPN-2000-001437.tga&amp;quot;);&lt;br /&gt;
			DefaultWindow* staticImage = static_cast&amp;lt;DefaultWindow*&amp;gt;(winMgr.getWindow(&amp;quot;StaticImage&amp;quot;));&lt;br /&gt;
			staticImage-&amp;gt;setProperty(&amp;quot;Image&amp;quot;, &amp;quot;set:ImageForStaticImage image:full_image&amp;quot;); // &amp;quot;full_image&amp;quot; is a default name from CEGUIImageset::Imageset()&lt;br /&gt;
&lt;br /&gt;
			/* ProgressBar */&lt;br /&gt;
			ProgressBar* progressBar = static_cast&amp;lt;ProgressBar*&amp;gt;(winMgr.getWindow(&amp;quot;ProgressBar&amp;quot;));&lt;br /&gt;
			progressBar-&amp;gt;setProgress(0.25f); // Initial progress of 25%&lt;br /&gt;
			progressBar-&amp;gt;setStepSize(0.10f); // Calling step() will increase the progress by 10%&lt;br /&gt;
			progressBar-&amp;gt;step(); // Advance the progress by the size specified in setStepSize()&lt;br /&gt;
			progressBar-&amp;gt;adjustProgress(-0.05f); // Adjust the progress by a delta value rather than setting a new value through setProgress&lt;br /&gt;
			float valueProgressBar = progressBar-&amp;gt;getProgress(); // initial 0.25f + step 0.10f - adjustment 0.05f = 0.30f&lt;br /&gt;
&lt;br /&gt;
			/* Button */&lt;br /&gt;
			PushButton* btnClose = static_cast&amp;lt;PushButton*&amp;gt;(winMgr.getWindow(&amp;quot;btnClose&amp;quot;));&lt;br /&gt;
			btnClose-&amp;gt;setText(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			/* ScrollablePane */&lt;br /&gt;
			ScrollablePane* scrollablePane = static_cast&amp;lt;ScrollablePane*&amp;gt;(winMgr.getWindow(&amp;quot;ScrollablePane&amp;quot;));&lt;br /&gt;
			ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;ImageForScrollablePane&amp;quot;, &amp;quot;GPN-2000-001437.tga&amp;quot;);&lt;br /&gt;
			DefaultWindow* staticImageInScrollablePane = static_cast&amp;lt;DefaultWindow*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/StaticImage&amp;quot;, &amp;quot;StaticImageInScrollablePane&amp;quot;));&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setProperty(&amp;quot;Image&amp;quot;, &amp;quot;set:ImageForScrollablePane image:full_image&amp;quot;); // &amp;quot;full_image&amp;quot; is a default name from CEGUIImageset::Imageset()&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(0.0f, 0.0f))); // Start in the upper left corner&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setWidth(UDim(2.0f, 0.0f)); // Twice the width of the parent, the ScrollablePane&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setHeight(UDim(2.0f, 0.0f)); // Twice the height of the parent, the ScrollablePane&lt;br /&gt;
				scrollablePane-&amp;gt;addChildWindow(staticImageInScrollablePane); // Add the image to the // Twice the width of the parent, the ScrollablePane&lt;br /&gt;
			Editbox* editboxInScrollablePane = static_cast&amp;lt;Editbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Editbox&amp;quot;, &amp;quot;EditboxInScrollablePane&amp;quot;));&lt;br /&gt;
				editboxInScrollablePane-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(2.1f, 0.0f))); // Start below the image&lt;br /&gt;
				editboxInScrollablePane-&amp;gt;setWidth(UDim(2.0f, 0.0f)); &lt;br /&gt;
				editboxInScrollablePane-&amp;gt;setHeight(UDim(0.3f, 0.0f));&lt;br /&gt;
				scrollablePane-&amp;gt;addChildWindow(editboxInScrollablePane);&lt;br /&gt;
&lt;br /&gt;
			/* Check box */&lt;br /&gt;
			Checkbox* checkbox = static_cast&amp;lt;Checkbox*&amp;gt;(winMgr.getWindow(&amp;quot;Checkbox&amp;quot;));&lt;br /&gt;
			checkbox-&amp;gt;setSelected( true );&lt;br /&gt;
			bool valueCheckbox = checkbox-&amp;gt;isSelected(); // Retrieve whether it is checked&lt;br /&gt;
&lt;br /&gt;
			/* Spinner */&lt;br /&gt;
			Spinner* spinner = static_cast&amp;lt;Spinner*&amp;gt;(winMgr.getWindow(&amp;quot;Spinner&amp;quot;));&lt;br /&gt;
			spinner-&amp;gt;setTextInputMode(Spinner::FloatingPoint); // FloatingPoint, Integer, Hexadecimal, Octal&lt;br /&gt;
			spinner-&amp;gt;setMinimumValue(-10.0f);&lt;br /&gt;
			spinner-&amp;gt;setMaximumValue(10.0f);&lt;br /&gt;
			spinner-&amp;gt;setStepSize(0.2f);&lt;br /&gt;
			spinner-&amp;gt;setCurrentValue(5.2f);&lt;br /&gt;
			float valueSpinner = spinner-&amp;gt;getCurrentValue(); // Retrieve the value&lt;br /&gt;
&lt;br /&gt;
			/* Editbox */&lt;br /&gt;
			Editbox* editbox = static_cast&amp;lt;Editbox*&amp;gt;(winMgr.getWindow(&amp;quot;Editbox&amp;quot;));&lt;br /&gt;
			editbox-&amp;gt;setText(&amp;quot;Editbox values&amp;quot;);&lt;br /&gt;
			editbox-&amp;gt;setMaxTextLength(13); // The trailing 's' will not be displayed&lt;br /&gt;
			editbox-&amp;gt;setReadOnly(false);&lt;br /&gt;
			editbox-&amp;gt;setTextMasked(false);&lt;br /&gt;
			editbox-&amp;gt;setMaskCodePoint(0x002A); // *&lt;br /&gt;
			String valueEditbox = editbox-&amp;gt;getText(); // Retrieve the text&lt;br /&gt;
&lt;br /&gt;
			/* Slider */&lt;br /&gt;
			Slider* slider = static_cast&amp;lt;Slider*&amp;gt;(winMgr.getWindow(&amp;quot;Slider&amp;quot;));&lt;br /&gt;
			slider-&amp;gt;setMaxValue(100.0f);&lt;br /&gt;
			slider-&amp;gt;setClickStep(10.0f);&lt;br /&gt;
			slider-&amp;gt;setCurrentValue(20.0f);&lt;br /&gt;
			float valueSlider = slider-&amp;gt;getCurrentValue(); // Retrieve the value&lt;br /&gt;
&lt;br /&gt;
			/* Scrollbar (Horizontal) */&lt;br /&gt;
			Scrollbar* scrollbarHorizontal = static_cast&amp;lt;Scrollbar*&amp;gt;(winMgr.getWindow(&amp;quot;HorizontalScrollbar&amp;quot;));&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setDocumentSize(100.0f);&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setPageSize(10.0f);&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setStepSize(1.0f);&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setScrollPosition(75.0f);&lt;br /&gt;
			float valueScrollbarHorizontal = scrollbarHorizontal-&amp;gt;getScrollPosition(); // Retrieve the scroll position&lt;br /&gt;
&lt;br /&gt;
			/* Scrollbar (Vertical) */&lt;br /&gt;
			Scrollbar* scrollbarVertical = static_cast&amp;lt;Scrollbar*&amp;gt;(winMgr.getWindow(&amp;quot;VerticalScrollbar&amp;quot;));&lt;br /&gt;
			scrollbarVertical-&amp;gt;setDocumentSize(100.0f);&lt;br /&gt;
			scrollbarVertical-&amp;gt;setPageSize(10.0f);&lt;br /&gt;
			scrollbarVertical-&amp;gt;setStepSize(1.0f);&lt;br /&gt;
			scrollbarVertical-&amp;gt;setScrollPosition(25.0f);&lt;br /&gt;
			float valueScrollbarVertical = scrollbarVertical-&amp;gt;getScrollPosition(); // Retrieve the scroll position&lt;br /&gt;
&lt;br /&gt;
			/* MultiLineEditbox */&lt;br /&gt;
			MultiLineEditbox* multiLineEditbox = static_cast&amp;lt;MultiLineEditbox*&amp;gt;(winMgr.getWindow(&amp;quot;MultiLineEditbox&amp;quot;));&lt;br /&gt;
			multiLineEditbox-&amp;gt;setText(&amp;quot;MultiLineEditbox value&amp;quot;);&lt;br /&gt;
			multiLineEditbox-&amp;gt;setReadOnly(false);&lt;br /&gt;
			multiLineEditbox-&amp;gt;setWordWrapping(true);&lt;br /&gt;
			String valueMultiLineEditbox = multiLineEditbox-&amp;gt;getText(); // Retrieve the text&lt;br /&gt;
&lt;br /&gt;
			/* RadioButton */&lt;br /&gt;
			RadioButton* radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_A&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
				radioButton-&amp;gt;setID(101);&lt;br /&gt;
				radioButton-&amp;gt;setSelected(true);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_B&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
				radioButton-&amp;gt;setID(102);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_C&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
				radioButton-&amp;gt;setID(103);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_1&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(2);&lt;br /&gt;
				radioButton-&amp;gt;setID(201);&lt;br /&gt;
				radioButton-&amp;gt;setSelected(true);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_2&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(2);&lt;br /&gt;
				radioButton-&amp;gt;setID(202);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_3&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(2);&lt;br /&gt;
				radioButton-&amp;gt;setID(203);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_A&amp;quot;)); // Get handle of one radio button from the group&lt;br /&gt;
			uint valueRadioButtonLetters = radioButton-&amp;gt;getSelectedButtonInGroup()-&amp;gt;getID(); // Get selected ID&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_3&amp;quot;)); // Can obtain the handle of any radio button in the group&lt;br /&gt;
			uint valueRadioButtonNumbers = radioButton-&amp;gt;getSelectedButtonInGroup()-&amp;gt;getID();&lt;br /&gt;
			radioButton-&amp;gt;setSelected(true); // Specify which button should appear selected by default&lt;br /&gt;
&lt;br /&gt;
			/* Listbox */&lt;br /&gt;
			Listbox* listbox = static_cast&amp;lt;Listbox*&amp;gt;(winMgr.getWindow(&amp;quot;Listbox&amp;quot;));&lt;br /&gt;
			listbox-&amp;gt;setMultiselectEnabled(false);&lt;br /&gt;
			ListboxTextItem* itemListbox = new ListboxTextItem(&amp;quot;Value A&amp;quot;, 1);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			itemListbox = new ListboxTextItem(&amp;quot;Value B&amp;quot;, 2);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			itemListbox = new ListboxTextItem(&amp;quot;Value C&amp;quot;, 3);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			itemListbox = new ListboxTextItem(&amp;quot;Value D&amp;quot;, 4);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			listbox-&amp;gt;setItemSelectState(itemListbox, true);&lt;br /&gt;
			listbox-&amp;gt;ensureItemIsVisible(itemListbox);&lt;br /&gt;
			uint valueListbox = listbox-&amp;gt;getFirstSelectedItem()-&amp;gt;getID(); // Retrieve the ID of the selected listbox item&lt;br /&gt;
&lt;br /&gt;
			/* Combobox */&lt;br /&gt;
			Combobox* combobox = static_cast&amp;lt;Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;Combobox&amp;quot;));&lt;br /&gt;
			combobox-&amp;gt;setReadOnly(true);&lt;br /&gt;
			ListboxTextItem* itemCombobox = new ListboxTextItem(&amp;quot;Value 1&amp;quot;, 1);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
			itemCombobox = new ListboxTextItem(&amp;quot;Value 2&amp;quot;, 2);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelected(true); // Select this item&lt;br /&gt;
				combobox-&amp;gt;setText(itemCombobox-&amp;gt;getText()); // Copy the item's text into the Editbox&lt;br /&gt;
			itemCombobox = new ListboxTextItem(&amp;quot;Value 3&amp;quot;, 3);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
			itemCombobox = new ListboxTextItem(&amp;quot;Value 4&amp;quot;, 4);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
			String valueCombobox = combobox-&amp;gt;getText(); // Retrieve the displayed text&lt;br /&gt;
			uint idCombobox = combobox-&amp;gt;getSelectedItem()-&amp;gt;getID(); // Retrieve the ID of the selected combobox item&lt;br /&gt;
&lt;br /&gt;
			/* MultiColumnList */&lt;br /&gt;
			MultiColumnList* multiColumnList = static_cast&amp;lt;MultiColumnList*&amp;gt;(winMgr.getWindow(&amp;quot;MultiColumnList&amp;quot;));\&lt;br /&gt;
			multiColumnList-&amp;gt;addColumn(&amp;quot;Col A&amp;quot;, 0, UDim(0.32f, 0));&lt;br /&gt;
			multiColumnList-&amp;gt;addColumn(&amp;quot;Col B&amp;quot;, 1, UDim(0.32f, 0));&lt;br /&gt;
			multiColumnList-&amp;gt;addColumn(&amp;quot;Col C&amp;quot;, 2, UDim(0.32f, 0));&lt;br /&gt;
			multiColumnList-&amp;gt;setSelectionMode(MultiColumnList::RowSingle); // MultiColumnList::RowMultiple&lt;br /&gt;
			ListboxTextItem* itemMultiColumnList;&lt;br /&gt;
			multiColumnList-&amp;gt;addRow();&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;A1&amp;quot;, 101);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 0, 0); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;B1&amp;quot;, 102);&lt;br /&gt;
				//itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				// By commenting the line above a cell does not specify a selection indicator&lt;br /&gt;
				//  selecting that line will show a &amp;quot;gap&amp;quot; in the selection.&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 1, 0); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;C1&amp;quot;, 103);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 2, 0); // ColumnID, RowID&lt;br /&gt;
			multiColumnList-&amp;gt;addRow();&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;A2&amp;quot;, 201);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 0, 1); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;B2&amp;quot;, 202);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 1, 1); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;C2&amp;quot;, 203);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 2, 1); // ColumnID, RowID&lt;br /&gt;
			MCLGridRef grid_ref(1, 0); // Select according to a grid reference; second row&lt;br /&gt;
			multiColumnList-&amp;gt;setItemSelectState(grid_ref, true);&lt;br /&gt;
			ListboxItem* listboxItem = multiColumnList-&amp;gt;getFirstSelectedItem();&lt;br /&gt;
			uint valueColumnA = listboxItem-&amp;gt;getID(); // Retrieve the value of the selected item from column A&lt;br /&gt;
			listboxItem = multiColumnList-&amp;gt;getNextSelected(listboxItem);&lt;br /&gt;
			uint valueColumnB = listboxItem-&amp;gt;getID(); // Retrieve the value of the selected item from column B&lt;br /&gt;
			listboxItem = multiColumnList-&amp;gt;getNextSelected(listboxItem);&lt;br /&gt;
			uint valueColumnC = listboxItem-&amp;gt;getID(); // Retrieve the value of the selected item from column C&lt;br /&gt;
&lt;br /&gt;
			/* TabControl */&lt;br /&gt;
			TabControl* winTabControl = static_cast&amp;lt;TabControl*&amp;gt;(winMgr.getWindow(&amp;quot;TabControl&amp;quot;));&lt;br /&gt;
			winTabControl-&amp;gt;setTabHeight(UDim(0.15f, 0.0f)); // Make the tab buttons a little bigger&lt;br /&gt;
			Window* tabPage = winMgr.getWindow(&amp;quot;TabPane1&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setText(&amp;quot;Page 1&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setSize(UVector2(UDim(1.0f, 0.0f), UDim(1.0f, 0.0f))); // Size to 100% of its parent, the TabControl&lt;br /&gt;
				tabPage-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(0.0f, 0.0f))); // Move to the upper left corner of its parent&lt;br /&gt;
				winTabControl-&amp;gt;addTab(tabPage);&lt;br /&gt;
			tabPage = winMgr.getWindow(&amp;quot;TabPane2&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setText(&amp;quot;Page 2&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setSize(UVector2(UDim(1.0f, 0.0f), UDim(1.0f, 0.0f))); &lt;br /&gt;
				tabPage-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(0.0f, 0.0f))); &lt;br /&gt;
				winTabControl-&amp;gt;addTab(tabPage);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
		catch(Exception &amp;amp;e)&lt;br /&gt;
		{&lt;br /&gt;
			#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
				MessageBox(NULL, e.getMessage().c_str(), &amp;quot;Error initializing the demo&amp;quot;, MB_OK | MB_ICONERROR | MB_TASKMODAL);&lt;br /&gt;
			#else&lt;br /&gt;
				std::cerr &amp;lt;&amp;lt; &amp;quot;Error initializing the demo:&amp;quot; &amp;lt;&amp;lt; e.getMessage().c_str() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
			#endif&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    void cleanupSample(void)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif // _WidgetGalore_h_&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
	#define WIN32_LEAN_AND_MEAN&lt;br /&gt;
	#define NOMINMAX&lt;br /&gt;
	#include &amp;quot;windows.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;WidgetGalore.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)&lt;br /&gt;
#else&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
#endif&lt;br /&gt;
{&lt;br /&gt;
    DemoSample app;&lt;br /&gt;
    return app.run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== WidgetGalore.layout ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GUILayout &amp;gt;&lt;br /&gt;
    &amp;lt;Window Type=&amp;quot;DefaultWindow&amp;quot; Name=&amp;quot;Root&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;1&amp;lt;/Property&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;InheritsAlpha&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0,0},{0,0},{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;DefaultWindow&amp;quot; Name=&amp;quot;TabPane2&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.72875,0},{0.7185,0},{0.97875,0},{0.9685,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;StaticTextPage2&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;In Page 2:&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.06,0},{0.226667,0},{0.415,0},{0.476667,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;EditBoxPage2&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.420001,0},{0.22,0},{0.99,0},{0.47,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;winTabControl&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Tab Control Window&amp;lt;/Property&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;CaptionColour&amp;quot; Value=&amp;quot;00FFFFFF&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.695627,0},{0.2725,0},{0.993122,0},{0.704167,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/TabControl&amp;quot; Name=&amp;quot;TabControl&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;TabHeight&amp;quot; Value=&amp;quot;{0,0}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;TabTextPadding&amp;quot; Value=&amp;quot;{0,0}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.088566,0},{0.174378,0},{0.931404,0},{0.804637,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnOk&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Ok&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.128412,0},{0.841464,0},{0.365583,0},{0.926003,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnCancel&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Cancel&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.400429,0},{0.841464,0},{0.637601,0},{0.926003,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnApply&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Apply&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.668224,0},{0.843977,0},{0.905394,0},{0.928516,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;DefaultWindow&amp;quot; Name=&amp;quot;TabPane1&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ClippedByParent&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.72875,0},{0.012178,0},{0.97875,0},{0.262178,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;StaticTextPage1&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;In Page 1:&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.06,0},{0.226667,0},{0.415,0},{0.476667,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;EditBoxPage1&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.420001,0},{0.22,0},{0.99,0},{0.47,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;winWidgets&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Dave, it&amp;amp;apos;s full of widgets!&amp;lt;/Property&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;CaptionColour&amp;quot; Value=&amp;quot;00FFFFFF&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.00375,0},{0.143333,0},{0.751248,0},{0.806665,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnClose&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Close&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.732397,0},{0.895137,0},{0.976465,0},{0.975697,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;Editbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.62442,0},{0.090471,0},{0.969776,0},{0.153443,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Checkbox&amp;quot; Name=&amp;quot;Checkbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Check&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.396859,0},{0.944201,0},{0.453147,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Combobox&amp;quot; Name=&amp;quot;Combobox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Combo Box&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.090471,0},{0.613522,0},{0.413287,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxEditTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_A&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;A&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.652856,0},{0.189876,0},{0.704964,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_B&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;B&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.707569,0},{0.189876,0},{0.759678,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_C&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;C&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.761542,0},{0.189876,0},{0.813651,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_1&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;1&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.189876,0},{0.897272,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_2&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;2&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.245152,0},{0.897272,0},{0.30144,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_3&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;3&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.300429,0},{0.897272,0},{0.356717,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/HorizontalScrollbar&amp;quot; Name=&amp;quot;HorizontalScrollbar&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;PageSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;OverlapSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;DocumentSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.185427,0},{0.613522,0},{0.26206,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/VerticalScrollbar&amp;quot; Name=&amp;quot;VerticalScrollbar&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;PageSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;OverlapSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;DocumentSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.026087,0},{0.090471,0},{0.082106,0},{0.606802,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Listbox&amp;quot; Name=&amp;quot;Listbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;List Box&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.626634,0},{0.427903,0},{0.876634,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/MultiColumnList&amp;quot; Name=&amp;quot;MultiColumnList&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.271357,0},{0.816779,0},{0.551507,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/MultiLineEditbox&amp;quot; Name=&amp;quot;MultiLineEditbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;            &lt;br /&gt;
&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.462498,0},{0.626634,0},{0.706566,0},{0.876634,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/ProgressBar&amp;quot; Name=&amp;quot;ProgressBar&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;CurrentProgress&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.559296,0},{0.816779,0},{0.608291,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Slider&amp;quot; Name=&amp;quot;Slider&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;CurrentValue&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaximumValue&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ClickStepSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.099415,0},{0.090471,0},{0.155434,0},{0.606802,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Spinner&amp;quot; Name=&amp;quot;Spinner&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;CurrentValue&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaximumValue&amp;quot; Value=&amp;quot;32767&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MinimumValue&amp;quot; Value=&amp;quot;-32768&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.48995,0},{0.944201,0},{0.551507,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticImage&amp;quot; Name=&amp;quot;StaticImage&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.732397,0},{0.626634,0},{0.976465,0},{0.876634,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;StaticText&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Static Text&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.462498,0},{0.895137,0},{0.706566,0},{0.975697,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/ScrollablePane&amp;quot; Name=&amp;quot;ScrollablePane&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ContentArea&amp;quot; Value=&amp;quot;l:0 t:0 r:0 b:0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;HorzStepSize&amp;quot; Value=&amp;quot;0.1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;VertStepSize&amp;quot; Value=&amp;quot;0.1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;HorzOverlapSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.019063,0},{0.629399,0},{0.157023,0},{0.879399,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;VertOverlapSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;HorzScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;VertScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
    &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;br /&gt;
[[Category:Update requested]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=File_Selection_Dialog&amp;diff=4225</id>
		<title>File Selection Dialog</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=File_Selection_Dialog&amp;diff=4225"/>
				<updated>2011-03-03T23:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
This page list all user contributed dialog. Dialog that can appear in this section includes : &lt;br /&gt;
Colour Selection, File Selection and whatever dialog pleased you. Some of this dialog might later became part of CEGUI but since they are user contribution feel free to add your own work here. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Selection Dialog ==&lt;br /&gt;
[http://www.ogre3d.org/wiki/index.php/CEGUICommonFileDialog File Selection Dialog] on ogre Wiki&lt;br /&gt;
&lt;br /&gt;
[[Category:Uncategorised]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Create_a_CheckListboxItem&amp;diff=4224</id>
		<title>Create a CheckListboxItem</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Create_a_CheckListboxItem&amp;diff=4224"/>
				<updated>2011-03-03T23:56:44Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes you need a list where the items are checkable. The ItemListbox introduced in CEGUI 0.5 accepts all sorts of items, as long as they inherit ItemEntry. I'm going to teach you how to create a CheckListboxItem to put in your list.&lt;br /&gt;
&lt;br /&gt;
== Getting started! ==&lt;br /&gt;
I'm assuming you are just using a standard imageset, with a standard scheme (currently TaharezLook and WindowsLook are supported).&lt;br /&gt;
&lt;br /&gt;
We are first going to get started by writing the looknfeel entry. This is the most important part of this tutorial, as its basically 70% of what we need to do to achieve our goal. First of all, this entry has a few states:&lt;br /&gt;
&lt;br /&gt;
# Enabled: How the item looks when the item is enabled.&lt;br /&gt;
# Disabled: How the item looks when the item is disabled.&lt;br /&gt;
# SelectedEnabled: How the item looks when the item is selected and is enabled.&lt;br /&gt;
# SelectedDisabled: How the item looks when the item is selected and is disabled.&lt;br /&gt;
&lt;br /&gt;
== Writing the requirements ==&lt;br /&gt;
&lt;br /&gt;
Open the appriopiate looknfeel file (WindowsLook.looknfeel or TaharezLook.looknfeel), and place this at the bottom (inside the [[Falagard]] tags though!)&lt;br /&gt;
&lt;br /&gt;
''' Our start '''&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We first need to define a WidgetLook, this is where all the action happens in. It takes one attribute, name. This is simply the name of the widget you are defining. Now we are going to add the states. These states are necessary for the item to respond to certain events. For example, when the item is disabled, the state Disabled is used.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We define a state via StateImagery. It requires the attribute name which specifies what state its in. Don't worry about Layer for now. Section is always used. This part takes care of actually changing the look. It requires a attribute section, this is actually WHAT to change, in this case the label. TextColour is a simple colour (black), we will define it below. Now as you can see the Enabled state just sets the text colour to black, thats all it does. Same goes for Disabled (remember this is an item, items are not commonly disabled).&lt;br /&gt;
&lt;br /&gt;
Now we are going to take a look at the other two states.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These states pretty much speak for themselves altough there are more sections listed. Section not only defines what to change, also defines what needs to be shown. In the Enabled state we dont want it to look like its selected, so there is no selection section. Note that the order of which you put the Sections are also the Z order. In this case we are putting the selection image first, and then text. If we would do it the other way around, we wouldn't see the text.&lt;br /&gt;
&lt;br /&gt;
Now we are going to add the definitions of some colours and property's.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;TextColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectedTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionBrush&amp;quot; initialValue=&amp;quot;set:WindowsLook image:Background&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionColour&amp;quot; initialValue=&amp;quot;FF3030FF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;Selectable&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Our first PropertyDefinition just defines a text for a colour used in the StateImagery sections. Same goes for the other PropertyDefinitions except the SelectionBrush. Instead of defining a colour, it defines a image. In this case it uses the WindowsLook Background image defined in the imageset. Then we got a Property, which simply implies some sort of setting. In this case, we make it a item by adding the Property 'Selectable' and setting it to true as we want it to act like an item.&lt;br /&gt;
&lt;br /&gt;
== Writing the functional parts ==&lt;br /&gt;
&lt;br /&gt;
We now need to add the parts where the background, text and the selection gets drawn. This seems hard, but isn't actually. We are going to start off with a NamedArea. This is required for a listbox item as the listbox needs to know how big the item is to fit it into the list. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;TextColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectedTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionBrush&amp;quot; initialValue=&amp;quot;set:WindowsLook image:Background&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionColour&amp;quot; initialValue=&amp;quot;FF3030FF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;Selectable&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;b&amp;gt;&amp;lt;NamedArea name=&amp;quot;ContentSize&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Width&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;HorzExtent&amp;quot; padding=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Height&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;LineSpacing&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I am assuming you know what the basics like the Area, Dim and such. Though FontDim is used to change the size of the item depending on a label. The part we just added now defines the size of the item.&lt;br /&gt;
Instead of adding the whole code here again, I'm only showing the additions from now on.&lt;br /&gt;
&lt;br /&gt;
Ok! Now we are going to add the actual Checkbox. This is crucial for our goal, as it allows the item to be checked upon click. We dont have to write the states and all that for the Checkbox, we just use Child! Just place this under our NamedArea and above the first StateImagery.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Child type =&amp;quot;WindowsLook/Checkbox&amp;quot; nameSuffix=&amp;quot;__auto__checkbox&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Area&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;LeftEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;AbsoluteDim value=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;TopEdge&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Height&amp;quot;/&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;/Area&amp;gt;&lt;br /&gt;
 &amp;lt;/Child&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This adds a WindowsLook/Checkbox to our item. The suffix is necessary to make the name unique. the rest is pretty straight forward - it adds the checkbox on the left side of the item, starting from 3 pixels to make it look smooth.&lt;br /&gt;
&lt;br /&gt;
Now we need a label, this part is simple and I will not spend as much time on clarifying it, it basically explains itself.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;-3&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The TextComponent simply states this this can contain text. The Dim's are just positioning. Note the LeftEdge, the label starts at 18 pixels from the left. This is because the first ~15 pixels are occupied by the checkbox.&lt;br /&gt;
&lt;br /&gt;
Now something important! The selection image.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;ImageProperty name=&amp;quot;SelectionBrush&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;ColourProperty name=&amp;quot;SelectionColour&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we give it the name selection, as used in the StateImagery. The Area part is just positioning and fitting again. The Dim's used there simply make sure the whole item is filled. ImageProperty defines the image to use. We have defined SelectionBrush at the top of our WidgetLook. It simply fills the Area with that image now. ColourProperty colours the image, we have also defined SelectionColour at the top of the WidgetLook. VertFormat and HorzFormat are stretched, if its not stretched, it will only draw one pixel of the image, making it near invisible. Stretching it just makes sure the whole area is covered.&lt;br /&gt;
&lt;br /&gt;
That was it! We wrote our looknfeel entry!!&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;WidgetLook name=&amp;quot;WindowsLook/CheckListboxItem&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;TextColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectedTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionBrush&amp;quot; initialValue=&amp;quot;set:WindowsLook image:Background&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;PropertyDefinition name=&amp;quot;SelectionColour&amp;quot; initialValue=&amp;quot;FF3030FF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;Selectable&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;NamedArea name=&amp;quot;ContentSize&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Width&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;HorzExtent&amp;quot; padding=&amp;quot;6&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Height&amp;quot; &amp;gt;&lt;br /&gt;
                 &amp;lt;FontDim type=&amp;quot;LineSpacing&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
     &amp;lt;Child type =&amp;quot;WindowsLook/Checkbox&amp;quot; nameSuffix=&amp;quot;__auto__checkbox&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;LeftEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;3&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;0&amp;quot; type=&amp;quot;TopEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;Height&amp;quot;/&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/Child&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;18&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;-3&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;ImageProperty name=&amp;quot;SelectionBrush&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;ColourProperty name=&amp;quot;SelectionColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;Layer&amp;gt;&lt;br /&gt;
               &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                   &amp;lt;ColourProperty name=&amp;quot;TextColour&amp;quot; /&amp;gt;&lt;br /&gt;
               &amp;lt;/Section&amp;gt;&lt;br /&gt;
          &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedEnabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                  &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;SelectedDisabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ColourProperty name=&amp;quot;SelectedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pfew am I glad thats done. &lt;br /&gt;
&lt;br /&gt;
== Coding our item ==&lt;br /&gt;
&lt;br /&gt;
We have come to the part where we actually try out our new item. We need to do a few things to call this one finished. First, we need to create the CheckListboxItem class. Then we are going to add the window factory to the system. Last but not least is adding the [[Falagard]] mapping. We'll start with the CheckListboxItem class.&lt;br /&gt;
&lt;br /&gt;
==== CheckListItem.h ====&lt;br /&gt;
 #ifndef _CHECKLISTITEM_&lt;br /&gt;
 #define _CHECKLISTITEM_&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;CEGUI.h&amp;gt;&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
     class CheckListboxItem : public ItemEntry&lt;br /&gt;
     {&lt;br /&gt;
     protected:&lt;br /&gt;
     public:&lt;br /&gt;
         CheckListboxItem(const String &amp;amp;type, const String &amp;amp;name);&lt;br /&gt;
         virtual ~CheckListboxItem();&lt;br /&gt;
         static const String WidgetTypeName;&lt;br /&gt;
    };&lt;br /&gt;
    CEGUI_DECLARE_WINDOW_FACTORY(CheckListboxItem)&lt;br /&gt;
 }&lt;br /&gt;
 #endif&lt;br /&gt;
&lt;br /&gt;
As you can see, this class inherits ItemEntry. This is necessary as its THE thing that makes this item working properly. Pay special attention to '''CEGUI_DECLARE_WINDOW_FACTORY(CheckListboxItem)'''. This tells CEGUI that we are declarating the window.&lt;br /&gt;
&lt;br /&gt;
==== CheckListItem.cpp ====&lt;br /&gt;
 #include &amp;quot;CheckListItem.h&amp;quot;&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI_DEFINE_WINDOW_FACTORY(CheckListboxItem)&lt;br /&gt;
     const String CheckListboxItem::WidgetTypeName(&amp;quot;CEGUI/CheckListboxItem&amp;quot;);&lt;br /&gt;
     CheckListboxItem::CheckListboxItem(const String &amp;amp;type, const String &amp;amp;name) :&lt;br /&gt;
             ItemEntry(type, name)&lt;br /&gt;
     {&lt;br /&gt;
     }&lt;br /&gt;
     CheckListboxItem::~CheckListboxItem()&lt;br /&gt;
     {&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
'''CEGUI_DEFINE_WINDOW_FACTORY(CheckListboxItem)''' is quite important here. It tells CEGUI where we are placing the code that comes with the window. As you can see this class is quite empty, you are, of course, free to add anything you like to this class - these are just the mere basics.&lt;br /&gt;
&lt;br /&gt;
Now, there is one more important thing to do. Register this window properly in CEGUI.&lt;br /&gt;
&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
 void bindCEGUI()&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI::WindowFactoryManager&amp;amp; wfMgr = CEGUI::WindowFactoryManager::getSingleton();&lt;br /&gt;
     wfMgr.addFactory(&amp;amp;CEGUI_WINDOW_FACTORY(CheckListboxItem));&lt;br /&gt;
     wfMgr.addFalagardWindowMapping(&amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;CEGUI/ItemEntry&amp;quot;, &amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;Falagard/ItemEntry&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
addFalagardWindowMappings parameters are as follows: Name, Type, LooknFeel, WindowRenderer. Just put this code somewhere in your main file or on another place that you are sure is executed before using our new item. Also note, in order to use '''CEGUI_WINDOW_FACTORY()''' you need to be in the CEGUI namespace.&lt;br /&gt;
&lt;br /&gt;
'''Example'''&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;SDLLoader.h&amp;quot;&lt;br /&gt;
 #include &amp;quot;CheckListItem.h&amp;quot;&lt;br /&gt;
 void doStuff();&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 namespace CEGUI&lt;br /&gt;
 {&lt;br /&gt;
 void bindCEGUI()&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI::WindowFactoryManager&amp;amp; wfMgr = CEGUI::WindowFactoryManager::getSingleton();&lt;br /&gt;
     wfMgr.addFactory(&amp;amp;CEGUI_WINDOW_FACTORY(CheckListboxItem));&lt;br /&gt;
     wfMgr.addFalagardWindowMapping(&amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;CEGUI/ItemEntry&amp;quot;, &amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;Falagard/ItemEntry&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 }&lt;br /&gt;
 int main (int argc, char **argv) &lt;br /&gt;
 {&lt;br /&gt;
     SDLLoader sdl;&lt;br /&gt;
     sdl.init();&lt;br /&gt;
     CEGUI::bindCEGUI();&lt;br /&gt;
     doStuff();&lt;br /&gt;
     sdl.main_loop();&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;br /&amp;gt;&lt;br /&gt;
 void doStuff()&lt;br /&gt;
 {&lt;br /&gt;
     CEGUI::System * m_System = CEGUI::System::getSingletonPtr();&lt;br /&gt;
     CEGUI::Logger::getSingletonPtr()-&amp;gt;setLoggingLevel(CEGUI::Insane);&lt;br /&gt;
     CEGUI::WindowManager * m_WndMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
     CEGUI::Window * m_Root = m_System-&amp;gt;getGUISheet();&lt;br /&gt;
     &amp;lt;br /&amp;gt;&lt;br /&gt;
     CEGUI::ItemListbox * lb = (CEGUI::ItemListbox*)m_WndMgr-&amp;gt;createWindow(&amp;quot;WindowsLook/ItemListbox&amp;quot;, &amp;quot;Lol&amp;quot;);&lt;br /&gt;
     lb-&amp;gt;setSize(CEGUI::UVector2(CEGUI::UDim(0.3f, 0.0f), CEGUI::UDim(0.3f, 0.0f)));&lt;br /&gt;
     lb-&amp;gt;setPosition(CEGUI::UVector2(CEGUI::UDim(0.1f, 0.0f), CEGUI::UDim(0.1f, 0.0f)));&lt;br /&gt;
     m_Root-&amp;gt;addChildWindow(lb);&lt;br /&gt;
     &amp;lt;br /&amp;gt;&lt;br /&gt;
     CEGUI::CheckListboxItem * check = (CEGUI::CheckListboxItem*)m_WndMgr-&amp;gt;createWindow(&amp;quot;WindowsLook/CheckListboxItem&amp;quot;, &amp;quot;Test&amp;quot;);&lt;br /&gt;
     check-&amp;gt;setText(&amp;quot;Test&amp;quot;);&lt;br /&gt;
     lb-&amp;gt;addChildWindow(check);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
As you can see in the main function, the function that registers the window is called before actually creating it. Dont pay any attention to the sdl initiation - it's just my personal test environment.&lt;br /&gt;
&lt;br /&gt;
Congratulations! You have just created a CheckListboxItem. This was a very good practice because you also learned the technique required to write a completely new widget.&lt;br /&gt;
&lt;br /&gt;
Please contact me if you have any question, comments, feedback - anything, email me at [mailto:levia@openfrag.org levia at openfrag dot com].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Levia]] 21:10, 5 April 2007 (GMT+1)&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Subversion&amp;diff=4223</id>
		<title>Subversion</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Subversion&amp;diff=4223"/>
				<updated>2011-03-03T23:55:47Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page introduce the use of subversion. If you're only intent is to get the files from subversion you should start with [[Obtaining the library source from Subversion]] which help you in getting the file and compiling CEGUI. This page dive deeper in the use of subversion as a standard user as well as a developer of the library itself. This page presents the use of subversion with the command line tool available for windows, mac and linux. &lt;br /&gt;
&lt;br /&gt;
First of all here is some urls to get started with subersion usage : &lt;br /&gt;
* Repository url: [https://svn.sourceforge.net/svnroot/crayzedsgui/ https://svn.sourceforge.net/svnroot/crayzedsgui/] &lt;br /&gt;
** CEGUI library latest development files url: [https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk]&lt;br /&gt;
** CEGUI Layout Editor latest version url: [https://svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk https://svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk]&lt;br /&gt;
** Repository browser: [http://svn.sourceforge.net/viewcvs.cgi/crayzedsgui/cegui_mk2/ http://svn.sourceforge.net/viewcvs.cgi/crayzedsgui/cegui_mk2/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Glossary ==&lt;br /&gt;
* Repository: That's the place storing all the files and revisions. It's hosted by sourceforge. In Subversion respository are identified using urls.&lt;br /&gt;
* Working Copy: A working copy is a local view of part of the repository. You can retrieve a local copy using the checkout command. A working copy contains the file as well as a lot of additional information. The size of the working copy is more than twice the size of the file of the project. &lt;br /&gt;
* Branches: Subversion does not provides branches concept, however it's possible to organize the project in several branches. The current development branch is known as trunk. The other branches are stored in a folder named .... branches. So a branch in Subversion is just a folder in branches. &lt;br /&gt;
* Tags: Subversion does not provides tags concept. Like branches tags are only subfolder of the tags folder. &lt;br /&gt;
* Revision: Snapshot of the tree at a given time. Each modification on the tree create a new revision. &lt;br /&gt;
&lt;br /&gt;
== Layout of the repository ==&lt;br /&gt;
At this moment there are two projects in the CEGUI repository. The CEGUI library and the layout editor. The repository is organised as follows:&lt;br /&gt;
* cegui_mk2 : The cegui library itself &lt;br /&gt;
** trunk : The main development stream &lt;br /&gt;
** branches : Branches (features testing are prefix with pre-) &lt;br /&gt;
** tags: Release of the CEGUI library &lt;br /&gt;
* CELayoutEditor : The editor files &lt;br /&gt;
** trunk : The main development stream &lt;br /&gt;
** branches : Branches &lt;br /&gt;
** tags: Release of the editor&lt;br /&gt;
&lt;br /&gt;
== Getting a working copy of the project ==&lt;br /&gt;
In order to get the files from the Sourceforge server one can use two commands. Both commands retrieve the files, however the second command excludes you from staying up-to-date or create patches. If you plan to get the sources, create your library, install it and remove them, the second solution is the best for you. &lt;br /&gt;
 svn checkout url [dest_dir] &lt;br /&gt;
 svn co url [dest_dir]&lt;br /&gt;
or &lt;br /&gt;
 svn export url [dest_dir]&lt;br /&gt;
&lt;br /&gt;
Using each of these commands you will get you the latest version of any file with url as root tree. You can get files at a particular revision using an additional parameter: &lt;br /&gt;
 svn checkout/export [-r number] url [dest_dir]. It useful to test older version. There is no named revision in subversion but it's easy to create tags which provides the same features.&lt;br /&gt;
&lt;br /&gt;
== Updating your working copy ==&lt;br /&gt;
When you choose 'checkout', you now have a working copy of the library or the editor. You can keep it in sync with the repository at Sourceforge with the following command: &lt;br /&gt;
 svn update [folder|file]&lt;br /&gt;
 svn up [folder|file]&lt;br /&gt;
&lt;br /&gt;
== Getting history of modifications ==&lt;br /&gt;
In order to get a kind of changelog you can use subversion. Each modification of the repository comes with a text message explaining the last modification. You can get the history of any file or directory of your working copy using:&lt;br /&gt;
 svn log [url]  (remote repository) &lt;br /&gt;
 svn log [path] (working copy)&lt;br /&gt;
&lt;br /&gt;
== Making change to your working copy ==&lt;br /&gt;
There is several change that can be made on subversion repository : adding, removing, renamming and modifying files, adding, removing and renamming directory. A standard work session consists in the following operation. &lt;br /&gt;
# Update your working copy &lt;br /&gt;
# Make your change &lt;br /&gt;
# commit your change &lt;br /&gt;
&lt;br /&gt;
This section focus on the second step of a work session. Files and directory are not handled automatically by subversion you must first explain to subversion that those file must be manage d. This is done using the add command: &lt;br /&gt;
 svn add source.cpp // Add source.cpp to your local subversion copy &lt;br /&gt;
 svn add subdir  // Add subdir to your local subversion copy as well as all file contained in the repository itself &lt;br /&gt;
One of the improvement of subversion compared to CVS is its ability to remove file as well as folder this done by the rm or delete command &lt;br /&gt;
 svn del source.cpp &lt;br /&gt;
Finally you can rename file or directory using the mv command. This command does not allow mass moving like the standard mv command of unix system. rename is an alias of this command. &lt;br /&gt;
 svn mv source dest &lt;br /&gt;
&lt;br /&gt;
You can use any text editor to edit your files. Subversion will do its best to send on the network only the change you've made to your working copy. &lt;br /&gt;
&lt;br /&gt;
''Must talk about loking facilities here''&lt;br /&gt;
&lt;br /&gt;
== Branching, Tagging, Merging ==&lt;br /&gt;
In subversion a branch or a tag is just a folder in the corresponding folders. In order to create a branch one needs to use the copy operation. Copying a complete tree in subversion is cheap. In order to create a branch or tag use the following operation : &lt;br /&gt;
 svn copy url_source url_dest &lt;br /&gt;
I suggest using url of the repository directly. In order to create a branch of CEGUI use : &lt;br /&gt;
 svn copy https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/branches/v0-5&lt;br /&gt;
To create a tag use : &lt;br /&gt;
 svn copy https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/branches/v0-5 https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/tags/v0-5-0 &lt;br /&gt;
&lt;br /&gt;
A final notes on TAG. Nothing prevents someone to make changes on a tag. It's up to the developer to do changes only on trunk and branches. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have fixed a lot of bug in a subsystem or want to apply some of the change made to trunk to a specific branch you have to merge. Merging requires a working copy. &lt;br /&gt;
 svn merge url_from url_to working_copy_path&lt;br /&gt;
&lt;br /&gt;
'' Merging need some improvement ''&lt;br /&gt;
'' Need to add some information on conflict'' &lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
Subversion allows one to attach meta information to any file and folder in the repository. Those information are called properties. The table bellow list most interesting properties: &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
||'''Name'''||'''Values'''||'''Description'''||'''Files||Directories&lt;br /&gt;
|-&lt;br /&gt;
||svn:executable||set/unset||Tel whether the file should be made executable or not||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:mime-type||mime of the file||Tel the mime type of the file. This is use to select the diff algorithm used||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:ignore||*.o *.lo ...||List file to be ignore by svn command||no||yes&lt;br /&gt;
|-&lt;br /&gt;
||svn:keywords||Date,Revision,Author,HeadURL,Id||It allows subversion to automatically substitue some field in the file on check out or update||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:eol-style||native*,CRLF,CR,LF||It allows automatic conversion from one eol style to another||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:externals||svn url||It allows to create soft link between to subversion repository||no||yes&lt;br /&gt;
|-&lt;br /&gt;
||svn:needs-lock||set/unset||Tel whether the file must be locked before editing or not||yes||yes&lt;br /&gt;
|}&lt;br /&gt;
You can also defines your own properties for whatever use you might need them. When one adds a file to subversion it must add the svn:eol-style property to the value native for all text file. It can be made automatically using autoprops facilities of svn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to manipulate properties you can use &lt;br /&gt;
 svn propset name value url/file &lt;br /&gt;
 svn proplist url/file&lt;br /&gt;
 svn propget name url/file &lt;br /&gt;
 svn propdel url/file&lt;br /&gt;
 svn propedit name url/file&lt;br /&gt;
&lt;br /&gt;
== Pitfalls ==&lt;br /&gt;
&lt;br /&gt;
== Configuring subversion ==&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [http://subversion.tigris.org/ Subversion home] (to get the software)&lt;br /&gt;
* [http://svnbook.red-bean.com/ Subversion book] (to learn a lot more than what you read in this page) &lt;br /&gt;
* [http://tortoisesvn.tigris.org/ TortoiseSVN] (Win32 client, a must)&lt;br /&gt;
&lt;br /&gt;
[[Category:CEGUI Developer Team]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Features&amp;diff=4222</id>
		<title>Features</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Features&amp;diff=4222"/>
				<updated>2011-03-03T23:55:36Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CEGUI's main features are:&lt;br /&gt;
&lt;br /&gt;
* Mature codebase, CEGUI has been around since 2003!&lt;br /&gt;
* Multi-platform support - Windows, Linux and Mac OS projects/solutions are available&lt;br /&gt;
* Support for both 32bit and 64bit architectures&lt;br /&gt;
* Heavily data-driven by using XML files, a generic property system and powerful skinning abilities&lt;br /&gt;
* Very flexible, you can code your own widget renderers, use your chosen XML parser, script module, etc...&lt;br /&gt;
* UNICODE support - utf8 and utf32 (check the Fonts sample)&lt;br /&gt;
* Renderers for OpenGL, DirectX 9, DirectX 10, DirectX 11, Irrlicht, Ogre3D, Crystal Space (provided by the Crystal Space team) and Open Scene Graph (provided by the Open Scene Graph team), DirectFB (experimental). A null renderer is provided as well.&lt;br /&gt;
* Clear interface in case you want to write your own renderer&lt;br /&gt;
* Several tools, including a Layout- and Imageset editors&lt;br /&gt;
* Many wiki pages and useful sample projects&lt;br /&gt;
* Commercial products have been developed with CEGUI already. Check the [[Projects Using CEGUI]].&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Most_important_events&amp;diff=4221</id>
		<title>Most important events</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Most_important_events&amp;diff=4221"/>
				<updated>2011-03-03T23:55:28Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is going to show you the most important and useful events of each widget.&lt;br /&gt;
&lt;br /&gt;
=== Getting started ===&lt;br /&gt;
I'm only going to change the initialiseSample function for each widget + adding some others.&lt;br /&gt;
==== EventGalore.h ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _EventGalore_h_&lt;br /&gt;
#define _EventGalore_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;CEGuiSample.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class EventGalore : public CEGuiSample&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
   bool initialiseSample()&lt;br /&gt;
   {&lt;br /&gt;
       try&lt;br /&gt;
       {&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		&lt;br /&gt;
		WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
		// Load the TaharezLook scheme and set up the default mouse cursor and font&lt;br /&gt;
		SchemeManager::getSingleton().loadScheme(&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
		System::getSingleton().setDefaultMouseCursor(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
		if(!FontManager::getSingleton().isFontPresent(&amp;quot;Commonwealth-10&amp;quot;))&lt;br /&gt;
			FontManager::getSingleton().createFont(&amp;quot;Commonwealth-10.font&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// Set the GUI Sheet&lt;br /&gt;
		Window* sheet = winMgr.createWindow(&amp;quot;DefaultWindow&amp;quot;, &amp;quot;root_wnd&amp;quot;);&lt;br /&gt;
		System::getSingleton().setGUISheet(sheet);&lt;br /&gt;
&lt;br /&gt;
		// Place here the code from the widgets, place functions below this function.&lt;br /&gt;
	&lt;br /&gt;
	}&lt;br /&gt;
	catch(CEGUI::Exception &amp;amp;e)&lt;br /&gt;
	{&lt;br /&gt;
		#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
			MessageBox(NULL, e.getMessage().c_str(), &amp;quot;Error initializing the demo&amp;quot;, MB_OK | MB_ICONERROR | MB_TASKMODAL);&lt;br /&gt;
		#else&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;Error initializing the demo:&amp;quot; &amp;lt;&amp;lt; e.getMessage().c_str() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
   }&lt;br /&gt;
   void cleanupSample(void)&lt;br /&gt;
   {&lt;br /&gt;
   }&lt;br /&gt;
};&lt;br /&gt;
#endif // _EventGalore_h_&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
	#define WIN32_LEAN_AND_MEAN&lt;br /&gt;
	#define NOMINMAX&lt;br /&gt;
	#include &amp;quot;windows.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;EventGalore.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)&lt;br /&gt;
#else&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
#endif&lt;br /&gt;
{&lt;br /&gt;
    EventGalore app;&lt;br /&gt;
    return app.run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Widgets ===&lt;br /&gt;
&lt;br /&gt;
==== Window ====&lt;br /&gt;
&lt;br /&gt;
The Window widget is a important baseclass, all widgets inherit this class. It has lots 'n lots of events, where a few are introduced by other widgets, and where many are unimportant. If a event is taken from this Window class, it is mentioned.&lt;br /&gt;
&lt;br /&gt;
* EventDragDropItemEnters - Fired when a drag and drop item floats over the window.&lt;br /&gt;
* EventDragDropItemLeaves - Fired when a drag and drop item floats out of the window.&lt;br /&gt;
* EventDragDropItemDropped - Fired when the item has been dropped on the window.&lt;br /&gt;
&lt;br /&gt;
==== PushButton ====&lt;br /&gt;
&lt;br /&gt;
The button is a simple, expected widget. It contains only one important event, but we are going to add a few more.&lt;br /&gt;
&lt;br /&gt;
* EventClicked - Fired when the button has been clicked.&lt;br /&gt;
* EventMouseEnters - Fired when the mouse enters the widget. Inherited from Window.&lt;br /&gt;
* EventMouseLeaves - Fired when the mouse leaves the widget. Inherited from Window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
PushButton * pushButton = static_cast&amp;lt;PushButton*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Button&amp;quot;, &amp;quot;Button1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(pb);&lt;br /&gt;
pushButton-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
pushButton-&amp;gt;setSize(UVector2(cegui_reldim(0.2f), cegui_reldim(0.08f)));&lt;br /&gt;
pushButton-&amp;gt;setText(&amp;quot;Hey! Come here!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
pushButton-&amp;gt;subscribeEvent(PushButton::EventClicked, Event::Subscriber(&amp;amp;EventGalore::onPushButtonClicked, this));&lt;br /&gt;
pushButton-&amp;gt;subscribeEvent(PushButton::EventMouseEnters, Event::Subscriber(&amp;amp;EventGalore::onMouseEnters, this));&lt;br /&gt;
pushButton-&amp;gt;subscribeEvent(PushButton::EventMouseLeaves, Event::Subscriber(&amp;amp;EventGalore::onMouseLeaves, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onPushButtonClicked(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Our button has been clicked!&lt;br /&gt;
	CEGUI::PushButton * pushButton = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Button1&amp;quot;));&lt;br /&gt;
	pushButton-&amp;gt;setText(&amp;quot;We got clicked!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseEnters(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Mouse has entered the button. (Hover)&lt;br /&gt;
	CEGUI::PushButton * pushButton = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Button1&amp;quot;));&lt;br /&gt;
	pushButton-&amp;gt;setText(&amp;quot;Now click!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseLeaves(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Mouse has left the button.&lt;br /&gt;
	CEGUI::PushButton * pushButton = static_cast&amp;lt;CEGUI::PushButton*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Button1&amp;quot;));&lt;br /&gt;
	// Back to its original state!&lt;br /&gt;
	pushButton-&amp;gt;setText(&amp;quot;Hey! Come here!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Listbox ====&lt;br /&gt;
&lt;br /&gt;
The listbox is a very useful listing widget. Only has one important event.&lt;br /&gt;
&lt;br /&gt;
* EventSelectionChanged - Fired when a or another item has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Listbox * listBox = static_cast&amp;lt;Listbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Listbox&amp;quot;, &amp;quot;Listbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(listBox);&lt;br /&gt;
&lt;br /&gt;
listBox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
listBox-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.4f)));&lt;br /&gt;
			&lt;br /&gt;
ListboxTextItem * listBoxItem = new ListboxTextItem(&amp;quot;Our very first item.&amp;quot;, 1);&lt;br /&gt;
listBoxItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
listBox-&amp;gt;addItem(listBoxItem);&lt;br /&gt;
&lt;br /&gt;
listBoxItem = new ListboxTextItem(&amp;quot;Our second item.&amp;quot;, 2);&lt;br /&gt;
listBoxItem-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
listBox-&amp;gt;addItem(listBoxItem);&lt;br /&gt;
&lt;br /&gt;
listBox-&amp;gt;subscribeEvent(Listbox::EventSelectionChanged, Event::Subscriber(&amp;amp;EventGalore::onSelectionChanged, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onSelectionChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
        // The selection has changed.&lt;br /&gt;
	CEGUI::Listbox * listBox = static_cast&amp;lt;CEGUI::Listbox*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Listbox1&amp;quot;));&lt;br /&gt;
	// Get the item we selected&lt;br /&gt;
	CEGUI::ListboxItem * selectedItem = listBox-&amp;gt;getFirstSelectedItem();&lt;br /&gt;
	selectedItem-&amp;gt;setText(&amp;quot;Oh we got selected!&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Checkbox ====&lt;br /&gt;
&lt;br /&gt;
A checkable item useful for boolean(true or false) 'questions'.&lt;br /&gt;
&lt;br /&gt;
* EventCheckStateChanged - Fired when the checkbox got checked or un-checked.&lt;br /&gt;
* EventMouseEnters - Fired when the mouse hovers over the checkbox. Inherited from Window.&lt;br /&gt;
* EventMouseLeaves - Fired when the mouse moves out of the checkbox. Inherited from Window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Checkbox * checkBox = static_cast&amp;lt;Checkbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Checkbox&amp;quot;, &amp;quot;Checkbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(checkBox);&lt;br /&gt;
checkBox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
checkBox-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.1f)));&lt;br /&gt;
&lt;br /&gt;
// A question where people can only answer yes or no (true or false)&lt;br /&gt;
checkBox-&amp;gt;setText(&amp;quot;Hey! Do you want to be rich?&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
checkBox-&amp;gt;subscribeEvent(Checkbox::EventCheckStateChanged, Event::Subscriber(&amp;amp;EventGalore::onCheckStateChanged, this));&lt;br /&gt;
checkBox-&amp;gt;subscribeEvent(Checkbox::EventMouseEnters, Event::Subscriber(&amp;amp;EventGalore::onMouseEnters, this));&lt;br /&gt;
checkBox-&amp;gt;subscribeEvent(Checkbox::EventMouseLeaves, Event::Subscriber(&amp;amp;EventGalore::onMouseLeaves, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onCheckStateChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Our item has been checked or unchecked, update our item accordingly.&lt;br /&gt;
	updateCheckbox();&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseEnters(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The mouse has entered, update the checkbox accordingly.&lt;br /&gt;
	updateCheckbox();		&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseLeaves(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::Checkbox * checkBox = static_cast&amp;lt;CEGUI::Checkbox*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Checkbox1&amp;quot;));&lt;br /&gt;
	// Reset&lt;br /&gt;
	checkBox-&amp;gt;setText(&amp;quot;Hey! Do you want to be rich?&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
void updateCheckbox()&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::Checkbox * checkBox = static_cast&amp;lt;CEGUI::Checkbox*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Checkbox1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (checkBox-&amp;gt;isSelected())&lt;br /&gt;
	{&lt;br /&gt;
		// Our checkbox is selected, so someone has previously said 'yes'.&lt;br /&gt;
		checkBox-&amp;gt;setText(&amp;quot;Click to choose no!&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		// Our item is not selected, so someone hasn't done anything yet, or it has been previously&lt;br /&gt;
		// unchecked.&lt;br /&gt;
		checkBox-&amp;gt;setText(&amp;quot;Click to choose yes!&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This might confuse at first sight. Let me go through this here, in steps.&lt;br /&gt;
* First, our checkbox is created and our mouse remains still.&lt;br /&gt;
* Second, the mouse enters the checkbox, updateCheckbox is called. In this case, our checkbox isn't selected by default, so the text becomes 'Click to choose yes!'.&lt;br /&gt;
* Third, we click. The onCheckStateChanged function is called, and that function calls updateCheckbox again to instantly change the text again. We have clicked the checkbox, while it wasn't previously checked, this means its checked now. Text becomes 'Click to choose no!'.&lt;br /&gt;
* Fourth, we move our mouse away from the checkbox. The onMouseLeaves function is called, where we reset the text to our question.&lt;br /&gt;
&lt;br /&gt;
==== RadioButton ====&lt;br /&gt;
&lt;br /&gt;
Similar to Checkbox, only it can be grouped, and once selected, it cannot be unselected (except when another button has been selected). Note, in this case, both functions are called when you click the unselected radiobutton. This is because one is unselected and one is selected.&lt;br /&gt;
&lt;br /&gt;
* EventSelectStateChanged - Fired when the radiobutton has been selected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
RadioButton * radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/RadioButton&amp;quot;, &amp;quot;RadioButton1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(radioButton);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
radioButton-&amp;gt;setSize(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
radioButton-&amp;gt;setText(&amp;quot;Yes&amp;quot;);&lt;br /&gt;
radioButton-&amp;gt;setGroupID(0);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;subscribeEvent(RadioButton::EventSelectStateChanged, Event::Subscriber(&amp;amp;EventGalore::onButton1SelectChanged, this));&lt;br /&gt;
// To make sure the event is fired.&lt;br /&gt;
radioButton-&amp;gt;setSelected(true);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/RadioButton&amp;quot;, &amp;quot;RadioButton2&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(radioButton);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.2f)));&lt;br /&gt;
radioButton-&amp;gt;setSize(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
radioButton-&amp;gt;setText(&amp;quot;No&amp;quot;);&lt;br /&gt;
radioButton-&amp;gt;setGroupID(0);&lt;br /&gt;
&lt;br /&gt;
radioButton-&amp;gt;subscribeEvent(RadioButton::EventSelectStateChanged, Event::Subscriber(&amp;amp;EventGalore::onButton2SelectChanged, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onButton1SelectChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::RadioButton * radioButton1 = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;RadioButton1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (radioButton1-&amp;gt;isSelected())&lt;br /&gt;
	{&lt;br /&gt;
		// This one just got selected.&lt;br /&gt;
		radioButton1-&amp;gt;setText(&amp;quot;Ok then. Yes it is.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		// This one got unselected. Reset it.&lt;br /&gt;
		radioButton1-&amp;gt;setText(&amp;quot;Yes&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onButton2SelectChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// We have chosen no.&lt;br /&gt;
	CEGUI::RadioButton * radioButton2 = static_cast&amp;lt;CEGUI::RadioButton*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;RadioButton2&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (radioButton2-&amp;gt;isSelected())&lt;br /&gt;
	{&lt;br /&gt;
		// This one just got selected.&lt;br /&gt;
		radioButton2-&amp;gt;setText(&amp;quot;Ok then. No it is.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		// This one got unselected. Reset it.&lt;br /&gt;
		radioButton2-&amp;gt;setText(&amp;quot;No&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Editbox ====&lt;br /&gt;
&lt;br /&gt;
A simple editable box where text can be entered.&lt;br /&gt;
&lt;br /&gt;
* EventTextAccepted - Fired when someone has pressed TAB or RETURN, or when someone has clicked another window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Editbox * editBox = static_cast&amp;lt;Editbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Editbox&amp;quot;, &amp;quot;Editbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(editBox);&lt;br /&gt;
&lt;br /&gt;
editBox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
editBox-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.1f)));&lt;br /&gt;
editBox-&amp;gt;setText(&amp;quot;Edit me!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
editBox-&amp;gt;subscribeEvent(Editbox::EventTextAccepted, Event::Subscriber(&amp;amp;EventGalore::onTextAccepted, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onTextAccepted(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Our text has been accepted by either deactivating it or pressing tab or enter.&lt;br /&gt;
	CEGUI::Editbox * editBox = static_cast&amp;lt;CEGUI::Editbox*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;Editbox1&amp;quot;));&lt;br /&gt;
	// So we got the text here, do something with it. Lets just..put the text back in reverse order.&lt;br /&gt;
	CEGUI::String currentText = editBox-&amp;gt;getText();&lt;br /&gt;
&lt;br /&gt;
	std::string finalString;&lt;br /&gt;
&lt;br /&gt;
	CEGUI::String::reverse_iterator ppkNode = currentText.rbegin();&lt;br /&gt;
	CEGUI::String::reverse_iterator ppkEnd = currentText.rend();&lt;br /&gt;
&lt;br /&gt;
	for (; ppkNode != ppkEnd; ++ppkNode)&lt;br /&gt;
	{&lt;br /&gt;
		finalString.push_back((*ppkNode));&lt;br /&gt;
	}&lt;br /&gt;
	editBox-&amp;gt;setText(finalString);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== MultiLineEditbox ====&lt;br /&gt;
&lt;br /&gt;
This widget is pretty much the same as editbox, but allows more lines.&lt;br /&gt;
&lt;br /&gt;
* EventTextChanged - Fired when text has been changed. Inherited from window.&lt;br /&gt;
&lt;br /&gt;
This widget doesn't have the event TextAccepted, so you'll need to 'apply' the input by a button for example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
MultiLineEditbox * multiLineEditbox = static_cast&amp;lt;MultiLineEditbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/MultiLineEditbox&amp;quot;, &amp;quot;MultiEditbox1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(multiLineEditbox);&lt;br /&gt;
multiLineEditbox-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
multiLineEditbox-&amp;gt;setSize(UVector2(cegui_reldim(0.3f), cegui_reldim(0.3f)));&lt;br /&gt;
multiLineEditbox-&amp;gt;setText(&amp;quot;Now edit me!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
multiLineEditbox-&amp;gt;subscribeEvent(MultiLineEditbox::EventTextChanged, Event::Subscriber(&amp;amp;EventGalore::onTextChanged, this));&lt;br /&gt;
&lt;br /&gt;
// This text is going to show the result.&lt;br /&gt;
Window * textWindow = winMgr.createWindow(&amp;quot;TaharezLook/StaticText&amp;quot;, &amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
sheet-&amp;gt;addChildWindow(textWindow);&lt;br /&gt;
textWindow-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.5f)));&lt;br /&gt;
textWindow-&amp;gt;setSize(UVector2(cegui_reldim(0.6f), cegui_reldim(0.1f)));&lt;br /&gt;
textWindow-&amp;gt;setText(&amp;quot;Now edit me!&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onTextChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::MultiLineEditbox * multiLineEditbox = static_cast&amp;lt;CEGUI::MultiLineEditbox*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;MultiEditbox1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * textWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	textWindow-&amp;gt;setText(multiLineEditbox-&amp;gt;getText());&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Notice what happens when you enter text on another line though :)&lt;br /&gt;
&lt;br /&gt;
==== FrameWindow ====&lt;br /&gt;
&lt;br /&gt;
This is a window where you usually put your widgets on.&lt;br /&gt;
&lt;br /&gt;
* EventCloseClicked - Fired when the 'X' in the upper right corner is clicked (of the Framewindow).&lt;br /&gt;
* EventRollupToggled - Fired when the window gets rolled up, or rolled down.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
FrameWindow * frameWindow = static_cast&amp;lt;FrameWindow*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/FrameWindow&amp;quot;, &amp;quot;FrameWindow1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(frameWindow)&lt;br /&gt;
frameWindow-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
frameWindow-&amp;gt;setSize(UVector2(cegui_reldim(0.4f), cegui_reldim(0.4f)));&lt;br /&gt;
frameWindow-&amp;gt;setText(&amp;quot;Our window&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
frameWindow-&amp;gt;subscribeEvent(FrameWindow::EventCloseClicked, Event::Subscriber(&amp;amp;EventGalore::onCloseClicked, this));&lt;br /&gt;
frameWindow-&amp;gt;subscribeEvent(FrameWindow::EventRollupToggled, Event::Subscriber(&amp;amp;EventGalore::onRollupToggled, this));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onCloseClicked(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// Someone has clicked the upper right 'X'.&lt;br /&gt;
&lt;br /&gt;
	// We don't HAVE to cast to FrameWindow, as the method we are going to use to close the window&lt;br /&gt;
	// is available in Window, but for the sake of clarity...&lt;br /&gt;
	CEGUI::FrameWindow * frameWindow = static_cast&amp;lt;CEGUI::FrameWindow*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;FrameWindow1&amp;quot;));&lt;br /&gt;
	frameWindow-&amp;gt;destroy();&lt;br /&gt;
	// Note: Dont try to delete the pointer.&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onRollupToggled(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::FrameWindow * frameWindow = static_cast&amp;lt;CEGUI::FrameWindow*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;FrameWindow1&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	if (frameWindow-&amp;gt;isRolledup())&lt;br /&gt;
	{&lt;br /&gt;
		frameWindow-&amp;gt;setText(&amp;quot;Rolled up&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		frameWindow-&amp;gt;setText(&amp;quot;Our window&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ProgressBar ====&lt;br /&gt;
&lt;br /&gt;
A progress widget.&lt;br /&gt;
&lt;br /&gt;
* EventProgressDone - Fired when the progress bar reaches 100%(1.0f).&lt;br /&gt;
* EventProgressChanged - Fired when the progress changes.&lt;br /&gt;
* EventMouseClick - Fired when someone clicked on the window. Inherited from Window.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
ProgressBar * progressBar = static_cast&amp;lt;ProgressBar*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/ProgressBar&amp;quot;, &amp;quot;ProgressBar1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(progressBar);&lt;br /&gt;
progressBar-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
progressBar-&amp;gt;setSize(UVector2(cegui_reldim(0.5f), cegui_reldim(0.04f)));&lt;br /&gt;
&lt;br /&gt;
progressBar-&amp;gt;subscribeEvent(ProgressBar::EventProgressDone, Event::Subscriber(&amp;amp;EventGalore::onProgressDone, this));&lt;br /&gt;
progressBar-&amp;gt;subscribeEvent(ProgressBar::EventProgressChanged, Event::Subscriber(&amp;amp;EventGalore::onProgressChanged, this));&lt;br /&gt;
progressBar-&amp;gt;subscribeEvent(ProgressBar::EventMouseClick, Event::Subscriber(&amp;amp;EventGalore::onMouseClick, this));&lt;br /&gt;
&lt;br /&gt;
Window * resultWindow = winMgr.createWindow(&amp;quot;TaharezLook/StaticText&amp;quot;, &amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
sheet-&amp;gt;addChildWindow(resultWindow);&lt;br /&gt;
resultWindow-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.05f)));&lt;br /&gt;
resultWindow-&amp;gt;setSize(UVector2(cegui_reldim(0.5f), cegui_reldim(0.06f)));&lt;br /&gt;
resultWindow-&amp;gt;setText(&amp;quot;Lets start progressing!&amp;quot;);&lt;br /&gt;
resultWindow-&amp;gt;setProperty(&amp;quot;FrameEnabled&amp;quot;, &amp;quot;false&amp;quot;);&lt;br /&gt;
resultWindow-&amp;gt;setProperty(&amp;quot;BackgroundEnabled&amp;quot;, &amp;quot;false&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onProgressDone(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The progress bar is full.&lt;br /&gt;
	CEGUI::Window * resultWindow = CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(&amp;quot;We are done!&amp;quot;);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onProgressChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The progress changed.&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::ProgressBar * progressBar = static_cast&amp;lt;CEGUI::ProgressBar*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;ProgressBar1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * resultWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	float progress = progressBar-&amp;gt;getProgress();&lt;br /&gt;
	int finalProgress = static_cast&amp;lt;int&amp;gt;(progress*100);&lt;br /&gt;
	std::stringstream resultStr;&lt;br /&gt;
	resultStr &amp;lt;&amp;lt; &amp;quot;Progress: &amp;quot; &amp;lt;&amp;lt; finalProgress &amp;lt;&amp;lt; &amp;quot;%&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(resultStr.str());&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onMouseClick(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::ProgressBar * progressBar = static_cast&amp;lt;CEGUI::ProgressBar*&amp;gt;(CEGUI::WindowManager::getSingletonPtr()-&amp;gt;getWindow(&amp;quot;ProgressBar1&amp;quot;));&lt;br /&gt;
	progressBar-&amp;gt;setProgress(progressBar-&amp;gt;getProgress() + 0.05f);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Slider ====&lt;br /&gt;
&lt;br /&gt;
A widget which accepts input though moving a 'thumb' between a range.&lt;br /&gt;
&lt;br /&gt;
* EventValueChanged - Fired when the slider's thumb has moved one step left or right.&lt;br /&gt;
* EventThumbTrackEnded - Fired when the user stops moving the slider's thumb. Handy when a change causes an CPU expensive operation, because now you only catch the 'final' change.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Slider * slider = static_cast&amp;lt;Slider*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Slider&amp;quot;, &amp;quot;Slider1&amp;quot;));&lt;br /&gt;
sheet-&amp;gt;addChildWindow(slider);&lt;br /&gt;
slider-&amp;gt;setPosition(UVector2(cegui_reldim(0.1f), cegui_reldim(0.1f)));&lt;br /&gt;
slider-&amp;gt;setSize(UVector2(cegui_reldim(0.5f), cegui_reldim(0.04f)));&lt;br /&gt;
slider-&amp;gt;setMaxValue(1.0f);&lt;br /&gt;
slider-&amp;gt;setClickStep(0.1f);&lt;br /&gt;
slider-&amp;gt;setCurrentValue(0.5f); // Start half way&lt;br /&gt;
&lt;br /&gt;
slider-&amp;gt;subscribeEvent(Slider::EventValueChanged, Event::Subscriber(&amp;amp;EventGalore::onSliderValueChanged, this));&lt;br /&gt;
slider-&amp;gt;subscribeEvent(Slider::EventProgressChanged, Event::Subscriber(&amp;amp;EventGalore::onSliderChangeEnded, this));&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
bool onSliderValueChanged(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The slider moved.&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::Slider * slider = static_cast&amp;lt;CEGUI::Slider*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;Slider1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * resultWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        std::stringstream resultStr;&lt;br /&gt;
	resultStr &amp;lt;&amp;lt; &amp;quot;Moved to: &amp;quot; &amp;lt;&amp;lt; slider-&amp;gt;getCurrentValue();&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(resultStr);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool onSliderChangeEnded(const CEGUI::EventArgs &amp;amp;e)&lt;br /&gt;
{&lt;br /&gt;
	// The slider stopped moving (user released mouse)&lt;br /&gt;
	CEGUI::WindowManager * winMgr = CEGUI::WindowManager::getSingletonPtr();&lt;br /&gt;
	CEGUI::Slider * slider = static_cast&amp;lt;CEGUI::Slider*&amp;gt;(winMgr-&amp;gt;getWindow(&amp;quot;Slider1&amp;quot;));&lt;br /&gt;
	CEGUI::Window * resultWindow = winMgr-&amp;gt;getWindow(&amp;quot;StaticText1&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        std::stringstream resultStr;&lt;br /&gt;
	resultStr &amp;lt;&amp;lt; &amp;quot;Moving stopped at: &amp;quot; &amp;lt;&amp;lt; slider-&amp;gt;getCurrentValue();&lt;br /&gt;
&lt;br /&gt;
	resultWindow-&amp;gt;setText(resultStr);&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spinner ====&lt;br /&gt;
&lt;br /&gt;
==== MultiColumnList ====&lt;br /&gt;
&lt;br /&gt;
[[Category:Uncategorised]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Creating_a_sub_image&amp;diff=4220</id>
		<title>Creating a sub image</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Creating_a_sub_image&amp;diff=4220"/>
				<updated>2011-03-03T23:55:17Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Spelling fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}} {{VersionBadge|0.6}} {{VersionBadge|0.7}}&lt;br /&gt;
&lt;br /&gt;
I found that it might be useful to be able to create a subimage from an image. Say for instance u have a minimap created from a file, and you want to be able to zoom it. For this purpose it's best to use a subimage from the map. Basically this code can be used to complete that task:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
//this function is just called to show the imageloading from a file, and selecting a subpart of the image&lt;br /&gt;
void GUIHud::createMMap()&lt;br /&gt;
{&lt;br /&gt;
	//load in a file, replace with your own file&lt;br /&gt;
	CEGUI::Texture* texture = mGUIRenderer-&amp;gt;createTexture(&amp;quot;Ground1.bmp&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	//create a new imageset with an image that spans the entire texture&lt;br /&gt;
	CEGUI::Imageset* set = CEGUI::ImagesetManager::getSingleton().createImageset((CEGUI::utf8*)&amp;quot;ExampleImageSet&amp;quot;,texture);&lt;br /&gt;
	set-&amp;gt;defineImage(&amp;quot;Base&amp;quot;,CEGUI::Point(0.0f,0.0f),CEGUI::Size(texture-&amp;gt;getWidth(),texture-&amp;gt;getHeight()),CEGUI::Point(0.0f,0.0f));&lt;br /&gt;
&lt;br /&gt;
	//create a new window for this stuff and link the created image to it&lt;br /&gt;
	CEGUI::StaticImage* renderTarget = (CEGUI::StaticImage*)CEGUI::WindowManager::getSingleton().createWindow((CEGUI::utf8*)&amp;quot;SEM/StaticImage&amp;quot;, (CEGUI::utf8*)&amp;quot;BaseWindow&amp;quot;);&lt;br /&gt;
	renderTarget-&amp;gt;setSize(CEGUI::Size(0.3f, 0.4f));&lt;br /&gt;
	CEGUI::WindowManager::getSingleton().getWindow((CEGUI::utf8*)topElement)-&amp;gt;addChildWindow(renderTarget);&lt;br /&gt;
        renderTarget-&amp;gt;setPosition(CEGUI::Point(0.6, 0.6));&lt;br /&gt;
	renderTarget-&amp;gt;setImage(&amp;amp;set-&amp;gt;getImage((CEGUI::utf8*)&amp;quot;Base&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
	/*this function replaces the image with the new coordinates passed with it, which selects a subimage,&lt;br /&gt;
	 and replaces the given image with the newly created one */&lt;br /&gt;
	createSubImage(&amp;quot;ExampleImageSet&amp;quot;,&amp;quot;Base&amp;quot;,CEGUI::Point(0.0f,0.0f),CEGUI::Size(texture-&amp;gt;getWidth()-512,texture-&amp;gt;getHeight()-512),CEGUI::Point(0.0f,0.0f));&lt;br /&gt;
	&lt;br /&gt;
	//should not be necessary, if anything weird appears try redrawing the image&lt;br /&gt;
	//renderTarget-&amp;gt;requestRedraw();&lt;br /&gt;
}&lt;br /&gt;
//this function replaces the image in the given imageset with the new coordinates that are passed with this function&lt;br /&gt;
void GUIHud::createSubImage(CEGUI::String imageSetName,CEGUI::String imageName, CEGUI::Point start, CEGUI::Size size,CEGUI::Point offset)&lt;br /&gt;
{&lt;br /&gt;
	CEGUI::Imageset* curr_imageset = CEGUI::ImagesetManager::getSingleton().getImageset(imageSetName);&lt;br /&gt;
	CEGUI::Texture* texture = curr_imageset-&amp;gt;getTexture();&lt;br /&gt;
	curr_imageset-&amp;gt;undefineImage(imageName);&lt;br /&gt;
	curr_imageset-&amp;gt;defineImage(imageName,start,size,offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
this code was written with Ogre, but the main lines of it should be clear i think.&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=XML_File_formats&amp;diff=4219</id>
		<title>XML File formats</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=XML_File_formats&amp;diff=4219"/>
				<updated>2011-03-03T23:53:30Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Scheme files]] - Reference manual for the scheme XML format.&lt;br /&gt;
* [[Layout files]] - Reference manual for the layout XML format.&lt;br /&gt;
* [[Imageset files]] - Reference manual for the layout XML format.&lt;br /&gt;
* [[Font files]] - Reference manual for the font XML format.&lt;br /&gt;
* Looknfeel files - Check the [[falagard Skinning System Documentation]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Related Documents ===&lt;br /&gt;
* [[Overview of GUI files]] - an brief overview of what role each these xml files plays.&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Writing_CEGUI_scripts&amp;diff=4218</id>
		<title>Writing CEGUI scripts</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Writing_CEGUI_scripts&amp;diff=4218"/>
				<updated>2011-03-03T23:53:20Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}}&lt;br /&gt;
The code on this page is Lua script using the CEGUILua bindings available in CEGUI 0.4.&lt;br /&gt;
The code snippets might not be specifically useful, but they should show off some of the posibilities with CEGUI and Lua used together. And give an idea of how to write these scripts.&lt;br /&gt;
&lt;br /&gt;
Off we go :)&lt;br /&gt;
&lt;br /&gt;
--[[User:Lindquist]] 20:56, 9 Jun 2005 (BST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Change logging level ==&lt;br /&gt;
 local logger = CEGUI.Logger:getSingleton()	-- get the logger&lt;br /&gt;
 local lvl = logger:getLoggingLevel()		-- get logging level&lt;br /&gt;
 &lt;br /&gt;
 if lvl &amp;lt; CEGUI.Insane then			-- if logging level is less than insane&lt;br /&gt;
 	logger:setLoggingLevel(lvl+1)		-- then increase it&lt;br /&gt;
 end&lt;br /&gt;
Bumps up the logging level a notch unless we're already at Insane.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Load a scheme ==&lt;br /&gt;
 CEGUI.SchemeManager:getSingleton():loadScheme(&amp;quot;../datafiles/schemes/TaharezLook.scheme&amp;quot;)&lt;br /&gt;
Loads the TaharezLook scheme.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Simple Interface ==&lt;br /&gt;
 -- create the GUI sheet&lt;br /&gt;
 local sheet = CEGUI.WindowManager:getSingleton():createWindow(&amp;quot;DefaultGUISheet&amp;quot;,&amp;quot;root&amp;quot;);&lt;br /&gt;
 CEGUI.System:getSingleton():setGUISheet(sheet) -- and attach it to the system&lt;br /&gt;
 &lt;br /&gt;
 -- create a FrameWindow&lt;br /&gt;
 local fw = CEGUI.WindowManager:getSingleton():createWindow(&amp;quot;TaharezLook/FrameWindow&amp;quot;,&amp;quot;framewnd&amp;quot;);&lt;br /&gt;
 -- add it to the sheet&lt;br /&gt;
 sheet:addChildWindow(fw)&lt;br /&gt;
 &lt;br /&gt;
 -- set its size and position&lt;br /&gt;
 local sz = CEGUI.Size(0.5,0.5)&lt;br /&gt;
 local pos = CEGUI.Point(0.2,0.1)&lt;br /&gt;
 fw:setSize(sz)&lt;br /&gt;
 fw:setPosition(pos)&lt;br /&gt;
 -- disable user sizing&lt;br /&gt;
 fw:setProperty(&amp;quot;SizingEnabled&amp;quot;,&amp;quot;False&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 -- make the close button work&lt;br /&gt;
 fw:subscribeEvent(&amp;quot;CloseClicked&amp;quot;,&amp;quot;fwCloseClicked&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 -- the CloseClicked event handler&lt;br /&gt;
 function fwCloseClicked(eventArgs)&lt;br /&gt;
 	local we = CEGUI.toWindowEventArgs(eventArgs)&lt;br /&gt;
 	CEGUI.WindowManager:getSingleton():destroyWindow(we.window) -- destroy the frame window&lt;br /&gt;
 end&lt;br /&gt;
Creates a GUISheet and attaches it to the System. Then creates a FrameWindow, sets its size and position. Disables the sizing feature and subscribes a scripted event handler to destroy the window when the close button is clicked.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Alternative casting ==&lt;br /&gt;
 -- the CloseClicked event handler&lt;br /&gt;
 function fwCloseClicked(eventArgs)&lt;br /&gt;
 	local we = tolua.cast(eventArgs,&amp;quot;CEGUI::WindowEventArgs&amp;quot;)&lt;br /&gt;
 	CEGUI.WindowManager:getSingleton():destroyWindow(we.window) -- destroy the frame window&lt;br /&gt;
 end&lt;br /&gt;
A modified close button click handler (from the previous snippet) showing an alternative way to cast EventArgs to WindowEventArgs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Load a layout ==&lt;br /&gt;
 local w = CEGUI.WindowManager:getSingleton():loadWindowLayout(&amp;quot;../datafiles/layouts/test.layout&amp;quot;)&lt;br /&gt;
 CEGUI.System:getSingleton():getGUISheet():addChildWindow(w)&lt;br /&gt;
Loads a XML layout and adds the returned window to the active GUISheet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Menubar with popup ==&lt;br /&gt;
 -- we'll be using the window manager quite alot&lt;br /&gt;
 local wmgr = CEGUI.WindowManager:getSingleton()&lt;br /&gt;
 &lt;br /&gt;
 -- do the menubar&lt;br /&gt;
 local bar = wmgr:createWindow(&amp;quot;WindowsLook/Menubar&amp;quot;,&amp;quot;the_menu_bar&amp;quot;)&lt;br /&gt;
 bar:setSize(CEGUI.Size(1,0.1))&lt;br /&gt;
 CEGUI.System:getSingleton():getGUISheet():addChildWindow(bar)&lt;br /&gt;
 &lt;br /&gt;
 -- add a menuitem to the bar&lt;br /&gt;
 local item = wmgr:createWindow(&amp;quot;WindowsLook/MenubarItem&amp;quot;,&amp;quot;the_menu_bar_item&amp;quot;)&lt;br /&gt;
 item:setText(&amp;quot;Bar item&amp;quot;)&lt;br /&gt;
 bar:addChildWindow(item)&lt;br /&gt;
 &lt;br /&gt;
 -- add a popupmenu to the bar's menuitem&lt;br /&gt;
 local pop = wmgr:createWindow(&amp;quot;WindowsLook/PopupMenu&amp;quot;,&amp;quot;the_popup_menu&amp;quot;)&lt;br /&gt;
 item:addChildWindow(pop)&lt;br /&gt;
 &lt;br /&gt;
 -- add a few menuitems to the popup&lt;br /&gt;
 item = wmgr:createWindow(&amp;quot;WindowsLook/PopupMenuItem&amp;quot;,&amp;quot;the_popup_menu_item_1&amp;quot;)&lt;br /&gt;
 item:setText(&amp;quot;Popup item 1&amp;quot;)&lt;br /&gt;
 pop:addChildWindow(item)&lt;br /&gt;
 &lt;br /&gt;
 item = wmgr:createWindow(&amp;quot;WindowsLook/PopupMenuItem&amp;quot;,&amp;quot;the_popup_menu_item_2&amp;quot;)&lt;br /&gt;
 item:setText(&amp;quot;Popup item 2&amp;quot;)&lt;br /&gt;
 pop:addChildWindow(item)&lt;br /&gt;
Creates a simple menubar and adds a popupmenu with two items to it.&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Using_CEGUI_with_SDL_and_OpenGL&amp;diff=4217</id>
		<title>Using CEGUI with SDL and OpenGL</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Using_CEGUI_with_SDL_and_OpenGL&amp;diff=4217"/>
				<updated>2011-03-03T23:53:11Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.6}} {{VersionBadge|0.5}}&lt;br /&gt;
[http://www.libsdl.org SDL (Simple DirectMedia Layer)] is an excellent library for writing portable games and other multimedia applications, but as it is a low-level library, it has no native support for GUI interfaces.&lt;br /&gt;
&lt;br /&gt;
When using [http://www.opengl.org OpenGL] for rendering, using CEGUI with SDL is not hard.&lt;br /&gt;
&lt;br /&gt;
I'll assume that you've read the imbiciles tutorials, and have used SDL with OpenGL.&lt;br /&gt;
And know C / C++ ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Initialisation ===&lt;br /&gt;
Before we can do anything, we need to initialise our libraries.&lt;br /&gt;
First SDL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (SDL_Init(SDL_INIT_VIDEO)&amp;lt;0)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr, &amp;quot;Unable to initialise SDL: %s&amp;quot;, SDL_GetError());&lt;br /&gt;
  exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here we initialise SDL with video support. We need this for CEGUI.&lt;br /&gt;
O.K. now SDL is ready to go. So let's fire up OpenGL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (SDL_SetVideoMode(800,600,0,SDL_OPENGL)==NULL)&lt;br /&gt;
{&lt;br /&gt;
  fprintf(stderr, &amp;quot;Unable to set OpenGL videomode: %s&amp;quot;, SDL_GetError());&lt;br /&gt;
  SDL_Quit();&lt;br /&gt;
  exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now OpenGL is ready. But we still need to set a decent configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glEnable(GL_CULL_FACE);&lt;br /&gt;
glDisable(GL_FOG);&lt;br /&gt;
glClearColor(0.0f,0.0f,0.0f,1.0f);&lt;br /&gt;
glViewport(0,0, 800,600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The OpenGL renderer that comes with CEGUI sets the matrices itself, so if you're using CEGUI for all your rendering needs this would be fine. Normally you would want the normal perspective projection setup though:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
glMatrixMode(GL_PROJECTION);&lt;br /&gt;
glLoadIdentity();&lt;br /&gt;
gluPerspective(45.0, 800.0/600.0, 0.1,100.0);&lt;br /&gt;
glMatrixMode(GL_MODELVIEW);&lt;br /&gt;
glLoadIdentity();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDL and OpenGL are now both ready for action. So it's time to initialise CEGUI.&lt;br /&gt;
First we need the renderer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;renderers/OpenGLGUIRenderer/openglrenderer.h&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It must be created before starting CEGUI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::OpenGLRenderer* renderer = new CEGUI::OpenGLRenderer(0,800,600);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then the CEGUI::System must be initialised:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
new CEGUI::System(renderer);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remember that you have to load a widget set, set the mouse cursor and a default font before CEGUI is completely ready. This is described in the other tutorials.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
By default the SDL cursor is displayed, so we'll remove that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
SDL_ShowCursor(SDL_DISABLE);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As keypress characters needs to be injected into CEGUI, we activate unicode translation for SDL key events:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
SDL_EnableUNICODE(1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes it alot easier as we don't have to worry about modifier keys and keyboard layouts ourselves. More about this later on...&lt;br /&gt;
&lt;br /&gt;
Key repeat is a nice feature for the text input widgets in CEGUI, so we use SDL to generate them:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Everything is ready now, and we can start the main loop :)&lt;br /&gt;
&lt;br /&gt;
=== The Main Loop ===&lt;br /&gt;
To make it all happen, we use a simple main loop that just keeps pushing on those frames:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void main_loop()&lt;br /&gt;
{&lt;br /&gt;
  bool must_quit = false;&lt;br /&gt;
  &lt;br /&gt;
  // get &amp;quot;run-time&amp;quot; in seconds&lt;br /&gt;
  double last_time_pulse = 0.001*static_cast&amp;lt;double&amp;gt;(SDL_GetTicks());&lt;br /&gt;
  &lt;br /&gt;
  while (!must_quit)&lt;br /&gt;
  {&lt;br /&gt;
    inject_input(must_quit);&lt;br /&gt;
    inject_time_pulse(last_time_pulse);&lt;br /&gt;
    render_gui();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function will run the main loop until the ''bool'' value ''must_quit'' becomes ''true''. In this tutorial this will happen when the user clicks the close button provided by the window manager.&lt;br /&gt;
&lt;br /&gt;
The ''double'' value ''last_time_pulse'' holds the time of the latest time pulse injection. More about this later.&lt;br /&gt;
&lt;br /&gt;
Each function in the ''while'' loop will be described below.&lt;br /&gt;
&lt;br /&gt;
There are endless ways of making your main loop. I took a simple approach to ease writing this tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Injecting Input and injecting change of window size ===&lt;br /&gt;
When the user press or release keyboard or mouse buttons, we need to tell CEGUI about it, for this we use the injection functions of ''CEGUI::System''. We also have to tell &lt;br /&gt;
&lt;br /&gt;
Here is what our inject_input function looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void inject_input(bool&amp;amp; must_quit)&lt;br /&gt;
{&lt;br /&gt;
  SDL_Event e;&lt;br /&gt;
  &lt;br /&gt;
  // go through all available events&lt;br /&gt;
  while (SDL_PollEvent(&amp;amp;e))&lt;br /&gt;
  {&lt;br /&gt;
    // we use a switch to determine the event type&lt;br /&gt;
    switch (e.type)&lt;br /&gt;
    {&lt;br /&gt;
      // mouse motion handler&lt;br /&gt;
      case SDL_MOUSEMOTION:&lt;br /&gt;
        // we inject the mouse position directly.&lt;br /&gt;
        CEGUI::System::getSingleton().injectMousePosition(&lt;br /&gt;
          static_cast&amp;lt;float&amp;gt;(e.motion.x),&lt;br /&gt;
          static_cast&amp;lt;float&amp;gt;(e.motion.y)&lt;br /&gt;
        );&lt;br /&gt;
        break;&lt;br /&gt;
    &lt;br /&gt;
      // mouse down handler&lt;br /&gt;
      case SDL_MOUSEBUTTONDOWN:&lt;br /&gt;
        // let a special function handle the mouse button down event&lt;br /&gt;
        handle_mouse_down(e.button.button);&lt;br /&gt;
        break;&lt;br /&gt;
    &lt;br /&gt;
      // mouse up handler&lt;br /&gt;
      case SDL_MOUSEBUTTONUP:&lt;br /&gt;
        // let a special function handle the mouse button up event&lt;br /&gt;
        handle_mouse_up(e.button.button);&lt;br /&gt;
        break;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
      // key down&lt;br /&gt;
      case SDL_KEYDOWN:&lt;br /&gt;
        // to tell CEGUI that a key was pressed, we inject the scancode.&lt;br /&gt;
        CEGUI::System::getSingleton().injectKeyDown(e.key.keysym.scancode);&lt;br /&gt;
        &lt;br /&gt;
        // as for the character it's a litte more complicated. we'll use for translated unicode value.&lt;br /&gt;
        // this is described in more detail below.&lt;br /&gt;
        if ((e.key.keysym.unicode != 0)&lt;br /&gt;
        {&lt;br /&gt;
          CEGUI::System::getSingleton().injectChar(e.key.keysym.unicode);&lt;br /&gt;
        }&lt;br /&gt;
        break;&lt;br /&gt;
    &lt;br /&gt;
      // key up&lt;br /&gt;
      case SDL_KEYUP:&lt;br /&gt;
        // like before we inject the scancode directly.&lt;br /&gt;
        CEGUI::System::getSingleton().injectKeyUp(e.key.keysym.scancode);&lt;br /&gt;
        break;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
      // WM quit event occured&lt;br /&gt;
      case SDL_QUIT:&lt;br /&gt;
        must_quit = true;&lt;br /&gt;
        break;&lt;br /&gt;
    &lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
First I'll explain the events that get handled directly in the ''inject_input'' function.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Mouse Motion''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// we inject the mouse position directly.&lt;br /&gt;
CEGUI::System::getSingleton().injectMousePosition(&lt;br /&gt;
  static_cast&amp;lt;float&amp;gt;(e.motion.x),&lt;br /&gt;
  static_cast&amp;lt;float&amp;gt;(e.motion.y)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is nothing special here. Like stated in the comment the mouse position is just injected directly.&lt;br /&gt;
&lt;br /&gt;
There are two ways of injecting mouse motion. One where you inject how much the cursor moved, and one where you inject the mouse cursor position. The last one is failsafe.&lt;br /&gt;
Then first one only works correctly in fullscreen mode, or with input grabbed. The reason for this is that in regular windowed mode, the mouse can be moved outside the application window, and during this time no mouse motion event are generated. So if we enter the window at another position, the real mousecursor and CEGUI's mouse cursor will be offset, which will break mouse usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Key Down'''&amp;lt;br /&amp;gt;&lt;br /&gt;
This event takes a little more work. CEGUI requires that key characters (the printable character the key represents) are injected alongside key codes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// to tell CEGUI that a key was pressed, we inject the scancode.&lt;br /&gt;
CEGUI::System::getSingleton().injectKeyDown(e.key.keysym.scancode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Luckily the key code is just the SDL scancode, so we inject that directly. (This only seems to be true on windows. On other platforms you will need to use a translation function. One can be found here [[SDL to CEGUI keytable]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// as for the character it's a litte more complicated. we'll use for translated unicode value.&lt;br /&gt;
// this is described in more detail below.&lt;br /&gt;
if (e.key.keysym.unicode != 0)&lt;br /&gt;
{&lt;br /&gt;
  CEGUI::System::getSingleton().injectChar(e.key.keysym.unicode);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of formatting the keypress ourselves, we let SDL do it for us. We could check if we actually got a valid ASCII code, but we want support for local characters as well, so we won't do that. For more information, take a look at the SDL documentation for this feature. [http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fkeysym SDL_keysym].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Key Up'''&amp;lt;br /&amp;gt;&lt;br /&gt;
This one is simple. Only the keycode need to injected. So we just use the scancode directly (As with KeyDown you will need to use a translation function for non Windows platforms. Check KeyDown above for more info):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// like before we inject the scancode directly.&lt;br /&gt;
CEGUI::System::getSingleton().injectKeyUp(e.key.keysym.scancode);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Mouse Button Down and Mouse Wheel'''&amp;lt;br /&amp;gt;&lt;br /&gt;
CEGUI and SDL are a little different when it comes to mouse button and mouse wheel events. So a little conversion is necessary. Here's the ''handle_mouse_down'' function that gets called when a mouse button down event occurs in SDL. It takes one parameter, a ''Uint8'' describing the mouse button that was pressed.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void handle_mouse_down(Uint8 button)&lt;br /&gt;
	{&lt;br /&gt;
	switch ( button )&lt;br /&gt;
		{&lt;br /&gt;
		// handle real mouse buttons&lt;br /&gt;
		case SDL_BUTTON_LEFT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_MIDDLE:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_RIGHT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);&lt;br /&gt;
			break;&lt;br /&gt;
		&lt;br /&gt;
		// handle the mouse wheel&lt;br /&gt;
		case SDL_BUTTON_WHEELDOWN:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseWheelChange( -1 );&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_WHEELUP:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseWheelChange( +1 );&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I chose a very &amp;quot;manual&amp;quot; conversion, but it works fine. Everything should be pretty self-explainatory.&lt;br /&gt;
As you can see mouse wheel events are emitted as mouse button down events in SDL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Mouse Button Up'''&amp;lt;br /&amp;gt;&lt;br /&gt;
The mouse button up event is handled very much like the mouse button down event, except there are no mousewheel release events.&lt;br /&gt;
Like ''handle_mouse_down'' it takes one parameter, a ''Uint8'' describing the mouse button that was released:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void handle_mouse_up(Uint8 button)&lt;br /&gt;
	{&lt;br /&gt;
	switch ( button )&lt;br /&gt;
		{&lt;br /&gt;
		case SDL_BUTTON_LEFT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_MIDDLE:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_RIGHT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Time Pulses ===&lt;br /&gt;
SDL has a built-in millisecond counter which we will use for this example. There are other ways to use timers with SDL, but I chose this approach as it is simple to use, and provides decent precision.&lt;br /&gt;
&lt;br /&gt;
Remember in the main loop where we stored the current &amp;quot;run-time&amp;quot; in seconds ? This value will be passed as a reference to ''inject_time_pulse'' function which in turn will set a new value to it.&lt;br /&gt;
&lt;br /&gt;
CEGUI's interface for injecting time pulses requires that you pass the time in seconds that has passed since the last time pulse injection. Let's take a look at the function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void inject_time_pulse(double&amp;amp; last_time_pulse)&lt;br /&gt;
{&lt;br /&gt;
	// get current &amp;quot;run-time&amp;quot; in seconds&lt;br /&gt;
	double t = 0.001*SDL_GetTicks();&lt;br /&gt;
&lt;br /&gt;
	// inject the time that passed since the last call &lt;br /&gt;
	CEGUI::System::getSingleton().injectTimePulse( float(t-last_time_pulse) );&lt;br /&gt;
&lt;br /&gt;
	// store the new time as the last time&lt;br /&gt;
	last_time_pulse = t;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* The first line gets the actual &amp;quot;run-time&amp;quot; when called.&lt;br /&gt;
* The second line injects the time pulse as the difference between the current time and the last time.&lt;br /&gt;
* The third line stores the current time as the last time a time pulse was injected.&lt;br /&gt;
&lt;br /&gt;
This will work for about 47 days... After that the counter wraps to zero and it breaks (a single insanely invalid timepulse will be injected).&lt;br /&gt;
I'll leave it up to you to fix that if it's a problem.&lt;br /&gt;
&lt;br /&gt;
=== Change of window size ===&lt;br /&gt;
If the window size changes (e.g. switching to fullscreen mode), we have to tell the openGlRenderer what's the new window size. Otherwise e.g. the Fonts aren't scaled properly. Therefore we add an SDL Event Handler for SDL_VIDEORESIZE and submit the new window size to the openGlRenderer of CEGUI. Also, on a resize the OpenGL context is lost, meaning textures must be reloaded. The OpenGLRenderer provides functions to do this, grabTextures and restoreTextures. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
      case SDL_VIDEORESIZE:&lt;br /&gt;
            renderer-&amp;gt;grabTextures();&lt;br /&gt;
            //your resize code here, including the SDL_SetVideoMode call&lt;br /&gt;
            renderer-&amp;gt;restoreTextures();&lt;br /&gt;
            renderer-&amp;gt;setDisplaySize(CEGUI::Size(e.resize.w, e.resize.h));&lt;br /&gt;
            break;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
Now all that's left is renderingthe GUI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void render_gui()&lt;br /&gt;
{&lt;br /&gt;
	// clear the colour buffer&lt;br /&gt;
	glClear( GL_COLOR_BUFFER_BIT );&lt;br /&gt;
&lt;br /&gt;
	// render the GUI :)&lt;br /&gt;
	CEGUI::System::getSingleton().renderGUI();&lt;br /&gt;
&lt;br /&gt;
	// Update the screen&lt;br /&gt;
	SDL_GL_SwapBuffers();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
CEGUI::System::getSingleton().renderGUI();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
does all the CEGUI magic and sets OpenGL state itself. As long as the viewport is setup, it will render the GUI.&lt;br /&gt;
&lt;br /&gt;
=== Error Handling ===&lt;br /&gt;
The neat C++ architecture of CEGUI suggests that C++ exceptions are used for error handling. This is completely true.&lt;br /&gt;
Whenever an error occurs, a sub-class of ''CEGUI::Exception'' is thrown.&lt;br /&gt;
&lt;br /&gt;
There are many scenarios where an exception can be thrown. And whether or not these should be considered fatal depends on the application. To make sure you catch the CEGUI exceptions a regular ''try'' block is used. Like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
	// do some cegui code&lt;br /&gt;
}&lt;br /&gt;
catch (CEGUI::Exception&amp;amp; e)&lt;br /&gt;
{&lt;br /&gt;
	fprintf(stderr,&amp;quot;CEGUI Exception occured: %s&amp;quot;, e.getMessage().c_str());&lt;br /&gt;
	// you could quit here&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This should provide you with the basic steps needed to get interactive with CEGUI in your SDL application.&lt;br /&gt;
Have fun.&lt;br /&gt;
&lt;br /&gt;
=== The Code ===&lt;br /&gt;
To compile under linux:&lt;br /&gt;
&amp;lt;code&amp;gt;gcc teste.cpp -I/usr/include/CEGUI/ -lSDL -lGL -lGLU -lCEGUIBase -lCEGUIOpenGLRenderer&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code uses release 0.5.0 of CEGUI.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Adapted by: Johnny Souza - johnnysouza.js@gmail.com&lt;br /&gt;
 * Date: 19/01/07 17:00&lt;br /&gt;
 * Description: Using CEGUI with SDL and OpenGL&lt;br /&gt;
 */&lt;br /&gt;
  &lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
#include &amp;lt;SDL/SDL.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
#include &amp;lt;CEGUI.h&amp;gt;&lt;br /&gt;
/* for release 0.4.X use:&lt;br /&gt;
 * #include &amp;lt;renderers/OpenGLGUIRenderer/openglrenderer.h&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;RendererModules/OpenGLGUIRenderer/openglrenderer.h&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
#include &amp;lt;GL/gl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;GL/glu.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CEGUI::OpenGLRenderer *renderer;&lt;br /&gt;
&lt;br /&gt;
void handle_mouse_down(Uint8 button)&lt;br /&gt;
{&lt;br /&gt;
	switch ( button ) {&lt;br /&gt;
		case SDL_BUTTON_LEFT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::LeftButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_MIDDLE:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::MiddleButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_RIGHT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonDown(CEGUI::RightButton);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case SDL_BUTTON_WHEELDOWN:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseWheelChange( -1 );&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_WHEELUP:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseWheelChange( +1 );&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void handle_mouse_up(Uint8 button)&lt;br /&gt;
{&lt;br /&gt;
	switch ( button )&lt;br /&gt;
	{&lt;br /&gt;
		case SDL_BUTTON_LEFT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::LeftButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_MIDDLE:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::MiddleButton);&lt;br /&gt;
			break;&lt;br /&gt;
		case SDL_BUTTON_RIGHT:&lt;br /&gt;
			CEGUI::System::getSingleton().injectMouseButtonUp(CEGUI::RightButton);&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void inject_input (bool &amp;amp; must_quit) &lt;br /&gt;
{&lt;br /&gt;
	SDL_Event e;&lt;br /&gt;
	/* go through all available events */&lt;br /&gt;
	while (SDL_PollEvent(&amp;amp;e)) {&lt;br /&gt;
		/* we use a switch to determine the event type */&lt;br /&gt;
		switch (e.type) {&lt;br /&gt;
			/* mouse motion handler */&lt;br /&gt;
			case SDL_MOUSEMOTION:&lt;br /&gt;
				/* we inject the mouse position directly. */&lt;br /&gt;
				CEGUI::System::getSingleton().injectMousePosition(static_cast&amp;lt;float&amp;gt;(e.motion.x),static_cast&amp;lt;float&amp;gt;(e.motion.y));&lt;br /&gt;
				break;&lt;br /&gt;
	 &lt;br /&gt;
			/* mouse down handler */&lt;br /&gt;
			case SDL_MOUSEBUTTONDOWN:&lt;br /&gt;
				/* let a special function handle the mouse button down event */&lt;br /&gt;
				handle_mouse_down (e.button.button);&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			/* mouse up handler */&lt;br /&gt;
			case SDL_MOUSEBUTTONUP:&lt;br /&gt;
				/* let a special function handle the mouse button up event */&lt;br /&gt;
				handle_mouse_up (e.button.button);&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			/* key down */&lt;br /&gt;
			case SDL_KEYDOWN:&lt;br /&gt;
				/* to tell CEGUI that a key was pressed, we inject the scancode. */&lt;br /&gt;
				CEGUI::System::getSingleton().injectKeyDown(e.key.keysym.scancode);&lt;br /&gt;
				/* as for the character it's a litte more complicated.&lt;br /&gt;
				 * we'll use for translated unicode value.&lt;br /&gt;
				 * this is described in more detail below.&lt;br /&gt;
				 */&lt;br /&gt;
				if ((e.key.keysym.unicode &amp;amp; 0xFF80) == 0) {&lt;br /&gt;
					CEGUI::System::getSingleton().injectChar(e.key.keysym.unicode &amp;amp; 0x7F);&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
	 &lt;br /&gt;
			/* key up */&lt;br /&gt;
			case SDL_KEYUP:&lt;br /&gt;
				/* like before we inject the scancode directly. */&lt;br /&gt;
				CEGUI::System::getSingleton().injectKeyUp(e.key.keysym.scancode);&lt;br /&gt;
				break;&lt;br /&gt;
	 &lt;br /&gt;
			/* WM quit event occured */&lt;br /&gt;
			case SDL_QUIT:&lt;br /&gt;
				must_quit = true;&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			case SDL_VIDEORESIZE:&lt;br /&gt;
				renderer-&amp;gt;setDisplaySize(CEGUI::Size(e.resize.w, e.resize.h));&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void inject_time_pulse(double&amp;amp; last_time_pulse)&lt;br /&gt;
{&lt;br /&gt;
	/* get current &amp;quot;run-time&amp;quot; in seconds */&lt;br /&gt;
	double t = 0.001*SDL_GetTicks();&lt;br /&gt;
	/* inject the time that passed since the last call */&lt;br /&gt;
	CEGUI::System::getSingleton().injectTimePulse( float(t-last_time_pulse) );&lt;br /&gt;
	/* store the new time as the last time */&lt;br /&gt;
	last_time_pulse = t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void render_gui()&lt;br /&gt;
{&lt;br /&gt;
	/* clear the colour buffer */&lt;br /&gt;
	glClear( GL_COLOR_BUFFER_BIT );&lt;br /&gt;
	/* render the GUI :) */&lt;br /&gt;
	CEGUI::System::getSingleton().renderGUI();&lt;br /&gt;
	/* Update the screen */&lt;br /&gt;
	SDL_GL_SwapBuffers();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void main_loop () &lt;br /&gt;
{&lt;br /&gt;
	bool must_quit = false;&lt;br /&gt;
	/* get &amp;quot;run-time&amp;quot; in seconds */&lt;br /&gt;
	double last_time_pulse = 0.001*static_cast&amp;lt;double&amp;gt;(SDL_GetTicks());&lt;br /&gt;
	while (!must_quit) {&lt;br /&gt;
		inject_input (must_quit);&lt;br /&gt;
		inject_time_pulse (last_time_pulse);&lt;br /&gt;
		render_gui ();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char **argv) &lt;br /&gt;
{&lt;br /&gt;
	SDL_Surface * screen;&lt;br /&gt;
	atexit (SDL_Quit);&lt;br /&gt;
	SDL_Init (SDL_INIT_VIDEO);&lt;br /&gt;
	screen = SDL_SetVideoMode (600, 480, 0, SDL_OPENGL);&lt;br /&gt;
	if (screen == NULL) {&lt;br /&gt;
		/* Se ainda não der, desiste! */ &lt;br /&gt;
		fprintf (stderr, &amp;quot;Impossível ajustar ao vídeo: %s\n&amp;quot;, SDL_GetError ());&lt;br /&gt;
		exit (1);&lt;br /&gt;
	}&lt;br /&gt;
	renderer = new CEGUI::OpenGLRenderer (0, 600, 480);&lt;br /&gt;
	new CEGUI::System (renderer);&lt;br /&gt;
	SDL_ShowCursor (SDL_DISABLE);&lt;br /&gt;
	SDL_EnableUNICODE (1);&lt;br /&gt;
	SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);&lt;br /&gt;
	main_loop();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[User:Lindquist]] 16:21, 8 May 2005 (BST)&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_Beginners_Guide_to_Falagard_skinning_-_Part_II&amp;diff=4216</id>
		<title>The Beginners Guide to Falagard skinning - Part II</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_Beginners_Guide_to_Falagard_skinning_-_Part_II&amp;diff=4216"/>
				<updated>2011-03-03T23:53:01Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}}&lt;br /&gt;
{{Series|The Beginners Guide to Falagard|2}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
Last time we looked at the essential basics to get something running with Falagard. This is great, but a simplistic look'n'feel for a button is a bit boring. So lets step forward and learn something new.&lt;br /&gt;
&lt;br /&gt;
In this tutorial we will create a look'n'feel for the ''Editbox'' window type. This widget is interactive and uses new parts of the Falagard system, making it an excellent target for another tutorial.&lt;br /&gt;
&lt;br /&gt;
So let's get started...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
We'll start out by looking at the requirements for the ''Editbox'' window type. Like always, the information we're looking for can be found in the [[Falagard System base widgets reference]].&lt;br /&gt;
&lt;br /&gt;
In there we'll see that the ''Editbox'' is a bit more complex than the ''Button''. But fear not - we'll get through every part of it ;-)&lt;br /&gt;
&lt;br /&gt;
Let's start out with the ''StateImagery'' needed for this widget:&lt;br /&gt;
* Enabled&lt;br /&gt;
* Disabled&lt;br /&gt;
* ReadOnly&lt;br /&gt;
* ActiveSelection&lt;br /&gt;
* InactiveSelection&lt;br /&gt;
&lt;br /&gt;
Unlike the ''Button'' we don't have any optional states. ''Enabled'' and ''Disabled'' should speak for themselves. ''ReadOnly'' is used when the ''Editbox'' is in read-only mode (easy huh?).&lt;br /&gt;
&lt;br /&gt;
The ''ActiveSelection'' state is somewhat special. It should define what imagery to render for the selection graphics itself when the window is in an activated state (has focus).&lt;br /&gt;
''InactiveSelection'' is the same, except it is used when the window is '''not''' active (does'nt have focus).&lt;br /&gt;
&lt;br /&gt;
Besides the ''StateImagery'' needed, a ''Editbox'' also requires a ''NamedArea'' called '''TextArea''' and a ''ImagerySection'' named '''Carat''' (yes, car'''a'''t).&lt;br /&gt;
We'll have a much closer look at these later on.&lt;br /&gt;
&lt;br /&gt;
The initial XML (with the parts we know about) looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt; &lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
 	&amp;lt;ImagerySection name=&amp;quot;Carat&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
 	&amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 	&amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 	&amp;lt;StateImagery name=&amp;quot;ReadOnly&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 	&amp;lt;StateImagery name=&amp;quot;ActiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 	&amp;lt;StateImagery name=&amp;quot;InactiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We'll fill it out as we go...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Imagery ==&lt;br /&gt;
This look'n'feel will use a frame consisting of 8 different images from our favorite imageset ''MyImages''. Furthermore we'll have a single image stretched to fill the hole in this frame. The images will have names that are easy to interpret:&lt;br /&gt;
{| cellpadding=&amp;quot;15&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|+ Frame setup&lt;br /&gt;
| TL || align=&amp;quot;center&amp;quot; | T || TR&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;center&amp;quot; | L || Bg|| align=&amp;quot;center&amp;quot; |R&lt;br /&gt;
|-&lt;br /&gt;
| BL || align=&amp;quot;center&amp;quot; | B || BR&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Each prefixed with '''Editbox'''. Forming imagenames like '''EditboxTL''' etc.&lt;br /&gt;
&lt;br /&gt;
The ''FrameComponent'' tag may only occur inside an ''ImagerySection''. Just like the ''ImageryComponent'' and ''TextComponent'' that we used in part I.&lt;br /&gt;
&lt;br /&gt;
Using the ''FrameComponent'' is very much like using the ''ImageryComponent'' all the tags allowed are the same, but a ''FrameComponent'' allows up to nine images to be specified. It's purpose is to make making frames easy :-)&lt;br /&gt;
A ''FrameComponent'' is special in the way it handles formatting compared to ''ImageryComponent'' though. Any formatting options are only applied to the background image - if it's specified. Yes. We don't have to set all nine of them. We can just choose the image &amp;quot;positions&amp;quot; we need. In our case we'll use all of them tough...&lt;br /&gt;
&lt;br /&gt;
Let's look at the XML for this ''FrameComponent'':&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;FrameComponent&amp;gt;&lt;br /&gt;
        &amp;lt;Area&amp;gt;&lt;br /&gt;
            &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Dim&amp;gt;&lt;br /&gt;
            &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Dim&amp;gt;&lt;br /&gt;
            &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Dim&amp;gt;&lt;br /&gt;
            &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Dim&amp;gt;&lt;br /&gt;
        &amp;lt;/Area&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;TopLeftCorner&amp;quot;     imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxTL&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;TopEdge&amp;quot;           imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;TopRightCorner&amp;quot;    imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxTR&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;RightEdge&amp;quot;         imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;BottomRightCorner&amp;quot; imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBR&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;BottomEdge&amp;quot;        imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;BottomLeftCorner&amp;quot;  imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBL&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;LeftEdge&amp;quot;          imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Image type=&amp;quot;Background&amp;quot;        imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBg&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/FrameComponent&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You should recognise the area. It's the full area of the window, exactly like the areas we used in part I.&lt;br /&gt;
Reason: We want the frame and background to cover the entire window. Simple :-)&lt;br /&gt;
&lt;br /&gt;
Nine images are specifed. The order does not matter.&lt;br /&gt;
But note that compared to the ''ImageryComponent'' used last time, we must specify a type attribute for the images.&lt;br /&gt;
This is so Falagard knows where to place this image in the frame.&lt;br /&gt;
These are of course listed in the [[Falagard System XML Enumerations reference]].&lt;br /&gt;
&lt;br /&gt;
The format both horizontally and vertically is ''Stretched''. This ensures that the background image is stretched to fill as much as possible of the &amp;quot;hole&amp;quot; created by the border images (TL,T,TR etc.).&lt;br /&gt;
&lt;br /&gt;
We'll use this frame for all the 3 states (''Enabled'', ''Disabled'', ''ReadOnly''), but we want the colours to be a little different in each state. In part I we created a new property to hold the colour of the Text. To show a different approach, we'll &amp;quot;hard-code&amp;quot; the frame colours into this look'n'feel.&lt;br /&gt;
&lt;br /&gt;
CEGUI supports using a colour rectangle to modulate the colours of anything it renders. This makes it possible to &amp;quot;apply&amp;quot; nice colour gradients to our frame imagery.&lt;br /&gt;
&lt;br /&gt;
The ''Normal'' state will use the colours, unmodified from the image file.&lt;br /&gt;
&lt;br /&gt;
The ''Disabled'' state will use gray to darken the frame imagery &lt;br /&gt;
&lt;br /&gt;
In the ''ReadOnly'' state we'll create a gradient that is white in the top-left corner, and slightly grayish for the three other corners. When applied to the imagery this will result in the top-left corner using exactly the same colours as in the image file, and the three other corners being slightly darkened.&lt;br /&gt;
&lt;br /&gt;
To use this frame component we must - like stated earlier - fit it in a ''ImagerySection''. We'll call this new imagery section &amp;quot;frame&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This is all the we need to write up the xml for this frame, and use it in our states, so now the XML looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt; &lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;b&amp;gt;&amp;lt;ImagerySection name=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;FrameComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;TopLeftCorner&amp;quot;     imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxTL&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;TopEdge&amp;quot;           imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;TopRightCorner&amp;quot;    imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxTR&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;RightEdge&amp;quot;         imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;BottomRightCorner&amp;quot; imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBR&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;BottomEdge&amp;quot;        imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;BottomLeftCorner&amp;quot;  imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBL&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;LeftEdge&amp;quot;          imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;Background&amp;quot;        imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBg&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/FrameComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;Carat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FF7F7F7F&amp;quot; topRight=&amp;quot;FF7F7F7F&amp;quot; bottomLeft=&amp;quot;FF7F7F7F&amp;quot; bottomRight=&amp;quot;FF7F7F7F&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ReadOnly&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FFFFFFFF&amp;quot; topRight=&amp;quot;FFDFDFDF&amp;quot; bottomLeft=&amp;quot;FFDFDFDF&amp;quot; bottomRight=&amp;quot;FFDFDFDF&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ActiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;InactiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The frame component has been added, and the ''Enabled'', ''Disabled'' and ''ReadOnly'' states have been set up to use them. The only new thing is really the ''Colours'' tag inside the ''Section'' tags for &amp;quot;frame&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
It behaves just like the ''ColourProperty'' tag we used in part I, except you can specify a colour to use for each corner.&lt;br /&gt;
It's attributes&lt;br /&gt;
* topLeft&lt;br /&gt;
* topRight&lt;br /&gt;
* bottomLeft&lt;br /&gt;
* bottomRight&lt;br /&gt;
Each specify a single colour of the same format we used for ''ColourProperty'' (AARRGGBB in hex).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Text ==&lt;br /&gt;
Remeber something about a ''NamedArea''? Either way we're going to look at it now. The ''Editbox'' widget requires us to define a named area so it knows where to render, the text we type in, the caret (the marker that shows us where the characters we type will be inserted) and our selection.&lt;br /&gt;
&lt;br /&gt;
In this look'n'feel, we want the text to be rendered inside our frame. That is we dont want the text to cover the frame imagery itself, only the background of it. Falagard provides a ''ImageDim'' tag that we can use to extract the width and height from the images we used for the frame. Falagard also provides a ''DimOperator'' tag that we can use to do a little math on our dimensions. These features will be the core of our ''NamedArea'' which will be named '''TextArea''' (Stated in the requirements... Remember?)&lt;br /&gt;
&lt;br /&gt;
The only thing we must (and may) specify in a ''NamedArea'' is a ''Area''.&lt;br /&gt;
&lt;br /&gt;
If we take a look back at the ''Area'' tag, we know that it must specify four dimensions. ''LeftEdge'', ''TopEdge'', ''RightEdge'' and ''BottomEdge''. You might remember that we can specify ''Width'' instead of ''RightEdge'', and ''Height'' instead of ''BottomEdge''. But we're not going to do that. Just so you know (and don't forget) ;-)&lt;br /&gt;
&lt;br /&gt;
We start out with a &amp;quot;empty&amp;quot; XML and fill it out as we go. For now it looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;NamedArea name=&amp;quot;TextArea&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Area&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;/Area&amp;gt;&lt;br /&gt;
 &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We start out with the left edge. In the frame we used the image named '''EditboxL''' for the left edge. And as the area we want to define is to lie inside the frame, we'll use the width of this specific image as the left edge of our area.&lt;br /&gt;
The XML for this ''ImageDim'' is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The top edge is very similar except we'll use the height of the image named '''EditboxT''' instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The right edge is a bit more tricky. To start out we'll use a ''UnifiedDim'' that gives us the right edge of our widget.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We use a seperate tag to close it, as by itself this ''UnifiedDim'' is not good enough. We still need the take the frame into accout. The image dimension we're after is the width of the image '''EditboxR'''. We must subtract this width from the right edge to ensure that the frame imagery is not overwritten by a long text string in the ''Editbox''.&lt;br /&gt;
&lt;br /&gt;
The ''DimOperator'' can do this for us with XML like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''DimOperator'' tag requires us to specify the attribute ''op'' with the name of the operation we want to perform as the value. The operations supported by Falagard are:&lt;br /&gt;
* Add&lt;br /&gt;
* Subtract&lt;br /&gt;
* Multiply&lt;br /&gt;
* Divide&lt;br /&gt;
We used ''Subtract'' to &amp;quot;move back&amp;quot; a little from our right edge to make sure we leave the frame imagery for the right edge alone.&lt;br /&gt;
&lt;br /&gt;
The bottom edge of the area is very similar to the right. There are two differences. First we want the ''UnifiedDim'' to take the bottom edge of our window and not the right edge. Second we want to subtract the height of the image named '''EditboxB''' instead too.&lt;br /&gt;
&lt;br /&gt;
This gives us this XML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If we put these four dimensions into our ''NamedArea'' it looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;NamedArea name=&amp;quot;TextArea&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Area&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;b&amp;gt;&amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;b&amp;gt;&amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;b&amp;gt;&amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
             &amp;lt;/Unified&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;b&amp;gt;&amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
             &amp;lt;/Unified&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;/Area&amp;gt;&lt;br /&gt;
 &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the complete ''NamedArea'' for our ''Editbox'' look'n'feel. If we fit it inside our full look'n'feel it will look like the XML below. Notice that the ''NamedArea'' is specifed before the ''ImagerySection''. This is required by Falagard.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt; &lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;b&amp;gt;&amp;lt;NamedArea name=&amp;quot;TextArea&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
         ...&lt;br /&gt;
         ... saving space ...&lt;br /&gt;
         ...&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;Carat&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FF7F7F7F&amp;quot; topRight=&amp;quot;FF7F7F7F&amp;quot; bottomLeft=&amp;quot;FF7F7F7F&amp;quot; bottomRight=&amp;quot;FF7F7F7F&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ReadOnly&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FFFFFFFF&amp;quot; topRight=&amp;quot;FFDFDFDF&amp;quot; bottomLeft=&amp;quot;FFDFDFDF&amp;quot; bottomRight=&amp;quot;FFDFDFDF&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ActiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;InactiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We don't reference '''TextArea''' anywhere. Just specifying it is all that is required according to the [[Falagard System base widgets reference]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Caret ==&lt;br /&gt;
The ''Editbox'' has a caret. This is a marker that shows us where we are typing and allows us to tell if we are inserting in the middle of the text or at the end etc. The text is split around it by CEGUI so we don't draw over the text rendering the point we're editing unreadable. All this is currently handled internally and all you need to do is create a ''ImagerySection'' name '''Carat'''.&lt;br /&gt;
&lt;br /&gt;
note by Pompei2: You're reading right, the ''ImagerySection'' is named '''Carat''' although the right word is a caret.&lt;br /&gt;
&lt;br /&gt;
When CEGUI needs render the caret (and the text) it will fetch this ''ImagerySection'' and render it at the appropriate position in the text.&lt;br /&gt;
We do not need to make a ''TextComponent'' in a ''Editbox'' to get the text to render. Because of the pecularities of the caret (and selection which we will handle later) it's all done automatically, by using the ''NamedArea'' '''TextArea''' we just specified along with the real pixel area of the window, to confine rendering to right rectangle on the screen.&lt;br /&gt;
&lt;br /&gt;
Enough details. We just want to render a single image named '''EditboxCaret''' stretched vertically inside the '''TextArea'''.&lt;br /&gt;
&lt;br /&gt;
Creating the ''ImagerySection'' is very much like creating the background for the ''Button'' in part I, the only real difference being the ''Area'' used. We'll look at the XML for this area, it's all made up by stuff we've already seen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Area&amp;gt;&lt;br /&gt;
        &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Dim&amp;gt;&lt;br /&gt;
        &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Dim&amp;gt;&lt;br /&gt;
        &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxCaret&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Dim&amp;gt;&lt;br /&gt;
        &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Dim&amp;gt;&lt;br /&gt;
    &amp;lt;/Area&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first and second (left/top edges) ''Dim''s have the familiar ''AbsoluteDim'' with a value of zero. Nothing new here.&lt;br /&gt;
&lt;br /&gt;
The third ''Dim'' on the other hand is new. It's now specified as &amp;quot;Width&amp;quot; and not &amp;quot;RightEdge&amp;quot; like we have done so far. Inside we have a ''ImageDim'' for the width of the caret image we're using. If we had used the regular ''UnifiedDim'', the caret itself would have the width our textarea (because the caret resides in the text area) and would have been very ugly...&lt;br /&gt;
&lt;br /&gt;
The fourth dimension is the familiar ''UnifiedDim'' we have used in all the earlier areas.&lt;br /&gt;
&lt;br /&gt;
We know from part I how to make a ''ImagerySection'' with a ''ImageryComponent''. This is all we need to render this single-image caret. The XML for our look'n'feel is nearing completion.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt; &lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;NamedArea name=&amp;quot;TextArea&amp;quot;&amp;gt;&lt;br /&gt;
         ...&lt;br /&gt;
         ... saving space ...&lt;br /&gt;
         ...&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
         ...&lt;br /&gt;
         ... saving space ...&lt;br /&gt;
         ...&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;Carat&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxCaret&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxCaret&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/ImageryComponent&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FF7F7F7F&amp;quot; topRight=&amp;quot;FF7F7F7F&amp;quot; bottomLeft=&amp;quot;FF7F7F7F&amp;quot; bottomRight=&amp;quot;FF7F7F7F&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ReadOnly&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FFFFFFFF&amp;quot; topRight=&amp;quot;FFDFDFDF&amp;quot; bottomLeft=&amp;quot;FFDFDFDF&amp;quot; bottomRight=&amp;quot;FFDFDFDF&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ActiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;InactiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We only specify the vertical formatting for the new ''ImageryComponent'' because we are specifying the area to exactly match the width of the image, and thus any formatting would have no effect. ''LeftAligned'' (the default) is just fine.&lt;br /&gt;
&lt;br /&gt;
Now we just need to do something in the ''ActiveSelection'' and ''InactiveSelection'' states...&lt;br /&gt;
&lt;br /&gt;
== Selection ==&lt;br /&gt;
When the user has selected text in the ''Editbox'', either with the mouse or the keyboard, CEGUI render the selection using the two additional states '''ActiveSelection''' and '''InactiveSelection'''.&lt;br /&gt;
&lt;br /&gt;
The the window is active (has focus) it will use the state '''ActiveSelection''', if if does not have focus (inactive) yet still has a selection '''InactiveSelection''' will be used.&lt;br /&gt;
&lt;br /&gt;
For the selection in this look'n'feel, we'll use a single image stretched over the selection area. This image will contain plain white in the image file so we can apply any colour(s) we choose to the selection imagery.&lt;br /&gt;
Let's call it '''White'''.&lt;br /&gt;
&lt;br /&gt;
For '''ActiveSelection''' we'll use a classic blue colour, for inactive the same, except we'll make it 50% transparent.&lt;br /&gt;
We can avoid a colour tag in the '''ActiveSelection''' state if we specify the colours to use directly in the ''ImageryComponent''. We'll do that to show how it works.&lt;br /&gt;
&lt;br /&gt;
We'll create a new ''ImagerySection'' for this &amp;quot;selection brush&amp;quot; named '''selection'''. XML follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;White&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Colours topLeft=&amp;quot;FF26458A&amp;quot; topRight=&amp;quot;FF26458A&amp;quot; bottomLeft=&amp;quot;FF26458A&amp;quot; bottomRight=&amp;quot;FF26458A&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We use a default area that you should recognise by now. CEGUI will automatically use the right size for the selection.&lt;br /&gt;
The image we use is the one called '''White''' from our favorite imageset '''MyImages'''. Like always ;-)&lt;br /&gt;
A colour tag has been added as well to make our selection some kind of blue...&lt;br /&gt;
The vertical and horizontal formatting is ''Stretched'' which is generally what you would want to do in a situation like this.&lt;br /&gt;
&lt;br /&gt;
We'll &amp;quot;call&amp;quot; this ''ImagerySection'' from the '''ActiveSelection''' and '''InactiveSelection''' states. In the '''InactiveSelection''' state we'll further modulate the colours used by passing a 50% transparent white. This will have the effect of using the same colour as in the active state, but make that colour 50% transparent. We could have just specified the full colour to use in each state and remove the ''Colours'' tag from the ''ImageryComponent'', but I wanted to show that multiple modulations are possible with Falagard.&lt;br /&gt;
&lt;br /&gt;
The states are the last thing missing from the look'n'feel, so let's take a look at the final XML (yay :-P ).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt; &lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;NamedArea name=&amp;quot;TextArea&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                 &amp;lt;/Unified&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;FrameComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;TopLeftCorner&amp;quot;     imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxTL&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;TopEdge&amp;quot;           imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxT&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;TopRightCorner&amp;quot;    imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxTR&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;RightEdge&amp;quot;         imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxR&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;BottomRightCorner&amp;quot; imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBR&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;BottomEdge&amp;quot;        imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxB&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;BottomLeftCorner&amp;quot;  imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBL&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;LeftEdge&amp;quot;          imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxL&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Image type=&amp;quot;Background&amp;quot;        imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxBg&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/FrameComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;Carat&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxCaret&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;EditboxCaret&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;ImagerySection name=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;White&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Colours topLeft=&amp;quot;FF26458A&amp;quot; topRight=&amp;quot;FF26458A&amp;quot; bottomLeft=&amp;quot;FF26458A&amp;quot; bottomRight=&amp;quot;FF26458A&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Enabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FF7F7F7F&amp;quot; topRight=&amp;quot;FF7F7F7F&amp;quot; bottomLeft=&amp;quot;FF7F7F7F&amp;quot; bottomRight=&amp;quot;FF7F7F7F&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ReadOnly&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;frame&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;FFFFFFFF&amp;quot; topRight=&amp;quot;FFDFDFDF&amp;quot; bottomLeft=&amp;quot;FFDFDFDF&amp;quot; bottomRight=&amp;quot;FFDFDFDF&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;ActiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;StateImagery name=&amp;quot;InactiveSelection&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Layer&amp;gt;&lt;br /&gt;
             &amp;lt;Section section=&amp;quot;selection&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Colours topLeft=&amp;quot;7FFFFFFF&amp;quot; topRight=&amp;quot;7FFFFFFF&amp;quot; bottomLeft=&amp;quot;7FFFFFFF&amp;quot; bottomRight=&amp;quot;7FFFFFFF&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Section&amp;gt;&lt;br /&gt;
         &amp;lt;/Layer&amp;gt;&lt;br /&gt;
     &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's it folks. The look'n'feel is done. Hopefully you're starting to play around with the XML and making the look'n'feel suit you (or your artist ;-) ).&lt;br /&gt;
Again, feel free to add comments in the discussion page.&lt;br /&gt;
&lt;br /&gt;
Stay tuned for part III...&lt;br /&gt;
&lt;br /&gt;
--[[User:lindquist]] 00:41, 14 Dec 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_Beginners_Guide_to_Falagard_skinning_-_Part_I&amp;diff=4215</id>
		<title>The Beginners Guide to Falagard skinning - Part I</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_Beginners_Guide_to_Falagard_skinning_-_Part_I&amp;diff=4215"/>
				<updated>2011-03-03T23:52:51Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}}&lt;br /&gt;
{{Series|The Beginners Guide to Falagard|1}}&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Falagard system in CEGUI 0.4 and up is a powerful tool.&lt;br /&gt;
By using it you can make your GUI elements look like you want and not how some coder thought looked cool.&lt;br /&gt;
Use Falagard to your advantage and you can do alot of nice things from XML that you might think needed real code.&lt;br /&gt;
&lt;br /&gt;
Falagard allows you not only to define how the rendering of a window proceeds, you can create new representational features as well by creating new properties for the window and using them in your imagery configurations.&lt;br /&gt;
&lt;br /&gt;
Before I go too far glorifying Falagard, we'll just jump right into it :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Basics ==&lt;br /&gt;
Falagard is a part of the CEGUI core and is implemented in C++. It is completely possible to write a skin in C++, but it's is not very practical. You have to recompile every time you change something. Fortunately CEGUI supports creating a Falagard skin from a custom XML format.&lt;br /&gt;
&lt;br /&gt;
This Falagard XML format is what we're going to be looking at throughout this tutorial. As I think learning by doing is the way to go, we'll try to produce something useful with this tutorial - a fully working look'n'feel for a regular button.&lt;br /&gt;
&lt;br /&gt;
The beginning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the truely minimal XML that defines a widget look. A widget look contains all the information needed to render a specific type of window, a widget look is also what we would define as a look'n'feel.&lt;br /&gt;
The first line tells the parser that this is really a XML document. This must always be the first line of a Falagard XML skin.&lt;br /&gt;
The second line opens the ''Falagard'' tag. This is always the first thing we do after the ''&amp;lt;?xml ... ?&amp;gt;'' tag.&lt;br /&gt;
I hope you're somewhat familiar with XML or at least HTML as this tutorial might be a little difficult to understand if you're not. Now you're warned.&lt;br /&gt;
The third line opens a ''WidgetLook'' tag. This is where we cram all the details about our look'n'feel.&lt;br /&gt;
The fourth line closes the ''WidgetLook'' tag. We must always remember to close our tags.&lt;br /&gt;
The fifth line closes the ''Falagard'' tag. Again - always remember to close your tags.&lt;br /&gt;
&lt;br /&gt;
While this simple XML snippet is good for showing you how to start out, it is completely useless as it does nothing.&lt;br /&gt;
&lt;br /&gt;
To make our look'n'feel interesting we need to tell it what to do. So let's have a look at the Falagard data structure:&lt;br /&gt;
&lt;br /&gt;
* WidgetLook&lt;br /&gt;
** Property definitions&lt;br /&gt;
** Properties&lt;br /&gt;
** Named areas&lt;br /&gt;
** Child components&lt;br /&gt;
** Imagery sections&lt;br /&gt;
** State imagery&lt;br /&gt;
&lt;br /&gt;
This might be overwhelming. It might not. Either way it's the how it is. Falagard is a complex system...&lt;br /&gt;
But it's really not that hard once you get down the basics.&lt;br /&gt;
&lt;br /&gt;
The look'n'feel we are going to produce is for a ''Falagard/Button'' type window. This window type is simple, and we don't have to know about all of the parts of a look'n'feel. We only need to know what we'll be using. Furthermore we'll keep it very simple which leaves us at a point where we can make something work with very little.&lt;br /&gt;
&lt;br /&gt;
I'm still going to give a short description of each item in the list though:&lt;br /&gt;
&lt;br /&gt;
* WidgetLook - This is where we add all the other components for our look'n'feel. Consider it '''the''' look'n'feel.&lt;br /&gt;
&lt;br /&gt;
* Property definitions - A property definition is the creation of a new property in the window that gets the look'n'feel assigned.&lt;br /&gt;
&lt;br /&gt;
* Properties - A property in CEGUI is a window variable that we can access from anywhere. Even outside C++ (think XML window layouts). We often assign default values to properties from a look'n'feel.&lt;br /&gt;
&lt;br /&gt;
* Named areas - A named area defines a rectangle, inside the window we are skinning, with a distinct name. Often used to define where to draw some specific piece of imagery that needs special handling by CEGUI as thus cannot be completely defined in the look'n'feel.&lt;br /&gt;
&lt;br /&gt;
* Child components - Some window types need child windows. This could be scrollbar, a titlebar etc. We specify what type of window this child will be customize it for the situation from the look'n'feel.&lt;br /&gt;
&lt;br /&gt;
* Imagery sections - An imagery section is a collection of imagery components tagged with a name. We use imagery sections to split the renderable parts of our look'n'feel into sections which can be drawn independently. Like for example having the frame in one section and the background in another.&lt;br /&gt;
&lt;br /&gt;
* State imagery - Tells CEGUI what to draw when. In a state imagery we draw all the different imagery sections we need for a specific window &amp;quot;situation&amp;quot;. For our button we will have: Normal, Hover, Pushed, Disabled.&lt;br /&gt;
&lt;br /&gt;
Ok. I hope this clarifies it a bit. We'll go into more detil about the different parts as we need them.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
Every time you write a look'n'feel you need to make find out what the requirements are for the type of window you want to skin. To get this information you either look at the header files in the Falagard module source directory, or you reference the manual. This is available both online, here on the wiki, and in the documentation directory in the SDK as a PDF.&lt;br /&gt;
&lt;br /&gt;
The online version is available on the page [[falagard Skinning System Documentation]]. For the list of these requirements I'm talking about the [[Falagard System base widgets reference]] is what you're looking for.&lt;br /&gt;
If we look in there we'll see that ''Falagard/Button'' only require 1 ''StateImagery'' definition to be present. ''Normal''.&lt;br /&gt;
&lt;br /&gt;
It allows up to four ''StateImagery'' definitions to cover all its possible states: ''Normal'', ''Hover'', ''Pushed'' and ''Disabled''.&lt;br /&gt;
&lt;br /&gt;
We'll start out the easy way and just make the ''Normal'' state ;-) So now our XML looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;StateImagery name=&amp;quot;Normal&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you compare to the last XML piece, the only difference is the addition of a ''StateImagery'' tag with its name attribute set to &amp;quot;Normal&amp;quot;. This makes sure that we live up to the requirement of a &amp;quot;Normal&amp;quot; state definition.&lt;br /&gt;
As I said earlier the ''WidgetLook'' is '''the''' look'n'feel so it is - of course - inside it we add the ''StateImagery'' tag.&lt;br /&gt;
&lt;br /&gt;
This still extremely simple look'n'feel is actually a fully valid look'n'feel. It implements what is required by the manual. Though as you might have guessed it still does nothing.&lt;br /&gt;
To get it to render anything we have to define the imagery sections mentioned earlier.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Imagery ==&lt;br /&gt;
For our look'n'feel we'll just want a single image to be stretched over the entire window area. That is each corner from the image mapped to each corner of the window.&lt;br /&gt;
&lt;br /&gt;
To acheive this the first thing we need to do is to add a ''ImagerySection'' to our look'n'feel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;ImagerySection name=&amp;quot;bg&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Normal&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;b&amp;gt;&amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we have added the imagery section, and named it &amp;quot;bg&amp;quot;. This name is just something we choose.&lt;br /&gt;
&lt;br /&gt;
Inside the state imagery for the &amp;quot;Normal&amp;quot; state a layer has been added.&lt;br /&gt;
The ''Layer'' tag allow you to control the z-ordering of layers inside in a ''StateImagery'', but we only need one layer for this look'n'feel so let's not worry too much about that.&lt;br /&gt;
&lt;br /&gt;
In the layer a ''Section'' has been added. This tag tells the layer its in that we want the ''ImagerySection'' named &amp;quot;bg&amp;quot; to be rendered as part of this layer.&lt;br /&gt;
&lt;br /&gt;
This is nice. The look'n'feel is all ready and hooked up to render the imagery section &amp;quot;bg&amp;quot; as the imagery for the &amp;quot;Normal&amp;quot; state. But our imagery section is still empty, and this means our look'n'feel really is no better than the previous. It still does nothing (at least visually).&lt;br /&gt;
&lt;br /&gt;
Now that we're over the really basic and boring stuff, let's make it draw that image...&lt;br /&gt;
&lt;br /&gt;
To draw a single image we use the tag ''ImageryComponent''. This tag requires us to define the area in which we want the image to be drawn, as well as the image to draw.&lt;br /&gt;
&lt;br /&gt;
The area is the most complex part of practically all look'n'feels. It is designed to be flexible and uses an extended version of the unified coordinate system of CEGUI 0.4 and up.&lt;br /&gt;
Besides the regular two numbers containing the relative and absolute component of the coordinate or size Falagard also allows us to use the dimensions of images, windows, text and even properties.&lt;br /&gt;
We can also perform arithmetic operations on these dimensions to a certain extent.&lt;br /&gt;
&lt;br /&gt;
Any area needs to define 4 dimensions to fully describe the area. There is some flexibility in how you define the dimensions though.&lt;br /&gt;
Probably the most common is to use one of &amp;quot;LeftEdge&amp;quot;, &amp;quot;TopEdge&amp;quot;, &amp;quot;RightEdge&amp;quot; or &amp;quot;BottomEdge&amp;quot;. These map to edges of the window that recieves the look'n'feel, but you can specify &amp;quot;Width&amp;quot; and &amp;quot;Height&amp;quot; instead of &amp;quot;RightEdge&amp;quot; and &amp;quot;BottomEdge&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The look'n'feel we're creating only needs a simple area that covers the entire widget. We'll take the XML required for that in two steps.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Area&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
 &amp;lt;/Area&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The area itself is created with the ''Area'' tag. Inside it we have the 4 dimensions. We must explicitly state the type of dimension for each one. The order is important:&lt;br /&gt;
&lt;br /&gt;
* LeftEdge&lt;br /&gt;
* TopEdge&lt;br /&gt;
* RightEdge / Width&lt;br /&gt;
* BottomEdge / Height&lt;br /&gt;
&lt;br /&gt;
You don't have to use '''both''' width and height. For example using &amp;quot;RightEdge&amp;quot; and &amp;quot;Height&amp;quot; is fine.&lt;br /&gt;
&lt;br /&gt;
This tells the area how to interpret the dimensions that we are now going to add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Area&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
         '''&amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;'''&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
         '''&amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;'''&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
         '''&amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;'''&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
         '''&amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;'''&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
 &amp;lt;/Area&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside each ''Dim'' tag we have added a dimension. Let's take them one at a time.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt; - This tell it to put our &amp;quot;LeftEdge&amp;quot; ''Dim'' at pixel position 0. All dimensions are always relative to window that has the look'n'feel, so 0 will in this case be the left edge of our widget as we planned.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt; - Just the same as before. But this time we're in a &amp;quot;TopEdge&amp;quot; ''Dim'' so it will result in the top edge of our window.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt; - A unified dimension. This one has a scale (relative) component of exactly one. And a offset (absolute) value of zero. As type we've set &amp;quot;RightEdge&amp;quot;. This is what the scale component get multiplied by to get some thing useful (pixel values). One times RightEdge will equal RightEdge, which is exactly the window dimension we want.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt; - Same as before but the bottom edge of our window as the dimension.&lt;br /&gt;
&lt;br /&gt;
Now the area to span our entire is worked out, let's add that ''ImageryComponent'' and give it its area.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;bg&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;b&amp;gt;&amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                &amp;lt;Area&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                &amp;lt;/Area&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageryComponent&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Normal&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the area is in place.&lt;br /&gt;
The ''ImageryComponent'' tag has been added to our ''ImagerySection'' and inside it we have out the area we just created.&lt;br /&gt;
All thats missing now is the image!&lt;br /&gt;
&lt;br /&gt;
We'll assume we have a imageset loaded called &amp;quot;MyImages&amp;quot;. And inside this imageset we have the image &amp;quot;ButtonBG&amp;quot; defined.&lt;br /&gt;
This is the image we'll use for our button.&lt;br /&gt;
&lt;br /&gt;
The XML looks like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;ButtonBG&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple eh?&lt;br /&gt;
&lt;br /&gt;
We also wanted the image to be stretched across the whole area of the ''ImageryComponent''. The default formatting in top/left alignment. Not good enough...&lt;br /&gt;
&lt;br /&gt;
We add the formatting tags&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vertical format must come first. Both sets stretching as the formatting. Which is what we need.&lt;br /&gt;
That's all we wanted in the look'n'feel so let's have a look at the XML for this extremely simple button skin.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;bg&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                &amp;lt;Area&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                &amp;lt;/Area&amp;gt;&lt;br /&gt;
                &amp;lt;b&amp;gt;&amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;ButtonBG&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Normal&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The three new tags just got added after the area in the ''ImageryComponent'', and we're done :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Label ==&lt;br /&gt;
You might have noticed that I have'nt talked about the label until now.&lt;br /&gt;
We'll need to take a look at it now or we won't get any text on our button.&lt;br /&gt;
With Falagard you have full control of how the text is rendered.&lt;br /&gt;
&lt;br /&gt;
For our look'n'feel we want the text to be centered both vertically and horizontally in the widget. We also want the text to wrap (word wrap) if it's too long to render as one line without being clipped.&lt;br /&gt;
&lt;br /&gt;
We'll make a new ''ImagerySection'' for our label. This gives us a nice seperation of parts to render. &amp;quot;bg&amp;quot; being the background, and a new section called &amp;quot;label&amp;quot; to represent the - You guessed it - label.&lt;br /&gt;
Inside this new ''ImagerySection'' we add a ''TextComponent'' which we'll set up to render the text like we want.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
     &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Like a ''ImageryComponent'' a ''TextComponent'' must have an area. For our button we'll allow text to span the entire window. This means that we can reuse the ''Area'' from before.&lt;br /&gt;
&lt;br /&gt;
A ''TextComponent'' by default renders the text of the window that has the look'n'feel assigned.&lt;br /&gt;
This is exactly what we want for our button.&lt;br /&gt;
&lt;br /&gt;
The formatting we wanted is easily made by using the same tag we used before (to format the background image) but with another type. The formattings supported are different for ''TextComponent'' and ''ImageryComponent''.&lt;br /&gt;
&lt;br /&gt;
Let's look at the XML for this new ''ImagerySection'' &amp;quot;label&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;Area&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;VertFormat type=&amp;quot;CentreAligned&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;HorzFormat type=&amp;quot;WordWrapCentreAligned&amp;quot; /&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
 &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We added the same area as in the &amp;quot;bg&amp;quot; ''ImagerySection'', and added the formattings we wanted. Take a look at [[Falagard System XML Enumerations reference]] for the complete listing of supported formattings (and lots of other stuff).&lt;br /&gt;
&lt;br /&gt;
This ''ImagerySection'' is done. It will render the label with the correct formatting using a white colour. By not specifying a colour we always choose white, which is useful as we can modulate it into any colour we choose later on. Which we of course will :-)&lt;br /&gt;
&lt;br /&gt;
To actually use this new &amp;quot;label&amp;quot; section we must add it to our state imagery like we did with the &amp;quot;bg&amp;quot; section earlier. So here's what the XML looks like so far:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
                &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;VertFormat type=&amp;quot;CentreAligned&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;HorzFormat type=&amp;quot;WordWrapCentreAligned&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;bg&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                &amp;lt;Area&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                &amp;lt;/Area&amp;gt;&lt;br /&gt;
                &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;ButtonBG&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Normal&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
                '''&amp;lt;Section section=&amp;quot;label&amp;quot; /&amp;gt;'''&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This look'n'feel adds the fully working label (still white) to our button skin. This is starting to become a useful look'n'feel, so let's give it the final touch by adding handling of the three other states ''Hover'', ''Pushed'' and ''Disabled'' that we left out before.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Colours ==&lt;br /&gt;
We want to use different text colours for each of these states. We also want to able to customize those colours on a per widget basis.&lt;br /&gt;
This is made possible by the property definition.&lt;br /&gt;
&lt;br /&gt;
A ''PropertyDefinition'' creates a new property in the window that gets the look'n'feel assigned. The property we create is a simple string value, but '''we''' choose what it's used for. '''Not''' CEGUI.&lt;br /&gt;
&lt;br /&gt;
In total we have 4 states for our button counting the new ones, so we'll add 4 new properties to store the text colour for each state. The XML is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;PropertyDefinition name=&amp;quot;NormalTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;PropertyDefinition name=&amp;quot;HoverTextColour&amp;quot; initialValue=&amp;quot;FFFF0000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;PropertyDefinition name=&amp;quot;PushedTextColour&amp;quot; initialValue=&amp;quot;FF00FF00&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;PropertyDefinition name=&amp;quot;DisabledTextColour&amp;quot; initialValue=&amp;quot;7F888888&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''name'' is the name the new property will be available under.&lt;br /&gt;
* ''initialValue'' is the default value for the property.&lt;br /&gt;
* ''redrawOnWrite'' when set to true the window will be redrawn when the value of the property changes.&lt;br /&gt;
&lt;br /&gt;
These properties will be available from both C++ code and in XML window layouts. So choosing a good name is a good idea.&lt;br /&gt;
You can create properties that you don't use for anything inside the look'n'feel. These will still become available which can be a good way of creating new variables for windows that you might need in your application.&lt;br /&gt;
&lt;br /&gt;
The default values represent colours in the format CEGUI would expect a colour for a built-in property.&lt;br /&gt;
Colours for CEGUI are always written in hexadecimal.&lt;br /&gt;
&lt;br /&gt;
The format is: &amp;quot;AARRGGBB&amp;quot; where:&lt;br /&gt;
* AA = Alpha&lt;br /&gt;
* RR = Red&lt;br /&gt;
* GG = Green&lt;br /&gt;
* BB = Blue&lt;br /&gt;
&lt;br /&gt;
This gives our properties the values of&lt;br /&gt;
* white for ''Normal''&lt;br /&gt;
* red for ''Hover''&lt;br /&gt;
* green for ''Pushed''&lt;br /&gt;
* 50% tranparent grey for ''Disabled''&lt;br /&gt;
&lt;br /&gt;
Setting a new value for any of these properties will make sure the button is re-rendered to show the new colour.&lt;br /&gt;
&lt;br /&gt;
The only places in the look'n'feel that know which state we are in are the ''StateImagery'' tags. The ''Section'' tags inside these allow for colours to be specified. The XML for the label in the ''Normal'' state looks like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;Section name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;ColourProperty name=&amp;quot;NormalTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Section&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''ColourProperty'' tag inside our ''Section'' ensures that all imagery in the imagery section &amp;quot;label&amp;quot; has its colour modulated by the value of the property &amp;quot;NormalTextColour&amp;quot;. The imagery section &amp;quot;label&amp;quot; render only white text, so by doing this we ensure that the colour rendered is exactly that of the value of the property &amp;quot;NormalTextColour&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We now know what to do so lets look at the XML so far for this look'n'feel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;MyButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;PropertyDefinition name=&amp;quot;NormalTextColour&amp;quot; initialValue=&amp;quot;FFFFFFFF&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;PropertyDefinition name=&amp;quot;HoverTextColour&amp;quot; initialValue=&amp;quot;FFFF0000&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;PropertyDefinition name=&amp;quot;PushedTextColour&amp;quot; initialValue=&amp;quot;FF00FF00&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;PropertyDefinition name=&amp;quot;DisabledTextColour&amp;quot; initialValue=&amp;quot;7F888888&amp;quot; redrawOnWrite=&amp;quot;true&amp;quot; /&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;TextComponent&amp;gt;&lt;br /&gt;
                &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;VertFormat type=&amp;quot;CentreAligned&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;HorzFormat type=&amp;quot;WordWrapCentreAligned&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/TextComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;bg&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                &amp;lt;Area&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                    &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                        &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; offset=&amp;quot;0&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                    &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                &amp;lt;/Area&amp;gt;&lt;br /&gt;
                &amp;lt;Image imageset=&amp;quot;MyImages&amp;quot; image=&amp;quot;ButtonBG&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Normal&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;b&amp;gt;&amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;ColourProperty name=&amp;quot;NormalTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/Section&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;b&amp;gt;&amp;lt;StateImagery name=&amp;quot;Hover&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;ColourProperty name=&amp;quot;HoverTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/Section&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Pushed&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;ColourProperty name=&amp;quot;PushedTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/Section&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;Disabled&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Layer&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;bg&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Section section=&amp;quot;label&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;ColourProperty name=&amp;quot;DisabledTextColour&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;/Section&amp;gt;&lt;br /&gt;
            &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not too hard was it? The look'n'feel reached a whole new level with these changes, as state is reflected in the text colour.&lt;br /&gt;
&lt;br /&gt;
To sum up what we've made:&lt;br /&gt;
* A look'n'feel for the ''Falagard/Button'' window type.&lt;br /&gt;
* Static background image.&lt;br /&gt;
* Formatted label.&lt;br /&gt;
* Label colour dependent on current state.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That will be enough for this time. It's getting early ;-)&lt;br /&gt;
&lt;br /&gt;
I hope this tutorial is useful and that it will help expose Falagard more broadly.&lt;br /&gt;
&lt;br /&gt;
Please give feedback in the discussion page so I can improve the tutorial where needed.&lt;br /&gt;
&lt;br /&gt;
--[[User:lindquist]] 06:10, 6 Dec 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_Beginner_Guide_to_Resource_Groups&amp;diff=4214</id>
		<title>The Beginner Guide to Resource Groups</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_Beginner_Guide_to_Resource_Groups&amp;diff=4214"/>
				<updated>2011-03-03T23:52:40Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.6}}&lt;br /&gt;
{{Series|The Beginner Guide|2}}&lt;br /&gt;
&lt;br /&gt;
{{notice|message=This tutorial is for CEGUI versions up to 0.6.2.  For later releases, see the tutorials in the main documentation.}}&lt;br /&gt;
&lt;br /&gt;
If you have read [[The Beginner Guide to Getting CEGUI Rendering]], you probably have your application set-up to perform the basic CEGUI initialisation steps and to call the System::renderGUI method, which is all very nice; but lets face it, you still can't get anything to draw!&lt;br /&gt;
&lt;br /&gt;
The next stage in this quest for the 'holy grail' (that is, to actually get CEGUI to work) is to setup resource provider groups that will later enable us to load some files so that CEGUI has some source materials to use when rendering.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What is a ResourceProvider? ==&lt;br /&gt;
CEGUI makes use of a helper object which we call the ResourceProvider. This object provides an interface between the core CEGUI library and any external file loading system.&lt;br /&gt;
&lt;br /&gt;
For example, the Ogre and Irrlicht engines have their own resource manager / file loading sub-systems, by implementing and supplying a specialised ResourceProvider object, the renderer modules for these engines allow seamless integration with these systems so that CEGUI data files are loaded via these systems. The lower level Direct3D and OpenGL libraries do not have their own resource systems as such, so for these you can use the CEGUI default resource provider.&lt;br /&gt;
&lt;br /&gt;
=== DefaultResourceProvider Explained ===&lt;br /&gt;
CEGUI's default resource provider, CEGUI::DefaultResourceProvider, supplies some basic functionality for those who do not yet have, or do not need, a more sophisticated alternative. As well as supplying the functions required by CEGUI for actually loading files and data, DefaultResourceProvider also has some rudimentary support for 'resource groups'. Here, a resource group is basically a label given to a directory or path on the system. This allows us to have logical grouping of files within directories and then to be able to refer to those location via a simple label rather than hard coded paths. In the simplest case this means that you just need to update the resource group location instead of updating path information throughout your code and in the XML files when you change the location of the data files.&lt;br /&gt;
&lt;br /&gt;
Before you can use the CEGUI::DefaultResourceProvider, you need to ensure you have included the correct header (usually at the start of your source file), for example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# include &amp;lt;CEGUIDefaultResourceProvider.h&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
==== Specifying Resource Groups and Directories ====&lt;br /&gt;
The DefaultResourceProvider allows you to define any number of named resource groups and to specify a directory to be used for each group. What this means is that you can create a resource group, say “imagesets” and assign a directory to that, for example “./mygame/datafiles/gui/imagesets/”. Then when loading an Imageset through the ImagesetManager, you could specify the resource group to be used as “imagesets” and the system will look in the predefined location.&lt;br /&gt;
At present each resource group may only have a single directory assigned to it.&lt;br /&gt;
&lt;br /&gt;
A small code example is in order to clarify what has been said. Where as previously, without the use of resource groups, you might have done this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Imageset* wlis = ImagesetManager::getSingleton().createImageset(&lt;br /&gt;
	&amp;quot;./mygame/datafiles/gui/imagesets/WindowsLook.imageset&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using resource groups, at initialisation time, you create the resource groups in the default resource provider, like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
DefaultResourceProvider* rp = static_cast&amp;lt;DefaultResourceProvider*&amp;gt;(&lt;br /&gt;
	CEGUI::System::getSingleton().getResourceProvider());&lt;br /&gt;
&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;imagesets&amp;quot;, &amp;quot;./mygame/datafiles/gui/imagesets/&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then later on in the code, when you need to load the imageset, you can reference the resource group to be used, like this:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
Imageset* wlis = ImagesetManager::getSingleton().createImageset(&lt;br /&gt;
	&amp;quot;WindowsLook.imageset&amp;quot;, &amp;quot;imagesets&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note how you do not need to specify any path information; the path information is obtained from the resource group specified, in the example this is &amp;quot;imagesets&amp;quot;. We will later show you how you set default resource groups for each of the resource types – then you do not have to specify the group when you load a resource (unless you're loading it from a group that is not the default, of course).&lt;br /&gt;
&lt;br /&gt;
Another important thing to consider is that using this approach, the data files should not contain relative path information – they should, in general, just have the actual file name.&lt;br /&gt;
&lt;br /&gt;
== Default Resource Groups ==&lt;br /&gt;
Each of the system classes that represents a loadable resource has static members to set and get a default resource group. This resource group will be used when loading the specific data files needed by a given class – in the case of the Imageset class, the default resource group should reference a directory holding the imageset xml and texture image files.&lt;br /&gt;
&lt;br /&gt;
For each of the resource consuming classes, the static members are named the same (special exception is xerces – see below):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const String&amp;amp; getDefaultResourceGroup();&lt;br /&gt;
void setDefaultResourceGroup(const String&amp;amp; groupname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following is a list of the core resource loading classes and the resources that they load:&lt;br /&gt;
&lt;br /&gt;
 CEGUI::Imageset			- Imageset xml and texture image files. &lt;br /&gt;
 CEGUI::Font			- Font xml and ttf font files.&lt;br /&gt;
 CEGUI::Scheme			- Scheme xml files.&lt;br /&gt;
 CEGUI::WindowManager		- Window layout xml files.&lt;br /&gt;
 CEGUI::WidgetLookManager	- LookNFeel xml files&lt;br /&gt;
 CEGUI::ScriptModule		- Script files in whichever scripted langauge.&lt;br /&gt;
&lt;br /&gt;
There is one special exception, as mentioned above – that is the Xerces-C based XML parser. For this there is a special resource group setting to specify where the schema files can be found (these are the .xsd files used for xml validation). For this special case, the static members are:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 const String&amp;amp; XercesParser::getSchemaDefaultResourceGroup();&lt;br /&gt;
 void XercesParser::setSchemaDefaultResourceGroup(const String&amp;amp; groupname);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One final thing to consider, is that the resource provider class also has a default group. This should be considered a 'global' default – it is used whenever a specific resource loading class has no default of its own specified. This could be useful if you have all your data in a single directory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DefaultResourceProvider Setup: A Complete Example ==&lt;br /&gt;
To close, we will show how the CEGUI samples framework does the initialisation of resource groups and their target directories, and how we assign the default groups to be used for all of the resource types.&lt;br /&gt;
&lt;br /&gt;
After initialising the core CEGUI::System object as usual, we then specify a set of resource groups and their target directories:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// initialise the required dirs for the DefaultResourceProvider&lt;br /&gt;
CEGUI::DefaultResourceProvider* rp = static_cast&amp;lt;CEGUI::DefaultResourceProvider*&amp;gt;&lt;br /&gt;
    (CEGUI::System::getSingleton().getResourceProvider());&lt;br /&gt;
&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;schemes&amp;quot;, &amp;quot;../datafiles/schemes/&amp;quot;);&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;imagesets&amp;quot;, &amp;quot;../datafiles/imagesets/&amp;quot;);&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;fonts&amp;quot;, &amp;quot;../datafiles/fonts/&amp;quot;);&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;layouts&amp;quot;, &amp;quot;../datafiles/layouts/&amp;quot;);&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;looknfeels&amp;quot;, &amp;quot;../datafiles/looknfeel/&amp;quot;);&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;lua_scripts&amp;quot;, &amp;quot;../datafiles/lua_scripts/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// This is only needed if you are using Xerces and need to&lt;br /&gt;
// specify the schemas location&lt;br /&gt;
rp-&amp;gt;setResourceGroupDirectory(&amp;quot;schemas&amp;quot;, &amp;quot;../../XMLRefSchema/&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Now that is done, we have a nice set of resource groups defined with their target directories set. Finally, to get the system to use these new directories, we set the default resource groups to be used:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// set the default resource groups to be used&lt;br /&gt;
CEGUI::Imageset::setDefaultResourceGroup(&amp;quot;imagesets&amp;quot;);&lt;br /&gt;
CEGUI::Font::setDefaultResourceGroup(&amp;quot;fonts&amp;quot;);&lt;br /&gt;
CEGUI::Scheme::setDefaultResourceGroup(&amp;quot;schemes&amp;quot;);&lt;br /&gt;
CEGUI::WidgetLookManager::setDefaultResourceGroup(&amp;quot;looknfeels&amp;quot;);&lt;br /&gt;
CEGUI::WindowManager::setDefaultResourceGroup(&amp;quot;layouts&amp;quot;);&lt;br /&gt;
CEGUI::ScriptModule::setDefaultResourceGroup(&amp;quot;lua_scripts&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Again, you only need to this one if you are using xerces and have&lt;br /&gt;
// defined a group for schemas.&lt;br /&gt;
CEGUI::XercesParser::setSchemaDefaultResourceGroup(&amp;quot;schemas&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Here you have had a brief introduction to the DefaultResourceProvider class, you have seen how to create resource groups and assign directory locations to them, and you have also seen how to specify default resource groups for each resource type CEGUI uses.&lt;br /&gt;
&lt;br /&gt;
[[User:CrazyEddie]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_Beginner_Guide_to_Loading_Data_Files_and_Initialisation&amp;diff=4213</id>
		<title>The Beginner Guide to Loading Data Files and Initialisation</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_Beginner_Guide_to_Loading_Data_Files_and_Initialisation&amp;diff=4213"/>
				<updated>2011-03-03T23:52:30Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.6}}&lt;br /&gt;
{{Series|The Beginner Guide|3}}&lt;br /&gt;
&lt;br /&gt;
{{notice|message=This tutorial is for CEGUI versions up to 0.6.2.  For later releases, see the tutorials in the main documentation.}}&lt;br /&gt;
&lt;br /&gt;
Ok. Now you have read [[The Beginner Guide to Getting CEGUI Rendering]] and [[The Beginner Guide to Resource Groups]], the next rung on the ladder to success is to actually load in the files that CEGUI will be using to produce some output!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview: Data Files ==&lt;br /&gt;
CEGUI uses a variety of data files and initially there may be some confusion over what these are, how they relate to each other and how they get loaded. So before we get started with the meat of all this, I will introduce the data files, what they are, what they're used for, and how they get loaded into CEGUI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XML, XSD? It's all XML! ===&lt;br /&gt;
With the notable exceptions of graphical image files and loadable modules (DLL and so files, etc), the majority of the data files used by CEGUI are actually XML. This leads us to the first obstacle that people run into; the .xsd schema files.&lt;br /&gt;
&lt;br /&gt;
Although the Expat XML parsing library is now becoming CEGUI's default library, the previous long time default, and CrazyEddie's own preferred XML parsing library is the [http://xerces.apache.org/xerces-c Xerces-C++] library from the [http://www.apache.org Apache Software Foundation]. The advantage of using this particular library to handle parsing XML is that it provides ''schema validation''. Schema validation is a means by which we can check, at parse time, whether the input file contains the expected data and that the data is correctly specified. To do this, the system requires some additional files which are known as schema files, which have the .xsd file extension - the master copies of CEGUI's schema files are currently found in the ''cegui_mk2/XMLRefSchema/'' directory. Anyway, the only thing you need to know about these .xsd files for now is that, when using Xerces-C++ as a parser, they must be available to the ResourceProvider system; this is best achieved by setting up a resource group to a directory containing the schema files and setting that group as the default to be used by CEGUI::XercesParser when loading schema files ([[The Beginner Guide to Resource Groups]] shows how to do this).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The Data Files ===&lt;br /&gt;
As mentioned above, with a couple of exceptions, all data files in CEGUI are XML. Rather than using the generic '.xml' file extension, the data files are named according to what the files actually represent; so .imageset for an Imageset and .font for a Font, etc. Below is a very brief overview of each file type; more advanced discussion of the files and their capabilities can be found elsewhere.&lt;br /&gt;
&lt;br /&gt;
==== Imageset ====&lt;br /&gt;
Effectively, an Imageset is just a collection of defined regions upon the source image / texture file (which is also specified in the Imageset definition). Each of these defined regions has a unique name and is known within the system as an Image. An Image as defined in an Imageset is the basic level of imagery used by CEGUI. By modifying the source image / texture file and also the position and size of the defined regions within the Imageset files you can easily change the appearance of what gets drawn by CEGUI.&lt;br /&gt;
&lt;br /&gt;
==== Font ====&lt;br /&gt;
A Font file, unsurprisingly, defines a font for use in CEGUI. There are two types of font which can be defined:&lt;br /&gt;
; FreeType Font : This is a font based upon a true-type (.ttf) font file. It is denoted with Type=&amp;quot;FreeType&amp;quot; in the .font file starting with version 0.5.0 of CEGUI. In previous versions it was known as &amp;quot;Dynamic&amp;quot;.&lt;br /&gt;
; Pixmap Font : Also known as a bitmapped font, this type of font is based upon an Imageset which defines Images for the font glyphs. It is denoted with Type=&amp;quot;Pixmap&amp;quot; in the .font file starting with version 0.5.0 of CEGUI. In previous versions it was known as &amp;quot;Static&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Scheme ====&lt;br /&gt;
A Scheme is a largely means to group other data files together, it's also the most convenient way to load and register widget types. A Scheme can contain one or more of the following (which will be loaded and initialised when the scheme is loaded):&lt;br /&gt;
* Imageset (either a full Imageset via XML, or a single image via an image file)&lt;br /&gt;
* Font&lt;br /&gt;
* Window Set&lt;br /&gt;
* Window Renderer Set&lt;br /&gt;
* Window Alias&lt;br /&gt;
* [[Falagard]] Mapping&lt;br /&gt;
&lt;br /&gt;
===== Imageset and Font =====&lt;br /&gt;
These have already been mentioned above. The specifications here just get them to load as part of the scheme.&lt;br /&gt;
&lt;br /&gt;
===== Window Set =====&lt;br /&gt;
Basically specifies the name of a loadable module (.dll / .so, etc), and a set of widget names contained within that module that you wish to register with the system. If no names are listed, all available types in the module are registered.&lt;br /&gt;
&lt;br /&gt;
===== Window Renderer Set =====&lt;br /&gt;
Specifies the name of a loadable module (.dll / .so, etc), and a set of window renderer names contained within that module that you wish to register with the system. If no names are listed, all available types in the module are registered. A 'Window Renderer' is an object that can control rendering for some base window type(s), all the window renderer objects supplied with CEGUI perform rendering by making use of the 'Falagard' skinning system (though this is not a strict requirement).&lt;br /&gt;
&lt;br /&gt;
===== Window Alias =====&lt;br /&gt;
Provides a means to refer to a window / widget type by alternative names, it can also be used to 'hide' an already registered widget type with another widget type (so that other widget type gets used instead).&lt;br /&gt;
&lt;br /&gt;
===== [[Falagard]] Mapping =====&lt;br /&gt;
Used to create a usable ''Window Type'' type from a ''Target Type'' which names the base type containing the functionality, a ''Renderer'' which names a Window Renderer that can control rendering for the specified target type, and a ''LookNFeel'' which names a skin to be applied (these are normally specified via XML looknfeel files).&lt;br /&gt;
&lt;br /&gt;
==== Layout ====&lt;br /&gt;
A layout file contains an XML representation of a window layout. Each nested 'Window' element defines a window or widget to be created, the 'Property' elements define the desired settings and property values for each window defined.&lt;br /&gt;
&lt;br /&gt;
==== Config ====&lt;br /&gt;
CEGUI Supports the use of a config file. This file allows you to specify some defaults, such as a Scheme to load, a layout to load, initialisation and termination script files (when using a ScriptModule), and some other things which are not discussed here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Loading the Basic Files ==&lt;br /&gt;
In order to get things up and running you need to load in some files. The minimal set of files required are:&lt;br /&gt;
* Imageset&lt;br /&gt;
* Font&lt;br /&gt;
* Scheme&lt;br /&gt;
&lt;br /&gt;
The good thing about the Scheme file is that it can be used to load the other two automatically. For the purposes of this tutorial, we will load a scheme file and a font file - it is assumed the scheme automatically loads an Imageset for us. This is done as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;// load in the scheme file, which auto-loads the TaharezLook imageset&lt;br /&gt;
CEGUI::SchemeManager::getSingleton().loadScheme( &amp;quot;TaharezLook.scheme&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
// load in a font. The first font loaded automatically becomes the default font.&lt;br /&gt;
if(! CEGUI::FontManager::getSingleton().isFontPresent( &amp;quot;Commonwealth-10&amp;quot; ) )&lt;br /&gt;
  CEGUI::FontManager::getSingleton().createFont( &amp;quot;Commonwealth-10.font&amp;quot; );&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above code snippet (and in the sample files) it is assumed that the resource group locations and the default groups have all been set up as described in [[The Beginner Guide to Resource Groups]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Simple Defaults Initialisation ==&lt;br /&gt;
Finally, you need to specify some defaults. This is to ensure that the system always has a font and mouse cursor available for when a window or widget specifies no preference of its own.&lt;br /&gt;
&lt;br /&gt;
In reality, we no longer need to specify a default font, since the FontManager will now automatically set the first loaded font as the default. Although if this is not the default font you require, you can set a different one as you desire. The code to set a default font is as follows:&lt;br /&gt;
&lt;br /&gt;
 System::getSingleton().setDefaultFont( &amp;quot;Commonwealth-10&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
The other default object you need to set is the mouse cursor. This is to ensure that when you move the mouse over any element that does not set a cursor of its own the cursor does not disappear. The code to set the default mouse cursor is as follows (NB: This uses the TaharezLook imageset which was loaded with the scheme above).&lt;br /&gt;
&lt;br /&gt;
 System::getSingleton().setDefaultMouseCursor( &amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
If you intend to use tool tips, usually you specify the name of the ToolTip based widget type that you want used. It is actually possible to set this on a per-window basis, though that is not normally required, and is beyond the scope of this little introduction. Anyway, to specify the tool tip window type:&lt;br /&gt;
&lt;br /&gt;
 System::getSingleton().setDefaultTooltip( &amp;quot;TaharezLook/Tooltip&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Here we have discovered the very basics of what the various data files used by CEGUI are, how they are loaded, and the minimal initialisation needed for CEGUI applications. Other articles will discuss each of the data files types in greater detail allowing advanced uses to be discovered.&lt;br /&gt;
&lt;br /&gt;
[[User:CrazyEddie]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_Beginner_Guide_to_Getting_CEGUI_Rendering&amp;diff=4212</id>
		<title>The Beginner Guide to Getting CEGUI Rendering</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_Beginner_Guide_to_Getting_CEGUI_Rendering&amp;diff=4212"/>
				<updated>2011-03-03T23:52:20Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.6}}&lt;br /&gt;
{{Series|The Beginner Guide|1}}&lt;br /&gt;
&lt;br /&gt;
{{notice|message=This tutorial is for CEGUI versions up to 0.6.2.  For later releases, see the tutorials in [http://www.cegui.org.uk/docs/current/ the main documentation].}}&lt;br /&gt;
&lt;br /&gt;
In order to get CEGUI to render, no matter what your target engine is, there are basically three steps that must be done.&lt;br /&gt;
&lt;br /&gt;
# Create an instance of a CEGUI::Renderer based object.&lt;br /&gt;
# Create the CEGUI::System object.&lt;br /&gt;
# Call the method to render the GUI.&lt;br /&gt;
&lt;br /&gt;
Obviously you also need to load some data and perform very basic initialisation, which is covered in [[The Beginner Guide to Loading Data Files and Initialisation]], and also you need to get your inputs into the system which is covered in [[The Beginner Guide to Injecting Inputs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Create an instance of a CEGUI::Renderer based object ===&lt;br /&gt;
This is fairly straight forward and should pose no major obstacles for any of the supported renderers. You must of course remember to include the header file for the renderer that you will be using, also remember that for Ogre3D the renderer module now comes with CEGUI and not Ogre (Huh? Since when? As of 23/02/2010 (CEGUI 0.7.1, OGRE 1.7) the module is called CEGUIOgreRenderer, and is in CEGUI's sources, not Ogre's). (Note that you need to delete the Renderer object when you are cleaning up the program.) &lt;br /&gt;
&lt;br /&gt;
The basic renderer creation code is:&lt;br /&gt;
&lt;br /&gt;
'''Direct3D 8.1'''&lt;br /&gt;
 CEGUI::DirectX81Renderer* myRenderer =&lt;br /&gt;
    new CEGUI::DirectX81Renderer( myD3D8Device );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Direct3D 9'''&lt;br /&gt;
 CEGUI::DirectX9Renderer* myRenderer =&lt;br /&gt;
    new CEGUI::DirectX9Renderer( myD3D9Device, 0 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OpenGL'''&lt;br /&gt;
 CEGUI::OpenGLRenderer* myRenderer = &lt;br /&gt;
    new CEGUI::OpenGLRenderer( 0 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ogre3D'''&lt;br /&gt;
 CEGUI::OgreCEGUIRenderer* myRenderer = &lt;br /&gt;
    new CEGUI::OgreCEGUIRenderer( myRenderWindow );&lt;br /&gt;
''Note:'' Using Ogre 1.4.9 with CEGUI 0.6.2 binding the renderer to the scene manager seems to be required (in my case the GUI was not displayed while the mouse events were properly processed). To bind a scene manager to the renderer, use the ''setTargetSceneManager'' method:&lt;br /&gt;
 myRenderer-&amp;gt;setTargetSceneManager(mySceneManager);&lt;br /&gt;
&lt;br /&gt;
'''Irrlicht Engine'''&lt;br /&gt;
 CEGUI::IrrlichtRenderer* myRenderer = &lt;br /&gt;
    new CEGUI::IrrlichtRenderer( myIrrlichtDevice, true );&lt;br /&gt;
&lt;br /&gt;
=== Create the CEGUI::System object to initialise the system ===&lt;br /&gt;
Another extremely simple step. Just instantiate the CEGUI::System object by using 'new' and passing in a pointer to the CEGUI::Renderer that you created in the previous step. This will cause the entire system to initialise itself.&lt;br /&gt;
&lt;br /&gt;
 new CEGUI::System( myRenderer );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Call the method to render the GUI ===&lt;br /&gt;
This is the only step that, depending upon your target engine, can be done differently. Basically what you need to do call the CEGUI::System::renderGUI method at the end of your rendering loop. For lucky users of the Ogre3D engine, this step is taken care of automatically. For everybody else, some simple example code can be seen below&lt;br /&gt;
&lt;br /&gt;
'''Direct3D 8.1 / 9'''&lt;br /&gt;
 // Start the scene&lt;br /&gt;
 myD3DDevice-&amp;gt;BeginScene();&amp;lt;br /&amp;gt;&lt;br /&gt;
 // clear display&lt;br /&gt;
 myD3DDevice-&amp;gt;Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);&amp;lt;br /&amp;gt;&lt;br /&gt;
 // user function to draw 3D scene&lt;br /&gt;
 draw3DScene();&amp;lt;br /&amp;gt;&lt;br /&gt;
 // draw GUI&lt;br /&gt;
 '''CEGUI::System::getSingleton().renderGUI();'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 // end the scene&lt;br /&gt;
 myD3DDevice-&amp;gt;EndScene();&amp;lt;br /&amp;gt;&lt;br /&gt;
 // finally present the frame.&lt;br /&gt;
 myD3DDevice-&amp;gt;Present(0, 0, 0, 0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OpenGL'''&lt;br /&gt;
 // user function to draw 3D scene&lt;br /&gt;
 draw3DScene();&amp;lt;br /&amp;gt;&lt;br /&gt;
 // draw GUI (should not be between glBegin/glEnd pair)&lt;br /&gt;
 '''CEGUI::System::getSingleton().renderGUI();'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Irrlicht'''&lt;br /&gt;
 // start the scene&lt;br /&gt;
 myIrrlichtDriver-&amp;gt;beginScene(true, true, irr::video::SColor(150,50,50,50));&amp;lt;br /&amp;gt;&lt;br /&gt;
 // draw main scene&lt;br /&gt;
 myIrrlichtSceneManager-&amp;gt;drawAll();&amp;lt;br /&amp;gt;&lt;br /&gt;
 // draw gui&lt;br /&gt;
 '''CEGUI::System::getSingleton().renderGUI();'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 // end the scene&lt;br /&gt;
 myIrrlichtDriver-&amp;gt;endScene();&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
This is the ''most basic'' introduction to setting up CEGUI to render. There are things not covered here, such as using different scene managers in Ogre and advanced options such as user specified resource providers, and so on.&lt;br /&gt;
&lt;br /&gt;
[[User:CrazyEddie]] 03:34, 9 February 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=The_%22official%22_layout_editor&amp;diff=4211</id>
		<title>The &quot;official&quot; layout editor</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=The_%22official%22_layout_editor&amp;diff=4211"/>
				<updated>2011-03-03T23:52:10Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Official layout editor for CEGUI is CELayoutEditor.&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
* [[CELayout Editor - Getting Started / Building]]&lt;br /&gt;
* [[CELayoutEditor Manual]]&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
* [[User Interface]]&lt;br /&gt;
&lt;br /&gt;
[[Category:CELayoutEditor]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Subversion&amp;diff=4210</id>
		<title>Subversion</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Subversion&amp;diff=4210"/>
				<updated>2011-03-03T23:52:00Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page introduce the use of subversion. If you're only intent is to get the files from subversion you should start with [[Obtaining the library source from Subversion]] which help you in getting the file and compiling CEGUI. This page dive deeper in the use of subversion as a standard user as well as a developer of the library itself. This page presents the use of subversion with the command line tool available for windows, mac and linux. &lt;br /&gt;
&lt;br /&gt;
First of all here is some urls to get started with subersion usage : &lt;br /&gt;
* Repository url: [https://svn.sourceforge.net/svnroot/crayzedsgui/ https://svn.sourceforge.net/svnroot/crayzedsgui/] &lt;br /&gt;
** CEGUI library latest development files url: [https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk]&lt;br /&gt;
** CEGUI Layout Editor latest version url: [https://svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk https://svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk]&lt;br /&gt;
** Repository browser: [http://svn.sourceforge.net/viewcvs.cgi/crayzedsgui/cegui_mk2/ http://svn.sourceforge.net/viewcvs.cgi/crayzedsgui/cegui_mk2/]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Glossary ==&lt;br /&gt;
* Repository: That's the place storing all the files and revisions. It's hosted by sourceforge. In Subversion respository are identified using urls.&lt;br /&gt;
* Working Copy: A working copy is a local view of part of the repository. You can retrieve a local copy using the checkout command. A working copy contains the file as well as a lot of additional information. The size of the working copy is more than twice the size of the file of the project. &lt;br /&gt;
* Branches: Subversion does not provides branches concept, however it's possible to organize the project in several branches. The current development branch is known as trunk. The other branches are stored in a folder named .... branches. So a branch in Subversion is just a folder in branches. &lt;br /&gt;
* Tags: Subversion does not provides tags concept. Like branches tags are only subfolder of the tags folder. &lt;br /&gt;
* Revision: Snapshot of the tree at a given time. Each modification on the tree create a new revision. &lt;br /&gt;
&lt;br /&gt;
== Layout of the repository ==&lt;br /&gt;
At this moment there are two projects in the CEGUI repository. The CEGUI library and the layout editor. The repository is organised as follows:&lt;br /&gt;
* cegui_mk2 : The cegui library itself &lt;br /&gt;
** trunk : The main development stream &lt;br /&gt;
** branches : Branches (features testing are prefix with pre-) &lt;br /&gt;
** tags: Release of the CEGUI library &lt;br /&gt;
* CELayoutEditor : The editor files &lt;br /&gt;
** trunk : The main development stream &lt;br /&gt;
** branches : Branches &lt;br /&gt;
** tags: Release of the editor&lt;br /&gt;
&lt;br /&gt;
== Getting a working copy of the project ==&lt;br /&gt;
In order to get the files from the Sourceforge server one can use two commands. Both commands retrieve the files, however the second command excludes you from staying up-to-date or create patches. If you plan to get the sources, create your library, install it and remove them, the second solution is the best for you. &lt;br /&gt;
 svn checkout url [dest_dir] &lt;br /&gt;
 svn co url [dest_dir]&lt;br /&gt;
or &lt;br /&gt;
 svn export url [dest_dir]&lt;br /&gt;
&lt;br /&gt;
Using each of these commands you will get you the latest version of any file with url as root tree. You can get files at a particular revision using an additional parameter: &lt;br /&gt;
 svn checkout/export [-r number] url [dest_dir]. It usefull to test older version. There is no named revision in subversion but it's easy to create tags which provides the same features.&lt;br /&gt;
&lt;br /&gt;
== Updating your working copy ==&lt;br /&gt;
When you choose 'checkout', you now have a working copy of the library or the editor. You can keep it in sync with the repository at Sourceforge with the following command: &lt;br /&gt;
 svn update [folder|file]&lt;br /&gt;
 svn up [folder|file]&lt;br /&gt;
&lt;br /&gt;
== Getting history of modifications ==&lt;br /&gt;
In order to get a kind of changelog you can use subversion. Each modification of the repository comes with a text message explaining the last modification. You can get the history of any file or directory of your working copy using:&lt;br /&gt;
 svn log [url]  (remote repository) &lt;br /&gt;
 svn log [path] (working copy)&lt;br /&gt;
&lt;br /&gt;
== Making change to your working copy ==&lt;br /&gt;
There is several change that can be made on subversion repository : adding, removing, renamming and modifying files, adding, removing and renamming directory. A standard work session consists in the following operation. &lt;br /&gt;
# Update your working copy &lt;br /&gt;
# Make your change &lt;br /&gt;
# commit your change &lt;br /&gt;
&lt;br /&gt;
This section focus on the second step of a work session. Files and directory are not handled automatically by subversion you must first explain to subversion that those file must be manage d. This is done using the add command: &lt;br /&gt;
 svn add source.cpp // Add source.cpp to your local subversion copy &lt;br /&gt;
 svn add subdir  // Add subdir to your local subversion copy as well as all file contained in the repository itself &lt;br /&gt;
One of the improvement of subversion compared to CVS is its ability to remove file as well as folder this done by the rm or delete command &lt;br /&gt;
 svn del source.cpp &lt;br /&gt;
Finally you can rename file or directory using the mv command. This command does not allow mass moving like the standard mv command of unix system. rename is an alias of this command. &lt;br /&gt;
 svn mv source dest &lt;br /&gt;
&lt;br /&gt;
You can use any text editor to edit your files. Subversion will do its best to send on the network only the change you've made to your working copy. &lt;br /&gt;
&lt;br /&gt;
''Must talk about loking facilities here''&lt;br /&gt;
&lt;br /&gt;
== Branching, Tagging, Merging ==&lt;br /&gt;
In subversion a branch or a tag is just a folder in the corresponding folders. In order to create a branch one needs to use the copy operation. Copying a complete tree in subversion is cheap. In order to create a branch or tag use the following operation : &lt;br /&gt;
 svn copy url_source url_dest &lt;br /&gt;
I suggest using url of the repository directly. In order to create a branch of CEGUI use : &lt;br /&gt;
 svn copy https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/branches/v0-5&lt;br /&gt;
To create a tag use : &lt;br /&gt;
 svn copy https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/branches/v0-5 https://svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/tags/v0-5-0 &lt;br /&gt;
&lt;br /&gt;
A final notes on TAG. Nothing prevents someone to make changes on a tag. It's up to the developer to do changes only on trunk and branches. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have fixed a lot of bug in a subsystem or want to apply some of the change made to trunk to a specific branch you have to merge. Merging requires a working copy. &lt;br /&gt;
 svn merge url_from url_to working_copy_path&lt;br /&gt;
&lt;br /&gt;
'' Merging need some improvement ''&lt;br /&gt;
'' Need to add some information on conflict'' &lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
Subversion allows one to attach meta information to any file and folder in the repository. Those information are called properties. The table bellow list most interesting properties: &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
||'''Name'''||'''Values'''||'''Description'''||'''Files||Directories&lt;br /&gt;
|-&lt;br /&gt;
||svn:executable||set/unset||Tel whether the file should be made executable or not||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:mime-type||mime of the file||Tel the mime type of the file. This is use to select the diff algorithm used||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:ignore||*.o *.lo ...||List file to be ignore by svn command||no||yes&lt;br /&gt;
|-&lt;br /&gt;
||svn:keywords||Date,Revision,Author,HeadURL,Id||It allows subversion to automatically substitue some field in the file on check out or update||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:eol-style||native*,CRLF,CR,LF||It allows automatic conversion from one eol style to another||yes||no&lt;br /&gt;
|-&lt;br /&gt;
||svn:externals||svn url||It allows to create soft link between to subversion repository||no||yes&lt;br /&gt;
|-&lt;br /&gt;
||svn:needs-lock||set/unset||Tel whether the file must be locked before editing or not||yes||yes&lt;br /&gt;
|}&lt;br /&gt;
You can also defines your own properties for whatever use you might need them. When one adds a file to subversion it must add the svn:eol-style property to the value native for all text file. It can be made automatically using autoprops facilities of svn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to manipulate properties you can use &lt;br /&gt;
 svn propset name value url/file &lt;br /&gt;
 svn proplist url/file&lt;br /&gt;
 svn propget name url/file &lt;br /&gt;
 svn propdel url/file&lt;br /&gt;
 svn propedit name url/file&lt;br /&gt;
&lt;br /&gt;
== Pitfalls ==&lt;br /&gt;
&lt;br /&gt;
== Configuring subversion ==&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [http://subversion.tigris.org/ Subversion home] (to get the software)&lt;br /&gt;
* [http://svnbook.red-bean.com/ Subversion book] (to learn a lot more than what you read in this page) &lt;br /&gt;
* [http://tortoisesvn.tigris.org/ TortoiseSVN] (Win32 client, a must)&lt;br /&gt;
&lt;br /&gt;
[[Category:CEGUI Developer Team]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Scheme_files&amp;diff=4209</id>
		<title>Scheme files</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Scheme_files&amp;diff=4209"/>
				<updated>2011-03-03T23:51:50Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
CEGUI is pretty modular in many aspects. Resource loading, rendering, scripting and window-factories, can all be controlled by client modules.&lt;br /&gt;
The scheme file concerns resource loading.&lt;br /&gt;
&lt;br /&gt;
The first thing most users do when initialising CEGUI, is to load a scheme. This could for example be &amp;quot;../datafiles/schemes/TaharezLookSkin.scheme&amp;quot;. This scheme file is probably the most used currently, and will load the [[Falagard]] version of classic TaharezLook into the library.&lt;br /&gt;
&lt;br /&gt;
If one takes a closer look at this file, they'll see that it is a XML document, ready to be edited... The nice thing here is that it's no longer necessary to recompile, to change the resources to be loaded. Furthermore a scheme acts like a &amp;quot;resource package&amp;quot; as we can unload all resources that is loaded by a scheme given we know its name. From a coding perspective this is nice as it simplifies the resource management. All you have to create/destroy is the scheme it self. CEGUI worries about all the individual resources specified in the XML file for you...&lt;br /&gt;
&lt;br /&gt;
This document is largely based on the 'Readme.txt' file in the 'XMLRefSchema' directory of the source distribution by Paul himself.&lt;br /&gt;
&lt;br /&gt;
== Document structure ==&lt;br /&gt;
A CEGUI sheme follows a &amp;quot;strict&amp;quot; order dependent structure that looks like this:&lt;br /&gt;
&lt;br /&gt;
* '''GUIScheme'''&lt;br /&gt;
** '''Imageset'''&lt;br /&gt;
** '''ImagesetFromImage'''&lt;br /&gt;
** '''Font'''&lt;br /&gt;
** '''LookNFeel'''&lt;br /&gt;
** '''WindowSet'''&lt;br /&gt;
*** '''WindowFactory'''&lt;br /&gt;
** '''WindowRendererSet''' (CEGUI 0.5.X only)&lt;br /&gt;
*** '''WindowRendererFactory'''&lt;br /&gt;
** '''WindowAlias'''&lt;br /&gt;
** '''FalagardMapping'''&lt;br /&gt;
&lt;br /&gt;
All elements are optional and can be repeated. Two imagesets - for example - are after all a fairly common ;-)&lt;br /&gt;
&lt;br /&gt;
Each element will be described individually below.&lt;br /&gt;
&lt;br /&gt;
== GUIScheme ==&lt;br /&gt;
Root element. Has a name attribute, and a collection of sub-elements which can be Imageset, ImagesetFromFile, Font, LookNFeel, WindowSet, FalagardMapping and WindowAlias elements.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Name''' - Specifies the name that the scheme will use within the system. ''Required''.&lt;br /&gt;
&lt;br /&gt;
''GUIScheme'' is the root element and is the only &amp;quot;global&amp;quot; tag.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     ...&lt;br /&gt;
     ... resources ...&lt;br /&gt;
     ...&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All schemes will have this XML as all the &amp;quot;magic&amp;quot; goes inside it :-)&lt;br /&gt;
&lt;br /&gt;
=== Imageset ===&lt;br /&gt;
Specifies an Imageset to be loaded as part of this scheme. Has attributes but no sub-elements.&lt;br /&gt;
If an imageset with the requested name already exists, the file specified is not loaded.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Name''' - The name of the Imageset. ''Required''.&lt;br /&gt;
* '''Filename''' - Filename of the Imageset file. If the imageset created by this file does not = Name above, an exception is thrown. ''Required''.&lt;br /&gt;
* '''ResourceGroup''' - The resource group identifier to pass to the resource provider when loading the file. ''Optional''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     '''&amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example the file &amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; must define the imageset named &amp;quot;MyImages&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== ImagesetFromFile ===&lt;br /&gt;
Specifies an Imageset to be loaded as part of this scheme. Has attributes but no sub-elements.&lt;br /&gt;
If an imageset with the requested name already exists, the file specified is not loaded.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Name''' - The name of the Imageset. ''Required''.&lt;br /&gt;
* '''Filename''' - Filename of the image file to load in order to create this Imageset. ''Required''.&lt;br /&gt;
* '''ResourceGroup''' - The resource group identifier to pass to the resource provider when loading the image file. ''Optional''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     '''&amp;lt;ImagesetFromFile Name=&amp;quot;MyBackground&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyBackground.tga&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example the file &amp;quot;../datafiles/imagesets/MyBackground&amp;quot; is a Targa (.TGA) image file. By default an Imageset loaded like this defines a single image named '''full_image''' that covers the entire texture (the content of the image file).&lt;br /&gt;
&lt;br /&gt;
=== Font ===&lt;br /&gt;
Specifies a Font to be loaded as part of the scheme. Has attributes but no sub-elements.&lt;br /&gt;
If a font with the requested name already exists, the file specified is not loaded.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Name''' - The name of the Font ''Required''.&lt;br /&gt;
* '''Filename''' - Filename of the Font file. If the font created by this file does not = Name above, an exception is thrown. ''Required''.&lt;br /&gt;
* '''ResourceGroup''' - The resource group identifier to pass to the resource provider when loading the file. ''Optional''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     '''&amp;lt;Font Name=&amp;quot;MyFont&amp;quot; Filename=&amp;quot;../datafiles/fonts/MyFont.font&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Font element always loads font XML files. These are not covered here.&lt;br /&gt;
&lt;br /&gt;
=== LookNFeel ===&lt;br /&gt;
Specifies a LookNFeel to be loaded as part of the scheme. Has attributes but no sub-elements.&lt;br /&gt;
The XML file loaded by this element may contain many widget looks which will all become available.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Filename''' - Filename of the LookNFeel file to parse. ''Required''.&lt;br /&gt;
* '''ResourceGroup''' - The resource group identifier to pass to the resource provider when loading the file. ''Optional''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
     '''&amp;lt;LookNFeel Filename=&amp;quot;../datafiles/looknfeel/MySkin.looknfeel&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Loading a look'n'feel specification is not enough. We must create a FalagardMapping as well. More on this soon. Just know that now the widget looks specified in MySkin.looknfeel are available to falagard mappings. At least the imageset we use in MySkin is available ;-)&lt;br /&gt;
&lt;br /&gt;
=== WindowSet ===&lt;br /&gt;
Specifies a module containing concrete GUI elements and their factories. Has attributes and zero or more WindowFactory sub-elements. That is you can optionally specify WindowFactory sub-elements. If they are omitted all available factories in the module are loaded.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Filename''' - Specifies the name of the loadable module (dll / .so / etc). ''Required''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;LookNFeel Filename=&amp;quot;../datafiles/looknfeel/MySkin.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
     '''&amp;lt;WindowSet Filename=&amp;quot;CEGUIFalagardBase&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CEGUI 0.4.X provides 3 windowsets. Falagard, WindowsLook and TaharezLook. The above sample code is only valid for CEGUI 0.4.X.&lt;br /&gt;
&lt;br /&gt;
CEGUI 0.5.X provides no widget sets. All the core widgets are part of the CEGUIBase library. It's still there though as it allows user widget modules to be loaded dynamically.&lt;br /&gt;
&lt;br /&gt;
=== WindowRendererSet (CEGUI 0.5.X only) ===&lt;br /&gt;
Specifies a module containing WindowRenderer classes and their factories. Has attributes and zero or more WindowRendererFactory sub-elements. That is you can optionally specify WindowRendererFactory sub-elements. If they are omitted all available factories in the module are loaded.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Filename''' - Specifies the name of the loadable module (dll / .so / etc). ''Required''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;LookNFeel Filename=&amp;quot;../datafiles/looknfeel/MySkin.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
     '''&amp;lt;WindowRendererSet Filename=&amp;quot;CEGUIFalagardWRBase&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CEGUI 0.5.0 only provides one WindowRendererSet. Falagard. It's perfectly possible to write your own WindowRendererSet in C++. Take a look at the CEGUIFalagardWRBase module if you're curious :)&lt;br /&gt;
&lt;br /&gt;
=== WindowFactory ===&lt;br /&gt;
Specifies the factory name (GUI window type name) from the loadable module that is to be added to the list of available factories. Has attributes but no sub-elements.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Name''' - Name of the factory / window type which is to be added.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;LookNFeel Filename=&amp;quot;../datafiles/looknfeel/MySkin.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;WindowSet Filename=&amp;quot;CEGUIFalagardBase&amp;quot;&amp;gt;&lt;br /&gt;
         '''&amp;lt;WindowFactory Name=&amp;quot;Falagard/Button&amp;quot; /&amp;gt;'''&lt;br /&gt;
     &amp;lt;/WindowSet&amp;gt;&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this example we only load the &amp;quot;Falagard/Button&amp;quot; factory. If you only need a few widgets and not the whole set, this could save you some memory.&lt;br /&gt;
&lt;br /&gt;
=== FalagardMapping in CEGUI 0.4.X ===&lt;br /&gt;
Maps a look'n'feel to a window factory and assigns the result to a new window type, in effect creating a new window factory for a specific look'n'feel.&lt;br /&gt;
Has attributes but no sub-elements.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''WindowType''' - The name for the new &amp;quot;factory&amp;quot;. ''Required''.&lt;br /&gt;
* '''TargetType''' - The name of the target window factory which will have the look'n'feel assigned. ''Required''.&lt;br /&gt;
* '''LookNFeel''' - The name of the look'n'feel to use. That's the WidgetLook name from the [[Falagard]] XML. ''Required''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;LookNFeel Filename=&amp;quot;../datafiles/looknfeel/MySkin.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;WindowSet Filename=&amp;quot;CEGUIFalagardBase&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;WindowFactory Name=&amp;quot;Falagard/Button&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/WindowSet&amp;gt;&lt;br /&gt;
     '''&amp;lt;FalagardMapping WindowType=&amp;quot;My/Button&amp;quot; TargetType=&amp;quot;Falagard/Button&amp;quot; LookNFeel=&amp;quot;MyButton&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would be a proper scheme to use the look'n'feel created in [[The Beginners Guide to [[Falagard]] skinning - Part I]]. The new type of button window would in this case be available from code or XML layouts by the type name &amp;quot;My/Button&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== FalagardMapping in CEGUI 0.5.X ===&lt;br /&gt;
Maps a look'n'feel to a window factory and assigns the result to a new window type, in effect creating a new window factory for a specific look'n'feel.&lt;br /&gt;
Has attributes but no sub-elements.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''WindowType''' - The name for the new &amp;quot;factory&amp;quot;. ''Required''.&lt;br /&gt;
* '''TargetType''' - The name of the target window factory which will have the look'n'feel assigned. ''Required''.&lt;br /&gt;
* '''LookNFeel''' - The name of the look'n'feel to use. That's the WidgetLook name from the [[Falagard]] XML. ''Required''.&lt;br /&gt;
* '''Renderer''' - Then name of the window renderer factory to use. This module implements the widget rendering code. ''Required''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;MyScheme&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Imageset Name=&amp;quot;MyImages&amp;quot; Filename=&amp;quot;../datafiles/imagesets/MyImages.imageset&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;LookNFeel Filename=&amp;quot;../datafiles/looknfeel/MySkin.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;WindowSet Filename=&amp;quot;CEGUIFalagardWRBase&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;WindowFactory Name=&amp;quot;Falagard/Button&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/WindowSet&amp;gt;&lt;br /&gt;
     '''&amp;lt;FalagardMapping WindowType=&amp;quot;My/Button&amp;quot; TargetType=&amp;quot;CEGUI/PushButton&amp;quot; LookNFeel=&amp;quot;MyButton&amp;quot; Renderer=&amp;quot;Falagard/Button&amp;quot; /&amp;gt;'''&lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This would be a proper scheme to use the look'n'feel created in [[The Beginners Guide to [[Falagard]] skinning - Part I]]. The new type of button window would in this case be available from code or XML layouts by the type name &amp;quot;My/Button&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== WindowAlias ===&lt;br /&gt;
Specifies an alias for a given window factory type or falagard mapping. Has attributes but no sub-elements.&lt;br /&gt;
&lt;br /&gt;
Attributes:&lt;br /&gt;
* '''Alias''' - Name of the alias. This is the alternative name that 'Target' will be known by. ''Required''.&lt;br /&gt;
* '''Target''' - Name of the window factory type, falagard mapping or existing alias that is to (also) be known as 'Alias'. ''Required''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
The scheme is obviously a bit more than just loading resources. It also ties the resources together. All of it can be done in code, but using a scheme file is flexible, and avoids recompiling often.&lt;br /&gt;
&lt;br /&gt;
Schemes are especially useful for artists not familiar with C++ programming, as everything you &amp;quot;set up&amp;quot; in the scheme can be used from XML layouts.&lt;br /&gt;
With [[Falagard]] this means that you can totally customize the user interface if the program is properly configured to do so without ever talking to the developers ;)&lt;br /&gt;
&lt;br /&gt;
--[[User:lindquist]] 03:49, 14 Dec 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Sample_code_for_all_Widgets&amp;diff=4208</id>
		<title>Sample code for all Widgets</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Sample_code_for_all_Widgets&amp;diff=4208"/>
				<updated>2011-03-03T23:51:41Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.5}} {{VersionBadge|0.6}}&lt;br /&gt;
&lt;br /&gt;
This code goes through every widget and demonstrates how to retrieve and set their data as well as some of their particularities.  Please post comments or questions on the message board thread for the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=7967#7967 Widget Galore]&lt;br /&gt;
&lt;br /&gt;
=== Widgets ===&lt;br /&gt;
&lt;br /&gt;
==== General ====&lt;br /&gt;
A widget can be enabled/disabled via setEnabled().  Disabling a widget prevents the user from activating it and manipulating its contents.  A widget can be hidden/shown via setVisible().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Tooltip ====&lt;br /&gt;
A Tooltip widget displays text when the mouse has been hovering over a widget for a certain amount of time.  This widget requires that time be injected within CEGUI via injectTimePulse().&lt;br /&gt;
&lt;br /&gt;
The graphical aspect (the scheme) of the tooltip can be specified via setTooltip().  The amount of hovering time required to activate the tooltip can be specified via setHoverTime().  The amount of time the tooltip is displayed can be specified via setDisplayTime().  And the fade transition time can be specified via setFadeTime(); this affects both the fade in and the fade out times.  The tooltip text of a widget can be specified via setTooltipText().  Please note that some complex widgets are composed of several widgets.  In order to have a tooltip text displayed while hovering over any region of the complex widget then every component widget needs to have a tooltip text specified.  For example a Spinner widget is composed of an Editbox widget and two Button widgets. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== StaticText ====&lt;br /&gt;
There is no StaticText within CEGUI but type of widget can be obtained via the DefaultWindow class.&lt;br /&gt;
&lt;br /&gt;
The currently displayed text can be specified via setText().  The color of this text can be specified via the &amp;quot;TextColours&amp;quot; property.  The value of this property contains 4 color definitions: top left, top right, bottom left, and bottom right.  Each color is specified as a two-digit hexadecimal value of the format AARRGGBB (alpha, red, green, blue).  The text is aligned vertically via the &amp;quot;VertFormatting&amp;quot; property with a value of TopAligned, BottomAligned, or VertCentred.  The text is aligned horizontally via the &amp;quot;HorzFormatting&amp;quot; property with a value of LeftAligned, RightAligned, HorzCentred, HorzJustified, WordWrapLeftAligned, WordWrapRightAligned, WordWrapCentred, or WordWrapJustified.&lt;br /&gt;
&lt;br /&gt;
==== StaticImage ====&lt;br /&gt;
There is no StaticImage within CEGUI but type of widget can be obtained via the DefaultWindow class.&lt;br /&gt;
&lt;br /&gt;
The currently displayed image can be specified via the &amp;quot;Image&amp;quot; property.  This property takes two parameters, the imageset (&amp;quot;set&amp;quot;) and the image name (&amp;quot;image&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==== ProgressBar ====&lt;br /&gt;
A ProgressBar widget displays a progression; it does not receive inputs from a user.&lt;br /&gt;
&lt;br /&gt;
The current progress can be specified via setProgress().  Progress can be advanced through steps.  The step size can be specified via setStepSize() and a step performed via step().  Progress can be adjusted by a delta value via adjustProgress().  The current progress value can be obtained via getProgress().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Button ====&lt;br /&gt;
A Button widget displays a text and receives an activation instruction from the user.&lt;br /&gt;
&lt;br /&gt;
The text can be specified via setText().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== ScrollablePane ====&lt;br /&gt;
A ScrollablePane widget displays contents that can be scrolled.  Contents can be added via addChildWindow().  When that content exceeds the dimensions of the ScrollablePane then scrollbars appear to allow the use to view and interact with that hidden content.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Checkbox ====&lt;br /&gt;
A Checkbox widget controls a boolean value; true when checked and false when unchecked.  This value can be obtained via isSelected() and specified via setSelected(true) to check or setSelected(false) to uncheck.&lt;br /&gt;
&lt;br /&gt;
==== Spinner ====&lt;br /&gt;
A Spinner widget controls a numerical values (float) through an editbox or the use of the increment or decrement buttons.&lt;br /&gt;
&lt;br /&gt;
This value is bounded within a minimum and a maximum by calling setMinimumValue() and setMaximumValue().  The arrow buttons increment or decrement the value by the amount specified with setStepSize().  The numerical value can be displayed in four formats:  FloatingPoint, Integer, Hexadecimal, Octal.  &lt;br /&gt;
&lt;br /&gt;
The current value is obtained via getCurrentValue() and specified via setCurrentValue().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Editbox ====&lt;br /&gt;
An Editbox widget controls printable character values; letters, numbers, punctuations, and symbols.  &lt;br /&gt;
&lt;br /&gt;
The maximal number of characters that can be specified is bound by setMaxTextLength().  The value can be set to readable only (modifications by users are not allowed) via setReadOnly(true).  The value can be masked via setTextMasked() and the default value of * can be modified via setMaskCodePoint().&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getText() and specified via setText().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Slider ====&lt;br /&gt;
A Slider widget controls a numerical value (float) through the position of a &amp;quot;thumb&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This value is bounded within a maximum by setMaxValue(); the minimum value is set to 0.0f.  The thumb can be dragged to the desired position or moved by clicking on either side of the thumb.  The increment or decrement value is set by setClickStep().&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getCurrentValue() and specified via setCurrentValue().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scrollbar ====&lt;br /&gt;
A Scrollbar widget controls a numerical value (float) through the position of a &amp;quot;thumb&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This value is bounded within a maximum by setDocumentSize(); the minimum value is set to 0.0f.  The thumb can be dragged to the desired position or moved by clicking on either side of the thumb.  The increment or decrement value is set by setPageSize().  The arrow buttons increment or decrement the value by the amount specified with setStepSize().&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getScrollPosition() and specified via setScrollPosition().  Note that the actual maximum value that the scrollbar will return is set by the following formula: document_size - page_size.  Thus, a document of size 100 and a page size of 10 will have a value from 0 to 90.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiLineEditbox ====&lt;br /&gt;
A MultiLineEditbox widget controls printable character values; letters, numbers, punctuations, and symbols.&lt;br /&gt;
&lt;br /&gt;
Unlike the Editbox widget there is no maximal number of characters that can be specified.  The value can be set to readable only (modifications by users are not allowed) via setReadOnly(true).  Text can be automatically wrapped via a call to setWordWrapping(true).&lt;br /&gt;
&lt;br /&gt;
The current value can be obtained via getText() and specified via setText().&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== RadioButton ====&lt;br /&gt;
A RadioButton widget controls a single selection among many choices.&lt;br /&gt;
&lt;br /&gt;
The choices are grouped by calling setGroupID().  Only one RadioButton per group ID can be selected; this widget does not support multiple selection.  However it is possible for a choice to possess no decision; initially every RadioButton of a group is unselected.&lt;br /&gt;
&lt;br /&gt;
The currently selected RadioButton can be obtained via getSelectedButtonInGroup().  This RadioButton pointer can then be used to query the ID via getID(), the text (visible label of the RadioButton) via getText(), or user data via getUserData().  A RadioButton can be selected via setSelected(true).  Passing false will deselect the RadioButton, potentially making every RadioButton of the group unselected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Listbox ====&lt;br /&gt;
A Listbox widget controls either a single selection or multiple selections among many choices.  Multiple selections are enabled via setMultiselectEnabled().&lt;br /&gt;
&lt;br /&gt;
The choices are listbox text items (ListboxTextItem) added to the listbox via addItem().  These do not possess a selection indicator by default; one must be specified via setSelectionBrushImage().  The call to ensureItemIsVisible() ensures that the item is visible; the listbox will automatically scroll down if necessary.  The text of the ListboxTextItem can be changed via the setText() function.  However this new text will not be displayed until you call the Listbox's handleUpdatedItemData() function.&lt;br /&gt;
&lt;br /&gt;
The selected ListboxItem can be obtained via getFirstSelectedItem() and subsequent selections through getNextSelected().  A selection can be specified via setItemSelectState().&lt;br /&gt;
&lt;br /&gt;
It is possible for a Listbox to contain list items that are not simply composed of text.  [http://www.cegui.org.uk/wiki/index.php/Create_a_CheckListboxItem CheckListboxItem] demonstrates this advanced feature.  Another approach would be to simulate the behavior of a listbox such that each row is composed of various widgets.  [[PseudoListbox]] demonstrates this.&lt;br /&gt;
&lt;br /&gt;
==== Combobox ====&lt;br /&gt;
A Combobox widget controls a single selection among many choices.&lt;br /&gt;
&lt;br /&gt;
The choices are listbox text items (ListboxTextItem) added to the combobox via addItem().  These do not possess a selection indicator by default; one must be specified via setSelectionBrushImage().&lt;br /&gt;
&lt;br /&gt;
The value of the text within the Editbox can be obtained via getText() and the last selected ListboxItem can be obtained via getSelectedItem().  However there is no guarantee that both are synchronized; typing text within the Editbox will not automatically select the corresponding ListboxItem.  Fortunately the reverse is not true; selecting a ListboxItem will place that text within the Editbox.  Placing the Editbox in read-only mode with setReadOnly(true) can avoid problems.  The current value can be specified via listboxTextItem-&amp;gt;setSelected(true) and a setText(itemCombobox-&amp;gt;getText()).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiColumnList ====&lt;br /&gt;
A MultiColumnList widget controls controls either a single selection or multiple selections among many choices.  Multiple selections are enabled via setSelectionMode(MultiColumnList::RowMultiple).&lt;br /&gt;
&lt;br /&gt;
A MultiColumnList widget may contain a single column or multiple columns.  Columns are added via addColumn(), specifying a label, a column ID, and a column width.&lt;br /&gt;
&lt;br /&gt;
Three steps are required to add a row.  The first step is to add a new row with addRow().  The second step is to create a ListboxTextItem for each cell of the row and specify the selection indicator via setSelectionBrushImage().  The third step is to add the newly created ListboxTextItem to the MultiColumnList via setItem(), specifying the ListboxTextItem, the column ID, and the row ID.&lt;br /&gt;
&lt;br /&gt;
The selected row can be obtained via getFirstSelectedItem() and subsequent selections through getNextSelected().  This will iterate through every selected cell, returning each selected ListboxTextItem .  A selection can be specified via setItemSelectState(); by setting the selection mode to rows (either RowSingle or RowMultiple) you actually only need to select the ListboxTextItem of the first column.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== TabControl ====&lt;br /&gt;
A TabControl widget allows multiple windows to be displayed one at a time, via tab buttons.&lt;br /&gt;
&lt;br /&gt;
Two objects must be created within the Layout Editor to generate a functional tab control.  The first is a window of type &amp;quot;TabControl&amp;quot;.  This will be the parent window of the tab buttons as well as the pages.  The second is a window of type &amp;quot;DefaultWindow&amp;quot;.  This window will be placed within the TabControl (in code via addTab(), not through the Layout Editor) and will specify the contents of a page.  Widgets are to be placed within these TabPane via the Layout Editor.  The &amp;quot;TabButton&amp;quot; windows are not to be specified via the Layout Editor since they will be automatically created when a TabPane is added to the TabControl.&lt;br /&gt;
&lt;br /&gt;
In this demo the TabControl widget was placed within a FrameWindow.  This is not a requirement.  It could have just easily been placed alongside the widgets of the other window.&lt;br /&gt;
&lt;br /&gt;
==== Menu &amp;amp; Popup Menu ====&lt;br /&gt;
&lt;br /&gt;
See [[Menu and Popup]]&lt;br /&gt;
&lt;br /&gt;
=== Files ===&lt;br /&gt;
&lt;br /&gt;
==== WidgetGalore.h ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _WidgetGalore_h_&lt;br /&gt;
#define _WidgetGalore_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;CEGuiSample.h&amp;quot;&lt;br /&gt;
#include &amp;quot;CEGUI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
class DemoSample : public CEGuiSample&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    bool initialiseSample()&lt;br /&gt;
	{&lt;br /&gt;
		using namespace CEGUI;&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			// Retrieve the window manager&lt;br /&gt;
			WindowManager&amp;amp; winMgr = WindowManager::getSingleton();&lt;br /&gt;
&lt;br /&gt;
			// Load the TaharezLook scheme and set up the default mouse cursor and font&lt;br /&gt;
			SchemeManager::getSingleton().loadScheme(&amp;quot;TaharezLook.scheme&amp;quot;);&lt;br /&gt;
			System::getSingleton().setDefaultMouseCursor(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MouseArrow&amp;quot;);&lt;br /&gt;
			if(!FontManager::getSingleton().isFontPresent(&amp;quot;Commonwealth-10&amp;quot;))&lt;br /&gt;
				FontManager::getSingleton().createFont(&amp;quot;Commonwealth-10.font&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Set the GUI Sheet&lt;br /&gt;
			Window* sheet = winMgr.createWindow(&amp;quot;DefaultWindow&amp;quot;, &amp;quot;root_wnd&amp;quot;);&lt;br /&gt;
			System::getSingleton().setGUISheet(sheet);&lt;br /&gt;
&lt;br /&gt;
			// Load a layout&lt;br /&gt;
			Window* guiLayout = winMgr.loadWindowLayout(&amp;quot;WidgetGalore.layout&amp;quot;);&lt;br /&gt;
			sheet-&amp;gt;addChildWindow(guiLayout);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			/* Tooltip */&lt;br /&gt;
			System::getSingleton().setDefaultTooltip(&amp;quot;TaharezLook/Tooltip&amp;quot;); // Set the name of the default tooltip&lt;br /&gt;
			Tooltip* tooltip = System::getSingleton().getDefaultTooltip();&lt;br /&gt;
			tooltip-&amp;gt;setHoverTime(0.5f); // Display the tooltip after the mouse has been hovering over the widget for half a second&lt;br /&gt;
			tooltip-&amp;gt;setDisplayTime(10.0f); // Display for 15 seconds then disappear&lt;br /&gt;
			tooltip-&amp;gt;setFadeTime(1.0f); // Duration of the transition between fully visible and fully invisible&lt;br /&gt;
			// To set the tooltip text for a window simply call setTooltipText()   see staticText for an example&lt;br /&gt;
&lt;br /&gt;
			/* StaticText */&lt;br /&gt;
			DefaultWindow* staticText = static_cast&amp;lt;DefaultWindow*&amp;gt;(winMgr.getWindow(&amp;quot;StaticText&amp;quot;));&lt;br /&gt;
			staticText-&amp;gt;setText(&amp;quot;Red Static Text&amp;quot;);&lt;br /&gt;
			// Colors are specified as aarrggbb in Hexadecimal&lt;br /&gt;
			// Where aa is alpha, rr is red, gg is green, and bb is blue &lt;br /&gt;
			// tl: top left,  tr: top right,  bl: bottom left,  br: bottom right&lt;br /&gt;
			staticText-&amp;gt;setProperty(&amp;quot;TextColours&amp;quot;, &amp;quot;tl:FFFF0000 tr:FFFF0000 bl:FFFF0000 br:FFFF0000&amp;quot;);&lt;br /&gt;
			staticText-&amp;gt;setProperty(&amp;quot;VertFormatting&amp;quot;, &amp;quot;VertCentred&amp;quot;); // TopAligned, BottomAligned, VertCentred&lt;br /&gt;
			staticText-&amp;gt;setProperty(&amp;quot;HorzFormatting&amp;quot;, &amp;quot;HorzCentred&amp;quot;); // LeftAligned, RightAligned, HorzCentred&lt;br /&gt;
				// HorzJustified, WordWrapLeftAligned, WordWrapRightAligned, WordWrapCentred, WordWrapJustified&lt;br /&gt;
			staticText-&amp;gt;setTooltipText(&amp;quot;This is a StaticText widget&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			/* StaticImage */&lt;br /&gt;
			ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;ImageForStaticImage&amp;quot;, &amp;quot;GPN-2000-001437.tga&amp;quot;);&lt;br /&gt;
			DefaultWindow* staticImage = static_cast&amp;lt;DefaultWindow*&amp;gt;(winMgr.getWindow(&amp;quot;StaticImage&amp;quot;));&lt;br /&gt;
			staticImage-&amp;gt;setProperty(&amp;quot;Image&amp;quot;, &amp;quot;set:ImageForStaticImage image:full_image&amp;quot;); // &amp;quot;full_image&amp;quot; is a default name from CEGUIImageset::Imageset()&lt;br /&gt;
&lt;br /&gt;
			/* ProgressBar */&lt;br /&gt;
			ProgressBar* progressBar = static_cast&amp;lt;ProgressBar*&amp;gt;(winMgr.getWindow(&amp;quot;ProgressBar&amp;quot;));&lt;br /&gt;
			progressBar-&amp;gt;setProgress(0.25f); // Initial progress of 25%&lt;br /&gt;
			progressBar-&amp;gt;setStepSize(0.10f); // Calling step() will increase the progress by 10%&lt;br /&gt;
			progressBar-&amp;gt;step(); // Advance the progress by the size specified in setStepSize()&lt;br /&gt;
			progressBar-&amp;gt;adjustProgress(-0.05f); // Adjust the progress by a delta value rather than setting a new value through setProgress&lt;br /&gt;
			float valueProgressBar = progressBar-&amp;gt;getProgress(); // initial 0.25f + step 0.10f - adjustment 0.05f = 0.30f&lt;br /&gt;
&lt;br /&gt;
			/* Button */&lt;br /&gt;
			PushButton* btnClose = static_cast&amp;lt;PushButton*&amp;gt;(winMgr.getWindow(&amp;quot;btnClose&amp;quot;));&lt;br /&gt;
			btnClose-&amp;gt;setText(&amp;quot;Exit&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			/* ScrollablePane */&lt;br /&gt;
			ScrollablePane* scrollablePane = static_cast&amp;lt;ScrollablePane*&amp;gt;(winMgr.getWindow(&amp;quot;ScrollablePane&amp;quot;));&lt;br /&gt;
			ImagesetManager::getSingleton().createImagesetFromImageFile(&amp;quot;ImageForScrollablePane&amp;quot;, &amp;quot;GPN-2000-001437.tga&amp;quot;);&lt;br /&gt;
			DefaultWindow* staticImageInScrollablePane = static_cast&amp;lt;DefaultWindow*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/StaticImage&amp;quot;, &amp;quot;StaticImageInScrollablePane&amp;quot;));&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setProperty(&amp;quot;Image&amp;quot;, &amp;quot;set:ImageForScrollablePane image:full_image&amp;quot;); // &amp;quot;full_image&amp;quot; is a default name from CEGUIImageset::Imageset()&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(0.0f, 0.0f))); // Start in the upper left corner&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setWidth(UDim(2.0f, 0.0f)); // Twice the width of the parent, the ScrollablePane&lt;br /&gt;
				staticImageInScrollablePane-&amp;gt;setHeight(UDim(2.0f, 0.0f)); // Twice the height of the parent, the ScrollablePane&lt;br /&gt;
				scrollablePane-&amp;gt;addChildWindow(staticImageInScrollablePane); // Add the image to the // Twice the width of the parent, the ScrollablePane&lt;br /&gt;
			Editbox* editboxInScrollablePane = static_cast&amp;lt;Editbox*&amp;gt;(winMgr.createWindow(&amp;quot;TaharezLook/Editbox&amp;quot;, &amp;quot;EditboxInScrollablePane&amp;quot;));&lt;br /&gt;
				editboxInScrollablePane-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(2.1f, 0.0f))); // Start below the image&lt;br /&gt;
				editboxInScrollablePane-&amp;gt;setWidth(UDim(2.0f, 0.0f)); &lt;br /&gt;
				editboxInScrollablePane-&amp;gt;setHeight(UDim(0.3f, 0.0f));&lt;br /&gt;
				scrollablePane-&amp;gt;addChildWindow(editboxInScrollablePane);&lt;br /&gt;
&lt;br /&gt;
			/* Check box */&lt;br /&gt;
			Checkbox* checkbox = static_cast&amp;lt;Checkbox*&amp;gt;(winMgr.getWindow(&amp;quot;Checkbox&amp;quot;));&lt;br /&gt;
			checkbox-&amp;gt;setSelected( true );&lt;br /&gt;
			bool valueCheckbox = checkbox-&amp;gt;isSelected(); // Retrieve whether it is checked&lt;br /&gt;
&lt;br /&gt;
			/* Spinner */&lt;br /&gt;
			Spinner* spinner = static_cast&amp;lt;Spinner*&amp;gt;(winMgr.getWindow(&amp;quot;Spinner&amp;quot;));&lt;br /&gt;
			spinner-&amp;gt;setTextInputMode(Spinner::FloatingPoint); // FloatingPoint, Integer, Hexadecimal, Octal&lt;br /&gt;
			spinner-&amp;gt;setMinimumValue(-10.0f);&lt;br /&gt;
			spinner-&amp;gt;setMaximumValue(10.0f);&lt;br /&gt;
			spinner-&amp;gt;setStepSize(0.2f);&lt;br /&gt;
			spinner-&amp;gt;setCurrentValue(5.2f);&lt;br /&gt;
			float valueSpinner = spinner-&amp;gt;getCurrentValue(); // Retrieve the value&lt;br /&gt;
&lt;br /&gt;
			/* Editbox */&lt;br /&gt;
			Editbox* editbox = static_cast&amp;lt;Editbox*&amp;gt;(winMgr.getWindow(&amp;quot;Editbox&amp;quot;));&lt;br /&gt;
			editbox-&amp;gt;setText(&amp;quot;Editbox values&amp;quot;);&lt;br /&gt;
			editbox-&amp;gt;setMaxTextLength(13); // The trailing 's' will not be displayed&lt;br /&gt;
			editbox-&amp;gt;setReadOnly(false);&lt;br /&gt;
			editbox-&amp;gt;setTextMasked(false);&lt;br /&gt;
			editbox-&amp;gt;setMaskCodePoint(0x002A); // *&lt;br /&gt;
			String valueEditbox = editbox-&amp;gt;getText(); // Retrieve the text&lt;br /&gt;
&lt;br /&gt;
			/* Slider */&lt;br /&gt;
			Slider* slider = static_cast&amp;lt;Slider*&amp;gt;(winMgr.getWindow(&amp;quot;Slider&amp;quot;));&lt;br /&gt;
			slider-&amp;gt;setMaxValue(100.0f);&lt;br /&gt;
			slider-&amp;gt;setClickStep(10.0f);&lt;br /&gt;
			slider-&amp;gt;setCurrentValue(20.0f);&lt;br /&gt;
			float valueSlider = slider-&amp;gt;getCurrentValue(); // Retrieve the value&lt;br /&gt;
&lt;br /&gt;
			/* Scrollbar (Horizontal) */&lt;br /&gt;
			Scrollbar* scrollbarHorizontal = static_cast&amp;lt;Scrollbar*&amp;gt;(winMgr.getWindow(&amp;quot;HorizontalScrollbar&amp;quot;));&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setDocumentSize(100.0f);&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setPageSize(10.0f);&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setStepSize(1.0f);&lt;br /&gt;
			scrollbarHorizontal-&amp;gt;setScrollPosition(75.0f);&lt;br /&gt;
			float valueScrollbarHorizontal = scrollbarHorizontal-&amp;gt;getScrollPosition(); // Retrieve the scroll position&lt;br /&gt;
&lt;br /&gt;
			/* Scrollbar (Vertical) */&lt;br /&gt;
			Scrollbar* scrollbarVertical = static_cast&amp;lt;Scrollbar*&amp;gt;(winMgr.getWindow(&amp;quot;VerticalScrollbar&amp;quot;));&lt;br /&gt;
			scrollbarVertical-&amp;gt;setDocumentSize(100.0f);&lt;br /&gt;
			scrollbarVertical-&amp;gt;setPageSize(10.0f);&lt;br /&gt;
			scrollbarVertical-&amp;gt;setStepSize(1.0f);&lt;br /&gt;
			scrollbarVertical-&amp;gt;setScrollPosition(25.0f);&lt;br /&gt;
			float valueScrollbarVertical = scrollbarVertical-&amp;gt;getScrollPosition(); // Retrieve the scroll position&lt;br /&gt;
&lt;br /&gt;
			/* MultiLineEditbox */&lt;br /&gt;
			MultiLineEditbox* multiLineEditbox = static_cast&amp;lt;MultiLineEditbox*&amp;gt;(winMgr.getWindow(&amp;quot;MultiLineEditbox&amp;quot;));&lt;br /&gt;
			multiLineEditbox-&amp;gt;setText(&amp;quot;MultiLineEditbox value&amp;quot;);&lt;br /&gt;
			multiLineEditbox-&amp;gt;setReadOnly(false);&lt;br /&gt;
			multiLineEditbox-&amp;gt;setWordWrapping(true);&lt;br /&gt;
			String valueMultiLineEditbox = multiLineEditbox-&amp;gt;getText(); // Retrieve the text&lt;br /&gt;
&lt;br /&gt;
			/* RadioButton */&lt;br /&gt;
			RadioButton* radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_A&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
				radioButton-&amp;gt;setID(101);&lt;br /&gt;
				radioButton-&amp;gt;setSelected(true);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_B&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
				radioButton-&amp;gt;setID(102);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_C&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(1);&lt;br /&gt;
				radioButton-&amp;gt;setID(103);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_1&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(2);&lt;br /&gt;
				radioButton-&amp;gt;setID(201);&lt;br /&gt;
				radioButton-&amp;gt;setSelected(true);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_2&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(2);&lt;br /&gt;
				radioButton-&amp;gt;setID(202);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_3&amp;quot;));&lt;br /&gt;
				radioButton-&amp;gt;setGroupID(2);&lt;br /&gt;
				radioButton-&amp;gt;setID(203);&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_A&amp;quot;)); // Get handle of one radio button from the group&lt;br /&gt;
			uint valueRadioButtonLetters = radioButton-&amp;gt;getSelectedButtonInGroup()-&amp;gt;getID(); // Get selected ID&lt;br /&gt;
			radioButton = static_cast&amp;lt;RadioButton*&amp;gt;(winMgr.getWindow(&amp;quot;RadioButton_3&amp;quot;)); // Can obtain the handle of any radio button in the group&lt;br /&gt;
			uint valueRadioButtonNumbers = radioButton-&amp;gt;getSelectedButtonInGroup()-&amp;gt;getID();&lt;br /&gt;
			radioButton-&amp;gt;setSelected(true); // Specify which button should appear selected by default&lt;br /&gt;
&lt;br /&gt;
			/* Listbox */&lt;br /&gt;
			Listbox* listbox = static_cast&amp;lt;Listbox*&amp;gt;(winMgr.getWindow(&amp;quot;Listbox&amp;quot;));&lt;br /&gt;
			listbox-&amp;gt;setMultiselectEnabled(false);&lt;br /&gt;
			ListboxTextItem* itemListbox = new ListboxTextItem(&amp;quot;Value A&amp;quot;, 1);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			itemListbox = new ListboxTextItem(&amp;quot;Value B&amp;quot;, 2);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			itemListbox = new ListboxTextItem(&amp;quot;Value C&amp;quot;, 3);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			itemListbox = new ListboxTextItem(&amp;quot;Value D&amp;quot;, 4);&lt;br /&gt;
				itemListbox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				listbox-&amp;gt;addItem(itemListbox);&lt;br /&gt;
			listbox-&amp;gt;setItemSelectState(itemListbox, true);&lt;br /&gt;
			listbox-&amp;gt;ensureItemIsVisible(itemListbox);&lt;br /&gt;
			uint valueListbox = listbox-&amp;gt;getFirstSelectedItem()-&amp;gt;getID(); // Retrieve the ID of the selected listbox item&lt;br /&gt;
&lt;br /&gt;
			/* Combobox */&lt;br /&gt;
			Combobox* combobox = static_cast&amp;lt;Combobox*&amp;gt;(winMgr.getWindow(&amp;quot;Combobox&amp;quot;));&lt;br /&gt;
			combobox-&amp;gt;setReadOnly(true);&lt;br /&gt;
			ListboxTextItem* itemCombobox = new ListboxTextItem(&amp;quot;Value 1&amp;quot;, 1);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
			itemCombobox = new ListboxTextItem(&amp;quot;Value 2&amp;quot;, 2);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelected(true); // Select this item&lt;br /&gt;
				combobox-&amp;gt;setText(itemCombobox-&amp;gt;getText()); // Copy the item's text into the Editbox&lt;br /&gt;
			itemCombobox = new ListboxTextItem(&amp;quot;Value 3&amp;quot;, 3);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
			itemCombobox = new ListboxTextItem(&amp;quot;Value 4&amp;quot;, 4);&lt;br /&gt;
				itemCombobox-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				combobox-&amp;gt;addItem(itemCombobox);&lt;br /&gt;
			String valueCombobox = combobox-&amp;gt;getText(); // Retrieve the displayed text&lt;br /&gt;
			uint idCombobox = combobox-&amp;gt;getSelectedItem()-&amp;gt;getID(); // Retrieve the ID of the selected combobox item&lt;br /&gt;
&lt;br /&gt;
			/* MultiColumnList */&lt;br /&gt;
			MultiColumnList* multiColumnList = static_cast&amp;lt;MultiColumnList*&amp;gt;(winMgr.getWindow(&amp;quot;MultiColumnList&amp;quot;));\&lt;br /&gt;
			multiColumnList-&amp;gt;addColumn(&amp;quot;Col A&amp;quot;, 0, UDim(0.32f, 0));&lt;br /&gt;
			multiColumnList-&amp;gt;addColumn(&amp;quot;Col B&amp;quot;, 1, UDim(0.32f, 0));&lt;br /&gt;
			multiColumnList-&amp;gt;addColumn(&amp;quot;Col C&amp;quot;, 2, UDim(0.32f, 0));&lt;br /&gt;
			multiColumnList-&amp;gt;setSelectionMode(MultiColumnList::RowSingle); // MultiColumnList::RowMultiple&lt;br /&gt;
			ListboxTextItem* itemMultiColumnList;&lt;br /&gt;
			multiColumnList-&amp;gt;addRow();&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;A1&amp;quot;, 101);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 0, 0); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;B1&amp;quot;, 102);&lt;br /&gt;
				//itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				// By commenting the line above a cell does not specify a selection indicator&lt;br /&gt;
				//  selecting that line will show a &amp;quot;gap&amp;quot; in the selection.&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 1, 0); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;C1&amp;quot;, 103);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 2, 0); // ColumnID, RowID&lt;br /&gt;
			multiColumnList-&amp;gt;addRow();&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;A2&amp;quot;, 201);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 0, 1); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;B2&amp;quot;, 202);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 1, 1); // ColumnID, RowID&lt;br /&gt;
			itemMultiColumnList = new ListboxTextItem(&amp;quot;C2&amp;quot;, 203);&lt;br /&gt;
				itemMultiColumnList-&amp;gt;setSelectionBrushImage(&amp;quot;TaharezLook&amp;quot;, &amp;quot;MultiListSelectionBrush&amp;quot;);&lt;br /&gt;
				multiColumnList-&amp;gt;setItem(itemMultiColumnList, 2, 1); // ColumnID, RowID&lt;br /&gt;
			MCLGridRef grid_ref(1, 0); // Select according to a grid reference; second row&lt;br /&gt;
			multiColumnList-&amp;gt;setItemSelectState(grid_ref, true);&lt;br /&gt;
			ListboxItem* listboxItem = multiColumnList-&amp;gt;getFirstSelectedItem();&lt;br /&gt;
			uint valueColumnA = listboxItem-&amp;gt;getID(); // Retrieve the value of the selected item from column A&lt;br /&gt;
			listboxItem = multiColumnList-&amp;gt;getNextSelected(listboxItem);&lt;br /&gt;
			uint valueColumnB = listboxItem-&amp;gt;getID(); // Retrieve the value of the selected item from column B&lt;br /&gt;
			listboxItem = multiColumnList-&amp;gt;getNextSelected(listboxItem);&lt;br /&gt;
			uint valueColumnC = listboxItem-&amp;gt;getID(); // Retrieve the value of the selected item from column C&lt;br /&gt;
&lt;br /&gt;
			/* TabControl */&lt;br /&gt;
			TabControl* winTabControl = static_cast&amp;lt;TabControl*&amp;gt;(winMgr.getWindow(&amp;quot;TabControl&amp;quot;));&lt;br /&gt;
			winTabControl-&amp;gt;setTabHeight(UDim(0.15f, 0.0f)); // Make the tab buttons a little bigger&lt;br /&gt;
			Window* tabPage = winMgr.getWindow(&amp;quot;TabPane1&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setText(&amp;quot;Page 1&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setSize(UVector2(UDim(1.0f, 0.0f), UDim(1.0f, 0.0f))); // Size to 100% of its parent, the TabControl&lt;br /&gt;
				tabPage-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(0.0f, 0.0f))); // Move to the upper left corner of its parent&lt;br /&gt;
				winTabControl-&amp;gt;addTab(tabPage);&lt;br /&gt;
			tabPage = winMgr.getWindow(&amp;quot;TabPane2&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setText(&amp;quot;Page 2&amp;quot;);&lt;br /&gt;
				tabPage-&amp;gt;setSize(UVector2(UDim(1.0f, 0.0f), UDim(1.0f, 0.0f))); &lt;br /&gt;
				tabPage-&amp;gt;setPosition(UVector2(UDim(0.0f, 0.0f), UDim(0.0f, 0.0f))); &lt;br /&gt;
				winTabControl-&amp;gt;addTab(tabPage);&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
		catch(Exception &amp;amp;e)&lt;br /&gt;
		{&lt;br /&gt;
			#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
				MessageBox(NULL, e.getMessage().c_str(), &amp;quot;Error initializing the demo&amp;quot;, MB_OK | MB_ICONERROR | MB_TASKMODAL);&lt;br /&gt;
			#else&lt;br /&gt;
				std::cerr &amp;lt;&amp;lt; &amp;quot;Error initializing the demo:&amp;quot; &amp;lt;&amp;lt; e.getMessage().c_str() &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
			#endif&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    void cleanupSample(void)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif // _WidgetGalore_h_&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== main.cpp ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
	#define WIN32_LEAN_AND_MEAN&lt;br /&gt;
	#define NOMINMAX&lt;br /&gt;
	#include &amp;quot;windows.h&amp;quot;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;WidgetGalore.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#if defined( __WIN32__ ) || defined( _WIN32 )&lt;br /&gt;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)&lt;br /&gt;
#else&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
#endif&lt;br /&gt;
{&lt;br /&gt;
    DemoSample app;&lt;br /&gt;
    return app.run();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== WidgetGalore.layout ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;GUILayout &amp;gt;&lt;br /&gt;
    &amp;lt;Window Type=&amp;quot;DefaultWindow&amp;quot; Name=&amp;quot;Root&amp;quot; &amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;1&amp;lt;/Property&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;InheritsAlpha&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0,0},{0,0},{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;DefaultWindow&amp;quot; Name=&amp;quot;TabPane2&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.72875,0},{0.7185,0},{0.97875,0},{0.9685,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;StaticTextPage2&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;In Page 2:&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.06,0},{0.226667,0},{0.415,0},{0.476667,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;EditBoxPage2&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.420001,0},{0.22,0},{0.99,0},{0.47,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;winTabControl&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Tab Control Window&amp;lt;/Property&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;CaptionColour&amp;quot; Value=&amp;quot;00FFFFFF&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.695627,0},{0.2725,0},{0.993122,0},{0.704167,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/TabControl&amp;quot; Name=&amp;quot;TabControl&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;TabHeight&amp;quot; Value=&amp;quot;{0,0}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;TabTextPadding&amp;quot; Value=&amp;quot;{0,0}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.088566,0},{0.174378,0},{0.931404,0},{0.804637,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnOk&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Ok&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.128412,0},{0.841464,0},{0.365583,0},{0.926003,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnCancel&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Cancel&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.400429,0},{0.841464,0},{0.637601,0},{0.926003,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnApply&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Apply&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.668224,0},{0.843977,0},{0.905394,0},{0.928516,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;DefaultWindow&amp;quot; Name=&amp;quot;TabPane1&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;ClippedByParent&amp;quot; Value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.72875,0},{0.012178,0},{0.97875,0},{0.262178,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;StaticTextPage1&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;In Page 1:&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.06,0},{0.226667,0},{0.415,0},{0.476667,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;EditBoxPage1&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.420001,0},{0.22,0},{0.99,0},{0.47,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;Window Type=&amp;quot;TaharezLook/FrameWindow&amp;quot; Name=&amp;quot;winWidgets&amp;quot; &amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Dave, it&amp;amp;apos;s full of widgets!&amp;lt;/Property&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarFont&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;CaptionColour&amp;quot; Value=&amp;quot;00FFFFFF&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;TitlebarEnabled&amp;quot; Value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.00375,0},{0.143333,0},{0.751248,0},{0.806665,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Button&amp;quot; Name=&amp;quot;btnClose&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Close&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.732397,0},{0.895137,0},{0.976465,0},{0.975697,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseArrow&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Editbox&amp;quot; Name=&amp;quot;Editbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.62442,0},{0.090471,0},{0.969776,0},{0.153443,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Checkbox&amp;quot; Name=&amp;quot;Checkbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Check&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.396859,0},{0.944201,0},{0.453147,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Combobox&amp;quot; Name=&amp;quot;Combobox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Combo Box&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.090471,0},{0.613522,0},{0.413287,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxEditTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_A&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;A&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.652856,0},{0.189876,0},{0.704964,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_B&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;B&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.707569,0},{0.189876,0},{0.759678,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_C&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;C&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.761542,0},{0.189876,0},{0.813651,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_1&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;1&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.189876,0},{0.897272,0},{0.246164,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_2&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;2&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.245152,0},{0.897272,0},{0.30144,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/RadioButton&amp;quot; Name=&amp;quot;RadioButton_3&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Font&amp;quot; Value=&amp;quot;Commonwealth-10&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;3&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.300429,0},{0.897272,0},{0.356717,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/HorizontalScrollbar&amp;quot; Name=&amp;quot;HorizontalScrollbar&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;PageSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;OverlapSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;DocumentSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.185427,0},{0.613522,0},{0.26206,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/VerticalScrollbar&amp;quot; Name=&amp;quot;VerticalScrollbar&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;PageSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;OverlapSize&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;DocumentSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.026087,0},{0.090471,0},{0.082106,0},{0.606802,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Listbox&amp;quot; Name=&amp;quot;Listbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;List Box&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.626634,0},{0.427903,0},{0.876634,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/MultiColumnList&amp;quot; Name=&amp;quot;MultiColumnList&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.271357,0},{0.816779,0},{0.551507,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MouseCursorImage&amp;quot; Value=&amp;quot;set:TaharezLook image:MouseTarget&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/MultiLineEditbox&amp;quot; Name=&amp;quot;MultiLineEditbox&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;            &lt;br /&gt;
&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaxTextLength&amp;quot; Value=&amp;quot;1073741823&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.462498,0},{0.626634,0},{0.706566,0},{0.876634,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/ProgressBar&amp;quot; Name=&amp;quot;ProgressBar&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;CurrentProgress&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.183835,0},{0.559296,0},{0.816779,0},{0.608291,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Slider&amp;quot; Name=&amp;quot;Slider&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;CurrentValue&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaximumValue&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ClickStepSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.099415,0},{0.090471,0},{0.155434,0},{0.606802,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/Spinner&amp;quot; Name=&amp;quot;Spinner&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;StepSize&amp;quot; Value=&amp;quot;1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;CurrentValue&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MaximumValue&amp;quot; Value=&amp;quot;32767&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;MinimumValue&amp;quot; Value=&amp;quot;-32768&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.845164,0},{0.48995,0},{0.944201,0},{0.551507,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticImage&amp;quot; Name=&amp;quot;StaticImage&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.732397,0},{0.626634,0},{0.976465,0},{0.876634,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/StaticText&amp;quot; Name=&amp;quot;StaticText&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;Text&amp;quot; &amp;gt;Static Text&amp;lt;/Property&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.462498,0},{0.895137,0},{0.706566,0},{0.975697,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
            &amp;lt;Window Type=&amp;quot;TaharezLook/ScrollablePane&amp;quot; Name=&amp;quot;ScrollablePane&amp;quot; &amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;ContentArea&amp;quot; Value=&amp;quot;l:0 t:0 r:0 b:0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;HorzStepSize&amp;quot; Value=&amp;quot;0.1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;VertStepSize&amp;quot; Value=&amp;quot;0.1&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;HorzOverlapSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.019063,0},{0.629399,0},{0.157023,0},{0.879399,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;VertOverlapSize&amp;quot; Value=&amp;quot;0.01&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;HorzScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                &amp;lt;Property Name=&amp;quot;VertScrollPosition&amp;quot; Value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/Window&amp;gt;&lt;br /&gt;
        &amp;lt;/Window&amp;gt;&lt;br /&gt;
    &amp;lt;/Window&amp;gt;&lt;br /&gt;
&amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;br /&gt;
[[Category:Update requested]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=SDL_to_CEGUI_keytable&amp;diff=4207</id>
		<title>SDL to CEGUI keytable</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=SDL_to_CEGUI_keytable&amp;diff=4207"/>
				<updated>2011-03-03T23:51:30Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.4}} {{VersionBadge|0.5}} {{VersionBadge|0.6}} {{VersionBadge|0.7}}&lt;br /&gt;
&lt;br /&gt;
As this was a very boring thing to do, I'll share it with the rest of you ;)&lt;br /&gt;
&lt;br /&gt;
With this function injecting KeyDown and KeyUp events to CEGUI works like you'd expect.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 /************************************************************************&lt;br /&gt;
     Translate a SDLKey to the proper CEGUI::Key&lt;br /&gt;
 *************************************************************************/&lt;br /&gt;
 CEGUI::uint SDLKeyToCEGUIKey(SDLKey key)&lt;br /&gt;
 {&lt;br /&gt;
     using namespace CEGUI;&lt;br /&gt;
     switch (key)&lt;br /&gt;
     {&lt;br /&gt;
     case SDLK_BACKSPACE:    return Key::Backspace;&lt;br /&gt;
     case SDLK_TAB:          return Key::Tab;&lt;br /&gt;
     case SDLK_RETURN:       return Key::Return;&lt;br /&gt;
     case SDLK_PAUSE:        return Key::Pause;&lt;br /&gt;
     case SDLK_ESCAPE:       return Key::Escape;&lt;br /&gt;
     case SDLK_SPACE:        return Key::Space;&lt;br /&gt;
     case SDLK_COMMA:        return Key::Comma;&lt;br /&gt;
     case SDLK_MINUS:        return Key::Minus;&lt;br /&gt;
     case SDLK_PERIOD:       return Key::Period;&lt;br /&gt;
     case SDLK_SLASH:        return Key::Slash;&lt;br /&gt;
     case SDLK_0:            return Key::Zero;&lt;br /&gt;
     case SDLK_1:            return Key::One;&lt;br /&gt;
     case SDLK_2:            return Key::Two;&lt;br /&gt;
     case SDLK_3:            return Key::Three;&lt;br /&gt;
     case SDLK_4:            return Key::Four;&lt;br /&gt;
     case SDLK_5:            return Key::Five;&lt;br /&gt;
     case SDLK_6:            return Key::Six;&lt;br /&gt;
     case SDLK_7:            return Key::Seven;&lt;br /&gt;
     case SDLK_8:            return Key::Eight;&lt;br /&gt;
     case SDLK_9:            return Key::Nine;&lt;br /&gt;
     case SDLK_COLON:        return Key::Colon;&lt;br /&gt;
     case SDLK_SEMICOLON:    return Key::Semicolon;&lt;br /&gt;
     case SDLK_EQUALS:       return Key::Equals;&lt;br /&gt;
     case SDLK_LEFTBRACKET:  return Key::LeftBracket;&lt;br /&gt;
     case SDLK_BACKSLASH:    return Key::Backslash;&lt;br /&gt;
     case SDLK_RIGHTBRACKET: return Key::RightBracket;&lt;br /&gt;
     case SDLK_a:            return Key::A;&lt;br /&gt;
     case SDLK_b:            return Key::B;&lt;br /&gt;
     case SDLK_c:            return Key::C;&lt;br /&gt;
     case SDLK_d:            return Key::D;&lt;br /&gt;
     case SDLK_e:            return Key::E;&lt;br /&gt;
     case SDLK_f:            return Key::F;&lt;br /&gt;
     case SDLK_g:            return Key::G;&lt;br /&gt;
     case SDLK_h:            return Key::H;&lt;br /&gt;
     case SDLK_i:            return Key::I;&lt;br /&gt;
     case SDLK_j:            return Key::J;&lt;br /&gt;
     case SDLK_k:            return Key::K;&lt;br /&gt;
     case SDLK_l:            return Key::L;&lt;br /&gt;
     case SDLK_m:            return Key::M;&lt;br /&gt;
     case SDLK_n:            return Key::N;&lt;br /&gt;
     case SDLK_o:            return Key::O;&lt;br /&gt;
     case SDLK_p:            return Key::P;&lt;br /&gt;
     case SDLK_q:            return Key::Q;&lt;br /&gt;
     case SDLK_r:            return Key::R;&lt;br /&gt;
     case SDLK_s:            return Key::S;&lt;br /&gt;
     case SDLK_t:            return Key::T;&lt;br /&gt;
     case SDLK_u:            return Key::U;&lt;br /&gt;
     case SDLK_v:            return Key::V;&lt;br /&gt;
     case SDLK_w:            return Key::W;&lt;br /&gt;
     case SDLK_x:            return Key::X;&lt;br /&gt;
     case SDLK_y:            return Key::Y;&lt;br /&gt;
     case SDLK_z:            return Key::Z;&lt;br /&gt;
     case SDLK_DELETE:       return Key::Delete;&lt;br /&gt;
     case SDLK_KP0:          return Key::Numpad0;&lt;br /&gt;
     case SDLK_KP1:          return Key::Numpad1;&lt;br /&gt;
     case SDLK_KP2:          return Key::Numpad2;&lt;br /&gt;
     case SDLK_KP3:          return Key::Numpad3;&lt;br /&gt;
     case SDLK_KP4:          return Key::Numpad4;&lt;br /&gt;
     case SDLK_KP5:          return Key::Numpad5;&lt;br /&gt;
     case SDLK_KP6:          return Key::Numpad6;&lt;br /&gt;
     case SDLK_KP7:          return Key::Numpad7;&lt;br /&gt;
     case SDLK_KP8:          return Key::Numpad8;&lt;br /&gt;
     case SDLK_KP9:          return Key::Numpad9;&lt;br /&gt;
     case SDLK_KP_PERIOD:    return Key::Decimal;&lt;br /&gt;
     case SDLK_KP_DIVIDE:    return Key::Divide;&lt;br /&gt;
     case SDLK_KP_MULTIPLY:  return Key::Multiply;&lt;br /&gt;
     case SDLK_KP_MINUS:     return Key::Subtract;&lt;br /&gt;
     case SDLK_KP_PLUS:      return Key::Add;&lt;br /&gt;
     case SDLK_KP_ENTER:     return Key::NumpadEnter;&lt;br /&gt;
     case SDLK_KP_EQUALS:    return Key::NumpadEquals;&lt;br /&gt;
     case SDLK_UP:           return Key::ArrowUp;&lt;br /&gt;
     case SDLK_DOWN:         return Key::ArrowDown;&lt;br /&gt;
     case SDLK_RIGHT:        return Key::ArrowRight;&lt;br /&gt;
     case SDLK_LEFT:         return Key::ArrowLeft;&lt;br /&gt;
     case SDLK_INSERT:       return Key::Insert;&lt;br /&gt;
     case SDLK_HOME:         return Key::Home;&lt;br /&gt;
     case SDLK_END:          return Key::End;&lt;br /&gt;
     case SDLK_PAGEUP:       return Key::PageUp;&lt;br /&gt;
     case SDLK_PAGEDOWN:     return Key::PageDown;&lt;br /&gt;
     case SDLK_F1:           return Key::F1;&lt;br /&gt;
     case SDLK_F2:           return Key::F2;&lt;br /&gt;
     case SDLK_F3:           return Key::F3;&lt;br /&gt;
     case SDLK_F4:           return Key::F4;&lt;br /&gt;
     case SDLK_F5:           return Key::F5;&lt;br /&gt;
     case SDLK_F6:           return Key::F6;&lt;br /&gt;
     case SDLK_F7:           return Key::F7;&lt;br /&gt;
     case SDLK_F8:           return Key::F8;&lt;br /&gt;
     case SDLK_F9:           return Key::F9;&lt;br /&gt;
     case SDLK_F10:          return Key::F10;&lt;br /&gt;
     case SDLK_F11:          return Key::F11;&lt;br /&gt;
     case SDLK_F12:          return Key::F12;&lt;br /&gt;
     case SDLK_F13:          return Key::F13;&lt;br /&gt;
     case SDLK_F14:          return Key::F14;&lt;br /&gt;
     case SDLK_F15:          return Key::F15;&lt;br /&gt;
     case SDLK_NUMLOCK:      return Key::NumLock;&lt;br /&gt;
     case SDLK_SCROLLOCK:    return Key::ScrollLock;&lt;br /&gt;
     case SDLK_RSHIFT:       return Key::RightShift;&lt;br /&gt;
     case SDLK_LSHIFT:       return Key::LeftShift;&lt;br /&gt;
     case SDLK_RCTRL:        return Key::RightControl;&lt;br /&gt;
     case SDLK_LCTRL:        return Key::LeftControl;&lt;br /&gt;
     case SDLK_RALT:         return Key::RightAlt;&lt;br /&gt;
     case SDLK_LALT:         return Key::LeftAlt;&lt;br /&gt;
     case SDLK_LSUPER:       return Key::LeftWindows;&lt;br /&gt;
     case SDLK_RSUPER:       return Key::RightWindows;&lt;br /&gt;
     case SDLK_SYSREQ:       return Key::SysRq;&lt;br /&gt;
     case SDLK_MENU:         return Key::AppMenu;&lt;br /&gt;
     case SDLK_POWER:        return Key::Power;&lt;br /&gt;
     default:                return 0;&lt;br /&gt;
     }&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage is like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 SDL_Event e;&lt;br /&gt;
 while (SDL_PollEvent(&amp;amp;e))&lt;br /&gt;
 {&lt;br /&gt;
     if (e.type == SDL_KEYDOWN)&lt;br /&gt;
     {&lt;br /&gt;
         CEGUI::uint kc = SDLKeyToCEGUIKey(e.key.keysym.sym);&lt;br /&gt;
         CEGUI::System::getSingleton().injectKeyDown(kc);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:lindquist]] 19:24, 8 Nov 2005 (CET)&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Overview_of_GUI_files&amp;diff=4206</id>
		<title>Overview of GUI files</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Overview_of_GUI_files&amp;diff=4206"/>
				<updated>2011-03-03T23:51:20Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are a lot of files that go into creating a GUI with CEGUI. Here is an overview (thanks to lindquist for the original version). An expanded version of this brief overview would be quite useful.&lt;br /&gt;
&lt;br /&gt;
== Overview of CEGUI resource files ==&lt;br /&gt;
=== '''.imageset Files''' ===&lt;br /&gt;
An imageset is an xml file describing a set of images contained in an image file.&lt;br /&gt;
When an imageset is loaded, images from that file become available to the application via the [http://www.cegui.org.uk/api_reference/classCEGUI_1_1ImagesetManager.html ImagesetManager].&lt;br /&gt;
&lt;br /&gt;
Editor: [http://www.cegui.org.uk/phpBB2/viewtopic.php?t=1346 CEImagesetEditor in the works by Martignasse.]&lt;br /&gt;
&lt;br /&gt;
=== '''[[Scheme files]]''' ===&lt;br /&gt;
A scheme file is an xml file describing the binding of widgets defined in a looknfeel file and the base Falagard widget set. Once loaded the components in the scheme file are available via the [http://www.cegui.org.uk/api_reference/classCEGUI_1_1WindowManager.html WindowManager]. A detailed description of [[Scheme files]] is also available.&lt;br /&gt;
&lt;br /&gt;
Editor: none&lt;br /&gt;
&lt;br /&gt;
=== '''.looknfeel Files''' ===&lt;br /&gt;
These are also xml files, which define the visual aspect of widgets declared in the scheme file.&lt;br /&gt;
&lt;br /&gt;
Editor: none&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== '''.layout Files''' ===&lt;br /&gt;
A layout file is also in xml format. It describes a set of widgets to create and their positions, sizes, and other attributes. Basically this describes the final on-screen layout of your GUI, hence the name.&lt;br /&gt;
&lt;br /&gt;
Editor: [[The &amp;quot;official&amp;quot; layout editor]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== '''.font Files''' ===&lt;br /&gt;
These simple xml files give the location of a font file (like a TrueType .ttf file) and define a few extra properties about how CEGUI should use that font.&lt;br /&gt;
&lt;br /&gt;
Editor:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== About [[Falagard Skinning System Documentation]] ==&lt;br /&gt;
Falagard is the part of the API that makes it possible to create a completly new set of widgets (at the visual level) from xml files.&lt;br /&gt;
&lt;br /&gt;
You can, with a looknfeel, describe a widget and make it appear as you want (by using images defined in some imageset) and finally bind it to one of the widgets from a Falagard Base widget set in a scheme file.&lt;br /&gt;
&lt;br /&gt;
Link: [[Falagard Skinning System Documentation]]&lt;br /&gt;
&lt;br /&gt;
== Related Documents ==&lt;br /&gt;
* [[XML File formats]] - Detailed documentation of the various XML file formats.&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Obtaining_the_library_source_from_Subversion&amp;diff=4205</id>
		<title>Obtaining the library source from Subversion</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Obtaining_the_library_source_from_Subversion&amp;diff=4205"/>
				<updated>2011-03-03T23:51:10Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{VersionBadge|0.7}} {{VersionBadge|0.6}} {{VersionBadge|0.5}} {{VersionBadge|0.4}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{notice|message=We now use Mercurial so this page can be considered obsolete for versions &amp;gt;= 0.7}}&lt;br /&gt;
&lt;br /&gt;
{{notice|message=Much of this information has been incorporated into the official developer documentation, see [http://www.cegui.org.uk/docs/current/downloading.html Obtaining the code] and [http://www.cegui.org.uk/docs/current/compiling.html Supported systems and compilation]}}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
PLEASE note: if you'd rather use precreated releases (tarballs or SDKs), please follow [[Downloads]].&lt;br /&gt;
&lt;br /&gt;
All the code for CrazyEddie's GUI System (and its tools) is kept in a revision control system known as [[Subversion]](SVN). This is a tool that allows us to easily track changes to the code (who did what, and when), to maintain multiple different versions (branches) for the code, and, where necessary, undo, revert, or merge code changes. This page explains the URLs of these repositories.&lt;br /&gt;
&lt;br /&gt;
== Branches and trunks ==&lt;br /&gt;
&lt;br /&gt;
Generally speaking, each stable release series has a seperate branch, and any changes made on those branches are largely bug-fixes and non-breaking (where possible) changes. The main 'trunk', or HEAD, code is where the latest and greatest code can be found, although this version of the code is generally to be considered as unstable / testing code. On the whole, we maintain two branches at once; whichever is the latest 'stable' branch, and the main trunk code. When a new release is made, previous release branches are generally considered obsolete (this will continue at least until we reach version 1.0.0 - at this stage we may consider maintaining support for multiple released versions).&lt;br /&gt;
&lt;br /&gt;
== Accessing Subversion ==&lt;br /&gt;
&lt;br /&gt;
It is possible to browse the SVN repository online by visiting http://crayzedsgui.svn.sourceforge.net/viewvc/crayzedsgui/cegui_mk2/&lt;br /&gt;
However, in order to actually compile the code you need to get the sources on your machine. On Linux you'd use the 'svn' command, and on Windows we'd suggest the [http://tortoisesvn.tigris.org/ Tortoise SVN Client] utility, which nicely integrates with your Explorer. Note that the 'svn' command expects the local target directory in the command, where TortoiseSVN expects it in an editbox of its interface. Either way, the URLs mentioned next will be the same. Note the '''s''''s; the repository has a secure URL. Retreiving is always &amp;quot;anonymous&amp;quot;, so it should work immediately.&lt;br /&gt;
&lt;br /&gt;
== The URLs ==&lt;br /&gt;
&lt;br /&gt;
'''From the commandline'''&lt;br /&gt;
* ''CEGUI itself'':&lt;br /&gt;
** For the current stable version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;svn co https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/branches/v0-7 cegui_mk2-0-7&amp;lt;/pre&amp;gt;&lt;br /&gt;
** For the cutting edge, unstable development version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;svn co &amp;lt;nowiki&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk&amp;lt;/nowiki&amp;gt; cegui_mk2-trunk&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''CEGUI Layout Editor:''&lt;br /&gt;
** For the current stable version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;svn co https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/branches/v0-6-1 LayoutEditor&amp;lt;/pre&amp;gt;&lt;br /&gt;
** For the cutting edge, unstable development version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;svn co https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk LayoutEditor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''CEGUI Imageset Editor:''&lt;br /&gt;
** For the current stable version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;svn co https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CEImagesetEditor/tags/v0-6-1 ImagesetEditor&amp;lt;/pre&amp;gt;&lt;br /&gt;
** For the cutting edge, unstable development version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;svn co https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CEImagesetEditor/trunk ImagesetEditor&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''From TortoiseSVN'''&lt;br /&gt;
* ''CEGUI itself:''&lt;br /&gt;
** For the current stable version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/branches/v0-7&amp;lt;/pre&amp;gt;&lt;br /&gt;
** For the cutting edge, unstable development version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/cegui_mk2/trunk&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ''CEGUI Layout Editor:''&lt;br /&gt;
** For the current stable version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/branches/v-0-6-1&amp;lt;/pre&amp;gt;&lt;br /&gt;
** For the cutting edge, unstable development version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CELayoutEditor/trunk&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ''CEGUI Imageset Editor:''&lt;br /&gt;
** For the current stable version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CEImagesetEditor/tags/v0-6-1&amp;lt;/pre&amp;gt;&lt;br /&gt;
** For the cutting edge, unstable development version code:&amp;lt;br /&amp;gt;&amp;lt;pre&amp;gt;https://crayzedsgui.svn.sourceforge.net/svnroot/crayzedsgui/CEImagesetEditor/trunk&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TODO: What's next ==&lt;br /&gt;
Now that you have the sources locally available, it's time to compile them. Depending on your OS, please follow one of the following links:&lt;br /&gt;
* For Windows, click here: &amp;lt;link here&amp;gt;&lt;br /&gt;
* For Linux, click here: &amp;lt;link here&amp;gt;&lt;br /&gt;
* For Mac OS, click here: &amp;lt;link here&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Compiling on Windows =&lt;br /&gt;
Now that you have the code, you probably want to compile it :)&lt;br /&gt;
&lt;br /&gt;
On windows, Premake is used to create project and solution files for different versions of Visual Studio. These files can be found in the directory 'makefiles/premake'. Per supported Visual Studio version there is one batch file for CEGUI itself, and one for the samples. After running a batch file, a corresponding .sln file is written in the same directory, which you can open.&lt;br /&gt;
&lt;br /&gt;
= Compiling on Linux =&lt;br /&gt;
&lt;br /&gt;
The first thing to do is to run bootstrap, which will run automake, autoconf, and various other tools to initialise the build environment and create the main configure script. If you have problems with bootstrap, make sure you're using a recent version of automake (1.9 is known to work).&lt;br /&gt;
&lt;br /&gt;
 ./bootstrap&lt;br /&gt;
&lt;br /&gt;
Now you should be on familiar territorty. To configure the build, run configure:&lt;br /&gt;
&lt;br /&gt;
 ./configure&lt;br /&gt;
&lt;br /&gt;
There are various things you can change about the way the system is built, to get information about these options, pass the --help option to configure like so:&lt;br /&gt;
&lt;br /&gt;
 ./configure --help&lt;br /&gt;
&lt;br /&gt;
Once configure has run successfully, you need to run make as usual:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
And finall, install as root:&lt;br /&gt;
&lt;br /&gt;
 su  &amp;lt;and enter password ;) &amp;gt;&lt;br /&gt;
 make install&lt;br /&gt;
&lt;br /&gt;
= Compiling for the Ogre3D Engine / Compiling the OgreRenderer =&lt;br /&gt;
&lt;br /&gt;
[[Building CEGUI for Ogre / OgreRenderer]]&lt;br /&gt;
&lt;br /&gt;
= Documentation =&lt;br /&gt;
Since you are using the library from SVN instead of using the precreated packages, you need to get the documentation by yourself. Please follow [[Documentation]].&lt;br /&gt;
&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Layout_files&amp;diff=4204</id>
		<title>Layout files</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Layout_files&amp;diff=4204"/>
				<updated>2011-03-03T23:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the time being, this has been copy-and-pasted directly from &amp;quot;readme.txt&amp;quot; in the XMLRefSchema directory of the CEGUI source code. Some prettier formatting along the lines of '''[[Scheme files]]''' would be nice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
A GUI Layout defines a hierachy of Window based objects to be created and a property settings for each window.&lt;br /&gt;
The root element is GUILayout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GUILayout Element&lt;br /&gt;
=================&lt;br /&gt;
GUILayout is the root element.&lt;br /&gt;
The GUILayout must contain a single Window element only.&lt;br /&gt;
&lt;br /&gt;
GUILayout attributes&lt;br /&gt;
--------------------&lt;br /&gt;
Parent		- Specifies the name of an existing window that this gui layout should be attached to (optional).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Window Element&lt;br /&gt;
==============&lt;br /&gt;
The Window element is used to specify a new window object to be created.&lt;br /&gt;
The Window element has attributes as described below and may contain any number of nested Window elements, any number of Property elements,&lt;br /&gt;
any number of LayoutImport elements, and any number of Event elements.&lt;br /&gt;
&lt;br /&gt;
Window attributes&lt;br /&gt;
-----------------&lt;br /&gt;
Type		- Specifies the type of Window object to be created (required).&lt;br /&gt;
Name		- Specifies the unique name for the Window.  If this is ommitted a name will be generated.  If a window with the name already exists, an exception will be thrown. (optional).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Property Element&lt;br /&gt;
================&lt;br /&gt;
The Property element is used to set properties on the Window created by the containing Window element.&lt;br /&gt;
Property has no sub-elements, but has attributes as described below.&lt;br /&gt;
&lt;br /&gt;
Property attributes&lt;br /&gt;
-------------------&lt;br /&gt;
Name		- The name of the property to be set.  If no such property exists for the target window, an exception may be thrown.  (required).&lt;br /&gt;
Value		- The value to be assigned to the property.  This must be in a format expected by the property or an exception may be thrown.  (required).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LayoutImport Element&lt;br /&gt;
====================&lt;br /&gt;
The LayoutImport element is used to reference (import) a layout file into another.  The root window of the imported layout is attached to the Window where the import occurrs.&lt;br /&gt;
The LayoutImport element has attributes but no sub-elements.&lt;br /&gt;
&lt;br /&gt;
LayoutImport attributes&lt;br /&gt;
-----------------------&lt;br /&gt;
Filename	- Specifies the filename of the layout XML file to be imported.&lt;br /&gt;
ResourceGroup - The resource group identifier to pass to the resource provider when loading the file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Event Element&lt;br /&gt;
=============&lt;br /&gt;
The Event element is used to create bindings between Gui elements and script functions.&lt;br /&gt;
The Event element has attributes but no sub-elements.&lt;br /&gt;
&lt;br /&gt;
Event attributes&lt;br /&gt;
----------------&lt;br /&gt;
Name		- Specifies the name of the target event.&lt;br /&gt;
Function	- Specifies the name of the script function that is to be bound to the event.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Manuals]]&lt;br /&gt;
[[Category:NeedsRefinement]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Introduction_To_Auto_Windows&amp;diff=4203</id>
		<title>Introduction To Auto Windows</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Introduction_To_Auto_Windows&amp;diff=4203"/>
				<updated>2011-03-03T23:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Introduction ===&lt;br /&gt;
The purpose of this article is to highlight the &amp;quot;Auto Window&amp;quot; and demonstrate a couple of the advanced possibilities that they enable within Crazy Eddie's GUI System. The article will introduce the concept of the auto window, show where it is used in the unmodified system, and then go on to demonstrate how the developer can make use of the same ideas to solve certain problems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== What is an Auto Window? ===&lt;br /&gt;
If you have used CEGUI at all, chances are that you have already used auto windows without knowing it; combo boxes, all the list widgets, and even the scroll bar and frame window are all compound widgets made up of multiple component widgets - those component widgets are classed as auto windows.&lt;br /&gt;
&lt;br /&gt;
An auto window is basically a widget that is created as a child component of another widget type, as defined in the LookNFeel skin by the use of the &amp;lt;Child&amp;gt; tag. Many of the core widgets have requirements for auto windows that must be specified - the frame window for example requires that a titlebar and close button be specified.&lt;br /&gt;
&lt;br /&gt;
It is possible that there may be confusion in relation to LookNFeel specifications and window Layout specifications. It appears there is some crossover of functionality since both provide a means for setting properties, specifying child widgets, and so on; be assured there actually isn't any crossover. The parts of the system that deal with LookNFeel and Layouts are operating at totally different levels. One potentially useful way to look at these two parts of the system is to consider the LookNFeel to specify a class (or maybe a template) for a widget, whilst the Layouts define and specify actual instances of those classes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== An Existing Example ===&lt;br /&gt;
The first thing we will do is take a look at an existing example. Here is how the titlebar is specified for the WindowsLook frame window:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;Child type=&amp;quot;WindowsLook/Titlebar&amp;quot; nameSuffix=&amp;quot;__auto_titlebar__&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;Area&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
         &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;FontDim type=&amp;quot;LineSpacing&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;DimOperator op=&amp;quot;Multiply&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;1.5&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
             &amp;lt;/FontDim&amp;gt;&lt;br /&gt;
         &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;/Area&amp;gt;&lt;br /&gt;
     &amp;lt;Property name=&amp;quot;AlwaysOnTop&amp;quot; value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
 &amp;lt;/Child&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Since this whole concept may be new to many readers, lets take this first example one part at a time.&lt;br /&gt;
&lt;br /&gt;
To open the definition we use the &amp;lt;Child&amp;gt; tag. Here we need to supply two attributes to specify the type of window to be created and a name suffix to be used. This is telling the system that whenever a widget using this WidgetLook (in this case &amp;quot;WindowsLook/FrameWindow&amp;quot;) is created, it should create and attach a child window of the specified type (&amp;quot;WindowsLook/Titlebar&amp;quot;) and name that child by appending the given suffix (&amp;quot;__auto_titlebar__&amp;quot;) to the base widget name.&lt;br /&gt;
&lt;br /&gt;
In this example, if you create a &amp;quot;WindowsLook/Framewindow&amp;quot; with the name &amp;quot;myWindow&amp;quot;, the system will automatically have created a &amp;quot;WindowsLook/Titlebar&amp;quot; named &amp;quot;myWindow__auto_titlebar__&amp;quot; and added it as a child to &amp;quot;myWindow&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Next we can see an &amp;lt;Area&amp;gt; tag. The content in here defines the area that this child is to occupy within its parent (meaning all positions are relative to the parent's position, and scale co-ordinate components are fractions of the size of the parent).&lt;br /&gt;
&lt;br /&gt;
In this example the the title bar is positioned at absolute location (0,0) - so is at the top left of the parent. The right edge is is specified as being a scale value of 1, which means the right edge will always be attached to the right edge of the parent. The height is specified as being 1.5 times the linespacing value of the current font.&lt;br /&gt;
&lt;br /&gt;
Finally we see a &amp;lt;Property&amp;gt; tag. We can list properties here to specify 'defaults' to be used for the component widget in instances of the widget being defined. This provides a means to override default settings that may previously have been specified either in the core system code, or in the WidgetLook for the type being embedded.&lt;br /&gt;
&lt;br /&gt;
In this example we are ensuring that the titlebar is used with the always on top setting disabled.&lt;br /&gt;
&lt;br /&gt;
Note that we have skimmed over some of the specifics of this definition - this article is not intended as a tutorial on the [[Falagard]] system itself, just one specific capability of it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Accessing Auto Windows ===&lt;br /&gt;
Now we know what an auto window is and generally how they are created, you may be able to see that it is possible to access these windows directly - afterall they are actually the same as any other child window, just automatically created by the system.&lt;br /&gt;
&lt;br /&gt;
Sticking with the the FrameWindow, you might want to hear about mouse clicks on the title bar and assign a scripted event handler. Your code could look something similar to this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// get access to the titlebar attached to the frame window &amp;quot;myFrameWindow&amp;quot;&lt;br /&gt;
Window* titlebar = WindowManager::getSingleton().getWindow(&amp;quot;myFrameWindow__auto_titlebar__&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// attach a scripted event handler to process mouse clicks&lt;br /&gt;
titlebar-&amp;gt;subscribeScriptedEvent(&amp;quot;MouseClick&amp;quot;, &amp;quot;handleTitlebarClick&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is very nice, but requires some code compilation so could be hard to play with and tweak. What we really want to be doing is attaching our event handler from within the layout file like we would in the case of a &amp;quot;normal&amp;quot; window. The CEGUI layout system provides a means for us to target auto windows within the layout file with the &amp;lt;AutoWindow&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
The AutoWindow tag takes a single attribute &amp;quot;NameSuffix&amp;quot; which specifies the name suffix of the auto window we wish to target (if we continue our example, this would be &amp;quot;__auto_titlebar__&amp;quot; to target the titlebar of a FrameWindow). The AutoWindow tag may then then contain LayoutImport (yes, you really can import an entire layout as content for an auto window), Property, Event, and other Window and AutoWindow (to target auto windows of auto windows!) tags.&lt;br /&gt;
&lt;br /&gt;
Thus, to attach a scripted event handler to the title bar of a frame window in a layout you could do this:&lt;br /&gt;
&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;lt;Window Type=&amp;quot;WindowsLook/FrameWindow&amp;quot; Name=&amp;quot;myFrameWindow&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Auto Window Example&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.25,0},{0.25,0},{0.8,0},{0.8,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;AutoWindow NameSuffix=&amp;quot;__auto_titlebar__&amp;quot; &amp;gt;&lt;br /&gt;
         &amp;lt;Event Name=&amp;quot;MouseClick&amp;quot; Function=&amp;quot;handleTitlebarClick&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/AutoWindow&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Window&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
Reiterating, along with the Event tag you could just as easily have specified Property tags to modify the options set for the title bar, or even Window tags to add an extra button for example. The AutoWindow tag effectively allows us to do an auto window anything we can do with a normal window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Making Your Own Auto Windows ===&lt;br /&gt;
As already mentioned, various compound widgets in the system have specified requirements for auto windows that must be supplied within the LookNFeel. What you need to consider is that these requirements are a minimum and not an absolute. This affords us the possibility of specifying, via the &amp;lt;Child&amp;gt; tag, additional auto windows of our choosing in the LookNFeel. Effectively this unties our hands and gives total freedom to create any number of new widgets by combining other widgets in various ways. Obviously there will be cases where supporting systems and code are required, but the basic composition and layout of these widgets can be entirely specified in XML.&lt;br /&gt;
&lt;br /&gt;
One of the weaknesses of the FrameWindow as it stands at the moment is that developer added content, that is your buttons and other widgets, are added to the frame window relative to the top-left corner and on an equal standing to the title bar. This can lead to situations where your content is sometimes partially obscured by the titlebar, this can especially be the case if the user may re-size the frame window - things may look fine at the initial size, but quickly go awry when the window is made smaller.&lt;br /&gt;
&lt;br /&gt;
One work around to the frame window issue is to add an absolutely positioned container window in the layout and have the content added to that. On the surface this seems like an ideal solution, but in reality has more issues of its own since it does not allow your layout to remain resolution neutral (2 pixels at 640 x 480 are much larger physically than they are at, say, 1024 x 768). Additionally, changing the size of the titlebar font would not automatically re-size the 'content pane' and so you would need additional processing for that. Ultimately the whole concept breaks down as being not worth the cost.&lt;br /&gt;
&lt;br /&gt;
What is needed is a solution that can remain resolution independent, have some kind of absolute positioning, but also react to changes in the parent window. All of these criteria are met by the basic provisions of the [[Falagard]] system and the auto window approach will give us a reasonable solution.&lt;br /&gt;
&lt;br /&gt;
The rest of the article will develop a frame window type that has a separate client area or content window. Note that the solution developed is not a panacea; there are still potential issues surrounding enabling and disabling of the title bar and window frame, though generally the solution presented will be useful to many.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Example Project - NewFrameWindow ===&lt;br /&gt;
Basically what we are going to do is to create a new FrameWindow type that uses the auto window system to add a DefaultWindow which covers what is commonly known as the 'client area' of the frame window; that is the area within the window frame and title bar. We can then target content into this client area auto window within layout files.&lt;br /&gt;
&lt;br /&gt;
First let us define a couple of criteria that this new auto window must meet as far as position and size:&lt;br /&gt;
* The top edge needs to be glued to the bottom edge of the title bar at all times.&lt;br /&gt;
* The other edges need to be within the window sizing frame at all times.&lt;br /&gt;
&lt;br /&gt;
Ok, that seems fairly straight forwards, lets make a start. We'll define the new auto window and its parts outside of any WidgetLook to begin with, this will enable us to focus on the important aspects of what we are doing. At the end the final thing is presented in full along with other supporting material.&lt;br /&gt;
&lt;br /&gt;
First provide the Child tag structure:&lt;br /&gt;
 &amp;lt;Child type=&amp;quot;DefaultWindow&amp;quot; nameSuffix=&amp;quot;__auto_clientarea__&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;/Child&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the suffix could, in reality, be anything you choose; the use &amp;quot;__auto_&amp;lt;whatever&amp;gt;__&amp;quot; is just the established idiom used within CEGUI itself - so we just continue that here.&lt;br /&gt;
&lt;br /&gt;
Now we need to establish the area to be used by the client area window according to our specifications above. In order to do what is needed we need two pieces of information; the location of the bottom edge of the title bar, and the size of the sizing border. Both are easily obtained. The WidgetDim element in [[Falagard]] allows us to extract information about the location of another widget, and the PropertyDim allows us to extract a setting from the parent window.&lt;br /&gt;
&lt;br /&gt;
We now define the area for the client area window as follows:&lt;br /&gt;
 &amp;lt;Area&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;PropertyDim name=&amp;quot;SizingBorderThickness&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;PropertyDim name=&amp;quot;SizingBorderThickness&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
         &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;PropertyDim name=&amp;quot;SizingBorderThickness&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
         &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
 &amp;lt;/Area&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We require no additional settings or options for this window.&lt;br /&gt;
&lt;br /&gt;
To utilise the client area in a layout we now can use XML such as:&lt;br /&gt;
 &amp;lt;AutoWindow NameSuffix=&amp;quot;__auto_clientarea__&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;Window Type=&amp;quot;WindowsLook/Button&amp;quot; Name=&amp;quot;myButton&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.02,0},{0.01,0},{0.98,0},{0.2,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Engage!&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;/Window&amp;gt;&lt;br /&gt;
 &amp;lt;/AutoWindow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Putting It Together ===&lt;br /&gt;
In order that you can make use of such a new frame window it all needs to be presented to the system in some way. You could just modify the existing WindowsLook.looknfeel XML file and that would be fine. However, in this section we present the solution in such a way it can be used as an 'add-in' widget which can be used in addition to the existing WindowsLook widgets. This is just one way of doing it, various possibilities exist for the advanced user.&lt;br /&gt;
&lt;br /&gt;
We have the following two files:&lt;br /&gt;
* NewFrameWindow.scheme - specifies the required binding to make the widget available in the system&lt;br /&gt;
* NewFrameWindow.looknfeel - specifies the LookNFeel specification for the new frame window type&lt;br /&gt;
&lt;br /&gt;
This code snippet shows how you might load in the schemes:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
// Note that in order for this to work you need to have loaded the normal&lt;br /&gt;
// WindowsLook.scheme.&lt;br /&gt;
SchemeManager::getSingleton().loadScheme(&amp;quot;WindowsLook.scheme&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Load in a scheme to setup our new frame window type&lt;br /&gt;
SchemeManager::getSingleton().loadScheme(&amp;quot;NewFrameWindow.scheme&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NewFrameWindow.scheme ====&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;GUIScheme Name=&amp;quot;WindowsLookAdditions&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;LookNFeel Filename=&amp;quot;NewFrameWindow.looknfeel&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;WindowSet Filename=&amp;quot;CEGUIFalagardWRBase&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;FalagardMapping WindowType=&amp;quot;WindowsLook/NewFrameWindow&amp;quot;&lt;br /&gt;
                      TargetType=&amp;quot;CEGUI/FrameWindow&amp;quot;&lt;br /&gt;
                      Renderer=&amp;quot;Falagard/FrameWindow&amp;quot;&lt;br /&gt;
                      LookNFeel=&amp;quot;WindowsLook/NewFrameWindow&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/GUIScheme&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== NewFrameWindow.looknfeel ====&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;Falagard&amp;gt;&lt;br /&gt;
     &amp;lt;!--&lt;br /&gt;
     ***************************************************&lt;br /&gt;
         WindowsLook/NewFrameWindow&lt;br /&gt;
     ***************************************************&lt;br /&gt;
     --&amp;gt;&lt;br /&gt;
     &amp;lt;WidgetLook name=&amp;quot;WindowsLook/NewFrameWindow&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;PropertyLinkDefinition name=&amp;quot;CaptionColour&amp;quot; widget=&amp;quot;__auto_titlebar__&amp;quot; targetProperty=&amp;quot;CaptionColour&amp;quot; initialValue=&amp;quot;FF000000&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;PropertyLinkDefinition name=&amp;quot;TitlebarFont&amp;quot; widget=&amp;quot;__auto_titlebar__&amp;quot; targetProperty=&amp;quot;Font&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property name=&amp;quot;NSSizingCursorImage&amp;quot; value=&amp;quot;set:WindowsLook image:MouseNoSoCursor&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property name=&amp;quot;EWSizingCursorImage&amp;quot; value=&amp;quot;set:WindowsLook image:MouseEsWeCursor&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property name=&amp;quot;NWSESizingCursorImage&amp;quot; value=&amp;quot;set:WindowsLook image:MouseNwSeCursor&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property name=&amp;quot;NESWSizingCursorImage&amp;quot; value=&amp;quot;set:WindowsLook image:MouseNeSwCursor&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;NamedArea name=&amp;quot;ClientWithTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameLeft&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameRight&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottom&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
         &amp;lt;NamedArea name=&amp;quot;ClientWithTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
         &amp;lt;NamedArea name=&amp;quot;ClientNoTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameLeft&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameTop&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameRight&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottom&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
         &amp;lt;NamedArea name=&amp;quot;ClientNoTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/NamedArea&amp;gt;&lt;br /&gt;
         &amp;lt;Child type=&amp;quot;DefaultWindow&amp;quot; nameSuffix=&amp;quot;__auto_clientarea__&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;PropertyDim name=&amp;quot;SizingBorderThickness&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;PropertyDim name=&amp;quot;SizingBorderThickness&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;PropertyDim name=&amp;quot;SizingBorderThickness&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
         &amp;lt;/Child&amp;gt;&lt;br /&gt;
         &amp;lt;Child type=&amp;quot;WindowsLook/Titlebar&amp;quot; nameSuffix=&amp;quot;__auto_titlebar__&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;FontDim widget=&amp;quot;__auto_titlebar__&amp;quot; type=&amp;quot;LineSpacing&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Multiply&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;AbsoluteDim value=&amp;quot;1.5&amp;quot; /&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/FontDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Property name=&amp;quot;AlwaysOnTop&amp;quot; value=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Child&amp;gt;&lt;br /&gt;
         &amp;lt;Child type=&amp;quot;WindowsLook/SystemButton&amp;quot; nameSuffix=&amp;quot;__auto_closebutton__&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;AbsoluteDim value=&amp;quot;0.5&amp;quot;&amp;gt;&lt;br /&gt;
                                 &amp;lt;DimOperator op=&amp;quot;Multiply&amp;quot;&amp;gt;&lt;br /&gt;
                                     &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;CloseButtonNormal&amp;quot; dimension=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
                                         &amp;lt;DimOperator op=&amp;quot;Add&amp;quot;&amp;gt;&lt;br /&gt;
                                             &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                                     &amp;lt;/ImageDim&amp;gt;&lt;br /&gt;
                                 &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                             &amp;lt;/AbsoluteDim&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;AbsoluteDim value=&amp;quot;0.5&amp;quot;&amp;gt;&lt;br /&gt;
                                 &amp;lt;DimOperator op=&amp;quot;Multiply&amp;quot;&amp;gt;&lt;br /&gt;
                                     &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
                                         &amp;lt;DimOperator op=&amp;quot;Add&amp;quot;&amp;gt;&lt;br /&gt;
                                             &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;CloseButtonNormal&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                                     &amp;lt;/WidgetDim&amp;gt;&lt;br /&gt;
                                 &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                             &amp;lt;/AbsoluteDim&amp;gt;&lt;br /&gt;
                         &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                     &amp;lt;/WidgetDim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;Width&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;CloseButtonNormal&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;Dim type=&amp;quot;Height&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;CloseButtonNormal&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Dim&amp;gt;&lt;br /&gt;
             &amp;lt;/Area&amp;gt;&lt;br /&gt;
             &amp;lt;Property name=&amp;quot;AlwaysOnTop&amp;quot; value=&amp;quot;True&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property name=&amp;quot;NormalImage&amp;quot; value=&amp;quot;set:WindowsLook image:CloseButtonNormal&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property name=&amp;quot;HoverImage&amp;quot; value=&amp;quot;set:WindowsLook image:CloseButtonHover&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;Property name=&amp;quot;PushedImage&amp;quot; value=&amp;quot;set:WindowsLook image:CloseButtonPushed&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;/Child&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;withtitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;FrameComponent&amp;gt;&lt;br /&gt;
                 &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;BottomLeftCorner&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottomLeft&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;BottomRightCorner&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottomRight&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;LeftEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameLeft&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;RightEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameRight&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;BottomEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottom&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/FrameComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;notitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;FrameComponent&amp;gt;&lt;br /&gt;
                 &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;TopLeftCorner&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameTopLeft&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;TopRightCorner&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameTopRight&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;BottomLeftCorner&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottomLeft&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;BottomRightCorner&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottomRight&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;LeftEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameLeft&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;TopEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameTop&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;RightEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameRight&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Image type=&amp;quot;BottomEdge&amp;quot; imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottom&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/FrameComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;withtitle_withframe_client_area&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Colours topLeft=&amp;quot;FFDFDFF5&amp;quot; topRight=&amp;quot;FFDFEFF5&amp;quot; bottomLeft=&amp;quot;FFF4F3F5&amp;quot; bottomRight=&amp;quot;FFF0F0F5&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                 &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameLeft&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                                 &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameRight&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                             &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                         &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                                 &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottom&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                             &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                         &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Image imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;Background&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;notitle_withframe_client_area&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Colours topLeft=&amp;quot;FFDFDFF5&amp;quot; topRight=&amp;quot;FFDFEFF5&amp;quot; bottomLeft=&amp;quot;FFF4F3F5&amp;quot; bottomRight=&amp;quot;FFF0F0F5&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                 &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameLeft&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameTop&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                                 &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameRight&amp;quot; dimension=&amp;quot;Width&amp;quot; /&amp;gt;&lt;br /&gt;
                             &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                         &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                             &amp;lt;DimOperator op=&amp;quot;Subtract&amp;quot;&amp;gt;&lt;br /&gt;
                                 &amp;lt;ImageDim imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;WindowFrameBottom&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                             &amp;lt;/DimOperator&amp;gt;&lt;br /&gt;
                         &amp;lt;/UnifiedDim&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Image imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;Background&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;withtitle_noframe_client_area&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Colours topLeft=&amp;quot;FFDFDFF5&amp;quot; topRight=&amp;quot;FFDFEFF5&amp;quot; bottomLeft=&amp;quot;FFF4F3F5&amp;quot; bottomRight=&amp;quot;FFF0F0F5&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                 &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;WidgetDim widget=&amp;quot;__auto_titlebar__&amp;quot; dimension=&amp;quot;Height&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Image imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;Background&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;ImagerySection name=&amp;quot;notitle_noframe_client_area&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Colours topLeft=&amp;quot;FFDFDFF5&amp;quot; topRight=&amp;quot;FFDFEFF5&amp;quot; bottomLeft=&amp;quot;FFF4F3F5&amp;quot; bottomRight=&amp;quot;FFF0F0F5&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;ImageryComponent&amp;gt;&lt;br /&gt;
                 &amp;lt;Area&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;LeftEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;TopEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;AbsoluteDim value=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;RightEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;RightEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                     &amp;lt;Dim type=&amp;quot;BottomEdge&amp;quot;&amp;gt;&lt;br /&gt;
                         &amp;lt;UnifiedDim scale=&amp;quot;1&amp;quot; type=&amp;quot;BottomEdge&amp;quot; /&amp;gt;&lt;br /&gt;
                     &amp;lt;/Dim&amp;gt;&lt;br /&gt;
                 &amp;lt;/Area&amp;gt;&lt;br /&gt;
                 &amp;lt;Image imageset=&amp;quot;WindowsLook&amp;quot; image=&amp;quot;Background&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;VertFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;HorzFormat type=&amp;quot;Stretched&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/ImageryComponent&amp;gt;&lt;br /&gt;
         &amp;lt;/ImagerySection&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;ActiveWithTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;Colours topLeft=&amp;quot;FFA7C7FF&amp;quot; topRight=&amp;quot;FFA7C7FF&amp;quot; bottomLeft=&amp;quot;FFA7C7FF&amp;quot; bottomRight=&amp;quot;FFA7C7FF&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Section&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_withframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;InactiveWithTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;Colours topLeft=&amp;quot;FFEFEFEF&amp;quot; topRight=&amp;quot;FFEFEFEF&amp;quot; bottomLeft=&amp;quot;FFEFEFEF&amp;quot; bottomRight=&amp;quot;FFEFEFEF&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Section&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_withframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;DisabledWithTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;Colours topLeft=&amp;quot;FFEFEFEF&amp;quot; topRight=&amp;quot;FFEFEFEF&amp;quot; bottomLeft=&amp;quot;FFEFEFEF&amp;quot; bottomRight=&amp;quot;FFEFEFEF&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Section&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_withframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;ActiveWithTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_noframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;InactiveWithTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_noframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;DisabledWithTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;withtitle_noframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;ActiveNoTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;Colours topLeft=&amp;quot;FFA7C7FF&amp;quot; topRight=&amp;quot;FFA7C7FF&amp;quot; bottomLeft=&amp;quot;FFA7C7FF&amp;quot; bottomRight=&amp;quot;FFA7C7FF&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Section&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_withframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;InactiveNoTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;Colours topLeft=&amp;quot;FFEFEFEF&amp;quot; topRight=&amp;quot;FFEFEFEF&amp;quot; bottomLeft=&amp;quot;FFEFEFEF&amp;quot; bottomRight=&amp;quot;FFEFEFEF&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Section&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_withframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;DisabledNoTitleWithFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_frame&amp;quot;&amp;gt;&lt;br /&gt;
                     &amp;lt;Colours topLeft=&amp;quot;FFEFEFEF&amp;quot; topRight=&amp;quot;FFEFEFEF&amp;quot; bottomLeft=&amp;quot;FFEFEFEF&amp;quot; bottomRight=&amp;quot;FFEFEFEF&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;/Section&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_withframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;ActiveNoTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_noframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;InactiveNoTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_noframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
         &amp;lt;StateImagery name=&amp;quot;DisabledNoTitleNoFrame&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;Layer&amp;gt;&lt;br /&gt;
                 &amp;lt;Section section=&amp;quot;notitle_noframe_client_area&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Layer&amp;gt;&lt;br /&gt;
         &amp;lt;/StateImagery&amp;gt;&lt;br /&gt;
     &amp;lt;/WidgetLook&amp;gt;&lt;br /&gt;
 &amp;lt;/Falagard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Test layout file ====&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;GUILayout&amp;gt;&lt;br /&gt;
 &amp;lt;Window Type=&amp;quot;DefaultGUISheet&amp;quot; Name=&amp;quot;root&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;Window Type=&amp;quot;WindowsLook/NewFrameWindow&amp;quot; Name=&amp;quot;myFrameWindow&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;UnifiedPosition&amp;quot; Value=&amp;quot;{{0.1,0},{0.1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;UnifiedMaxSize&amp;quot; Value=&amp;quot;{{1,0},{1,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;UnifiedMinSize&amp;quot; Value=&amp;quot;{{0,128},{0,128}}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;UnifiedSize&amp;quot; Value=&amp;quot;{{0.4,0},{0.5,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
         &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Demo of seperate client area.&amp;quot; /&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
         &amp;lt;!--&lt;br /&gt;
         ***************************************************&lt;br /&gt;
             Notice that the content of this window actually&lt;br /&gt;
             go inside a child component of the compound&lt;br /&gt;
             type FrameWindow - this is achieved by the&lt;br /&gt;
             use of the AutoWindow tag and supplying the&lt;br /&gt;
             name suffix used when we defined the new&lt;br /&gt;
             client area in the looknfeel.&lt;br /&gt;
         ***************************************************&lt;br /&gt;
         --&amp;gt;&lt;br /&gt;
         &amp;lt;AutoWindow NameSuffix=&amp;quot;__auto_clientarea__&amp;quot; &amp;gt;&lt;br /&gt;
             &amp;lt;Window Type=&amp;quot;WindowsLook/Button&amp;quot; Name=&amp;quot;myFrameWindow/Button1&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.02,0},{0.01,0},{0.98,0},{0.15,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;A Button&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Window&amp;gt;&lt;br /&gt;
             &amp;lt;Window Type=&amp;quot;WindowsLook/Button&amp;quot; Name=&amp;quot;myFrameWindow/Button2&amp;quot;&amp;gt;&lt;br /&gt;
                 &amp;lt;Property Name=&amp;quot;UnifiedAreaRect&amp;quot; Value=&amp;quot;{{0.04,0},{0.6,0},{0.96,0},{0.75,0}}&amp;quot; /&amp;gt;&lt;br /&gt;
                 &amp;lt;Property Name=&amp;quot;Text&amp;quot; Value=&amp;quot;Another Button&amp;quot; /&amp;gt;&lt;br /&gt;
             &amp;lt;/Window&amp;gt;&lt;br /&gt;
         &amp;lt;/AutoWindow&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
     &amp;lt;/Window&amp;gt;&lt;br /&gt;
 &amp;lt;/Window&amp;gt;&lt;br /&gt;
 &amp;lt;/GUILayout&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
In this article you have seen what an auto window is, how the system uses them &amp;quot;out of the box&amp;quot;, and how you can utilise the same system to extend widgets to perform differently. You have also seen how to target these auto windows from c++ code and also from layout XML files.&lt;br /&gt;
&lt;br /&gt;
[[User:CrazyEddie]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Uncategorised]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	<entry>
		<id>http://cegui.org/wiki/index.php?title=Imageset_files&amp;diff=4202</id>
		<title>Imageset files</title>
		<link rel="alternate" type="text/html" href="http://cegui.org/wiki/index.php?title=Imageset_files&amp;diff=4202"/>
				<updated>2011-03-03T23:50:40Z</updated>
		
		<summary type="html">&lt;p&gt;Capek: Bot: Automated text replacement  (-\[\[(.*?)\|.*?\]\] +\1)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the time being, this has been copy-and-pasted directly from &amp;quot;readme.txt&amp;quot; in the XMLRefSchema directory of the CEGUI source code. Some prettier formatting along the lines of '''[[Scheme files]]''' would be nice.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imagesets define one or more images on a larger image (texture).&lt;br /&gt;
The root element must be Imageset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Imageset Element&lt;br /&gt;
================&lt;br /&gt;
Has attributes and a collection of one or more Image elements.&lt;br /&gt;
&lt;br /&gt;
Imageset attributes&lt;br /&gt;
-------------------&lt;br /&gt;
Imagefile	- path to the image file containing the graphics (required).&lt;br /&gt;
ResourceGroup	- The resource group identifier to pass to the resource provider when loading the file.&lt;br /&gt;
Name		- the name that will be assigned to the Imageset in the GUI system (required).&lt;br /&gt;
NativeHorzRes	- The horizontal screen resolution that the images were are intended to be displayed at (optional, default=640).&lt;br /&gt;
NativeVertRes	- The vertical screen resolution that the images were are intended to be displayed at (optional, default=480).&lt;br /&gt;
AutoScaled	- Boolean, states whether to scale imagery so it appears the same size as any resolution (optional, default=false).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Image Element&lt;br /&gt;
=============&lt;br /&gt;
Has attributes defining an sub-image area.  Can have no sub-elements.&lt;br /&gt;
&lt;br /&gt;
Image attributes&lt;br /&gt;
----------------&lt;br /&gt;
Name		- The name that will be used to identify the image within the Imageset.  (required).&lt;br /&gt;
XPos		- X pixel co-ordinate of the top-left corner of the image on the texture. (required).&lt;br /&gt;
YPos		- Y pixel co-ordinate of the top-left corner of the image on the texture. (required).&lt;br /&gt;
Width		- Width of this image in pixels. (required).&lt;br /&gt;
Height		- Height of this image in pixels. (required).&lt;br /&gt;
XOffset		- Horizontal offset to apply when rendering.  (optional, default=0)&lt;br /&gt;
YOffset		- Vertical offset to apply when rendering.  (optional, default=0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Uncategorised]]&lt;/div&gt;</summary>
		<author><name>Capek</name></author>	</entry>

	</feed>