Author: jmorliaguet
Date: Thu May 25 11:21:34 2006
New Revision: 3211

Added:
   cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css   
(contents, props changed)
   cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.js   
(contents, props changed)
   cpsskins/branches/paris-sprint-2006/ui/screens/definitions.py   (contents, 
props changed)
Modified:
   cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml
   cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py
   cpsskins/branches/paris-sprint-2006/ui/zmi/views.py

Log:

- reorganized folders



Added: cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css
==============================================================================
--- (empty file)
+++ cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.css Thu May 
25 11:21:34 2006
@@ -0,0 +1,263 @@
+
+html {
+  overflow-y: expression('hidden'); /* IE */
+}
+
+body {
+  margin: 0;
+  padding: 0;
+  overflow-y: expression('auto'); /* IE */
+  height: expression('100%'); /* IE */
+  font: 12px Arial, Helvetica, sans-serif;
+}
+
+#editArea {
+  border-top: 2px solid #000;
+  margin-top: 50px;
+}
+
+#mainArea {
+  padding: 1em;
+}
+
+div.locationSelector {
+  background-color: #eee;
+  font-size: 12px;
+  padding: 0.2em;
+  border-bottom: 1px solid #ccc;
+  margin-bottom: 0.5em;
+}
+
+div.floatingHeader {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  background: #aaa url(/++skin++cpsskins/@@/gray-gradient.png) bottom left 
repeat-x;
+  border-bottom: 1px solid #000;
+  height: 50px;
+  z-index: 10;
+}
+
+div.floatingFooter {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  background-color: #999;
+  border-top: 2px solid #666;
+  height: 25px;
+  z-index: 20;
+}
+
+.toolbox {
+  position: relative;
+  text-align: center;
+  cursor: default;
+  margin-left: auto;
+  margin-right: auto;
+  background-color: #f6f6f6;
+  border-width: 1px;
+  border-style: solid;
+  border-color: #000;
+}
+
+.toolbox td {
+  background-color: #f6f6f6;
+}
+
+.toolbox td:hover {
+  background-color: #fc6; 
+}
+
[EMAIL PROTECTED] screen {
+body > div.floatingHeader {
+  position: fixed; }
+}
+
[EMAIL PROTECTED] screen {
+body > div.floatingFooter {
+  position: fixed; }
+}
+
+/* toolbar buttons */
+.actionPad {
+  padding-top: 12px;
+  padding-left: 5px;
+}
+
+.actionPad a {
+  font-size: 12px;
+  color: #000 !important;
+  background: #f3f0f0;
+  text-decoration: none;
+  border: 1px;
+  border-style: solid;
+  border-color: #fff #000 #000 #fff;
+  padding: 3px 4px 3px 4px;
+  margin: 0 0 0 4px;
+}
+
+.actionPad a.selected, .actionPad a:hover {
+  background-color: #f9ff50;
+  border-width: 1px;
+  border-style: solid;
+  border-color: #333 #ccc #ccc #333;
+}
+
+.actionPad a.exit {
+  background-color: #dfb;
+  border-color: #ccc #333 #333 #ccc;
+}
+
+.formClose {
+  margin-top: 20px;
+  text-align: center;
+}
+
+
+/* Theme tabs */
+.topTabs {
+  background-color: #000;
+  width: 100%;
+  margin-bottom: 3px;
+  margin-top: 0px;
+  text-align: center;
+}
+
+.topTabs img {
+  vertical-align: top;
+}
+
+.topTabs, .topTabs a {
+  text-decoration: none;
+  font-size: 11px;
+  color: #000;
+}
+
+.topTabs tr {
+  background-color: #000;
+  height: 17px;
+}
+
+.topTabs .ltab, .topTabs .rtab {
+  background-color: #e3e3e3;
+  vertical-align: top;
+  width: 5px;
+  border-bottom: 1px solid #ccc;
+}
+
+.topTabs .separator {
+  background-color: #000;
+  width: 2px;
+  border: none;
+}
+
+.topTabs .ltabselected, .topTabs .rtabselected {
+  background-color: #fff;
+  vertical-align: top;
+  width: 5px;
+}
+
+.topTabs .tabselected {
+  background-color: #fff;
+}
+
+.topTabs a {
+  color: #000;
+}
+
+.topTabs .tab {
+  background-color : #e3e3e3;
+  border-bottom: 1px solid #ccc;
+}
+
+
+/* Page tabs */
+.pageTabs {
+  text-align: left;
+  text-decoration: none;
+  font-size: 11px;
+  border-bottom: 1px dotted #ccc;
+  margin-bottom: 15px;
+  margin-top: 7px;
+  margin-left: 0;
+  padding-left: 0;
+}
+
+.pageTabs li {
+  display: inline;
+  text-decoration: none;
+  padding: 0 0 0 20px;
+  background: #e3e3e3 url(/++skin++cpsskins/@@/tl-tab.png) top left no-repeat;
+}
+
+.pageTabs li.selected {
+  border-bottom: 1px solid #f0f0f0;
+  background: url(/++skin++cpsskins/@@/tl-tab-sel.png) top left no-repeat;
+}
+
+.pageTabs a {
+  color: #000;
+  text-decoration: none;
+  padding: 0 20px 0 0;
+  background: url(/++skin++cpsskins/@@/tr-tab.png) top right no-repeat;
+}
+
+.pageTabs li.selected a {
+  background: url(/++skin++cpsskins/@@/tr-tab-sel.png) top right no-repeat;
+}
+
+.pageTabs a.addItem {
+  padding-left: 10px;
+  padding-right: 10px;
+}
+
+.pageTabs img {
+  vertical-align: top;
+}
+
+.pageModes {
+  float: right;
+  padding: 0.5em
+}
+
+.pageModes a {
+  padding: 2px 5px;
+  background-color: #f6f3f3;
+  color: #006;
+}
+.perspective {
+  position: absolute;
+  right: 13px;
+  top: 8px;
+  font-size: 11px;
+  background-image: url(/++skin++cpsskins/@@/perspective-12.png);
+  background-repeat: no-repeat;
+  background-position: 5% 50%;
+  background-color: #fff;
+  padding: 0.3em 1.4em 0.3em 2.1em;
+  border: 1px solid #666;
+  color: #333;
+  -moz-border-radius: 5px;
+}
+
+
+/* inline editing of portlets and of canvas elements  */
+
+/* Macro slots */
+
+.mainContentAreaFrame {
+  font: 14px Trebuchet MS, Verdana, Arial, Sans-Serif;
+  text-align: center;
+  background-color: #ffe;
+  padding: 0.5em;
+  height: 100px;
+  border: 1px dotted #666;
+}
+
+.container {
+  min-height: 40px;
+  height: expression('40px'); /* for IE 'height' is 'min-height' */
+}
+

Added: cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.js
==============================================================================
--- (empty file)
+++ cpsskins/branches/paris-sprint-2006/ui/screens/common/authoring.js  Thu May 
25 11:21:34 2006
@@ -0,0 +1,113 @@
+
+function editSetting(uri) {
+  CPSSkins.getModelById('setting-editor').updateData({'form': {'uri': uri} });
+  CPSSkins.getControllerById('site-manager-perspectives').switchTo(
+  'setting-editor');
+}
+
+function createSetting(section, uri) {
+  CPSSkins.getModelById('settings-section').setData(
+  {form: {section: section, uri: uri, create: 1}});
+  CPSSkins.getControllerById('main-editor-perspectives').switchTo(
+  'site-manager');
+  CPSSkins.getControllerById('site-manager-perspectives').switchTo(
+  'settings');
+}
+
+function insertPortlet(info) {
+  var url = '@@insertElement'
+  var args = {
+    id: info.target.getAttribute('targetid'),
+    type_name: info.source.getAttribute('type_name'),
+    order: 0
+  }
+  var options = {
+    parameters: $H(args).toQueryString(),
+    onComplete: function(req) {
+      var controller = info.context;
+      controller.refreshViews();
+    }
+  };
+  new Ajax.Request(url, options);
+}
+
+function moveElement(info) {
+  var url = '@@moveElement'
+  var args = {
+    src_id: info.source.getAttribute('id'),
+    dest_id: info.target.getAttribute('id'),
+    order: 0
+  }
+  var options = {
+    parameters: $H(args).toQueryString()
+  };
+  new Ajax.Request(url, options);
+}
+
+function editElement(info) {
+  var id = info.target.getAttribute('targetid');
+  CPSSkins.getModelById('element-editor').updateData({
+    form: {id: id, format: ''}
+  });
+  CPSSkins.getControllerById('main-editor-perspectives').switchTo(
+  'element-editor');
+  var style_editor_model = CPSSkins.getModelById('style-editor');
+  if (style_editor_model) style_editor_model.updateData({widget: ''});
+}
+
+function duplicateElement(info) {
+  var url = '@@duplicateElement';
+  var args = {
+    id: info.target.getAttribute('id')
+  }
+  var controller = info.context;
+  var options = {
+    parameters: $H(args).toQueryString(),
+    onComplete: function(req) {
+      controller.refreshViews();
+    }
+  }
+  new Ajax.Request(url, options);
+}
+
+function deleteElement(info) {
+  var url = '@@deleteElement'
+  var args = {
+    id: info.target.getAttribute('id')
+  }
+  var controller = info.context;
+  var options = {
+    parameters: $H(args).toQueryString(),
+    onComplete: function(req) {
+      controller.refreshViews();
+    }
+  }
+  new Ajax.Request(url, options);
+}
+
+StyleSheet = Class.create();
+StyleSheet.prototype = Object.extend(new CPSSkins.View(), {
+  render: function(data) {
+    this.widget.href = './renderCSS?timestamp=' + new Date().getTime();
+  }
+});
+
+/* Register actions */
+CPSSkins.addActions({
+  'insert portlet': insertPortlet,
+  'move element': moveElement,
+  'duplicate element': duplicateElement,
+  'edit element': editElement
+});
+
+/* Register widgets */
+CPSSkins.registerWidgets({
+  'stylesheet': function(def) {
+    var widget = CPSSkins.Canvas.createNode({
+      tag: "link",
+      attributes: {rel: 'stylesheet', type: 'text/css'}
+    });
+    return new StyleSheet(widget, def);
+  }
+});
+

