<style lang="less" scoped>
.toolbarContainer{
    width: 100%;
    height: 50px;
}
.toolbar{
    width: 100%;
    height: 50px;
    overflow: auto;
    padding: 0px;
}
.toolbar::-webkit-scrollbar{  //去掉滚动条
    display:none;
}
</style>
<template>
    <div>
        <div ref="toolbarContainer" class="toolbarContainer" slot="toolbarContainer">
            <div ref="toolbar" class="toolbar" slot="toolbar">
                <Toolbar ref="toolbarComponent" :instance="instance" style="min-width:780px;"></Toolbar>
            </div>
        </div>
        <div style="padding-left:32px;padding-right:32px;">
            <script :id="randomId" name="content" type="text/plain"></script>
        </div>
    </div>
</template>

<script>
import Toolbar from './editor-toolbar.vue'
import jQuery from './jquery-plugin.js'

export default {
    name: 'VueUEditor',
    props: {
        ueditorPath: {
            // UEditor 代码的路径
            type: String,
            default: '/ueditor/'
        },
        ueditorConfig: {
            // UEditor 配置项
            type: Object,
            default: function () {
                return {};
            }
        }
    },
    mounted(){
        this.ueditorConfig.toolbars = [  //@king:切勿调整顺序,自定义工具栏中用到了对应顺序的id
            [
                'anchor', //锚点
                'undo', //撤销
                'redo', //重做
                'bold', //加粗
                'indent', //首行缩进
                'snapscreen', //截图
                'italic', //斜体
                'underline', //下划线
                'strikethrough', //删除线
                'subscript', //下标
                'fontborder', //字符边框
                'superscript', //上标
                'formatmatch', //格式刷
                'source', //源代码
                'blockquote', //引用
                'pasteplain', //纯文本粘贴模式
                'selectall', //全选
                'print', //打印
                'preview', //预览
                'horizontal', //分隔线
                'removeformat', //清除格式
                'time', //时间
                'date', //日期
                'unlink', //取消链接
                'insertrow', //前插入行
                'insertcol', //前插入列
                'mergeright', //右合并单元格
                'mergedown', //下合并单元格
                'deleterow', //删除行
                'deletecol', //删除列
                'splittorows', //拆分成行
                'splittocols', //拆分成列
                'splittocells', //完全拆分单元格
                'deletecaption', //删除表格标题
                'inserttitle', //插入标题
                'mergecells', //合并多个单元格
                'deletetable', //删除表格
                'cleardoc', //清空文档
                'insertparagraphbeforetable', //"表格前插入行"
                'insertcode', //代码语言
                'fontfamily', //字体
                'fontsize', //字号
                'paragraph', //段落格式
                'simpleupload', //单图上传
                'insertimage', //多图上传
                'edittable', //表格属性
                'edittd', //单元格属性
                'link', //超链接
                'emotion', //表情
                'spechars', //特殊字符
                'searchreplace', //查询替换
                'map', //Baidu地图
                'gmap', //Google地图
                'insertvideo', //视频
                'help', //帮助
                'justifyleft', //居左对齐
                'justifyright', //居右对齐
                'justifycenter', //居中对齐
                'justifyjustify', //两端对齐
                'forecolor', //字体颜色
                'backcolor', //背景色
                'insertorderedlist', //有序列表
                'insertunorderedlist', //无序列表
                'fullscreen', //全屏
                'directionalityltr', //从左向右输入
                'directionalityrtl', //从右向左输入
                'rowspacingtop', //段前距
                'rowspacingbottom', //段后距
                'pagebreak', //分页
                'insertframe', //插入Iframe
                'imagenone', //默认
                'imageleft', //左浮动
                'imageright', //右浮动
                'attachment', //附件
                'imagecenter', //居中
                'wordimage', //图片转存
                'lineheight', //行间距
                'edittip ', //编辑提示
                'customstyle', //自定义标题
                'autotypeset', //自动排版
                'webapp', //百度应用
                'touppercase', //字母大写
                'tolowercase', //字母小写
                'background', //背景
                'template', //模板
                'scrawl', //涂鸦
                'music', //音乐
                'inserttable', //插入表格
                'drafts', // 从草稿箱加载
                'charts', // 图表
            ]
        ];
    },
    data () {
        return {
            // 为了避免麻烦,每个编辑器实例都用不同的 id
            randomId: 'editor_' + (Math.random() * 100000000000000000),
            instance: null,
            // scriptTagStatus -> 0:代码未加载,1:两个代码依赖加载了一个,2:两个代码依赖都已经加载完成
            scriptTagStatus: 0,
            showFixedToolbar: false,
            $$cloneToolbar: null
        };
    },
    created () {
        if (window.UE !== undefined) {
            // 如果全局对象存在,说明编辑器代码已经初始化完成,直接加载编辑器
            this.scriptTagStatus = 2;
            this.initEditor();
        } else {
            // 如果全局对象不存在,说明编辑器代码还没有加载完成,需要加载编辑器代码
            this.insertScriptTag();
        }
    },
    beforeDestroy () {
        // 组件销毁的时候,要销毁 UEditor 实例
        if (this.instance !== null && this.instance.destroy) {
            this.instance.destroy();
        }
    },
    methods: {
        insertScriptTag () {
            let editorScriptTag = document.getElementById('editorScriptTag');
            let configScriptTag = document.getElementById('configScriptTag');

            // 如果这个tag不存在,则生成相关代码tag以加载代码
            if (editorScriptTag === null) {
                configScriptTag = document.createElement('script');
                configScriptTag.type = 'text/javascript'; configScriptTag.src = this.ueditorPath + 'ueditor.config.js'; configScriptTag.id = 'configScriptTag';

                editorScriptTag = document.createElement('script');
                editorScriptTag.type = 'text/javascript'; editorScriptTag.src = this.ueditorPath + 'ueditor.all.js'; editorScriptTag.id = 'editorScriptTag';
                let s = document.getElementsByTagName('head')[0];
                console.log(editorScriptTag)
                s.appendChild(configScriptTag);
                s.appendChild(editorScriptTag);
            }

            // 等待代码加载完成后初始化编辑器
            if (configScriptTag.loaded) {
                this.scriptTagStatus++;
            } else {
                configScriptTag.addEventListener('load', () => {
                    this.scriptTagStatus++;
                    configScriptTag.loaded = true;
                    this.initEditor();
                });
            }

            if (editorScriptTag.loaded) {
                this.scriptTagStatus++;
            } else {
                editorScriptTag.addEventListener('load', () => {
                    this.scriptTagStatus++;
                    editorScriptTag.loaded = true;
                    this.initEditor();
                });
            }

            this.initEditor();
        },
        initEditor () {
            // scriptTagStatus 为 2 的时候,说明两个必需引入的 js 文件都已经被引入,且加载完成
            if (this.scriptTagStatus === 2 && this.instance === null) {
                // Vue 异步执行 DOM 更新,这样一来代码执行到这里的时候可能 template 里面的 script 标签还没真正创建
                // 所以,我们只能在 nextTick 里面初始化 UEditor
                this.$nextTick(() => {
                    this.instance = window.UE.getEditor(this.randomId, {});
                    // 绑定事件,当 UEditor 初始化完成后,将编辑器实例通过自定义的 ready 事件交出去
                    this.instance.addListener('ready', () => {
                        this.$emit('ready', this.instance);
                    });
                });
            }
        },
        // fixToolbar(isFix, scrollDom){
        //     if(isFix){
        //         this.$refs['toolbarComponent'].hideAllFloatPanel();
        //         if(this.$$cloneToolbar){
        //             this.$$cloneToolbar.show();
        //         }else{
        //             let toolbar_jQuery = jQuery(this.$refs['toolbar'].$el);
        //             this.$$cloneToolbar = jQuery(toolbar_jQuery).clone(true);
        //             let scroll_jQuery = jQuery(scrollDom);
        //             scroll_jQuery.append(this.$$cloneToolbar);
        //             this.$$cloneToolbar.css({
        //                 'position': 'fixed',
        //                 'left': scroll_jQuery.offset().left + parseInt(scroll_jQuery.css('border-left-width')),
        //                 'top': scroll_jQuery.offset().top,
        //                 'z-index': '999999999999999',
        //                 'width': toolbar_jQuery.outerWidth(),
        //                 'height': toolbar_jQuery.outerHeight()
        //             });

        //             // console.log(toolbar_jQuery.width(), toolbar_jQuery.height(), scroll_jQuery.offset().left, scroll_jQuery.offset().top, scroll_jQuery.position().left, scroll_jQuery.position().top);
        //             toolbar_jQuery.resize(()=>{
        //                 this.$$cloneToolbar.css({
        //                     'position': 'fixed',
        //                     'left': scroll_jQuery.offset().left + parseInt(scroll_jQuery.css('border-left-width')),
        //                     'top': scroll_jQuery.offset().top,
        //                     'z-index': '999999999999999',
        //                     'width': toolbar_jQuery.outerWidth(),
        //                     'height': toolbar_jQuery.outerHeight()
        //                 });
        //                 this.$refs['toolbarComponent'].hideAllFloatPanel();
        //             });
        //         }
        //     }else{
        //         if(this.$$cloneToolbar){
        //             this.$$cloneToolbar.hide();
        //         }
        //     }
        //     this.showFixedToolbar = isFix;
        // }
        fixToolbar(isFix, scrollDom){
            let toolbar_jQuery = jQuery(this.$refs['toolbar']);
            let toolbarContainer_jQuery = jQuery(this.$refs['toolbarContainer']);
            if(isFix){
                this.$refs['toolbarComponent'].hideAllFloatPanel();
                let scroll_jQuery = jQuery(scrollDom);
                toolbar_jQuery.css({
                    'position': 'fixed',
                    // 'left': scroll_jQuery.offset().left + parseInt(scroll_jQuery.css('border-left-width')),
                    'top': scroll_jQuery.offset().top,
                    'z-index': '99999999999999',
                    'width': toolbar_jQuery.outerWidth(),
                    'height': toolbar_jQuery.outerHeight()
                });
                scroll_jQuery.resize(()=>{
                    if(this.$refs['toolbarComponent']){
                        this.$refs['toolbarComponent'].hideAllFloatPanel();
                    }
                    toolbar_jQuery.css({
                        'position': 'fixed',
                        // 'left': scroll_jQuery.offset().left + parseInt(scroll_jQuery.css('border-left-width')),
                        'top': scroll_jQuery.offset().top,
                        'z-index': '99999999999999',
                        'width': scroll_jQuery.width(),
                        // 'height': scroll_jQuery.height()
                    });
                    // toolbar_jQuery.css({
                    //     'position': 'static'
                    // });
                    // toolbar_jQuery.css({
                    //     'position': 'fixed'
                    // });
                });
            }else{
                toolbar_jQuery.css({
                    'position': 'static'
                });
            }
            this.showFixedToolbar = isFix;
        },
        resetToolbar(){
            let toolbar_jQuery = jQuery(this.$refs['toolbar']);
            toolbar_jQuery.css({
                'position': 'static'
            });
        },
        execCommand(command, param){
            if(this.instance){
                this.instance.execCommand(command, param);
            }
        }
    },
    components:{
        Toolbar
    }
};
</script>