/**
* @fileOverview
*
* 支持从本地打开文件
*
* @author: techird
* @copyright: Baidu FEX, 2014
*/
KityMinder.registerUI('menu/open/local', function(minder) {
var $menu = minder.getUI('menu/menu');
var $open = minder.getUI('menu/open/open');
var $doc = minder.getUI('doc');
var notice = minder.getUI('widget/notice');
/* extension => protocol */
var supports = {};
var accepts = [];
minder.getSupportedProtocols().forEach(function(protocol) {
if (protocol.decode) {
supports[protocol.fileExtension] = protocol;
accepts.push(protocol.fileExtension);
}
});
/* 网盘面板 */
var $panel = $($open.createSub('local')).addClass('local-file-open-panel');
/* 标题 */
$('
本地文件
')
.appendTo($panel);
/* 选择文件 */
var $pick = $('')
.appendTo($panel);
var $pickButton = $('')
.text(minder.getLang('ui.pickfile'))
.appendTo($pick);
$('')
.text(minder.getLang('ui.acceptfile', accepts.map(function(ext) {
var protocol = supports[ext];
return protocol.fileDescription + '(' + ext + ')';
}).join(', '))).appendTo($pick);
/* 拖放提示 */
var $drop = $('')
.append($('').html(minder.getLang('ui.dropfile')))
.appendTo($panel);
/* 交互事件 */
$pickButton.click(function() {
if (!$doc.checkSaved()) return;
$('')
.attr('accept', accepts.join())
.on('change', function(e) {
read(this.files[0]);
$menu.hide();
}).click();
});
var cwrapper = $('#content-wrapper')[0];
cwrapper.addEventListener('dragover', function(e) {
e.preventDefault();
e.stopPropagation();
}, false);
cwrapper.addEventListener('drop', function(e) {
if (e.dataTransfer.files.length) {
e.preventDefault();
if (!$doc.checkSaved()) return;
read(e.dataTransfer.files[0]);
$menu.hide();
}
}, false);
function read(domfile) {
if (!domfile) return;
var info = new fio.file.anlysisPath(domfile.name);
var protocol = supports[info.extension];
if (!protocol || !protocol.decode) {
notice.warn(minder.getLang('ui.unsupportedfile'));
return Promise.reject();
}
function loadFile(file, protocol) {
return new Promise(function(resolve, reject) {
var reader;
if (protocol.dataType == 'blob') {
resolve(new fio.file.Data(domfile));
} else {
reader = new FileReader();
reader.onload = function() {
resolve(new fio.file.Data(this.result));
};
reader.onerror = reject;
reader.readAsText(domfile, 'utf-8');
}
});
}
function loadFileError() {
var notice = minder.getUI('widget/notice');
notice.error('err_localfile_read');
}
function loadDoc(data) {
var doc = {
content: data.content,
protocol: protocol.name,
title: info.filename,
source: 'local'
};
return $doc.load(doc);
}
$(minder.getRenderTarget()).addClass('loading');
return loadFile(domfile, protocol).then(loadDoc, loadFileError).then(function() {
$(minder.getRenderTarget()).removeClass('loading');
});
}
return {
read: read
};
});