Commit 3b069ea7 authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander.Trofimov

Сделано, чтобы можно было копировать из формулы в формулу (баг 27034)....

Сделано, чтобы можно было копировать из формулы в формулу (баг 27034). Сделано, чтобы при drag-n-drop формулы параграфы лочились (баг 27221).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@59355 954022d7-b5bf-4e40-9824-e11837661b57
parent ab009bea
......@@ -8576,72 +8576,14 @@ CDocument.prototype =
var DocContent = this.Get_SelectedContent();
var Para = NearPos.Paragraph;
// Автофигуры не вставляем в другие автофигуры
if ( true === Para.Parent.Is_DrawingShape() && true === DocContent.HaveShape )
{
History.Remove_LastPoint();
return;
}
// В формулу вставляем только формулу
var ParaNearPos = NearPos.Paragraph.Get_ParaNearestPos(NearPos);
if (null === ParaNearPos || ParaNearPos.Classes.length < 2)
{
History.Remove_LastPoint();
return;
}
var LastClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 1];
if (para_Math_Run === LastClass.Type)
{
// Проверяем, что вставляемый контент тоже формула
var Element = DocContent.Elements[0].Element;
var MathRun = LastClass;
if (1 !== DocContent.Elements.length || type_Paragraph !== Element.Get_Type() || 2 !== Element.Content.length || para_Math !== Element.Content[0].Type || null === MathRun.Parent)
{
if (false === this.Can_InsertContent(DocContent, NearPos))
History.Remove_LastPoint();
return;
}
// Если надо удаляем выделенную часть (пересчет отключаем на время удаления)
if ( true !== bCopy )
{
this.TurnOff_Recalculate();
this.TurnOff_InterfaceEvents();
this.Remove(1, false, false, false);
this.TurnOn_Recalculate(false);
this.TurnOn_InterfaceEvents(false);
}
this.Selection_Remove();
var NewMathRun = MathRun.Split(ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1);
var MathContent = ParaNearPos.Classes[ParaNearPos.Classes.length - 2];
var MathContentPos = ParaNearPos.NearPos.ContentPos.Data[ParaNearPos.Classes.length - 2];
MathContent.Add_ToContent(MathContentPos + 1, NewMathRun);
MathContent.Insert_MathContent(Element.Content[0].Root, MathContentPos + 1, true);
this.Recalculate();
this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
return;
}
else if (para_Run !== LastClass.Type)
{
History.Remove_LastPoint();
return;
}
var Para = NearPos.Paragraph;
// Если мы копируем, тогда не надо проверять выделенные параграфы, а если переносим, тогда проверяем
var CheckChangesType = (true !== bCopy ? changestype_Document_Content : changestype_None);
if ( false === this.Document_Is_SelectionLocked( CheckChangesType, { Type : changestype_2_ElementsArray_and_Type, Elements : [Para], CheckType : changestype_Paragraph_Content } ) )
if (false === this.Document_Is_SelectionLocked(CheckChangesType, {Type : changestype_2_ElementsArray_and_Type, Elements : [Para], CheckType : changestype_Paragraph_Content}))
{
// Если надо удаляем выделенную часть (пересчет отключаем на время удаления)
if ( true !== bCopy )
......@@ -8656,8 +8598,6 @@ CDocument.prototype =
this.Selection_Remove();
// Выделение выставляется внутри функции Insert_Content
if ( undefined != Para.Parent )
{
Para.Parent.Insert_Content( DocContent, NearPos );
this.Recalculate();
......@@ -8666,7 +8606,6 @@ CDocument.prototype =
this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
}
}
else
History.Remove_LastPoint();
}
......@@ -8705,73 +8644,123 @@ CDocument.prototype =
return SelectedContent;
},
Insert_Content : function(SelectedContent, NearPos)
Can_InsertContent : function(SelectedContent, NearPos)
{
var NearContentPos = NearPos.ContentPos;
// Проверяем, что вставка не пустая
if (SelectedContent.Elements.length <= 0)
return false;
var Elements = SelectedContent.Elements;
var Para = NearPos.Paragraph;
var ElementsCount = Elements.length;
if ( ElementsCount <= 0 )
return;
// Автофигуры не вставляем в другие автофигуры
if (true === Para.Parent.Is_DrawingShape() && true === SelectedContent.HaveShape)
return false;
// Проверяем корректность места, куда вставляем
var ParaNearPos = NearPos.Paragraph.Get_ParaNearestPos(NearPos);
if (null === ParaNearPos || ParaNearPos.Classes.length < 2)
return false;
var LastClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 1];
if (para_Math_Run === LastClass.Type)
{
// Проверяем, что вставляемый контент тоже формула
var Element = SelectedContent.Elements[0].Element;
if (1 !== SelectedContent.Elements.length || type_Paragraph !== Element.Get_Type() || 2 !== Element.Content.length || para_Math !== Element.Content[0].Type || null === LastClass.Parent)
return false;
}
else if (para_Run !== LastClass.Type)
return false;
if (null === Para.Parent || undefined === Para.Parent)
return false;
return true;
},
Insert_Content : function(SelectedContent, NearPos)
{
var Para = NearPos.Paragraph;
var ParaNearPos = Para.Get_ParaNearestPos(NearPos);
var LastClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 1];
if (para_Math_Run === LastClass.Type)
{
var MathRun = LastClass;
var NewMathRun = MathRun.Split(ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1);
var MathContent = ParaNearPos.Classes[ParaNearPos.Classes.length - 2];
var MathContentPos = ParaNearPos.NearPos.ContentPos.Data[ParaNearPos.Classes.length - 2];
var Element = SelectedContent.Elements[0].Element;
var InsertMathContent = null;
for (var nPos = 0, nParaLen = Element.Content.length; nPos < nParaLen; nPos++)
{
if (para_Math === Element.Content[nPos].Type)
{
InsertMathContent = Element.Content[nPos];
break;
}
}
if (null !== InsertMathContent)
{
MathContent.Add_ToContent(MathContentPos + 1, NewMathRun);
MathContent.Insert_MathContent(InsertMathContent.Root, MathContentPos + 1, true);
}
}
else if (para_Run === LastClass.Type)
{
var NearContentPos = NearPos.ContentPos;
// Сначала найдем номер элемента, начиная с которого мы будем производить вставку
var DstIndex = -1;
var Count = this.Content.length;
for ( var Index = 0; Index < Count; Index++ )
for (var Index = 0; Index < Count; Index++)
{
if ( this.Content[Index] === Para )
if (this.Content[Index] === Para)
{
DstIndex = Index;
break;
}
}
if ( -1 === DstIndex )
return;
if (-1 === DstIndex)
return false;
var Elements = SelectedContent.Elements;
var ElementsCount = Elements.length;
var FirstElement = SelectedContent.Elements[0];
if ( 1 === ElementsCount && true !== FirstElement.SelectedAll && type_Paragraph === FirstElement.Element.GetType() && true !== FirstElement.Element.Is_Empty() )
if (1 === ElementsCount && true !== FirstElement.SelectedAll && type_Paragraph === FirstElement.Element.GetType() && true !== FirstElement.Element.Is_Empty())
{
// Нам нужно в заданный параграф вставить выделенный текст
var NewPara = FirstElement.Element;
var NewElementsCount = NewPara.Content.length - 1; // Последний ран с para_End не добавляем
var ParaNearPos = Para.Get_ParaNearestPos( NearPos );
if ( null === ParaNearPos || ParaNearPos.Classes.length < 2 )
return;
var LastClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 1];
if ( para_Run !== LastClass.Type )
return;
var NewElement = LastClass.Split( ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1 );
var NewElement = LastClass.Split(ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1);
var PrevClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 2];
var PrevPos = ParaNearPos.NearPos.ContentPos.Data[ParaNearPos.Classes.length - 2];
PrevClass.Add_ToContent( PrevPos + 1, NewElement );
PrevClass.Add_ToContent(PrevPos + 1, NewElement);
// TODO: Заглушка для переноса автофигур и картинок. Когда разрулим ситуацию так, чтобы когда у нас
// в текста была выделена автофигура выделение шло для автофигур, тогда здесь можно будет убрать.
var bNeedSelect = (true === SelectedContent.MoveDrawing ? false : true);
for ( var Index = 0; Index < NewElementsCount; Index++ )
for (var Index = 0; Index < NewElementsCount; Index++)
{
var Item = NewPara.Content[Index];
PrevClass.Add_ToContent( PrevPos + 1 + Index, Item );
PrevClass.Add_ToContent(PrevPos + 1 + Index, Item);
if ( true === bNeedSelect )
if (true === bNeedSelect)
Item.Select_All();
}
if ( true === bNeedSelect )
if (true === bNeedSelect)
{
PrevClass.Selection.Use = true;
PrevClass.Selection.StartPos = PrevPos + 1;
PrevClass.Selection.EndPos = PrevPos + 1 + NewElementsCount - 1;
for ( var Index = 0; Index < ParaNearPos.Classes.length - 2; Index++ )
for (var Index = 0; Index < ParaNearPos.Classes.length - 2; Index++)
{
var Class = ParaNearPos.Classes[Index];
var ClassPos = ParaNearPos.NearPos.ContentPos.Data[Index];
......@@ -8786,7 +8775,7 @@ CDocument.prototype =
this.Selection.EndPos = DstIndex;
}
if ( PrevClass.Correct_Content )
if (PrevClass.Correct_Content)
{
PrevClass.Correct_Content();
}
......@@ -8801,14 +8790,14 @@ CDocument.prototype =
// Нам надо разделить наш параграф в заданной позиции, если позиция в
// начале или конце параграфа, тогда делить не надо
Para.Cursor_MoveToNearPos( NearPos );
Para.Cursor_MoveToNearPos(NearPos);
Para.Selection_Remove();
if ( true === Para.Cursor_IsEnd() )
if (true === Para.Cursor_IsEnd())
{
bConcatE = false;
if ( 1 === ElementsCount && type_Paragraph === FirstElement.Element.GetType() && ( true === FirstElement.Element.Is_Empty() || true == FirstElement.SelectedAll ) )
if (1 === ElementsCount && type_Paragraph === FirstElement.Element.GetType() && ( true === FirstElement.Element.Is_Empty() || true == FirstElement.SelectedAll ))
{
bConcatS = false;
......@@ -8816,27 +8805,27 @@ CDocument.prototype =
DstIndex++;
}
}
else if ( true === Para.Cursor_IsStart() )
else if (true === Para.Cursor_IsStart())
{
bConcatS = false;
}
else
{
// Создаем новый параграф
var NewParagraph = new Paragraph( this.DrawingDocument, this, 0, 0, 0, 0, 0 );
Para.Split( NewParagraph );
this.Internal_Content_Add( DstIndex + 1, NewParagraph );
var NewParagraph = new Paragraph(this.DrawingDocument, this, 0, 0, 0, 0, 0);
Para.Split(NewParagraph);
this.Internal_Content_Add(DstIndex + 1, NewParagraph);
ParaE = NewParagraph;
ParaEIndex = DstIndex + 1;
}
var StartIndex = 0;
if ( true === bConcatS )
if (true === bConcatS)
{
// Если мы присоединяем новый параграф, то и копируем все настройки параграфа (так делает Word)
ParaS.Concat( Elements[0].Element );
ParaS.Set_Pr( Elements[0].Element.Pr );
ParaS.Concat(Elements[0].Element);
ParaS.Set_Pr(Elements[0].Element.Pr);
StartIndex++;
......@@ -8851,7 +8840,7 @@ CDocument.prototype =
}
var EndIndex = ElementsCount - 1;
if ( true === bConcatE && StartIndex < EndIndex )
if (true === bConcatE && StartIndex < EndIndex)
{
var _ParaE = Elements[ElementsCount - 1].Element;
......@@ -8859,11 +8848,11 @@ CDocument.prototype =
_ParaE.Select_All();
_ParaE.Concat( ParaE );
_ParaE.Set_Pr( ParaE.Pr );
_ParaE.Concat(ParaE);
_ParaE.Set_Pr(ParaE.Pr);
this.Internal_Content_Add( ParaEIndex, _ParaE );
this.Internal_Content_Remove( ParaEIndex + 1, 1 );
this.Internal_Content_Add(ParaEIndex, _ParaE);
this.Internal_Content_Remove(ParaEIndex + 1, 1);
_ParaE.Selection.Use = true;
_ParaE.Selection.StartPos = 0;
......@@ -8873,9 +8862,9 @@ CDocument.prototype =
}
for ( var Index = StartIndex; Index <= EndIndex; Index++ )
for (var Index = StartIndex; Index <= EndIndex; Index++)
{
this.Internal_Content_Add( DstIndex + Index, Elements[Index].Element );
this.Internal_Content_Add(DstIndex + Index, Elements[Index].Element);
this.Content[DstIndex + Index].Select_All();
}
......@@ -8884,8 +8873,9 @@ CDocument.prototype =
this.Selection.EndPos = DstIndex + ElementsCount - 1;
}
if ( docpostype_DrawingObjects !== this.CurPos.Type )
if (docpostype_DrawingObjects !== this.CurPos.Type)
this.CurPos.Type = docpostype_Content;
}
},
Document_SelectNumbering : function(NumPr)
......
......@@ -3918,74 +3918,90 @@ CDocumentContent.prototype =
Insert_Content : function(SelectedContent, NearPos)
{
var NearContentPos = NearPos.ContentPos;
var Para = NearPos.Paragraph;
var ParaNearPos = Para.Get_ParaNearestPos(NearPos);
var LastClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 1];
if (para_Math_Run === LastClass.Type)
{
var MathRun = LastClass;
var NewMathRun = MathRun.Split(ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1);
var MathContent = ParaNearPos.Classes[ParaNearPos.Classes.length - 2];
var MathContentPos = ParaNearPos.NearPos.ContentPos.Data[ParaNearPos.Classes.length - 2];
var Element = SelectedContent.Elements[0].Element;
var Elements = SelectedContent.Elements;
var InsertMathContent = null;
for (var nPos = 0, nParaLen = Element.Content.length; nPos < nParaLen; nPos++)
{
if (para_Math === Element.Content[nPos].Type)
{
InsertMathContent = Element.Content[nPos];
break;
}
}
var ElementsCount = Elements.length;
if ( ElementsCount <= 0 )
return;
if (null !== InsertMathContent)
{
MathContent.Add_ToContent(MathContentPos + 1, NewMathRun);
MathContent.Insert_MathContent(InsertMathContent.Root, MathContentPos + 1, true);
}
}
else if (para_Run === LastClass.Type)
{
var Elements = SelectedContent.Elements;
var Para = NearPos.Paragraph;
// Сначала найдем номер элемента, начиная с которого мы будем производить вставку
var DstIndex = -1;
var Count = this.Content.length;
for ( var Index = 0; Index < Count; Index++ )
for (var Index = 0; Index < Count; Index++)
{
if ( this.Content[Index] === Para )
if (this.Content[Index] === Para)
{
DstIndex = Index;
break;
}
}
if ( -1 === DstIndex )
if (-1 === DstIndex)
return;
var bNeedSelect = true;
var Elements = SelectedContent.Elements;
var ElementsCount = Elements.length;
var FirstElement = SelectedContent.Elements[0];
if ( 1 === ElementsCount && true !== FirstElement.SelectedAll && type_Paragraph === FirstElement.Element.GetType() )
if (1 === ElementsCount && true !== FirstElement.SelectedAll && type_Paragraph === FirstElement.Element.GetType())
{
// Нам нужно в заданный параграф вставить выделенный текст
var NewPara = FirstElement.Element;
var NewElementsCount = NewPara.Content.length - 1; // Последний ран с para_End не добавляем
var ParaNearPos = Para.Get_ParaNearestPos( NearPos );
if ( null === ParaNearPos || ParaNearPos.Classes.length < 2 )
return;
var LastClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 1];
if ( para_Run !== LastClass.Type )
return;
var NewElement = LastClass.Split( ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1 );
var NewElement = LastClass.Split(ParaNearPos.NearPos.ContentPos, ParaNearPos.Classes.length - 1);
var PrevClass = ParaNearPos.Classes[ParaNearPos.Classes.length - 2];
var PrevPos = ParaNearPos.NearPos.ContentPos.Data[ParaNearPos.Classes.length - 2];
PrevClass.Add_ToContent( PrevPos + 1, NewElement );
PrevClass.Add_ToContent(PrevPos + 1, NewElement);
// TODO: Заглушка для переноса автофигур и картинок. Когда разрулим ситуацию так, чтобы когда у нас
// в текста была выделена автофигура выделение шло для автофигур, тогда здесь можно будет убрать.
var LogicDocument = this.LogicDocument;
bNeedSelect = (true === SelectedContent.MoveDrawing ? false : true);
for ( var Index = 0; Index < NewElementsCount; Index++ )
for (var Index = 0; Index < NewElementsCount; Index++)
{
var Item = NewPara.Content[Index];
PrevClass.Add_ToContent( PrevPos + 1 + Index, Item );
PrevClass.Add_ToContent(PrevPos + 1 + Index, Item);
if ( true === bNeedSelect )
if (true === bNeedSelect)
Item.Select_All();
}
if ( true === bNeedSelect )
if (true === bNeedSelect)
{
PrevClass.Selection.Use = true;
PrevClass.Selection.StartPos = PrevPos + 1;
PrevClass.Selection.EndPos = PrevPos + 1 + NewElementsCount - 1;
for ( var Index = 0; Index < ParaNearPos.Classes.length - 2; Index++ )
for (var Index = 0; Index < ParaNearPos.Classes.length - 2; Index++)
{
var Class = ParaNearPos.Classes[Index];
var ClassPos = ParaNearPos.NearPos.ContentPos.Data[Index];
......@@ -4000,7 +4016,7 @@ CDocumentContent.prototype =
this.Selection.EndPos = DstIndex;
}
if ( PrevClass.Correct_Content )
if (PrevClass.Correct_Content)
{
PrevClass.Correct_Content();
}
......@@ -4015,14 +4031,14 @@ CDocumentContent.prototype =
// Нам надо разделить наш параграф в заданной позиции, если позиция в
// начале или конце параграфа, тогда делить не надо
Para.Cursor_MoveToNearPos( NearPos );
Para.Cursor_MoveToNearPos(NearPos);
Para.Selection_Remove();
if ( true === Para.Cursor_IsEnd() )
if (true === Para.Cursor_IsEnd())
{
bConcatE = false;
if ( 1 === ElementsCount && type_Paragraph === FirstElement.Element.GetType() && ( true === FirstElement.Element.Is_Empty() || true == FirstElement.SelectedAll ) )
if (1 === ElementsCount && type_Paragraph === FirstElement.Element.GetType() && ( true === FirstElement.Element.Is_Empty() || true == FirstElement.SelectedAll ))
{
bConcatS = false;
......@@ -4030,27 +4046,27 @@ CDocumentContent.prototype =
DstIndex++;
}
}
else if ( true === Para.Cursor_IsStart() )
else if (true === Para.Cursor_IsStart())
{
bConcatS = false;
}
else
{
// Создаем новый параграф
var NewParagraph = new Paragraph( this.DrawingDocument, this, 0, 0, 0, 0, 0, this.bPresentation === true );
Para.Split( NewParagraph );
this.Internal_Content_Add( DstIndex + 1, NewParagraph );
var NewParagraph = new Paragraph(this.DrawingDocument, this, 0, 0, 0, 0, 0, this.bPresentation === true);
Para.Split(NewParagraph);
this.Internal_Content_Add(DstIndex + 1, NewParagraph);
ParaE = NewParagraph;
ParaEIndex = DstIndex + 1;
}
var StartIndex = 0;
if ( true === bConcatS )
if (true === bConcatS)
{
// Если мы присоединяем новый параграф, то и копируем все настройки параграфа (так делает Word)
ParaS.Concat( Elements[0].Element );
ParaS.Set_Pr( Elements[0].Element.Pr );
ParaS.Concat(Elements[0].Element);
ParaS.Set_Pr(Elements[0].Element.Pr);
StartIndex++;
......@@ -4065,18 +4081,18 @@ CDocumentContent.prototype =
}
var EndIndex = ElementsCount - 1;
if ( true === bConcatE )
if (true === bConcatE)
{
var _ParaE = Elements[ElementsCount - 1].Element;
var TempCount = _ParaE.Content.length - 1;
_ParaE.Select_All();
_ParaE.Concat( ParaE );
_ParaE.Set_Pr( ParaE.Pr );
_ParaE.Concat(ParaE);
_ParaE.Set_Pr(ParaE.Pr);
this.Internal_Content_Add( ParaEIndex, _ParaE );
this.Internal_Content_Remove( ParaEIndex + 1, 1 );
this.Internal_Content_Add(ParaEIndex, _ParaE);
this.Internal_Content_Remove(ParaEIndex + 1, 1);
_ParaE.Selection.Use = true;
_ParaE.Selection.StartPos = 0;
......@@ -4086,9 +4102,9 @@ CDocumentContent.prototype =
}
for ( var Index = StartIndex; Index <= EndIndex; Index++ )
for (var Index = StartIndex; Index <= EndIndex; Index++)
{
this.Internal_Content_Add( DstIndex + Index, Elements[Index].Element );
this.Internal_Content_Add(DstIndex + Index, Elements[Index].Element);
this.Content[DstIndex + Index].Select_All();
}
......@@ -4107,6 +4123,7 @@ CDocumentContent.prototype =
this.Selection.Use = true;
this.Selection.Start = false;
}
}
},
Set_ParagraphAlign : function(Align)
......
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