[Checkins] SVN: z3c.reference/branches/flash/ first step for generic relation forms with reference widget for cropping images

Manfred Schwendinger manfred.schwendiger at lovelysystems.com
Fri Sep 7 09:22:50 EDT 2007


Log message for revision 79522:
  first step for generic relation forms with reference widget for cropping images

Changed:
  U   z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as
  U   z3c.reference/branches/flash/setup.py
  U   z3c.reference/branches/flash/src/z3c/reference/browser/README.txt
  U   z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml
  A   z3c.reference/branches/flash/src/z3c/reference/browser/crop-image-widget.pt
  U   z3c.reference/branches/flash/src/z3c/reference/browser/tests.py
  U   z3c.reference/branches/flash/src/z3c/reference/browser/widget.py
  U   z3c.reference/branches/flash/src/z3c/reference/demo/browser/ftesting.zcml
  U   z3c.reference/branches/flash/src/z3c/reference/demo/browser/views.py

-=-
Modified: z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as
===================================================================
--- z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/flash/src/z3c/reference/imagetool/core/FlashvarManager.as	2007-09-07 13:22:49 UTC (rev 79522)
@@ -1,82 +1,82 @@
-/*
- *  FlashvarManager.as
- *
- *  Manager for flashvars, use this instead of _level0.xxx to access a flashvar.
- *  Call oneTimeInit at the beginning of your application, the manager collects
- *  all variables on _level0, copies them to a object, decodes strings ('+' and '=')
- *  and parses numbers correctly...
- *
- *  @author <gerold.boehler at lovelysystems.com>
- *
- */
- 
-class z3c.reference.imagetool.core.FlashvarManager extends z3c.reference.imagetool.core.EventBroadcaster
-{
-	private static var _instance:z3c.reference.imagetool.core.FlashvarManager;
-	private var flashVars:Object;
-	
-	
-	function FlashvarManager()
-	{
-		flashVars = new Object();
-	}
-	
-	public static function oneTimeInit():Void
-	{
-	    for (var flashvar in _level0)
-	    {
-	        if (flashvar.indexOf("$") == 0)
-	            continue;
-
-	        getInstance().setVar(flashvar, decodeForFlash(_level0[flashvar]));
-	        delete _level0[flashvar];
-	    }
-	}
-	
-	private static function decodeForFlash(str:String)
-	{
-	    if (!isNaN(parseFloat(str)))
-	        return parseFloat(str);
-	        
-	    if (typeof(str) == "boolean")
-	        return str;
-
-        if (str == "true" || str == "false")
-            return str == "true";
-
-		str = str.split("[p]").join("+");
-		str = str.split("[e]").join("=");
-
-		return str;
-    }
-	
-	private function getVar(name:String):String
-	{
-		if (flashVars[name])
-			return flashVars[name];
-			
-		return undefined;
-	}
-	
-	private function setVar(name:String, value:String):Void
-	{
-	    flashVars[name] = value;
-	    trace("SETTING: " + name + " " + value)
-	}
-
-	public static function get(name:String)
-	{
-	    if (!getInstance().getVar(name)) {
-	        //getInstance().log("!ERROR! Flashvar " + name + " not found!");
-	    }
-	    return getInstance().getVar(name);
-	}
-	
-	public static function getInstance():FlashvarManager
-	{
-		if (!_instance) 
-			_instance = new FlashvarManager();
-			
-		return _instance;
-	}	
+/*
+ *  FlashvarManager.as
+ *
+ *  Manager for flashvars, use this instead of _level0.xxx to access a flashvar.
+ *  Call oneTimeInit at the beginning of your application, the manager collects
+ *  all variables on _level0, copies them to a object, decodes strings ('+' and '=')
+ *  and parses numbers correctly...
+ *
+ *  @author <gerold.boehler at lovelysystems.com>
+ *
+ */
+ 
+class z3c.reference.imagetool.core.FlashvarManager extends z3c.reference.imagetool.core.EventBroadcaster
+{
+	private static var _instance:z3c.reference.imagetool.core.FlashvarManager;
+	private var flashVars:Object;
+	
+	
+	function FlashvarManager()
+	{
+		flashVars = new Object();
+	}
+	
+	public static function oneTimeInit():Void
+	{
+	    for (var flashvar in _level0)
+	    {
+	        if (flashvar.indexOf("$") == 0)
+	            continue;
+
+	        getInstance().setVar(flashvar, decodeForFlash(_level0[flashvar]));
+	        delete _level0[flashvar];
+	    }
+	}
+	
+	private static function decodeForFlash(str:String)
+	{
+	    if (!isNaN(parseFloat(str)))
+	        return parseFloat(str);
+	        
+	    if (typeof(str) == "boolean")
+	        return str;
+		
+        if (str.toLowerCase() == "true" || str.toLowerCase == "false")
+            return str.toLowerCase() == "true";
+
+		str = str.split("[p]").join("+");
+		str = str.split("[e]").join("=");
+
+		return str;
+    }
+	
+	private function getVar(name:String):String
+	{
+		if (flashVars[name])
+			return flashVars[name];
+			
+		return undefined;
+	}
+	
+	private function setVar(name:String, value:String):Void
+	{
+	    flashVars[name] = value;
+	    trace("SETTING: " + name + " " + value)
+	}
+
+	public static function get(name:String)
+	{
+	    if (!getInstance().getVar(name)) {
+	        //getInstance().log("!ERROR! Flashvar " + name + " not found!");
+	    }
+	    return getInstance().getVar(name);
+	}
+	
+	public static function getInstance():FlashvarManager
+	{
+		if (!_instance) 
+			_instance = new FlashvarManager();
+			
+		return _instance;
+	}	
 }
\ No newline at end of file

Modified: z3c.reference/branches/flash/setup.py
===================================================================
--- z3c.reference/branches/flash/setup.py	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/setup.py	2007-09-07 13:22:49 UTC (rev 79522)
@@ -39,7 +39,9 @@
         'zope.traversing',
         'lovely.relation>=0.3.0',
         'z3c.javascript',
-        'z3c.viewtemplate'
+        'z3c.viewtemplate',
+        'cElementTree',
+        'elementtree'
         ],
     dependency_links = ['http://download.zope.org/distribution']
     )

