You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1606 lines
45 KiB
1606 lines
45 KiB
<?xml version="1.0" encoding="utf-8" ?>
|
|
<jsml xmlns="http://cutesoft.net/jsml"
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://cutesoft.net/jsml ../core/jsml.xsd">
|
|
|
|
<jsml-def name="browsedialogitemtooltip">
|
|
<method name="showfloatbox" arguments="devent">
|
|
<![CDATA[
|
|
if(!self._hovered||!self.get_visible())
|
|
return;
|
|
if(self.currentdialog&&self.currentdialog.get_visible())
|
|
return;
|
|
if(!jsml.floatbox_allowautofloatbox(self._element))
|
|
return;
|
|
|
|
var text=self.itemtooltiptext;
|
|
if(!text)return;
|
|
|
|
var newoption={stopToggle:true,stopOverlay:true};
|
|
var br=jsml.get_body_rect();
|
|
newoption.x=devent.clientX+br.scrollLeft+5;
|
|
newoption.y=devent.clientY+br.scrollTop+5;
|
|
|
|
newoption.buttonClick=function()
|
|
{
|
|
self.invoke_event("click");
|
|
}
|
|
var dialog=jsml.class_create_instance("floatbox");
|
|
var htmlc=jsml.class_create_instance("htmlcontrol");
|
|
htmlc.set_html("<pre style='margin:0px;padding:2px;color: windowtext;font: normal 11px tahoma, arial, verdana, sans-serif;'>"
|
|
+jsml.html_encode(text)+"</pre>");
|
|
htmlc.set_dock("fill");
|
|
var gbr=jsml.get_body_rect();
|
|
htmlc.set_max_width(Math.floor(gbr.width*0.6));
|
|
htmlc.set_max_height(Math.floor(gbr.height*0.3));
|
|
htmlc.set_vertical_align("middle");
|
|
dialog.append_child(htmlc);
|
|
dialog.set_width(150);
|
|
dialog.set_padding(5);
|
|
dialog.set_back_color('#FFFFE0')
|
|
dialog._estyle.zIndex=editor._config.dialog_zindex;
|
|
dialog.show(newoption);
|
|
self.currentdialog=dialog;
|
|
]]>
|
|
</method>
|
|
<attach name="mousemove" arguments="jevent,devent">
|
|
<![CDATA[
|
|
self._hovered=true;
|
|
clearTimeout(self._showfbid);
|
|
self._showfbid=setTimeout(function()
|
|
{
|
|
self.showfloatbox(devent);
|
|
},333);
|
|
]]>
|
|
</attach>
|
|
<attach name="mouseleave">
|
|
<![CDATA[
|
|
self._hovered=false;
|
|
setTimeout(function()
|
|
{
|
|
if(self._hovered)return;
|
|
if(self.currentdialog&&self.currentdialog.get_visible())
|
|
{
|
|
self.currentdialog.close();
|
|
}
|
|
},33);
|
|
]]>
|
|
</attach>
|
|
</jsml-def>
|
|
|
|
<jsml-def name="browsedialogoncontextmenu">
|
|
<attach name="contextmenu" arguments="jevent,devent">
|
|
<![CDATA[
|
|
devent.cancel();
|
|
var anchor=devent.get_element();
|
|
var newoption={control:self,anchor:devent.get_element(),x:devent.offsetX+2,y:devent.offsetY+2,floatMode:'none',stopOverlay:true,stopDispose:true};
|
|
var menu=option.dialogcontrol.theitemmenu;
|
|
menu.invoke_recursive("updateitem",self._item);
|
|
menu.show(newoption);
|
|
function menuclosing()
|
|
{
|
|
menu.detach_event("closing",menuclosing);
|
|
self._estyle.fontWeight="";
|
|
//self._estyle.color="";
|
|
}
|
|
menu.attach_event("closing",menuclosing);
|
|
self._estyle.fontWeight="bold";
|
|
//self._estyle.color="darkgreen";
|
|
]]>
|
|
</attach>
|
|
</jsml-def>
|
|
|
|
<!-- # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
class browserdialogrow/browserdialogfolder/browserdialogfile
|
|
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -->
|
|
|
|
<panel jsml-class="browserdialogrow" height="21" border_width="0,1,0,0" border_color="white">
|
|
<attach name="mousehover">
|
|
self.set_back_color('#eeeeee');
|
|
</attach>
|
|
<attach name="mouseleave">
|
|
self.set_back_color('');
|
|
</attach>
|
|
<jsml-ref name="browsedialogoncontextmenu"/>
|
|
</panel>
|
|
|
|
<panel jsml-class="browserdialogfolder" jsml-base="browserdialogrow">
|
|
<checkbox dock="left" jsml-local="checkbox" width="20" padding="1,0,-1,0">
|
|
<attach name="change">
|
|
instance._item.IsChecked=self.get_checked();
|
|
</attach>
|
|
</checkbox>
|
|
<image dock="left" jsml-local="theicon" width="20" src="{folder}images/closedfolder.gif" border_width="0,0,0,1" border_color="white" padding="2,-1,-2,1" overflow="none" cursor="pointer" >
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</image>
|
|
<image dock="right" width="20" jsml-local="editbtn" jsml-base="imagebutton" src="{folder}images/edit.gif" padding="2" overflow="none">
|
|
<attach name="click">
|
|
option.dialogcontrol.startedititem(instance._item,instance);
|
|
</attach>
|
|
</image>
|
|
<label dock="right" width="60" jsml-local="lsize" vertical_align="middle" border_width="0,1,0,1" border_color="white" cursor="pointer" text_align="right" padding="0,4,0,0">
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</label>
|
|
<label dock="fill" jsml-local="lname" vertical_align="middle" border_width="0,0,0,1" border_color="white" cursor="pointer">
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</label>
|
|
<method name="update_check">
|
|
if(self._item)checkbox.set_checked(!!self._item.IsChecked);
|
|
</method>
|
|
<method name="bind_item">
|
|
<![CDATA[
|
|
self._item=value;
|
|
checkbox.set_checked(!!value.IsChecked);
|
|
lname.set_text(value.Name);
|
|
if(value.Size)lsize.set_text(value.Size);
|
|
if(value.Name=="..")
|
|
{
|
|
checkbox.set_visible(false);
|
|
editbtn.set_visible(false);
|
|
lsize.set_margin([0,20,0,0])
|
|
theicon.set_margin([0,0,0,20])
|
|
theicon.set_src("{folder}images/parentfolder.png");
|
|
}
|
|
]]>
|
|
</method>
|
|
|
|
</panel>
|
|
|
|
<panel jsml-class="browserdialogfile" jsml-base="browserdialogrow">
|
|
<checkbox dock="left" jsml-local="checkbox" width="20" padding="1,0,-1,0">
|
|
<attach name="change">
|
|
instance._item.IsChecked=self.get_checked();
|
|
</attach>
|
|
</checkbox>
|
|
<image dock="left" width="20" jsml-local="image" padding="2,0,-2,0" border_width="0,0,0,1" border_color="white" overflow="none" cursor="pointer" >
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</image>
|
|
<image dock="right" width="20" jsml-base="imagebutton" src="{folder}images/edit.gif" padding="2" overflow="none">
|
|
<attach name="click">
|
|
option.dialogcontrol.startedititem(instance._item,instance);
|
|
</attach>
|
|
</image>
|
|
<label dock="right" width="60" jsml-local="lsize" vertical_align="middle" border_width="0,1,0,1" border_color="white" cursor="pointer" text_align="right" padding="0,4,0,0">
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</label>
|
|
<label dock="right" jsml-local="ldime" width="10" vertical_align="middle" text_align="right" cursor="pointer">
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</label>
|
|
<label dock="fill" jsml-local="lname" vertical_align="middle" border_width="0,0,0,1" border_color="white" cursor="pointer">
|
|
<attach name="click">
|
|
option.dialogcontrol.select_item(instance._item);
|
|
</attach>
|
|
</label>
|
|
<method name="update_check">
|
|
if(self._item)checkbox.set_checked(!!self._item.IsChecked);
|
|
</method>
|
|
<method name="bind_item">
|
|
<![CDATA[
|
|
var MAX_STRING_LENGTH=24
|
|
|
|
self._item=value;
|
|
checkbox.set_checked(!!value.IsChecked);
|
|
|
|
var str=value.Name;
|
|
var len=0;
|
|
for(var i=0;i<str.length;i++)
|
|
{
|
|
len++;
|
|
if(str.charCodeAt(i)>256)
|
|
len++;
|
|
if(len>MAX_STRING_LENGTH&&i+2<str.length)
|
|
{
|
|
str=str.substring(0,i)+"..";
|
|
break;
|
|
}
|
|
}
|
|
lname.set_text(str);
|
|
if(value.Size)lsize.set_text(jsml.format_size(value.Size));
|
|
var ns=value.Name.split('.');
|
|
var ext=ns.length>1?ns[ns.length-1]:"";
|
|
ext=ext.toLowerCase();
|
|
switch(ext)
|
|
{
|
|
case "bmp":
|
|
case "jpg":
|
|
case "jpeg":
|
|
case "gif":
|
|
case "png":
|
|
case "arj":
|
|
case "asa":
|
|
case "asax":
|
|
case "ascx":
|
|
case "asmx":
|
|
case "asp":
|
|
case "aspx":
|
|
case "au":
|
|
case "avi":
|
|
case "bat":
|
|
case "cab":
|
|
case "chm":
|
|
case "com":
|
|
case "cs":
|
|
case "disco":
|
|
case "dll":
|
|
case "doc":
|
|
case "docx":
|
|
case "exe":
|
|
case "flv":
|
|
case "hlp":
|
|
case "htm":
|
|
case "html":
|
|
case "inc":
|
|
case "ini":
|
|
case "log":
|
|
case "mdb":
|
|
case "mid":
|
|
case "midi":
|
|
case "mov":
|
|
case "mp3":
|
|
case "mp4":
|
|
case "mpeg":
|
|
case "mpg":
|
|
case "pdf":
|
|
case "ppt":
|
|
case "rar":
|
|
case "rtf":
|
|
case "swf":
|
|
case "sys":
|
|
case "txt":
|
|
case "vb":
|
|
case "vbs":
|
|
case "vsdisco":
|
|
case "wav":
|
|
case "wmv":
|
|
case "wri":
|
|
case "xls":
|
|
case "xlsx":
|
|
case "xml":
|
|
case "zip":
|
|
image.set_src("{folder}images/"+ext+".gif");
|
|
break;
|
|
default:
|
|
image.set_src("{folder}images/unknown.gif");
|
|
break;
|
|
}
|
|
|
|
if(value.Width&&value.Width>0&&value.Height&&value.Height>0)
|
|
{
|
|
ldime.set_text(value.Width+"x"+value.Height);
|
|
}
|
|
else
|
|
{
|
|
ldime.set_visible(false);
|
|
}
|
|
|
|
var text=editor.GetLangText("NAME")+": "+self._item.Name+"\r\n"+editor.GetLangText("SIZE")+": "+jsml.format_size(self._item.Size);
|
|
if(self._item.Width&&self._item.Height)
|
|
text+="\r\n"+editor.GetLangText("DIMENSIONS")+": "+self._item.Width+" x "+self._item.Height;
|
|
if(self._item.Time)
|
|
{
|
|
var date=new Date(self._item.Time)
|
|
var dval=date.getFullYear()*10000+(date.getMonth()+1)*100+date.getDate();
|
|
dval=dval*1000000+date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
|
|
var dstr=String(dval).replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/,"$1-$2-$3 $4:$5")
|
|
text+="\r\n"+editor.GetLangText("DATECREATED")+": "+dstr;
|
|
}
|
|
|
|
if(true)
|
|
self.itemtooltiptext=text;
|
|
else
|
|
self.set_tooltip(text);
|
|
]]>
|
|
</method>
|
|
|
|
<jsml-ref name="browsedialogitemtooltip"/>
|
|
|
|
</panel>
|
|
|
|
|
|
|
|
<panel jsml-class="browsedialogsortmenuitem" jsml-base="rtemenuitem">
|
|
<initialize>
|
|
self.image.set_padding([3,-5,-3,5]);
|
|
self.image.set_margin([2,1,2,1]);
|
|
self.image.set_width(17);
|
|
self.image.set_height(17);
|
|
</initialize>
|
|
<property name="sort_name">
|
|
<get>return self._sortname;</get>
|
|
<set>self._sortname=value;</set>
|
|
</property>
|
|
<property name="sort_desc">
|
|
<get>return self._sortdesc;</get>
|
|
<set>
|
|
value=jsml.toboolean(value)
|
|
self._sortdesc=value;
|
|
self.set_src("{folder}images/sort_"+(value?"desc":"asc")+"_arrow.gif");
|
|
</set>
|
|
</property>
|
|
<attach name="showing">
|
|
self.set_checked(option.dialogcontrol.is_sort(self._sortname,!self._sortdesc));
|
|
</attach>
|
|
<attach name="click">
|
|
option.dialogcontrol.set_sort(self._sortname,!self._sortdesc);
|
|
</attach>
|
|
</panel>
|
|
|
|
<panel jsml-class="browsedialogbase">
|
|
|
|
<panel jsml-member="theitemmenu" jsml-base="floatmenu" jsml-append="false">
|
|
<panel jsml-base="rtemenuitem" htmlcode="@EDIT" src="{folder}images/edit.gif">
|
|
<initialize>
|
|
self.image.set_padding(2);
|
|
</initialize>
|
|
<attach name="updateitem" arguments="jevent,item">
|
|
<![CDATA[
|
|
self._currentitem=item;
|
|
var s=option.dialogcontrol._selectedstorage;
|
|
if(item.IsFolder)return self.set_visible(false);
|
|
var arr=item.Name.split('.');
|
|
var ext=arr[arr.length-1].toLowerCase();
|
|
switch(ext)
|
|
{
|
|
case "gif":case "png":case"jpg":case "jpeg":case "bmp":
|
|
self.set_visible(true);
|
|
break;
|
|
default:
|
|
self.set_visible(false);
|
|
break;
|
|
}
|
|
]]>
|
|
</attach>
|
|
<attach name="click">
|
|
if(self._disabled)return;
|
|
option.dialogcontrol.processmenucommand("edit",self._currentitem);
|
|
</attach>
|
|
</panel>
|
|
<panel jsml-base="rtemenuitem" htmlcode="@MOVE" src="{folder}images/move.png">
|
|
<initialize>
|
|
self.image.set_padding(1);
|
|
</initialize>
|
|
<attach name="updateitem" arguments="jevent,item">
|
|
self._currentitem=item;
|
|
var s=option.dialogcontrol._selectedstorage;
|
|
if(item.IsFolder)self.set_disabled(!s.AllowMoveFolder);
|
|
else self.set_disabled(!s.AllowMoveFile);
|
|
</attach>
|
|
<attach name="click">
|
|
if(self._disabled)return;
|
|
option.dialogcontrol.processmenucommand("move",self._currentitem);
|
|
</attach>
|
|
</panel>
|
|
<panel jsml-base="rtemenuitem" htmlcode="@COPY" src="{folder}images/copy.png">
|
|
<attach name="updateitem" arguments="jevent,item">
|
|
self._currentitem=item;
|
|
var s=option.dialogcontrol._selectedstorage;
|
|
if(item.IsFolder)self.set_disabled(!s.AllowMoveFolder);
|
|
else self.set_disabled(!s.AllowMoveFile);
|
|
</attach>
|
|
<attach name="click">
|
|
if(self._disabled)return;
|
|
option.dialogcontrol.processmenucommand("copy",self._currentitem);
|
|
</attach>
|
|
</panel>
|
|
<panel jsml-base="rtemenuitem" htmlcode="@DELETE" src="{folder}images/delete.png">
|
|
<attach name="updateitem" arguments="jevent,item">
|
|
self._currentitem=item;
|
|
var s=option.dialogcontrol._selectedstorage;
|
|
if(item.IsFolder)self.set_disabled(!s.AllowDeleteFolder);
|
|
else self.set_disabled(!s.AllowDeleteFile);
|
|
</attach>
|
|
<attach name="click">
|
|
if(self._disabled)return;
|
|
option.dialogcontrol.processmenucommand("delete",self._currentitem);
|
|
</attach>
|
|
</panel>
|
|
</panel>
|
|
<panel jsml-member="thesortmenu" jsml-base="floatmenu" jsml-append="false">
|
|
<panel jsml-base="browsedialogsortmenuitem" htmlcode="@MENU_SORTBYNAMEASC" sort_desc="false" sort_name="Name" />
|
|
<panel jsml-base="browsedialogsortmenuitem" htmlcode="@MENU_SORTBYNAMEDESC" sort_desc="true" sort_name="Name" />
|
|
<panel jsml-base="browsedialogsortmenuitem" htmlcode="@MENU_SORTBYSIZEASC" sort_desc="false" sort_name="Size" />
|
|
<panel jsml-base="browsedialogsortmenuitem" htmlcode="@MENU_SORTBYSIZEDESC" sort_desc="true" sort_name="Size" />
|
|
<panel jsml-base="browsedialogsortmenuitem" htmlcode="@MENU_SORTBYDATEASC" sort_desc="false" sort_name="Time" />
|
|
<panel jsml-base="browsedialogsortmenuitem" htmlcode="@MENU_SORTBYDATEDESC" sort_desc="true" sort_name="Time" />
|
|
</panel>
|
|
<initialize>
|
|
self.thesortmenu._estyle.zIndex=editor._config.dialog_zindex;
|
|
self.theitemmenu._estyle.zIndex=editor._config.dialog_zindex;
|
|
</initialize>
|
|
<attach name="disposing">
|
|
self.thesortmenu.dispose();
|
|
self.theitemmenu.dispose();
|
|
</attach>
|
|
|
|
|
|
|
|
<panel dock="top" height="22" margin="5,3,0,3">
|
|
<panel dock="left" margin="0,3,0,3" width="296">
|
|
<image dock="left" width="20" margin="0,0,2,0" vertical_align="middle" horizontal_align="center" src="{folder}images/openfolder.png">
|
|
</image>
|
|
<panel jsml-base="panelbutton" jsml-local="storagepanel" dock="left" width="10" overflow="visible" visible="false">
|
|
<label jsml-local="storagelabel" dock="left" width="10" padding="0,-1,0,1" text="!" vertical_align="middle" cursor="pointer" />
|
|
<attach name="click">
|
|
instance.call_selectstorage(self);
|
|
</attach>
|
|
</panel>
|
|
<panel jsml-base="panelbutton" dock="left" overflow="visible" width="32" margin="0,0,0,-2">
|
|
<label jsml-local="labelpath" dock="fill" text="/" padding="0,1,0,0" width="32" vertical_align="middle" cursor="pointer"/>
|
|
<attach name="click">
|
|
instance.call_openfolder(self);
|
|
</attach>
|
|
</panel>
|
|
</panel>
|
|
|
|
|
|
<image jsml-base="imagebutton" dock="left" tooltip="@REFRESH" width="22" padding="3,2,1,2" border_width="1" src="{folder}images/refresh.gif" >
|
|
<attach name="click">
|
|
instance.call_reload(self);
|
|
</attach>
|
|
</image>
|
|
|
|
<image jsml-base="imagebutton" dock="left" width="22" padding="3,2,1,2" border_width="1" src="{folder}images/newfolder.gif">
|
|
<attach name="updatestorage">
|
|
var allow=instance._selectedstorage.AllowCreateFolder;
|
|
self.set_disabled(!allow);
|
|
self.set_tooltip(editor.GetLangText(allow?"TOOLTIP_CREATEFOLDER":"TOOLTIP_FUNCTIONDISABLED"));
|
|
</attach>
|
|
<attach name="click">
|
|
if(self.get_disabled())return;
|
|
instance.call_createfolder(self);
|
|
</attach>
|
|
</image>
|
|
<image jsml-base="imagebutton" dock="left" width="22" padding="2,2,2,2" border_width="1" src="{folder}images/move.png">
|
|
<attach name="updatestorage">
|
|
var allow=instance._selectedstorage.AllowMoveFolder||instance._selectedstorage.AllowMoveFile;
|
|
self.set_disabled(!allow);
|
|
self.set_tooltip(editor.GetLangText(allow?"TOOLTIP_MOVEITEMS":"TOOLTIP_FUNCTIONDISABLED"));
|
|
</attach>
|
|
<attach name="click">
|
|
if(self.get_disabled())return;
|
|
instance.call_moveitems(self);
|
|
</attach>
|
|
</image>
|
|
<image jsml-base="imagebutton" dock="left" width="22" border_width="1" src="{folder}images/copy.png">
|
|
<attach name="updatestorage">
|
|
var allow=instance._selectedstorage.AllowCopyFolder||instance._selectedstorage.AllowCopyFile;
|
|
self.set_disabled(!allow);
|
|
self.set_tooltip(editor.GetLangText(allow?"TOOLTIP_COPYITEMS":"TOOLTIP_FUNCTIONDISABLED"));
|
|
</attach>
|
|
<attach name="click">
|
|
if(self.get_disabled())return;
|
|
instance.call_copyitems(self);
|
|
</attach>
|
|
</image>
|
|
<image jsml-base="imagebutton" dock="left" width="22" border_width="1" src="{folder}images/delete.png">
|
|
<attach name="updatestorage">
|
|
var allow=instance._selectedstorage.AllowDeleteFolder||instance._selectedstorage.AllowDeleteFile;
|
|
self.set_disabled(!allow);
|
|
self.set_tooltip(editor.GetLangText(allow?"TOOLTIP_DELETEITEMS":"TOOLTIP_FUNCTIONDISABLED"));
|
|
</attach>
|
|
<attach name="click">
|
|
if(self.get_disabled())return;
|
|
instance.call_deleteitems(self);
|
|
</attach>
|
|
</image>
|
|
|
|
<image jsml-base="imagebutton" dock="left" tooltip="@SORT" width="22" padding="4,0,0,4" border_width="1" src="{folder}images/sort.gif" vertical_align="middle" horizontal_align="center">
|
|
<attach name="click">
|
|
instance.thesortmenu.show({control:self,stopDispose:true});
|
|
</attach>
|
|
</image>
|
|
|
|
<image jsml-base="imagebutton" jsml-local="uploadbtn" dock="left" width="22" padding="4,1,0,3" border_width="1" src="{folder}images/uploadimage.png" vertical_align="middle">
|
|
<attach name="updatestorage">
|
|
var allow=instance._selectedstorage.AllowUpload;
|
|
self.set_disabled(!allow);
|
|
self.set_tooltip(editor.GetLangText(allow?"UPLOAD":"TOOLTIP_FUNCTIONDISABLED"));
|
|
</attach>
|
|
<method name="showfloatbox">
|
|
<![CDATA[
|
|
if(!self._hovered||!self.get_visible())
|
|
return;
|
|
if(self.currentdialog&&self.currentdialog.get_visible())
|
|
return;
|
|
if(!jsml.floatbox_allowautofloatbox(self._element))
|
|
return;
|
|
var storage=instance._selectedstorage;
|
|
var newoption={storage:storage,storages:option.storages,folder:"/",items:[]}
|
|
newoption.control=self
|
|
newoption.floatMode="b-r";
|
|
//newoption.onoverlay=function(overlay,floatbox)
|
|
//{
|
|
// editor.RegisterUploadButton(overlay,true);
|
|
// floatbox.attach_event("disposing",function()
|
|
// {
|
|
// editor.RemoveUploadButton(overlay);
|
|
// });
|
|
//}
|
|
self.currentdialog=editor.ShowXmlFloatBox(editor.BuildDialogUrl("uploadinfo.xml"),newoption);
|
|
]]>
|
|
</method>
|
|
<attach name="click">
|
|
self.showfloatbox();
|
|
</attach>
|
|
<attach name="mousehover">
|
|
<![CDATA[
|
|
self._hovered=true;
|
|
//setTimeout(self.delegate(self.showfloatbox),666);
|
|
]]>
|
|
</attach>
|
|
<attach name="mouseleave">
|
|
self._hovered=false;
|
|
</attach>
|
|
</image>
|
|
|
|
<panel dock="right" width="120">
|
|
<panel dock="bottom" height="19" margin="0,0,1,0">
|
|
<image dock="left" src="{folder}images/filter_l.gif" width="19"/>
|
|
<image dock="right" src="{folder}images/filter_c.gif" width="19" cursor="pointer">
|
|
<attach name="click">
|
|
instance.set_filter("");
|
|
filtertextbox.set_text("");
|
|
filtertextbox.focus();
|
|
</attach>
|
|
</image>
|
|
<panel dock="fill" background="url({folder}images/filter_m.gif) repeat-x">
|
|
<textbox jsml-local="filtertextbox" dock="fill" border_width="0" back_color="transparent" >
|
|
<attach name="enterkey">
|
|
instance.set_filter(self.get_text());
|
|
</attach>
|
|
<attach name="change">
|
|
instance.set_filter(self.get_text());
|
|
</attach>
|
|
<attach name="keyup">
|
|
instance.set_filter(self.get_text());
|
|
</attach>
|
|
</textbox>
|
|
</panel>
|
|
</panel>
|
|
</panel>
|
|
|
|
</panel>
|
|
|
|
<panel jsml-local="panelafterupload" dock="top" margin="2" padding="2,2,2,6" overflow="visible" visible="false" back_color="#EEEECC">
|
|
<label dock="left" text="@msg_displayuploaded" vertical_align="middle" />
|
|
<panel jsml-base="panelbutton" dock="left" margin="0,3,0,3">
|
|
<label dock="fill" text_color="blue" text="@msg_showall" vertical_align="middle" horizontal_align="center" cursor="pointer" >
|
|
<initialize>
|
|
self._content.style.textDecoration='underline';
|
|
</initialize>
|
|
<attach name="click">
|
|
panelafterupload.set_visible(false);
|
|
instance._onlyshowchecked=false;
|
|
instance.fill_items(instance._folderitem.Items,true);
|
|
</attach>
|
|
</label>
|
|
</panel>
|
|
</panel>
|
|
|
|
|
|
<!-- # # # # # # # # # # # # # # # #
|
|
dialog code
|
|
# # # # # # # # # # # # # # # # -->
|
|
|
|
<method name="setisloading">
|
|
</method>
|
|
|
|
<method name="select_file">
|
|
</method>
|
|
<method name="clearitemcontrols">
|
|
</method>
|
|
<method name="additemcontrols">
|
|
</method>
|
|
|
|
<attach name="updatestorage">
|
|
storagelabel.set_text(self._selectedstorage.Name);
|
|
</attach>
|
|
<attach name="updateui_folderload">
|
|
labelpath.set_text(self._currdir);
|
|
</attach>
|
|
<attach name="updateui_storagelist">
|
|
storagepanel.set_visible(self._allstorages.length>1);
|
|
</attach>
|
|
<attach name="updateui_afterupload">
|
|
panelafterupload.set_visible(self._onlyshowchecked);
|
|
</attach>
|
|
|
|
<attach name="doinit_uploader">
|
|
<![CDATA[
|
|
//delay load the uploader..
|
|
uploadbtn._element.onmouseover=function()
|
|
{
|
|
uploadbtn.invoke_event("mousehover");
|
|
}
|
|
uploadbtn._element.onmouseout=function()
|
|
{
|
|
uploadbtn.invoke_event("mouseleave");
|
|
}
|
|
setTimeout(function()
|
|
{
|
|
editor.RegisterUploadButton(document.createElement("DIV"));
|
|
},1000);
|
|
//editor.RegisterUploadButton(uploadbtn._element);
|
|
]]>
|
|
</attach>
|
|
<attach name="disposing">
|
|
uploadbtn._element.onmouseover=jsml.empty_function;
|
|
uploadbtn._element.onmouseout=jsml.empty_function;
|
|
//editor.RemoveUploadButton(uploadbtn._element);
|
|
</attach>
|
|
|
|
|
|
<initialize>
|
|
option.dialogcontrol=self;
|
|
self._sortmode="Name";
|
|
self._sortdesc=false;
|
|
self.editoreventid=editor.AttachEvent(self.delegate(self.processeditorevent));
|
|
</initialize>
|
|
<attach name="disposing">
|
|
editor.DetachEvent(self.editoreventid);
|
|
</attach>
|
|
|
|
|
|
<property name="storage">
|
|
<get>
|
|
return self._selectedstorage;
|
|
</get>
|
|
<set arguments="storage,folder">
|
|
<![CDATA[
|
|
var exts=storage.Extensions.split('.').join('').split('*').join('').split(',');
|
|
for(var i=0;i<exts.length;i++)exts[i]="."+exts[i];
|
|
self._selectedextensions=exts;
|
|
self._selectedstorage=storage;
|
|
self.change_folder(folder||"/");
|
|
self.invoke_recursive("updatestorage");
|
|
]]>
|
|
</set>
|
|
</property>
|
|
|
|
<method name="reportError" arguments="msg">
|
|
<![CDATA[
|
|
if(!msg)return;
|
|
if(msg.substring(0,6)=="ERROR:")
|
|
{
|
|
msg=msg.substring(6);
|
|
var pos=msg.indexOf(":");
|
|
if(pos!=-1)
|
|
{
|
|
var word=msg.substring(0,pos).toLowerCase();
|
|
var arg='-';
|
|
switch(word)
|
|
{
|
|
case "maxfilesize":
|
|
arg=self._selectedstorage.MaxFileSize+"KB";
|
|
break;
|
|
case "maxfoldersize":
|
|
arg=self._selectedstorage.MaxFolderSize+"KB";
|
|
break;
|
|
case "maximagewidth":
|
|
arg=self._selectedstorage.MaxFolderWidth;
|
|
break;
|
|
case "maximageheight":
|
|
arg=self._selectedstorage.MaxFolderHeight;
|
|
break;
|
|
}
|
|
msg=editor.GetLangText("error_"+word);
|
|
msg=msg.split("{0}").join(arg);
|
|
}
|
|
}
|
|
editor.Alert(msg);
|
|
]]>
|
|
</method>
|
|
|
|
<method name="handlecreatefolder" arguments="res">
|
|
<![CDATA[
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
|
|
var item=res.ReturnValue;
|
|
if(!item)return;
|
|
|
|
var folder=self._currdir||"/";
|
|
// //auto enter the new folder ?
|
|
//folder += item.Name+"/"
|
|
panelafterupload.set_visible(false);
|
|
instance._onlyshowchecked=false;
|
|
self.change_folder( folder );
|
|
]]>
|
|
</method>
|
|
<method name="handlemoveitems" arguments="res">
|
|
<![CDATA[
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
editor.Alert(editor.GetLangText("msg_itembemoved"));
|
|
panelafterupload.set_visible(false);
|
|
instance._onlyshowchecked=false;
|
|
self.change_folder(self._currdir||"/");
|
|
]]>
|
|
</method>
|
|
<method name="handlecopyitems" arguments="res">
|
|
<![CDATA[
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
editor.Alert(editor.GetLangText("msg_itembecopied"));
|
|
]]>
|
|
</method>
|
|
<method name="handledeleteitems" arguments="res">
|
|
if(res.Error)self.reportError(res.Error.message);
|
|
panelafterupload.set_visible(false);
|
|
instance._onlyshowchecked=false;
|
|
self.change_folder(self._currdir||"/");
|
|
</method>
|
|
|
|
<method name="handlegetfolderitem" arguments="res">
|
|
<![CDATA[
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
|
|
var folderitem=res.ReturnValue;
|
|
if(!folderitem)return;
|
|
|
|
self._currdir=self._chaningdir;
|
|
self._folderitem=folderitem;
|
|
|
|
var checkmap=self["checkmap:"+self._currdir];
|
|
if(checkmap)
|
|
{
|
|
var arr=self._folderitem.Items;
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
var n=arr[i].Name;
|
|
if(n=="..")continue;
|
|
if(checkmap[self._currdir+":"+n])
|
|
arr[i].IsChecked=true;
|
|
}
|
|
}
|
|
|
|
self.fill_items(folderitem.Items,true);
|
|
|
|
self.invoke_event("updateui_folderload");
|
|
|
|
]]>
|
|
</method>
|
|
<method name="handlegetstorages" arguments="res">
|
|
<![CDATA[
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
|
|
self._allstorages=res.ReturnValue;
|
|
|
|
self.set_storage(self._allstorages[0],self._chaningdir);
|
|
|
|
if(!self._uploaderinited)
|
|
{
|
|
self.invoke_event("doinit_uploader");
|
|
self._uploaderinited=true;
|
|
}
|
|
|
|
self.invoke_event("updateui_storagelist");
|
|
|
|
]]>
|
|
</method>
|
|
<method name="handlechangename" arguments="res">
|
|
<![CDATA[
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
|
|
var newname=res.ReturnValue;
|
|
if(!newname)
|
|
{
|
|
editor.Alert(editor.GetLangText("msg_failedrename"));
|
|
return;
|
|
}
|
|
|
|
if(self._chaningnamectrl)
|
|
{
|
|
var item=self._chaningnamectrl._item;
|
|
item.Name=newname;
|
|
self._chaningnamectrl.bind_item(item,self);
|
|
}
|
|
|
|
]]>
|
|
</method>
|
|
<method name="handleuploadfiles" arguments="res">
|
|
<![CDATA[
|
|
|
|
self._uploadertoreset.reset();
|
|
|
|
self.setisloading(false);
|
|
if(res.Error)
|
|
{
|
|
self.reportError(res.Error.message);
|
|
return true;
|
|
}
|
|
|
|
var arr=res.ReturnValue;
|
|
if(!arr||arr.length==0)
|
|
{
|
|
self.change_folder(self._currdir);
|
|
return;
|
|
}
|
|
|
|
var errcount=0;
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
if(typeof(arr[i])=="string")
|
|
{
|
|
self.reportError(arr[i]);
|
|
errcount++;
|
|
}
|
|
}
|
|
|
|
if(errcount==arr.length)
|
|
return;
|
|
|
|
self.checkallitems(false);
|
|
|
|
var items=self._folderitem.Items;
|
|
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
if(typeof(arr[i])=="string")
|
|
continue;
|
|
arr[i].IsChecked=true;
|
|
var exists=false;
|
|
for(var j=0;j<items.length;j++)
|
|
{
|
|
if(items[j].Name!=arr[i].Name)
|
|
continue;
|
|
items[j]=arr[i];
|
|
exists=true;
|
|
break;
|
|
}
|
|
if(!exists)
|
|
{
|
|
items.push(arr[i]);
|
|
}
|
|
}
|
|
|
|
self._onlyshowchecked=true;
|
|
self.invoke_event("updateui_afterupload");
|
|
self.set_sort("Time",false);
|
|
self.fill_items(items,true);
|
|
self.select_item(arr[0]);
|
|
]]>
|
|
</method>
|
|
<method name="fill_items" arguments="arr,reset">
|
|
<![CDATA[
|
|
if(reset)
|
|
{
|
|
self.clearitemcontrols();
|
|
self.itemcount=0;
|
|
}
|
|
|
|
var filter=self._lastkeyword;
|
|
if(filter)
|
|
{
|
|
var newarr=[];
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
var item=arr[i];
|
|
if(item.Name.toLowerCase().indexOf(filter)==-1)
|
|
continue;
|
|
newarr.push(item);
|
|
}
|
|
arr=newarr;
|
|
}
|
|
if(self._onlyshowchecked)
|
|
{
|
|
var newarr=[];
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
var item=arr[i];
|
|
if(item.IsChecked)
|
|
newarr.push(item);
|
|
}
|
|
arr=newarr;
|
|
}
|
|
|
|
function quick_string_sort(str)
|
|
{
|
|
str=str.toLowerCase();
|
|
var f=0;
|
|
var seed=1/65536;
|
|
for(var i=0;i<str.length;i++)
|
|
f+=str.charCodeAt(i)*Math.pow(seed,i);
|
|
return f;
|
|
}
|
|
|
|
var sorttrue=-1;
|
|
var sortfalse=1;
|
|
if(self._sortdesc)
|
|
{
|
|
sorttrue=1;
|
|
sortfalse=-1;
|
|
}
|
|
|
|
function compare_folder(a,b)
|
|
{
|
|
if(a.IsFolder!=b.IsFolder)
|
|
return a.IsFolder?sorttrue:sortfalse;
|
|
if(a.Name==b.Name)
|
|
return 0;
|
|
if(a.IsFolder&&a.Name=="..")return sorttrue;
|
|
if(b.IsFolder&&b.Name=="..")return sortfalse;
|
|
return 0;
|
|
}
|
|
|
|
arr=arr.concat();
|
|
if(self._sortmode=="Name")
|
|
{
|
|
arr.sort(function(a,b)
|
|
{
|
|
var r=compare_folder(a,b);
|
|
if(r!=0)
|
|
return r;
|
|
|
|
if(!a.strsort_name)a.strsort_name=quick_string_sort(a.Name);
|
|
if(!b.strsort_name)b.strsort_name=quick_string_sort(b.Name);
|
|
if(a.strsort_name<b.strsort_name)
|
|
return -1;
|
|
return 1;
|
|
});
|
|
}
|
|
if(self._sortmode=="Size")
|
|
{
|
|
arr.sort(function(a,b)
|
|
{
|
|
var r=compare_folder(a,b);
|
|
if(r!=0)
|
|
return r;
|
|
|
|
if(a.Size<b.Size)
|
|
return -1;
|
|
if(a.Size==b.Size)
|
|
return 0;
|
|
return 1;
|
|
});
|
|
}
|
|
if(self._sortmode=="Time")
|
|
{
|
|
arr.sort(function(a,b)
|
|
{
|
|
var r=compare_folder(a,b);
|
|
if(r!=0)
|
|
return r;
|
|
|
|
if(a.Time<b.Time)
|
|
return -1;
|
|
if(a.Time==b.Time)
|
|
return 0;
|
|
return 1;
|
|
});
|
|
}
|
|
if(self._sortdesc)arr.reverse();
|
|
|
|
|
|
self.itemcount=(self.itemcount||0)+arr.length;
|
|
self.invoke_event("updateui_itemcount");
|
|
|
|
self.additemcontrols(arr);
|
|
|
|
]]>
|
|
</method>
|
|
<method name="toggle_sort" arguments="mode">
|
|
<![CDATA[
|
|
if(self._sortmode==mode)
|
|
{
|
|
self._sortdesc=!self._sortdesc;
|
|
}
|
|
else
|
|
{
|
|
self._sortmode=mode;
|
|
self._sortdesc=false;
|
|
}
|
|
self.invoke_event("updateui_sort");
|
|
if(!self._folderitem)return;
|
|
self.fill_items(self._folderitem.Items,true);
|
|
]]>
|
|
</method>
|
|
<method name="is_sort" arguments="mode,asc">
|
|
<![CDATA[
|
|
return self._sortmode==mode&&self._sortdesc==!asc;
|
|
]]>
|
|
</method>
|
|
<method name="set_sort" arguments="mode,asc">
|
|
<![CDATA[
|
|
self._sortmode=mode;
|
|
self._sortdesc=!asc;
|
|
self.invoke_event("updateui_sort");
|
|
if(!self._folderitem)return;
|
|
self.fill_items(self._folderitem.Items,true);
|
|
]]>
|
|
</method>
|
|
<method name="set_filter" arguments="keyword">
|
|
<![CDATA[
|
|
if(keyword)keyword=keyword.replace(/(^\s+|\s+$)/g,"").toLowerCase().split('*').join('');
|
|
if(!keyword)keyword=null;
|
|
if(self._lastkeyword==keyword)return;
|
|
self._lastkeyword=keyword
|
|
|
|
if(!self._folderitem)return;
|
|
self.fill_items(self._folderitem.Items,true);
|
|
]]>
|
|
</method>
|
|
<method name="change_folder" arguments="folder">
|
|
<![CDATA[
|
|
self._lastkeyword=null;
|
|
self._chaningdir=folder;
|
|
if(self._folderitem&&self._currdir)
|
|
{
|
|
var checkmap={}
|
|
self["checkmap:"+self._currdir]=checkmap;
|
|
|
|
var arr=self._folderitem.Items;
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
var n=arr[i].Name;
|
|
if(n=="..")continue;
|
|
var key=self._currdir+":"+n;
|
|
if(arr[i].IsChecked)
|
|
checkmap[key]=true;
|
|
}
|
|
}
|
|
self.setisloading(true);
|
|
if(!self._selectedstorage)
|
|
{
|
|
editor.CallAjax("AjaxGetStorages",self.delegate(self.handlegetstorages),self._category);
|
|
}
|
|
else
|
|
{
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:self._chaningdir,Category:self._category};
|
|
editor.CallAjax("AjaxGetFolderItem",self.delegate(self.handlegetfolderitem),storage,self._getoption);
|
|
}
|
|
]]>
|
|
</method>
|
|
|
|
<method name="select_item">
|
|
<![CDATA[
|
|
if(value.IsFolder)
|
|
{
|
|
var folder=self._currdir+value.Name+"/";
|
|
if(value.Name=="..")
|
|
{
|
|
var sb=[]
|
|
var ps=self._currdir.split('/');
|
|
for(var i=0;i<ps.length;i++)
|
|
if(ps[i])sb.push(ps[i]);
|
|
sb.splice(sb.length-1,1);
|
|
folder=sb.length?("/"+sb.join("/")+"/"):"/";
|
|
}
|
|
self.change_folder(folder);
|
|
}
|
|
else
|
|
{
|
|
self.select_file(value);
|
|
}
|
|
]]>
|
|
</method>
|
|
|
|
<method name="splitnamepart" arguments="name">
|
|
var pos=name.lastIndexOf('.');
|
|
if(pos==-1)return [name,""];
|
|
return [name.substring(0,pos),name.substring(pos)];
|
|
</method>
|
|
<method name="startedititem" arguments="item,ctrl">
|
|
<![CDATA[
|
|
if(item.IsFolder)
|
|
{
|
|
if(!self._selectedstorage.AllowRenameFolder)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_deny_renamefolder")});
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(!self._selectedstorage.AllowRenameFile)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_deny_renamefile")});
|
|
return;
|
|
}
|
|
}
|
|
|
|
self._chaningnamectrl=ctrl;
|
|
var newoption={control:ctrl,title:"Change name",message:editor.GetLangText("prompt_newname"),allowempty:false}
|
|
var namepart=self.splitnamepart(item.Name);
|
|
newoption.defaultvalue=namepart[0];
|
|
newoption.callback=function(val,err){
|
|
if(err)return;
|
|
if(val==null)return;
|
|
if(val==namepart[0])return;
|
|
var newname=val+namepart[1];
|
|
if(self.finditem(newname) && newname.toLowerCase()!=item.Name.toLowerCase())
|
|
{
|
|
newoption.message=editor.GetLangText("msg_namebeused",newname);
|
|
editor.Prompt(newoption);
|
|
return;
|
|
}
|
|
self.setisloading(true);
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:self._currdir,Category:self._category};
|
|
editor.CallAjax("AjaxChangeName",self.delegate(self.handlechangename),storage,item.Name,newname);
|
|
}
|
|
editor.Prompt(newoption)
|
|
]]>
|
|
</method>
|
|
|
|
<method name="processuploaderselect" arguments="uploader,tasks">
|
|
<![CDATA[
|
|
var INSERT_DATE_BEFORE_FILENAME=false;
|
|
var files=[];
|
|
|
|
var indexes=[];
|
|
var usednamemap={};
|
|
for(var i=0;i<tasks.length;i++)
|
|
{
|
|
var task=tasks[i];
|
|
var filename=task.FileName;
|
|
if(INSERT_DATE_BEFORE_FILENAME)
|
|
{
|
|
var d=new Date();
|
|
filename=String(d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate())+"_"+filename;
|
|
}
|
|
task.SetClientData(filename);
|
|
if(usednamemap[filename]||self.finditem(filename))
|
|
indexes.push(i);
|
|
else
|
|
usednamemap[filename]=true;
|
|
}
|
|
|
|
function AllocateNewname(filename)
|
|
{
|
|
var pos=filename.lastIndexOf('.');
|
|
var prefix=filename;
|
|
var suffix="";
|
|
if(pos>-1)
|
|
{
|
|
prefix=filename.substring(0,pos);
|
|
suffix=filename.substring(pos);
|
|
}
|
|
prefix=prefix.replace(/\(\n+\)&/,'');
|
|
for(var np=1;true;np++)
|
|
{
|
|
filename=prefix+"("+np+")"+suffix;
|
|
if(usednamemap[filename]||self.finditem(filename))
|
|
continue;
|
|
return filename;
|
|
}
|
|
}
|
|
|
|
var lastchecked=true;
|
|
|
|
var nextindex=0;
|
|
function processproblemitem()
|
|
{
|
|
if(nextindex>=indexes.length)
|
|
{
|
|
setTimeout(function(){uploader.startupload()},1);
|
|
return;
|
|
}
|
|
task=tasks[indexes[nextindex]];
|
|
var newoption={title:editor.GetLangText("msg_itemexiststitle"),width:320,height:150}
|
|
newoption.result="cancel";
|
|
newoption.lastchecked=lastchecked;
|
|
newoption.message=editor.GetLangText("msg_itemexists",task.GetClientData())
|
|
if(nextindex+1<indexes.length)
|
|
newoption.nextmsg=editor.GetLangText("msg_sameforitems",indexes.length-nextindex-1)
|
|
|
|
newoption.AllowOverride=self._selectedstorage.AllowOverride;
|
|
newoption.callback=function(res,err)
|
|
{
|
|
lastchecked=newoption.checked;
|
|
var loopnext=nextindex<indexes.length;
|
|
while(loopnext)
|
|
{
|
|
var task=tasks[indexes[nextindex]];
|
|
|
|
if(newoption.checked)
|
|
{
|
|
nextindex++
|
|
loopnext=nextindex<indexes.length;
|
|
}
|
|
else
|
|
{
|
|
loopnext=false;
|
|
}
|
|
|
|
if(newoption.result=="cancel")
|
|
{
|
|
task.Cancel();
|
|
}
|
|
else if(newoption.result=="override")
|
|
{
|
|
}
|
|
else
|
|
{
|
|
//rename:
|
|
var filename=task.GetClientData();
|
|
task.SetClientData(AllocateNewname(filename));
|
|
}
|
|
}
|
|
nextindex++;
|
|
setTimeout(processproblemitem,1);
|
|
}
|
|
editor.ShowXmlDialog(editor.BuildDialogUrl("overriderename.xml"),newoption);
|
|
}
|
|
setTimeout(processproblemitem,1);
|
|
]]>
|
|
</method>
|
|
<method name="processuploaderstart" arguments="uploader">
|
|
<![CDATA[
|
|
self.uploaderstarted=true;
|
|
self.setisloading(true);
|
|
var newoption={title:"Uploading:",width:420,height:280}
|
|
newoption.uploader=uploader;
|
|
newoption.ondialoginit=function(dialog)
|
|
{
|
|
self.uploaderprogressdialog=dialog;
|
|
}
|
|
newoption.callback=function(res,err){}
|
|
editor.ShowXmlDialog(editor.BuildDialogUrl("uploadprogress.xml"),newoption);
|
|
]]>
|
|
</method>
|
|
<method name="processuploaderstop" arguments="uploader,postback">
|
|
<![CDATA[
|
|
self.uploaderstarted=false;
|
|
if(postback)
|
|
{
|
|
self.setisloading(true);
|
|
self._uploadertoreset=uploader;
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:self._currdir,Category:self._category};
|
|
var namemap=[];
|
|
|
|
var items=uploader.getitems();
|
|
for(var i=0;i<items.length;i++)
|
|
namemap.push(items[i].FileGuid+"/"+items[i].GetClientData());
|
|
editor.CallAjax("AjaxUploadFiles",self.delegate(self.handleuploadfiles),storage,self._getoption,namemap.join("|"));
|
|
}
|
|
else
|
|
{
|
|
self.setisloading(false);
|
|
}
|
|
if(self.uploaderprogressdialog)
|
|
{
|
|
self.uploaderprogressdialog.close();
|
|
}
|
|
]]>
|
|
</method>
|
|
|
|
<method name="processeditorevent" arguments="editor,e">
|
|
<![CDATA[
|
|
switch(e.Name)
|
|
{
|
|
case "Uploader_Browse":
|
|
var uploader=e.Arguments[0];
|
|
var filter=self._category+" files|"+self._selectedextensions.join(';').split('.').join("*.");
|
|
uploader.internalobject.DialogFilter=filter;
|
|
if(self._category=="Image"||self._category=="Gallery")
|
|
uploader.internalobject.DialogAccept="image/*";
|
|
else
|
|
uploader.internalobject.DialogAccept="*/*";
|
|
uploader.internalobject.MaxSizeKB=self._selectedstorage.MaxFileSize;
|
|
if(!self.uploaderstarted)uploader.reset();
|
|
if(!self._selectedstorage.AllowUpload)e.ReturnValue=false;
|
|
break;
|
|
case "Uploader_Select":
|
|
var uploader=e.Arguments[0];
|
|
var tasks=e.Arguments[1];
|
|
self.processuploaderselect(uploader,tasks);
|
|
break;
|
|
case "Uploader_Start":
|
|
self.processuploaderstart(e.Arguments[0]);
|
|
break;
|
|
case "Uploader_Stop":
|
|
self.processuploaderstop(e.Arguments[0]);
|
|
break;
|
|
case "Uploader_Postback":
|
|
self.processuploaderstop(e.Arguments[0],true);
|
|
break;
|
|
}
|
|
]]>
|
|
</method>
|
|
|
|
|
|
<method name="call_reload">
|
|
self.change_folder(self._currdir||"/");
|
|
</method>
|
|
|
|
<method name="call_createfolder" arguments="ctrl">
|
|
<![CDATA[
|
|
if(!self._folderitem)return;
|
|
|
|
function createfoldercallback(res)
|
|
{
|
|
self.handlecreatefolder(res);
|
|
if(res.ReturnValue)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_foldercreated",res.ReturnValue.Name)});
|
|
}
|
|
}
|
|
|
|
var newoption={control:ctrl,title:"Create Folder",message:editor.GetLangText("prompt_newfoldername"),allowempty:false}
|
|
newoption.callback=function(val,err){
|
|
if(err)return;
|
|
if(!val)return;
|
|
var item=self.finditem(val);
|
|
if(item!=null)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_itemexists",val)});
|
|
return;
|
|
}
|
|
self.setisloading(true);
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:self._currdir,Category:self._category};
|
|
editor.CallAjax("AjaxCreateFolder",createfoldercallback,storage,val);
|
|
return;
|
|
}
|
|
editor.Prompt(newoption)
|
|
]]>
|
|
</method>
|
|
<method name="call_edititem" arguments="ctrl,value">
|
|
<![CDATA[
|
|
var storage={ID:self._selectedstorage.ID,UrlPrefix:self._selectedstorage.UrlPrefix,UrlPath:self._currdir,Category:self._category};
|
|
var newoption={storage:storage,fileitem:value}
|
|
var rect=jsml.get_body_rect();
|
|
newoption.width=rect.width-100;
|
|
newoption.height=rect.height-100;
|
|
newoption.callback=function(res,err)
|
|
{
|
|
if(!res)return;
|
|
}
|
|
newoption.onsaveimage=function(pathitem)
|
|
{
|
|
var url=self._folderitem.UrlPrefix+self._currdir+pathitem.Name;
|
|
self.invoke_event("repreview");
|
|
}
|
|
editor.ShowXmlDialog(editor.BuildDialogUrl("imageeditor.xml"),newoption);
|
|
]]>
|
|
</method>
|
|
<method name="call_deletearray" arguments="ctrl,arr">
|
|
<![CDATA[
|
|
var newoption={control:ctrl,title:"Delete items",message:editor.GetLangText("confirm_deleteitems",arr.length)}
|
|
newoption.callback=function(val,err){
|
|
if(err)return;
|
|
if(!val)return;
|
|
|
|
for(var i=0;i<arr.length;i++)arr[i]=arr[i].Name;
|
|
self.setisloading(true);
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:self._currdir,Category:self._category};
|
|
editor.CallAjax("AjaxDeleteItems",self.delegate(self.handledeleteitems),storage,arr);
|
|
}
|
|
editor.Confirm(newoption)
|
|
]]>
|
|
</method>
|
|
<method name="call_deleteitems" arguments="ctrl">
|
|
<![CDATA[
|
|
var arr=self.getcheckeditems();
|
|
if(arr.length==0)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_requireselecteditems")});
|
|
return;
|
|
}
|
|
if( ! self._selectedstorage.AllowDeleteFile )
|
|
{
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
if(!arr[i].IsFolder)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_deny_deletefile")});
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if( ! self._selectedstorage.AllowDeleteFolder )
|
|
{
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
if(arr[i].IsFolder)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_deny_deletefolder")});
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
self.call_deletearray(ctrl,arr);
|
|
]]>
|
|
</method>
|
|
<method name="call_copymovearray" arguments="ctrl,iscopy,arr">
|
|
<![CDATA[
|
|
for(var i=0;i<arr.length;i++)arr[i]=arr[i].Name;
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:"/",Category:self._category};
|
|
var newoption={storage:storage,storages:self._allstorages,folder:self._currdir,items:arr}
|
|
newoption.callback=function(res,err)
|
|
{
|
|
if(!res)return;
|
|
self.setisloading(true);
|
|
var method="AjaxMoveItems";
|
|
var handler=self.handlemoveitems;
|
|
if(iscopy)
|
|
{
|
|
method="AjaxCopyItems"; //TODO: split the copy items into multiple steps.
|
|
handler=self.handlecopyitems;
|
|
}
|
|
var src={ID:self._selectedstorage.ID,UrlPath:self._currdir,Category:self._category};
|
|
var dst={ID:self._selectedstorage.ID,UrlPath:res,Category:self._category};
|
|
editor.CallAjax(method,self.delegate(handler),src,dst,arr);
|
|
}
|
|
if(ctrl)
|
|
{
|
|
newoption.control=ctrl;
|
|
editor.ShowXmlFloatBox(editor.BuildDialogUrl("foldertree.xml"),newoption);
|
|
}
|
|
else
|
|
{
|
|
editor.ShowXmlDialog(editor.BuildDialogUrl("foldertree.xml"),newoption);
|
|
}
|
|
]]>
|
|
</method>
|
|
<method name="call_copymoveitems" arguments="ctrl,iscopy">
|
|
<![CDATA[
|
|
var arr=self.getcheckeditems();
|
|
if(arr.length==0)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText("msg_requireselecteditems")});
|
|
return;
|
|
}
|
|
if( ! (iscopy?self._selectedstorage.AllowCopyFile:self._selectedstorage.AllowMoveFile) )
|
|
{
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
if(!arr[i].IsFolder)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText(iscopy?"msg_deny_copyfolder":"msg_deny_movefile")});
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if( ! (iscopy?self._selectedstorage.AllowCopyFolder:self._selectedstorage.AllowMoveFolder) )
|
|
{
|
|
for(var i=0;i<arr.length;i++)
|
|
{
|
|
if(arr[i].IsFolder)
|
|
{
|
|
editor.Alert({control:ctrl,message:editor.GetLangText(iscopy?"msg_deny_copyfolder":"msg_deny_movefolder")});
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
self.call_copymovearray(ctrl,iscopy,arr);
|
|
]]>
|
|
</method>
|
|
<method name="call_copyitems">
|
|
<![CDATA[
|
|
self.call_copymoveitems(value,true);
|
|
]]>
|
|
</method>
|
|
<method name="call_moveitems">
|
|
<![CDATA[
|
|
self.call_copymoveitems(value,false);
|
|
]]>
|
|
</method>
|
|
<method name="call_openfolder" arguments="ctrl">
|
|
<![CDATA[
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:"/",Category:self._category};
|
|
var newoption={storage:storage,storages:self._allstorages,folder:self._currdir,items:[]}
|
|
newoption.callback=function(res,err)
|
|
{
|
|
if(!res)return;
|
|
self.change_folder(res);
|
|
}
|
|
newoption.quickselect=function(res)
|
|
{
|
|
self.change_folder(res);
|
|
}
|
|
if(ctrl&&ctrl._element)
|
|
{
|
|
newoption.control=ctrl;
|
|
editor.ShowXmlFloatBox(editor.BuildDialogUrl("foldertree.xml"),newoption);
|
|
}
|
|
else
|
|
{
|
|
editor.ShowXmlDialog(editor.BuildDialogUrl("foldertree.xml"),newoption);
|
|
}
|
|
]]>
|
|
</method>
|
|
<method name="call_selectstorage" arguments="ctrl">
|
|
<![CDATA[
|
|
var storage={ID:self._selectedstorage.ID,UrlPath:"/",Category:self._category};
|
|
var newoption={storage:storage,storages:self._allstorages,folder:self._currdir,items:[]}
|
|
newoption.control=ctrl;
|
|
newoption.setstorage=self.delegate(self.set_storage);
|
|
editor.ShowXmlFloatBox(editor.BuildDialogUrl("storagelist.xml"),newoption);
|
|
]]>
|
|
</method>
|
|
|
|
<method name="checkallitems" arguments="val">
|
|
<![CDATA[
|
|
if(!self._folderitem)return;
|
|
for(var i=0;i<self._folderitem.Items.length;i++)
|
|
{
|
|
self._folderitem.Items[i].IsChecked=val;
|
|
}
|
|
self.invoke_event("updateui_itemscheck");
|
|
]]>
|
|
</method>
|
|
<method name="getcheckeditems">
|
|
<![CDATA[
|
|
var sb=[];
|
|
if(!self._folderitem)return sb;
|
|
var arr=self._folderitem.Items;
|
|
for(var i=0;i<arr.length;i++)
|
|
if(arr[i].IsChecked)
|
|
sb.push(arr[i]);
|
|
return sb;
|
|
]]>
|
|
</method>
|
|
<method name="finditem" arguments="name">
|
|
<![CDATA[
|
|
if(!self._folderitem)return;
|
|
var arr=self._folderitem.Items;
|
|
name=name.toLowerCase();
|
|
for(var i=0;i<arr.length;i++)
|
|
if(arr[i].Name.toLowerCase()==name)
|
|
return arr[i];
|
|
]]>
|
|
</method>
|
|
|
|
<method name="processmenucommand" arguments="cmd,value">
|
|
<![CDATA[
|
|
switch(cmd)
|
|
{
|
|
case "edit":
|
|
self.call_edititem(null,value);
|
|
break;
|
|
case "move":
|
|
self.call_copymovearray(null,false,[value]);
|
|
break;
|
|
case "copy":
|
|
self.call_copymovearray(null,true,[value]);
|
|
break;
|
|
case "delete":
|
|
self.call_deletearray(null,[value]);
|
|
break;
|
|
}
|
|
]]>
|
|
</method>
|
|
|
|
</panel>
|
|
|
|
|
|
</jsml>
|