From: Benoît Pin <pin@cri.ensmp.fr> Date: Tue, 16 Aug 2011 11:22:13 +0000 (+0200) Subject: Ajout du code du finder ajax depuis le dépôt de FCK. X-Git-Tag: 3.6.1~22 X-Git-Url: https://scm.cri.ensmp.fr/git/ckeditor.git/commitdiff_plain/92ea98a2568a0e59779b924a8b699bea7936fa14?ds=inline Ajout du code du finder ajax depuis le dépôt de FCK. --- 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 0000000..69fe1b3 Binary files /dev/null and b/skins/ckeditor/filemanager/browser/mac_finder/_graphics/folderish_icons.psd differ 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 (('<', '<'), ('>', '>'), ('&', '&')) : + 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 0000000..ebad9f6 Binary files /dev/null and b/skins/ckeditor/filemanager/browser/mac_finder/images/folderish-selected.gif differ 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 0000000..c359a8f Binary files /dev/null and b/skins/ckeditor/filemanager/browser/mac_finder/images/folderish.gif differ 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 0000000..2cb7b83 Binary files /dev/null and b/skins/ckeditor/filemanager/browser/mac_finder/images/folderishNode.gif differ