Modified: z3c.reference/branches/flash/src/z3c/reference/browser/README.txt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/README.txt	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/README.txt	2007-09-07 13:22:49 UTC (rev 79522)
@@ -201,3 +201,33 @@
 
   >>> refid == intids.getId(same)
   True
+
+
+CropImageWidget
+===============
+
+  we need some resources
+  
+  >>> from zope import schema, interface
+  >>> from zope.publisher.browser import TestRequest
+  >>> from z3c.reference.browser.widget import CropImageWidget
+  >>> from zope.app.container.contained import Contained
+  >>> class IContent(interface.Interface):
+  ...     imageCropData = ViewReferenceField(title=u'image crop data',
+  ...                                        required = False)
+  >>> class Content(Contained):
+  ...     pass
+  >>> content = Content()
+  >>> site['content'] = content
+
+  >>> field = IContent['imageCropData']
+  >>> field = field.bind(content)
+
+  >>> request = TestRequest()
+  >>> widget = CropImageWidget(field, request)
+  >>> rendered = widget()
+  >>> 'addVariable' in rendered
+  True
+  >>> 'http://127.0.0.1/content' in rendered
+  True
+

Modified: z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/configure.zcml	2007-09-07 13:22:49 UTC (rev 79522)
@@ -52,7 +52,8 @@
       />
 
   <resourceLibrary name="z3c.reference"
-                   require="z3c.javascript.jquery">
+                   require="z3c.javascript.jquery
+                            z3c.javascript.swfobject">
       <directory source="resources"
           include="jquery.popupwindow.js z3c_reference.js"
           />

