organizer.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:6k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ Ext.onReady(function(){
  2.     Ext.QuickTips.init();
  3.     // Album toolbar
  4.     var newIndex = 3;
  5.     var tb = new Ext.Toolbar({
  6.         items:[{
  7.             text: 'New Album',
  8.             iconCls: 'album-btn',
  9.             handler: function(){
  10.                 var node = root.appendChild(new Ext.tree.TreeNode({
  11.                     text:'Album ' + (++newIndex),
  12.                     cls:'album-node',
  13.                     allowDrag:false
  14.                 }));
  15.                 tree.getSelectionModel().select(node);
  16.                 setTimeout(function(){
  17.                     ge.editNode = node;
  18.                     ge.startEdit(node.ui.textNode);
  19.                 }, 10);
  20.             }
  21.         }]
  22.     });
  23.     // set up the Album tree
  24.     var tree = new Ext.tree.TreePanel({
  25.          // tree
  26.          animate:true,
  27.          enableDD:true,
  28.          containerScroll: true,
  29.          ddGroup: 'organizerDD',
  30.          rootVisible:false,
  31.          // layout
  32.          region:'west',
  33.          width:200,
  34.          split:true,
  35.          // panel
  36.          title:'My Albums',
  37.          autoScroll:true,
  38.          tbar: tb,
  39.          margins: '5 0 5 5'
  40.     });
  41.     var root = new Ext.tree.TreeNode({
  42.         text: 'Albums',
  43.         allowDrag:false,
  44.         allowDrop:false
  45.     });
  46.     tree.setRootNode(root);
  47.     root.appendChild(
  48.         new Ext.tree.TreeNode({text:'Album 1', cls:'album-node', allowDrag:false}),
  49.         new Ext.tree.TreeNode({text:'Album 2', cls:'album-node', allowDrag:false}),
  50.         new Ext.tree.TreeNode({text:'Album 3', cls:'album-node', allowDrag:false})
  51.     );
  52.     // add an inline editor for the nodes
  53.     var ge = new Ext.tree.TreeEditor(tree, {/* fieldconfig here */ }, {
  54.         allowBlank:false,
  55.         blankText:'A name is required',
  56.         selectOnFocus:true
  57.     });
  58.     // Set up images view
  59.     var view = new Ext.DataView({
  60.         itemSelector: 'div.thumb-wrap',
  61.         style:'overflow:auto',
  62.         multiSelect: true,
  63.         plugins: new Ext.DataView.DragSelector({dragSafe:true}),
  64.         store: new Ext.data.JsonStore({
  65.             url: '../view/get-images.php',
  66.             autoLoad: true,
  67.             root: 'images',
  68.             id:'name',
  69.             fields:[
  70.                 'name', 'url',
  71.                 {name: 'shortName', mapping: 'name', convert: shortName}
  72.             ]
  73.         }),
  74.         tpl: new Ext.XTemplate(
  75.             '<tpl for=".">',
  76.             '<div class="thumb-wrap" id="{name}">',
  77.             '<div class="thumb"><img src="../view/{url}" class="thumb-img"></div>',
  78.             '<span>{shortName}</span></div>',
  79.             '</tpl>'
  80.         )
  81.     });
  82.     var images = new Ext.Panel({
  83.         id:'images',
  84.         title:'My Images',
  85.         region:'center',
  86.         margins: '5 5 5 0',
  87.         layout:'fit',
  88.         
  89.         items: view
  90.     });
  91.     var layout = new Ext.Panel({
  92.         layout: 'border',
  93.         width:650,
  94.         height:400,
  95.         items: [tree, images]
  96.     });
  97.     layout.render('layout');
  98.     var dragZone = new ImageDragZone(view, {containerScroll:true,
  99.         ddGroup: 'organizerDD'});
  100. });
  101. /**
  102.  * Create a DragZone instance for our JsonView
  103.  */
  104. ImageDragZone = function(view, config){
  105.     this.view = view;
  106.     ImageDragZone.superclass.constructor.call(this, view.getEl(), config);
  107. };
  108. Ext.extend(ImageDragZone, Ext.dd.DragZone, {
  109.     // We don't want to register our image elements, so let's 
  110.     // override the default registry lookup to fetch the image 
  111.     // from the event instead
  112.     getDragData : function(e){
  113.         var target = e.getTarget('.thumb-wrap');
  114.         if(target){
  115.             var view = this.view;
  116.             if(!view.isSelected(target)){
  117.                 view.onClick(e);
  118.             }
  119.             var selNodes = view.getSelectedNodes();
  120.             var dragData = {
  121.                 nodes: selNodes
  122.             };
  123.             if(selNodes.length == 1){
  124.                 dragData.ddel = target;
  125.                 dragData.single = true;
  126.             }else{
  127.                 var div = document.createElement('div'); // create the multi element drag "ghost"
  128.                 div.className = 'multi-proxy';
  129.                 for(var i = 0, len = selNodes.length; i < len; i++){
  130.                     div.appendChild(selNodes[i].firstChild.firstChild.cloneNode(true)); // image nodes only
  131.                     if((i+1) % 3 == 0){
  132.                         div.appendChild(document.createElement('br'));
  133.                     }
  134.                 }
  135.                 var count = document.createElement('div'); // selected image count
  136.                 count.innerHTML = i + ' images selected';
  137.                 div.appendChild(count);
  138.                 
  139.                 dragData.ddel = div;
  140.                 dragData.multi = true;
  141.             }
  142.             return dragData;
  143.         }
  144.         return false;
  145.     },
  146.     // this method is called by the TreeDropZone after a node drop
  147.     // to get the new tree node (there are also other way, but this is easiest)
  148.     getTreeNode : function(){
  149.         var treeNodes = [];
  150.         var nodeData = this.view.getRecords(this.dragData.nodes);
  151.         for(var i = 0, len = nodeData.length; i < len; i++){
  152.             var data = nodeData[i].data;
  153.             treeNodes.push(new Ext.tree.TreeNode({
  154.                 text: data.name,
  155.                 icon: '../view/'+data.url,
  156.                 data: data,
  157.                 leaf:true,
  158.                 cls: 'image-node'
  159.             }));
  160.         }
  161.         return treeNodes;
  162.     },
  163.     
  164.     // the default action is to "highlight" after a bad drop
  165.     // but since an image can't be highlighted, let's frame it 
  166.     afterRepair:function(){
  167.         for(var i = 0, len = this.dragData.nodes.length; i < len; i++){
  168.             Ext.fly(this.dragData.nodes[i]).frame('#8db2e3', 1);
  169.         }
  170.         this.dragging = false;    
  171.     },
  172.     
  173.     // override the default repairXY with one offset for the margins and padding
  174.     getRepairXY : function(e){
  175.         if(!this.dragData.multi){
  176.             var xy = Ext.Element.fly(this.dragData.ddel).getXY();
  177.             xy[0]+=3;xy[1]+=3;
  178.             return xy;
  179.         }
  180.         return false;
  181.     }
  182. });
  183. // Utility functions
  184. function shortName(name){
  185.     if(name.length > 15){
  186.         return name.substr(0, 12) + '...';
  187.     }
  188.     return name;
  189. };