summaryrefslogtreecommitdiff
path: root/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager
diff options
context:
space:
mode:
Diffstat (limited to 'webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager')
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AliasManager.js172
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AppearanceManager.js139
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ColorManager.js227
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/IframeManager.js75
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImageManager.js305
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImagePreloaderManager.js82
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/MenuManager.js92
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ObjectManager.js117
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/PopupManager.js77
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ToolTipManager.js191
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/WindowManager.js158
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/DomSelectionManager.js242
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/RadioManager.js292
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/SelectionManager.js1433
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeFullControlSelectionManager.js206
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeSelectionManager.js198
-rw-r--r--webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/VirtualSelectionManager.js143
17 files changed, 4149 insertions, 0 deletions
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AliasManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AliasManager.js
new file mode 100644
index 0000000000..5ba86b7a32
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AliasManager.js
@@ -0,0 +1,172 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(core)
+
+************************************************************************ */
+
+/**
+ * This singleton manage global resource aliases
+ *
+ * @event change {qx.event.type.Event}
+ */
+qx.OO.defineClass("qx.manager.object.AliasManager", qx.core.Target,
+function()
+{
+ qx.core.Target.call(this);
+
+ // Contains defined aliases (like icons/, widgets/, application/, ...)
+ this._aliases = {};
+
+ // Containes computed paths
+ this._uris = {};
+
+ // Define static alias from setting
+ this.add("static", this.getSetting("staticUri"));
+});
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFAULT SETTINGS
+---------------------------------------------------------------------------
+*/
+
+qx.Settings.setDefault("resourceUri", "../../resource");
+qx.Settings.setDefault("staticUri", qx.Settings.getValue("resourceUri") + "/static");
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ ALIAS MANAGMENT
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.add = function(vPrefix, vPath)
+{
+ this._aliases[vPrefix] = vPath;
+ this.createDispatchEvent("change");
+}
+
+qx.Proto.remove = function(vPrefix)
+{
+ delete this._aliases[vPrefix];
+ this.createDispatchEvent("change");
+}
+
+qx.Proto.resolve = function(vPrefix) {
+ return this._aliases[vPrefix];
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ URI HANDLING
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.resolvePath = function(vPath, vForceUpdate)
+{
+ var vUri = this._uris[vPath];
+
+ if (vForceUpdate || typeof vUri === "undefined")
+ {
+ vUri = this._uris[vPath] = this._computePath(vPath);
+ // this.debug("URI: " + vPath + " => " + vUri);
+ }
+
+ return vUri;
+}
+
+qx.Proto._computePath = function(vPath, vForce)
+{
+ switch(vPath.charAt(0))
+ {
+ case "/":
+ case ".":
+ return vPath;
+
+ default:
+ if (qx.lang.String.startsWith(vPath, qx.net.Protocol.URI_HTTP) || qx.lang.String.startsWith(vPath, qx.net.Protocol.URI_HTTPS) || qx.lang.String.startsWith(vPath, qx.net.Protocol.URI_FILE)) {
+ return vPath;
+ }
+
+ var vAlias = vPath.substring(0, vPath.indexOf("/"));
+ var vResolved = this._aliases[vAlias];
+
+ if (qx.util.Validation.isValidString(vResolved)) {
+ return vResolved + vPath.substring(vAlias.length);
+ }
+
+ return vPath;
+ }
+}
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ this._aliases = null;
+ this._uris = null;
+
+ return qx.core.Target.prototype.dispose.call(this);
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AppearanceManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AppearanceManager.js
new file mode 100644
index 0000000000..680bd09073
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/AppearanceManager.js
@@ -0,0 +1,139 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_core)
+
+************************************************************************ */
+
+qx.OO.defineClass("qx.manager.object.AppearanceManager", qx.manager.object.ObjectManager,
+function() {
+ qx.manager.object.ObjectManager.call(this);
+
+ // Themes
+ this._appearanceThemes = {};
+});
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFAULT SETTINGS
+---------------------------------------------------------------------------
+*/
+
+qx.Settings.setDefault("appearanceTheme", "qx.theme.appearance.Classic");
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.OO.addProperty({ name : "appearanceTheme", type : "object", allowNull : false, instance : "qx.renderer.theme.AppearanceTheme" });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ REGISTRATION
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.registerAppearanceTheme = function(vThemeClass)
+{
+ this._appearanceThemes[vThemeClass.classname] = vThemeClass;
+
+ if (vThemeClass.classname == this.getSetting("appearanceTheme")) {
+ this.setAppearanceTheme(vThemeClass.getInstance());
+ }
+}
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifyAppearanceTheme = function(propValue, propOldValue, propData)
+{
+ var vComp = qx.core.Init.getInstance().getComponent();
+
+ if (vComp && vComp.isUiReady()) {
+ qx.ui.core.ClientDocument.getInstance()._recursiveAppearanceThemeUpdate(propValue, propOldValue);
+ }
+
+ return true;
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ // Themes
+ this._appearanceThemes = null;
+
+ return qx.manager.object.ObjectManager.prototype.dispose.call(this);
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ColorManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ColorManager.js
new file mode 100644
index 0000000000..6eb4038bd8
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ColorManager.js
@@ -0,0 +1,227 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_core)
+#optional(qx.ui.form.Button)
+
+************************************************************************ */
+
+qx.OO.defineClass("qx.manager.object.ColorManager", qx.manager.object.ObjectManager,
+function()
+{
+ qx.manager.object.ObjectManager.call(this);
+
+ // Themes
+ this._colorThemes = {};
+
+ // Contains the qx.renderer.color.ColorObjects which
+ // represent a themed color.
+ this._dependentObjects = {};
+});
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFAULT SETTINGS
+---------------------------------------------------------------------------
+*/
+
+qx.Settings.setDefault("colorTheme", "qx.theme.color.WindowsRoyale");
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.OO.addProperty({ name : "colorTheme", type : "object", allowNull : false, instance : "qx.renderer.theme.ColorTheme" });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ REGISTRATION
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.registerColorTheme = function(vThemeClass)
+{
+ this._colorThemes[vThemeClass.classname] = vThemeClass;
+
+ if (vThemeClass.classname == this.getSetting("colorTheme")) {
+ this.setColorTheme(vThemeClass.getInstance());
+ }
+}
+
+qx.Proto.setColorThemeById = function(vId) {
+ this.setColorTheme(this._colorThemes[vId].getInstance());
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PUBLIC METHODS FOR qx.renderer.color.ColorOBJECTS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.add = function(oObject)
+{
+ var vValue = oObject.getValue();
+
+ this._objects[vValue] = oObject;
+
+ if (oObject.isThemedColor()) {
+ this._dependentObjects[vValue] = oObject;
+ }
+}
+
+qx.Proto.remove = function(oObject)
+{
+ var vValue = oObject.getValue();
+
+ delete this._objects[vValue];
+ delete this._dependentObjects[vValue];
+}
+
+qx.Proto.has = function(vValue) {
+ return this._objects[vValue] != null;
+}
+
+qx.Proto.get = function(vValue) {
+ return this._objects[vValue];
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifyColorTheme = function(propValue, propOldValue, propData)
+{
+ propValue.compile();
+
+ for (var i in this._dependentObjects) {
+ this._dependentObjects[i]._updateTheme(propValue);
+ }
+
+ return true;
+}
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ UTILITY
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.createThemeList = function(vParent, xCor, yCor)
+{
+ var vButton;
+ var vThemes = this._colorThemes;
+ var vIcon = "icon/16/colors.png";
+ var vPrefix = "Color Theme: ";
+ var vEvent = "execute";
+
+ for (var vId in vThemes)
+ {
+ var vObj = vThemes[vId].getInstance();
+ var vButton = new qx.ui.form.Button(vPrefix + vObj.getTitle(), vIcon);
+
+ vButton.setLocation(xCor, yCor);
+ vButton.addEventListener(vEvent, new Function("qx.manager.object.ColorManager.getInstance().setColorThemeById('" + vId + "')"));
+
+ vParent.add(vButton);
+
+ yCor += 30;
+ }
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ // Themes
+ this._colorThemes = null;
+
+ // Cleanup dependent objects
+ for (var i in this._dependentObjects) {
+ delete this._dependentObjects[i];
+ }
+
+ delete this._dependentObjects;
+
+ return qx.manager.object.ObjectManager.prototype.dispose.call(this);
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/IframeManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/IframeManager.js
new file mode 100644
index 0000000000..79695169b2
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/IframeManager.js
@@ -0,0 +1,75 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Til Schneider (til132)
+
+************************************************************************ */
+
+/**
+ * This singleton manages multiple instances of qx.ui.embed.Iframe.
+ * <p>
+ * The problem: When dragging over an iframe then all mouse events will be
+ * passed to the document of the iframe, not the main document.
+ * <p>
+ * The solution: In order to be able to track mouse events over iframes, this
+ * manager will block all iframes during a drag with a glasspane.
+ */
+qx.OO.defineClass("qx.manager.object.IframeManager", qx.manager.object.ObjectManager,
+function(){
+ qx.manager.object.ObjectManager.call(this);
+});
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ METHODS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.handleMouseDown = function(evt) {
+ var iframeMap = this.getAll();
+
+ for (var key in iframeMap) {
+ var iframe = iframeMap[key];
+ iframe.block();
+ }
+}
+
+qx.Proto.handleMouseUp = function(evt) {
+ var iframeMap = this.getAll();
+
+ for (var key in iframeMap) {
+ var iframe = iframeMap[key];
+ iframe.release();
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImageManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImageManager.js
new file mode 100644
index 0000000000..f1fbfe6fb9
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImageManager.js
@@ -0,0 +1,305 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_core)
+#optional(qx.ui.form.Button)
+
+************************************************************************ */
+
+/*!
+ This singleton manage the global image path (prefix) and allowes themed icons.
+*/
+qx.OO.defineClass("qx.manager.object.ImageManager", qx.manager.object.ObjectManager,
+function()
+{
+ qx.manager.object.ObjectManager.call(this);
+
+ // Themes
+ this._iconThemes = {};
+ this._widgetThemes = {};
+
+ // Contains known image sources (all of them, if loaded or not)
+ // The value is a number which represents the number of image
+ // instances which use this source
+ this._sources = {};
+
+ // Change event connection to AliasManager
+ qx.manager.object.AliasManager.getInstance().addEventListener("change", this._onaliaschange, this);
+});
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFAULT SETTINGS
+---------------------------------------------------------------------------
+*/
+
+qx.Settings.setDefault("iconTheme", "qx.theme.icon.CrystalSvg");
+qx.Settings.setDefault("widgetTheme", "qx.theme.widget.Windows");
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.OO.addProperty({ name : "iconTheme", type : "object", instance : "qx.renderer.theme.IconTheme" });
+qx.OO.addProperty({ name : "widgetTheme", type : "object", instance : "qx.renderer.theme.WidgetTheme" });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ REGISTRATION
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.registerIconTheme = function(vThemeClass)
+{
+ this._iconThemes[vThemeClass.classname] = vThemeClass;
+
+ if (vThemeClass.classname == this.getSetting("iconTheme")) {
+ this.setIconTheme(vThemeClass.getInstance());
+ }
+}
+
+qx.Proto.registerWidgetTheme = function(vThemeClass)
+{
+ this._widgetThemes[vThemeClass.classname] = vThemeClass;
+
+ if (vThemeClass.classname == this.getSetting("widgetTheme")) {
+ this.setWidgetTheme(vThemeClass.getInstance());
+ }
+}
+
+qx.Proto.setIconThemeById = function(vId) {
+ this.setIconTheme(this._iconThemes[vId].getInstance());
+}
+
+qx.Proto.setWidgetThemeById = function(vId) {
+ this.setWidgetTheme(this._widgetThemes[vId].getInstance());
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ EVENTS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._onaliaschange = function() {
+ this._updateImages();
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIERS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifyIconTheme = function(propValue, propOldValue, propData)
+{
+ propValue ? qx.manager.object.AliasManager.getInstance().add("icon", propValue.getSetting("imageUri")) : qx.manager.object.AliasManager.getInstance().remove("icon");
+ return true;
+}
+
+qx.Proto._modifyWidgetTheme = function(propValue, propOldValue, propData)
+{
+ propValue ? qx.manager.object.AliasManager.getInstance().add("widget", propValue.getSetting("imageUri")) : qx.manager.object.AliasManager.getInstance().remove("widget");
+ return true;
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PRELOAD API
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getPreloadImageList = function()
+{
+ var vPreload = {};
+
+ for (var vSource in this._sources)
+ {
+ if (this._sources[vSource]) {
+ vPreload[vSource] = true;
+ }
+ }
+
+ return vPreload;
+}
+
+qx.Proto.getPostPreloadImageList = function()
+{
+ var vPreload = {};
+
+ for (var vSource in this._sources)
+ {
+ if (!this._sources[vSource]) {
+ vPreload[vSource] = true;
+ }
+ }
+
+ return vPreload;
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ INTERNAL HELPER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._updateImages = function()
+{
+ var vAll = this.getAll();
+ var vPreMgr = qx.manager.object.ImagePreloaderManager.getInstance();
+ var vAliasMgr = qx.manager.object.AliasManager.getInstance();
+ var vObject;
+
+ // Recreate preloader of affected images
+ for (var vHashCode in vAll)
+ {
+ vObject = vAll[vHashCode];
+ vObject.setPreloader(vPreMgr.create(vAliasMgr.resolvePath(vObject.getSource(), true)));
+ }
+
+ return true;
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ UTILITY
+---------------------------------------------------------------------------
+*/
+
+// TODO: rename to createIconThemeList
+qx.Proto.createThemeList = function(vParent, xCor, yCor)
+{
+ var vButton;
+ var vThemes = this._iconThemes;
+ var vIcon = "icon/16/icons.png";
+ var vPrefix = "Icon Theme: ";
+ var vEvent = "execute";
+
+ for (var vId in vThemes)
+ {
+ var vObj = vThemes[vId].getInstance();
+ var vButton = new qx.ui.form.Button(vPrefix + vObj.getTitle(), vIcon);
+
+ vButton.setLocation(xCor, yCor);
+ vButton.addEventListener(vEvent, new Function("qx.manager.object.ImageManager.getInstance().setIconThemeById('" + vId + "')"));
+
+ vParent.add(vButton);
+
+ yCor += 30;
+ }
+}
+
+qx.Proto.preload = function(vPath) {
+ qx.manager.object.ImagePreloaderManager.getInstance().create(qx.manager.object.AliasManager.getInstance().resolvePath(vPath));
+}
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ // Change event connection to AliasManager
+ qx.manager.object.AliasManager.getInstance().removeEventListener("change", this._onaliaschange, this);
+
+ // Delete counter field
+ this._sources = null;
+
+ // Themes
+ this._iconThemes = null;
+ this._widgetThemes = null;
+
+ return qx.manager.object.ObjectManager.prototype.dispose.call(this);
+}
+
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImagePreloaderManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImagePreloaderManager.js
new file mode 100644
index 0000000000..8c0d68eb6b
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ImagePreloaderManager.js
@@ -0,0 +1,82 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_core)
+
+************************************************************************ */
+
+/*!
+ This singleton manage all qx.io.image.Preloader instances.
+*/
+qx.OO.defineClass("qx.manager.object.ImagePreloaderManager", qx.manager.object.ObjectManager,
+function() {
+ qx.manager.object.ObjectManager.call(this);
+});
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ METHODS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.add = function(vObject) {
+ this._objects[vObject.getUri()] = vObject;
+}
+
+qx.Proto.remove = function(vObject) {
+ delete this._objects[vObject.getUri()];
+}
+
+qx.Proto.has = function(vSource) {
+ return this._objects[vSource] != null;
+}
+
+qx.Proto.get = function(vSource) {
+ return this._objects[vSource];
+}
+
+qx.Proto.create = function(vSource)
+{
+ if (this._objects[vSource]) {
+ return this._objects[vSource];
+ }
+
+ return new qx.io.image.Preloader(vSource);
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/MenuManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/MenuManager.js
new file mode 100644
index 0000000000..b7914b4bcf
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/MenuManager.js
@@ -0,0 +1,92 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_menu)
+
+************************************************************************ */
+
+/*!
+ This singleton manages multiple instances of qx.ui.menu.Menu and their state.
+*/
+qx.OO.defineClass("qx.manager.object.MenuManager", qx.manager.object.ObjectManager,
+function(){
+ qx.manager.object.ObjectManager.call(this);
+});
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ METHODS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.update = function(vTarget, vEventName)
+{
+ var vMenu, vHashCode;
+ var vAll = this.getAll();
+
+ for (vHashCode in vAll)
+ {
+ vMenu = vAll[vHashCode];
+
+ if(!vMenu.getAutoHide()) {
+ continue;
+ }
+
+ if (vTarget && vTarget.getMenu && vTarget.getMenu()) {
+ continue;
+ }
+
+ // Hide on global events (mouseup, window focus, window blur, ...)
+ if (!vTarget)
+ {
+ vMenu.hide();
+ continue;
+ }
+
+ // Hide only if the target is not a button inside this
+ // or any sub menu and is not the opener
+ if (vMenu.getOpener() !== vTarget && ((vTarget && !vMenu.isSubButton(vTarget)) || vEventName !== "mousedown"))
+ {
+ vMenu.hide();
+ continue;
+ }
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ObjectManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ObjectManager.js
new file mode 100644
index 0000000000..c1160ab64b
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ObjectManager.js
@@ -0,0 +1,117 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+
+************************************************************************ */
+
+/*!
+ This class allows basic managment of assigned objects.
+*/
+qx.OO.defineClass("qx.manager.object.ObjectManager", qx.core.Target,
+function()
+{
+ qx.core.Target.call(this);
+
+ this._objects = {};
+});
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ USER API
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.add = function(vObject)
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ this._objects[vObject.toHashCode()] = vObject;
+ return true;
+}
+
+qx.Proto.remove = function(vObject)
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ delete this._objects[vObject.toHashCode()];
+ return true;
+}
+
+qx.Proto.has = function(vObject) {
+ return this._objects[vObject.toHashCode()] != null;
+}
+
+qx.Proto.get = function(vObject) {
+ return this._objects[vObject.toHashCode()];
+}
+
+qx.Proto.getAll = function() {
+ return this._objects;
+}
+
+qx.Proto.enableAll = function()
+{
+ for (var vHashCode in this._objects) {
+ this._objects[vHashCode].setEnabled(true);
+ };
+};
+
+qx.Proto.disableAll = function()
+{
+ for (var vHashCode in this._objects) {
+ this._objects[vHashCode].setEnabled(false);
+ };
+};
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if(this.getDisposed()) {
+ return;
+ }
+
+ if (this._objects)
+ {
+ for (var i in this._objects) {
+ delete this._objects[i];
+ }
+
+ delete this._objects;
+ }
+
+ return qx.core.Target.prototype.dispose.call(this);
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/PopupManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/PopupManager.js
new file mode 100644
index 0000000000..218c988c83
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/PopupManager.js
@@ -0,0 +1,77 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_popup)
+
+************************************************************************ */
+
+/*!
+ This singleton is used to manager multiple instances of popups and their state.
+*/
+qx.OO.defineClass("qx.manager.object.PopupManager", qx.manager.object.ObjectManager,
+function() {
+ qx.manager.object.ObjectManager.call(this);
+});
+
+
+
+/*
+---------------------------------------------------------------------------
+ METHODS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.update = function(vTarget)
+{
+ // be sure that target is correctly set (needed for contains() later)
+ if (!(vTarget instanceof qx.ui.core.Widget)) {
+ vTarget = null;
+ }
+
+ var vPopup, vHashCode;
+ var vAll = this.getAll();
+
+ for (vHashCode in vAll)
+ {
+ vPopup = vAll[vHashCode];
+
+ if(!vPopup.getAutoHide() || vTarget == vPopup || vPopup.contains(vTarget)) {
+ continue;
+ }
+
+ vPopup.hide();
+ }
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ToolTipManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ToolTipManager.js
new file mode 100644
index 0000000000..f29be08eda
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/ToolTipManager.js
@@ -0,0 +1,191 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_popup)
+
+************************************************************************ */
+
+/*!
+ This manages ToolTip instances
+*/
+qx.OO.defineClass("qx.manager.object.ToolTipManager", qx.manager.object.ObjectManager,
+function() {
+ qx.manager.object.ObjectManager.call(this);
+});
+
+qx.OO.addProperty({ name : "currentToolTip", type : "object", instance : "qx.ui.popup.ToolTip" });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifyCurrentToolTip = function(propValue, propOldValue, propData)
+{
+ // Return if the new tooltip is a child of the old one
+ if(propOldValue && propOldValue.contains(propValue)) {
+ return;
+ }
+
+ // If old tooltip existing, hide it and clear widget binding
+ if(propOldValue)
+ {
+ propOldValue.hide();
+
+ propOldValue._stopShowTimer();
+ propOldValue._stopHideTimer();
+ }
+
+ // If new tooltip is not null, set it up and start the timer
+ if(propValue) {
+ propValue._startShowTimer();
+ }
+
+ return true;
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ EVENT INTERFACE: MOUSE
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.handleMouseOver = function(e)
+{
+ var vTarget = e.getTarget();
+ var vToolTip;
+
+ // Allows us to use DOM Nodes as tooltip target :)
+ if (!(vTarget instanceof qx.ui.core.Widget) && vTarget.nodeType == 1) {
+ vTarget = qx.event.handler.EventHandler.getTargetObject(vTarget);
+ }
+
+ //Search first parent which has a tooltip
+ while(vTarget != null && !(vToolTip = vTarget.getToolTip())) {
+ vTarget = vTarget.getParent();
+ }
+
+ // Bind tooltip to widget
+ if (vToolTip != null) {
+ vToolTip.setBoundToWidget(vTarget);
+ }
+
+ // Set Property
+ this.setCurrentToolTip(vToolTip);
+}
+
+qx.Proto.handleMouseOut = function(e)
+{
+ var vTarget = e.getTarget();
+ var vRelatedTarget = e.getRelatedTarget();
+
+ var vToolTip = this.getCurrentToolTip();
+
+ // If there was a tooltip and
+ // - the destination target is the current tooltip
+ // or
+ // - the current tooltip contains the destination target
+ if(vToolTip && (vRelatedTarget == vToolTip || vToolTip.contains(vRelatedTarget))) {
+ return;
+ }
+
+ // If the destination target exists and the target contains it
+ if(vRelatedTarget && vTarget && vTarget.contains(vRelatedTarget)) {
+ return;
+ }
+
+ // If there was a tooltip and there is no new one
+ if(vToolTip && !vRelatedTarget) {
+ this.setCurrentToolTip(null);
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ EVENT INTERFACE: FOCUS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.handleFocus = function(e)
+{
+ var vTarget = e.getTarget();
+ var vToolTip = vTarget.getToolTip();
+
+ // Only set new tooltip if focus widget
+ // has one
+ if(vToolTip != null)
+ {
+ // Bind tooltip to widget
+ vToolTip.setBoundToWidget(vTarget);
+
+ // Set Property
+ this.setCurrentToolTip(vToolTip);
+ }
+}
+
+qx.Proto.handleBlur = function(e)
+{
+ var vTarget = e.getTarget();
+
+ if(!vTarget) {
+ return;
+ }
+
+ var vToolTip = this.getCurrentToolTip();
+
+ // Only set to null if blured widget is the
+ // one which has created the current tooltip
+ if(vToolTip && vToolTip == vTarget.getToolTip()) {
+ this.setCurrentToolTip(null);
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DEFER SINGLETON INSTANCE
+---------------------------------------------------------------------------
+*/
+
+/**
+ * Singleton Instance Getter
+ */
+qx.Class.getInstance = qx.util.Return.returnInstance;
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/WindowManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/WindowManager.js
new file mode 100644
index 0000000000..96e13acd4d
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/object/WindowManager.js
@@ -0,0 +1,158 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_window)
+
+************************************************************************ */
+
+/*!
+ This singleton manages qx.ui.window.Windows
+*/
+qx.OO.defineClass("qx.manager.object.WindowManager", qx.manager.object.ObjectManager,
+function() {
+ qx.manager.object.ObjectManager.call(this);
+});
+
+qx.OO.addProperty({ name : "activeWindow", type : "object" });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifyActiveWindow = function(propValue, propOldValue, propData)
+{
+ qx.manager.object.PopupManager.getInstance().update();
+
+ if (propOldValue) {
+ propOldValue.setActive(false);
+ }
+
+ if (propValue) {
+ propValue.setActive(true);
+ }
+
+ if (propOldValue && propOldValue.getModal()) {
+ propOldValue.getTopLevelWidget().release(propOldValue);
+ }
+
+ if (propValue && propValue.getModal()) {
+ propValue.getTopLevelWidget().block(propValue);
+ }
+
+ return true;
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ UTILITIES
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.update = function(oTarget)
+{
+ var vWindow, vHashCode;
+ var vAll = this.getAll();
+
+ for (var vHashCode in vAll)
+ {
+ vWindow = vAll[vHashCode];
+
+ if(!vWindow.getAutoHide()) {
+ continue;
+ }
+
+ vWindow.hide();
+ }
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MANAGER INTERFACE
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.compareWindows = function(w1, w2)
+{
+ switch(w1.getWindowManager().getActiveWindow())
+ {
+ case w1:
+ return 1;
+
+ case w2:
+ return -1;
+ }
+
+ return w1.getZIndex() - w2.getZIndex();
+}
+
+qx.Proto.add = function(vWindow)
+{
+ qx.manager.object.ObjectManager.prototype.add.call(this, vWindow);
+
+ // this.debug("Add: " + vWindow);
+ this.setActiveWindow(vWindow);
+}
+
+qx.Proto.remove = function(vWindow)
+{
+ qx.manager.object.ObjectManager.prototype.remove.call(this, vWindow);
+
+ // this.debug("Remove: " + vWindow);
+
+ if (this.getActiveWindow() == vWindow)
+ {
+ var a = [];
+ for (var i in this._objects) {
+ a.push(this._objects[i]);
+ }
+
+ var l = a.length;
+
+ if (l==0)
+ {
+ this.setActiveWindow(null);
+ }
+ else if (l==1)
+ {
+ this.setActiveWindow(a[0]);
+ }
+ else if (l>1)
+ {
+ a.sort(this.compareWindows);
+ this.setActiveWindow(a[l-1]);
+ }
+ }
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/DomSelectionManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/DomSelectionManager.js
new file mode 100644
index 0000000000..3205dc40ea
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/DomSelectionManager.js
@@ -0,0 +1,242 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+
+************************************************************************ */
+
+qx.OO.defineClass("qx.manager.selection.DomSelectionManager", qx.manager.selection.SelectionManager,
+function(vBoundedWidget)
+{
+ qx.manager.selection.SelectionManager.call(this, vBoundedWidget);
+
+ // the children does not fire onmouseover events so we could
+ // not enable this and make it functional
+ this.setDragSelection(false);
+
+ this._selectedItems.getItemHashCode = this.getItemHashCode;
+});
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO BOUNDED WIDGET (DOM NODES)
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemEnabled = function(oItem) {
+ return true;
+}
+
+qx.Proto.getItemClassName = function(vItem) {
+ return vItem.className || "";
+}
+
+qx.Proto.setItemClassName = function(vItem, vClassName) {
+ return vItem.className = vClassName;
+}
+
+qx.Proto.getItemBaseClassName = function(vItem)
+{
+ var p = vItem.className.split(" ")[0];
+ return p ? p : "Status";
+}
+
+qx.Proto.getNextSibling = function(vItem) {
+ return vItem.nextSibling;
+}
+
+qx.Proto.getPreviousSibling = function(vItem) {
+ return vItem.previousSibling;
+}
+
+qx.Proto.getFirst = function() {
+ return this.getItems()[0];
+}
+
+qx.Proto.getLast = function()
+{
+ var vItems = this.getItems();
+ return vItems[vItems.length-1];
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM DIMENSIONS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemLeft = function(vItem) {
+ return vItem.offsetLeft;
+}
+
+qx.Proto.getItemTop = function(vItem) {
+ return vItem.offsetTop;
+}
+
+qx.Proto.getItemWidth = function(vItem) {
+ return vItem.offsetWidth;
+}
+
+qx.Proto.getItemHeight = function(vItem) {
+ return vItem.offsetHeight;
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemHashCode = function(oItem)
+{
+ if (oItem._hash) {
+ return oItem._hash;
+ }
+
+ return oItem._hash = qx.core.Object.toHashCode(oItem);
+}
+
+qx.Proto.isBefore = function(vItem1, vItem2)
+{
+ var pa = vItem1.parentNode;
+
+ for (var i=0, l=pa.childNodes.length; i<l; i++)
+ {
+ switch(pa.childNodes[i])
+ {
+ case vItem2:
+ return false;
+
+ case vItem1:
+ return true;
+ }
+ }
+}
+
+qx.Proto.scrollItemIntoView = function(vItem) {
+ this.getBoundedWidget().scrollItemIntoView(vItem);
+}
+
+qx.Proto.getItems = function() {
+ return this.getBoundedWidget().getItems();
+}
+
+qx.Proto.getAbove = function(vItem)
+{
+ var vParent = vItem.parentNode;
+ var vFound = false;
+ var vLeft = vItem.offsetLeft;
+ var vChild;
+
+ for (var i=vParent.childNodes.length-1; i>0; i--)
+ {
+ vChild = vParent.childNodes[i];
+
+ if (vFound == false)
+ {
+ if (vChild == vItem) {
+ vFound = true;
+ }
+ }
+ else
+ {
+ if (vChild.offsetLeft == vLeft)
+ {
+ return vChild;
+ }
+ }
+ }
+}
+
+qx.Proto.getUnder = function(vItem)
+{
+ var vParent = vItem.parentNode;
+ var vFound = false;
+ var vLeft = vItem.offsetLeft;
+ var vChild;
+
+ for (var i=0, l=vParent.childNodes.length; i<l; i++)
+ {
+ vChild = vParent.childNodes[i];
+
+ if (vFound == false)
+ {
+ if (vChild == vItem) {
+ vFound = true;
+ }
+ }
+ else
+ {
+ if (vChild.offsetLeft == vLeft)
+ {
+ return vChild;
+ }
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ ITEM CSS STATE MANAGMENT
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._updateState = function(vItem, vState, vIsState)
+{
+ var c = this.getItemClassName(vItem);
+ var n = this.getItemBaseClassName(vItem) + "-" + vState;
+
+ this.setItemClassName(vItem, vIsState ? qx.lang.String.add(c, n, " ") : qx.lang.String.remove(c, n, " "));
+}
+
+qx.Proto.renderItemSelectionState = function(vItem, vIsSelected) {
+ this._updateState(vItem, "Selected", vIsSelected);
+}
+
+qx.Proto.renderItemAnchorState = function(vItem, vIsAnchor) {
+ this._updateState(vItem, "Anchor", vIsAnchor);
+}
+
+qx.Proto.renderItemLeadState = function(vItem, vIsLead) {
+ this._updateState(vItem, "Lead", vIsLead);
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/RadioManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/RadioManager.js
new file mode 100644
index 0000000000..bac72a4144
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/RadioManager.js
@@ -0,0 +1,292 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_form)
+
+************************************************************************ */
+
+/*!
+ Each instance manage vItems set of radio options: qx.ui.form.RadioButton, qx.ui.toolbar.RadioButton, ...
+*/
+qx.OO.defineClass("qx.manager.selection.RadioManager", qx.core.Target,
+function(vName, vMembers)
+{
+ // we don't need the manager data structures
+ qx.core.Target.call(this);
+
+ // create item array
+ this._items = [];
+
+ // apply name property
+ this.setName(qx.util.Validation.isValidString(vName) ? vName : qx.manager.selection.RadioManager.AUTO_NAME_PREFIX + this._hashCode);
+
+ if (qx.util.Validation.isValidArray(vMembers)) {
+ // add() iterates over arguments, but vMembers is an array
+ this.add.apply(this, vMembers);
+ }
+});
+
+qx.manager.selection.RadioManager.AUTO_NAME_PREFIX = "qx-radio-";
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.OO.addProperty({ name : "selected" });
+qx.OO.addProperty({ name : "name", type : "string" });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ UTILITIES
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItems = function() {
+ return this._items;
+}
+
+qx.Proto.handleItemChecked = function(vItem, vChecked)
+{
+ if (vChecked)
+ {
+ this.setSelected(vItem);
+ }
+ else if (this.getSelected() == vItem)
+ {
+ this.setSelected(null);
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ REGISTRY
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.add = function(varargs)
+{
+ var vItems = arguments;
+ var vLength = vItems.length;
+
+ var vLast = vItems[vLength-1];
+
+ if (!(vLast instanceof qx.ui.core.Parent) && !(vLast instanceof qx.ui.basic.Terminator)) {
+ vLength--;
+ }
+
+ var vItem;
+ for (var i=0; i<vLength; i++)
+ {
+ vItem = vItems[i];
+
+ if(qx.lang.Array.contains(this._items, vItem)) {
+ return;
+ }
+
+ // Push RadioButton to array
+ this._items.push(vItem);
+
+ // Inform radio button about new manager
+ vItem.setManager(this);
+
+ // Need to update internal value?
+ if(vItem.getChecked()) {
+ this.setSelected(vItem);
+ }
+
+ // Make enabled the same status as the the manager has
+ vItem.setEnabled(this.getEnabled());
+
+ // Apply Make name the same
+ vItem.setName(this.getName());
+ }
+}
+
+qx.Proto.remove = function(vItem)
+{
+ // Remove RadioButton from array
+ qx.lang.Array.remove(this._items, vItem);
+
+ // Inform radio button about new manager
+ vItem.setManager(null);
+
+ // if the radio was checked, set internal selection to null
+ if(vItem.getChecked()) {
+ this.setSelected(null);
+ }
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifySelected = function(propValue, propOldValue, propData)
+{
+ if (propOldValue && propOldValue.getChecked()) {
+ propOldValue.setChecked(false);
+ }
+
+ if (propValue && !propValue.getChecked()) {
+ propValue.setChecked(true);
+ }
+
+ return true;
+}
+
+qx.Proto._modifyEnabled = function(propValue, propOldValue, propData)
+{
+ for (var i=0, vItems=this._items, vLength=vItems.length; i<vLength; i++) {
+ vItems[i].setEnabled(propValue);
+ }
+
+ return true;
+}
+
+qx.Proto._modifyName = function(propValue, propOldValue, propData)
+{
+ for (var i=0, vItems=this._items, vLength=vItems.length; i<vLength; i++) {
+ vItems[i].setName(propValue);
+ }
+
+ return true;
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ SELECTION
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.selectNext = function(vItem)
+{
+ var vIndex = this._items.indexOf(vItem);
+
+ if(vIndex == -1) {
+ return;
+ }
+
+ var i = 0;
+ var vLength = this._items.length;
+
+ // Find next enabled item
+ vIndex = (vIndex + 1) % vLength;
+ while(i < vLength && !this._items[vIndex].getEnabled())
+ {
+ vIndex = (vIndex + 1) % vLength;
+ i++;
+ }
+
+ this._selectByIndex(vIndex);
+}
+
+qx.Proto.selectPrevious = function(vItem)
+{
+ var vIndex = this._items.indexOf(vItem);
+
+ if(vIndex == -1) {
+ return;
+ }
+
+ var i = 0;
+ var vLength = this._items.length;
+
+ // Find previous enabled item
+ vIndex = (vIndex - 1 + vLength) % vLength;
+ while(i < vLength && !this._items[vIndex].getEnabled())
+ {
+ vIndex = (vIndex - 1 + vLength) % vLength;
+ i++;
+ }
+
+ this._selectByIndex(vIndex);
+}
+
+qx.Proto._selectByIndex = function(vIndex)
+{
+ if(this._items[vIndex].getEnabled())
+ {
+ this.setSelected(this._items[vIndex]);
+ this._items[vIndex].setFocused(true);
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ this.forceSelected(null);
+
+ if (this._items)
+ {
+ for (var i, vItems=this._items, vLength=vItems.length; i<vLength; i++)
+ {
+ vItems[i].dispose();
+ delete vItems[i];
+ }
+
+ vItems=null;
+ delete this._items;
+ }
+
+ return qx.core.Target.prototype.dispose.call(this);
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/SelectionManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/SelectionManager.js
new file mode 100644
index 0000000000..a37c2459b1
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/SelectionManager.js
@@ -0,0 +1,1433 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_form)
+
+************************************************************************ */
+
+/**
+ * This class represents a selection and manage incoming events for widgets
+ * which need selection support.
+ *
+ * @event changeSelection {qx.event.type.DataEvent} sets the data property of the event object to an arryas of selected items.
+ */
+qx.OO.defineClass("qx.manager.selection.SelectionManager", qx.core.Target,
+function(vBoundedWidget)
+{
+ qx.core.Target.call(this);
+
+ this._selectedItems = new qx.type.Selection(this);
+
+ if (qx.util.Validation.isValid(vBoundedWidget)) {
+ this.setBoundedWidget(vBoundedWidget);
+ }
+});
+
+
+
+/*
+---------------------------------------------------------------------------
+ PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+/*!
+This contains the currently assigned widget (qx.ui.form.List, ...)
+*/
+qx.OO.addProperty({ name : "boundedWidget", type : "object" });
+
+/*!
+Should multiple selection be allowed?
+*/
+qx.OO.addProperty({ name : "multiSelection", type : "boolean", defaultValue : true });
+
+/*!
+Enable drag selection?
+*/
+qx.OO.addProperty({ name : "dragSelection", type : "boolean", defaultValue : true });
+
+/*!
+Should the user be able to select
+*/
+qx.OO.addProperty({ name : "canDeselect", type : "boolean", defaultValue : true });
+
+/*!
+Should a change event be fired?
+*/
+qx.OO.addProperty({ name : "fireChange", type : "boolean", defaultValue : true });
+
+/*!
+The current anchor in range selections.
+*/
+qx.OO.addProperty({ name : "anchorItem", type : "object" });
+
+/*!
+The last selected item
+*/
+qx.OO.addProperty({ name : "leadItem", type : "object" });
+
+/*!
+Grid selection
+*/
+qx.OO.addProperty({ name : "multiColumnSupport", type : "boolean", defaultValue : false });
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MODIFIER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._modifyAnchorItem = function(propValue, propOldValue, propData)
+{
+ if (propOldValue) {
+ this.renderItemAnchorState(propOldValue, false);
+ }
+
+ if (propValue) {
+ this.renderItemAnchorState(propValue, true);
+ }
+
+ return true;
+}
+
+qx.Proto._modifyLeadItem = function(propValue, propOldValue, propData)
+{
+ if (propOldValue) {
+ this.renderItemLeadState(propOldValue, false);
+ }
+
+ if (propValue) {
+ this.renderItemLeadState(propValue, true);
+ }
+
+ return true;
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO BOUNDED WIDGET
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._getFirst = function() {
+ return this.getBoundedWidget().getFirstVisibleChild();
+}
+
+qx.Proto._getLast = function() {
+ return this.getBoundedWidget().getLastVisibleChild();
+}
+
+qx.Proto.getFirst = function()
+{
+ var vItem = this._getFirst();
+ if (vItem) {
+ return vItem.isEnabled() ? vItem : this.getNext(vItem);
+ }
+}
+
+qx.Proto.getLast = function()
+{
+ var vItem = this._getLast();
+ if (vItem) {
+ return vItem.isEnabled() ? vItem : this.getPrevious(vItem);
+ }
+}
+
+qx.Proto.getItems = function() {
+ return this.getBoundedWidget().getChildren();
+}
+
+qx.Proto.getNextSibling = function(vItem) {
+ return vItem.getNextSibling();
+}
+
+qx.Proto.getPreviousSibling = function(vItem) {
+ return vItem.getPreviousSibling();
+}
+
+qx.Proto.getNext = function(vItem)
+{
+ while(vItem)
+ {
+ vItem = this.getNextSibling(vItem);
+
+ if (!vItem) {
+ break;
+ }
+
+ if (this.getItemEnabled(vItem)) {
+ return vItem;
+ }
+ }
+
+ return null;
+}
+
+qx.Proto.getPrevious = function(vItem)
+{
+ while(vItem)
+ {
+ vItem = this.getPreviousSibling(vItem);
+
+ if (!vItem) {
+ break;
+ }
+
+ if (this.getItemEnabled(vItem)) {
+ return vItem;
+ }
+ }
+
+ return null;
+}
+
+qx.Proto.isBefore = function(vItem1, vItem2)
+{
+ var cs = this.getItems();
+ return cs.indexOf(vItem1) < cs.indexOf(vItem2);
+}
+
+qx.Proto.isEqual = function(vItem1, vItem2) {
+ return vItem1 == vItem2;
+}
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemHashCode = function(vItem) {
+ return vItem.toHashCode();
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM DIMENSIONS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.scrollItemIntoView = function(vItem, vTopLeft) {
+ vItem.scrollIntoView(vTopLeft);
+}
+
+qx.Proto.getItemLeft = function(vItem) {
+ return vItem.getOffsetLeft();
+}
+
+qx.Proto.getItemTop = function(vItem) {
+ return vItem.getOffsetTop();
+}
+
+qx.Proto.getItemWidth = function(vItem) {
+ return vItem.getOffsetWidth();
+}
+
+qx.Proto.getItemHeight = function(vItem) {
+ return vItem.getOffsetHeight();
+}
+
+qx.Proto.getItemEnabled = function(vItem) {
+ return vItem.getEnabled();
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ ITEM STATE MANAGMENT
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.renderItemSelectionState = function(vItem, vIsSelected)
+{
+ vIsSelected ? vItem.addState("selected") : vItem.removeState("selected");
+
+ if (vItem.handleStateChange) {
+ vItem.handleStateChange();
+ }
+}
+
+qx.Proto.renderItemAnchorState = function(vItem, vIsAnchor)
+{
+ vIsAnchor ? vItem.addState("anchor") : vItem.removeState("anchor");
+
+ if (vItem.handleStateChange != null) {
+ vItem.handleStateChange();
+ }
+}
+
+qx.Proto.renderItemLeadState = function(vItem, vIsLead)
+{
+ vIsLead ? vItem.addState("lead") : vItem.removeState("lead");
+
+ if (vItem.handleStateChange != null) {
+ vItem.handleStateChange();
+ }
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ SELECTION HANDLING
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemSelected = function(vItem) {
+ return this._selectedItems.contains(vItem);
+}
+
+/*!
+Make a single item selected / not selected
+
+#param vItem[qx.ui.core.Widget]: Item which should be selected / not selected
+#param vSelected[Boolean]: Should this item be selected?
+*/
+qx.Proto.setItemSelected = function(vItem, vSelected)
+{
+ var hc = this.getItemHashCode(vItem);
+
+ switch(this.getMultiSelection())
+ {
+ // Multiple item selection is allowed
+ case true:
+ if (!this.getItemEnabled(vItem)) {
+ return;
+ }
+
+ // If selection state is not to be changed => return
+ if (this.getItemSelected(vItem) == vSelected) {
+ return;
+ }
+
+ // Otherwise render new state
+ this.renderItemSelectionState(vItem, vSelected);
+
+ // Add item to selection hash / delete it from there
+ vSelected ? this._selectedItems.add(vItem) : this._selectedItems.remove(vItem);
+
+ // Dispatch change Event
+ this._dispatchChange();
+
+ break;
+
+
+
+ // Multiple item selection is NOT allowed
+ case false:
+ var item0 = this.getSelectedItems()[0];
+
+
+
+ if (vSelected)
+ {
+ // Precheck for any changes
+ var old = item0;
+
+ if (this.isEqual(vItem, old)) {
+ return;
+ }
+
+ // Reset rendering of previous selected item
+ if (old != null) {
+ this.renderItemSelectionState(old, false);
+ }
+
+ // Render new item as selected
+ this.renderItemSelectionState(vItem, true);
+
+ // Reset current selection hash
+ this._selectedItems.removeAll();
+
+ // Add new one
+ this._selectedItems.add(vItem);
+
+ // Dispatch change Event
+ this._dispatchChange();
+ }
+ else
+ {
+ // Pre-check if item is currently selected
+ // Do not allow deselection in single selection mode
+ if (!this.isEqual(item0, vItem))
+ {
+ // Reset rendering as selected item
+ this.renderItemSelectionState(vItem, false);
+
+ // Reset current selection hash
+ this._selectedItems.removeAll();
+
+ // Dispatch change Event
+ this._dispatchChange();
+ }
+ }
+
+ break;
+
+ }
+}
+
+
+
+
+
+
+
+
+/*!
+ Get the selected items (objects)
+*/
+qx.Proto.getSelectedItems = function() {
+ return this._selectedItems.toArray();
+}
+
+qx.Proto.getSelectedItem = function() {
+ return this._selectedItems.getFirst();
+}
+
+/*!
+Select given items
+
+#param vItems[Array of Widgets]: Items to select
+*/
+qx.Proto.setSelectedItems = function(vItems)
+{
+ var oldVal = this._getChangeValue();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Deselect all currently selected items
+ this._deselectAll();
+
+ // Apply new selection
+ var vItem;
+ var vItemLength = vItems.length;
+
+ for (var i=0; i<vItemLength; i++)
+ {
+ vItem = vItems[i];
+
+ if (!this.getItemEnabled(vItem)) {
+ continue;
+ }
+
+ // Add item to selection
+ this._selectedItems.add(vItem);
+
+ // Render new state for item
+ this.renderItemSelectionState(vItem, true);
+ }
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if (oldFireChange && this._hasChanged(oldVal)) {
+ this._dispatchChange();
+ }
+}
+
+
+qx.Proto.setSelectedItem = function(vItem)
+{
+ if (!vItem) {
+ return;
+ }
+
+ if (!this.getItemEnabled(vItem)) {
+ return;
+ }
+
+ var oldVal = this._getChangeValue();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Deselect all currently selected items
+ this._deselectAll();
+
+ // Add item to selection
+ this._selectedItems.add(vItem);
+
+ // Render new state for item
+ this.renderItemSelectionState(vItem, true);
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if (oldFireChange && this._hasChanged(oldVal)) {
+ this._dispatchChange();
+ }
+}
+
+
+
+
+
+/*!
+ Select all items.
+*/
+qx.Proto.selectAll = function()
+{
+ var oldVal = this._getChangeValue();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Call sub method to select all items
+ this._selectAll();
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if (oldFireChange && this._hasChanged(oldVal)) {
+ this._dispatchChange();
+ }
+}
+
+/*!
+ Sub method for selectAll. Handles the real work
+ to select all items.
+*/
+qx.Proto._selectAll = function()
+{
+ if (!this.getMultiSelection()) {
+ return;
+ }
+
+ var vItem;
+ var vItems = this.getItems();
+ var vItemsLength = vItems.length;
+
+ // Reset current selection hash
+ this._selectedItems.removeAll();
+
+ for (var i=0; i<vItemsLength; i++)
+ {
+ vItem = vItems[i];
+
+ if (!this.getItemEnabled(vItem)) {
+ continue;
+ }
+
+ // Add item to selection
+ this._selectedItems.add(vItem);
+
+ // Render new state for item
+ this.renderItemSelectionState(vItem, true);
+ }
+
+ return true;
+}
+
+
+
+
+
+/*!
+ Deselect all items.
+*/
+qx.Proto.deselectAll = function()
+{
+ var oldVal = this._getChangeValue();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Call sub method to deselect all items
+ this._deselectAll();
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if (oldFireChange && this._hasChanged(oldVal))
+ this._dispatchChange();
+ }
+
+/*!
+ Sub method for deselectAll. Handles the real work
+ to deselect all items.
+*/
+qx.Proto._deselectAll = function()
+{
+ // Render new state for items
+ var items = this._selectedItems.toArray();
+ for (var i = 0; i < items.length; i++) {
+ this.renderItemSelectionState(items[i], false);
+ }
+
+ // Delete all entries in selectedItems hash
+ this._selectedItems.removeAll();
+
+ return true;
+}
+
+
+
+
+/*!
+Select a range of items.
+
+#param vItem1[qx.ui.core.Widget]: Start item
+#param vItem2[qx.ui.core.Widget]: Stop item
+*/
+qx.Proto.selectItemRange = function(vItem1, vItem2)
+{
+ var oldVal = this._getChangeValue();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Call sub method to select the range of items
+ this._selectItemRange(vItem1, vItem2, true);
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if (oldFireChange && this._hasChanged(oldVal)) {
+ this._dispatchChange();
+ }
+}
+
+
+
+
+/*!
+Sub method for selectItemRange. Handles the real work
+to select a range of items.
+
+#param vItem1[qx.ui.core.Widget]: Start item
+#param vItem2[qx.ui.core.Widget]: Stop item
+#param vDelect[Boolean]: Deselect currently selected items first?
+*/
+qx.Proto._selectItemRange = function(vItem1, vItem2, vDeselect)
+{
+ // this.debug("SELECT_RANGE: " + vItem1.toText() + "<->" + vItem2.toText());
+ // this.debug("SELECT_RANGE: " + vItem1.pos + "<->" + vItem2.pos);
+
+ // Pre-Check a revert call if vItem2 is before vItem1
+ if (this.isBefore(vItem2, vItem1)) {
+ return this._selectItemRange(vItem2, vItem1, vDeselect);
+ }
+
+ // Deselect all
+ if (vDeselect) {
+ this._deselectAll();
+ }
+
+ var vCurrentItem = vItem1;
+
+ while (vCurrentItem != null)
+ {
+ if (this.getItemEnabled(vCurrentItem))
+ {
+ // Add item to selection
+ this._selectedItems.add(vCurrentItem);
+
+ // Render new state for item
+ this.renderItemSelectionState(vCurrentItem, true);
+ }
+
+ // Stop here if we reached target item
+ if (this.isEqual(vCurrentItem, vItem2)) {
+ break;
+ }
+
+ // Get next item
+ vCurrentItem = this.getNext(vCurrentItem);
+ }
+
+ return true;
+}
+
+/*!
+Internal method for deselection of ranges.
+
+#param vItem1[qx.ui.core.Widget]: Start item
+#param vItem2[qx.ui.core.Widget]: Stop item
+*/
+qx.Proto._deselectItemRange = function(vItem1, vItem2)
+{
+ // Pre-Check a revert call if vItem2 is before vItem1
+ if (this.isBefore(vItem2, vItem1)) {
+ return this._deselectItemRange(vItem2, vItem1);
+ }
+
+ var vCurrentItem = vItem1;
+
+ while (vCurrentItem != null)
+ {
+ // Add item to selection
+ this._selectedItems.remove(vCurrentItem);
+
+ // Render new state for item
+ this.renderItemSelectionState(vCurrentItem, false);
+
+ // Stop here if we reached target item
+ if (this.isEqual(vCurrentItem, vItem2)) {
+ break;
+ }
+
+ // Get next item
+ vCurrentItem = this.getNext(vCurrentItem);
+ }
+}
+
+
+/*
+---------------------------------------------------------------------------
+ MOUSE EVENT HANDLING
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._activeDragSession = false;
+
+qx.Proto.handleMouseDown = function(vItem, e)
+{
+ // Only allow left and right button
+ if (!e.isLeftButtonPressed() && !e.isRightButtonPressed()) {
+ return;
+ }
+
+ // Keep selection on right click on already selected item
+ if (e.isRightButtonPressed() && this.getItemSelected(vItem)) {
+ return;
+ }
+
+ // Shift Key
+ // or
+ // Click on an unseleted item (without Strg)
+ if (e.getShiftKey() || this.getDragSelection() || (!this.getItemSelected(vItem) && !e.getCtrlKey()))
+ {
+ // Handle event
+ this._onmouseevent(vItem, e);
+ }
+ else
+ {
+ // Update lead item
+ this.setLeadItem(vItem);
+ }
+
+
+ // Handle dragging
+ this._activeDragSession = this.getDragSelection();
+
+ if (this._activeDragSession)
+ {
+ // Add mouseup listener and register as capture widget
+ this.getBoundedWidget().addEventListener("mouseup", this._ondragup, this);
+ this.getBoundedWidget().setCapture(true);
+ }
+}
+
+qx.Proto._ondragup = function(e)
+{
+ this.getBoundedWidget().removeEventListener("mouseup", this._ondragup, this);
+ this.getBoundedWidget().setCapture(false);
+ this._activeDragSession = false;
+}
+
+qx.Proto.handleMouseUp = function(vItem, e)
+{
+ if (!e.isLeftButtonPressed()) {
+ return;
+ }
+
+ if (e.getCtrlKey() || this.getItemSelected(vItem) && !this._activeDragSession) {
+ this._onmouseevent(vItem, e);
+ }
+
+ if (this._activeDragSession)
+ {
+ this._activeDragSession = false;
+ this.getBoundedWidget().setCapture(false);
+ }
+}
+
+qx.Proto.handleMouseOver = function(oItem, e)
+{
+ if (! this.getDragSelection() || !this._activeDragSession) {
+ return;
+ }
+
+ this._onmouseevent(oItem, e, true);
+}
+
+// currently unused placeholder
+qx.Proto.handleClick = function(vItem, e) {}
+
+// currently unused placeholder
+qx.Proto.handleDblClick = function(vItem, e) {}
+
+
+/*!
+Internal handler for all mouse events bound to this manager.
+*/
+qx.Proto._onmouseevent = function(oItem, e, bOver)
+{
+ if (!this.getItemEnabled(oItem)) {
+ return;
+ }
+
+ // ********************************************************************
+ // Init
+ // ********************************************************************
+
+ // Cache current (old) values
+ var oldVal = this._getChangeValue();
+ var oldLead = this.getLeadItem();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Cache selection and count
+ var selectedItems = this.getSelectedItems();
+ var selectedCount = selectedItems.length;
+
+ // Update lead item
+ this.setLeadItem(oItem);
+
+ // Cache current anchor item
+ var currentAnchorItem = this.getAnchorItem();
+
+ // Cache keys pressed
+ var vCtrlKey = e.getCtrlKey();
+ var vShiftKey = e.getShiftKey();
+
+
+ // ********************************************************************
+ // Do we need to update the anchor?
+ // ********************************************************************
+
+ if (!currentAnchorItem || selectedCount == 0 || (vCtrlKey && !vShiftKey && this.getMultiSelection() && !this.getDragSelection()))
+ {
+ this.setAnchorItem(oItem);
+ currentAnchorItem = oItem;
+ }
+
+
+
+ // ********************************************************************
+ // Mode #1: Replace current selection with new one
+ // ********************************************************************
+ if ((!vCtrlKey && !vShiftKey && !this._activeDragSession || !this.getMultiSelection()))
+ {
+ if (!this.getItemEnabled(oItem)) {
+ return;
+ }
+
+ // Remove current selection
+ this._deselectAll();
+
+ // Update anchor item
+ this.setAnchorItem(oItem);
+
+ if (this._activeDragSession)
+ {
+ // a little bit hacky, but seems to be a fast way to detect if we slide to top or to bottom
+ this.scrollItemIntoView((this.getBoundedWidget().getScrollTop() > (this.getItemTop(oItem)-1) ? this.getPrevious(oItem) : this.getNext(oItem)) || oItem);
+ }
+
+ if (!this.getItemSelected(oItem)) {
+ this.renderItemSelectionState(oItem, true);
+ }
+
+ // Clear up and add new one
+ //this._selectedItems.removeAll();
+ this._selectedItems.add(oItem);
+
+ this._addToCurrentSelection = true;
+ }
+
+
+ // ********************************************************************
+ // Mode #2: (De-)Select item range in mouse drag session
+ // ********************************************************************
+ else if (this._activeDragSession && bOver)
+ {
+ if (oldLead) {
+ this._deselectItemRange(currentAnchorItem, oldLead);
+ }
+
+ // Drag down
+ if (this.isBefore(currentAnchorItem, oItem))
+ {
+ if (this._addToCurrentSelection)
+ {
+ this._selectItemRange(currentAnchorItem, oItem, false);
+ }
+ else
+ {
+ this._deselectItemRange(currentAnchorItem, oItem);
+ }
+ }
+
+ // Drag up
+ else
+ {
+ if (this._addToCurrentSelection)
+ {
+ this._selectItemRange(oItem, currentAnchorItem, false);
+ }
+ else
+ {
+ this._deselectItemRange(oItem, currentAnchorItem);
+ }
+ }
+
+ // a little bit hacky, but seems to be a fast way to detect if we slide to top or to bottom
+ this.scrollItemIntoView((this.getBoundedWidget().getScrollTop() > (this.getItemTop(oItem)-1) ? this.getPrevious(oItem) : this.getNext(oItem)) || oItem);
+ }
+
+
+ // ********************************************************************
+ // Mode #3: Add new item to current selection (ctrl pressed)
+ // ********************************************************************
+ else if (this.getMultiSelection() && vCtrlKey && !vShiftKey)
+ {
+ if (!this._activeDragSession) {
+ this._addToCurrentSelection = !(this.getCanDeselect() && this.getItemSelected(oItem));
+ }
+
+ this.setItemSelected(oItem, this._addToCurrentSelection);
+ this.setAnchorItem(oItem);
+ }
+
+
+ // ********************************************************************
+ // Mode #4: Add new (or continued) range to selection
+ // ********************************************************************
+ else if (this.getMultiSelection() && vCtrlKey && vShiftKey)
+ {
+ if (!this._activeDragSession) {
+ this._addToCurrentSelection = !(this.getCanDeselect() && this.getItemSelected(oItem));
+ }
+
+ if (this._addToCurrentSelection)
+ {
+ this._selectItemRange(currentAnchorItem, oItem, false);
+ }
+ else
+ {
+ this._deselectItemRange(currentAnchorItem, oItem);
+ }
+ }
+
+ // ********************************************************************
+ // Mode #5: Replace selection with new range selection
+ // ********************************************************************
+ else if (this.getMultiSelection() && !vCtrlKey && vShiftKey)
+ {
+ if (this.getCanDeselect())
+ {
+ this._selectItemRange(currentAnchorItem, oItem, true);
+ }
+
+ else
+ {
+ if (oldLead) {
+ this._deselectItemRange(currentAnchorItem, oldLead);
+ }
+
+ this._selectItemRange(currentAnchorItem, oItem, false);
+ }
+ }
+
+
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if(oldFireChange && this._hasChanged(oldVal)) {
+ this._dispatchChange();
+ }
+}
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ KEY EVENT HANDLER
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.handleKeyDown = function(vDomEvent) {
+ this.warn(
+ "qx.manager.selection.SelectionManager.handleKeyDown is deprecated! " +
+ "Use keypress insted and bind it to the onkeypress event."
+ );
+ this.handleKeyPress(vDomEvent);
+}
+
+
+/**
+ * Handles key event to perform selection and navigation
+ *
+ * @param vDomEvent (Element) DOM event object
+ */
+qx.Proto.handleKeyPress = function(vDomEvent)
+{
+ var oldVal = this._getChangeValue();
+
+ // Temporary disabling of event fire
+ var oldFireChange = this.getFireChange();
+ this.setFireChange(false);
+
+ // Ctrl+A: Select all
+ if (vDomEvent.getKeyIdentifier() == "A" && vDomEvent.getCtrlKey())
+ {
+ if (this.getMultiSelection())
+ {
+ this._selectAll();
+
+ // Update lead item to this new last
+ // (or better here: first) selected item
+ this.setLeadItem(this.getFirst());
+ }
+ }
+
+ // Default operation
+ else
+ {
+ var aIndex = this.getAnchorItem();
+ var itemToSelect = this.getItemToSelect(vDomEvent);
+
+ // this.debug("Anchor: " + (aIndex ? aIndex.getLabel() : "null"));
+ // this.debug("ToSelect: " + (itemToSelect ? itemToSelect.getLabel() : "null"));
+
+ if (itemToSelect && this.getItemEnabled(itemToSelect))
+ {
+ // Update lead item to this new last selected item
+ this.setLeadItem(itemToSelect);
+
+ // Scroll new item into view
+ this.scrollItemIntoView(itemToSelect);
+
+ // Stop event handling
+ vDomEvent.preventDefault();
+
+ // Select a range
+ if (vDomEvent.getShiftKey() && this.getMultiSelection())
+ {
+ // Make it a little bit more failsafe:
+ // Set anchor if not given already. Allows us to select
+ // a range without any previous selection.
+ if (aIndex == null) {
+ this.setAnchorItem(itemToSelect);
+ }
+
+ // Select new range (and clear up current selection first)
+ this._selectItemRange(this.getAnchorItem(), itemToSelect, true);
+ }
+ else if (!vDomEvent.getCtrlKey())
+ {
+ // Clear current selection
+ this._deselectAll();
+
+ // Update new item to be selected
+ this.renderItemSelectionState(itemToSelect, true);
+
+ // Add item to new selection
+ this._selectedItems.add(itemToSelect);
+
+ // Update anchor to this new item
+ // (allows following shift range selection)
+ this.setAnchorItem(itemToSelect);
+ }
+ else if (vDomEvent.getKeyIdentifier() == "Space")
+ {
+ if (this._selectedItems.contains(itemToSelect))
+ {
+ // Update new item to be selected
+ this.renderItemSelectionState(itemToSelect, false);
+
+ // Add item to new selection
+ this._selectedItems.remove(itemToSelect);
+
+ // Fix anchor item
+ this.setAnchorItem(this._selectedItems.getFirst());
+ }
+ else
+ {
+ // Clear current selection
+ if (!vDomEvent.getCtrlKey() || !this.getMultiSelection()) {
+ this._deselectAll();
+ }
+
+ // Update new item to be selected
+ this.renderItemSelectionState(itemToSelect, true);
+
+ // Add item to new selection
+ this._selectedItems.add(itemToSelect);
+
+ // Update anchor to this new item
+ // (allows following shift range selection)
+ this.setAnchorItem(itemToSelect);
+ }
+ }
+ }
+ }
+
+ // Recover change event status
+ this.setFireChange(oldFireChange);
+
+ // Dispatch change Event
+ if (oldFireChange && this._hasChanged(oldVal)) {
+ this._dispatchChange();
+ }
+}
+
+qx.Proto.getItemToSelect = function(vKeyboardEvent)
+{
+ // Don't handle ALT here
+ if (vKeyboardEvent.getAltKey()) {
+ return null;
+ }
+
+ // Handle event by keycode
+ switch (vKeyboardEvent.getKeyIdentifier())
+ {
+ case "Home":
+ return this.getHome(this.getLeadItem());
+
+ case "End":
+ return this.getEnd(this.getLeadItem());
+
+
+ case "Down":
+ return this.getDown(this.getLeadItem());
+
+ case "Up":
+ return this.getUp(this.getLeadItem());
+
+
+ case "Left":
+ return this.getLeft(this.getLeadItem());
+
+ case "Right":
+ return this.getRight(this.getLeadItem());
+
+
+ case "PageUp":
+ return this.getPageUp(this.getLeadItem()) || this.getHome(this.getLeadItem());
+
+ case "PageDown":
+ return this.getPageDown(this.getLeadItem()) || this.getEnd(this.getLeadItem());
+
+
+ case "Space":
+ if (vKeyboardEvent.getCtrlKey()) {
+ return this.getLeadItem();
+ }
+ }
+
+ return null;
+}
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ CHANGE HANDLING
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._dispatchChange = function()
+{
+ if (!this.getFireChange()) {
+ return;
+ }
+
+ if (this.hasEventListeners("changeSelection")) {
+ this.dispatchEvent(new qx.event.type.DataEvent("changeSelection", this.getSelectedItems()), true);
+ }
+}
+
+qx.Proto._hasChanged = function(sOldValue) {
+ return sOldValue != this._getChangeValue();
+}
+
+qx.Proto._getChangeValue = function() {
+ return this._selectedItems.getChangeValue();
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ POSITION HANDLING
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getHome = function() {
+ return this.getFirst();
+}
+
+qx.Proto.getEnd = function() {
+ return this.getLast();
+}
+
+qx.Proto.getDown = function(vItem)
+{
+ if (!vItem) {
+ return this.getFirst();
+ }
+
+ return this.getMultiColumnSupport() ? (this.getUnder(vItem) || this.getLast()) : this.getNext(vItem);
+}
+
+qx.Proto.getUp = function(vItem)
+{
+ if (!vItem) {
+ return this.getLast();
+ }
+
+ return this.getMultiColumnSupport() ? (this.getAbove(vItem) || this.getFirst()) : this.getPrevious(vItem);
+}
+
+qx.Proto.getLeft = function(vItem)
+{
+ if (!this.getMultiColumnSupport()) {
+ return null;
+ }
+
+ return !vItem ? this.getLast() : this.getPrevious(vItem);
+}
+
+qx.Proto.getRight = function(vItem)
+{
+ if (!this.getMultiColumnSupport()) {
+ return null;
+ }
+
+ return !vItem ? this.getFirst() : this.getNext(vItem);
+}
+
+qx.Proto.getAbove = function(vItem)
+{
+ throw new Error("getAbove(): Not implemented yet");
+}
+
+qx.Proto.getUnder = function(vItem)
+{
+ throw new Error("getUnder(): Not implemented yet");
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ PAGE HANDLING
+---------------------------------------------------------------------------
+*/
+
+/*!
+Jump a "page" up.
+
+#param vItem[qx.ui.core.Widget]: Relative to this widget
+*/
+qx.Proto.getPageUp = function(vItem)
+{
+ var vBoundedWidget = this.getBoundedWidget();
+ var vParentScrollTop = vBoundedWidget.getScrollTop();
+ var vParentClientHeight = vBoundedWidget.getClientHeight();
+
+ // Find next item
+ var newItem;
+ var nextItem = this.getLeadItem();
+ if (!nextItem) {
+ nextItem = this.getFirst();
+ }
+
+ // Normally we should reach the status "lead" for the
+ // nextItem after two iterations.
+ var tryLoops = 0;
+ while (tryLoops < 2)
+ {
+ while (nextItem && (this.getItemTop(nextItem) - this.getItemHeight(nextItem) >= vParentScrollTop)) {
+ nextItem = this.getUp(nextItem);
+ }
+
+ // This should never occour after the fix above
+ if (nextItem == null) {
+ break;
+ }
+
+ // If the nextItem is not anymore the leadItem
+ // Means: There has occured a change.
+ // We break here. This is normally the second step.
+ if (nextItem != this.getLeadItem())
+ {
+ // be sure that the top is reached
+ this.scrollItemIntoView(nextItem, true);
+ break;
+ }
+
+ // Update scrolling (this is normally the first step)
+ // this.debug("Scroll-Up: " + (vParentScrollTop + vParentClientHeight - 2 * this.getItemHeight(nextItem)));
+ vBoundedWidget.setScrollTop(vParentScrollTop - vParentClientHeight - this.getItemHeight(nextItem));
+
+ // Use the real applied value instead of the calulated above
+ vParentScrollTop = vBoundedWidget.getScrollTop();
+
+ // Increment counter
+ tryLoops++;
+ }
+
+ return nextItem;
+}
+
+/*!
+Jump a "page" down.
+
+#param vItem[qx.ui.core.Widget]: Relative to this widget
+*/
+qx.Proto.getPageDown = function(vItem)
+{
+ var vBoundedWidget = this.getBoundedWidget();
+ var vParentScrollTop = vBoundedWidget.getScrollTop();
+ var vParentClientHeight = vBoundedWidget.getClientHeight();
+
+ // this.debug("Bound: " + (vBoundedWidget._getTargetNode() != vBoundedWidget.getElement()));
+
+ // this.debug("ClientHeight-1: " + vBoundedWidget._getTargetNode().clientHeight);
+ // this.debug("ClientHeight-2: " + vBoundedWidget.getElement().clientHeight);
+
+ // Find next item
+ var newItem;
+ var nextItem = this.getLeadItem();
+ if (!nextItem) {
+ nextItem = this.getFirst();
+ }
+
+ // Normally we should reach the status "lead" for the
+ // nextItem after two iterations.
+ var tryLoops = 0;
+ while (tryLoops < 2)
+ {
+ // this.debug("Loop: " + tryLoops);
+ // this.debug("Info: " + nextItem + " :: " + (this.getItemTop(nextItem) + (2 * this.getItemHeight(nextItem))) + " <> " + (vParentScrollTop + vParentClientHeight));
+ // this.debug("Detail: " + vParentScrollTop + ", " + vParentClientHeight);
+
+ // Find next
+ while (nextItem && ((this.getItemTop(nextItem) + (2 * this.getItemHeight(nextItem))) <= (vParentScrollTop + vParentClientHeight))) {
+ nextItem = this.getDown(nextItem);
+ }
+
+ // This should never occour after the fix above
+ if (nextItem == null) {
+ break;
+ }
+
+ // If the nextItem is not anymore the leadItem
+ // Means: There has occured a change.
+ // We break here. This is normally the second step.
+ if (nextItem != this.getLeadItem()) {
+ break;
+ }
+
+ // Update scrolling (this is normally the first step)
+ // this.debug("Scroll-Down: " + (vParentScrollTop + vParentClientHeight - 2 * this.getItemHeight(nextItem)));
+ vBoundedWidget.setScrollTop(vParentScrollTop + vParentClientHeight - 2 * this.getItemHeight(nextItem));
+
+ // Use the real applied value instead of the calulated above
+ vParentScrollTop = vBoundedWidget.getScrollTop();
+
+ // Increment counter
+ tryLoops++;
+ }
+
+ //this.debug("Select: " + nextItem._labelObject.getHtml());
+
+ return nextItem;
+}
+
+
+
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ DISPOSE
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.dispose = function()
+{
+ if (this.getDisposed()) {
+ return;
+ }
+
+ if (this._selectedItems)
+ {
+ this._selectedItems.dispose();
+ this._selectedItems = null;
+ }
+
+ return qx.core.Target.prototype.dispose.call(this);
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeFullControlSelectionManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeFullControlSelectionManager.js
new file mode 100644
index 0000000000..625296430a
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeFullControlSelectionManager.js
@@ -0,0 +1,206 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_treefullcontrol)
+
+************************************************************************ */
+
+qx.OO.defineClass("qx.manager.selection.TreeFullControlSelectionManager", qx.manager.selection.SelectionManager,
+function(vBoundedWidget) {
+ qx.manager.selection.SelectionManager.call(this, vBoundedWidget);
+});
+
+/*!
+Should multiple selection be allowed?
+*/
+qx.OO.changeProperty({ name : "multiSelection", type : "boolean", defaultValue : false });
+
+/*!
+Enable drag selection?
+*/
+qx.OO.changeProperty({ name : "dragSelection", type : "boolean", defaultValue : false });
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO BOUNDED WIDGET
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._getFirst = function() {
+ return qx.lang.Array.getFirst(this.getItems());
+}
+
+qx.Proto._getLast = function() {
+ return qx.lang.Array.getLast(this.getItems());
+}
+
+qx.Proto.getItems = function() {
+ return this.getBoundedWidget().getItems();
+}
+
+qx.Proto.getNext = function(vItem)
+{
+ if (vItem)
+ {
+ if (qx.ui.treefullcontrol.Tree.isOpenTreeFolder(vItem))
+ {
+ return vItem.getFirstVisibleChildOfFolder();
+ }
+ else if (vItem.isLastVisibleChild())
+ {
+ var vCurrent = vItem;
+
+ while(vCurrent && vCurrent.isLastVisibleChild()) {
+ vCurrent = vCurrent.getParentFolder();
+ }
+
+ if (vCurrent &&
+ vCurrent instanceof qx.ui.treefullcontrol.AbstractTreeElement &&
+ vCurrent.getNextVisibleSibling() &&
+ vCurrent.getNextVisibleSibling() instanceof qx.ui.treefullcontrol.AbstractTreeElement) {
+ return vCurrent.getNextVisibleSibling();
+ }
+ }
+ else
+ {
+ return vItem.getNextVisibleSibling();
+ }
+ }
+ else
+ {
+ return this.getBoundedWidget().getFirstTreeChild();
+ }
+}
+
+qx.Proto.getPrevious = function(vItem)
+{
+ if (vItem)
+ {
+ if (vItem == this.getBoundedWidget())
+ {
+ return;
+ }
+ else if (vItem.isFirstVisibleChild())
+ {
+ if (vItem.getParentFolder() instanceof qx.ui.treefullcontrol.TreeFolder) {
+ return vItem.getParentFolder();
+ }
+ }
+ else
+ {
+ var vPrev = vItem.getPreviousVisibleSibling();
+
+ if (vPrev instanceof qx.ui.treefullcontrol.AbstractTreeElement)
+ {
+ while (vPrev instanceof qx.ui.treefullcontrol.AbstractTreeElement)
+ {
+ if (qx.ui.treefullcontrol.Tree.isOpenTreeFolder(vPrev))
+ {
+ vPrev = vPrev.getLastVisibleChildOfFolder();
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+
+ return vPrev;
+ }
+ }
+ else
+ {
+ return this.getBoundedWidget().getLastTreeChild();
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM DIMENSIONS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemTop = function(vItem)
+{
+ // Alternate method:
+ // return qx.dom.Location.getPageBoxTop(vItem.getElement()) - qx.dom.Location.getPageInnerTop(this.getBoundedWidget().getElement());
+
+ var vBoundedWidget = this.getBoundedWidget();
+ var vElement = vItem.getElement();
+ var vOffset = 0;
+
+ while (vElement && vElement.qx_Widget != vBoundedWidget)
+ {
+ vOffset += vElement.offsetTop;
+ vElement = vElement.parentNode;
+ }
+
+ return vOffset;
+}
+
+qx.Proto.getItemHeight = function(vItem)
+{
+ if (vItem instanceof qx.ui.treefullcontrol.TreeFolder &&
+ vItem._horizontalLayout)
+ {
+ return vItem._horizontalLayout.getOffsetHeight();
+ }
+ else
+ {
+ return vItem.getOffsetHeight();
+ }
+}
+
+qx.Proto.scrollItemIntoView = function(vItem)
+{
+ if (vItem instanceof qx.ui.treefullcontrol.TreeFolder &&
+ vItem._horizontalLayout)
+ {
+ return vItem._horizontalLayout.scrollIntoView();
+ }
+ else
+ {
+ return vItem.scrollIntoView();
+ }
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ ITEM STATE MANAGMENT
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.renderItemSelectionState = function(vItem, vIsSelected) {
+ vItem.setSelected(vIsSelected);
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeSelectionManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeSelectionManager.js
new file mode 100644
index 0000000000..d4dfe91041
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/TreeSelectionManager.js
@@ -0,0 +1,198 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_tree)
+
+************************************************************************ */
+
+qx.OO.defineClass("qx.manager.selection.TreeSelectionManager", qx.manager.selection.SelectionManager,
+function(vBoundedWidget) {
+ qx.manager.selection.SelectionManager.call(this, vBoundedWidget);
+});
+
+/*!
+Should multiple selection be allowed?
+*/
+qx.OO.changeProperty({ name : "multiSelection", type : "boolean", defaultValue : false });
+
+/*!
+Enable drag selection?
+*/
+qx.OO.changeProperty({ name : "dragSelection", type : "boolean", defaultValue : false });
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO BOUNDED WIDGET
+---------------------------------------------------------------------------
+*/
+
+qx.Proto._getFirst = function() {
+ return qx.lang.Array.getFirst(this.getItems());
+}
+
+qx.Proto._getLast = function() {
+ return qx.lang.Array.getLast(this.getItems());
+}
+
+qx.Proto.getItems = function() {
+ return this.getBoundedWidget().getItems();
+}
+
+qx.Proto.getNext = function(vItem)
+{
+ if (vItem)
+ {
+ if (qx.ui.tree.Tree.isOpenTreeFolder(vItem))
+ {
+ return vItem.getFirstVisibleChildOfFolder();
+ }
+ else if (vItem.isLastVisibleChild())
+ {
+ var vCurrent = vItem;
+
+ while(vCurrent && vCurrent.isLastVisibleChild()) {
+ vCurrent = vCurrent.getParentFolder();
+ }
+
+ if (vCurrent && vCurrent instanceof qx.ui.tree.AbstractTreeElement && vCurrent.getNextVisibleSibling() && vCurrent.getNextVisibleSibling() instanceof qx.ui.tree.AbstractTreeElement) {
+ return vCurrent.getNextVisibleSibling();
+ }
+ }
+ else
+ {
+ return vItem.getNextVisibleSibling();
+ }
+ }
+ else
+ {
+ return this.getBoundedWidget().getFirstTreeChild();
+ }
+}
+
+qx.Proto.getPrevious = function(vItem)
+{
+ if (vItem)
+ {
+ if (vItem == this.getBoundedWidget())
+ {
+ return;
+ }
+ else if (vItem.isFirstVisibleChild())
+ {
+ if (vItem.getParentFolder() instanceof qx.ui.tree.TreeFolder) {
+ return vItem.getParentFolder();
+ }
+ }
+ else
+ {
+ var vPrev = vItem.getPreviousVisibleSibling();
+
+ while (vPrev instanceof qx.ui.tree.AbstractTreeElement)
+ {
+ if (qx.ui.tree.Tree.isOpenTreeFolder(vPrev))
+ {
+ vPrev = vPrev.getLastVisibleChildOfFolder();
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ return vPrev;
+ }
+ }
+ else
+ {
+ return this.getBoundedWidget().getLastTreeChild();
+ }
+}
+
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM DIMENSIONS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemTop = function(vItem)
+{
+ // Alternate method:
+ // return qx.dom.Location.getPageBoxTop(vItem.getElement()) - qx.dom.Location.getPageInnerTop(this.getBoundedWidget().getElement());
+
+ var vBoundedWidget = this.getBoundedWidget();
+ var vElement = vItem.getElement();
+ var vOffset = 0;
+
+ while (vElement && vElement.qx_Widget != vBoundedWidget)
+ {
+ vOffset += vElement.offsetTop;
+ vElement = vElement.parentNode;
+ }
+
+ return vOffset;
+}
+
+qx.Proto.getItemHeight = function(vItem)
+{
+ if (vItem instanceof qx.ui.tree.TreeFolder && vItem._horizontalLayout)
+ {
+ return vItem._horizontalLayout.getOffsetHeight();
+ }
+ else
+ {
+ return vItem.getOffsetHeight();
+ }
+}
+
+qx.Proto.scrollItemIntoView = function(vItem)
+{
+ if (vItem instanceof qx.ui.tree.TreeFolder && vItem._horizontalLayout)
+ {
+ return vItem._horizontalLayout.scrollIntoView();
+ }
+ else
+ {
+ return vItem.scrollIntoView();
+ }
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ ITEM STATE MANAGMENT
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.renderItemSelectionState = function(vItem, vIsSelected) {
+ vItem.setSelected(vIsSelected);
+}
diff --git a/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/VirtualSelectionManager.js b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/VirtualSelectionManager.js
new file mode 100644
index 0000000000..a3dbe19a68
--- /dev/null
+++ b/webapps/qooxdoo-0.6.3-sdk/frontend/framework/source/class/qx/manager/selection/VirtualSelectionManager.js
@@ -0,0 +1,143 @@
+/* ************************************************************************
+
+ qooxdoo - the new era of web development
+
+ http://qooxdoo.org
+
+ Copyright:
+ 2004-2006 by 1&1 Internet AG, Germany, http://www.1and1.org
+
+ License:
+ LGPL 2.1: http://www.gnu.org/licenses/lgpl.html
+
+ Authors:
+ * Sebastian Werner (wpbasti)
+ * Andreas Ecker (ecker)
+
+************************************************************************ */
+
+/* ************************************************************************
+
+#module(ui_listview)
+
+************************************************************************ */
+
+/*!
+ This class represents a selection and manage incoming events for widgets which need selection support.
+*/
+qx.OO.defineClass("qx.manager.selection.VirtualSelectionManager", qx.manager.selection.SelectionManager,
+function(vBoundedWidget) {
+ qx.manager.selection.SelectionManager.call(this, vBoundedWidget);
+});
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO BOUNDED WIDGET
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getFirst = function() {
+ return qx.lang.Array.getFirst(this.getItems());
+}
+
+qx.Proto.getLast = function() {
+ return qx.lang.Array.getLast(this.getItems());
+}
+
+qx.Proto.getItems = function() {
+ return this.getBoundedWidget().getData();
+}
+
+qx.Proto.getNextSibling = function(vItem)
+{
+ var vData = this.getItems();
+ return vData[vData.indexOf(vItem)+1];
+}
+
+qx.Proto.getPreviousSibling = function(vItem)
+{
+ var vData = this.getItems();
+ return vData[vData.indexOf(vItem)-1];
+}
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM PROPERTIES
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.getItemHashCode = function(oItem)
+{
+ if (oItem._hash) {
+ return oItem._hash;
+ }
+
+ return oItem._hash = qx.core.Object.toHashCode(oItem);
+}
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ MAPPING TO ITEM DIMENSIONS
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.scrollItemIntoView = function(vItem, vTopLeft) {
+ this.getBoundedWidget().scrollItemIntoView(vItem, vTopLeft);
+}
+
+qx.Proto.getItemLeft = function(vItem) {
+ return this.getBoundedWidget().getItemLeft(vItem);
+}
+
+qx.Proto.getItemTop = function(vItem) {
+ return this.getBoundedWidget().getItemTop(vItem);
+}
+
+qx.Proto.getItemWidth = function(vItem) {
+ return this.getBoundedWidget().getItemWidth(vItem);
+}
+
+qx.Proto.getItemHeight = function(vItem) {
+ return this.getBoundedWidget().getItemHeight(vItem);
+}
+
+/*!
+ In a qx.ui.listview.ListView there are no disabled entries support currently.
+*/
+qx.Proto.getItemEnabled = function(vItem) {
+ return true;
+}
+
+
+
+
+
+
+/*
+---------------------------------------------------------------------------
+ ITEM STATE MANAGMENT
+---------------------------------------------------------------------------
+*/
+
+qx.Proto.renderItemSelectionState = function(vItem, vIsSelected) {
+ this.getBoundedWidget()._updateSelectionState(vItem, vIsSelected);
+}
+
+qx.Proto.renderItemAnchorState = function(vItem, vIsAnchor) {
+ this.getBoundedWidget()._updateAnchorState(vItem, vIsAnchor);
+}
+
+qx.Proto.renderItemLeadState = function(vItem, vIsLead) {
+ this.getBoundedWidget()._updateLeadState(vItem, vIsLead);
+}