Added: z3c.reference/branches/flash/src/z3c/reference/browser/crop-image-widget.pt
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/crop-image-widget.pt	                        (rev 0)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/crop-image-widget.pt	2007-09-07 13:22:49 UTC (rev 79522)
@@ -0,0 +1,49 @@
+<div id="image-tool-target">
+
+</div>
+
+<input tal:replace="structure view/inputField" />
+
+<script type="text/javascript" tal:content='string: 
+function encodeForFlash(str) {
+  str=str.split("+").join("[p]");
+	str=str.split("=").join("[e]");
+	return str;
+}
+
+function cropImage(crop_x, crop_y, crop_w, crop_h, size_w, size_h, rotation){
+  var url = "@@processed?";
+  url = url + "remote.adjust.rotate=" + rotation;
+  url = url + "&remote.size.w=" + size_w;
+  url = url + "&remote.size.h=" + size_h;
+  url = url + "&local.crop.h=" + crop_h;
+  url = url + "&local.crop.w=" + crop_w;
+  url = url + "&local.crop.x=" + crop_x;
+  url = url + "&local.crop.y=" + crop_y;
+  document.getElementById("${view/escapedName}").value = url;
+}
+
+'>
+</script>
+
+<script type="text/javascript"
+        tal:content="string:
+              var url='${context/++resource++imagetool.swf}';
+              var img='${view/url}';
+              url = url + '?url=' + encodeForFlash(img) + '/@@resized';
+              var so = new SWFObject(url, 'image-tool-target', '100%', '490px', '8', 0x000000);
+              so.addParam('allowScriptAccess', 'sameDomain');
+              so.addParam('movie', url);
+              so.addParam('quality', 'high');
+              so.addVariable('crop_x', '100');
+              so.addVariable('crop_y', '100');
+              so.addVariable('crop_w', '100');
+              so.addVariable('crop_h', '100');
+              so.addVariable('original_w', '600');
+              so.addVariable('original_h', '400');
+              so.addVariable('zoomfactor', '0.33');
+              so.addVariable('rotation', '90');
+              so.addVariable('keepAspectRatio', '${view/keepAspect}'); 
+              var ok = so.write('image-tool-target');
+            ">
+</script>
\ No newline at end of file


