Commit 940adb43 authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander.Trofimov

Переделано удаление внутри формул.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@58639 954022d7-b5bf-4e40-9824-e11837661b57
parent 4d4e6e60
...@@ -226,262 +226,145 @@ ParaMath.prototype.Add = function(Item) ...@@ -226,262 +226,145 @@ ParaMath.prototype.Add = function(Item)
ParaMath.prototype.Remove = function(Direction, bOnAddText) ParaMath.prototype.Remove = function(Direction, bOnAddText)
{ {
var oContent = this.GetSelectContent(); var oSelectedContent = this.GetSelectContent();
if (oContent.Start == oContent.End)
{
var oElem = oContent.Content.getElem(oContent.Start);
if (oElem.Type == para_Math_Composition) var nStartPos = oSelectedContent.Start;
this.RemoveElem(oContent, Direction, bOnAddText); var nEndPos = oSelectedContent.End;
else if (oElem.Type == para_Math_Run && oElem.IsPlaceholder() && bOnAddText == false) var oContent = oSelectedContent.Content;
{
var Comp = oContent.Content.GetParent();
Comp.SetSelectAll();
Comp.SelectToParent();
this.bSelectionUse = true;
}
else if (oElem.Type == para_Math_Run && oElem.IsPlaceholder() && bOnAddText == true)
{
var Items = [];
Items.push(oContent.Content.content[0]);
oContent.Content.content.splice( 0, 1 );
History.Add(oContent.Content, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: 0});
var oMRun = new ParaRun(this.Paragraph, true); if (nStartPos === nEndPos)
oMRun.StartLine = 0; oMRun.StartRange = 0;
oContent.Content.addElementToContent(oMRun);
var items = [];
items.push(oMRun);
var Pos = oContent.Content.CurPos,
PosEnd = Pos + 1;
History.Add(oContent.Content, {Type: historyitem_Math_AddItem, Items: items, Pos: Pos, PosEnd: PosEnd});
}
else //pararun
{ {
if (Direction < 0 && oElem.State.ContentPos - 1 < 0) //backspase var oElement = oContent.getElem(nStartPos);
// Если данный элемент - ран, удаляем внутри рана, если нет, тогда удаляем целиком элемент
if (para_Math_Run === oElement.Type)
{ {
if (oContent.Content.CurPos - 1 >= 0)//слева есть элементы if (false === oElement.Remove(Direction) && true !== this.bSelectionUse)
{ {
var prevElem = oContent.Content.getElem(oContent.Start - 1); if ((Direction > 0 && oContent.content.length - 1 === nStartPos) || (Direction < 0 && 0 === nStartPos))
if (prevElem.Type == para_Math_Composition) //слева композиция
{ {
this.Set_Select_ToMComp(Direction); // Проверяем находимся ли мы на верхнем уровне
oContent.Content.CurPos--; if (oContent.bRoot)
return; return false;
var oParent = oContent.GetParent();
oParent.SetSelectAll();
oParent.SelectToParent();
this.bSelectionUse = true;
return true;
} }
else //слева ран
if (Direction > 0)
{ {
if(prevElem.Content.length == 0 && !bOnAddText) var oNextElement = oContent.getElem(nStartPos + 1);
if (para_Math_Run === oNextElement.Type)
{ {
this.RemoveEmptyRun(prevElem); // Здесь мы не проверяем результат Remove, потому что ран не должен быть пустым после
this.Remove( Direction, bOnAddText ); // Correct_Content
return; oNextElement.Cursor_MoveToStartPos();
} oNextElement.Remove(1);
prevElem.State.ContentPos = prevElem.Content.length;
prevElem.Remove(Direction, bOnAddText);
if(prevElem.Content.length == 0 && !bOnAddText) //тк pararun пустой, удаляем его if (oNextElement.Is_Empty())
this.RemoveEmptyRun(prevElem);
return;
}
}
else if (!oElem.Selection.Use)//переходим на уровень выше и выделяем композицию
{ {
if (oContent.Content.bRoot) //мы находмися на выходе из формулы oContent.Correct_Content();
return false; oContent.Correct_ContentPos(1);
var Comp = oContent.Content.GetParent();
Comp.SetSelectAll();
Comp.SelectToParent();
this.bSelectionUse = true;
} }
this.Selection_Remove();
} }
else if (Direction > 0 && oElem.State.ContentPos + 1 > oElem.Content.length) //delete else
{
if (oContent.Content.CurPos + 1 >= oContent.Content.content.length && !oElem.Selection.Use) //переходим на уровень выше и выделяем композицию
{ {
if (oContent.Content.bRoot) //мы находмися на выходе из формулы oContent.SelectElement(nStartPos + 1);
return false; oContent.SelectToParent();
var Comp = oContent.Content.GetParent();
Comp.SetSelectAll();
Comp.SelectToParent();
this.bSelectionUse = true; this.bSelectionUse = true;
} }
else if (!oElem.Selection.Use)//справа есть элемент
{
var nNextElem = oContent.Start + 1;
var nextElem = oContent.Content.getElem(nNextElem);
if (nextElem.Type == para_Math_Composition) //справа композиция
{
this.Set_Select_ToMComp(Direction);
oContent.Content.CurPos++;
return;
} }
else //справа ран else //if (Direction < 0)
{ {
nextElem.State.ContentPos = 0; var oPrevElement = oContent.getElem(nStartPos - 1);
nextElem.Remove(Direction, bOnAddText); if (para_Math_Run === oPrevElement.Type)
if(nextElem.Content.length == 0 && !bOnAddText) //тк pararun пустой, удаляем его
{ {
var Items = []; // Здесь мы не проверяем результат Remove, потому что ран не должен быть пустым после
Items.push(nextElem); // Correct_Content
nextElem.Parent.content.splice( nNextElem, 1 ); oPrevElement.Cursor_MoveToEndPos();
History.Add(nextElem.Parent, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: 0}); oPrevElement.Remove(-1);
}
return;
}
}
}
oElem.Remove(Direction, bOnAddText);
if (oElem.Content.length == 0 && oContent.Start == oContent.Content.content.length - 1 && if (oPrevElement.Is_Empty())
oContent.Start >0 && oContent.Content.content[oContent.Start-1].Type == para_Math_Composition) //тк это крайний правый пустой ран и слева композиция, он остается.
return;
else if( oElem.Content.length == 0 && !bOnAddText) //тк pararun пустой, удаляем его
{ {
var Items = []; oContent.Correct_Content();
Items.push(oElem.Parent.content[oContent.Start]); oContent.Correct_ContentPos(-1);
oElem.Parent.content.splice( oContent.Start, 1 );
History.Add(oElem.Parent, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: oContent.Start});
this.PosTransitLeft(oContent.Content);
oContent.Content.SetRunEmptyToContent(true);
}
} }
this.Selection_Remove();
} }
else else
return this.RemoveElem(oContent, Direction, bOnAddText);
},
ParaMath.prototype.RemoveElem = function(oContent, Direction, bOnAdd)
{
var oMath = oContent.Content;
var oMathContent = oMath.content;
var start = oMath.Selection.Start,
end = oMath.Selection.End;
var bRightSelect = true;
if(start > end)
{ {
bRightSelect = false; oContent.SelectElement(nStartPos - 1);
start = oMath.Selection.End; oContent.SelectToParent();
end = oMath.Selection.Start; this.bSelectionUse = true;
} }
var oStartContent = oMathContent[start];
if ( para_Math_Run == oStartContent.Type)
if (oStartContent.Selection.StartPos == oStartContent.Selection.EndPos == oStartContent.Content.length)
start++;//у левого рана буквы не заселекчены, но в селект он попал, так что его удалять не надо
var oEndContent = oMathContent[end];
if ( para_Math_Run == oEndContent.Type && !bRightSelect)
if (oEndContent.Selection.StartPos == oEndContent.Selection.EndPos && oEndContent.Selection.EndPos == oEndContent.Content.length)
end--;//у правого рана буквы не заселекчены, но в селект он попал, так что его удалять не надо
var nStartContent = start;
var nEndContent = end;
var Items = [];
var oElem = oMathContent[start];
if ( para_Math_Run == oElem.Type && oElem.Selection.Use)
{
if (oElem.Selection.EndPos - oElem.Selection.StartPos != oElem.Content.length)
{
oElem.Remove(Direction,false);
start++;
if (!bRightSelect)
oMath.CurPos++;
} }
else
nStartContent--;
} }
else else
{ {
Items.push(oElem); if (oElement.Is_Empty())
History.Add(oMath, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: start}); {
oContent.CurPos = nStartPos;
oContent.Correct_Content();
oContent.Correct_ContentPos(-1); // -1, потому что нам надо встать перед элементом, а не после
} }
if ( start != end) this.Selection_Remove();
{
Items = [];
for (var i=nStartContent+1; i<nEndContent; i++)
{
oElem = oMathContent[i];
Items.push(oElem);
} }
if (Items.length > 0)
History.Add(oMath, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: nStartContent+1});
Items = []; return true;
var oElem = oMathContent[end];
if ( para_Math_Run == oElem.Type && oElem.Selection.Use)
{
if (oElem.Selection.EndPos - oElem.Selection.StartPos != oElem.Content.length)
{
oElem.Remove(Direction,false);
end--;
if (bRightSelect)
this.PosTransitLeft(oMath);
} }
else else
nEndContent++; {
oContent.Remove_FromContent(nStartPos, 1);
oContent.CurPos = nStartPos;
oContent.Correct_Content();
oContent.Correct_ContentPos(-1); // -1, потому что нам надо встать перед элементом, а не после
this.Selection_Remove();
}
} }
else else
{ {
Items.push(oElem); if (nStartPos > nEndPos)
History.Add(oMath, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: end}); {
} var nTemp = nEndPos;
nEndPos = nStartPos;
nStartPos = nTemp;
} }
var len = end - start + 1; // Проверяем начальный и конечный элементы
oMathContent.splice( start, len ); var oStartElement = oContent.getElem(nStartPos);
var oEndElement = oContent.getElem(nEndPos);
if (bRightSelect)
oMath.CurPos = oMath.CurPos - len + 1;
oContent.Content.SetRunEmptyToContent(true); // Если последний элемент - ран, удаляем внутри, если нет, тогда удаляем целиком элемент
//добавляем пустой ран на месте удаленных элементов, и ставим на него селект if (para_Math_Run === oEndElement.Type)
var oMRun = new ParaRun(this.Paragraph, true); oEndElement.Remove(Direction);
//oMRun.Pr = oStartContent.Pr; else
var items = []; oContent.Remove_FromContent(nEndPos, 1);
oMathContent.splice(oMath.CurPos, 0, oMRun);
items.push(oMRun);
var Pos = oMath.CurPos,
PosEnd = Pos + 1;
History.Add(oContent.Content, {Type: historyitem_Math_AddItem, Items: items, Pos: Pos, PosEnd: PosEnd});
// Удаляем все промежуточные элементы
oContent.Remove_FromContent(nStartPos + 1, nEndPos - nStartPos - 1);
if (oMath.CurPos < 0) // Если первый элемент - ран, удаляем внутри рана, если нет, тогда удаляем целиком элемент
oMath.CurPos = 0; if (para_Math_Run === oStartElement.Type)
oStartElement.Remove(Direction);
else
oContent.Remove_FromContent(nStartPos, 1);
oContent.CurPos = nStartPos;
oContent.Correct_Content();
oContent.Correct_ContentPos(Direction);
this.Selection_Remove(); this.Selection_Remove();
return;
};
ParaMath.prototype.RemoveEmptyRun = function(oElem)
{
var Items = [];
Items.push(oElem.Parent.content[oElem.Parent.CurPos]);
oElem.Parent.content.splice( oElem.Parent.CurPos, 1 );
History.Add(oElem.Parent, {Type: historyitem_Math_RemoveItem, Items:Items, Pos: oElem.Parent.CurPos});
this.PosTransitLeft(oElem.Parent)
}
ParaMath.prototype.PosTransitLeft = function(oElem)
{
var oPreElem;
if (oElem.CurPos > 0)
{
oElem.CurPos--;
oPreElem = oElem.content[oElem.CurPos];
if (oPreElem.Type == para_Math_Run)
oPreElem.State.ContentPos = oPreElem.Content.length;
} }
};
}
ParaMath.prototype.GetSelectContent = function() ParaMath.prototype.GetSelectContent = function()
{ {
......
...@@ -4503,6 +4503,20 @@ CMathContent.prototype = ...@@ -4503,6 +4503,20 @@ CMathContent.prototype =
this.content[this.Selection.End].Select_All(); this.content[this.Selection.End].Select_All();
}, },
SelectElement : function(nPos)
{
this.Selection.Start = nPos;
this.Selection.End = nPos;
this.Selection.Use = true;
if(para_Math_Run === this.content[this.Selection.Start].Type)
this.content[this.Selection.Start].Select_All();
else
this.content[this.Selection.Start].SetSelectAll();
},
Is_SelectedAll: function(Props) Is_SelectedAll: function(Props)
{ {
var bFirst = false, bEnd = false; var bFirst = false, bEnd = false;
...@@ -4768,6 +4782,62 @@ CMathContent.prototype = ...@@ -4768,6 +4782,62 @@ CMathContent.prototype =
}, },
Correct_Content : function()
{
this.SetRunEmptyToContent(true);
// Удаляем лишние пустые раны
for (var nPos = 0, nLen = this.content.length; nPos < nLen - 1; nPos++)
{
var oCurrElement = this.content[nPos];
var oNextElement = this.content[nPos + 1];
if (para_Math_Run === oCurrElement.Type && para_Math_Run === oNextElement.Type)
{
if (oCurrElement.Is_Empty())
{
this.Remove_FromContent(nPos);
nPos--;
nLen--;
}
else if (oNextElement.Is_Empty())
{
this.Remove_FromContent(nPos + 1);
nPos--;
nLen--;
}
}
}
},
Correct_ContentPos : function(nDirection)
{
var nCurPos = this.CurPos;
if (nCurPos < 0)
{
this.CurPos = 0;
this.content[0].Cursor_MoveToStartPos();
}
else if (nCurPos > this.content.length - 1)
{
this.CurPos = this.content.length - 1;
this.content[this.CurPos].Cursor_MoveToEndPos();
}
else if (para_Math_Run !== this.content[nCurPos].Type)
{
if (nDirection > 0)
{
this.CurPos = nCurPos + 1;
this.content[this.CurPos].Cursor_MoveToStartPos();
}
else
{
this.CurPos = nCurPos - 1;
this.content[this.CurPos].Cursor_MoveToEndPos();
}
}
},
Create_FontMap : function(Map) Create_FontMap : function(Map)
{ {
for (var index = 0; index < this.content.length; index++) for (var index = 0; index < this.content.length; index++)
...@@ -5222,6 +5292,12 @@ CMathContent.prototype = ...@@ -5222,6 +5292,12 @@ CMathContent.prototype =
this.Selection.End++; this.Selection.End++;
}, },
Add_ToContent : function(Pos, Item)
{
this.Internal_Content_Add(Pos, Item);
},
Remove_FromContent : function(Pos, Count) Remove_FromContent : function(Pos, Count)
{ {
var DeletedItems = this.content.splice(Pos, Count); var DeletedItems = this.content.splice(Pos, Count);
...@@ -5255,6 +5331,7 @@ CMathContent.prototype = ...@@ -5255,6 +5331,7 @@ CMathContent.prototype =
} }
}, },
Get_Default_TPrp: function() Get_Default_TPrp: function()
{ {
return this.ParaMath.Get_Default_TPrp(); return this.ParaMath.Get_Default_TPrp();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment