From: Joseph Spiros Date: Mon, 21 Mar 2011 15:37:44 +0000 (-0400) Subject: Merge branch 'master' into gilbert X-Git-Url: http://git.ithinksw.org/philo.git/commitdiff_plain/834e27b62ba09014f91feabe89da08adb472ce9e?hp=3269dd0709806386523d7d3415d8eddc2d13644b Merge branch 'master' into gilbert * master: (25 commits) Added feed length limit to FeedView. Implements feature #111. Corrected LazyNavigationRecurser to mark its return value as safe. Switched back to setting a {{ children }} variable, but set it to a lazy recurser instead of a rendered result. Switched item and children to be set in the context directly for easy access. Improved/updated recursenavigation docstring. Refactored the RecurseNavigationNode to have less repetition. Switched from {{ children }} to {% recurse %} because it makes more sense to collect recursion only if needed. Added a number of counting variables to the context when rendering shipherd navigation. Designed to mirror the variables generated when using a for loop. Minor corrections to shipherd recursenavigation docstring. Added CSRF cookie js to TagCreation.js... apparently it isn't in the admin by default. Resolves issue 83. Added an admin action to NewsletterArticleAdmin to handle creating a NewsletterIssue from a selection of articles. Resolves issue 82. Minor LazyContainerFinder cleanup. It's not really that lazy in practice... Removed nodelist_crawl since nothing is using it and I'm starting to question its usefulness in general. Built a clearer algorithm for finding a template's containers; added support for template block overrides cancelling out containers in that block, which resolves issue #90. Corrected FeedView handling of incorrect Accept headers. Will now actually return 406 errors. Genericized nodelist_crawl to just pass each node to a callback function. Overloaded the Template.containers callback to create a blockcontext for handling containers in overridden blocks as per issue 90 and to handle contentreference/contentlet generation in a single sweep. Refactored ContainerForms to reflect a more suitable structure by storing the containers internally as a SortedDict. By handling containers more consistently, this commit resolves issue #89. Removed apparently-vestigial Entity.attribute property. Corrected JSONValue.__unicode__ to return unicode instead of bytestrings... not sure what it was being modeled on. Tweaked TargetURLModel to use smart_str instead of str to construct the Python < 2.6.5 kwargs to get a more consistent byte string. Corrected WaldoAuthenticationForm.clean to handle lack of password/username. Moved password-related forms into a class attribute for customizability. Standardized confirmation email context and allowed for a secure confirmation link. Tweaked TargetURLModel.get_reverse_params() to convert kwargs keys to bytestrings to support Python versions prior to 2.6.5 Minor correction to BlogView.urlpatterns. Switched feed_patterns to return urlpatterns suitable for addition to urlpatterns instead of inclusion in urlpatterns. Adjusted penfield urlpatterns accordingly. Added default behavior for FeedView.get_feed in cases where a known feed_type is not supplied for whatever reason. Added RegistrationMultiView.registration_form attribute. ... --- diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d518e31 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "contrib/gilbert/media/gilbert/extjs"] + path = contrib/gilbert/media/gilbert/extjs + url = git://github.com/probonogeek/extjs.git +[submodule "contrib/gilbert/media/gilbert/fugue-icons"] + path = contrib/gilbert/media/gilbert/fugue-icons + url = git://git.ithinksw.org/fugue-icons.git diff --git a/README b/README index 4b1a6f7..aec0c9c 100644 --- a/README +++ b/README @@ -3,6 +3,7 @@ Philo is a foundation for developing web content management systems. Prerequisites: * Python 2.5.4+ * Django 1.2+ + * django-staticmedia 0.2+ * django-mptt e734079+ * (Optional) django-grappelli 2.0+ * (Optional) recaptcha-django r6 diff --git a/contrib/gilbert/__init__.py b/contrib/gilbert/__init__.py new file mode 100644 index 0000000..c55f250 --- /dev/null +++ b/contrib/gilbert/__init__.py @@ -0,0 +1,24 @@ +__version__ = 'alpha' + + +from philo.contrib.gilbert.sites import GilbertSite, site + + +def autodiscover(): + import copy + from django.conf import settings + from django.utils.importlib import import_module + from django.utils.module_loading import module_has_submodule + + for app in settings.INSTALLED_APPS: + mod = import_module(app) + try: + before_import_model_registry = copy.copy(site.model_registry) + before_import_plugin_registry = copy.copy(site.plugin_registry) + import_module('%s.gilbert' % app) + except: + site.model_registry = before_import_model_registry + site.plugin_registry = before_import_plugin_registry + + if module_has_submodule(mod, 'gilbert'): + raise \ No newline at end of file diff --git a/contrib/gilbert/exceptions.py b/contrib/gilbert/exceptions.py new file mode 100644 index 0000000..e96ba25 --- /dev/null +++ b/contrib/gilbert/exceptions.py @@ -0,0 +1,6 @@ +class AlreadyRegistered(Exception): + pass + + +class NotRegistered(Exception): + pass \ No newline at end of file diff --git a/contrib/gilbert/media/gilbert/Gilbert.api.auth.js b/contrib/gilbert/media/gilbert/Gilbert.api.auth.js new file mode 100644 index 0000000..dc0a829 --- /dev/null +++ b/contrib/gilbert/media/gilbert/Gilbert.api.auth.js @@ -0,0 +1,128 @@ +GILBERT_PLUGINS.push(new (function() { + return { + init: function(application) { + if (GILBERT_LOGGED_IN) { + application.on('ready', this.addUserMenu, this, { + single: true, + }); + } else { + application.on('ready', this.showLoginWindow, this, { + single: true, + }); + } + }, + addUserMenu: function(application) { + Gilbert.api.auth.whoami(function(result) { + application.mainmenu.add({ + xtype: 'tbfill', + },{ + xtype: 'tbseparator', + },{ + xtype: 'button', + iconCls: 'user-silhouette', + text: '' + result + '', + menu: [{ + text: 'Change password', + iconCls: 'key--pencil', + handler: function(button, event) { + Gilbert.api.auth.get_passwd_form(function(formspec) { + var change_password_window = application.createWindow({ + layout: 'fit', + resizable: false, + title: 'Change password', + iconCls: 'key--pencil', + width: 266, + height: 200, + items: change_password_form = new Ext.FormPanel(Ext.applyIf({ + frame: true, + bodyStyle: 'padding: 5px 5px 0', + buttons: [{ + text: 'Change password', + iconCls: 'key--pencil', + handler: function(button, event) { + change_password_form.getForm().submit({ + success: function(form, action) { + Ext.MessageBox.alert('Password changed', 'Your password has been changed.'); + }, + }); + }, + }], + api: { + submit: Gilbert.api.auth.submit_passwd_form, + }, + }, formspec)) + }); + change_password_window.show(); + }); + + }, + },{ + text: 'Log out', + iconCls: 'door-open-out', + handler: function(button, event) { + Gilbert.api.auth.logout(function(result) { + if (result) { + document.location.reload(); + } else { + Ext.MessageBox.alert('Log out failed', 'You have not been logged out. This could mean that your connection with the server has been severed. Please try again.'); + } + }) + } + }], + }); + application.doLayout(); + }); + }, + showLoginWindow: function(application) { + application.mainmenu.hide(); + application.doLayout(); + var login_window = application.createWindow({ + header: false, + closable: false, + resizable: false, + draggable: false, + width: 266, + height: 135, + layout: 'fit', + items: login_form = new Ext.FormPanel({ + frame: true, + bodyStyle: 'padding: 5px 5px 0', + items: [ + { + fieldLabel: 'Username', + name: 'username', + xtype: 'textfield', + }, + { + fieldLabel: 'Password', + name: 'password', + xtype: 'textfield', + inputType: 'password', + } + ], + buttons: [ + { + text: 'Log in', + iconCls: 'door-open-in', + handler: function(button, event) { + var the_form = login_form.getForm().el.dom; + var username = the_form[0].value; + var password = the_form[1].value; + Gilbert.api.auth.login(username, password, function(result) { + if (result) { + document.location.reload(); + } else { + Ext.MessageBox.alert('Log in failed', 'Unable to authenticate using the credentials provided. Please try again.', function() { + login_form.getForm().reset(); + }); + } + }); + } + } + ], + }), + }); + login_window.show(); + }, + } +})()); \ No newline at end of file diff --git a/contrib/gilbert/media/gilbert/Gilbert.lib.js b/contrib/gilbert/media/gilbert/Gilbert.lib.js new file mode 100644 index 0000000..02bdb7b --- /dev/null +++ b/contrib/gilbert/media/gilbert/Gilbert.lib.js @@ -0,0 +1,83 @@ +Ext.ns('Gilbert.lib'); + +Gilbert.lib.Desktop = Ext.extend(Ext.Panel, { + constructor: function(config) { + Gilbert.lib.Desktop.superclass.constructor.call(this, Ext.applyIf(config||{}, { + region: 'center', + border: false, + padding: '5', + bodyStyle: 'background: none;', + })); + }, +}); + +Gilbert.lib.MainMenu = Ext.extend(Ext.Toolbar, { + constructor: function(application) { + var application = this.application = application; + Gilbert.lib.MainMenu.superclass.constructor.call(this, { + region: 'north', + autoHeight: true, + }); + }, +}); + +Gilbert.lib.Application = Ext.extend(Ext.util.Observable, { + constructor: function(config) { + Ext.apply(this, config, { + renderTo: Ext.getBody(), + plugins: [], + + }); + Gilbert.lib.Application.superclass.constructor.call(this); + this.addEvents({ + 'ready': true, + }); + this.init(); + }, + init: function() { + Ext.QuickTips.init(); + + var desktop = this.desktop = new Gilbert.lib.Desktop(); + var mainmenu = this.mainmenu = new Gilbert.lib.MainMenu(this); + var viewport = this.viewport = new Ext.Viewport({ + renderTo: this.renderTo, + layout: 'border', + items: [ + this.mainmenu, + this.desktop, + ], + }); + var windows = this.windows = new Ext.WindowGroup(); + + if (this.plugins) { + if (Ext.isArray(this.plugins)) { + for (var i = 0; i < this.plugins.length; i++) { + this.plugins[i] = this.initPlugin(this.plugins[i]); + } + } else { + this.plugins = this.initPlugin(this.plugins); + } + } + + this.doLayout(); + + this.fireEvent('ready', this); + }, + initPlugin: function(plugin) { + plugin.init(this); + return plugin; + }, + createWindow: function(config, cls) { + var win = new(cls||Ext.Window)(Ext.applyIf(config||{},{ + renderTo: this.desktop.el, + manager: this.windows, + constrainHeader: true, + })); + win.render(this.desktop.el); + return win; + }, + doLayout: function() { + this.mainmenu.doLayout(); + this.viewport.doLayout(); + } +}); \ No newline at end of file diff --git a/contrib/gilbert/media/gilbert/extjs b/contrib/gilbert/media/gilbert/extjs new file mode 160000 index 0000000..530ef4b --- /dev/null +++ b/contrib/gilbert/media/gilbert/extjs @@ -0,0 +1 @@ +Subproject commit 530ef4b6c5b943cfa68b779d11cf7de29aa878bf diff --git a/contrib/gilbert/media/gilbert/fugue-icons b/contrib/gilbert/media/gilbert/fugue-icons new file mode 160000 index 0000000..764abbe --- /dev/null +++ b/contrib/gilbert/media/gilbert/fugue-icons @@ -0,0 +1 @@ +Subproject commit 764abbef432ef8a7333a58ca21b0ef6ef0a80b1a diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/arrv.png b/contrib/gilbert/media/gilbert/murano/images/btn/arrv.png new file mode 100644 index 0000000..66fdce0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/arrv.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/c/Down.png b/contrib/gilbert/media/gilbert/murano/images/btn/c/Down.png new file mode 100644 index 0000000..d0225fb Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/c/Down.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/c/Normal.png b/contrib/gilbert/media/gilbert/murano/images/btn/c/Normal.png new file mode 100644 index 0000000..42e9981 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/c/Normal.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/c/Over.png b/contrib/gilbert/media/gilbert/murano/images/btn/c/Over.png new file mode 100644 index 0000000..a5a716d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/c/Over.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/c/Pressed.png b/contrib/gilbert/media/gilbert/murano/images/btn/c/Pressed.png new file mode 100644 index 0000000..aa168a3 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/c/Pressed.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/left-over.png b/contrib/gilbert/media/gilbert/murano/images/btn/left-over.png new file mode 100644 index 0000000..7ef8f67 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/left-over.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/left.png b/contrib/gilbert/media/gilbert/murano/images/btn/left.png new file mode 100644 index 0000000..b0dc68c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/left.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/menu.png b/contrib/gilbert/media/gilbert/murano/images/btn/menu.png new file mode 100644 index 0000000..4993084 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/menu.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/right-over.png b/contrib/gilbert/media/gilbert/murano/images/btn/right-over.png new file mode 100644 index 0000000..2cb9783 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/right-over.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/right.png b/contrib/gilbert/media/gilbert/murano/images/btn/right.png new file mode 100644 index 0000000..4e68d26 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/right.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/split.png b/contrib/gilbert/media/gilbert/murano/images/btn/split.png new file mode 100644 index 0000000..a5402b7 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/split.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/splith.png b/contrib/gilbert/media/gilbert/murano/images/btn/splith.png new file mode 100644 index 0000000..a5402b7 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/splith.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/splitv.png b/contrib/gilbert/media/gilbert/murano/images/btn/splitv.png new file mode 100644 index 0000000..82970e9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/splitv.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/whole/Down.png b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Down.png new file mode 100644 index 0000000..c55c6f0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Down.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/whole/Normal.png b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Normal.png new file mode 100644 index 0000000..d4756a4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Normal.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/whole/Over.png b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Over.png new file mode 100644 index 0000000..fb22b68 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Over.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/btn/whole/Pressed.png b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Pressed.png new file mode 100644 index 0000000..153be02 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/btn/whole/Pressed.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/fills/30b.png b/contrib/gilbert/media/gilbert/murano/images/fills/30b.png new file mode 100644 index 0000000..f030b53 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/fills/30b.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/fills/30w.png b/contrib/gilbert/media/gilbert/murano/images/fills/30w.png new file mode 100644 index 0000000..494c8bb Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/fills/30w.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/fills/70w.png b/contrib/gilbert/media/gilbert/murano/images/fills/70w.png new file mode 100644 index 0000000..b9fa366 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/fills/70w.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/fills/80b.png b/contrib/gilbert/media/gilbert/murano/images/fills/80b.png new file mode 100644 index 0000000..8a6b4eb Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/fills/80b.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/form/checked.png b/contrib/gilbert/media/gilbert/murano/images/form/checked.png new file mode 100644 index 0000000..f22d0ff Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/form/checked.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/form/field.opacity b/contrib/gilbert/media/gilbert/murano/images/form/field.opacity new file mode 100644 index 0000000..62576dd Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/form/field.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/form/field.png b/contrib/gilbert/media/gilbert/murano/images/form/field.png new file mode 100644 index 0000000..33767b4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/form/field.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/form/radioed.png b/contrib/gilbert/media/gilbert/murano/images/form/radioed.png new file mode 100644 index 0000000..1db47e8 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/form/radioed.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/form/unchecked.png b/contrib/gilbert/media/gilbert/murano/images/form/unchecked.png new file mode 100644 index 0000000..259deac Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/form/unchecked.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/form/unradioed.png b/contrib/gilbert/media/gilbert/murano/images/form/unradioed.png new file mode 100644 index 0000000..6db37df Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/form/unradioed.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/gloss/gloss.opacity b/contrib/gilbert/media/gilbert/murano/images/gloss/gloss.opacity new file mode 100644 index 0000000..e0425c7 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/gloss/gloss.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/gloss/gloss.png b/contrib/gilbert/media/gilbert/murano/images/gloss/gloss.png new file mode 100644 index 0000000..af1ec9b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/gloss/gloss.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/gloss/light-gloss.png b/contrib/gilbert/media/gilbert/murano/images/gloss/light-gloss.png new file mode 100644 index 0000000..e9444e5 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/gloss/light-gloss.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/gradients/30white-to-trans.png b/contrib/gilbert/media/gilbert/murano/images/gradients/30white-to-trans.png new file mode 100644 index 0000000..cbc8ff2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/gradients/30white-to-trans.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/gradients/dark-inner-shadow.png b/contrib/gilbert/media/gilbert/murano/images/gradients/dark-inner-shadow.png new file mode 100644 index 0000000..0636daa Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/gradients/dark-inner-shadow.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/grid/col-move-bottom.png b/contrib/gilbert/media/gilbert/murano/images/grid/col-move-bottom.png new file mode 100644 index 0000000..cab866d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/grid/col-move-bottom.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/grid/col-move-top.png b/contrib/gilbert/media/gilbert/murano/images/grid/col-move-top.png new file mode 100644 index 0000000..3de7621 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/grid/col-move-top.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/grid/row-editor-btns.png b/contrib/gilbert/media/gilbert/murano/images/grid/row-editor-btns.png new file mode 100644 index 0000000..a267203 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/grid/row-editor-btns.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/balloon.png b/contrib/gilbert/media/gilbert/murano/images/icons/balloon.png new file mode 100755 index 0000000..dff9e47 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/balloon.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/cross.png b/contrib/gilbert/media/gilbert/murano/images/icons/cross.png new file mode 100755 index 0000000..e559d44 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/cross.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/d-first.png b/contrib/gilbert/media/gilbert/murano/images/icons/d-first.png new file mode 100644 index 0000000..62bb6b6 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/d-first.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/d-last.png b/contrib/gilbert/media/gilbert/murano/images/icons/d-last.png new file mode 100644 index 0000000..a45d9d2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/d-last.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/d-next.png b/contrib/gilbert/media/gilbert/murano/images/icons/d-next.png new file mode 100644 index 0000000..669df8b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/d-next.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/d-prev.png b/contrib/gilbert/media/gilbert/murano/images/icons/d-prev.png new file mode 100644 index 0000000..e8f4683 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/d-prev.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/d-refresh.png b/contrib/gilbert/media/gilbert/murano/images/icons/d-refresh.png new file mode 100644 index 0000000..d18dbf9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/d-refresh.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/exclamation.png b/contrib/gilbert/media/gilbert/murano/images/icons/exclamation.png new file mode 100644 index 0000000..c088a26 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/exclamation.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/exclamation32.png b/contrib/gilbert/media/gilbert/murano/images/icons/exclamation32.png new file mode 100755 index 0000000..51fde5a Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/exclamation32.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/first.png b/contrib/gilbert/media/gilbert/murano/images/icons/first.png new file mode 100755 index 0000000..a6930a1 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/first.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/information.png b/contrib/gilbert/media/gilbert/murano/images/icons/information.png new file mode 100755 index 0000000..01184cc Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/information.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/last.png b/contrib/gilbert/media/gilbert/murano/images/icons/last.png new file mode 100755 index 0000000..8c63819 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/last.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/next.png b/contrib/gilbert/media/gilbert/murano/images/icons/next.png new file mode 100755 index 0000000..195a9d7 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/next.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/no.png b/contrib/gilbert/media/gilbert/murano/images/icons/no.png new file mode 100755 index 0000000..1f33a1b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/no.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/prev.png b/contrib/gilbert/media/gilbert/murano/images/icons/prev.png new file mode 100755 index 0000000..79558ab Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/prev.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/refresh.png b/contrib/gilbert/media/gilbert/murano/images/icons/refresh.png new file mode 100755 index 0000000..1c56055 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/refresh.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/icons/yes.png b/contrib/gilbert/media/gilbert/murano/images/icons/yes.png new file mode 100755 index 0000000..46c0a29 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/icons/yes.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/az.png b/contrib/gilbert/media/gilbert/murano/images/listview/az.png new file mode 100644 index 0000000..60ecb93 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/az.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/cols.png b/contrib/gilbert/media/gilbert/murano/images/listview/cols.png new file mode 100644 index 0000000..4393cca Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/cols.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/header.png b/contrib/gilbert/media/gilbert/murano/images/listview/header.png new file mode 100644 index 0000000..bec2aca Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/header.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/headerdrop.png b/contrib/gilbert/media/gilbert/murano/images/listview/headerdrop.png new file mode 100644 index 0000000..fe001e8 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/headerdrop.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/listview-sort-asc.png b/contrib/gilbert/media/gilbert/murano/images/listview/listview-sort-asc.png new file mode 100644 index 0000000..d11b3e2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/listview-sort-asc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/listview-sort-desc.png b/contrib/gilbert/media/gilbert/murano/images/listview/listview-sort-desc.png new file mode 100644 index 0000000..627a7d9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/listview-sort-desc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/sort-asc.png b/contrib/gilbert/media/gilbert/murano/images/listview/sort-asc.png new file mode 100644 index 0000000..c77105b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/sort-asc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/sort-desc.png b/contrib/gilbert/media/gilbert/murano/images/listview/sort-desc.png new file mode 100644 index 0000000..75e171e Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/sort-desc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/listview/za.png b/contrib/gilbert/media/gilbert/murano/images/listview/za.png new file mode 100644 index 0000000..0c2333d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/listview/za.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/load.gif b/contrib/gilbert/media/gilbert/murano/images/load.gif new file mode 100644 index 0000000..5fe9ccf Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/load.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/menu/arrow.opacity b/contrib/gilbert/media/gilbert/murano/images/menu/arrow.opacity new file mode 100644 index 0000000..ef80ff9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/menu/arrow.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/menu/arrow.png b/contrib/gilbert/media/gilbert/murano/images/menu/arrow.png new file mode 100644 index 0000000..f79ebbc Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/menu/arrow.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/mini/mini-bottom.png b/contrib/gilbert/media/gilbert/murano/images/mini/mini-bottom.png new file mode 100644 index 0000000..11ae079 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/mini/mini-bottom.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/mini/mini-left.png b/contrib/gilbert/media/gilbert/murano/images/mini/mini-left.png new file mode 100644 index 0000000..1fe6f7e Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/mini/mini-left.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/mini/mini-right.png b/contrib/gilbert/media/gilbert/murano/images/mini/mini-right.png new file mode 100644 index 0000000..d090c0a Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/mini/mini-right.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/mini/mini-top.png b/contrib/gilbert/media/gilbert/murano/images/mini/mini-top.png new file mode 100644 index 0000000..32f0de8 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/mini/mini-top.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/progress.png b/contrib/gilbert/media/gilbert/murano/images/progress.png new file mode 100644 index 0000000..d55db12 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/progress.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/e.png b/contrib/gilbert/media/gilbert/murano/images/resizable/e.png new file mode 100644 index 0000000..1d4d6d4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/e.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/n.png b/contrib/gilbert/media/gilbert/murano/images/resizable/n.png new file mode 100644 index 0000000..6ac64c9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/n.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/ne.png b/contrib/gilbert/media/gilbert/murano/images/resizable/ne.png new file mode 100644 index 0000000..c57ab8e Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/ne.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/nw.png b/contrib/gilbert/media/gilbert/murano/images/resizable/nw.png new file mode 100644 index 0000000..52262a7 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/nw.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/s.png b/contrib/gilbert/media/gilbert/murano/images/resizable/s.png new file mode 100644 index 0000000..6ac64c9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/s.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/se.png b/contrib/gilbert/media/gilbert/murano/images/resizable/se.png new file mode 100644 index 0000000..109cf8d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/se.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/sw.png b/contrib/gilbert/media/gilbert/murano/images/resizable/sw.png new file mode 100644 index 0000000..9b91ce1 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/sw.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/resizable/w.png b/contrib/gilbert/media/gilbert/murano/images/resizable/w.png new file mode 100644 index 0000000..1d4d6d4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/resizable/w.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/scroller/l.png b/contrib/gilbert/media/gilbert/murano/images/scroller/l.png new file mode 100644 index 0000000..5c43d0d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/scroller/l.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/scroller/r.png b/contrib/gilbert/media/gilbert/murano/images/scroller/r.png new file mode 100644 index 0000000..c6111ef Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/scroller/r.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/slider/h.png b/contrib/gilbert/media/gilbert/murano/images/slider/h.png new file mode 100644 index 0000000..5ce04c0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/slider/h.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/slider/thumbh.png b/contrib/gilbert/media/gilbert/murano/images/slider/thumbh.png new file mode 100644 index 0000000..9c11f82 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/slider/thumbh.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/slider/thumbv.png b/contrib/gilbert/media/gilbert/murano/images/slider/thumbv.png new file mode 100644 index 0000000..9c7419c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/slider/thumbv.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/slider/v.png b/contrib/gilbert/media/gilbert/murano/images/slider/v.png new file mode 100644 index 0000000..72c816c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/slider/v.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/30-b.opacity b/contrib/gilbert/media/gilbert/murano/images/src/30-b.opacity new file mode 100644 index 0000000..869cec5 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/30-b.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/30-w.opacity b/contrib/gilbert/media/gilbert/murano/images/src/30-w.opacity new file mode 100644 index 0000000..c2ce599 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/30-w.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/30w.opacity b/contrib/gilbert/media/gilbert/murano/images/src/30w.opacity new file mode 100644 index 0000000..35b9066 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/30w.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/30white-to-trans.opacity b/contrib/gilbert/media/gilbert/murano/images/src/30white-to-trans.opacity new file mode 100644 index 0000000..a3ceb55 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/30white-to-trans.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/70w.opacity b/contrib/gilbert/media/gilbert/murano/images/src/70w.opacity new file mode 100644 index 0000000..718ca1d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/70w.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/80-b.opacity b/contrib/gilbert/media/gilbert/murano/images/src/80-b.opacity new file mode 100644 index 0000000..d4c7378 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/80-b.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/?.opacity b/contrib/gilbert/media/gilbert/murano/images/src/?.opacity new file mode 100644 index 0000000..9e51720 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/?.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/arrow buttons.opacity b/contrib/gilbert/media/gilbert/murano/images/src/arrow buttons.opacity new file mode 100644 index 0000000..1dc866d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/arrow buttons.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/btn.opacity b/contrib/gilbert/media/gilbert/murano/images/src/btn.opacity new file mode 100644 index 0000000..79387cb Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/btn.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/check.opacity b/contrib/gilbert/media/gilbert/murano/images/src/check.opacity new file mode 100644 index 0000000..9835a54 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/check.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/col-move-bottom.opacity b/contrib/gilbert/media/gilbert/murano/images/src/col-move-bottom.opacity new file mode 100644 index 0000000..8d5a7e0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/col-move-bottom.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/col-move-top.opacity b/contrib/gilbert/media/gilbert/murano/images/src/col-move-top.opacity new file mode 100644 index 0000000..62b579e Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/col-move-top.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/dark-inner-shadow.opacity b/contrib/gilbert/media/gilbert/murano/images/src/dark-inner-shadow.opacity new file mode 100644 index 0000000..2422c28 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/dark-inner-shadow.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/exclamation.opacity b/contrib/gilbert/media/gilbert/murano/images/src/exclamation.opacity new file mode 100644 index 0000000..09cfd0c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/exclamation.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/grad-height-25.opacity b/contrib/gilbert/media/gilbert/murano/images/src/grad-height-25.opacity new file mode 100644 index 0000000..4a16036 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/grad-height-25.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/h.opacity b/contrib/gilbert/media/gilbert/murano/images/src/h.opacity new file mode 100644 index 0000000..cb738c5 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/h.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/light-gloss.opacity b/contrib/gilbert/media/gilbert/murano/images/src/light-gloss.opacity new file mode 100644 index 0000000..0dd03ec Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/light-gloss.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/listview-sort.opacity b/contrib/gilbert/media/gilbert/murano/images/src/listview-sort.opacity new file mode 100644 index 0000000..ab60087 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/listview-sort.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/listviewheader.opacity b/contrib/gilbert/media/gilbert/murano/images/src/listviewheader.opacity new file mode 100644 index 0000000..853b4d8 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/listviewheader.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/mini.opacity b/contrib/gilbert/media/gilbert/murano/images/src/mini.opacity new file mode 100644 index 0000000..3ba2b37 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/mini.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/progress.opacity b/contrib/gilbert/media/gilbert/murano/images/src/progress.opacity new file mode 100644 index 0000000..81d4904 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/progress.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/resizable corner.psd b/contrib/gilbert/media/gilbert/murano/images/src/resizable corner.psd new file mode 100644 index 0000000..822db29 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/resizable corner.psd differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/resizable long.psd b/contrib/gilbert/media/gilbert/murano/images/src/resizable long.psd new file mode 100644 index 0000000..074b076 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/resizable long.psd differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/row-editor-btns.opacity b/contrib/gilbert/media/gilbert/murano/images/src/row-editor-btns.opacity new file mode 100644 index 0000000..040f298 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/row-editor-btns.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/scroller.opacity b/contrib/gilbert/media/gilbert/murano/images/src/scroller.opacity new file mode 100644 index 0000000..6f9ee31 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/scroller.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/sort.opacity b/contrib/gilbert/media/gilbert/murano/images/src/sort.opacity new file mode 100644 index 0000000..e33424c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/sort.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/tabs.opacity b/contrib/gilbert/media/gilbert/murano/images/src/tabs.opacity new file mode 100644 index 0000000..974441e Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/tabs.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/tb-sprite.psd b/contrib/gilbert/media/gilbert/murano/images/src/tb-sprite.psd new file mode 100644 index 0000000..9f0ec67 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/tb-sprite.psd differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/tb.opacity b/contrib/gilbert/media/gilbert/murano/images/src/tb.opacity new file mode 100644 index 0000000..d307ca0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/tb.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/thumbh.opacity b/contrib/gilbert/media/gilbert/murano/images/src/thumbh.opacity new file mode 100644 index 0000000..6909c40 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/thumbh.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/thumbv.opacity b/contrib/gilbert/media/gilbert/murano/images/src/thumbv.opacity new file mode 100644 index 0000000..64c1a5c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/thumbv.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/tools.psd b/contrib/gilbert/media/gilbert/murano/images/src/tools.psd new file mode 100644 index 0000000..a69c09f Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/tools.psd differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/tooltip-invalid.opacity b/contrib/gilbert/media/gilbert/murano/images/src/tooltip-invalid.opacity new file mode 100644 index 0000000..dcfcb81 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/tooltip-invalid.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/tooltip.opacity b/contrib/gilbert/media/gilbert/murano/images/src/tooltip.opacity new file mode 100644 index 0000000..0264045 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/tooltip.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/triggers/blank.opacity b/contrib/gilbert/media/gilbert/murano/images/src/triggers/blank.opacity new file mode 100644 index 0000000..2f124fb Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/triggers/blank.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/triggers/blank.png b/contrib/gilbert/media/gilbert/murano/images/src/triggers/blank.png new file mode 100644 index 0000000..983fdff Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/triggers/blank.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/triggers/clear.opacity b/contrib/gilbert/media/gilbert/murano/images/src/triggers/clear.opacity new file mode 100644 index 0000000..a51a849 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/triggers/clear.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/triggers/date.opacity b/contrib/gilbert/media/gilbert/murano/images/src/triggers/date.opacity new file mode 100644 index 0000000..ce54557 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/triggers/date.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/triggers/drop.opacity b/contrib/gilbert/media/gilbert/murano/images/src/triggers/drop.opacity new file mode 100644 index 0000000..f7065e1 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/triggers/drop.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/triggers/search.opacity b/contrib/gilbert/media/gilbert/murano/images/src/triggers/search.opacity new file mode 100644 index 0000000..01c7e9b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/triggers/search.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/v.opacity b/contrib/gilbert/media/gilbert/murano/images/src/v.opacity new file mode 100644 index 0000000..81a092d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/v.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/window-dark.opacity b/contrib/gilbert/media/gilbert/murano/images/src/window-dark.opacity new file mode 100644 index 0000000..1d4cde2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/window-dark.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/window.opacity b/contrib/gilbert/media/gilbert/murano/images/src/window.opacity new file mode 100644 index 0000000..644311c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/window.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/src/x.opacity b/contrib/gilbert/media/gilbert/murano/images/src/x.opacity new file mode 100644 index 0000000..da05b1f Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/src/x.opacity differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/c/Bottom.png b/contrib/gilbert/media/gilbert/murano/images/tab/c/Bottom.png new file mode 100644 index 0000000..f12c35b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/c/Bottom.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/c/Top.png b/contrib/gilbert/media/gilbert/murano/images/tab/c/Top.png new file mode 100644 index 0000000..0d9880c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/c/Top.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/close.png b/contrib/gilbert/media/gilbert/murano/images/tab/close.png new file mode 100644 index 0000000..7139a96 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/close.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/l/Bottom.png b/contrib/gilbert/media/gilbert/murano/images/tab/l/Bottom.png new file mode 100644 index 0000000..1a6f7c0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/l/Bottom.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/l/Top.png b/contrib/gilbert/media/gilbert/murano/images/tab/l/Top.png new file mode 100644 index 0000000..9bbe709 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/l/Top.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/r/Bottom.png b/contrib/gilbert/media/gilbert/murano/images/tab/r/Bottom.png new file mode 100644 index 0000000..0e16744 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/r/Bottom.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tab/r/Top.png b/contrib/gilbert/media/gilbert/murano/images/tab/r/Top.png new file mode 100644 index 0000000..85ea39d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tab/r/Top.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tb-sprite.png b/contrib/gilbert/media/gilbert/murano/images/tb-sprite.png new file mode 100644 index 0000000..d4e4c53 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tb-sprite.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tb.png b/contrib/gilbert/media/gilbert/murano/images/tb.png new file mode 100644 index 0000000..01a80d9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tb.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tools.png b/contrib/gilbert/media/gilbert/murano/images/tools.png new file mode 100644 index 0000000..53540f0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tools.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/arrows.gif b/contrib/gilbert/media/gilbert/murano/images/tree/arrows.gif new file mode 100644 index 0000000..2683463 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/arrows.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/drop-add.png b/contrib/gilbert/media/gilbert/murano/images/tree/drop-add.png new file mode 100755 index 0000000..49746a1 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/drop-add.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/drop-between.gif b/contrib/gilbert/media/gilbert/murano/images/tree/drop-between.gif new file mode 100644 index 0000000..5c6c09d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/drop-between.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/drop-no.png b/contrib/gilbert/media/gilbert/murano/images/tree/drop-no.png new file mode 100755 index 0000000..1f33a1b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/drop-no.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/drop-over.gif b/contrib/gilbert/media/gilbert/murano/images/tree/drop-over.gif new file mode 100644 index 0000000..30d1ca7 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/drop-over.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/drop-under.gif b/contrib/gilbert/media/gilbert/murano/images/tree/drop-under.gif new file mode 100644 index 0000000..85f66b1 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/drop-under.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/drop-yes.png b/contrib/gilbert/media/gilbert/murano/images/tree/drop-yes.png new file mode 100755 index 0000000..46c0a29 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/drop-yes.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-minus-nl.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-minus-nl.gif new file mode 100644 index 0000000..0f2f2fd Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-minus-nl.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-minus.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-minus.gif new file mode 100644 index 0000000..e8995a9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-minus.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-plus-nl.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-plus-nl.gif new file mode 100644 index 0000000..095afc4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-plus-nl.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-plus.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-plus.gif new file mode 100644 index 0000000..6049b9a Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end-plus.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end.gif new file mode 100644 index 0000000..f24ddee Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-end.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-line.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-line.gif new file mode 100644 index 0000000..75e6da4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-line.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-minus-nl.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-minus-nl.gif new file mode 100644 index 0000000..0f2f2fd Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-minus-nl.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-minus.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-minus.gif new file mode 100644 index 0000000..df410a0 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-minus.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-plus-nl.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-plus-nl.gif new file mode 100644 index 0000000..095afc4 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-plus-nl.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow-plus.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-plus.gif new file mode 100644 index 0000000..4fe31a3 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow-plus.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/elbow.gif b/contrib/gilbert/media/gilbert/murano/images/tree/elbow.gif new file mode 100644 index 0000000..b8f4208 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/elbow.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/folder-open.png b/contrib/gilbert/media/gilbert/murano/images/tree/folder-open.png new file mode 100755 index 0000000..dc05885 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/folder-open.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/folder.png b/contrib/gilbert/media/gilbert/murano/images/tree/folder.png new file mode 100755 index 0000000..87ff120 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/folder.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/leaf.png b/contrib/gilbert/media/gilbert/murano/images/tree/leaf.png new file mode 100755 index 0000000..8b17b3c Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/leaf.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/loading.gif b/contrib/gilbert/media/gilbert/murano/images/tree/loading.gif new file mode 100644 index 0000000..5fe9ccf Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/loading.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tree/s.gif b/contrib/gilbert/media/gilbert/murano/images/tree/s.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tree/s.gif differ diff --git a/contrib/gilbert/media/gilbert/murano/images/trigger/blank.png b/contrib/gilbert/media/gilbert/murano/images/trigger/blank.png new file mode 100644 index 0000000..165ba02 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/trigger/blank.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/trigger/clear.png b/contrib/gilbert/media/gilbert/murano/images/trigger/clear.png new file mode 100644 index 0000000..a7c97bf Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/trigger/clear.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/trigger/date.png b/contrib/gilbert/media/gilbert/murano/images/trigger/date.png new file mode 100644 index 0000000..6fdaa3f Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/trigger/date.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/trigger/drop.png b/contrib/gilbert/media/gilbert/murano/images/trigger/drop.png new file mode 100644 index 0000000..5a8a8b2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/trigger/drop.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/trigger/search.png b/contrib/gilbert/media/gilbert/murano/images/trigger/search.png new file mode 100644 index 0000000..f878e02 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/trigger/search.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/bc.png b/contrib/gilbert/media/gilbert/murano/images/tt/bc.png new file mode 100644 index 0000000..f2022df Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/bc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/bl.png b/contrib/gilbert/media/gilbert/murano/images/tt/bl.png new file mode 100644 index 0000000..fad7b21 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/bl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/br.png b/contrib/gilbert/media/gilbert/murano/images/tt/br.png new file mode 100644 index 0000000..217491d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/br.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/c.png b/contrib/gilbert/media/gilbert/murano/images/tt/c.png new file mode 100644 index 0000000..70f3d1d Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/c.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-bc.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-bc.png new file mode 100644 index 0000000..eb124df Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-bc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-bl.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-bl.png new file mode 100644 index 0000000..7c7721f Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-bl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-br.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-br.png new file mode 100644 index 0000000..19aaad9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-br.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-c.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-c.png new file mode 100644 index 0000000..b23e939 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-c.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-ml.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-ml.png new file mode 100644 index 0000000..34d3f1a Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-ml.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-mr.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-mr.png new file mode 100644 index 0000000..6dbacc3 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-mr.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-tc.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-tc.png new file mode 100644 index 0000000..3b55ecf Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-tc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-tl.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-tl.png new file mode 100644 index 0000000..12fa555 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-tl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/i-tr.png b/contrib/gilbert/media/gilbert/murano/images/tt/i-tr.png new file mode 100644 index 0000000..bc6e3bf Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/i-tr.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/ml.png b/contrib/gilbert/media/gilbert/murano/images/tt/ml.png new file mode 100644 index 0000000..4bebef2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/ml.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/mr.png b/contrib/gilbert/media/gilbert/murano/images/tt/mr.png new file mode 100644 index 0000000..23aebdd Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/mr.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/tc.png b/contrib/gilbert/media/gilbert/murano/images/tt/tc.png new file mode 100644 index 0000000..2108682 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/tc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/tl.png b/contrib/gilbert/media/gilbert/murano/images/tt/tl.png new file mode 100644 index 0000000..0d86302 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/tl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/tt/tr.png b/contrib/gilbert/media/gilbert/murano/images/tt/tr.png new file mode 100644 index 0000000..70d0cc9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/tt/tr.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/bc.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/bc.png new file mode 100644 index 0000000..a2bfead Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/bc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/bl.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/bl.png new file mode 100644 index 0000000..5a6ce5b Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/bl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/br.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/br.png new file mode 100644 index 0000000..bbde5b2 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/br.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/c.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/c.png new file mode 100644 index 0000000..8a6b4eb Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/c.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/l.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/l.png new file mode 100644 index 0000000..af70f5f Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/l.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/r.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/r.png new file mode 100644 index 0000000..bf77670 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/r.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/tc.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/tc.png new file mode 100644 index 0000000..8c65fb1 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/tc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/tl.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/tl.png new file mode 100644 index 0000000..c253ea5 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/tl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowdark/tr.png b/contrib/gilbert/media/gilbert/murano/images/windowdark/tr.png new file mode 100644 index 0000000..b371422 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowdark/tr.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/bc.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/bc.png new file mode 100644 index 0000000..0ce7973 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/bc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/bl.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/bl.png new file mode 100644 index 0000000..e2f5bbf Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/bl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/br.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/br.png new file mode 100644 index 0000000..9ed3c34 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/br.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/c.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/c.png new file mode 100644 index 0000000..bcf4ec9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/c.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/l.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/l.png new file mode 100644 index 0000000..e85f76e Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/l.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/r.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/r.png new file mode 100644 index 0000000..36cc2a3 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/r.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/tc.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/tc.png new file mode 100644 index 0000000..ea82da9 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/tc.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/tl.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/tl.png new file mode 100644 index 0000000..ff1586f Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/tl.png differ diff --git a/contrib/gilbert/media/gilbert/murano/images/windowlight/tr.png b/contrib/gilbert/media/gilbert/murano/images/windowlight/tr.png new file mode 100644 index 0000000..42087c6 Binary files /dev/null and b/contrib/gilbert/media/gilbert/murano/images/windowlight/tr.png differ diff --git a/contrib/gilbert/media/gilbert/murano/murano.css b/contrib/gilbert/media/gilbert/murano/murano.css new file mode 100644 index 0000000..53c05d9 --- /dev/null +++ b/contrib/gilbert/media/gilbert/murano/murano.css @@ -0,0 +1,1488 @@ +body{ + background:#666; + color: #CCC; + font-family: Helvetica, Arial, sans-serif; + font-size: 12px; +} + +/* kill the borders */ +.x-panel-tl, .x-toolbar-layout-ct, .x-panel-tbar, .x-toolbar, .x-panel-header, .x-panel-body, +.x-window-tl, +.x-window-body, +.x-window-mc, +.x-progress-bar, +.x-tab-scrolling-top, +.x-tab-panel-body, +.x-tab-scroller-left, .x-tab-scroller-right, +.x-tab-strip-spacer, +.x-tab-panel-footer, +.x-tab-strip, +.x-list-header-inner em, +.x-grid3-cell,.x-grid3-header, .x-grid3-header-offset, +.x-date-prevday, +.x-date-nextday, +.x-tab-panel-header{ + border: 0 !important; +} + +/* kill stuff */ +.x-shadow{ + display:none !important; +} +.x-tool, .x-date-mp .x-date-mp-ybtn .x-date-mp-prev, .x-date-mp .x-date-mp-ybtn .x-date-mp-next{ + background-image:url(images/tools.png); +} + + +/* @group Basic Window */ + +/* window header */ + .x-window-tr, .x-panel-tr{ + padding-right: 16px; + background: transparent url(images/windowlight/tr.png) no-repeat right top; + } + .x-window-tc, .x-panel-tc{ + background: transparent url(images/windowlight/tc.png) repeat-x right top; + overflow:visible; + } + .x-window-tl, .x-panel-tl{ + padding-left: 16px; + background: transparent url(images/windowlight/tl.png) no-repeat left top; + font-family: Optima; + } + .x-window-header-text, .x-panel-header-text{ + color: #FFF; + text-shadow: 1px 1px 0 #000; + font-size: 12px; + } + .x-window-header, .x-window-tc, .x-panel-tc{ + } + + .x-panel-tc > .x-panel-header, .x-window-tc > .x-window-header{ + margin: 0 -10px; + } + /* don't go off the edge when a window is maximized. */ + .x-window-maximized > .x-window-tl > .x-window-tr > .x-window-tc > .x-window-header{ + margin: 0; + } + /* hide the rounded corners when the window is maximized. */ + .x-window-maximized > .x-window-tl, .x-window-maximized > .x-window-tl > .x-window-tr{ + background: none; + } + + .x-window-mc, .x-panel-mc{ + background: transparent url(images/windowlight/c.png) repeat right top; + padding: 0; + } + .x-window-ml, .x-panel-ml{ + padding-left: 2px; + background: transparent url(images/windowlight/l.png) repeat-y left bottom; + } + .x-window-mr, .x-panel-mr{ + padding-right: 2px; + background: transparent url(images/windowlight/r.png) repeat-y right bottom; + } + .x-window-mc{ + border: 0; + padding: 0; + } + .x-window-header, .x-panel-header{ + line-height: 16px; + } + .x-panel-header{ + margin: 0 0; + } + /* Window Footer Stuff */ + .x-window-bl, .x-panel-bl{ + padding-left: 16px; + min-height: 16px; + background: transparent url(images/windowdark/bl.png) no-repeat left bottom; + } + .x-window-br, .x-panel-br{ + padding-right: 16px; + min-height: 16px; + background: transparent url(images/windowdark/br.png) no-repeat right bottom; + } + .x-window-bc, .x-panel-bc{ + background: transparent url(images/windowdark/bc.png) repeat-x right bottom; + min-height: 16px; + } + .x-window-bc .x-window-footer, .x-panel-bc .x-panel-footer{ + margin: 0 -16px; + } + /* If there is no footer, use the light version */ + .x-window-bl.x-window-no-footer, .x-panel-bl.x-panel-nofooter{ + border-top: 0; + background-image: url(images/windowlight/bl.png); + } + .x-window-no-footer .x-window-br, .x-panel-nofooter .x-panel-br{ + background-image: url(images/windowlight/br.png); + } + .x-window-no-footer .x-window-bc, .x-panel-nofooter .x-panel-bc{ + background-image: url(images/windowlight/bc.png) ; + } + +/* @end */ + +/* @group Frame Panel inside a window */ + +.x-window .x-panel-tl, +.x-window .x-panel-tr, +.x-window .x-panel-ml, +.x-window .x-panel-mr, +.x-window .x-panel-bl, +.x-window .x-panel-br{ + padding: 0; + background: transparent; +} +.x-window .x-panel-bl, .x-window .x-panel-bc, .x-window .x-panel-br{ + background-position: top left; +} + +/* @end */ + + + +/* @group Basic Panel */ + +.x-panel-header{ + background: transparent url(images/windowlight/tc.png) repeat-x left top; + font-family: Optima; + } + .x-panel-body{ + background: transparent url(images/windowlight/c.png) top left repeat; + } + .x-panel-mc .x-panel-body{ + background: none; + } + +/* @end */ + +/* @group Minimizers and Split-Panels */ + +.x-splitbar-proxy{ + background: transparent url(images/fills/30w.png) left top repeat; +} + +.x-layout-collapsed{ + background: transparent url(images/windowlight/c.png) top left repeat; + border-color: #333; + } + .x-layout-collapsed-over{ + background: transparent url(images/windowdark/c.png) top left repeat; + } + +.x-layout-mini-west, .x-layout-collapsed .x-layout-mini-east{ + background: transparent url(images/mini/mini-left.png) top left no-repeat; +} +.x-layout-mini-east, .x-layout-collapsed .x-layout-mini-west{ + background: transparent url(images/mini/mini-right.png) top left no-repeat; +} +.x-layout-mini-north, .x-layout-collapsed .x-layout-mini-south{ + background: transparent url(images/mini/mini-bottom.png) top left no-repeat; +} +.x-layout-mini-south, .x-layout-collapsed .x-layout-mini-north{ + background: transparent url(images/mini/mini-top.png) top left no-repeat; +} + +/* @end */ + + +/* @group Toolbars */ + +.x-toolbar{ + height: 24px; + background: transparent url(images/tb.png) left top repeat-x; +} +.x-btn-text{ + color: #FFF; +} +.xtb-text{ + font-size: 11px; +} + /* text-edit */ + .x-edit-bold, + .x-edit-italic, + .x-edit-underline, + .x-edit-increasefontsize, + .x-edit-decreasefontsize, + .x-edit-forecolor, + .x-edit-backcolor, + .x-edit-justifyleft, + .x-edit-justifyright, + .x-edit-justifycenter, + .x-edit-createlink, + .x-edit-insertorderedlist, + .x-edit-insertunorderedlist, + .x-edit-sourceedit{ + background-image: url(images/tb-sprite.png) !important; + } + +/* @end */ + +/* @group Buttons */ + + .x-btn-ml, .x-btn-tl, .x-btn-bl, .x-btn-mr, .x-btn-tr, .x-btn-br{ + width: 3px; + } + .x-btn-tl, .x-btn-tr, .x-btn-bl, .x-btn-br{ + height: 3px; + } + .x-btn-mc em{ + margin: 0 2px; + } + + /* @group Normal */ + .x-btn-tl, + .x-btn-tr, + .x-btn-bl, + .x-btn-br, + .x-btn-ml, + .x-btn-mr{ + background: transparent url(images/btn/whole/Normal.png) top left no-repeat; + } + .x-btn-mc, + .x-btn-bc, + .x-btn-tc{ + background: transparent url(images/btn/c/Normal.png) top left repeat-x; + } + /* @end */ + + /* @group Over */ + .x-btn-over .x-btn-tl, + .x-btn-over .x-btn-tr, + .x-btn-over .x-btn-bl, + .x-btn-over .x-btn-br, + .x-btn-over .x-btn-ml, + .x-btn-over .x-btn-mr{ + background: transparent url(images/btn/whole/Over.png) top left no-repeat; + } + .x-btn-over .x-btn-mc, + .x-btn-over .x-btn-bc, + .x-btn-over .x-btn-tc{ + background: transparent url(images/btn/c/Over.png) top left repeat-x; + } + /* @end */ + + /* @group Click */ + .x-btn-click .x-btn-tl, + .x-btn-click .x-btn-tr, + .x-btn-click .x-btn-bl, + .x-btn-click .x-btn-br, + .x-btn-click .x-btn-ml, + .x-btn-click .x-btn-mr{ + background: transparent url(images/btn/whole/Pressed.png) top left no-repeat; + } + .x-btn-click .x-btn-mc, + .x-btn-click .x-btn-bc, + .x-btn-click .x-btn-tc{ + background: transparent url(images/btn/c/Pressed.png) top left repeat-x; + } + /* @end */ + + /* @group Active */ + .x-btn-pressed .x-btn-tl, .x-btn-menu-active .x-btn-tl, + .x-btn-pressed .x-btn-tr, .x-btn-menu-active .x-btn-tr, + .x-btn-pressed .x-btn-bl, .x-btn-menu-active .x-btn-bl, + .x-btn-pressed .x-btn-br, .x-btn-menu-active .x-btn-br, + .x-btn-pressed .x-btn-ml, .x-btn-menu-active .x-btn-ml, + .x-btn-pressed .x-btn-mr, .x-btn-menu-active .x-btn-mr{ + background: transparent url(images/btn/whole/Down.png) top left no-repeat; + } + .x-btn-pressed .x-btn-mc, .x-btn-menu-active .x-btn-mc, + .x-btn-pressed .x-btn-bc, .x-btn-menu-active .x-btn-bc, + .x-btn-pressed .x-btn-tc, .x-btn-menu-active .x-btn-tc{ + background: transparent url(images/btn/c/Down.png) top left repeat-x; + } + /* @end */ +.x-btn-mc{ + padding: 0 10px !important; +} + +.x-btn-tl{ background-position: left top !important; } +.x-btn-tc{ background-position: center top !important; } +.x-btn-tr{ background-position: right top !important; } +.x-btn-ml{ background-position: left center !important; } +.x-btn-mc{ background-position: center center !important; } +.x-btn-mr{ background-position: right center !important; } +.x-btn-bl{ background-position: left bottom !important; } +.x-btn-bc{ background-position: center bottom !important; } +.x-btn-br{ background-position: right bottom !important; } + +.x-btn-arrow-bottom{ + background: transparent url(images/btn/arrv.png) center bottom no-repeat !important; +} +.x-btn-split-bottom{ + background: transparent url(images/btn/splitv.png) center bottom no-repeat !important; + padding-bottom:18px !important; +} +.x-btn-icon-small-right .x-btn-text{ padding-right: 20px !important; } +.x-btn-icon-medium-right .x-btn-text{ padding-right: 28px !important; } +.x-btn-icon-large-right .x-btn-text{ padding-right: 36px !important; } + +/*.x-toolbar-cell table{ + height:22px; + margin-top: 1px; + } + .x-btn-tr, .x-btn-tc, .x-btn-tl, .x-btn-br, .x-btn-bc, .x-btn-bl{ + display: none; + } + .x-btn-ml, .x-btn-mc, .x-btn-mr{ + height: 22px; + } + .x-btn-ml, + .x-toolbar .x-btn-ml{ + width: 6px; + background: transparent url(images/btn/l.png) left top no-repeat; + } + .x-btn-mc, + .x-toolbar .x-btn-mc{ + background: transparent url(images/btn/c.png) left top repeat; + } + .x-btn-mr, + .x-toolbar .x-btn-mr{ + width:6px; + background: transparent url(images/btn/r.png) right top no-repeat; + } + .x-btn-text{ + text-shadow: -1px -1px 0 rgba(0,0,0,.6); + color: #EEE; + } + /* over state */ + .x-btn-over .x-btn-ml, .x-btn-over .x-btn-mc, + .x-toolbar .x-btn-over .x-btn-ml, .x-toolbar .x-btn-over .x-btn-mc{ + background-position: left -22px; + } + .x-btn-over .x-btn-mr, + .x-toolbar .x-btn-over .x-btn-mr{ + background-position: right -22px; + } + .x-btn-over .x-btn-text{ + color: #FFF; + } + /* pressed state */ + .x-toolbar .x-btn-menu-active .x-btn-ml, + .x-toolbar .x-btn-menu-active .x-btn-mc, + .x-btn-pressed .x-btn-ml, + .x-btn-pressed .x-btn-mc, + .x-toolbar .x-btn-pressed .x-btn-ml, + .x-toolbar .x-btn-pressed .x-btn-mc{ + background-position: left -66px; + } + .x-toolbar .x-btn-menu-active .x-btn-mr, + .x-toolbar .x-btn-pressed .x-btn-mr, + .x-btn-pressed .x-btn-mr{ + background-position: right -66px; + } + + .x-btn-split{ + background: transparent url(images/btn/splith.png) right center no-repeat !important; + } + .x-btn-split button{ + padding-right: 5px !important; + } + .x-btn-arrow{ + background: transparent url(images/btn/menu.png) right center no-repeat !important; + padding-right:12px !important; + } + /* pressed and over state */ + /* Commented out because the selectors are so specific they're overriding the click state. What to do? I don't want to use !important... Figure out later. */ + /*.x-toolbar .x-btn-menu-active.x-btn-over .x-btn-ml, + .x-toolbar .x-btn-menu-active.x-btn-over .x-btn-mc, + .x-btn-pressed.x-btn-over .x-btn-ml, + .x-btn-pressed.x-btn-over .x-btn-mc, + .x-toolbar .x-btn-pressed.x-btn-over .x-btn-ml, + .x-toolbar .x-btn-pressed.x-btn-over .x-btn-mc{ + background-position: left -88px; + } + .x-toolbar .x-btn-menu-active.x-btn-over .x-btn-mr, + .x-toolbar .x-btn-pressed.x-btn-over .x-btn-mr, + .x-btn-pressed.x-btn-over .x-btn-mr{ + background-position: right -88px; + }*/ + /* click state */ + /*.x-btn-click .x-btn-ml, .x-btn-click .x-btn-mc, + .x-toolbar .x-btn-click .x-btn-ml, .x-toolbar .x-btn-click .x-btn-mc{ + background-position: left -44px; + } + .x-btn-click .x-btn-mr, + .x-toolbar .x-btn-click .x-btn-mr{ + background-position: right -44px; + } + .x-btn-click .x-btn-text, .x-btn-pressed .x-btn-text{ + color: #FFF; + }*/ + +/* @end */ + + +/* @group Tabs */ + +.x-tab-panel-header, .x-tab-panel-footer{ + padding: 0; + background: transparent url(images/fills/80b.png) +} +.x-tab-scrolling-top{ + background: transparent url(images/windowdark/c.png) + } + + /* default state */ + + .x-tab-strip .x-tab-right{ + padding: 0 0 0 6px; + background-image: url(images/tab/l/Top.png) !important; + background-position:left top; + } + .x-tab-strip .x-tab-left{ + padding: 0 6px 0 0 !important; + background-image: url(images/tab/r/Top.png) !important; + background-position:right top; + } + .x-tab-strip .x-tab-strip-inner{ + background-image: url(images/tab/c/Top.png) !important; + background-position:center top; + } + .x-tab-strip-bottom .x-tab-right{ background-image: url(images/tab/l/Bottom.png) !important; } + .x-tab-strip-bottom .x-tab-left{ background-image: url(images/tab/r/Bottom.png) !important; } + .x-tab-strip-bottom .x-tab-strip-inner{ background-image: url(images/tab/c/Bottom.png) !important; } + + /* hover state */ + .x-tab-strip-over .x-tab-right{ background-position: left -26px !important; } + .x-tab-strip-over .x-tab-left{ background-position: right -26px !important;} + .x-tab-strip-over .x-tab-strip-inner{ background-position: left -26px !important; } + .x-tab-right .x-tab-left .x-tab-strip-inner .x-tab-strip-text{ + color: #CCC; + text-shadow: -1px -1px 0 rgba(0,0,0,.2); + } + + /* active state */ + .x-tab-strip-active .x-tab-right{ background-position: left -52px !important; } + .x-tab-strip-active .x-tab-left{ background-position: right -52px !important; } + .x-tab-strip-active .x-tab-strip-inner{ background-position: center -52px !important; } + .x-tab-strip-active .x-tab-right .x-tab-left .x-tab-strip-inner .x-tab-strip-text{ + color: #222; + text-shadow:1px 1px 0 rgba(255,255,255,.25); + } + + /* spacer */ + .x-tab-strip-top{ + border: 0 !important; + } + .x-tab-strip-spacer{ + border: 0 !important; + background: transparent url(images/fills/30w.png) top left repeat; + height: 2px; + } + + /* scroller */ + .x-tab-scroller-left, .x-tab-scroller-right{ + } + .x-tab-scroller-left{ + background: transparent url(images/scroller/l.png) 0 0 no-repeat; + } + .x-tab-scroller-left-over, .x-tab-scroller-right-over{ + background-position: left -22px !important; + } + .x-tab-scroller-left-disabled, .x-tab-scroller-right-disabled{ + background-position: left 0 !important; + } + .x-tab-scroller-right{ + background: transparent url(images/scroller/r.png) right 0 no-repeat; + } + + /* closable */ + + .x-tab-strip-closable .x-tab-strip-inner{ + padding-right: 15px; + } + .x-tab-strip-close{ + background: transparent url(images/tab/close.png) 0 0 no-repeat; + margin-right: 2px; + top: 5px !important; + right:4px !important; + } + .x-tab-strip-active .x-tab-strip-close{ + background-position: 0 -11px; + } + +/* @end */ + +/* @group Forms and Form Fields */ + +.x-form .x-form-item{ + margin: 10px 0; +} +.x-form .x-form-item .x-form-item{ + margin: 0; +} + +.x-form-field{ + font-size: 11px !important; +} +.x-toolbar-cell .x-form-field{ + height: 22px !important; +} +.x-form-text, .x-form-textarea{ + background: #444 url(images/gradients/dark-inner-shadow.png) top left repeat-x; + color: #FFF; + text-shadow: 1px 1px 0 #000; + border-top-color: #666; + border-bottom-color: #222; + border-left-color: transparent; + border-right-color: transparent; +} +.x-form-empty-field{ + color: #999; +} +.x-form-invalid{ + border-top-color: #700; + border-bottom-color: #200; + border-left-color: transparent; + border-right-color: transparent; + background-color: #C00; + color: #FAA; +} +.x-form-invalid-icon{ + background: transparent url(images/icons/exclamation.png) top left no-repeat; +} + +.x-form-textarea{ + background: #FFF !important; + color: #000; + text-shadow: none; + border-color: #000 !important; +} +.x-form-field-wrap .x-form-trigger{ + background-image: url(images/trigger/blank.png); + border-bottom-color: #111; +} +.x-form-field-wrap .x-form-arrow-trigger{ + background-image: url(images/trigger/drop.png); +} +.x-form-field-wrap .x-form-date-trigger{ + background-image: url(images/trigger/date.png); +} +.x-form-field-wrap .x-form-search-trigger{ + background-image: url(images/trigger/search.png); +} +.x-form-field-wrap .x-form-clear-trigger{ + background-image: url(images/trigger/clear.png); +} +.x-html-editor-wrap{ + background: #FFF; + border:1px solid #000; + color: #000 !important; +} + +.x-fieldset{ + border:1px solid #888; +} + +/* @end */ + +/* icons */ +.ext-mb-question.ext-mb-icon{ + background: transparent url(images/icons/balloon.png) left center no-repeat; +} +.x-window-dlg .ext-mb-error{ + background: transparent url(images/icons/cross.png) left center no-repeat; +} +.x-window-dlg .ext-mb-warning{ + background: transparent url(images/icons/exclamation32.png) left center no-repeat; +} +.x-window-dlg .ext-mb-info{ + background: transparent url(images/icons/information.png) left center no-repeat; +} + + +/* @group Combo List */ + +.x-combo-list{ + border: 1px solid transparent; + color: #444; + background: #FFF; + border-color: #777; +} +.x-combo-list-item{ + border-color: transparent; +} +.x-combo-list .x-combo-selected{ + background: #06C; + color: #FFF; + border:1px solid transparent !important; +} +.x-combo-list-inner{ + background: #FFF; + border-bottom-color: #777 !important; +} + +/* @end */ + +/* @group Lists and Grids */ + +.x-grid3-header-offset, .x-grid3-header{ + padding: 0; + margin-bottom: -1px; +} +.x-grid3-header-offset table{ + border-right: 2px groove #DDD; +} +.x-list-header, .x-grid3-header{ + background: #CCC url(images/gloss/light-gloss.png) left top repeat-x; +} +.x-pivotgrid .x-grid3-header-offset td, .x-list-header-inner div, .x-grid3-hd, .x-dd-drag-proxy .x-grid3-hd-inner, .sort-asc .x-grid3-hd-inner, .sort-desc .x-grid3-hd-inner{ + background: transparent url(images/listview/header.png) left top repeat-x; + color: #222; + text-shadow:1px 1px 0 rgba(255,255,255,.35); +} +.x-pivotgrid .x-grid3-header-offset td{ + border-bottom: 1px solid #888; +} +/* a hover state */ +.x-grid3 .x-grid3-hd-over .x-grid3-hd-inner{ + background: transparent url(images/listview/header.png) left -44px repeat-x; +} +.sort-asc, .sort-desc{ + border-top: 0 !important; + border-bottom: 0 !important; + border-right: 0 !important; +} +.x-list-header-inner .sort-asc, .x-list-header-inner .sort-desc{ + height: 15px; +} +.x-grid3 .sort-asc, .x-grid3 .sort-desc{ + background: transparent url(images/listview/header.png) 0 -22px repeat-x !important; +} +.x-grid3-hd-inner{ + color: #222; +} +.x-grid3 table{ + font-size: 12px; +} +.x-grid3-hd-btn{ + border-left:2px groove #DDD; + border-right:2px groove #DDD; + background: transparent url(images/listview/headerdrop.png) 0 0px; +} +.x-grid3-hd-btn:hover{ + background: transparent url(images/listview/headerdrop.png) 0 -44px !important; +} + +.x-grid3-sort-icon{ + margin-top: -5px !important; + height: 5px; +} +.sort-asc .x-grid3-sort-icon{ + background: transparent url(images/listview/sort-asc.png); +} + +.sort-desc .x-grid3-sort-icon{ + background: transparent url(images/listview/sort-desc.png); +} + +.x-list-header .sort-asc{ + background: transparent url(images/listview/listview-sort-asc.png) center top !important; +} +.x-list-header .sort-desc{ + background: transparent url(images/listview/listview-sort-desc.png) center top !important; +} + +.x-cols-icon{ + background-image: url(images/listview/cols.png); +} +.xg-hmenu-sort-desc .x-menu-item-icon{ + background-image: url(images/listview/az.png); +} +.xg-hmenu-sort-asc .x-menu-item-icon{ + background-image: url(images/listview/za.png); +} + +.x-grid3-row-over, .x-list-over{ + background: transparent url(images/fills/30w.png) top left repeat !important; +} + +.x-grid3-row-alt{ + background: transparent url(images/fills/30b.png) top left repeat; + border: 1px solid #222 !important; + border-width: 1px 0 !important; +} + +.x-grid3-scroller{ + margin-top: 1px; +} + +/* @group Row Editor */ + +.x-row-editor .x-row-editor-body{ + background: #838383 url(images/gloss/gloss.png) repeat center center; +} +.x-row-editor .x-row-editor-header, .x-row-editor .x-row-editor-footer{ + height: 0; + border: 1px solid #FFF; + border-width: 1px 0; + background: transparent !important; +} +.x-row-editor .x-row-editor-header{ + border-top-color: rgba(0,0,0,.15); + border-bottom-color: #71b3e1; +} +.x-row-editor .x-row-editor-footer{ + border-bottom-color: rgba(0,0,0,.15); + border-top-color: #065790 !important; +} + +.x-row-editor .x-row-editor-bwrap .x-plain, +.x-row-editor .x-row-editor-bwrap .x-plain .x-plain-bwrap, +.x-row-editor .x-row-editor-bwrap .x-plain .x-plain-bwrap .x-plain-body{ + background-image: url(images/grid/row-editor-btns.png); +} + + +/* @end */ + +/* @group Manip States */ + +.x-grid3-resize-proxy { + background: #777; +} + +.x-grid3-resize-marker { + background: #777; +} + +.col-move-top{ + background-image:url(images/grid/col-move-top.png); +} + +.col-move-bottom{ + background-image:url(images/grid/col-move-bottom.png); +} + +/* @end */ + +/* @group Selection States */ +.x-grid3-row, .x-list-wrap dl{ + border: 1px solid transparent; + border-width: 1px 0; + } + .x-grid3-row .x-grid3-row-table, .x-list-wrap dl dt{ + border: 1px solid transparent; + border-width: 1px 0; + } +.x-grid3-row-selected, .x-list-selected{ + border-color: #000 !important; + } + .x-grid3-row-selected .x-grid3-row-table, .x-list-selected dt{ + background: transparent url(images/gloss/gloss.png) center center repeat; + border-top-color: #71b3e1 !important; + border-bottom-color: #065790 !important; + } + .x-grid3-row-selected .x-grid3-cell, .x-list-selected dt{ + color: #FFF; + text-shadow: -1px -1px 0 rgba(0,0,0,.35); + } + +/* @end */ + +/* @group Groups */ + +.x-grid3 .x-grid3-td-numberer{ + font-weight: bold; + color: #AAA; +} +.x-grid3 .x-grid-group-hd{ + border-top: 1px solid #CCC !important; + border-bottom: 1px solid #444 !important; + background: #666 url(images/gradients/30white-to-trans.png) left top repeat-x; + font-family: Helvetica, Arial, sans-serif; + padding: 0; + color: #FFF; + text-shadow:-1px -1px rgba(0,0,0,.25) + +} +.x-grid-group-collapsed .x-grid-group-hd{ + border-bottom: 1px solid #222 !important; + background: #333 url(images/gradients/30white-to-trans.png) left top repeat-x; +} + +/* @end */ + +/* @group Pivot Grid */ + .x-pivotgrid .x-grid3-row-table{ + border-bottom: 1px solid transparent; + } + .x-grid3-header-title{ + background: #666 url(images/gloss/gloss.png) left 50% repeat; + color: #FFF; + text-shadow:-1px -1px 0 rgba(0,0,0,.75); + border-top: 1px solid #999; + border-bottom: 1px solid #111; + font-size: 14px; + font-family: Optima, sans-serif; + line-height: 10px; + } + .x-grid3-row-headers table{ + border-collapse:separate !important; + border-spacing:0; + } + .x-grid3-row-headers td{ + height: 19px !important; + background: #FFF url(images/gloss/gloss.png) left 50% repeat; + border-top: 1px solid #777; + border-bottom: 1px solid #444; + border-left: 1px solid #777; + border-right: 1px solid #444; + color: #FFF; + text-shadow: -1px -1px 0 rgba(0,0,0,.35) + } + +/* @end */ + + + +/* @end */ + +/* @group Menus */ + +.x-menu{ + background: transparent url(images/fills/80b.png) top left repeat; + border:1px solid #444; + } + .x-menu-item-text{ + color: #DDD; + text-shadow: -1px -1x 0 #000; + } + .x-menu-item-active, .x-menu-item-active .x-menu-item{ + border-color: #3398e1; + border-top-color: #71b3e1; + border-bottom-color: #065790; + } + .x-menu-item-active{ + background: transparent url(images/gloss/gloss.png) left center repeat-x; + } + .x-menu-item-active .x-menu-item-text{ + color: #FFF; + } + .x-menu-sep{ + border-color: #444; + } + .x-menu-item-arrow{ + background-image: url(images/menu/arrow.png); + } + .x-menu-check-item .x-menu-item-icon{ + background: transparent url(images/form/unchecked.png) left center no-repeat; + } + .x-menu-item-checked .x-menu-check-item .x-menu-item-icon{ + background: transparent url(images/form/checked.png) left center no-repeat; + } + .x-menu-group-item .x-menu-item-icon{ + background: transparent url(images/form/unradioed.png) left center no-repeat; + } + .x-menu-item-checked .x-menu-group-item .x-menu-item-icon{ + background: transparent url(images/form/radioed.png) left center no-repeat; + } + +/* @end */ + +/* @group Progress Bar */ + +.x-progress-wrap{ + color: #CCC; + background: transparent url(images/progress.png) 0 -18px repeat-x; + border: 1px solid #000; +} +.x-progress-inner{ + border: 1px solid #888; +} +.x-progress-bar{ + color: #FFF; + background: #000 url(images/gloss/gloss.png) center center repeat-x; + padding: 1px; + height: 15px !important; + border-bottom: 1px solid #000 !important; +} + +/* @end */ + +/* @group Date Picker */ + +.x-date-picker{ + border: 1px solid #000; + background: transparent url(images/windowdark/c.png) repeat right top; +} +.x-date-picker a{ + color: #06C; +} +.x-date-mp{ + background: #222; +} +.x-date-mp a{ + color: #6AF; + text-shadow:-1px -1px 0 rgba(0,0,0,.35) +} +.x-date-picker table{ + font-size:11px; +} +.x-date-active{ + border-color: transparent !important; +} +.x-date-selected{ + border: 1px solid #000 !important; +} +.x-date-active a{ + color: #FFF; +} +.x-date-picker .x-date-today .x-date-date{ + background: transparent url(images/fills/30w.png) repeat; + border-color: transparent; +} +.x-date-picker .x-date-selected .x-date-date{ + background: transparent url(images/windowlight/tc.png) repeat-x right center; + border-color: #3398e1; + border-top-color: #71b3e1; + border-bottom-color: #065790; +} +.x-date-picker .x-date-selected.x-date-today .x-date-date{ + background-color: #FFF; +} +.x-date-prevday a, .x-date-nextday a{ + color: #888; +} +.x-date-bottom{ + padding: 3px; + border-top-color: #000; + background: transparent url(images/tb.png) left top repeat-x; +} +.x-date-picker th{ + background: transparent url(images/tb.png) left top repeat-x; + border-bottom-color: #000; +} +.x-date-middle, .x-date-left, .x-date-right{ + background: #000 url(images/gradients/30white-to-trans.png) left top repeat-x; + border-top: 1px solid #888; +} +.x-date-left a{ + background: transparent url(images/btn/left.png) left top no-repeat; + height: 15px; + left: 15px; +} +.x-date-right a{ + background: transparent url(images/btn/right.png) left top no-repeat; + height: 15px; + left: 15px; +} +.x-date-picker .x-date-mp-sel a{ + background: transparent url(images/windowlight/tc.png) repeat-x right center; + border-color: #3398e1; + border-top-color: #71b3e1; + border-bottom-color: #065790; +} +.x-date-picker .x-date-mp-sep{ + border-color: #444; +} +.x-date-mp-btns td{ + border-color: #444; +} +.x-date-mp-btns{ + background: #000; +} +.x-date-mp-btns button{ + background: transparent url(images/windowlight/tc.png) repeat-x right center; + border-color: #888; + border-top-color: #CCC; + border-bottom-color: #555; + color: #FFF; + text-shadow:-1px -1px 0 #000; +} +.x-date-mp-btns button:hover{ + border-color: #3398e1; + border-top-color: #71b3e1; + border-bottom-color: #065790; +} + +/* @end */ + +/* @group Resizable Handles */ + +.x-resizable-handle{ +} +.x-resizable-handle-north{ background-image: url(images/resizable/n.png); } +.x-resizable-handle-south{ background-image: url(images/resizable/s.png); } + +.x-resizable-handle-east{ background-image: url(images/resizable/e.png); } +.x-resizable-handle-west{ background-image: url(images/resizable/w.png); } +.x-resizable-handle-northwest{ background-image: url(images/resizable/nw.png); } +.x-resizable-handle-northeast{ background-image: url(images/resizable/ne.png); } +.x-resizable-handle-southwest{ background-image: url(images/resizable/sw.png); } +.x-resizable-handle-southeast{ background-image: url(images/resizable/se.png); } + +.x-resizable-pinned{ + background: #888; +} + +.x-window-handle, .x-window.x-resizable-pinned{ + background: transparent !important; +} + +/* @end */ + + +/* @group Node Tree */ + +.x-tree .x-panel-body{ + background: #000; +} +.x-tree-node-expanded .x-tree-node-icon{ + background-image:url(images/tree/folder-open.png); +} + +.x-tree-node-leaf .x-tree-node-icon{ + background-image:url(images/tree/leaf.png); +} + +.x-tree-node-collapsed .x-tree-node-icon{ + background-image:url(images/tree/folder.png); +} + +.x-tree-node-loading .x-tree-node-icon{ + background-image:url(images/tree/loading.gif) !important; +} + +.x-tree-node .x-tree-node-inline-icon { + background-image: none; +} + +.x-tree-node-loading a span{ + font-style: italic; + color:#FFF; +} + +.x-tree-lines .x-tree-elbow{ + background-image:url(images/tree/elbow.gif); +} + +.x-tree-lines .x-tree-elbow-plus{ + background-image:url(images/tree/elbow-plus.gif); +} + +.x-tree-lines .x-tree-elbow-minus{ + background-image:url(images/tree/elbow-minus.gif); +} + +.x-tree-lines .x-tree-elbow-end{ + background-image:url(images/tree/elbow-end.gif); +} + +.x-tree-lines .x-tree-elbow-end-plus{ + background-image:url(images/tree/elbow-end-plus.gif); +} + +.x-tree-lines .x-tree-elbow-end-minus{ + background-image:url(images/tree/elbow-end-minus.gif); +} + +.x-tree-lines .x-tree-elbow-line{ + background-image:url(images/tree/elbow-line.gif); +} + +.x-tree-no-lines .x-tree-elbow-plus{ + background-image:url(images/tree/elbow-plus-nl.gif); +} +.x-tree-no-lines .x-tree-elbow-minus{ + background-image:url(images/tree/elbow-minus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-end-plus{ + background-image:url(images/tree/elbow-end-plus-nl.gif); +} + +.x-tree-no-lines .x-tree-elbow-end-minus{ + background-image:url(images/tree/elbow-end-minus-nl.gif); +} + +.x-tree-arrows .x-tree-elbow-plus{ + background-image:url(images/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-minus{ + background-image:url(images/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-end-plus{ + background-image:url(images/tree/arrows.gif); +} + +.x-tree-arrows .x-tree-elbow-end-minus{ + background-image:url(images/tree/arrows.gif); +} + +.x-tree-node{ + color:#FFF; + font: normal 11px arial, tahoma, helvetica, sans-serif; +} + +.x-tree-node a, .x-dd-drag-ghost a{ + color:#FFF; +} + +.x-tree-node a span, .x-dd-drag-ghost a span{ + color:#FFF; +} + +.x-tree-node .x-tree-node-disabled a span{ + color:gray !important; +} + +.x-tree-node div.x-tree-drag-insert-below{ + border-bottom-color: #3fb5ff; +} + +.x-tree-node div.x-tree-drag-insert-above{ + border-top-color:#3fb5ff; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-below a{ + border-bottom-color:#3fb5ff; +} + +.x-tree-dd-underline .x-tree-node div.x-tree-drag-insert-above a{ + border-top-color:#3fb5ff; +} + +.x-tree-node .x-tree-drag-append a span{ + background-color:#444; + border-color:#666; +} + +.x-tree-node .x-tree-node-over { + background-color: #444; +} + +.x-tree-node .x-tree-selected { + background-color: #456; +} + +.x-tree-drop-ok-append .x-dd-drop-icon{ + background-image: url(images/tree/drop-add.png); +} + +.x-tree-drop-ok-above .x-dd-drop-icon{ + background-image: url(images/tree/drop-over.gif); +} + +.x-tree-drop-ok-below .x-dd-drop-icon{ + background-image: url(images/tree/drop-under.gif); +} + +.x-tree-drop-ok-between .x-dd-drop-icon{ + background-image: url(images/tree/drop-between.gif); +} + +/* @end */ + +/* @group Toolbar Icons */ + +.x-toolbar .x-btn-mc em.x-btn-split { + background-image:url(../images/default/btn/s-arrow-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split +{ + background-image:url(../images/default/btn/s-arrow-o.gif); +} + +.x-toolbar .x-btn-mc em.x-btn-split-bottom { + background-image:url(../images/default/btn/s-arrow-b-noline.gif); +} + +.x-toolbar .x-btn-over .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-click .x-btn-mc em.x-btn-split-bottom, +.x-toolbar .x-btn-menu-active .x-btn-mc em.x-btn-split-bottom, .x-toolbar .x-btn-pressed .x-btn-mc em.x-btn-split-bottom +{ + background-image:url(../images/default/btn/s-arrow-bo.gif); +} + +.x-toolbar .xtb-sep { + width: 0; + border-left: 1px solid #222; + border-right: 1px solid #777; +} +.x-tbar-page-first{ + background-image: url(images/icons/first.png) !important; +} + +.x-tbar-loading{ + background-image: url(images/icons/refresh.png) !important; +} + +.x-tbar-page-last{ + background-image: url(images/icons/last.png) !important; +} +.x-tbar-page-next{ + background-image: url(images/icons/next.png) !important; +} + +.x-tbar-page-prev{ + background-image: url(images/icons/prev.png) !important; +} + +.x-item-disabled .x-tbar-loading{ + background-image: url(images/icons/d-refresh.png) !important; +} + +.x-item-disabled .x-tbar-page-first{ + background-image: url(images/icons/d-first.png) !important; +} + +.x-item-disabled .x-tbar-page-last{ + background-image: url(images/icons/d-last.png) !important; +} + +.x-item-disabled .x-tbar-page-next{ + background-image: url(images/icons/d-next.png) !important; +} + +.x-item-disabled .x-tbar-page-prev{ + background-image: url(images/icons/d-prev.png) !important; +} + +.x-paging-info { + color:#444; +} + +.x-toolbar-more-icon { + background-image: url(../images/default/toolbar/more.gif) !important; +} + +/* @end */ + +/* @group Tool Tips */ + +.x-tip{ + color: #FFE; + text-shadow: -1px -1px 0 rgba(0,0,0,.35); +} +.x-tip .x-tip-tl{ + padding-left: 5px; + background:transparent url(images/tt/tl.png) top left no-repeat; +} +.x-tip .x-tip-tr{ + padding-right: 5px; + background:transparent url(images/tt/tr.png) top right no-repeat; +} +.x-tip .x-tip-tc{ + font-family: Optima, sans-serif; + text-transform: uppercase; + letter-spacing: .1em; + font-size: 10px; + padding-bottom: 3px; + padding-top: 5px; + background:transparent url(images/tt/tc.png) top left repeat-x; +} +.x-tip .x-tip-ml{ + padding-left: 5px; + background:transparent url(images/tt/ml.png) top left repeat-y; +} +.x-tip .x-tip-mr{ + padding-right: 5px; + background:transparent url(images/tt/mr.png) top right repeat-y; +} +.x-tip .x-tip-mc{ + background:transparent url(images/tt/c.png) top right repeat; +} +.x-tip .x-tip-bl{ + padding-left: 5px; + background:transparent url(images/tt/bl.png) bottom left no-repeat; +} +.x-tip .x-tip-br{ + padding-right: 5px; + background:transparent url(images/tt/br.png) bottom right no-repeat; +} +.x-tip .x-tip-bc{ + height: 5px; + background:transparent url(images/tt/bc.png) bottom left repeat-x; +} + + /* @group Invalid Tips */ + +.x-form-invalid-tip{ + color: #FCC; + } + .x-form-invalid-tip .x-tip-body{ + background:transparent url(images/icons/exclamation.png) top left no-repeat; + } + .x-form-invalid-tip .x-tip-tl{ + padding-left: 5px; + background:transparent url(images/tt/i-tl.png) top left no-repeat; + } + .x-form-invalid-tip .x-tip-tr{ + padding-right: 5px; + background:transparent url(images/tt/i-tr.png) top right no-repeat; + } + .x-form-invalid-tip .x-tip-tc{ + font-family: Optima, sans-serif; + text-transform: uppercase; + letter-spacing: .1em; + font-size: 10px; + padding-bottom: 3px; + padding-top: 5px; + background:transparent url(images/tt/i-tc.png) top left repeat-x; + } + .x-form-invalid-tip .x-tip-ml{ + padding-left: 5px; + background:transparent url(images/tt/i-ml.png) top left repeat-y; + } + .x-form-invalid-tip .x-tip-mr{ + padding-right: 5px; + background:transparent url(images/tt/i-mr.png) top right repeat-y; + } + .x-form-invalid-tip .x-tip-mc{ + background:transparent url(images/tt/i-c.png) top right repeat; + } + .x-form-invalid-tip .x-tip-bl{ + padding-left: 5px; + background:transparent url(images/tt/i-bl.png) bottom left no-repeat; + } + .x-form-invalid-tip .x-tip-br{ + padding-right: 5px; + background:transparent url(images/tt/i-br.png) bottom right no-repeat; + } + .x-form-invalid-tip .x-tip-bc{ + height: 5px; + background:transparent url(images/tt/i-bc.png) bottom left repeat-x; + } + + /* @end */ + +/* @end */ + +/* @group Slider */ + +.x-slider-horz .x-slider-thumb{ + background-image: url(images/slider/thumbh.png) !important; +} + +.x-slider-vert .x-slider-thumb{ + background-image: url(images/slider/thumbv.png) !important; +} +.x-slider-horz, .x-slider-horz .x-slider-end, .x-slider-horz .x-slider-inner{ + background-image: url(images/slider/h.png) !important; +} +.x-slider-vert, .x-slider-vert .x-slider-end, .x-slider-vert .x-slider-inner{ + background-image: url(images/slider/v.png) !important; +} + +/* @end */ + +/* @group Masked Panel */ + +.ext-el-mask{ + background: #999; +} +.ext-el-mask-msg{ + background: transparent url(images/gloss/gloss.png) center center repeat; + border-bottom-color: #222; + border-top-color: #999; + border-left-color: #444; + border-right-color: #444; + border-radius:4px; +} +.ext-el-mask-msg div{ + background: #000; + border: 1px solid #222; + border-top-color: #222; + border-bottom-color: #999; + border-left-color: #444; + border-right-color: #444; + border-radius:3px; +} +.x-mask-loading div{ + background:#000 url(images/load.gif) 4px 4px no-repeat; +} + +/* @end */ + +/* @group Color Palette */ + +.x-color-palette{ + background: #666 url(images/gradients/30white-to-trans.png) 0 0 repeat-x; + margin: -3px !important; +} +.x-color-palette a{ + color: #000; + border-color: transparent; +} +.x-color-palette .x-color-palette-sel em, .x-color-palette a:hover em{ + border-top-color: #222; + border-left-color: #444; + border-right-color: #444; + border-bottom-color: #666; +} +.x-color-palette .x-color-palette-sel, .x-color-palette a:hover{ + border-top-color: #666 !important; + border-left-color: #444 !important; + border-right-color: #444 !important; + border-bottom-color: #222 !important; + background: #000 url(images/gloss/gloss.png) center center repeat-x; +} + .x-color-palette a:hover{ + border-top-color: #71b3e1 !important; + border-left-color: #3398e1 !important; + border-right-color: #3398e1 !important; + border-bottom-color: #065790 !important; + background-color: #065790; +} + +/* @end */ + +/* @group Drag Proxy */ + +.x-dd-drag-proxy{ + border: 1px solid #000; + background: #000; + border-radius:3px; +} +.x-dd-drag-ghost{ + border-radius:2px; + background: #000 url(images/gloss/gloss.png) center center repeat-x; + border-top: 1px solid #AAA; + border-bottom: 1px solid #222; + border-left: 1px solid #444; + border-right: 1px solid #444; +} +.x-dd-drop-ok .x-dd-drop-icon{ + background-image: url(images/icons/yes.png); +} +.x-dd-drop-nodrop .x-dd-drop-icon{ + background-image: url(images/icons/no.png); +} + +/* @end */ + +/* @group Accordion */ + +.x-accordion-hd{ + border-top: 1px solid #CCC !important; + border-bottom: 1px solid #444 !important; + background: #666 url(images/gradients/30white-to-trans.png) left top repeat-x; + font-family: Helvetica, Arial, sans-serif; + font-size: .9em; +} +.x-panel-collapsed .x-accordion-hd{ + border-bottom: 1px solid #222 !important; + background: #333 url(images/gradients/30white-to-trans.png) left top repeat-x; +} +.x-accordion-hd .x-panel-header-text{ + text-shadow: -1px -1px 0 rgba(0,0,0,.35); +} + +/* @end */ + +/* @group Group Summary */ + +.x-grid3-summary-row{ + background: transparent url(images/fills/80b.png) left top repeat; +} + +/* @end */ + diff --git a/contrib/gilbert/media/gilbert/wallpaper.README b/contrib/gilbert/media/gilbert/wallpaper.README new file mode 100644 index 0000000..a14fe2e --- /dev/null +++ b/contrib/gilbert/media/gilbert/wallpaper.README @@ -0,0 +1 @@ +The source of the default wallpaper.jpg is http://webtreats.mysitemyway.com/tileable-classic-nebula-space-patterns/ \ No newline at end of file diff --git a/contrib/gilbert/media/gilbert/wallpaper.jpg b/contrib/gilbert/media/gilbert/wallpaper.jpg new file mode 100644 index 0000000..6188914 Binary files /dev/null and b/contrib/gilbert/media/gilbert/wallpaper.jpg differ diff --git a/contrib/gilbert/plugins.py b/contrib/gilbert/plugins.py new file mode 100644 index 0000000..80ef1ab --- /dev/null +++ b/contrib/gilbert/plugins.py @@ -0,0 +1,167 @@ +from inspect import isclass, getargspec +from functools import wraps +from django.utils.encoding import force_unicode +from django.forms.widgets import Widget, Input, HiddenInput, FileInput, DateInput, TimeInput, Textarea, CheckboxInput, Select, SelectMultiple +from django.forms.fields import FileField +from django.forms.forms import BaseForm + + +def _render_ext(self, name, value): + ext_spec = {'name': name} + if value is not None: + ext_spec['value'] = value + if isinstance(self, Input): + if isinstance(self, HiddenInput): + ext_spec['xtype'] = 'hidden' + elif isinstance(self, FileInput): + ext_spec['xtype'] = 'fileuploadfield' + elif isinstance(self, DateInput): + ext_spec['xtype'] = 'datefield' + elif isinstance(self, TimeInput): + ext_spec['xtype'] = 'timefield' + else: + ext_spec['xtype'] = 'textfield' + ext_spec['inputType'] = self.input_type + elif isinstance(self, Textarea): + ext_spec['xtype'] = 'textarea' + elif isinstance(self, CheckboxInput): + ext_spec['xtype'] = 'checkbox' + elif isinstance(self, Select): + ext_spec['xtype'] = 'combo' + ext_spec['store'] = self.choices + ext_spec['typeAhead'] = True + if isinstance(self, SelectMultiple): + pass + if ext_spec: + return ext_spec + return None + + +Widget.render_ext = _render_ext + + +def _as_ext(self): + ext_spec = {} + + fields = [] + for bf in self: + if bf.label: + label = force_unicode(bf.label) + else: + label = '' + + if bf.field.show_hidden_initial: + only_initial = True + else: + only_initial = False + + widget = bf.field.widget + + if not self.is_bound: + data = self.initial.get(bf.name, bf.field.initial) + if callable(data): + data = data() + else: + if isinstance(bf.field, FileField) and bf.data is None: + data = self.initial.get(bf.name, bf.field.initial) + else: + data = bf.data + if not only_initial: + name = bf.html_name + else: + name = bf.html_initial_name + + rendered = widget.render_ext(name, data) + if rendered is not None: + rendered['fieldLabel'] = label + fields.append(rendered) + ext_spec['items'] = fields + ext_spec['labelSeparator'] = self.label_suffix + return ext_spec + + +BaseForm.as_ext = _as_ext + + +def is_gilbert_method(function): + return getattr(function, 'gilbert_method', False) + + +def gilbert_method(function=None, name=None, argc=None, form_handler=False, restricted=True): + def setter(function): + setattr(function, 'gilbert_method', True) + setattr(function, 'name', name or function.__name__) + setattr(function, 'form_handler', form_handler) + setattr(function, 'restricted', restricted) + new_argc = argc + if new_argc is None: + args = getargspec(function)[0] + new_argc = len(args) + if new_argc > 0: + if args[0] == 'self': + args = args[1:] + new_argc = new_argc - 1 + if new_argc > 0: + if args[0] == 'request': + args = args[1:] + new_argc = new_argc - 1 + setattr(function, 'argc', new_argc) + return function + if function is not None: + return setter(function) + return setter + + +class GilbertPluginBase(type): + def __new__(cls, name, bases, attrs): + if 'methods' not in attrs: + methods = [] + for attr in attrs.values(): + if is_gilbert_method(attr): + methods.append(attr.name) + attrs['methods'] = methods + return super(GilbertPluginBase, cls).__new__(cls, name, bases, attrs) + + +class GilbertPlugin(object): + __metaclass__ = GilbertPluginBase + + def __init__(self, site): + self.site = site + + def get_method(self, method_name): + method = getattr(self, method_name, None) + if not is_gilbert_method(method): + return None + return method + + @property + def urls(self): + return [] + + @property + def js(self): + return [] + + @property + def css(self): + return [] + + @property + def fugue_icons(self): + return [] + + +class GilbertModelAdmin(GilbertPlugin): + def __init__(self, site, model): + self.model = model + self.name = model._meta.object_name + super(GilbertModelAdmin, self).__init__(site) + + @gilbert_method + def all(self): + return list(self.model._default_manager.all().values()) + + @gilbert_method + def get(self, constraint): + return self.model._default_manager.all().values().get(**constraint) \ No newline at end of file diff --git a/contrib/gilbert/sites.py b/contrib/gilbert/sites.py new file mode 100644 index 0000000..8f666f9 --- /dev/null +++ b/contrib/gilbert/sites.py @@ -0,0 +1,248 @@ +from django.contrib.admin.sites import AdminSite +from django.contrib.auth import authenticate, login, logout +from django.conf.urls.defaults import url, patterns, include +from django.core.urlresolvers import reverse +from django.shortcuts import render_to_response +from django.conf import settings +from django.utils import simplejson as json +from django.utils.datastructures import SortedDict +from django.http import HttpResponse +from django.db.models.base import ModelBase +from philo.utils import fattr +from philo.contrib.gilbert.plugins import GilbertModelAdmin, GilbertPlugin, is_gilbert_method, gilbert_method +from philo.contrib.gilbert.exceptions import AlreadyRegistered, NotRegistered +from django.forms.models import model_to_dict +import sys +from traceback import format_tb +from inspect import getargspec +from django.views.decorators.cache import never_cache +from philo.contrib.gilbert import __version__ as gilbert_version +import staticmedia +import os + +__all__ = ('GilbertSite', 'site') + + +class GilbertAuthPlugin(GilbertPlugin): + name = 'auth' + + @property + def js(self): + return [staticmedia.url('gilbert/Gilbert.api.auth.js')] + + @property + def fugue_icons(self): + return ['user-silhouette', 'key--pencil', 'door-open-out', 'door-open-in'] + + @gilbert_method(restricted=False) + def login(self, request, username, password): + user = authenticate(username=username, password=password) + if user is not None and user.is_active: + login(request, user) + return True + else: + return False + + @gilbert_method + def logout(self, request): + logout(request) + return True + + @gilbert_method + def get_passwd_form(self, request): + from django.contrib.auth.forms import PasswordChangeForm + return PasswordChangeForm(request.user).as_ext() + + @gilbert_method(form_handler=True) + def submit_passwd_form(self, request): + from django.contrib.auth.forms import PasswordChangeForm + form = PasswordChangeForm(request.user, data=request.POST) + if form.is_valid(): + form.save() + return {'success': True} + else: + return {'success': False, 'errors': form.errors} + + @gilbert_method + def whoami(self, request): + user = request.user + return user.get_full_name() or user.username + + +class GilbertSite(object): + version = gilbert_version + + def __init__(self, namespace='gilbert', app_name='gilbert', title='Gilbert'): + self.namespace = namespace + self.app_name = app_name + self.title = title + self.model_registry = SortedDict() + self.plugin_registry = SortedDict() + self.register_plugin(GilbertAuthPlugin) + + def register_plugin(self, plugin): + if plugin.name in self.plugin_registry: + raise AlreadyRegistered('A plugin named \'%s\' is already registered' % plugin.name) + self.plugin_registry[plugin.name] = plugin(self) + + def register_model(self, model_or_iterable, admin_class=GilbertModelAdmin, **admin_attrs): + if isinstance(model_or_iterable, ModelBase): + model_or_iterable = [model_or_iterable] + for model in model_or_iterable: + if model._meta.app_label not in self.model_registry: + self.model_registry[model._meta.app_label] = SortedDict() + if model._meta.object_name in self.model_registry[model._meta.app_label]: + raise AlreadyRegistered('The model %s.%s is already registered' % (model._meta.app_label, model.__name__)) + if admin_attrs: + admin_attrs['__module__'] = __name__ + admin_class = type('%sAdmin' % model.__name__, (admin_class,), admin_attrs) + self.model_registry[model._meta.app_label][model._meta.object_name] = admin_class(self, model) + + def has_permission(self, request): + return request.user.is_active and request.user.is_staff + + @property + def urls(self): + urlpatterns = patterns('', + url(r'^$', self.index, name='index'), + url(r'^css$', self.css, name='css'), + url(r'^api$', self.api, name='api'), + url(r'^router/?$', self.router, name='router'), + url(r'^router/models/(?P\w+)/?$', self.router, name='models'), + url(r'^login$', self.router, name='login'), + ) + + return (urlpatterns, self.app_name, self.namespace) + + def request_context(self, request, extra_context=None): + from django.template import RequestContext + context = RequestContext(request, current_app=self.namespace) + context.update(extra_context or {}) + context.update({'gilbert': self, 'user': request.user, 'logged_in': self.has_permission(request)}) + return context + + @never_cache + def index(self, request, extra_context=None): + return render_to_response('gilbert/index.html', context_instance=self.request_context(request, extra_context)) + + def css(self, request, extra_context=None): + icon_names = [] + for plugin in self.plugin_registry.values(): + icon_names.extend(plugin.fugue_icons) + + icons = dict([(icon_name, staticmedia.url('gilbert/fugue-icons/icons/%s.png' % icon_name)) for icon_name in set(icon_names)]) + + context = extra_context or {} + context.update({'icons': icons}) + + return render_to_response('gilbert/styles.css', context_instance=self.request_context(request, context), mimetype='text/css') + + @never_cache + def api(self, request, extra_context=None): + providers = [] + for app_label, models in self.model_registry.items(): + app_provider = { + 'namespace': 'Gilbert.api.models.%s' % app_label, + 'url': reverse('%s:models' % self.namespace, current_app=self.app_name, kwargs={'app_label': app_label}), + 'type': 'remoting', + } + model_actions = {} + for model_name, admin in models.items(): + model_methods = [] + for method in [admin.get_method(method_name) for method_name in admin.methods]: + if method.restricted and not self.has_permission(request): + continue + model_methods.append({ + 'name': method.name, + 'len': method.argc, + 'formHandler': method.form_handler, + }) + if model_methods: + model_actions[model_name] = model_methods + if model_actions: + app_provider['actions'] = model_actions + providers.append(app_provider) + + plugin_provider = { + 'namespace': 'Gilbert.api', + 'url': reverse('%s:router' % self.namespace, current_app=self.app_name), + 'type': 'remoting', + } + plugin_actions = {} + for plugin_name, plugin in self.plugin_registry.items(): + plugin_methods = [] + for method in [plugin.get_method(method_name) for method_name in plugin.methods]: + if method.restricted and not self.has_permission(request): + continue + plugin_methods.append({ + 'name': method.name, + 'len': method.argc, + 'formHandler': method.form_handler, + }) + if plugin_methods: + plugin_actions[plugin_name] = plugin_methods + if plugin_actions: + plugin_provider['actions'] = plugin_actions + providers.append(plugin_provider) + + return HttpResponse(''.join(['Ext.Direct.addProvider('+json.dumps(provider, separators=(',', ':'))+');' for provider in providers]), mimetype='text/javascript') + + def router(self, request, app_label=None, extra_context=None): + submitted_form = False + if request.META['CONTENT_TYPE'].startswith('application/x-www-form-urlencoded'): + submitted_form = True + + if submitted_form: + ext_request = { + 'action': request.POST.get('extAction'), + 'method': request.POST.get('extMethod'), + 'type': request.POST.get('extType'), + 'tid': request.POST.get('extTID'), + 'upload': request.POST.get('extUpload', False), + 'data': None, + } + response = self.handle_ext_request(request, ext_request, app_label) + else: + ext_requests = json.loads(request.raw_post_data) + if type(ext_requests) is dict: + ext_requests['upload'] = False + response = self.handle_ext_request(request, ext_requests, app_label) + else: + responses = [] + for ext_request in ext_requests: + ext_request['upload'] = False + responses.append(self.handle_ext_request(request, ext_request, app_label)) + response = responses + + if submitted_form: + if ext_request['upload'] is True: + return HttpResponse(('' % json.dumps(response))) + return HttpResponse(json.dumps(response), content_type=('application/json; charset=%s' % settings.DEFAULT_CHARSET)) + + def handle_ext_request(self, request, ext_request, app_label=None): + try: + plugin = None + + if app_label is not None: + try: + plugin = self.model_registry[app_label][ext_request['action']] + except KeyError: + raise NotImplementedError('A model named \'%s\' has not been registered' % ext_request['action']) + else: + try: + plugin = self.plugin_registry[ext_request['action']] + except KeyError: + raise NotImplementedError('Gilbert does not provide a class named \'%s\'' % ext_request['action']) + + method = plugin.get_method(ext_request['method']) + + if method is None or (method.restricted and not self.has_permission(request)): + raise NotImplementedError('The method named \'%s\' is not available' % method.name) + + return {'type': 'rpc', 'tid': ext_request['tid'], 'action': ext_request['action'], 'method': ext_request['method'], 'result': method(request, *(ext_request['data'] or []))} + except: + exc_type, exc_value, exc_traceback = sys.exc_info() + return {'type': 'exception', 'tid': ext_request['tid'], 'message': ('%s: %s' % (exc_type, exc_value)), 'where': format_tb(exc_traceback)[0]} + + +site = GilbertSite() \ No newline at end of file diff --git a/contrib/gilbert/templates/gilbert/index.html b/contrib/gilbert/templates/gilbert/index.html new file mode 100644 index 0000000..91d293f --- /dev/null +++ b/contrib/gilbert/templates/gilbert/index.html @@ -0,0 +1,86 @@ +{% load staticmedia %} + + +{% block head %} + {% block title %}{{ gilbert.title }}{% endblock %} + + {% block css %} + + + + {% for plugin in gilbert.plugin_registry.values %}{% for css in plugin.css %} + + {% endfor %}{% endfor %} + {% endblock %} + + {% block js %} + + + + + + + {% for plugin in gilbert.plugin_registry.values %}{% for js in plugin.js %} + + {% endfor %}{% endfor %} + + {% endblock %} + +{% endblock %} +{% block body %}{% endblock %} + diff --git a/contrib/gilbert/templates/gilbert/styles.css b/contrib/gilbert/templates/gilbert/styles.css new file mode 100644 index 0000000..bf74df0 --- /dev/null +++ b/contrib/gilbert/templates/gilbert/styles.css @@ -0,0 +1 @@ +{% for icon, url in icons.items %}.{{icon}}{background:url({{ url }}) left center no-repeat !important;}{% endfor %} \ No newline at end of file