Modified: cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml
==============================================================================
--- cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml        
(original)
+++ cpsskins/branches/paris-sprint-2006/ui/screens/common/configure.zcml        
Thu May 25 11:21:34 2006
@@ -2,6 +2,14 @@
     xmlns="http://namespaces.zope.org/browser";
     xmlns:zope="http://namespaces.zope.org/zope";>
 
+  <browser:resource
+      name="authoring.css" file="authoring.css"
+      layer="cpsskins.browser.skin.cpsskins" />
+
+  <browser:resource
+      name="authoring.js" file="authoring.js"
+      layer="cpsskins.browser.skin.cpsskins" />
+
   <pages
       for="*"
       layer="cpsskins.browser.skin.cpsskins"
@@ -80,4 +88,162 @@
 
   </pages>
 
+  <!-- authoring -->
+
+  <browser:view
+    for="*"
+    name="authoring"
+    provides=".views.IAuthoring"
+    class=".views.Authoring"
+    permission="zope.Public"
+    allowed_interface=".views.IAuthoring"
+    layer="cpsskins.browser.skin.cpsskins"
+  />
+
+  <browser:pages
+      for="*"
+      layer="cpsskins.browser.skin.cpsskins"
+      permission="zope.ManageContent"
+      class=".views.Authoring">
+
+      <browser:page
+          name="getThemeManager"
+          attribute="getThemeManager"
+      />
+ 
+      <browser:page
+          name="setSelection"
+          attribute="setSelection"
+      />
+
+      <browser:page
+          name="getSelection"
+          attribute="getSelection"
+      />
+
+      <browser:page
+          name="setPerspective"
+          attribute="setPerspective"
+      />
+
+      <browser:page
+        name="setWorkTheme"
+        attribute="setWorkTheme"
+      />
+
+      <browser:page
+          name="addTheme"
+          attribute="addTheme"
+      />
+
+      <browser:page
+          name="addPage"
+          attribute="addPage"
+      />
+
+      <browser:page
+          name="clonePresentation"
+          attribute="clonePresentation"
+      />
+
+      <browser:page
+          name="addPresentation"
+          attribute="addPresentation"
+      />
+
+      <browser:page
+          name="removePresentation"
+          attribute="removePresentation"
+      />
+
+      <browser:page
+          name="customizeFormat"
+          attribute="customizeFormat"
+      />
+
+      <browser:page
+          name="uncustomizeFormat"
+          attribute="uncustomizeFormat"
+      />
+
+      <browser:page
+          name="renderElement"
+          attribute="renderElement"
+      />
+
+      <browser:page
+          name="moveElement"
+          attribute="moveElement"
+      />
+
+      <browser:page
+          name="editElement"
+          attribute="editElement"
+      />
+
+      <browser:page
+          name="copyElement"
+          attribute="copyElement"
+      />
+
+      <browser:page
+          name="pasteElement"
+          attribute="pasteElement"
+      />
+
+      <browser:page
+          name="moveDown"
+          attribute="moveDown"
+      />
+
+      <browser:page
+          name="moveUp"
+          attribute="moveUp"
+      />
+
+      <browser:page
+          name="insertElement"
+          attribute="insertElement"
+      />
+
+      <browser:page
+          name="duplicateElement"
+          attribute="duplicateElement"
+      />
+
+      <browser:page
+          name="deleteElement"
+          attribute="deleteElement"
+      />
+
+  </browser:pages>
+
+  <browser:pages
+      layer="cpsskins.browser.skin.cpsskins"
+      for="*"
+      permission="zope.ManageContent"
+      class=".views.JSONViews">
+
+      <browser:page
+          name="getHint"
+          attribute="getHint"
+      />
+
+      <browser:page
+          name="getModel"
+          attribute="getModel"
+      />
+
+      <browser:page
+          name="getView"
+          attribute="getView"
+      />
+
+      <browser:page
+          name="getController"
+          attribute="getController"
+      />
+
+  </browser:pages>
+
 </configure>

