MWF.xDesktop.requireApp("Template", "MForm", null, false);
MWF.xDesktop.requireApp("Template", "MPopupForm", null, false);
MWF.xDesktop.requireApp("Template", "widget.ColorPicker", null, false);
MWF.xDesktop.requireApp("Template", "MSelector", null, false);
MWF.xApplication.MinderEditor.FontFamily = new Class({
Extends: MSelector,
options : {
"style": "minderFont",
"width": "240px",
"height": "28px",
"defaultOptionLp" : "字体",
"textField" : "name",
"valueField" : "val",
"event" : "mouseenter",
"isSetSelectedValue" : true,
"isChangeOptionStyle" : true,
"emptyOptionEnable" : false
},
_selectItem : function( itemNode, itemData ){
},
_loadData : function( callback ){
var fontFamilyList = [{
name: '宋体',
val: '宋体,SimSun'
}, {
name: 'Microsoft YaHei',
val: 'Microsoft YaHei,Microsoft YaHei'
}, {
name: '楷体',
val: '楷体,楷体_GB2312,SimKai'
}, {
name: '黑体',
val: '黑体, SimHei'
}, {
name: '隶书',
val: '隶书, SimLi'
}, {
name: 'Andale Mono',
val: 'andale mono'
}, {
name: 'Arial',
val: 'arial,helvetica,sans-serif'
}, {
name: 'arialBlack',
val: 'arial black,avant garde'
}, {
name: 'Comic Sans Ms',
val: 'comic sans ms'
}, {
name: 'Impact',
val: 'impact,chicago'
}, {
name: 'Times New Roman',
val: 'times new roman'
}, {
name: 'Sans-Serif',
val: 'sans-serif'
}];
if(callback)callback( fontFamilyList );
},
_postCreateItem: function( itemNode, data ){
itemNode.setStyles( {
"font-family": data.val,
"font-size" : "14px",
"min-height" : "30px",
"line-height" : "30px"
} );
}
});
MWF.xApplication.MinderEditor.FontSize = new Class({
Extends: MSelector,
options : {
"style": "minderFont",
"width": "80px",
"height": "28px",
"defaultOptionLp" : "字号",
"isSetSelectedValue" : true,
"isChangeOptionStyle" : true,
"emptyOptionEnable" : false,
"event" : "mouseenter"
},
_selectItem : function( itemNode, itemData ){
},
_loadData : function( callback ){
var fontSizeList = ["10", "12", "16", "18", "24", "32", "48"];
if(callback)callback( fontSizeList );
},
_postCreateItem: function( itemNode, data ){
itemNode.setStyles( {
"font-size" : data.value +"px",
"min-height" : ( parseInt(data.value) + 6) +"px",
"line-height" : ( parseInt(data.value) + 6) +"px"
} );
}
});
MWF.xApplication.MinderEditor.PriorityImage = new Class({
Extends: MSelector,
options : {
"style": "minderProgress",
"width": "130px",
"defaultOptionLp" : "",
"valueField" : "command",
"isSetSelectedValue" : false,
"isChangeOptionStyle" : true,
"emptyOptionEnable" : false,
"event" : "mouseenter"
},
_selectItem : function( itemNode, itemData ){
},
_loadData : function( callback ){
var list = [
{
command : "0",
position : "0 -180px",
title : "移除优先级"
},
{
command : "1",
position : "0 0px",
title : "优先级1"
},
{
command : "2",
position : "0 -20px",
title : "优先级2"
},
{
command : "3",
position : "0 -40px",
title : "优先级3"
},
{
command : "4",
position : "0 -60px",
title : "优先级4"
},
{
command : "5",
position : "0 -80px",
title : "优先级5"
},
{
command : "6",
position : "0 -100px",
title : "优先级6"
},
{
command : "7",
position : "0 -120px",
title : "优先级7"
},
{
command : "8",
position : "0 -140px",
title : "优先级8"
},
{
command : "9",
position : "0 -160px",
title : "优先级9"
}
];
if(callback)callback( list );
},
_postCreateItem: function( itemNode, data ){
},
loadContent : function( data ){
if( !this.contentTooltip ){
var width = parseInt(this.options.width)+"px";
this.css.tooltipNode.width = width;
this.css.tooltipNode["max-width"] = width;
var options = Object.merge({
nodeStyles : this.css.tooltipNode,
onPostInitialize : function(){
if(this.options.trigger == "immediately" ){
this.contentTooltip.load();
}
}.bind(this),
onHide : function(){
this.status = "hidden";
}.bind(this)
}, this.options.tooltipsOptions );
this.contentTooltip = new MWF.xApplication.MinderEditor.PriorityImage.Tootips( this.dropdownContainer || this.app.content, this.node, this.app, data, options );
this.contentTooltip.selector = this;
}
}
});
MWF.xApplication.MinderEditor.PriorityImage.Tootips = new Class({
Extends: MSelector.Tootips,
options : {
axis: "y", //箭头在x轴还是y轴上展现
position : { //node 固定的位置
x : "center", //x轴上left center right, auto 系统自动计算
y : "bottom" //y 轴上top middle bottom, auto 系统自动计算
},
event : "mouseenter", //事件类型,有target 时有效, mouseenter对应mouseleave,click 对应 container 的 click
hiddenDelay : 200, //ms , 有target 且 事件类型为 mouseenter 时有效
displayDelay : 0, //ms , 有target 且事件类型为 mouseenter 时有效
hasArrow : true
},
_customNode : function( node, contentNode ){
//var width = ( parseInt( this.selector.options.width ) )+ "px";
//node.setStyles({
// "width": width,
// "max-width": width
//});
this.createItemList( this.data, contentNode )
},
createItemList:function(data, node){
data = data || [];
var _selector = this.selector;
this.css = _selector.css;
_selector.listContentNode = new Element("div.listContentNode",{
"styles":this.css.listContentNode
}).inject( node );
//_selector.listContentNode.setStyles({
// "width": node.getSize().x+"px"
//});
_selector.listNode = new Element("div.listNode",{
"styles":this.css.listNode
}).inject(_selector.listContentNode);
_selector.setScrollBar(_selector.listNode);
data.each(function(d){
this.createItem( d );
}.bind(this));
},
createItem: function( data ){
var _selector = this.selector;
var listItemNode = new Element("div.listItemNode",{
"styles":this.css.listItemNode,
"title" : data.title
}).inject(_selector.listNode);
listItemNode.setStyles({
"background": "url("+ _selector.path + _selector.options.style + "/icon/priority.png) no-repeat "+ data.position
});
if(data)listItemNode.store("data",data);
listItemNode.addEvents({
"click":function(ev){
var _self = this.obj;
var data = this.itemNode.retrieve( "data" );
_self.selector.setCurrentItem( this.itemNode );
_self.selector._selectItem( this.itemNode, data );
_self.selector.fireEvent("selectItem", [ this.itemNode, data ] );
_self.hide();
ev.stopPropagation();
}.bind({ obj : this, itemNode : listItemNode }),
"mouseover":function(){
if( this.obj.selector.currentItemNode != this.itemNode || !this.obj.selector.options.isChangeOptionStyle ){
this.itemNode.setStyles( this.obj.selector.css.listItemNode_over );
}
}.bind( {obj : this, itemNode : listItemNode }),
"mouseout":function(){
if( this.obj.selector.currentItemNode != this.itemNode || !this.obj.selector.options.isChangeOptionStyle ){
this.itemNode.setStyles( this.obj.selector.css.listItemNode );
}
}.bind( {obj : this, itemNode : listItemNode })
});
_selector.itemNodeList.push( listItemNode );
_selector.itemNodeObject[ data[ _selector.valueField ] ] = listItemNode;
var isCurrent = false;
if( _selector.currentItemData ){
isCurrent = data[ _selector.valueField ] == _selector.currentItemData[ _selector.valueField ];
}else if( _selector.value ){
isCurrent = data[ _selector.valueField ] == _selector.value;
}else if( _selector.text ){
isCurrent = data[ _selector.textField ] == _selector.text;
}
if( isCurrent )_selector.setCurrentItem( listItemNode );
_selector._postCreateItem(listItemNode, data)
}
});
MWF.xApplication.MinderEditor.ProgressImage = new Class({
Extends: MSelector,
options : {
"style": "minderProgress",
"width": "130px",
"defaultOptionLp" : "",
"valueField" : "command",
"isSetSelectedValue" : false,
"isChangeOptionStyle" : true,
"emptyOptionEnable" : false,
"event" : "mouseenter"
},
_selectItem : function( itemNode, itemData ){
},
_loadData : function( callback ){
var list = [
{
command : "0",
position : "0 -180px",
title : "移除进度"
},
{
command : "1",
position : "0 0px",
title : "未开始"
},
{
command : "2",
position : "0 -20px",
title : "完成1/8"
},
{
command : "3",
position : "0 -40px",
title : "完成2/8"
},
{
command : "4",
position : "0 -60px",
title : "完成3/8"
},
{
command : "5",
position : "0 -80px",
title : "完成4/8"
},
{
command : "6",
position : "0 -100px",
title : "完成5/8"
},
{
command : "7",
position : "0 -120px",
title : "完成6/8"
},
{
command : "8",
position : "0 -140px",
title : "完成7/8"
},
{
command : "9",
position : "0 -160px",
title : "全部完成"
}
];
if(callback)callback( list );
},
_postCreateItem: function( itemNode, data ){
},
loadContent : function( data ){
if( !this.contentTooltip ){
var width = parseInt(this.options.width)+"px";
this.css.tooltipNode.width = width;
this.css.tooltipNode["max-width"] = width;
var options = Object.merge({
nodeStyles : this.css.tooltipNode,
onPostInitialize : function(){
if(this.options.trigger == "immediately" ){
this.contentTooltip.load();
}
}.bind(this),
onHide : function(){
this.status = "hidden";
}.bind(this)
}, this.options.tooltipsOptions );
this.contentTooltip = new MWF.xApplication.MinderEditor.ProgressImage.Tootips( this.dropdownContainer || this.app.content, this.node, this.app, data, options );
this.contentTooltip.selector = this;
}
}
});
MWF.xApplication.MinderEditor.ProgressImage.Tootips = new Class({
Extends: MSelector.Tootips,
options : {
axis: "y", //箭头在x轴还是y轴上展现
position : { //node 固定的位置
x : "center", //x轴上left center right, auto 系统自动计算
y : "bottom" //y 轴上top middle bottom, auto 系统自动计算
},
event : "mouseenter", //事件类型,有target 时有效, mouseenter对应mouseleave,click 对应 container 的 click
hiddenDelay : 200, //ms , 有target 且 事件类型为 mouseenter 时有效
displayDelay : 0, //ms , 有target 且事件类型为 mouseenter 时有效
hasArrow : true
},
_customNode : function( node, contentNode ){
//var width = ( parseInt( this.selector.options.width ) )+ "px";
//node.setStyles({
// "width": width,
// "max-width": width
//});
this.createItemList( this.data, contentNode )
},
createItemList:function(data, node){
data = data || [];
var _selector = this.selector;
this.css = _selector.css;
_selector.listContentNode = new Element("div.listContentNode",{
"styles":this.css.listContentNode
}).inject( node );
//_selector.listContentNode.setStyles({
// "width": node.getSize().x+"px"
//});
_selector.listNode = new Element("div.listNode",{
"styles":this.css.listNode
}).inject(_selector.listContentNode);
_selector.setScrollBar(_selector.listNode);
data.each(function(d){
this.createItem( d );
}.bind(this));
},
createItem: function( data ){
var _selector = this.selector;
var listItemNode = new Element("div.listItemNode",{
"styles":this.css.listItemNode,
"title" : data.title
}).inject(_selector.listNode);
listItemNode.setStyles({
"background": "url("+ _selector.path + _selector.options.style + "/icon/progress.png) no-repeat "+ data.position
});
if(data)listItemNode.store("data",data);
listItemNode.addEvents({
"click":function(ev){
var _self = this.obj;
var data = this.itemNode.retrieve( "data" );
_self.selector.setCurrentItem( this.itemNode );
_self.selector._selectItem( this.itemNode, data );
_self.selector.fireEvent("selectItem", [ this.itemNode, data ] );
_self.hide();
ev.stopPropagation();
}.bind({ obj : this, itemNode : listItemNode }),
"mouseover":function(){
if( this.obj.selector.currentItemNode != this.itemNode || !this.obj.selector.options.isChangeOptionStyle ){
this.itemNode.setStyles( this.obj.selector.css.listItemNode_over );
}
}.bind( {obj : this, itemNode : listItemNode }),
"mouseout":function(){
if( this.obj.selector.currentItemNode != this.itemNode || !this.obj.selector.options.isChangeOptionStyle ){
this.itemNode.setStyles( this.obj.selector.css.listItemNode );
}
}.bind( {obj : this, itemNode : listItemNode })
});
_selector.itemNodeList.push( listItemNode );
_selector.itemNodeObject[ data[ _selector.valueField ] ] = listItemNode;
var isCurrent = false;
if( _selector.currentItemData ){
isCurrent = data[ _selector.valueField ] == _selector.currentItemData[ _selector.valueField ];
}else if( _selector.value ){
isCurrent = data[ _selector.valueField ] == _selector.value;
}else if( _selector.text ){
isCurrent = data[ _selector.textField ] == _selector.text;
}
if( isCurrent )_selector.setCurrentItem( listItemNode );
_selector._postCreateItem(listItemNode, data)
}
});
MWF.xApplication.MinderEditor.SaveTooltips = new Class({
Implements: [Options, Events],
Extends: MTooltips,
options: {
style : "default",
axis: "y", //箭头在x轴还是y轴上展现
position : { //node 固定的位置
x : "auto", //x 轴上left center right, auto 系统自动计算
y : "auto" //y轴上top middle bottom, auto 系统自动计算
},
event : "mouseenter", //事件类型,有target 时有效, mouseenter对应mouseleave,click 对应 container 的 click
nodeStyles : {
"min-width" : "50px",
"padding" : "0px",
"border-radius" : "3px"
}
},
_customNode : function( node, contentNode ){
var div = new Element("div", {
"text" : (this.app.autoSaveInter / 60000) + "分钟自动保存一次",
"styles" : { "margin" : "10px" }
}).inject( contentNode );
new Element("input",{
type : "checkbox",
value : "true",
checked : this.app.autoSave,
events : {
change : function( el ){
if( el.target.get("checked") ){
this.app.startAutoSave();
}else{
this.app.stopAutoSave();
}
}.bind(this)
}
}).inject( div, "top" );
//var list = new Element("div", { styles : this.app.css.selectorListNode }).inject( contentNode );
//var saveAsDiv = new Element("div", { "text": "另存为",
// styles : this.app.css.selectorListItemNode,
// events : {
// mouseover : function(el){
// el.target.setStyles( this.app.css.selectorListItemNode_over )
// }.bind(this),
// mouseleave : function(el){
// el.target.setStyles( this.app.css.selectorListItemNode )
// }.bind(this),
// click : function(){
// this.app.openSaveAsDialog();
// }.bind(this)
// }
//}).inject( list );
//
//var renameDiv = new Element("div", { "text": "重命名",
// styles : this.app.css.selectorListItemNode,
// events : {
// mouseover : function(el){
// el.target.setStyles( this.app.css.selectorListItemNode_over )
// }.bind(this),
// mouseleave : function(el){
// el.target.setStyles( this.app.css.selectorListItemNode )
// }.bind(this),
// click : function(){
// this.app.openRenameDialog();
// }.bind(this)
// }
//}).inject( list );
}
});
MWF.require("MWF.widget.ImageClipper", null, false);
MWF.xApplication.MinderEditor.HyperLinkForm = new Class({
Extends: MPopupForm,
Implements: [Options, Events],
options: {
"style": "minder",
"width": 700,
//"height": 300,
"height": "300",
"hasTop": true,
"hasIcon": false,
"draggable": true,
"title" : "链接"
},
_createTableContent: function () {
var html = "
" +
" | " +
" |
" +
" | " +
" |
" +
"
";
this.formTableArea.set("html", html);
var data = this.app.minder.queryCommandValue('HyperLink');
this.form = new MForm(this.formTableArea, data, {
isEdited: true,
style : "minder",
hasColon : true,
itemTemplate: {
url: { text : "链接地址", notEmpty : true,
validRule : { isInvalid : function( value, it ){
var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
var R_URL = new RegExp(urlRegex, 'i');
return R_URL.test( value )
}.bind(this)},
validMessage : { isInvalid : "请输入正确的链接" },
attr : { placeholder : "必填:以 http(s):// 或 ftp:// 开头" }
},
title: { text : "提示文本", attr : { placeholder : "选填:鼠标在链接上悬停时提示的文本" } }
}
}, this.app);
this.form.load();
},
_createBottomContent: function () {
if (this.isNew || this.isEdited) {
this.okActionNode = new Element("button.inputOkButton", {
"styles": this.css.inputOkButton,
"text": "确定"
}).inject(this.formBottomNode);
this.okActionNode.addEvent("click", function (e) {
this.save(e);
}.bind(this));
}
this.removeAction = new Element("button.inputCancelButton", {
"styles": this.css.inputCancelButton,
"text": "删除链接"
}).inject(this.formBottomNode);
this.removeAction.addEvent("click", function (e) {
this.remove(e);
}.bind(this));
this.cancelActionNode = new Element("button.inputCancelButton", {
"styles": (this.isEdited || this.isNew || this.getEditPermission() ) ? this.css.inputCancelButton : this.css.inputCancelButton_long,
"text": "关闭"
}).inject(this.formBottomNode);
this.cancelActionNode.addEvent("click", function (e) {
this.close(e);
}.bind(this));
},
save: function(){
var data = this.form.getResult(true,null,true,false,true);
if( data ){
this.app.minder.execCommand('HyperLink', data.url, data.title || '');
this.close();
}
},
remove: function( ev ){
this.app.minder.execCommand('HyperLink', null );
this.close();
}
});
MWF.xApplication.MinderEditor.ImageForm = new Class({
Extends: MPopupForm,
Implements: [Options, Events],
options: {
"style": "minder",
"width": 800,
"height": 640,
"hasTop": true,
"hasIcon": false,
"draggable": true,
"title" : "图片"
},
createContent: function () {
this.createTab();
this.formContentNode = new Element("div.formContentNode", {
"styles": this.css.formContentNode
}).inject(this.formNode);
this.formTableContainer = new Element("div.formTableContainer", {
"styles": this.css.formTableContainer
}).inject(this.formContentNode);
this.formTableArea = new Element("div.formTableArea", {
"styles": this.css.formTableArea
}).inject(this.formTableContainer);
this._createTableContent();
},
_createTableContent: function () {
this.linkContainer = new Element("div.linkContainer").inject(this.formTableArea);
var html = "" +
" | " +
" |
" +
" | " +
" |
" +
"预览: | " +
" |
" +
"
";
this.linkContainer.set("html", html);
var data = this.app.minder.queryCommandValue('image');
this.linkform = new MForm(this.linkContainer, data, {
isEdited: true,
style : "minder",
hasColon : true,
itemTemplate: {
url: { text : "图片地址", notEmpty : true,
validRule : { isInvalid : function( value, it ){
var R_URL = /^https?\:\/\/\w+/;
return R_URL.test( value )
}.bind(this)},
validMessage : { isInvalid : "请输入正确的链接" },
attr : { placeholder : "必填:以 http(s):// 开始" },
event : { blur : function( it ){
if( it.getValue() )it.form.getItem("preview").setValue( it.getValue() )
}.bind(this)}
},
title: { text : "提示文本", attr : { placeholder : "选填:鼠标在图片上悬停时提示的文本" } },
preview : { type : "img", defaultValue : data.url || "", style : { "max-width" : "400px", "max-height" : "260px" } }
}
}, this.app);
this.linkform.load();
this.uploadContainer = new Element("div.uploadContainer", { styles : {"display":"none"} }).inject( this.formTableArea );
var html = "";
this.uploadContainer.set("html", html);
var data = this.app.minder.queryCommandValue('image');
this.uploadform = new MForm(this.uploadContainer, data, {
isEdited: true,
style : "minder",
hasColon : true,
itemTemplate: {
title2: { text : "提示文本", attr : { placeholder : "选填:鼠标在图片上悬停时提示的文本" } }
}
}, this.app);
this.uploadform.load();
this.image = new MWF.widget.ImageClipper(this.uploadContainer.getElement("[item='image']"), {
"aspectRatio": 0,
"description" : "",
"imageUrl" : "",
"ratioAdjustedEnable" : true,
"reference" : this.app.data.id || "1111",
"referenceType": "mindInfo",
"fromFileEnable" : false,
"resetEnable" : true
});
this.image.load();
},
createTab: function(){
var _self = this;
this.tabContainer = new Element("div.formTabContainer",{
styles : this.css.formTabContainer
}).inject(this.formNode);
var tabNode = new Element("div.formTabNode", {
"styles": this.css.formTabNode,
"text" : "外链图片"
}).inject(this.tabContainer);
tabNode.addEvents({
"mouseover" : function(){ if( _self.currentTabNode != this.node)this.node.setStyles(_self.css.formTabNode_over) }.bind({node : tabNode }),
"mouseout" : function(){ if( _self.currentTabNode != this.node)this.node.setStyles(_self.css.formTabNode) }.bind({node : tabNode }),
"click":function(){
if( _self.currentTabNode )_self.currentTabNode.setStyles(_self.css.formTabNode);
_self.currentTabNode = this.node;
this.node.setStyles(_self.css.formTabNode_current);
_self.linkContainer.setStyle("display","");
_self.uploadContainer.setStyle("display","none");
}.bind({ node : tabNode })
});
tabNode.setStyles( this.css.formTabNode_current );
_self.currentTabNode = tabNode;
var tabNode = new Element("div.tabNode", {
"styles": this.css.formTabNode,
"text" : "上传图片"
}).inject(this.tabContainer);
tabNode.addEvents({
"mouseover" : function(){ if( _self.currentTabNode != this.node)this.node.setStyles(_self.css.formTabNode_over) }.bind({node : tabNode }),
"mouseout" : function(){ if( _self.currentTabNode != this.node)this.node.setStyles(_self.css.formTabNode) }.bind({node : tabNode }),
"click":function(){
if( _self.currentTabNode )_self.currentTabNode.setStyles(_self.css.formTabNode);
_self.currentTabNode = this.node;
this.node.setStyles(_self.css.formTabNode_current);
_self.linkContainer.setStyle("display","none");
_self.uploadContainer.setStyle("display","");
}.bind({ node : tabNode })
})
},
_createBottomContent: function () {
if (this.isNew || this.isEdited) {
this.okActionNode = new Element("button.inputOkButton", {
"styles": this.css.inputOkButton,
"text": "确定"
}).inject(this.formBottomNode);
this.okActionNode.addEvent("click", function (e) {
this.save(e);
}.bind(this));
}
this.removeAction = new Element("button.inputCancelButton", {
"styles": this.css.inputCancelButton,
"text": "删除图片"
}).inject(this.formBottomNode);
this.removeAction.addEvent("click", function (e) {
this.remove(e);
}.bind(this));
this.cancelActionNode = new Element("button.inputCancelButton", {
"styles": (this.isEdited || this.isNew || this.getEditPermission() ) ? this.css.inputCancelButton : this.css.inputCancelButton_long,
"text": "关闭"
}).inject(this.formBottomNode);
this.cancelActionNode.addEvent("click", function (e) {
this.close(e);
}.bind(this));
},
save: function(){
if( this.image.getResizedImage() ){
this.image.uploadImage( function( json ){
var data = {
url : MWF.xDesktop.getImageSrc( json.id ),
title : this.uploadform.getResult(true,null,true,false,true)["title2"]
};
this.app.minder.execCommand('image', data.url, data.title || '', json.id );
this.close();
}.bind(this));
}else{
var data = this.linkform.getResult(true,null,true,false,true);
if( data ){
this.app.minder.execCommand('image', data.url, data.title || '', '');
this.close();
}
}
},
remove: function( ev ){
this.app.minder.execCommand('image', '' );
this.close();
},
setFormNodeSize: function (width, height, top, left) {
if (!width)width = this.options.width ? this.options.width : "50%";
if (!height)height = this.options.height ? this.options.height : "50%";
if (!top) top = this.options.top ? this.options.top : 0;
if (!left) left = this.options.left ? this.options.left : 0;
var containerSize = this.container.getSize();
if( containerSize.x < width )width = containerSize.x;
if( containerSize.y < height )height = containerSize.y;
var allSize = this.app.content.getSize();
var limitWidth = allSize.x; //window.screen.width
var limitHeight = allSize.y; //window.screen.height
"string" == typeof width && (1 < width.length && "%" == width.substr(width.length - 1, 1)) && (width = parseInt(limitWidth * parseInt(width, 10) / 100, 10));
"string" == typeof height && (1 < height.length && "%" == height.substr(height.length - 1, 1)) && (height = parseInt(limitHeight * parseInt(height, 10) / 100, 10));
300 > width && (width = 300);
220 > height && (height = 220);
top = top || parseInt((limitHeight - height) / 2, 10); //+appTitleSize.y);
left = left || parseInt((limitWidth - width) / 2, 10);
this.formAreaNode.setStyles({
"width": "" + width + "px",
"height": "" + height + "px",
"top": "" + top + "px",
"left": "" + left + "px"
});
this.formNode.setStyles({
"width": "" + width + "px",
"height": "" + height + "px"
});
var iconSize = this.formIconNode ? this.formIconNode.getSize() : {x: 0, y: 0};
var topSize = this.formTopNode ? this.formTopNode.getSize() : {x: 0, y: 0};
var bottomSize = this.formBottomNode ? this.formBottomNode.getSize() : {x: 0, y: 0};
var tabSize = this.tabContainer ? this.tabContainer.getSize() : {x: 0, y: 0};
var contentHeight = height - iconSize.y - topSize.y - bottomSize.y - tabSize.y;
//var formMargin = formHeight -iconSize.y;
this.formContentNode.setStyles({
"height": "" + contentHeight + "px"
});
this.formTableContainer.setStyles({
"height": "" + contentHeight + "px"
});
}
});
MWF.xApplication.MinderEditor.SaveAsForm = new Class({
Extends: MPopupForm,
Implements: [Options, Events],
options: {
"style": "minder",
"width": 800,
//"height": 300,
"height": "300",
"hasTop": true,
"hasIcon": false,
"draggable": true,
"title" : "另存为"
},
_createTableContent: function () {
var html = "" +
" | " +
" |
" +
" | " +
" |
" +
"
";
this.formTableArea.set("html", html);
this.form = new MForm(this.formTableArea, this.data || {}, {
isEdited: true,
style : "minder",
hasColon : true,
itemTemplate: {
folder: { text : "选择文件夹", notEmpty : true, attr : { readonly : true }, defaultValue : "根目录" },
newname: { text : "新文件名称" }
}
}, this.app);
this.form.load();
this.loadFolderSelect();
},
_createBottomContent: function () {
if (this.isNew || this.isEdited) {
this.okActionNode = new Element("button.inputOkButton", {
"styles": this.css.inputOkButton,
"text": "确定"
}).inject(this.formBottomNode);
this.okActionNode.addEvent("click", function (e) {
this.save(e);
}.bind(this));
}
this.cancelActionNode = new Element("button.inputCancelButton", {
"styles": (this.isEdited || this.isNew || this.getEditPermission() ) ? this.css.inputCancelButton : this.css.inputCancelButton_long,
"text": "关闭"
}).inject(this.formBottomNode);
this.cancelActionNode.addEvent("click", function (e) {
this.close(e);
}.bind(this));
},
save: function(){
var data = this.form.getResult(true,null,true,false,true);
if( data ){
this.app.saveAs( this.folderId || "root", data.newname );
this.close();
}
},
loadFolderSelect: function() {
MWF.xDesktop.requireApp("Minder", "Common", null, false);
this.folderSelect = new MWF.xApplication.Minder.FolderSelector( this.app.content, this.form.getItem("folder").getElements()[0], this.app, {}, {
onSelect : function( folderData ){
this.form.getItem("folder").setValue( folderData.name );
this.folderId = folderData.id;
}.bind(this)
} );
}
});
MWF.xApplication.MinderEditor.NewNameForm = new Class({
Extends: MPopupForm,
Implements: [Options, Events],
options: {
"style": "minder",
"width": 700,
//"height": 300,
"height": "200",
"hasTop": true,
"hasIcon": false,
"draggable": true,
"title" : "重命名"
},
_createTableContent: function () {
var html = "";
this.formTableArea.set("html", html);
this.form = new MForm(this.formTableArea, this.data || {}, {
isEdited: true,
style : "minder",
hasColon : true,
itemTemplate: {
newname: { text : "新文件名称", notEmpty : true }
}
}, this.app);
this.form.load();
},
_createBottomContent: function () {
if (this.isNew || this.isEdited) {
this.okActionNode = new Element("button.inputOkButton", {
"styles": this.css.inputOkButton,
"text": "确定"
}).inject(this.formBottomNode);
this.okActionNode.addEvent("click", function (e) {
this.save(e);
}.bind(this));
}
this.cancelActionNode = new Element("button.inputCancelButton", {
"styles": (this.isEdited || this.isNew || this.getEditPermission() ) ? this.css.inputCancelButton : this.css.inputCancelButton_long,
"text": "关闭"
}).inject(this.formBottomNode);
this.cancelActionNode.addEvent("click", function (e) {
this.close(e);
}.bind(this));
},
save: function(){
var data = this.form.getResult(true,null,true,false,true);
if( data ){
this.app.setNewName( data.newname );
this.close();
}
}
});
MWF.xApplication.MinderEditor.ExportTooltips = new Class({
Implements: [Options, Events],
Extends: MTooltips,
options: {
style : "default",
axis: "y", //箭头在x轴还是y轴上展现
position : { //node 固定的位置
x : "auto", //x 轴上left center right, auto 系统自动计算
y : "auto" //y轴上top middle bottom, auto 系统自动计算
},
event : "mouseenter", //事件类型,有target 时有效, mouseenter对应mouseleave,click 对应 container 的 click
nodeStyles : {
"padding-top" : "5px",
"min-width" : "210px",
"padding" : "0px",
"border-radius" : "5px"
}
},
_loadCustom : function( callback ){
this.css = this.app.css;
if( document.id( "km-csrf" ) ){
document.id( "km-csrf").set( "value", this.app.data.id );
}else{
new Element("input", {
id : "km-csrf",
"styles" : { display : "none" }
}).inject( this.contentNode )
}
this.app.loadExtentResource( function(){
var contentNode = this.contentNode;
var list = new Element("div", { styles : this.css.selectorListNode }).inject( contentNode );
var protocols = [];
var pool = kityminder.data.getRegisterProtocol();
for(var name in pool) {
if (pool.hasOwnProperty(name) && pool[name].encode) {
protocols.push(pool[name]);
}
}
protocols.each(function( p ) {
new Element("div", { "text": (p.fileDescription + "("+ p.fileExtension +")"),
styles : this.css.selectorListItemNode,
events : {
mouseover : function(el){
el.target.setStyles( this.css.selectorListItemNode_over )
}.bind(this),
mouseleave : function(el){
el.target.setStyles( this.css.selectorListItemNode )
}.bind(this),
click : function(){
this.exportFile(p);
}.bind(this)
}
}).inject( list );
}.bind(this));
if(callback)callback();
}.bind(this))
},
exportFile : function( protocol ){
this.createProgressBar();
this.minder = this.app.minder;
var fileName = this.app.data.name || this.minder.getRoot().getText();
filename = fileName + protocol.fileExtension;
var mineType = protocol.mineType || 'text/plain';
var options = {
download: true,
filename: filename
};
if( protocol.name == "png" ){
var converter = new MWF.xApplication.MinderEditor.Converter(this.app, this.minder);
converter.toPng(null, null, function( img ){
var link = new Element("a", {"text": filename}).inject(this.progressBarTextNode);
link.download = fileName;
link.href = URL.createObjectURL(img);
//link.href = "data:text/plain," + content;
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click", false, false);
link.dispatchEvent(evt);
link.click();
this.progressBarNode.destroy();
this.progressBarNode = null;
this.progressBarTextNode = null;
this.progressBar = null;
this.progressBarPercent = null;
}.bind(this));
}else{
this.minder.exportData(protocol.name, options).then(function(data) {
if (protocol.name == 'freemind') {
return;
}
switch (protocol.dataType) {
case 'text':
return this.doDownload(this.buildDataUrl(mineType, data), filename, 'text');
case 'base64':
return this.doDownload(data, filename, 'base64');
case 'blob':
return null;
}
return null;
}.bind(this));
}
},
doDownload : function (url, filename, type) {
var Promise = kityminder.Promise;
var stamp = +new Date() * 1e5 + Math.floor(Math.random() * (1e5 - 1));
stamp = stamp.toString(36);
var ret = new Promise(function(resolve, reject) {
var ticker = 0;
var MAX_TICK = 30;
var interval = 1000;
//function check() {
// if (document.cookie.indexOf(stamp + '=1') != -1) return resolve([stamp, ticker]);
// if (++ticker > MAX_TICK) {
// resolve([stamp, ticker]);
// }
// setTimeout(check, interval);
//}
//
//setTimeout(check, interval);
var content = url.split(',')[1];
this.saveToLocal( content, filename );
return resolve([stamp, ticker]);
}.bind(this));
//var form = new Element("form",{
// 'action': 'home/download',
// 'method': 'POST',
// 'accept-charset': 'utf-8'
//});
//var $content = new Element("input",{
// name: 'content',
// type: 'hidden',
// value: decodeURIComponent(content)
//}).inject( from );
//
//var $type = new Element("input",{
// name: 'type',
// type: 'hidden',
// value: type
//}).inject( from );
//
//var $filename = new Element("input",{
// name: 'filename',
// type: 'hidden',
// value: filename
//}).inject( from );
//
//var $csrfToken = new Element("input",{
// name: 'csrf_token',
// type: 'hidden',
// value: $('#km-csrf').val()
//}).inject( from );
//
//
//if (kity.Browser.ie) {
// new Element("input",{
// name : "iehack",
// value : "1"
// }).inject( form );
//}
//
//new Element("input",{
// name : "stamp",
// value : stamp
//}).inject( form );
//
//form.inject('body');
//form.submit();
//form.destroy();
return ret;
},
buildDataUrl: function (mineType, data) {
return 'data:' + mineType + '; utf-8,' + encodeURIComponent(data);
},
saveToLocal: function( data, filename ){
if (window.hasOwnProperty("ActiveXObject")){
var win = window.open("", "_blank");
win.document.write(decodeURIComponent(data));
}else{
this.downloadFile(filename, decodeURIComponent(data));
}
this.progressBarNode.destroy();
this.progressBarNode = null;
this.progressBarTextNode = null;
this.progressBar = null;
this.progressBarPercent = null;
this.close();
},
downloadFile: function(fileName, content){
var link = new Element("a", {"text": this.data.name}).inject(this.progressBarTextNode);
var blob = new Blob([content]);
link.download = fileName;
link.href = URL.createObjectURL(blob);
//link.href = "data:text/plain," + content;
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click", false, false);
link.dispatchEvent(evt);
link.click();
},
createProgressBar: function(){
this.node.hide();
this.progressBarNode = new Element("div", {"styles": this.css.progressBarNode});
this.progressBarNode.inject(this.container);
this.progressBarNode.position({
relativeTo: this.container,
position: 'center',
edge: 'center'
});
this.progressBarTextNode = new Element("div", {"styles": this.css.progressBarTextNode}).inject(this.progressBarNode);
this.progressBar = new Element("div", {"styles": this.css.progressBar}).inject(this.progressBarNode);
this.progressBarPercent = new Element("div", {"styles": this.css.progressBarPercent}).inject(this.progressBar);
}
});
MWF.xApplication.MinderEditor.ExportForm = new Class({
Extends: MPopupForm,
Implements: [Options, Events],
options: {
"style": "minder",
"width": 400,
//"height": 300,
"height": "300",
"hasTop": true,
"hasIcon": false,
"draggable": true,
"hasBottom" : false,
"title" : "选择导出的文件类型"
},
_createTableContent : function( callback ){
this.css = this.app.css;
if( document.id( "km-csrf" ) ){
document.id( "km-csrf").set( "value", this.app.data.id );
}else{
new Element("input", {
id : "km-csrf",
"styles" : { display : "none" }
}).inject( this.formTableArea )
}
this.app.loadExtentResource( function(){
var contentNode = this.formTableArea;
var list = new Element("div", { styles : this.css.selectorListNode }).inject( contentNode );
var protocols = [];
debugger;
var pool = kityminder.data.getRegisterProtocol();
for(var name in pool) {
if (pool.hasOwnProperty(name) && pool[name].encode) {
protocols.push(pool[name]);
}
}
protocols.each(function( p ) {
new Element("div", { "text": (p.fileDescription + "("+ p.fileExtension +")"),
styles : this.css.selectorListItemNode,
events : {
mouseover : function(el){
el.target.setStyles( this.css.selectorListItemNode_over )
}.bind(this),
mouseleave : function(el){
el.target.setStyles( this.css.selectorListItemNode )
}.bind(this),
click : function(){
this.exportFile(p);
}.bind(this)
}
}).inject( list );
}.bind(this));
if(callback)callback();
}.bind(this))
},
exportFile : function( protocol ){
this.createProgressBar();
this.minder = this.app.minder;
var fileName = this.app.data.name || this.minder.getRoot().getText();
filename = fileName + protocol.fileExtension;
var mineType = protocol.mineType || 'text/plain';
var options = {
download: true,
filename: filename
};
if( protocol.name == "png" ){
var converter = new MWF.xApplication.MinderEditor.Converter(this.app, this.minder);
converter.toPng(null, null, function( img ){
var link = new Element("a", {"text": filename}).inject(this.progressBarTextNode);
link.download = fileName;
link.href = URL.createObjectURL(img);
//link.href = "data:text/plain," + content;
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click", false, false);
link.dispatchEvent(evt);
link.click();
this.progressBarNode.destroy();
this.progressBarNode = null;
this.progressBarTextNode = null;
this.progressBar = null;
this.progressBarPercent = null;
}.bind(this));
}else{
this.minder.exportData(protocol.name, options).then(function(data) {
if (protocol.name == 'freemind') {
return;
}
switch (protocol.dataType) {
case 'text':
return this.doDownload(this.buildDataUrl(mineType, data), filename, 'text');
case 'base64':
return this.doDownload(data, filename, 'base64');
case 'blob':
return null;
}
return null;
}.bind(this));
}
},
doDownload : function (url, filename, type) {
var Promise = kityminder.Promise;
var stamp = +new Date() * 1e5 + Math.floor(Math.random() * (1e5 - 1));
stamp = stamp.toString(36);
var ret = new Promise(function(resolve, reject) {
var ticker = 0;
var MAX_TICK = 30;
var interval = 1000;
//function check() {
// if (document.cookie.indexOf(stamp + '=1') != -1) return resolve([stamp, ticker]);
// if (++ticker > MAX_TICK) {
// resolve([stamp, ticker]);
// }
// setTimeout(check, interval);
//}
//
//setTimeout(check, interval);
var content = url.split(',')[1];
this.saveToLocal( content, filename );
return resolve([stamp, ticker]);
}.bind(this));
//var form = new Element("form",{
// 'action': 'home/download',
// 'method': 'POST',
// 'accept-charset': 'utf-8'
//});
//var $content = new Element("input",{
// name: 'content',
// type: 'hidden',
// value: decodeURIComponent(content)
//}).inject( from );
//
//var $type = new Element("input",{
// name: 'type',
// type: 'hidden',
// value: type
//}).inject( from );
//
//var $filename = new Element("input",{
// name: 'filename',
// type: 'hidden',
// value: filename
//}).inject( from );
//
//var $csrfToken = new Element("input",{
// name: 'csrf_token',
// type: 'hidden',
// value: $('#km-csrf').val()
//}).inject( from );
//
//
//if (kity.Browser.ie) {
// new Element("input",{
// name : "iehack",
// value : "1"
// }).inject( form );
//}
//
//new Element("input",{
// name : "stamp",
// value : stamp
//}).inject( form );
//
//form.inject('body');
//form.submit();
//form.destroy();
return ret;
},
buildDataUrl: function (mineType, data) {
return 'data:' + mineType + '; utf-8,' + encodeURIComponent(data);
},
saveToLocal: function( data, filename ){
if (window.hasOwnProperty("ActiveXObject")){
var win = window.open("", "_blank");
win.document.write(decodeURIComponent(data));
}else{
this.downloadFile(filename, decodeURIComponent(data));
}
this.progressBarNode.destroy();
this.progressBarNode = null;
this.progressBarTextNode = null;
this.progressBar = null;
this.progressBarPercent = null;
this.close();
},
downloadFile: function(fileName, content){
var link = new Element("a", {"text": this.data.name}).inject(this.progressBarTextNode);
var blob = new Blob([content]);
link.download = fileName;
link.href = URL.createObjectURL(blob);
//link.href = "data:text/plain," + content;
var evt = document.createEvent("HTMLEvents");
evt.initEvent("click", false, false);
link.dispatchEvent(evt);
link.click();
},
createProgressBar: function(){
this.progressBarNode = new Element("div", {"styles": this.css.progressBarNode});
this.progressBarNode.inject(this.container);
this.progressBarNode.position({
relativeTo: this.container,
position: 'center',
edge: 'center'
});
this.progressBarTextNode = new Element("div", {"styles": this.css.progressBarTextNode}).inject(this.progressBarNode);
this.progressBar = new Element("div", {"styles": this.css.progressBar}).inject(this.progressBarNode);
this.progressBarPercent = new Element("div", {"styles": this.css.progressBarPercent}).inject(this.progressBar);
this.close();
}
});