Property changes on: z3c.reference/branches/flash/src/z3c/reference/browser/crop-image-widget.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: z3c.reference/branches/flash/src/z3c/reference/browser/tests.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/tests.py	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/tests.py	2007-09-07 13:22:49 UTC (rev 79522)
@@ -16,8 +16,12 @@
 """
 __docformat__ = 'restructuredtext'
 
+import os
 import doctest
 import unittest
+import zope
+from zope.traversing.interfaces import ITraverser, ITraversable
+
 from zope.testing.doctestunit import DocFileSuite, DocTestSuite
 from zope.app.testing import setup
 from zope.app.intid import IntIds
@@ -32,21 +36,45 @@
 from z3c.reference.interfaces import IViewReference
 from zope.traversing.browser.absoluteurl import AbsoluteURL
 from zope.publisher.browser import BrowserPage
+from zope.app.publisher.browser.fileresource import FileResource, File
+from zope.app.testing.ztapi import browserResource
+from zope.traversing.namespace import resource, view
+
 from lovely.relation import configurator
 
 from views import ViewReferenceAbsoluteURL
+from zope.traversing.testing import setUp as setUpTraversing
 
 class TestPage(BrowserPage):
 
     def __call__(self):
         return "testpage"
 
+class Resource(object):
+
+    def __init__(self, request):
+        pass
+
 def setUp(test):
+    
     site = setup.placefulSetUp(True)
     test.globs['site'] = site
     util = configurator.SetUpO2OStringTypeRelationships(site)
     util({})
 
+    setUpTraversing()
+    zope.component.provideAdapter(resource, (None,), ITraversable, name="resource")
+    zope.component.provideAdapter(resource, (None, None), ITraversable, name="resource")
+    zope.component.provideAdapter(view, (None,), ITraversable, name="view")
+    zope.component.provideAdapter(view, (None, None), ITraversable, name="view")
+
+#     path = os.path.dirname(__file__)
+#     path = os.path.join(path, 'resources', 'imagetool.swf')
+#     toolFile = File(path, 'imagetool.swf')
+#     FileResource(toolFile, None)
+#    toolFileResource = Resource
+    browserResource('imagetool.swf', Resource)
+    
     component.provideAdapter(SimpleKeyReference)
     component.provideAdapter(ZDCAnnotatableAdapter,
                              provides=IWriteZopeDublinCore)
@@ -62,7 +90,7 @@
 
 
 def test_suite():
-    
+
     return unittest.TestSuite((
         DocFileSuite('serialize.txt',
                      setUp=setUp,tearDown=tearDown,

Modified: z3c.reference/branches/flash/src/z3c/reference/browser/widget.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/browser/widget.py	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/src/z3c/reference/browser/widget.py	2007-09-07 13:22:49 UTC (rev 79522)
@@ -29,6 +29,8 @@
 from zope.app.form.browser.textwidgets import TextWidget
 from zope.app.component import hooks
 from zope.app.form.browser.widget import renderElement
+from zope.app.form.browser.textwidgets import BytesWidget
+from zope.app.pagetemplate import ViewPageTemplateFile
 
 from zc import resourcelibrary
 from z3c.reference import interfaces
@@ -301,3 +303,26 @@
         except TypeError:
             return self._missing
         return url
+
+
+class CropImageWidget(BytesWidget):
+    """widget for cropping images"""
+
+    template = ViewPageTemplateFile('crop-image-widget.pt')
+    keepAspect = False
+
+    def url(self):
+        return absoluteURL(self.context.context, self.request)
+    
+    def inputField(self):
+        return super(CropImageWidget, self).__call__()
+
+    def escapedName(self):
+        return self.name.replace('.', r'\.')
+    
+    def __call__(self, *args, **kw):
+        resourcelibrary.need('z3c.javascript.swfobject')
+        return self.template(*args, **kw)
+        
+
+        

Modified: z3c.reference/branches/flash/src/z3c/reference/demo/browser/ftesting.zcml
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/browser/ftesting.zcml	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/browser/ftesting.zcml	2007-09-07 13:22:49 UTC (rev 79522)
@@ -5,6 +5,7 @@
     xmlns:zcml="http://namespaces.zope.org/zcml"
     i18n_domain="zope">
 
+  
   <include package="zope.app.securitypolicy" file="meta.zcml" />
   <include
       zcml:condition="installed zope.app.zcmlfiles"
@@ -64,6 +65,7 @@
   <include package="zope.app.file"/>
   <include package="zc.resourcelibrary" />
   <include package="z3c.javascript.jquery"/>  
+  <include package="z3c.javascript.swfobject"/>  
 
   <include package="lovely.relation" />
   <include package="lovely.relation" file="o2o.zcml" />

Modified: z3c.reference/branches/flash/src/z3c/reference/demo/browser/views.py
===================================================================
--- z3c.reference/branches/flash/src/z3c/reference/demo/browser/views.py	2007-09-07 12:20:29 UTC (rev 79521)
+++ z3c.reference/branches/flash/src/z3c/reference/demo/browser/views.py	2007-09-07 13:22:49 UTC (rev 79522)
@@ -29,8 +29,10 @@
 
 from z3c.reference.demo.interfaces import (IDemoFolder, IDemoImage)
 from z3c.reference.interfaces import IViewReferenceEditorSearch
-from z3c.reference.interfaces import IViewReferenceEditor
+from z3c.reference.interfaces import IViewReferenceEditor, \
+     IViewReference
 
+from z3c.reference.browser.widget import CropImageWidget
 
 class DemoFolderEdit(form.EditForm):
     """Demo folder edit form."""
@@ -108,10 +110,15 @@
     def __call__(self):
         return self.template()
 
-
-class ViewReferenceEditor(object):
+class ViewReferenceEditor(form.EditForm):
     """Represents the IViewReferenceEditor form."""
+    action = form.Actions()
+    form_fields = form.Fields(IZopeDublinCore['title'],
+                              IZopeDublinCore['description'],
+                              IViewReference['view'])
 
+    form_fields['view'].custom_widget = CropImageWidget
+
     interface.implements(IViewReferenceEditor)
     template = ViewPageTemplateFile('editor_edit.pt')
     settingNameStr = u''
@@ -126,3 +133,7 @@
 
     def __call__(self):
         return self.template()
+
+    def setUpWidgets(self, ignore_context=True):
+        return super(ViewReferenceEditor, self).setUpWidgets(
+            ignore_context)



More information about the Checkins mailing list