| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936 | /** * Created with JetBrains PhpStorm. * User: taoqili * Date: 13-2-20 * Time: 下午6:25 * To change this template use File | Settings | File Templates. */;(function () {    var UT = UE.UETable,        getTableItemsByRange = function (editor) {            return UT.getTableItemsByRange(editor);        },        getUETableBySelected = function (editor) {            return UT.getUETableBySelected(editor)        },        getDefaultValue = function (editor, table) {            return UT.getDefaultValue(editor, table);        },        getUETable = function (tdOrTable) {            return UT.getUETable(tdOrTable);        };    UE.commands['inserttable'] = {        queryCommandState: function () {            return getTableItemsByRange(this).table ? -1 : 0;        },        execCommand: function (cmd, opt) {            function createTable(opt, tdWidth) {                var html = [],                    rowsNum = opt.numRows,                    colsNum = opt.numCols;                for (var r = 0; r < rowsNum; r++) {                    html.push('<tr' + (r == 0 ? ' class="firstRow"':'') + '>');                    for (var c = 0; c < colsNum; c++) {                        html.push('<td width="' + tdWidth + '"  vAlign="' + opt.tdvalign + '" >' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '<br/>') + '</td>')                    }                    html.push('</tr>')                }                //禁止指定table-width                return '<table><tbody>' + html.join('') + '</tbody></table>'            }            if (!opt) {                opt = utils.extend({}, {                    numCols: this.options.defaultCols,                    numRows: this.options.defaultRows,                    tdvalign: this.options.tdvalign                })            }            var me = this;            var range = this.selection.getRange(),                start = range.startContainer,                firstParentBlock = domUtils.findParent(start, function (node) {                    return domUtils.isBlockElm(node);                }, true) || me.body;            var defaultValue = getDefaultValue(me),                tableWidth = firstParentBlock.offsetWidth,                tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder);            //todo其他属性            !opt.tdvalign && (opt.tdvalign = me.options.tdvalign);            me.execCommand("inserthtml", createTable(opt, tdWidth));        }    };    UE.commands['insertparagraphbeforetable'] = {        queryCommandState: function () {            return getTableItemsByRange(this).cell ? 0 : -1;        },        execCommand: function () {            var table = getTableItemsByRange(this).table;            if (table) {                var p = this.document.createElement("p");                p.innerHTML = browser.ie ? ' ' : '<br />';                table.parentNode.insertBefore(p, table);                this.selection.getRange().setStart(p, 0).setCursor();            }        }    };    UE.commands['deletetable'] = {        queryCommandState: function () {            var rng = this.selection.getRange();            return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1;        },        execCommand: function (cmd, table) {            var rng = this.selection.getRange();            table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true);            if (table) {                var next = table.nextSibling;                if (!next) {                    next = domUtils.createElement(this.document, 'p', {                        'innerHTML': browser.ie ? domUtils.fillChar : '<br/>'                    });                    table.parentNode.insertBefore(next, table);                }                domUtils.remove(table);                rng = this.selection.getRange();                if (next.nodeType == 3) {                    rng.setStartBefore(next)                } else {                    rng.setStart(next, 0)                }                rng.setCursor(false, true)                this.fireEvent("tablehasdeleted")            }        }    };    UE.commands['cellalign'] = {        queryCommandState: function () {            return getSelectedArr(this).length ? 0 : -1        },        execCommand: function (cmd, align) {            var selectedTds = getSelectedArr(this);            if (selectedTds.length) {                for (var i = 0, ci; ci = selectedTds[i++];) {                    ci.setAttribute('align', align);                }            }        }    };    UE.commands['cellvalign'] = {        queryCommandState: function () {            return getSelectedArr(this).length ? 0 : -1;        },        execCommand: function (cmd, valign) {            var selectedTds = getSelectedArr(this);            if (selectedTds.length) {                for (var i = 0, ci; ci = selectedTds[i++];) {                    ci.setAttribute('vAlign', valign);                }            }        }    };    UE.commands['insertcaption'] = {        queryCommandState: function () {            var table = getTableItemsByRange(this).table;            if (table) {                return table.getElementsByTagName('caption').length == 0 ? 1 : -1;            }            return -1;        },        execCommand: function () {            var table = getTableItemsByRange(this).table;            if (table) {                var caption = this.document.createElement('caption');                caption.innerHTML = browser.ie ? domUtils.fillChar : '<br/>';                table.insertBefore(caption, table.firstChild);                var range = this.selection.getRange();                range.setStart(caption, 0).setCursor();            }        }    };    UE.commands['deletecaption'] = {        queryCommandState: function () {            var rng = this.selection.getRange(),                table = domUtils.findParentByTagName(rng.startContainer, 'table');            if (table) {                return table.getElementsByTagName('caption').length == 0 ? -1 : 1;            }            return -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                table = domUtils.findParentByTagName(rng.startContainer, 'table');            if (table) {                domUtils.remove(table.getElementsByTagName('caption')[0]);                var range = this.selection.getRange();                range.setStart(table.rows[0].cells[0], 0).setCursor();            }        }    };    UE.commands['inserttitle'] = {        queryCommandState: function () {            var table = getTableItemsByRange(this).table;            if (table) {                var firstRow = table.rows[0];                return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() != 'th' ? 0 : -1            }            return -1;        },        execCommand: function () {            var table = getTableItemsByRange(this).table;            if (table) {                getUETable(table).insertRow(0, 'th');            }            var th = table.getElementsByTagName('th')[0];            this.selection.getRange().setStart(th, 0).setCursor(false, true);        }    };    UE.commands['deletetitle'] = {        queryCommandState: function () {            var table = getTableItemsByRange(this).table;            if (table) {                var firstRow = table.rows[0];                return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() == 'th' ? 0 : -1            }            return -1;        },        execCommand: function () {            var table = getTableItemsByRange(this).table;            if (table) {                domUtils.remove(table.rows[0])            }            var td = table.getElementsByTagName('td')[0];            this.selection.getRange().setStart(td, 0).setCursor(false, true);        }    };    UE.commands['inserttitlecol'] = {        queryCommandState: function () {            var table = getTableItemsByRange(this).table;            if (table) {                var lastRow = table.rows[table.rows.length-1];                return lastRow.getElementsByTagName('th').length ? -1 : 0;            }            return -1;        },        execCommand: function (cmd) {            var table = getTableItemsByRange(this).table;            if (table) {                getUETable(table).insertCol(0, 'th');            }            resetTdWidth(table, this);            var th = table.getElementsByTagName('th')[0];            this.selection.getRange().setStart(th, 0).setCursor(false, true);        }    };    UE.commands['deletetitlecol'] = {        queryCommandState: function () {            var table = getTableItemsByRange(this).table;            if (table) {                var lastRow = table.rows[table.rows.length-1];                return lastRow.getElementsByTagName('th').length ? 0 : -1;            }            return -1;        },        execCommand: function () {            var table = getTableItemsByRange(this).table;            if (table) {                for(var i = 0; i< table.rows.length; i++ ){                    domUtils.remove(table.rows[i].children[0])                }            }            resetTdWidth(table, this);            var td = table.getElementsByTagName('td')[0];            this.selection.getRange().setStart(td, 0).setCursor(false, true);        }    };    UE.commands["mergeright"] = {        queryCommandState: function (cmd) {            var tableItems = getTableItemsByRange(this),                table = tableItems.table,                cell = tableItems.cell;            if (!table || !cell) return -1;            var ut = getUETable(table);            if (ut.selectedTds.length) return -1;            var cellInfo = ut.getCellInfo(cell),                rightColIndex = cellInfo.colIndex + cellInfo.colSpan;            if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并            var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex],                rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex];            if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并            // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并            return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1;        },        execCommand: function (cmd) {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell);            ut.mergeRight(cell);            rng.moveToBookmark(bk).select();        }    };    UE.commands["mergedown"] = {        queryCommandState: function (cmd) {            var tableItems = getTableItemsByRange(this),                table = tableItems.table,                cell = tableItems.cell;            if (!table || !cell) return -1;            var ut = getUETable(table);            if (ut.selectedTds.length)return -1;            var cellInfo = ut.getCellInfo(cell),                downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan;            if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并            var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex],                downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex];            if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并            // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并            return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell);            ut.mergeDown(cell);            rng.moveToBookmark(bk).select();        }    };    UE.commands["mergecells"] = {        queryCommandState: function () {            return getUETableBySelected(this) ? 0 : -1;        },        execCommand: function () {            var ut = getUETableBySelected(this);            if (ut && ut.selectedTds.length) {                var cell = ut.selectedTds[0];                ut.mergeRange();                var rng = this.selection.getRange();                if (domUtils.isEmptyBlock(cell)) {                    rng.setStart(cell, 0).collapse(true)                } else {                    rng.selectNodeContents(cell)                }                rng.select();            }        }    };    UE.commands["insertrow"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) &&                getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell,                table = tableItems.table,                ut = getUETable(table),                cellInfo = ut.getCellInfo(cell);            //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,'');            if (!ut.selectedTds.length) {                ut.insertRow(cellInfo.rowIndex, cell);            } else {                var range = ut.cellsRange;                for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) {                    ut.insertRow(range.beginRowIndex, cell);                }            }            rng.moveToBookmark(bk).select();            if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table);        }    };    //后插入行    UE.commands["insertrownext"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            return cell && (cell.tagName == "TD") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell,                table = tableItems.table,                ut = getUETable(table),                cellInfo = ut.getCellInfo(cell);            //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,'');            if (!ut.selectedTds.length) {                ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell);            } else {                var range = ut.cellsRange;                for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) {                    ut.insertRow(range.endRowIndex + 1, cell);                }            }            rng.moveToBookmark(bk).select();            if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table);        }    };    UE.commands["deleterow"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this);            return tableItems.cell ? 0 : -1;        },        execCommand: function () {            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell),                cellsRange = ut.cellsRange,                cellInfo = ut.getCellInfo(cell),                preCell = ut.getVSideCell(cell),                nextCell = ut.getVSideCell(cell, true),                rng = this.selection.getRange();            if (utils.isEmptyObject(cellsRange)) {                ut.deleteRow(cellInfo.rowIndex);            } else {                for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) {                    ut.deleteRow(cellsRange.beginRowIndex);                }            }            var table = ut.table;            if (!table.getElementsByTagName('td').length) {                var nextSibling = table.nextSibling;                domUtils.remove(table);                if (nextSibling) {                    rng.setStart(nextSibling, 0).setCursor(false, true);                }            } else {                if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) {                    if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true);                } else {                    var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex);                    if (newCell) rng.selectNodeContents(newCell).setCursor(false, true);                }            }            if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table);        }    };    UE.commands["insertcol"] = {        queryCommandState: function (cmd) {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) &&                getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1;        },        execCommand: function (cmd) {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            if (this.queryCommandState(cmd) == -1)return;            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell),                cellInfo = ut.getCellInfo(cell);            //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex);            if (!ut.selectedTds.length) {                ut.insertCol(cellInfo.colIndex, cell);            } else {                var range = ut.cellsRange;                for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) {                    ut.insertCol(range.beginColIndex, cell);                }            }            rng.moveToBookmark(bk).select(true);        }    };    UE.commands["insertcolnext"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell),                cellInfo = ut.getCellInfo(cell);            //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1);            if (!ut.selectedTds.length) {                ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell);            } else {                var range = ut.cellsRange;                for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) {                    ut.insertCol(range.endColIndex + 1, cell);                }            }            rng.moveToBookmark(bk).select();        }    };    UE.commands["deletecol"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this);            return tableItems.cell ? 0 : -1;        },        execCommand: function () {            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell),                range = ut.cellsRange,                cellInfo = ut.getCellInfo(cell),                preCell = ut.getHSideCell(cell),                nextCell = ut.getHSideCell(cell, true);            if (utils.isEmptyObject(range)) {                ut.deleteCol(cellInfo.colIndex);            } else {                for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) {                    ut.deleteCol(range.beginColIndex);                }            }            var table = ut.table,                rng = this.selection.getRange();            if (!table.getElementsByTagName('td').length) {                var nextSibling = table.nextSibling;                domUtils.remove(table);                if (nextSibling) {                    rng.setStart(nextSibling, 0).setCursor(false, true);                }            } else {                if (domUtils.inDoc(cell, this.document)) {                    rng.setStart(cell, 0).setCursor(false, true);                } else {                    if (nextCell && domUtils.inDoc(nextCell, this.document)) {                        rng.selectNodeContents(nextCell).setCursor(false, true);                    } else {                        if (preCell && domUtils.inDoc(preCell, this.document)) {                            rng.selectNodeContents(preCell).setCursor(true, true);                        }                    }                }            }        }    };    UE.commands["splittocells"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            if (!cell) return -1;            var ut = getUETable(tableItems.table);            if (ut.selectedTds.length > 0) return -1;            return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell);            ut.splitToCells(cell);            rng.moveToBookmark(bk).select();        }    };    UE.commands["splittorows"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            if (!cell) return -1;            var ut = getUETable(tableItems.table);            if (ut.selectedTds.length > 0) return -1;            return cell && cell.rowSpan > 1 ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell);            ut.splitToRows(cell);            rng.moveToBookmark(bk).select();        }    };    UE.commands["splittocols"] = {        queryCommandState: function () {            var tableItems = getTableItemsByRange(this),                cell = tableItems.cell;            if (!cell) return -1;            var ut = getUETable(tableItems.table);            if (ut.selectedTds.length > 0) return -1;            return cell && cell.colSpan > 1 ? 0 : -1;        },        execCommand: function () {            var rng = this.selection.getRange(),                bk = rng.createBookmark(true);            var cell = getTableItemsByRange(this).cell,                ut = getUETable(cell);            ut.splitToCols(cell);            rng.moveToBookmark(bk).select();        }    };    UE.commands["adaptbytext"] =        UE.commands["adaptbywindow"] = {            queryCommandState: function () {                return getTableItemsByRange(this).table ? 0 : -1            },            execCommand: function (cmd) {                var tableItems = getTableItemsByRange(this),                    table = tableItems.table;                if (table) {                    if (cmd == 'adaptbywindow') {                        resetTdWidth(table, this);                    } else {                        var cells = domUtils.getElementsByTagName(table, "td th");                        utils.each(cells, function (cell) {                            cell.removeAttribute("width");                        });                        table.removeAttribute("width");                    }                }            }        };    //平均分配各列    UE.commands['averagedistributecol'] = {        queryCommandState: function () {            var ut = getUETableBySelected(this);            if (!ut) return -1;            return ut.isFullRow() || ut.isFullCol() ? 0 : -1;        },        execCommand: function (cmd) {            var me = this,                ut = getUETableBySelected(me);            function getAverageWidth() {                var tb = ut.table,                    averageWidth, sumWidth = 0, colsNum = 0,                    tbAttr = getDefaultValue(me, tb);                if (ut.isFullRow()) {                    sumWidth = tb.offsetWidth;                    colsNum = ut.colsNum;                } else {                    var begin = ut.cellsRange.beginColIndex,                        end = ut.cellsRange.endColIndex,                        node;                    for (var i = begin; i <= end;) {                        node = ut.selectedTds[i];                        sumWidth += node.offsetWidth;                        i += node.colSpan;                        colsNum += 1;                    }                }                averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2;                return averageWidth;            }            function setAverageWidth(averageWidth) {                utils.each(domUtils.getElementsByTagName(ut.table, "th"), function (node) {                    node.setAttribute("width", "");                });                var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds;                utils.each(cells, function (node) {                    if (node.colSpan == 1) {                        node.setAttribute("width", averageWidth);                    }                });            }            if (ut && ut.selectedTds.length) {                setAverageWidth(getAverageWidth());            }        }    };    //平均分配各行    UE.commands['averagedistributerow'] = {        queryCommandState: function () {            var ut = getUETableBySelected(this);            if (!ut) return -1;            if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1;            return ut.isFullRow() || ut.isFullCol() ? 0 : -1;        },        execCommand: function (cmd) {            var me = this,                ut = getUETableBySelected(me);            function getAverageHeight() {                var averageHeight, rowNum, sumHeight = 0,                    tb = ut.table,                    tbAttr = getDefaultValue(me, tb),                    tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], "padding-top"));                if (ut.isFullCol()) {                    var captionArr = domUtils.getElementsByTagName(tb, "caption"),                        thArr = domUtils.getElementsByTagName(tb, "th"),                        captionHeight, thHeight;                    if (captionArr.length > 0) {                        captionHeight = captionArr[0].offsetHeight;                    }                    if (thArr.length > 0) {                        thHeight = thArr[0].offsetHeight;                    }                    sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0);                    rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1);                } else {                    var begin = ut.cellsRange.beginRowIndex,                        end = ut.cellsRange.endRowIndex,                        count = 0,                        trs = domUtils.getElementsByTagName(tb, "tr");                    for (var i = begin; i <= end; i++) {                        sumHeight += trs[i].offsetHeight;                        count += 1;                    }                    rowNum = count;                }                //ie8下是混杂模式                if (browser.ie && browser.version < 9) {                    averageHeight = Math.ceil(sumHeight / rowNum);                } else {                    averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2;                }                return averageHeight;            }            function setAverageHeight(averageHeight) {                var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds;                utils.each(cells, function (node) {                    if (node.rowSpan == 1) {                        node.setAttribute("height", averageHeight);                    }                });            }            if (ut && ut.selectedTds.length) {                setAverageHeight(getAverageHeight());            }        }    };    //单元格对齐方式    UE.commands['cellalignment'] = {        queryCommandState: function () {            return getTableItemsByRange(this).table ? 0 : -1        },        execCommand: function (cmd, data) {            var me = this,                ut = getUETableBySelected(me);            if (!ut) {                var start = me.selection.getStart(),                    cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true);                if (!/caption/ig.test(cell.tagName)) {                    domUtils.setAttributes(cell, data);                } else {                    cell.style.textAlign = data.align;                    cell.style.verticalAlign = data.vAlign;                }                me.selection.getRange().setCursor(true);            } else {                utils.each(ut.selectedTds, function (cell) {                    domUtils.setAttributes(cell, data);                });            }        },        /**         * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态         * @see UE.UETable.getTableCellAlignState         */        queryCommandValue: function (cmd) {            var activeMenuCell = getTableItemsByRange( this).cell;            if( !activeMenuCell ) {                activeMenuCell = getSelectedArr(this)[0];            }            if (!activeMenuCell) {                return null;            } else {                //获取同时选中的其他单元格                var cells = UE.UETable.getUETable(activeMenuCell).selectedTds;                !cells.length && ( cells = activeMenuCell );                return UE.UETable.getTableCellAlignState(cells);            }        }    };    //表格对齐方式    UE.commands['tablealignment'] = {        queryCommandState: function () {            if (browser.ie && browser.version < 8) {                return -1;            }            return getTableItemsByRange(this).table ? 0 : -1        },        execCommand: function (cmd, value) {            var me = this,                start = me.selection.getStart(),                table = start && domUtils.findParentByTagName(start, ["table"], true);            if (table) {                table.setAttribute("align",value);            }        }    };    //表格属性    UE.commands['edittable'] = {        queryCommandState: function () {            return getTableItemsByRange(this).table ? 0 : -1        },        execCommand: function (cmd, color) {            var rng = this.selection.getRange(),                table = domUtils.findParentByTagName(rng.startContainer, 'table');            if (table) {                var arr = domUtils.getElementsByTagName(table, "td").concat(                    domUtils.getElementsByTagName(table, "th"),                    domUtils.getElementsByTagName(table, "caption")                );                utils.each(arr, function (node) {                    node.style.borderColor = color;                });            }        }    };    //单元格属性    UE.commands['edittd'] = {        queryCommandState: function () {            return getTableItemsByRange(this).table ? 0 : -1        },        execCommand: function (cmd, bkColor) {            var me = this,                ut = getUETableBySelected(me);            if (!ut) {                var start = me.selection.getStart(),                    cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true);                if (cell) {                    cell.style.backgroundColor = bkColor;                }            } else {                utils.each(ut.selectedTds, function (cell) {                    cell.style.backgroundColor = bkColor;                });            }        }    };    UE.commands["settablebackground"] = {        queryCommandState: function () {            return getSelectedArr(this).length > 1 ? 0 : -1;        },        execCommand: function (cmd, value) {            var cells, ut;            cells = getSelectedArr(this);            ut = getUETable(cells[0]);            ut.setBackground(cells, value);        }    };    UE.commands["cleartablebackground"] = {        queryCommandState: function () {            var cells = getSelectedArr(this);            if (!cells.length)return -1;            for (var i = 0, cell; cell = cells[i++];) {                if (cell.style.backgroundColor !== "") return 0;            }            return -1;        },        execCommand: function () {            var cells = getSelectedArr(this),                ut = getUETable(cells[0]);            ut.removeBackground(cells);        }    };    UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = {        queryCommandState: function (cmd) {            var table = getTableItemsByRange(this).table;            if (!table) return -1;            var interlaced = table.getAttribute("interlaced");            if (cmd == "interlacetable") {                //TODO 待定                //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果                return (interlaced === "enabled") ? -1 : 0;            } else {                return (!interlaced || interlaced === "disabled") ? -1 : 0;            }        },        execCommand: function (cmd, classList) {            var table = getTableItemsByRange(this).table;            if (cmd == "interlacetable") {                table.setAttribute("interlaced", "enabled");                this.fireEvent("interlacetable", table, classList);            } else {                table.setAttribute("interlaced", "disabled");                this.fireEvent("uninterlacetable", table);            }        }    };    UE.commands["setbordervisible"] = {        queryCommandState: function (cmd) {            var table = getTableItemsByRange(this).table;            if (!table) return -1;            return 0;        },        execCommand: function () {            var table = getTableItemsByRange(this).table;            utils.each(domUtils.getElementsByTagName(table,'td'),function(td){                td.style.borderWidth = '1px';                td.style.borderStyle = 'solid';            })        }    };    function resetTdWidth(table, editor) {        var tds = domUtils.getElementsByTagName(table,'td th');        utils.each(tds, function (td) {            td.removeAttribute("width");        });        table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table)));        var tdsWidths = [];        setTimeout(function () {            utils.each(tds, function (td) {                (td.colSpan == 1) && tdsWidths.push(td.offsetWidth)            })            utils.each(tds, function (td,i) {                (td.colSpan == 1) && td.setAttribute("width", tdsWidths[i] + "");            })        }, 0);    }    function getTableWidth(editor, needIEHack, defaultValue) {        var body = editor.body;        return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0);    }    function getSelectedArr(editor) {        var cell = getTableItemsByRange(editor).cell;        if (cell) {            var ut = getUETable(cell);            return ut.selectedTds.length ? ut.selectedTds : [cell];        } else {            return [];        }    }})();
 |