Modified: cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py
==============================================================================
--- cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py      
(original)
+++ cpsskins/branches/paris-sprint-2006/ui/screens/common/views.py      Thu May 
25 11:21:34 2006
@@ -17,13 +17,32 @@
 """
 __docformat__ = "reStructuredText"
 
-from zope.component import getMultiAdapter, queryMultiAdapter
+from zope.app.session.interfaces import ISession
+from zope.app.zapi import getParent
+from zope.component import adapts, getUtility, createObject, getMultiAdapter
+from zope.component import queryMultiAdapter
+from zope.event import notify
+from zope.i18nmessageid import MessageFactory
 from zope.interface import implements, Interface
+from zope.lifecycleevent import ObjectCreatedEvent
 from zope.location.traversing import LocationPhysicallyLocatable
 from zope.traversing.api import getParent
 
+from cpsskins import minjson as json
 from cpsskins.browser.negotiation.interfaces import INegotiation
+from cpsskins.browser.tree.interfaces import INodeAdding, INodeRemoving
+from cpsskins.browser.tree.interfaces import INodeMoving, INodeOrdering
+from cpsskins.browser.tree.interfaces import INodeDuplicating
 from cpsskins.browser.rendering.interfaces import IViewer
+from cpsskins.elements.theme import Theme
+from cpsskins.elements.themepage import ThemePage
+from cpsskins.elements.interfaces import IElement, IPresentable, IDisplayable
+from cpsskins.elements.interfaces import IInnerNode
+from cpsskins.setup.interfaces import IResourceManager
+from cpsskins.ui.screens.definitions import MODELS, VIEWS, CONTROLLERS
+from cpsskins.utils import getThemeManager
+
+_ = MessageFactory("cpsskins")
 
 class IEditing(Interface):
 
@@ -81,3 +100,299 @@
         viewer = getMultiAdapter((page, self.request), IViewer)
         return viewer(engine=engine)
 
+class IAuthoring(Interface):
+    """Authoring views"""
+
+class Authoring(object):
+    """Authoring views"""
+
+    implements(IAuthoring)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+        self.tmutil = getThemeManager(context)
+
+    def getSessionInfo(self):
+        s = ISession(self.request, None)
+        if s is not None:
+            return s['cpsskins']
+        return None
+
+    def getThemeManager(self):
+        return self.tmutil
+
+    def _redirect(self):
+        request = self.request
+        target = request.get('HTTP_REFERER', '.')
+        request.response.redirect(target)
+
+    def draw(self, **kw):
+        """Draws a the canvas element in edit mode
+        """
+        viewer = getMultiAdapter((self.context, self.request), IViewer)
+        return viewer(**kw)
+
+    def setSelection(self, **kw):
+        """Set the selection.
+        """
+        kw.update(self.request.form)
+        session_info = self.getSessionInfo()
+        session_info['selection'] = kw
+        self._redirect()
+
+    def getSelection(self):
+        session_info = self.getSessionInfo()
+        return session_info.get('selection', {})
+
+    def setPerspective(self, perspective=u''):
+        """Set the perspective
+        """
+        session_info = self.getSessionInfo()
+        if not perspective:
+            del session_info['perspective']
+        else:
+            session_info['perspective'] = perspective
+        self._redirect()
+
+    def setWorkTheme(self, name=u''):
+        """Set the work theme.
+        """
+        response = self.request.response
+        response.setCookie('cpsskins_theme', name)
+        response.redirect('.')
+
+    def setWorkPage(self, name=u''):
+        """Set the work page.
+        """
+        response = self.request.response
+        response.setCookie('cpsskins_page', name)
+        response.redirect('.')
+
+    def addTheme(self):
+        """Add a theme.
+        """
+        response = self.request.response
+        theme = Theme()
+        self.tmutil.addTheme(theme)
+        response.redirect('.')
+
+    def addPage(self):
+        """Add a page.
+        """
+        response = self.request.response
+        negotiation = getMultiAdapter((self.context, self.request),
+                                      INegotiation, 'negotiation')
+        theme = negotiation.getTheme()
+        page = ThemePage()
+        self.tmutil.addPage(theme, page)
+        response.redirect('.')
+
+    ### Presentation  #################################################
+
+    def clonePresentation(self, perspective=None):
+        """Clone a view in a given perspective by:
+
+        - assigning a new display to it
+
+        - by associating the original display's formats to the new display
+
+        """
+        perspectives = getUtility(IResourceManager, 'perspectives')
+        perspective = perspectives.lookup(perspective, context=self.context)
+        display = IDisplayable(self.context).getDisplay(perspective)
+        if display is None:
+            IPresentable(self.context).clonePresentation(perspective)
+        self._redirect()
+
+    def addPresentation(self, perspective=None):
+        perspectives = getUtility(IResourceManager, 'perspectives')
+        perspective = perspectives.lookup(perspective, context=self.context)
+        IPresentable(self.context).addPresentation(perspective)
+        self._redirect()
+
+    def removePresentation(self, perspective=None):
+        perspectives = getUtility(IResourceManager, 'perspectives')
+        perspective = perspectives.lookup(perspective, context=self.context)
+        IPresentable(self.context).removePresentation(perspective)
+        self._redirect()
+
+    ### Format  #######################################################
+
+    def customizeFormat(self, name=u'', perspective=None):
+        perspectives = getUtility(IResourceManager, 'perspectives')
+        perspective = perspectives.lookup(perspective, context=self.context)
+        IPresentable(self.context).customizeFormat(name, perspective)
+        self._redirect()
+
+    def uncustomizeFormat(self, name=u'', perspective=None):
+        perspectives = getUtility(IResourceManager, 'perspectives')
+        perspective = perspectives.lookup(perspective, context=self.context)
+        IPresentable(self.context).uncustomizeFormat(name, perspective)
+        self._redirect()
+
+    ### Elements  #####################################################
+
+    def _getElementById(self, id):
+        """Return an element by id.
+        """
+        return self.tmutil.getElementById(id)
+
+    def renderElement(self, id=u'', engine=u'default'):
+        """Render the element and return the markup
+        """
+        element = self._getElementById(id)
+        request = self.request
+
+        viewer = getMultiAdapter((element, request), IViewer)
+        return viewer(engine=engine)
+
+    def editElement(self, id, name, value):
+        """Edit the element: assign a value to an attribute (name).
+        """
+        element = self._getElementById(id)
+        _marker = object()
+
+        if getattr(element, name, _marker) is not _marker:
+            setattr(element, name, value)
+        else:
+            element[name] = value
+
+    def copyElement(self, id):
+        """Copy an element to the clipboard.
+        """
+        request = self.request
+        element = self._getElementById(id)
+        container = getParent(element)
+        request.form['ids'] = [zapi.name(element)]
+        view = Contents(container, request)
+        view.copyObjects()
+
+    def pasteElement(self, id):
+        """Paste an element from the clipboard.
+        """
+        request = self.request
+        element = self._getElementById(id)
+        container = getParent(element)
+        view = Contents(container, request)
+        view.pasteObjects()
+
+    def insertElement(self, id, type_name, order):
+        """Insert an element inside a container at a given position.
+        Return the id of inserted element.
+        """
+        request = self.request
+        dest_element = self._getElementById(id)
+        if IInnerNode.providedBy(dest_element):
+            container = dest_element
+        else:
+            container = getParent(dest_element)
+            order = self.getElementOrder(id)
+
+        content = createObject(type_name)
+        notify(ObjectCreatedEvent(content))
+
+        adding = getMultiAdapter((container, request), INodeAdding)
+
+        added = adding.add(content)
+        added_id = added.identifier
+        self.setElementOrder(added_id, int(order))
+        return str(added_id)
+
+    def moveUp(self, id):
+        """Move the element upward.
+        """
+        order = self.getElementOrder(id)
+        self.setElementOrder(id, int(order)-1)
+
+    def moveDown(self, id):
+        """Move the element downward.
+        """
+        order = self.getElementOrder(id)
+        self.setElementOrder(id, int(order)+1)
+
+    def moveElement(self, src_id, dest_id, order):
+        """Move an element to another destination element.
+        return the id of the moved element.
+        """
+        request = self.request
+        src_element = self._getElementById(src_id)
+        src_container = getParent(src_element)
+        dest_element = self._getElementById(dest_id)
+        if IInnerNode.providedBy(dest_element):
+            dest_container = dest_element
+        else:
+            dest_container = getParent(dest_element)
+            order = self.getElementOrder(dest_id)
+            if dest_container == src_container:
+                order = order -1
+
+        # move the element to the destination container
+        moving = getMultiAdapter((dest_container, request), INodeMoving)
+        moved = moving.move(src_element)
+
+        # move the element to the specified order
+        moved_id = moved.identifier
+        self.setElementOrder(moved_id, int(order))
+        return str(moved_id)
+
+    def setElementOrder(self, id, order):
+        """Move an element to a new position.
+        """
+        element = self._getElementById(id)
+        container = getParent(element)
+        ordering = getMultiAdapter((container, self.request), INodeOrdering)
+        ordering.setOrder(element, int(order))
+
+    def getElementOrder(self, id):
+        """Get the order of an element in a container.
+        """
+        element = self._getElementById(id)
+        container = getParent(element)
+        ordering = getMultiAdapter((container, self.request), INodeOrdering)
+        return ordering.getOrder(element)
+
+    def deleteElement(self, id):
+        """Delete the element specified by its path.
+        """
+        request = self.request
+        element = self._getElementById(id)
+        container = getParent(element)
+        removing = getMultiAdapter((container, request), INodeRemoving)
+        removing.remove(element)
+
+    def duplicateElement(self, id):
+        """Duplicate an element specified by its id.
+        Return the id of the duplicated element.
+        """
+        request = self.request
+        element = self._getElementById(id)
+        container = getParent(element)
+        duplicating = getMultiAdapter((container, request), INodeDuplicating)
+        return str(duplicating.duplicate(element))
+
+class JSONViews:
+    """JSON views"""
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getHint(self, msgid):
+        return json.write({
+            'id': msgid,
+            'data': {
+                'hint': _(msgid)
+            },
+        })
+
+    def getModel(self, id):
+        return json.write(MODELS[id])
+
+    def getView(self, id):
+        return json.write(VIEWS[id])
+
+    def getController(self, id):
+        return json.write(CONTROLLERS[id])
+

Added: cpsskins/branches/paris-sprint-2006/ui/screens/definitions.py
==============================================================================
--- (empty file)
+++ cpsskins/branches/paris-sprint-2006/ui/screens/definitions.py       Thu May 
25 11:21:34 2006
@@ -0,0 +1,572 @@
+
+from zope.i18nmessageid import MessageFactory
+
+_ = MessageFactory('cpsskins')
+
+MODELS = {
+    'stylesheet': {
+        'id': 'stylesheet',
+        'data': {}
+    },
+
+    'action-pad': {
+        'id': 'action-pad',
+        'data': {
+            'url': '@@actionPad.html',
+        }
+    },
+
+    'element-editor': {
+        'id': 'element-editor',
+        'data': {
+            'url': '@@element-editor.html',
+            'css': '++resource++element-editor.css',
+            'script': '',
+            'form': {
+                'id': '',
+                'format': '',
+                'data': {}
+            },
+        }
+    },
+
+    'setting-editor': {
+        'id': 'setting-editor',
+        'data': {
+            'url': '@@setting-editor.html',
+            'css': '++resource++element-editor.css',
+            'script': '',
+            'form': {
+                'id': '',
+                'format': '',
+                'data': {}
+            },
+        }
+    },
+
+    'perspective-selector': {
+        'id': 'perspective-selector',
+        'data': {
+            'url': '@@perspectiveSelector.html',
+        }
+    },
+
+    'theme-tabs': {
+        'id': 'theme-tabs',
+        'data': {
+            'url': '@@themeTabs.html',
+        }
+    },
+
+    'page-tabs': {
+        'id': 'page-tabs',
+        'data': {
+            'url': '@@pageTabs.html',
+        }
+    },
+
+    'page-designer': {
+        'id': 'page-designer',
+        'data': {
+            'url': '@@page-designer.html',
+        }
+    },
+
+    'location-selector': {
+        'id': 'location-selector',
+        'data': {
+            'url': '@@locationSelector.html',
+        }
+    },
+
+    'wysiwyg-mode': {
+        'id': 'wysiwyg-mode',
+        'data': {
+            'url': '@@renderPage.html',
+            'form': {
+                'engine': 'page-designer',
+            },
+            'css': '++resource++page-designer.css',
+        }
+    },
+
+    'layout-mode': {
+        'id': 'layout-mode',
+        'data': {
+            'url': '@@renderPage.html',
+            'form': {
+                'engine': 'layout-designer',
+            },
+            'css': '++resource++layout-designer.css',
+        }
+    },
+
+    'content-author': {
+        'id': 'content-author',
+        'data': {
+            'url': '@@renderPage.html',
+            'form': {
+                'engine': 'content-author',
+            },
+            'css': '++resource++content-author.css',
+        }
+    },
+
+    'site-manager': {
+        'id': 'site-manager',
+        'data': {
+            'url': '@@site-manager.html',
+            'css': '++resource++site-manager.css',
+        }
+    },
+
+    'portlet-factory': {
+        'id': 'portlet-factory',
+        'data': {
+            'url': '@@portletFactory.html',
+        },
+    },
+
+    'settings': {
+        'id': 'settings',
+        'data': {
+            'url': '@@settings.html',
+        }
+    },
+
+    'settings-section': {
+        'id': 'settings-section',
+        'data': {
+            'url': '@@settings-section.html',
+            'form': {},
+        }
+    },
+
+    'io': {
+        'id': 'io',
+        'data': {
+            'url': '@@io.html',
+        }
+    },
+
+    'io-section': {
+        'id': 'io-section',
+        'data': {
+            'url': '@@io-section.html',
+            'form': {},
+        }
+    },
+
+    'negotiation': {
+        'id': 'negotiation',
+        'data': {
+            'url': '@@negotiation.html',
+        }
+    },
+
+}
+
+VIEWS = {
+    'stylesheet': {
+        'id': 'stylesheet',
+        'widget': {
+            'type': 'stylesheet',
+        },
+        'model': 'stylesheet',
+        'perspectives': ['page-designer', 'content-author',
+                         'element-editor'],
+        'controllers': ['main-editor-perspectives', 'element-editor-actions'],
+    },
+
+    # Top area
+    'action-pad': {
+        'id': 'action-pad',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'action-pad',
+        'perspectives': ['site-manager', 'page-designer', 'content-author',
+                         'element-editor'],
+        'controllers': ['main-editor-perspectives'],
+    },
+
+    'element-editor': {
+        'id': 'element-editor',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'element-editor',
+        'perspectives': ['element-editor'],
+        'controllers': ['main-editor-perspectives'],
+    },
+
+    'setting-editor': {
+        'id': 'setting-editor',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'setting-editor',
+        'perspectives': ['setting-editor'],
+        'controllers': ['site-manager-perspectives'],
+    },
+
+    'tooltip': {
+        'id': 'tooltip',
+        'selectors': ['.actionPad a'],
+        'widget': {
+            'type': 'tooltip',
+            'follow': True,
+        },
+        'show_effect': {
+            'transition': 'fadein',
+            'delay': 1300,
+        },
+        'hide_effect': {
+            'transition': 'fadeout',
+            'delay': 500,
+        },
+        'controllers': ['show-hide-tooltip'],
+    },
+
+    'perspective-selector': {
+        'id': 'perspective-selector',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'perspective-selector',
+        'perspectives': ['page-designer', 'content-author',
+                         'element-editor'],
+        'controllers': ['main-editor-perspectives', 'main-editor-actions'],
+    },
+
+    # Main area
+    'theme-tabs': {
+        'id': 'theme-tabs',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'theme-tabs',
+        'perspectives': ['page-designer'],
+        'controllers': ['main-editor-perspectives', 'main-editor-actions'],
+    },
+
+    'page-tabs': {
+        'id': 'page-tabs',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'page-tabs',
+        'perspectives': ['page-designer'],
+        'controllers': ['main-editor-perspectives', 'main-editor-actions'],
+    },
+
+    'page-designer': {
+        'id': 'page-designer',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'page-designer',
+        'perspectives': ['page-designer'],
+        'controllers': ['main-editor-perspectives'],
+    },
+
+    'location-selector': {
+        'id': 'location-selector',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'location-selector',
+        'perspectives': ['content-author'],
+        'show_effect': {
+            'transition': 'fadein',
+        },
+        'controllers': ['main-editor-perspectives'],
+    },
+
+    # rendered pages
+    'wysiwyg-mode': {
+        'id': 'wysiwyg-mode',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'wysiwyg-mode',
+        'perspectives': ['wysiwyg'],
+        'controllers': ['page-mode-perspectives', 'element-mover',
+                        'portlet-factory', 'main-editor-actions'],
+    },
+
+    'layout-mode': {
+        'id': 'layout-mode',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'layout-mode',
+        'perspectives': ['layout'],
+        'controllers': ['page-mode-perspectives', 'element-mover',
+                        'portlet-factory', 'main-editor-actions'],
+    },
+
+    'content-author': {
+        'id': 'content-author',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'content-author',
+        'perspectives': ['content-author'],
+        'controllers': ['main-editor-perspectives', 'element-mover', 
+                        'portlet-factory', 'main-editor-actions'],
+    },
+
+    # screen
+    'site-manager': {
+        'id': 'site-manager',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'site-manager',
+        'perspectives': ['site-manager'],
+        'controllers': ['main-editor-perspectives'],
+    },
+
+    # site designer panels
+    'settings': {
+        'id': 'settings',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'settings',
+        'perspectives': ['settings'],
+        'controllers': ['site-manager-perspectives'],
+    },
+
+    'settings-section': {
+        'id': 'settings-section',
+        'widget': {
+            'type': 'panel'
+        },
+        'model': 'settings-section',
+        'perspectives': ['settings'],
+        'controllers': ['site-manager-perspectives', 'settings-actions'],
+    },
+
+    'negotiation': {
+        'id': 'negotiation',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'negotiation',
+        'perspectives': ['negotiation'],
+        'controllers': ['site-manager-perspectives'],
+    },
+
+    'io': {
+        'id': 'io',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'io',
+        'perspectives': ['io'],
+        'controllers': ['site-manager-perspectives'],
+    },
+
+    'io-section': {
+        'id': 'io-section',
+        'widget': {
+            'type': 'panel'
+        },
+        'model': 'io-section',
+        'perspectives': ['io'],
+        'controllers': ['site-manager-perspectives', 'io-actions'],
+    },
+
+    # element editor
+    'element-editor': {
+        'id': 'element-editor',
+        'widget': {
+            'type': 'panel'
+        },
+        'model': 'element-editor',
+        'perspectives': ['element-editor'],
+        'controllers': ['main-editor-perspectives', 'element-editor-actions'],
+    },
+
+    # Bottom area
+    'portlet-factory': {
+        'id': 'portlet-factory',
+        'widget': {
+            'type': 'panel',
+        },
+        'model': 'portlet-factory',
+        'perspectives': ['page-designer', 'content-author'],
+        'controllers': ['main-editor-perspectives', 'portlet-factory'],
+    },
+
+    # Contextual menu
+    'context-menu': {
+        'id': 'context-menu',
+        'area': 'canvasArea',
+        'perspectives': ['page-designer', 'content-author'],
+        'controllers': ['menu-actions', 'main-editor-perspectives',
+                        'show-hide-menu'],
+        'widget': {
+         'type': 'contextmenu',
+         'items': [
+           {'type': 'item',
+            'label': _('Edit'),
+            'icon': '++resource++edit-16.png',
+            'action': 'edit element',
+            'visible': 'editable',
+           },
+           {'type': 'item',
+            'label': _('Duplicate'),
+            'icon': '++resource++duplicate-16.png',
+            'action': 'duplicate element',
+            'visible': 'editable',
+           },
+           {'type': 'separator',
+           },
+           {'type': 'item',
+            'label': _('Copy'),
+            'icon': '++resource++copy-16.png',
+            'action': 'copy element',
+           },
+           {'type': 'item',
+            'label': _('Paste'),
+            'icon': '++resource++paste-16.png',
+            'action': 'paste element',
+            'visible': 'editable',
+           },
+           {'type': 'separator',
+           },
+           {'type': 'submenu',
+            'label': _('Format'),
+            'visible': 'formattable',
+            'items': [
+              {'type': 'selection',
+               'action': 'format element',
+               'choices': 'formats',
+              },
+            ]
+           },
+           {'type': 'separator',
+           },
+           {'type': 'item',
+            'label': _('Delete'),
+            'icon': '++resource++delete-16.png',
+            'action': 'delete element',
+            'confirm': _('Deleting, are you sure?'),
+           }
+         ],
+       },
+       'show_effect': {
+         'transition': 'fadein',
+       },
+       'hide_effect': {
+         'transition': 'hide',
+       },
+    },
+}
+
+CONTROLLERS = {
+
+    'main-editor-perspectives': {
+        'id': 'main-editor-perspectives',
+        'type': 'perspective selector',
+        'initial': 'site-manager',
+    },
+
+    'main-editor-actions': {
+        'id': 'main-editor-actions',
+        'type': 'remote scripting',
+    },
+
+    'site-manager-perspectives': {
+        'id': 'site-manager-perspectives',
+        'type': 'perspective selector',
+        'initial': 'settings',
+    },
+
+    'page-mode-perspectives': {
+        'id': 'page-mode-perspectives',
+        'type': 'perspective selector',
+        'initial': 'layout',
+    },
+
+    'element-editor-perspectives': {
+        'id': 'element-editor-perspectives',
+        'type': 'perspective selector',
+        'initial': 'default',
+    },
+
+    'show-hide-tooltip': {
+        'id': 'show-hide-tooltip',
+        'type': 'focus observer',
+    },
+
+    'portlet-factory': {
+        'id': 'portlet-factory',
+        'type': 'drag-and-drop',
+        'dragging': {
+            'source': 'factory',
+            'offset_x': -5,
+            'offset_y': -5,
+            'feedback': {
+                'opacity': 0.7,
+            },
+            'zoomback': {
+                'duration': 300,
+            },
+        },
+        'dropping': {
+            'target': 'portletTarget',
+            'highlight': {
+                'duration': 800,
+            },
+            'action': 'insert portlet',
+        },
+    },
+
+    'element-mover': {
+        'id': 'element-mover',
+        'type': 'drag-and-drop',
+        'dragging': {
+            'source': 'elementMovable',
+            'feedback': {
+                'opacity': 0.7,
+                'clone': True,
+            },
+        },
+        'shifting': {
+            'element': 'elementShiftable',
+        },
+        'dropping': {
+            'action': 'move element',
+        },
+    },
+
+    'menu-actions': {
+        'id': 'menu-actions',
+        'type': 'command',
+    },
+
+    'show-hide-menu': {
+        'id': 'show-hide-menu',
+        'type': 'focus observer',
+    },
+
+    'settings-actions': {
+        'id': 'settings-actions',
+        'type': 'remote scripting',
+    },
+
+    'io-actions': {
+        'id': 'io-actions',
+        'type': 'remote scripting',
+    },
+
+    'element-editor-actions': {
+        'id': 'element-editor-actions',
+        'type': 'remote scripting',
+    },
+
+}

Modified: cpsskins/branches/paris-sprint-2006/ui/zmi/views.py
==============================================================================
--- cpsskins/branches/paris-sprint-2006/ui/zmi/views.py (original)
+++ cpsskins/branches/paris-sprint-2006/ui/zmi/views.py Thu May 25 11:21:34 2006
@@ -24,7 +24,7 @@
 from zope.traversing.api import getParent
 
 from cpsskins.elements.theme import Theme
-from cpsskins.ui.authoring.views import IAuthoring
+from cpsskins.ui.screens.commons.views import IAuthoring
 from cpsskins.utils import getThemeManager, addThemeSkeleton
 from cpsskins.thememanager import IThemeManagementFolder
 
-- 
http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins

Reply via email to