📄 fckplugin.js
字号:
var FCKDragTableHandler =
{
"_DragState" : 0,
"_LeftCell" : null,
"_RightCell" : null,
"_MouseMoveMode" : 0, // 0 - find candidate cells for resizing, 1 - drag to resize
"_ResizeBar" : null,
"_OriginalX" : null,
"_MinimumX" : null,
"_MaximumX" : null,
"_LastX" : null,
"_TableMap" : null,
"_doc" : document,
"_IsInsideNode" : function( w, domNode, pos )
{
var myCoords = FCKTools.GetWindowPosition( w, domNode ) ;
var xMin = myCoords.x ;
var yMin = myCoords.y ;
var xMax = parseInt( xMin, 10 ) + parseInt( domNode.offsetWidth, 10 ) ;
var yMax = parseInt( yMin, 10 ) + parseInt( domNode.offsetHeight, 10 ) ;
if ( pos.x >= xMin && pos.x <= xMax && pos.y >= yMin && pos.y <= yMax )
return true;
return false;
},
"_GetBorderCells" : function( w, tableNode, tableMap, mouse )
{
// Enumerate all the cells in the table.
var cells = [] ;
for ( var i = 0 ; i < tableNode.rows.length ; i++ )
{
var r = tableNode.rows[i] ;
for ( var j = 0 ; j < r.cells.length ; j++ )
cells.push( r.cells[j] ) ;
}
if ( cells.length < 1 )
return null ;
// Get the cells whose right or left border is nearest to the mouse cursor's x coordinate.
var minRxDist = null ;
var lxDist = null ;
var minYDist = null ;
var rbCell = null ;
var lbCell = null ;
for ( var i = 0 ; i < cells.length ; i++ )
{
var pos = FCKTools.GetWindowPosition( w, cells[i] ) ;
var rightX = pos.x + parseInt( cells[i].clientWidth, 10 ) ;
var rxDist = mouse.x - rightX ;
var yDist = mouse.y - ( pos.y + ( cells[i].clientHeight / 2 ) ) ;
if ( minRxDist == null ||
( Math.abs( rxDist ) <= Math.abs( minRxDist ) &&
( minYDist == null || Math.abs( yDist ) <= Math.abs( minYDist ) ) ) )
{
minRxDist = rxDist ;
minYDist = yDist ;
rbCell = cells[i] ;
}
}
/*
var rowNode = FCKTools.GetElementAscensor( rbCell, "tr" ) ;
var cellIndex = rbCell.cellIndex + 1 ;
if ( cellIndex >= rowNode.cells.length )
return null ;
lbCell = rowNode.cells.item( cellIndex ) ;
*/
var rowIdx = rbCell.parentNode.rowIndex ;
var colIdx = FCKTableHandler._GetCellIndexSpan( tableMap, rowIdx, rbCell ) ;
var colSpan = isNaN( rbCell.colSpan ) ? 1 : rbCell.colSpan ;
lbCell = tableMap[rowIdx][colIdx + colSpan] ;
if ( ! lbCell )
return null ;
// Abort if too far from the border.
lxDist = mouse.x - FCKTools.GetWindowPosition( w, lbCell ).x ;
if ( lxDist < 0 && minRxDist < 0 && minRxDist < -2 )
return null ;
if ( lxDist > 0 && minRxDist > 0 && lxDist > 3 )
return null ;
return { "leftCell" : rbCell, "rightCell" : lbCell } ;
},
"_GetResizeBarPosition" : function()
{
var row = FCKTools.GetElementAscensor( this._RightCell, "tr" ) ;
return FCKTableHandler._GetCellIndexSpan( this._TableMap, row.rowIndex, this._RightCell ) ;
},
"_ResizeBarMouseDownListener" : function( evt )
{
if ( FCKDragTableHandler._LeftCell )
FCKDragTableHandler._MouseMoveMode = 1 ;
if ( FCKBrowserInfo.IsIE )
FCKDragTableHandler._ResizeBar.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 50 ;
else
FCKDragTableHandler._ResizeBar.style.opacity = 0.5 ;
FCKDragTableHandler._OriginalX = evt.clientX ;
// Calculate maximum and minimum x-coordinate delta.
var borderIndex = FCKDragTableHandler._GetResizeBarPosition() ;
var offset = FCKDragTableHandler._GetIframeOffset();
var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" );
var minX = null ;
var maxX = null ;
for ( var r = 0 ; r < FCKDragTableHandler._TableMap.length ; r++ )
{
var leftCell = FCKDragTableHandler._TableMap[r][borderIndex - 1] ;
var rightCell = FCKDragTableHandler._TableMap[r][borderIndex] ;
var leftPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, leftCell ) ;
var rightPosition = FCKTools.GetWindowPosition( FCK.EditorWindow, rightCell ) ;
var leftPadding = FCKDragTableHandler._GetCellPadding( table, leftCell ) ;
var rightPadding = FCKDragTableHandler._GetCellPadding( table, rightCell ) ;
if ( minX == null || leftPosition.x + leftPadding > minX )
minX = leftPosition.x + leftPadding ;
if ( maxX == null || rightPosition.x + rightCell.clientWidth - rightPadding < maxX )
maxX = rightPosition.x + rightCell.clientWidth - rightPadding ;
}
FCKDragTableHandler._MinimumX = minX + offset.x ;
FCKDragTableHandler._MaximumX = maxX + offset.x ;
FCKDragTableHandler._LastX = null ;
if (evt.preventDefault)
evt.preventDefault();
else
evt.returnValue = false;
},
"_ResizeBarMouseUpListener" : function( evt )
{
FCKDragTableHandler._MouseMoveMode = 0 ;
FCKDragTableHandler._HideResizeBar() ;
if ( FCKDragTableHandler._LastX == null )
return ;
// Calculate the delta value.
var deltaX = FCKDragTableHandler._LastX - FCKDragTableHandler._OriginalX ;
// Then, build an array of current column width values.
// This algorithm can be very slow if the cells have insane colSpan values. (e.g. colSpan=1000).
var table = FCKTools.GetElementAscensor( FCKDragTableHandler._LeftCell, "table" ) ;
var colArray = [] ;
var tableMap = FCKDragTableHandler._TableMap ;
for ( var i = 0 ; i < tableMap.length ; i++ )
{
for ( var j = 0 ; j < tableMap[i].length ; j++ )
{
var cell = tableMap[i][j] ;
var width = FCKDragTableHandler._GetCellWidth( table, cell ) ;
var colSpan = isNaN( cell.colSpan) ? 1 : cell.colSpan ;
if ( colArray.length <= j )
colArray.push( { width : width / colSpan, colSpan : colSpan } ) ;
else
{
var guessItem = colArray[j] ;
if ( guessItem.colSpan > colSpan )
{
guessItem.width = width / colSpan ;
guessItem.colSpan = colSpan ;
}
}
}
}
// Find out the equivalent column index of the two cells selected for resizing.
colIndex = FCKDragTableHandler._GetResizeBarPosition() ;
// Note that colIndex must be at least 1 here, so it's safe to subtract 1 from it.
colIndex-- ;
// Modify the widths in the colArray according to the mouse coordinate delta value.
colArray[colIndex].width += deltaX ;
colArray[colIndex + 1].width -= deltaX ;
// Clear all cell widths, delete all <col> elements from the table.
for ( var r = 0 ; r < table.rows.length ; r++ )
{
var row = table.rows.item( r ) ;
for ( var c = 0 ; c < row.cells.length ; c++ )
{
var cell = row.cells.item( c ) ;
cell.width = "" ;
cell.style.width = "" ;
}
}
var colElements = table.getElementsByTagName( "col" ) ;
for ( var i = colElements.length - 1 ; i >= 0 ; i-- )
colElements[i].parentNode.removeChild( colElements[i] ) ;
// Set new cell widths.
var processedCells = [] ;
for ( var i = 0 ; i < tableMap.length ; i++ )
{
for ( var j = 0 ; j < tableMap[i].length ; j++ )
{
var cell = tableMap[i][j] ;
if ( cell._Processed )
continue ;
if ( tableMap[i][j-1] != cell )
cell.width = colArray[j].width ;
else
cell.width = parseInt( cell.width, 10 ) + parseInt( colArray[j].width, 10 ) ;
if ( tableMap[i][j+1] != cell )
{
processedCells.push( cell ) ;
cell._Processed = true ;
}
}
}
for ( var i = 0 ; i < processedCells.length ; i++ )
{
if ( FCKBrowserInfo.IsIE )
processedCells[i].removeAttribute( '_Processed' ) ;
else
delete processedCells[i]._Processed ;
}
FCKDragTableHandler._LastX = null ;
},
"_ResizeBarMouseMoveListener" : function( evt )
{
if ( FCKDragTableHandler._MouseMoveMode == 0 )
return FCKDragTableHandler._MouseFindHandler( FCK, evt ) ;
else
return FCKDragTableHandler._MouseDragHandler( FCK, evt ) ;
},
// Calculate the padding of a table cell.
// It returns the value of paddingLeft + paddingRight of a table cell.
// This function is used, in part, to calculate the width parameter that should be used for setting cell widths.
// The equation in question is clientWidth = paddingLeft + paddingRight + width.
// So that width = clientWidth - paddingLeft - paddingRight.
// The return value of this function must be pixel accurate acorss all supported browsers, so be careful if you need to modify it.
"_GetCellPadding" : function( table, cell )
{
var attrGuess = parseInt( table.cellPadding, 10 ) * 2 ;
var cssGuess = null ;
if ( typeof( window.getComputedStyle ) == "function" )
{
var styleObj = window.getComputedStyle( cell, null ) ;
cssGuess = parseInt( styleObj.getPropertyValue( "padding-left" ), 10 ) +
parseInt( styleObj.getPropertyValue( "padding-right" ), 10 ) ;
}
else
cssGuess = parseInt( cell.currentStyle.paddingLeft, 10 ) + parseInt (cell.currentStyle.paddingRight, 10 ) ;
var cssRuntime = cell.style.padding ;
if ( isFinite( cssRuntime ) )
cssGuess = parseInt( cssRuntime, 10 ) * 2 ;
else
{
cssRuntime = cell.style.paddingLeft ;
if ( isFinite( cssRuntime ) )
cssGuess = parseInt( cssRuntime, 10 ) ;
cssRuntime = cell.style.paddingRight ;
if ( isFinite( cssRuntime ) )
cssGuess += parseInt( cssRuntime, 10 ) ;
}
attrGuess = parseInt( attrGuess, 10 ) ;
cssGuess = parseInt( cssGuess, 10 ) ;
if ( isNaN( attrGuess ) )
attrGuess = 0 ;
if ( isNaN( cssGuess ) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -