From 92ea98a2568a0e59779b924a8b699bea7936fa14 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Beno=C3=AEt=20Pin?= <pin@cri.ensmp.fr>
Date: Tue, 16 Aug 2011 13:22:13 +0200
Subject: [PATCH] =?utf8?q?Ajout=20du=20code=20du=20finder=20ajax=20depuis?=
 =?utf8?q?=20le=20d=C3=A9p=C3=B4t=20de=20FCK.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

---
 skins/ckeditor/config.js                      |   2 +-
 .../mac_finder/_graphics/folderish_icons.psd  | Bin 0 -> 20495 bytes
 .../browser/mac_finder/browser.css            |  68 ++++
 .../browser/mac_finder/browser.html.dtml      | 351 ++++++++++++++++++
 .../mac_finder/connectors/plinn/connector.py  |  73 ++++
 .../mac_finder/images/folderish-selected.gif  | Bin 0 -> 107 bytes
 .../browser/mac_finder/images/folderish.gif   | Bin 0 -> 163 bytes
 .../mac_finder/images/folderishNode.gif       | Bin 0 -> 160 bytes
 8 files changed, 493 insertions(+), 1 deletion(-)
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/_graphics/folderish_icons.psd
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/browser.css
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/browser.html.dtml
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/connectors/plinn/connector.py
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/images/folderish-selected.gif
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/images/folderish.gif
 create mode 100644 skins/ckeditor/filemanager/browser/mac_finder/images/folderishNode.gif

diff --git a/skins/ckeditor/config.js b/skins/ckeditor/config.js
index 9467812..bb14ec7 100644
--- a/skins/ckeditor/config.js
+++ b/skins/ckeditor/config.js
@@ -22,5 +22,5 @@ CKEDITOR.editorConfig = function( config )
 	];
 	
 	config.height = '500px';
-	config.filebrowserBrowseUrl = CKEDITOR.basePath;
+	config.filebrowserBrowseUrl = CKEDITOR.basePath + 'filemanager/browser/mac_finder/browser.html?Connector=connectors/plinn/connector';
 };
\ No newline at end of file
diff --git a/skins/ckeditor/filemanager/browser/mac_finder/_graphics/folderish_icons.psd b/skins/ckeditor/filemanager/browser/mac_finder/_graphics/folderish_icons.psd
new file mode 100644
index 0000000000000000000000000000000000000000..69fe1b3c05bd5ce58f40e53a4f948495de122641
GIT binary patch
literal 20495
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

literal 0
HcmV?d00001

diff --git a/skins/ckeditor/filemanager/browser/mac_finder/browser.css b/skins/ckeditor/filemanager/browser/mac_finder/browser.css
new file mode 100644
index 0000000..cf93b14
--- /dev/null
+++ b/skins/ckeditor/filemanager/browser/mac_finder/browser.css
@@ -0,0 +1,68 @@
+body {
+	margin:0;
+	padding:0;
+/*	overflow-x : scroll;*/
+}
+#finder {
+	position : relative;
+	border : none;
+	vertical-align : top;
+	font-family : Arial, Helvetica, Geneva, Swiss, SunSans-Regular, sans-serif;
+	font-size : small;
+}
+
+
+#finder td {
+/*	width : 200px;*/
+	padding : 0;
+}
+
+#finder ul {
+/*	float : left;*/
+	list-style : none;
+	margin : 0;
+	padding : 0;
+	overflow-y : scroll;
+}
+#finder li {
+	padding-left : 5px;
+	margin : 2px 0;
+	cursor : default;
+/*	vertical-align : middle*/
+}
+
+#finder li.contentish {
+	/* nothing special */
+}
+
+#finder li.contentish-selected {
+	background-color : #3875d7;
+	color : white;
+}
+
+
+#finder li.folderish {
+	background : url(images/folderish.gif) center right no-repeat;
+}
+
+#finder li.folderish-selected {
+	background : url(images/folderish-selected.gif) center right no-repeat #3875d7 ;
+	color : white;
+}
+
+
+#finder img {
+	margin-right : 3px;
+	vertical-align : middle;
+}
+
+.finder_preview {
+	font-size : 95%;
+}
+.finder_preview th {
+	color : #7f7f7f;
+	text-align : right;
+}
+.finder_preview .thumbnail {
+	text-align:center;
+}
\ No newline at end of file
diff --git a/skins/ckeditor/filemanager/browser/mac_finder/browser.html.dtml b/skins/ckeditor/filemanager/browser/mac_finder/browser.html.dtml
new file mode 100644
index 0000000..be15cd2
--- /dev/null
+++ b/skins/ckeditor/filemanager/browser/mac_finder/browser.html.dtml
@@ -0,0 +1,351 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+	<head>
+		<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+		<title>Site browser</title>
+		<link rel="stylesheet" href="browser.css" type="text/css" media="screen" title="Browser style" charset="utf-8" />
+		<script type="text/javascript" language="javascript" charset="utf-8" src="epoz_script_detect.js"></script>
+		<script type="text/javascript" language="javascript" charset="utf-8" src="javascript_events_api.js"></script>
+		<script type="text/javascript" language="javascript" charset="utf-8" src="sarissa.js"></script>
+		<script type="text/javascript" language="javascript" charset="utf-8">
+		// <![CDATA[
+		/* keyboard keycodes */
+		var keyLeft = 37, keyUp = 38, keyRight = 39, keyDown = 40, keyEnter = 13;
+		
+		/* globals variables */
+		var finder, finderContent, cellWidth, currentColumn;
+		var scrollbarPlaceholder_offset = 0;
+		var scrollXStep = 25, scrollTimeStep = 10;
+		var ressourceType = GetUrlParam('Type');
+		var sConnUrl = GetUrlParam( 'Connector' ) ;
+		var baseDepth = 0;
+		if ( sConnUrl.substr(0,1) != '/' && sConnUrl.indexOf( '://' ) < 0 )
+			sConnUrl = window.location.href.replace( /browser.html.*$/, '' ) + sConnUrl ;
+		var getWindowWidth = (window.innerWidth != undefined) ? function(){return window.innerWidth;} : function(){return document.body.parentElement.clientWidth;};
+		var getWindowHeight = (window.innerHeight != undefined) ? function(){return window.innerHeight;} : function(){return document.body.parentElement.clientHeight;};
+
+		
+		function _initBrowser(){
+			finder = document.getElementById('finder');
+			finder.colCpt = 3; // column counter;
+			finderContent = document.getElementById('finderContent');
+			cellWidth = Math.floor(getWindowWidth() / 3);
+			
+			addListener(window, 'resize', resizeBrowser);
+			addListener(finder, 'click', onClickHandler);
+			addListener(finder, 'dblclick', onDblClickHandler);
+			var path = GetUrlParam('path');
+			path = (path) ? path : '/';
+			var level = -1;
+			for (var i = 0 ; i<path.length ; i++){
+				if (path.charAt(i) == '/')
+					level += 1;
+			}
+			baseDepth = level;
+
+			populateBrowser('ls', path);
+			
+			if (browser.isGecko)
+				document.body.style.overflowX = 'scroll';
+			resizeBrowser();
+			scrollbarPlaceholder_offset = (window.scrollMaxY) ? window.scrollMaxY : document.body.offsetHeight - document.body.clientHeight;
+			resizeBrowser();
+			finder.style.width = cellWidth * 3 + "px";
+		}
+		addListener(window, 'load', _initBrowser);
+		addListener(document, 'keydown', onKeydownHandler);
+		
+		function onClickHandler(evt) {
+			var li = getTargetedObject(evt);
+			switch (li.tagName) {
+				case 'IMG':
+					if (li.width != 16) // this img is a preview thumbnail.
+						return;
+					li = li.parentNode;
+				case 'LI':
+				  // click on the current selected row
+				  if (currentColumn == li.parentNode && currentColumn.currentRow == li)
+				    return;
+				    
+					currentColumn = li.parentNode;
+					// hightlight row
+					if (currentColumn.currentRow) {
+						currentColumn.currentRow.className = currentColumn.currentRow.className.replace('-selected', '');
+					}
+					var command = li.className == 'folderish' ? 'ls' : 'info';
+					li.className += '-selected';
+					currentColumn.currentRow = li;
+
+					populateBrowser(command, li.path);
+			}
+		}
+		
+		function onDblClickHandler(evt) {
+		  var li = getTargetedObject(evt);
+		  
+		  if(li.tagName != 'LI') {
+		      if (li.tagName == 'IMG' && li.parentNode.tagName == 'LI')
+		        li = t.parentNode;
+		      else
+		        return;
+		  }
+		  switch(window.parent.name) {
+	        case 'FCKeditorDialog_PlinnImage' :
+	            if (li.className == 'contentish-selected') {
+					        window.parent.updateOrInsertImage(li.link);
+					        window.close();
+				      }
+					    break;
+				  case 'FCKBrowseWindow' :
+							window.opener.SetUrl(li.link);
+							window.close();
+							break;
+	    }
+		}
+
+		function onKeydownHandler(evt) {
+			evt = (evt) ? evt : window.event;
+			if(!currentColumn) currentColumn = finder.getElementsByTagName('ul')[0];
+			if(!currentColumn.currentRow) {
+				raiseMouseEvent(currentColumn.firstChild,'click');
+				return;
+			}
+			
+			var ob, evtType='click';
+			switch (evt.keyCode) {
+				case keyUp :
+					ob = currentColumn.currentRow.previousSibling;
+					break;
+				case keyDown :
+					ob = currentColumn.currentRow.nextSibling;
+					break;
+				case keyLeft :
+					var currentLevel = parseInt(currentColumn.parentNode.id.slice(6));
+					if (currentLevel) {
+						ob = document.getElementById('level-' + (currentLevel - 1)).firstChild;
+						if (ob.nodeType == 3) // text node
+							ob = ob.nextSibling
+						ob = ob.currentRow;
+					}
+					break;
+				case keyRight :
+					if(currentColumn.currentRow.className != 'folderish-selected')
+						return;
+					ob = document.getElementById('level-' + (parseInt(currentColumn.parentNode.id.slice(6)) + 1)).firstChild.firstChild;
+					break;
+				case keyEnter :
+				  ob = currentColumn.currentRow;
+				  evtType = 'dblclick'
+				  break;
+			};
+			if (ob)
+				raiseMouseEvent(ob, evtType);
+		}
+		
+		function resizeBrowser() {
+			var columns = finder.getElementsByTagName('ul');
+			var col;
+			for (var i=0 ; i<columns.length ; i++) {
+				col = columns[i];
+				col.style.height = getWindowHeight() - scrollbarPlaceholder_offset + "px";;
+				
+			}
+			//document.body.style.width = getWindowWidth();
+		}
+		
+		/* from fck default browser */
+		function GetUrlParam( paramName )
+		{
+			var oRegex = new RegExp( '[\?&]' + paramName + '=([^&]+)', 'i' ) ;
+			var oMatch = oRegex.exec( window.location.search ) ;
+
+			if ( oMatch && oMatch.length > 1 )
+				return unescape(oMatch[1]) ;
+			else
+				return '' ;
+		}
+		
+
+		
+		function populateBrowser(command, path) {
+			var prevColNum = finder.colCpt;
+			var level = -1;
+			for (var i = 0 ; i<path.length ; i++){
+				if (path.charAt(i) == '/')
+					level += 1;
+			}
+			level = level - baseDepth;
+			
+			// prepare / cleanup columns
+			var cellLevel, startCleanup = 3;
+			switch (level) {
+				case 0 : // initialization case
+					startCleanup = 0;
+					cellLevel = document.getElementById('level-0');
+					cellLevel.style.width = cellWidth + "px";
+					// remove default content
+					cellLevel.removeChild(cellLevel.firstChild);
+					
+					// cosmetic: display the second col with a scrollbar
+					var c1 = document.createElement('td');
+					c1.id = "level-1";
+					c1.style.width = cellWidth + "px";
+					c1.appendChild(document.createElement('ul'));
+					finderContent.appendChild(c1);
+					
+					// cosmetic: display the third col without scrollbar
+					var c2 = document.createElement('td');
+					c2.id = "level-2";
+					c2.style.width = cellWidth + "px";
+					finderContent.appendChild(c2);
+					break;
+
+				case 1 :
+					cellLevel = document.getElementById("level-1");
+					cellLevel.removeChild(cellLevel.firstChild);
+					var c2 = document.getElementById("level-2");
+					var ul = c2.firstChild;
+					if (ul)
+						c2.removeChild(ul);
+					break;
+
+				case 2 :
+					cellLevel = document.getElementById("level-2");
+					var ul = cellLevel.firstChild;
+					if (ul) {
+						cellLevel.removeChild(ul);
+					}
+					break;
+					
+				default :
+					cellLevel = document.getElementById("level-" + level);
+					if (!cellLevel) {
+						cellLevel = document.createElement('td');
+						cellLevel.id = "level-" + level;
+						cellLevel.style.width = cellWidth + "px";
+						finderContent.appendChild(cellLevel);
+						startCleanup = 0;
+						finder.colCpt += 1;
+					}
+					else {
+						cellLevel.removeChild(cellLevel.firstChild);
+						startCleanup = level + 1
+					}
+			}
+			if (startCleanup) {
+				var nextColumn = document.getElementById("level-" + startCleanup);
+				while (nextColumn) {
+					finderContent.removeChild(nextColumn);
+					finder.colCpt -= 1;
+					nextColumn = document.getElementById("level-" + ++startCleanup);
+				}
+			}
+			
+			// request
+			var req = new XMLHttpRequest();
+			req.open("POST", sConnUrl, false); // synchrone
+			req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
+			req.send("command=" + command + "&path="+escape(path) + "&Type=" + ressourceType);
+			var respDom = req.responseXML.documentElement;
+			
+			
+			var list = document.createElement('UL');
+			list.style.height= getWindowHeight() - scrollbarPlaceholder_offset + "px";
+			cellLevel.appendChild(list);
+			
+			switch (respDom.tagName) {
+				case 'ls' :
+					// import listing
+					var rows = respDom.getElementsByTagName('row');
+					var row, listItem, icon;
+			
+					for (var i = 0 ; i<rows.length ; i++){
+						row = rows[i];
+						listItem = document.createElement('li');
+						if (row.getAttribute('folderish') != "0")
+							listItem.className = 'folderish';
+						else
+							listItem.className = 'contentish';
+				
+						icon = document.createElement('img');
+						with (icon) {
+							src = row.getAttribute('icon');
+							width = "16";
+							height = "16";
+							border = "0";
+						}
+				
+						listItem.path = row.getAttribute('path');
+						listItem.link = row.getAttribute('link');
+						listItem.appendChild(icon);
+						listItem.appendChild(document.createTextNode(row.firstChild.nodeValue));
+						list.appendChild(listItem);
+					}
+					break;
+				case 'info' :
+					var li = document.createElement('li');
+					list.appendChild(li);
+					li.innerHTML = respDom.firstChild.nodeValue;
+					
+					// add create link button
+					li = document.createElement('li');
+					li.style.textAlign = 'center';
+					var createLinkBtn = document.createElement('button');
+					var text = (ressourceType == 'Image') ? 'Insert' : 'Create link';
+					createLinkBtn.appendChild(document.createTextNode(text));
+					
+					createLinkBtn.onclick = function(){
+					    var url = respDom.lastChild.firstChild.nodeValue;
+					    switch(window.parent.name) {
+					        case 'FCKeditorDialog_PlinnImage' :
+    							    window.parent.updateOrInsertImage(url);
+    							      break;
+    						  case 'FCKBrowseWindow' :
+    						  default:
+        							window.opener.SetUrl(url);
+        							break;
+					    }
+					    window.close();
+					};
+					
+					list.appendChild(li);
+					li.appendChild(createLinkBtn);
+					break;
+			}
+			
+			if (prevColNum != finder.colCpt) {
+				var finderWidth = finder.colCpt * cellWidth;
+				finder.style.width = finderWidth + "px";
+				if (finder.colCpt - prevColNum > 0) {
+					var start = (window.scrollX) ? window.scrollX : document.body.scrollLeft;
+					var stop = finder.colCpt * cellWidth - getWindowWidth();
+					smoothScroll(start, stop);
+				}
+			}
+		}
+		
+		function smoothScroll(start, stop) {
+			start += scrollXStep;
+			window.scroll(start, 0);
+			if (start < stop) {
+				setTimeout('smoothScroll(' + start + ', ' + stop + ')', scrollTimeStep);
+			}
+		}
+
+		
+		// ]]>
+		</script>
+	</head>
+	<body>
+	<table  id="finder" cellspacing="0">
+	<tr id="finderContent">
+	<td id="level-0"><ul>
+			<li class="folderish">Folder</li>
+			<li class="contentish">Content</li>
+		</ul>
+	</td>
+	</tr>
+	</table>
+  </body>
+</html>
\ No newline at end of file
diff --git a/skins/ckeditor/filemanager/browser/mac_finder/connectors/plinn/connector.py b/skins/ckeditor/filemanager/browser/mac_finder/connectors/plinn/connector.py
new file mode 100644
index 0000000..61d0eae
--- /dev/null
+++ b/skins/ckeditor/filemanager/browser/mac_finder/connectors/plinn/connector.py
@@ -0,0 +1,73 @@
+##parameters=command, path, Type=None
+from Products.CMFCore.utils import getToolByName
+from Products.CMFCore.permissions import View
+mtool = getToolByName(context, 'portal_membership')
+checkView = lambda o : mtool.checkPermission(View, o)
+utool = getToolByName(context, 'portal_url')
+portal = utool.getPortalObject()
+
+def replaceXMLEntities(text) :
+	for c, ent in (('<', '&lt;'), ('>', '&gt;'), ('&', '&amp;')) :
+		text = text.replace(c, ent)
+	return text
+
+ob = portal
+path = path.replace('\\', '/')
+path = path.strip('/')
+
+if path :
+	for name in path.split('/') :
+		ob = getattr(ob, name)
+
+if command == 'ls' :
+	objects = []
+	if ob.isPrincipiaFolderish :
+		if Type == 'Image' : filter = {'portal_type' : ['Plinn Folder', 'Portfolio', 'Photo']}
+		else : filter = {}
+		objects = ob.listNearestFolderContents(contentFilter = filter)
+		objects = sequence.sort( objects, (('title_or_id', 'nocase', 'asc'),) )
+
+	# xml printing
+	print '<ls>'
+	for o in objects :
+		path = o.getPhysicalPath()
+		encodedPath = ''
+		partObject = portal
+		for name in path[1:] :
+			partObject = getattr(partObject, name)
+			sep = checkView(partObject) and '/' or '\\'
+			encodedPath += sep+name
+		
+		row = '<row path="%(path)s" folderish="%(folderish)s" icon="%(icon)s" link="%(link)s">%(title)s</row>' % {
+			'path' : encodedPath,
+			'folderish' : o.isPrincipiaFolderish,
+			'icon' : o.getIcon(),
+			'title' : replaceXMLEntities(o.title_or_id()),
+			'link' : o.absolute_url()
+			}
+		print row
+	print '</ls>'
+
+elif command == 'info':
+	#linkFunction = (Type == 'Image') and (lambda o : o.absolute_url() + '/index_html') or (lambda o : o.absolute_url())
+	linkFunction = lambda o : o.absolute_url()
+	ti = ob.getTypeInfo()
+	method_id = ti.queryMethodID('info')
+	meth = method_id and getattr(ob, method_id) or (lambda:'Not implemented')
+	lines = []
+	pr = lines.append
+	pr('<info>')
+	# print info summary in a CDATA section
+	pr('<![CDATA[')
+	pr(meth())
+	pr(']]>')
+	# print the url link in a <link> tag
+	pr('<link>')
+	pr(linkFunction(ob))
+	pr('</link>')
+	pr('</info>')
+	print ''.join(lines)
+
+
+context.REQUEST.RESPONSE.setHeader('content-type', 'text/xml; charset=utf-8')
+return printed
\ No newline at end of file
diff --git a/skins/ckeditor/filemanager/browser/mac_finder/images/folderish-selected.gif b/skins/ckeditor/filemanager/browser/mac_finder/images/folderish-selected.gif
new file mode 100644
index 0000000000000000000000000000000000000000..ebad9f6348aaa0babd9151b054cd46fa4598a559
GIT binary patch
literal 107
zcmZ?wbhEHb<Yr)J*v!C?H|t^Y<oj7O9#$-Ta{Jl$N3VW1uY7j-!M77PzeM-m`~UyH
xMd@`0B%t_{1<ca{ksvb|SR^*|xMqjG;;7!}#QD6k&9o^=tU!cuLnsS_H2}CdC?Eg;

literal 0
HcmV?d00001

diff --git a/skins/ckeditor/filemanager/browser/mac_finder/images/folderish.gif b/skins/ckeditor/filemanager/browser/mac_finder/images/folderish.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c359a8f57ab07da2363fda5380d20755c0de5d01
GIT binary patch
literal 163
zcmZ?wbhEHb<Yr)JIKsei>C&Zl@7`U!c=6-Mk6*rgnKNh3xpU{{&!0bG!i4+x?{{`~
zu3o+R=+UG5_U-HG>1k_gJ8<B@|Ns9Phz5#3S-@&_KqSac23Cayhh0)4?Yfy~sI$m=
a9kSEAqR{KPo5|3*jj=m~gU4Hu!5RQiR5u0y

literal 0
HcmV?d00001

diff --git a/skins/ckeditor/filemanager/browser/mac_finder/images/folderishNode.gif b/skins/ckeditor/filemanager/browser/mac_finder/images/folderishNode.gif
new file mode 100644
index 0000000000000000000000000000000000000000..2cb7b83a6f5f0aeb9ae66ad74052e6cfa571297d
GIT binary patch
literal 160
zcmZ?wbhEHbWM^P!I3mb!;J|^lwzhry_Vx7i%$YOi<HwKh-n~0_?%dI%M>{(^FJ8Pj
zfByV0U%p(rbZNqb3HR^cU%h(u|Ns9Phz5#3Sr{1@1Q~QdIzV<Zu*yDYa8Z$Ta1Lf;
b*r4KnWLuN+nTA6r4g^kNaqbjhVz34PaMw5$

literal 0
HcmV?d00001

-- 
2.20.1