Commit 2be97d0f authored by Ilya Kirillov's avatar Ilya Kirillov

Remove function was moved to Base class and was adapted for the new class CBlockLevelSdt.

parent 85dc3772
......@@ -11857,421 +11857,13 @@ CDocument.prototype.controller_AddToParagraph = function(ParaItem, bRecalculate)
};
CDocument.prototype.controller_Remove = function(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd)
{
if (this.CurPos.ContentPos < 0)
return false;
// Делаем так, чтобы при выделении нумерации удалялась нумерация. А она удаляется по backspace.
if (true === this.Selection.Use && selectionflag_Numbering == this.Selection.Flag && Count > 0)
Count = -Count;
this.Remove_NumberingSelection();
// Если в документе что-то заселекчено, тогда удаляем селект
if (true === this.Selection.Use)
{
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if (EndPos < StartPos)
{
var Temp = StartPos;
StartPos = EndPos;
EndPos = Temp;
}
// Проверим, пустой ли селект в конечном элементе (для случая, когда конечный элемент параграф, и в нем
// не заселекчен знак конца параграфа)
if (StartPos !== EndPos && true === this.Content[EndPos].IsSelectionEmpty(true))
EndPos--;
if (true === this.Is_TrackRevisions())
{
// Если есть параграфы, которые были добавлены во время рецензирования, тогда мы их удаляем
// TODO: Надо убрать вызовы пересчета изнутри документа
this.TurnOff_Recalculate();
for (var Index = StartPos; Index <= EndPos; Index++)
{
this.Content[Index].Remove(1, true);
}
this.TurnOn_Recalculate();
this.Selection_Remove();
for (var Index = EndPos - 1; Index >= StartPos; Index--)
{
if (type_Paragraph === this.Content[Index].GetType() && reviewtype_Add === this.Content[Index].GetReviewType())
{
// Если параграф пустой, тогда удаляем параграф, если не пустой, тогда объединяем его со
// следующим параграф. Если следующий элемент таблица, тогда ничего не делаем.
if (this.Content[Index].IsEmpty())
{
this.Internal_Content_Remove(Index, 1);
}
else if (Index < this.Content.length - 1 && type_Paragraph === this.Content[Index + 1].GetType())
{
// Соединяем текущий и предыдущий параграфы
this.Content[Index].Concat(this.Content[Index + 1]);
this.Internal_Content_Remove(Index + 1, 1);
}
}
else
{
this.Content[Index].SetReviewType(reviewtype_Remove);
}
}
this.CurPos.ContentPos = StartPos;
}
else
{
// Убираем селект
this.Selection_Clear();
this.Selection.Use = false;
this.Selection.StartPos = 0;
this.Selection.EndPos = 0;
this.DrawingDocument.TargetStart();
if (StartPos != EndPos)
{
var StartType = this.Content[StartPos].GetType();
var EndType = this.Content[EndPos].GetType();
var bStartEmpty, bEndEmpty;
if (type_Paragraph == StartType)
{
// Удаляем выделенную часть параграфа
this.Content[StartPos].Remove(1, true);
bStartEmpty = this.Content[StartPos].IsEmpty()
}
else if (type_Table == StartType)
{
// Нам нужно удалить все выделенные строки в таблице
bStartEmpty = !(this.Content[StartPos].Row_Remove2());
}
if (type_Paragraph == EndType)
{
// Удаляем выделенную часть параграфа
this.Content[EndPos].Remove(1, true);
bEndEmpty = this.Content[EndPos].IsEmpty()
}
else if (type_Table == EndType)
{
// Нам нужно удалить все выделенные строки в таблице
bEndEmpty = !(this.Content[EndPos].Row_Remove2());
}
if (true != bStartEmpty && true != bEndEmpty)
{
// Удаляем весь промежуточный контент
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos - 1);
this.CurPos.ContentPos = StartPos;
if (type_Paragraph == StartType && type_Paragraph == EndType && true === bOnTextAdd)
{
// Встаем в конец параграфа и удаляем 1 элемент (чтобы соединить параграфы)
this.Content[StartPos].MoveCursorToEndPos(false, false);
this.Remove(1, true);
}
else
{
if (true === bOnTextAdd && type_Table === this.Content[StartPos + 1].GetType() && type_Table === this.Content[StartPos].GetType())
{
this.Internal_Content_Add(StartPos + 1, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].Cursor_MoveToStartPos();
}
else if (true === bOnTextAdd && type_Table === this.Content[StartPos + 1].GetType())
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].Cursor_MoveToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].Cursor_MoveToStartPos();
}
}
}
else if (true != bStartEmpty)
{
if (true === bOnTextAdd && type_Table == StartType)
{
// Удаляем весь промежуточный контент и конечный элемент, если это
// таблица, поскольку таблица не может быть последним элементом в документе удаляем без проверок.
if (EndType === type_Table)
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos);
else
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos - 1);
if (type_Table === this.Content[StartPos + 1].Get_Type() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos + 1, this.private_CreateNewParagraph());
// Встаем в начало параграфа
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
else
{
// Удаляем весь промежуточный контент и последний параграф
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos);
if (type_Paragraph == StartType)
{
// Встаем в конец параграфа
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToEndPos(false, false);
}
else if (type_Table == StartType)
{
// У нас обязательно есть элемент после таблицы (либо снова таблица, либо параграф)
// Встаем в начало следующего элемента.
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
}
}
else if (true != bEndEmpty)
{
// Удаляем весь промежуточный контент и начальный параграф
this.Internal_Content_Remove(StartPos, EndPos - StartPos);
if (type_Table === this.Content[StartPos].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos, this.private_CreateNewParagraph());
// Встаем в начало параграфа
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
else
{
if (true === bOnTextAdd)
{
// Удаляем весь промежуточный контент, начальный элемент и конечный элемент, если это
// таблица, поскольку таблица не может быть последним элементом в документе удаляем без проверок.
if (EndType === type_Table && bOnTextAdd)
this.Internal_Content_Remove(StartPos, EndPos - StartPos + 1);
else
this.Internal_Content_Remove(StartPos, EndPos - StartPos);
if (type_Table === this.Content[StartPos].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
else
{
// Удаляем весь промежуточный контент, начальный и конечный параграфы
// При таком удалении надо убедиться, что в документе останется хотя бы один элемент
if (0 === StartPos && (EndPos - StartPos + 1) >= this.Content.length)
{
this.Internal_Content_Add(0, this.private_CreateNewParagraph());
this.Internal_Content_Remove(1, this.Content.length - 1);
}
else
{
this.Internal_Content_Remove(StartPos, EndPos - StartPos + 1);
}
// Выставляем текущую позицию
if (StartPos >= this.Content.length)
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
}
}
}
else
{
this.CurPos.ContentPos = StartPos;
if (Count < 0 && type_Table === this.Content[StartPos].GetType() && true === this.Content[StartPos].IsCellSelection() && true != bOnTextAdd)
{
return this.Table_RemoveRow();
}
else if (false === this.Content[StartPos].Remove(Count, true, bRemoveOnlySelection, bOnTextAdd))
{
// При добавлении текста, параграф не объединяется
if (true != bOnTextAdd)
{
// В ворде параграфы объединяются только когда у них все настройки совпадают.
// (почему то при изменении и обратном изменении настроек параграфы перестают объединятся)
// Пока у нас параграфы будут объединяться всегда и настройки будут браться из первого
// параграфа, кроме случая, когда первый параграф полностью удаляется.
if (true === this.Content[StartPos].IsEmpty() && this.Content.length > 1)
{
this.Internal_Content_Remove(StartPos, 1);
// Выставляем текущую позицию
if (StartPos >= this.Content.length)
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos();
}
this.Recalculate();
this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
return;
}
else if (this.CurPos.ContentPos < this.Content.length - 1 && type_Paragraph == this.Content[this.CurPos.ContentPos + 1].GetType())
{
// Соединяем текущий и предыдущий параграфы
this.Content[StartPos].Concat(this.Content[StartPos + 1]);
this.Internal_Content_Remove(StartPos + 1, 1);
this.Interface_Update_ParaPr();
}
else if (this.Content.length === 1 && true === this.Content[0].IsEmpty() && Count > 0)
{
this.Internal_Content_Add(0, this.private_CreateNewParagraph());
this.Internal_Content_Remove(1, this.Content.length - 1);
}
}
}
}
}
this.Recalculate();
}
else
{
if (true === bRemoveOnlySelection || true === bOnTextAdd)
return;
if (type_Paragraph == this.Content[this.CurPos.ContentPos].GetType())
{
var bNumbering = ( undefined != this.Content[this.CurPos.ContentPos].Numbering_Get() ? true : false );
if (false === this.Content[this.CurPos.ContentPos].Remove(Count, bOnlyText))
{
if (Count < 0)
{
if (this.CurPos.ContentPos > 0 && type_Paragraph == this.Content[this.CurPos.ContentPos - 1].GetType())
{
var CurrFramePr = this.Content[this.CurPos.ContentPos].Get_FramePr();
var PrevFramePr = this.Content[this.CurPos.ContentPos - 1].Get_FramePr();
if ((undefined === CurrFramePr && undefined === PrevFramePr) || ( undefined !== CurrFramePr && undefined !== PrevFramePr && true === CurrFramePr.Compare(PrevFramePr) ))
{
if (true === this.Is_TrackRevisions() && reviewtype_Add !== this.Content[this.CurPos.ContentPos - 1].GetReviewType())
{
this.Content[this.CurPos.ContentPos - 1].Set_ReviewType(reviewtype_Remove);
this.CurPos.ContentPos--;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
if (true === this.Content[this.CurPos.ContentPos - 1].IsEmpty() && undefined === this.Content[this.CurPos.ContentPos - 1].Numbering_Get())
{
// Просто удаляем предыдущий параграф
this.Internal_Content_Remove(this.CurPos.ContentPos - 1, 1);
this.CurPos.ContentPos--;
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
// Соединяем текущий и предыдущий параграфы
var Prev = this.Content[this.CurPos.ContentPos - 1];
// Смещаемся в конец до объединения параграфов, чтобы курсор стоял в месте
// соединения.
Prev.MoveCursorToEndPos(false, false);
this.private_Remove(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd);
// Запоминаем новую позицию курсора, после совмещения параграфов
Prev.Concat(this.Content[this.CurPos.ContentPos]);
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.CurPos.ContentPos--;
}
}
}
}
}
else if (Count > 0)
{
if (this.CurPos.ContentPos < this.Content.length - 1 && type_Paragraph == this.Content[this.CurPos.ContentPos + 1].GetType())
{
var CurrFramePr = this.Content[this.CurPos.ContentPos].Get_FramePr();
var NextFramePr = this.Content[this.CurPos.ContentPos + 1].Get_FramePr();
if ((undefined === CurrFramePr && undefined === NextFramePr) || ( undefined !== CurrFramePr && undefined !== NextFramePr && true === CurrFramePr.Compare(NextFramePr) ))
{
if (true === this.Is_TrackRevisions() && reviewtype_Add !== this.Content[this.CurPos.ContentPos].Get_ReviewType())
{
this.Content[this.CurPos.ContentPos].SetReviewType(reviewtype_Remove);
this.CurPos.ContentPos++;
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
if (true === this.Content[this.CurPos.ContentPos].IsEmpty())
{
// Просто удаляем текущий параграф
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
// Соединяем текущий и следующий параграфы
var Cur = this.Content[this.CurPos.ContentPos];
Cur.Concat(this.Content[this.CurPos.ContentPos + 1]);
this.Internal_Content_Remove(this.CurPos.ContentPos + 1, 1);
}
}
}
}
else if (true == this.Content[this.CurPos.ContentPos].IsEmpty() && this.CurPos.ContentPos == this.Content.length - 1 && this.CurPos.ContentPos != 0 && type_Table != this.Content[this.CurPos.ContentPos - 1].GetType())
{
// Если данный параграф пустой, последний, не единственный и идущий перед
// ним элемент не таблица, удаляем его
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.CurPos.ContentPos--;
}
}
this.Recalculate();
}
else
{
if (true === bNumbering && undefined == this.Content[this.CurPos.ContentPos].Numbering_Get())
{
this.Recalculate();
}
else
{
this.Recalculate();
}
}
var Item = this.Content[this.CurPos.ContentPos];
if (type_Paragraph === Item.GetType())
{
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
else
{
this.Content[this.CurPos.ContentPos].Remove(Count, bOnlyText);
}
}
this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
......
......@@ -2819,385 +2819,7 @@ CDocumentContent.prototype.Remove = function(Count, bOnlyText, bRemoveOnlySelect
if (docpostype_DrawingObjects === this.CurPos.Type)
return this.LogicDocument.DrawingObjects.remove(Count, bOnlyText, bRemoveOnlySelection);
else //if ( docpostype_Content === this.CurPos.Type )
{
if (this.CurPos.ContentPos < 0)
return false;
this.Remove_NumberingSelection();
// Если в документе что-то заселекчено, тогда удаляем селект
if (true === this.Selection.Use)
{
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if (EndPos < StartPos)
{
var Temp = StartPos;
StartPos = EndPos;
EndPos = Temp;
}
// Проверим, пустой ли селект в конечном элементе (для случая, когда конечный элемент параграф, и в нем
// не заселекчен знак конца параграфа)
if (StartPos !== EndPos && true === this.Content[EndPos].IsSelectionEmpty(true))
EndPos--;
if (true === this.Is_TrackRevisions())
{
// Если есть параграфы, которые были добавлены во время рецензирования, тогда мы их удаляем
for (var Index = StartPos; Index <= EndPos; Index++)
{
this.Content[Index].Remove(1, true);
}
this.Selection_Remove();
for (var Index = EndPos - 1; Index >= StartPos; Index--)
{
if (type_Paragraph === this.Content[Index].GetType() && reviewtype_Add === this.Content[Index].GetReviewType())
{
// Если параграф пустой, тогда удаляем параграф, если не пустой, тогда объединяем его со
// следующим параграф. Если следующий элемент таблица, тогда ничего не делаем.
if (this.Content[Index].IsEmpty())
{
this.Internal_Content_Remove(Index, 1);
}
else if (Index < this.Content.length - 1 && type_Paragraph === this.Content[Index + 1].GetType())
{
// Соединяем текущий и предыдущий параграфы
this.Content[Index].Concat(this.Content[Index + 1]);
this.Internal_Content_Remove(Index + 1, 1);
}
}
else
{
this.Content[Index].SetReviewType(reviewtype_Remove);
}
}
this.CurPos.ContentPos = StartPos;
}
else
{
// Убираем селект
this.Selection.Use = false;
if (StartPos != EndPos)
{
var StartType = this.Content[StartPos].GetType();
var EndType = this.Content[EndPos].GetType();
var bStartEmpty, bEndEmpty;
if (type_Paragraph == StartType)
{
// Удаляем выделенную часть параграфа
this.Content[StartPos].Remove(1, true);
bStartEmpty = this.Content[StartPos].IsEmpty()
}
else if (type_Table == StartType)
{
// Нам нужно удалить все выделенные строки в таблице
bStartEmpty = !(this.Content[StartPos].Row_Remove2());
}
if (type_Paragraph == EndType)
{
// Удаляем выделенную часть параграфа
this.Content[EndPos].Remove(1, true);
bEndEmpty = this.Content[EndPos].IsEmpty()
}
else if (type_Table == EndType)
{
// Нам нужно удалить все выделенные строки в таблице
bEndEmpty = !(this.Content[EndPos].Row_Remove2());
}
if (true != bStartEmpty && true != bEndEmpty)
{
// Удаляем весь промежуточный контент
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos - 1);
this.CurPos.ContentPos = StartPos;
if (type_Paragraph == StartType && type_Paragraph == EndType && true === bOnTextAdd)
{
// Встаем в конец параграфа и удаляем 1 элемент (чтобы соединить параграфы)
this.Content[StartPos].MoveCursorToEndPos(false, false);
this.Remove(1, true);
}
else
{
if (true === bOnTextAdd && type_Table === this.Content[StartPos + 1].GetType() && type_Table === this.Content[StartPos].Get_ype())
{
this.Internal_Content_Add(StartPos + 1, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
else if (true === bOnTextAdd && type_Table === this.Content[StartPos + 1].GetType())
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].Cursor_MoveToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
}
}
else if (true != bStartEmpty)
{
if (true === bOnTextAdd && type_Table === StartType)
{
// Удаляем весь промежуточный контент и конечный элемент, если это
// таблица, поскольку таблица не может быть последним элементом в документе удаляем без проверок.
if (EndType === type_Table)
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos);
else
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos - 1);
if (type_Table === this.Content[StartPos + 1].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos + 1, this.private_CreateNewParagraph());
// Встаем в начало параграфа
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
else
{
// Удаляем весь промежуточный контент и последний параграф
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos);
if (type_Paragraph == StartType)
{
// Встаем в конец параграфа
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToEndPos(false, false);
}
else if (type_Table == StartType)
{
// У нас обязательно есть элемент после таблицы (либо снова таблица, либо параграф)
// Встаем в начало следующего элемента.
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
}
}
else if (true != bEndEmpty)
{
// Удаляем весь промежуточный контент и начальный параграф
this.Internal_Content_Remove(StartPos, EndPos - StartPos);
if (type_Table === this.Content[StartPos].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos, this.private_CreateNewParagraph());
// Встаем в начало параграфа
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
else
{
if (true === bOnTextAdd)
{
// Удаляем весь промежуточный контент, начальный элемент и конечный элемент, если это
// таблица, поскольку таблица не может быть последним элементом в документе удаляем без проверок.
if (EndType === type_Table && bOnTextAdd)
this.Internal_Content_Remove(StartPos, EndPos - StartPos + 1);
else
this.Internal_Content_Remove(StartPos, EndPos - StartPos);
if (type_Table === this.Content[StartPos].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos();
}
else
{
// Удаляем весь промежуточный контент, начальный и конечный параграфы
// При таком удалении надо убедиться, что в документе останется хотя бы один элемент
if (0 === StartPos && (EndPos - StartPos + 1) >= this.Content.length)
{
this.Internal_Content_Add(0, this.private_CreateNewParagraph());
this.Internal_Content_Remove(1, this.Content.length - 1);
}
else
{
this.Internal_Content_Remove(StartPos, EndPos - StartPos + 1);
}
// Выставляем текущую позицию
if (StartPos >= this.Content.length)
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
}
}
}
else
{
this.CurPos.ContentPos = StartPos;
if (Count < 0 && type_Table === this.Content[StartPos].GetType() && true === this.Content[StartPos].IsCellSelection() && true != bOnTextAdd)
{
this.Table_RemoveRow();
}
else if (false === this.Content[StartPos].Remove(Count, true, bRemoveOnlySelection, bOnTextAdd))
{
// При добавлении текста, параграф не объединяется
if (true != bOnTextAdd)
{
// В ворде параграфы объединяются только когда у них все настройки совпадают.
// (почему то при изменении и обратном изменении настроек параграфы перестают объединятся)
// Пока у нас параграфы будут объединяться всегда и настройки будут браться из первого
// параграфа, кроме случая, когда первый параграф полностью удаляется.
if (true === this.Content[StartPos].IsEmpty() && this.Content.length > 1)
{
this.Internal_Content_Remove(StartPos, 1);
// Выставляем текущую позицию
if (StartPos >= this.Content.length)
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
this.Recalculate();
return;
}
else if (this.CurPos.ContentPos < this.Content.length - 1 && type_Paragraph == this.Content[this.CurPos.ContentPos + 1].GetType())
{
// Соединяем текущий и предыдущий параграфы
this.Content[StartPos].Concat(this.Content[StartPos + 1]);
this.Internal_Content_Remove(StartPos + 1, 1);
}
else if (this.Content.length === 1 && true === this.Content[0].IsEmpty() && Count > 0)
{
this.Internal_Content_Add(0, this.private_CreateNewParagraph());
this.Internal_Content_Remove(1, this.Content.length - 1);
}
}
}
}
}
// В текущей позиции this.CurPos.ContentPos может оказаться, либо оставшийся параграф,
// после удаления (если параграфы удалялись не целиком), либо следующий за ним, либо
// перед ним. В любом случае, ничего не испортится если мы у текущего параграфа удалим
// селект.
this.Content[this.CurPos.ContentPos].Selection_Remove();
this.Recalculate();
}
else
{
if (true === bRemoveOnlySelection || true === bOnTextAdd)
return;
if (type_Paragraph == this.Content[this.CurPos.ContentPos].GetType())
{
var bNumbering = ( undefined != this.Content[this.CurPos.ContentPos].Numbering_Get() ? true : false );
if (false === this.Content[this.CurPos.ContentPos].Remove(Count, bOnlyText))
{
if (Count < 0)
{
if (this.CurPos.ContentPos > 0 && type_Paragraph == this.Content[this.CurPos.ContentPos - 1].GetType())
{
if (true === this.Is_TrackRevisions() && reviewtype_Add !== this.Content[this.CurPos.ContentPos - 1].GetReviewType())
{
this.Content[this.CurPos.ContentPos - 1].SetReviewType(reviewtype_Remove);
this.CurPos.ContentPos--;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
if (true === this.Content[this.CurPos.ContentPos - 1].IsEmpty() && undefined === this.Content[this.CurPos.ContentPos - 1].Numbering_Get())
{
// Просто удаляем предыдущий параграф
this.Internal_Content_Remove(this.CurPos.ContentPos - 1, 1);
this.CurPos.ContentPos--;
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
// Соединяем текущий и предыдущий параграфы
var Prev = this.Content[this.CurPos.ContentPos - 1];
// Смещаемся в конец до объединения параграфов, чтобы курсор стоял в месте
// соединения.
Prev.MoveCursorToEndPos(false, false);
Prev.Concat(this.Content[this.CurPos.ContentPos]);
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.CurPos.ContentPos--;
}
}
}
}
else if (Count > 0)
{
if (this.CurPos.ContentPos < this.Content.length - 1 && type_Paragraph == this.Content[this.CurPos.ContentPos + 1].GetType())
{
if (true === this.Is_TrackRevisions() && reviewtype_Add !== this.Content[this.CurPos.ContentPos].GetReviewType())
{
this.Content[this.CurPos.ContentPos].SetReviewType(reviewtype_Remove);
this.CurPos.ContentPos++;
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
if (true === this.Content[this.CurPos.ContentPos].IsEmpty())
{
// Просто удаляем текущий параграф
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
// Соединяем текущий и предыдущий параграфы
var Cur = this.Content[this.CurPos.ContentPos];
Cur.Concat(this.Content[this.CurPos.ContentPos + 1]);
this.Internal_Content_Remove(this.CurPos.ContentPos + 1, 1);
}
}
}
else if (true == this.Content[this.CurPos.ContentPos].IsEmpty() && this.CurPos.ContentPos == this.Content.length - 1 && this.CurPos.ContentPos != 0 && type_Table != this.Content[this.CurPos.ContentPos - 1].GetType())
{
// Если данный параграф пустой, последний, не единственный и идущий перед
// ним элемент не таблица, удаляем его
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.CurPos.ContentPos--;
}
}
}
this.Recalculate();
var Item = this.Content[this.CurPos.ContentPos];
if (type_Paragraph === Item.GetType())
{
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
else
{
// Remove сам вызывет команду Recalculate
this.Content[this.CurPos.ContentPos].Remove(Count, bOnlyText);
}
}
}
this.private_Remove(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd);
};
CDocumentContent.prototype.Cursor_GetPos = function()
{
......
......@@ -326,3 +326,378 @@ CDocumentContentBase.prototype.GetNumberingInfo = function(NumberingEngine, Para
return NumberingEngine.Get_NumInfo();
};
CDocumentContentBase.prototype.private_Remove = function(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd)
{
if (this.CurPos.ContentPos < 0)
return false;
this.Remove_NumberingSelection();
if (true === this.Selection.Use)
{
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if (EndPos < StartPos)
{
var Temp = StartPos;
StartPos = EndPos;
EndPos = Temp;
}
// Проверим, пустой ли селект в конечном элементе (для случая, когда конечный элемент параграф, и в нем
// не заселекчен знак конца параграфа)
if (StartPos !== EndPos && true === this.Content[EndPos].IsSelectionEmpty(true))
EndPos--;
if (true === this.Is_TrackRevisions())
{
// Если есть параграфы, которые были добавлены во время рецензирования, тогда мы их удаляем
for (var Index = StartPos; Index <= EndPos; Index++)
{
this.Content[Index].Remove(1, true);
}
this.Selection_Remove();
for (var Index = EndPos - 1; Index >= StartPos; Index--)
{
if (type_Paragraph === this.Content[Index].GetType() && reviewtype_Add === this.Content[Index].GetReviewType())
{
// Если параграф пустой, тогда удаляем параграф, если не пустой, тогда объединяем его со
// следующим параграф. Если следующий элемент таблица, тогда ничего не делаем.
if (this.Content[Index].IsEmpty())
{
this.Internal_Content_Remove(Index, 1);
}
else if (Index < this.Content.length - 1 && type_Paragraph === this.Content[Index + 1].GetType())
{
this.Content[Index].Concat(this.Content[Index + 1]);
this.Internal_Content_Remove(Index + 1, 1);
}
}
else
{
this.Content[Index].SetReviewType(reviewtype_Remove);
}
}
this.CurPos.ContentPos = StartPos;
}
else
{
this.Selection.Use = false;
this.Selection.StartPos = 0;
this.Selection.EndPos = 0;
if (StartPos !== EndPos)
{
var StartType = this.Content[StartPos].GetType();
var EndType = this.Content[EndPos].GetType();
var bStartEmpty = false, bEndEmpty = false;
if (type_Paragraph === StartType)
{
this.Content[StartPos].Remove(1, true);
bStartEmpty = this.Content[StartPos].IsEmpty()
}
else if (type_Table === StartType)
{
bStartEmpty = !(this.Content[StartPos].Row_Remove2());
}
else if (type_BlockLevelSdt === StartType)
{
this.Content[StartPos].Remove(1, true);
bStartEmpty = false;
}
if (type_Paragraph === EndType)
{
this.Content[EndPos].Remove(1, true);
bEndEmpty = this.Content[EndPos].IsEmpty()
}
else if (type_Table === EndType)
{
bEndEmpty = !(this.Content[EndPos].Row_Remove2());
}
else if (type_BlockLevelSdt === EndType)
{
this.Content[EndPos].Remove(1, true);
bEndEmpty = false;
}
if (!bStartEmpty && !bEndEmpty)
{
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos - 1);
this.CurPos.ContentPos = StartPos;
if (type_Paragraph === StartType && type_Paragraph === EndType && true === bOnTextAdd)
{
// Встаем в конец параграфа и удаляем 1 элемент (чтобы соединить параграфы)
this.Content[StartPos].MoveCursorToEndPos(false, false);
this.Remove(1, true);
}
else
{
if (true === bOnTextAdd && type_Paragraph !== this.Content[StartPos + 1].GetType() && type_Paragraph !== this.Content[StartPos].GetType())
{
this.Internal_Content_Add(StartPos + 1, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
else if (true === bOnTextAdd && type_Paragraph !== this.Content[StartPos + 1].GetType())
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
}
}
else if (!bStartEmpty)
{
if (true === bOnTextAdd && type_Table === StartType)
{
if (EndType !== type_Paragraph)
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos);
else
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos - 1);
if (type_Table === this.Content[StartPos + 1].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos + 1, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
else
{
this.Internal_Content_Remove(StartPos + 1, EndPos - StartPos);
if (type_Table == StartType)
{
// У нас обязательно есть элемент после таблицы (либо снова таблица, либо параграф)
// Встаем в начало следующего элемента.
this.CurPos.ContentPos = StartPos + 1;
this.Content[StartPos + 1].MoveCursorToStartPos(false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToEndPos(false, false);
}
}
}
else if (!bEndEmpty)
{
this.Internal_Content_Remove(StartPos, EndPos - StartPos);
if (type_Table === this.Content[StartPos].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
else
{
if (true === bOnTextAdd)
{
// Удаляем весь промежуточный контент, начальный элемент и конечный элемент, если это
// таблица, поскольку таблица не может быть последним элементом в документе удаляем без проверок.
if (type_Pargraph !== EndType)
this.Internal_Content_Remove(StartPos, EndPos - StartPos + 1);
else
this.Internal_Content_Remove(StartPos, EndPos - StartPos);
if (type_Table === this.Content[StartPos].GetType() && true === bOnTextAdd)
this.Internal_Content_Add(StartPos, this.private_CreateNewParagraph());
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos();
}
else
{
// Удаляем весь промежуточный контент, начальный и конечный параграфы
// При таком удалении надо убедиться, что в документе останется хотя бы один элемент
if (0 === StartPos && (EndPos - StartPos + 1) >= this.Content.length)
{
this.Internal_Content_Add(0, this.private_CreateNewParagraph());
this.Internal_Content_Remove(1, this.Content.length - 1);
}
else
{
this.Internal_Content_Remove(StartPos, EndPos - StartPos + 1);
}
// Выставляем текущую позицию
if (StartPos >= this.Content.length)
{
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
}
}
}
else
{
this.CurPos.ContentPos = StartPos;
if (Count < 0 && type_Table === this.Content[StartPos].GetType() && true === this.Content[StartPos].IsCellSelection() && true != bOnTextAdd)
{
this.Table_RemoveRow();
}
else if (false === this.Content[StartPos].Remove(Count, true, bRemoveOnlySelection, bOnTextAdd))
{
// При добавлении текста, параграф не объединяется
if (true !== bOnTextAdd)
{
// В ворде параграфы объединяются только когда у них все настройки совпадают.
// (почему то при изменении и обратном изменении настроек параграфы перестают объединятся)
// Пока у нас параграфы будут объединяться всегда и настройки будут браться из первого
// параграфа, кроме случая, когда первый параграф полностью удаляется.
if (true === this.Content[StartPos].IsEmpty() && this.Content.length > 1)
{
this.Internal_Content_Remove(StartPos, 1);
// Выставляем текущую позицию
if (StartPos >= this.Content.length)
{
// Документ не должен заканчиваться таблицей, поэтому здесь проверку не делаем
this.CurPos.ContentPos = this.Content.length - 1;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
this.CurPos.ContentPos = StartPos;
this.Content[StartPos].MoveCursorToStartPos(false);
}
}
else if (this.CurPos.ContentPos < this.Content.length - 1 && type_Paragraph === this.Content[this.CurPos.ContentPos].GetType() && type_Paragraph === this.Content[this.CurPos.ContentPos + 1].GetType())
{
// Соединяем текущий и предыдущий параграфы
this.Content[StartPos].Concat(this.Content[StartPos + 1]);
this.Internal_Content_Remove(StartPos + 1, 1);
}
else if (this.Content.length === 1 && true === this.Content[0].IsEmpty() && Count > 0)
{
this.Internal_Content_Add(0, this.private_CreateNewParagraph());
this.Internal_Content_Remove(1, this.Content.length - 1);
}
}
}
}
}
}
else
{
if (true === bRemoveOnlySelection || true === bOnTextAdd)
return;
if (type_Paragraph == this.Content[this.CurPos.ContentPos].GetType())
{
if (false === this.Content[this.CurPos.ContentPos].Remove(Count, bOnlyText))
{
if (Count < 0)
{
if (this.CurPos.ContentPos > 0 && type_Paragraph == this.Content[this.CurPos.ContentPos - 1].GetType())
{
var CurrFramePr = this.Content[this.CurPos.ContentPos].Get_FramePr();
var PrevFramePr = this.Content[this.CurPos.ContentPos - 1].Get_FramePr();
if ((undefined === CurrFramePr && undefined === PrevFramePr) || (undefined !== CurrFramePr && undefined !== PrevFramePr && true === CurrFramePr.Compare(PrevFramePr)))
{
if (true === this.Is_TrackRevisions() && reviewtype_Add !== this.Content[this.CurPos.ContentPos - 1].GetReviewType())
{
this.Content[this.CurPos.ContentPos - 1].SetReviewType(reviewtype_Remove);
this.CurPos.ContentPos--;
this.Content[this.CurPos.ContentPos].MoveCursorToEndPos(false, false);
}
else
{
if (true === this.Content[this.CurPos.ContentPos - 1].IsEmpty() && undefined === this.Content[this.CurPos.ContentPos - 1].Numbering_Get())
{
// Просто удаляем предыдущий параграф
this.Internal_Content_Remove(this.CurPos.ContentPos - 1, 1);
this.CurPos.ContentPos--;
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
// Соединяем текущий и предыдущий параграфы
var Prev = this.Content[this.CurPos.ContentPos - 1];
// Смещаемся в конец до объединения параграфов, чтобы курсор стоял в месте
// соединения.
Prev.MoveCursorToEndPos(false, false);
// Запоминаем новую позицию курсора, после совмещения параграфов
Prev.Concat(this.Content[this.CurPos.ContentPos]);
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.CurPos.ContentPos--;
}
}
}
}
}
else if (Count > 0)
{
if (this.CurPos.ContentPos < this.Content.length - 1 && type_Paragraph == this.Content[this.CurPos.ContentPos + 1].GetType())
{
var CurrFramePr = this.Content[this.CurPos.ContentPos].Get_FramePr();
var NextFramePr = this.Content[this.CurPos.ContentPos + 1].Get_FramePr();
if ((undefined === CurrFramePr && undefined === NextFramePr) || ( undefined !== CurrFramePr && undefined !== NextFramePr && true === CurrFramePr.Compare(NextFramePr) ))
{
if (true === this.Is_TrackRevisions() && reviewtype_Add !== this.Content[this.CurPos.ContentPos].Get_ReviewType())
{
this.Content[this.CurPos.ContentPos].SetReviewType(reviewtype_Remove);
this.CurPos.ContentPos++;
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
if (true === this.Content[this.CurPos.ContentPos].IsEmpty())
{
// Просто удаляем текущий параграф
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.Content[this.CurPos.ContentPos].MoveCursorToStartPos(false);
}
else
{
// Соединяем текущий и следующий параграфы
var Cur = this.Content[this.CurPos.ContentPos];
Cur.Concat(this.Content[this.CurPos.ContentPos + 1]);
this.Internal_Content_Remove(this.CurPos.ContentPos + 1, 1);
}
}
}
}
else if (true == this.Content[this.CurPos.ContentPos].IsEmpty() && this.CurPos.ContentPos == this.Content.length - 1 && this.CurPos.ContentPos != 0 && type_Paragraph === this.Content[this.CurPos.ContentPos - 1].GetType())
{
// Если данный параграф пустой, последний, не единственный и идущий перед
// ним элемент не таблица, удаляем его
this.Internal_Content_Remove(this.CurPos.ContentPos, 1);
this.CurPos.ContentPos--;
}
}
}
var Item = this.Content[this.CurPos.ContentPos];
if (type_Paragraph === Item.GetType())
{
Item.CurPos.RealX = Item.CurPos.X;
Item.CurPos.RealY = Item.CurPos.Y;
}
}
else
{
this.Content[this.CurPos.ContentPos].Remove(Count, bOnlyText);
}
}
};
\ No newline at end of file
......@@ -50,7 +50,7 @@ function CBlockLevelSdt(oLogicDocument, oParent)
CDocumentContentElementBase.call(this, oParent);
this.LogicDocument = oLogicDocument;
this.Content = new CDocumentContent(this, oLogicDocument.Get_DrawingDocument(), 0, 0, 0, 0, true, false, false);
this.Content = new CDocumentContent(this, oLogicDocument ? oLogicDocument.Get_DrawingDocument() : null, 0, 0, 0, 0, true, false, false);
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
g_oTableId.Add(this, this.Id);
......@@ -112,16 +112,26 @@ CBlockLevelSdt.prototype.Write_ToBinary2 = function(Writer)
{
Writer.WriteLong(AscDFH.historyitem_type_BlockLevelSdt);
// String : Content id
Writer.WriteString(this.Content.GetId());
Writer.WriteString2(this.Content.GetId());
};
CBlockLevelSdt.prototype.Read_FromBinary2 = function(Reader)
{
this.LogicDocument = editor.WordControl.m_oLogicDocument;
// String : Content id
this.Content = this.LogicDocument.Get_TableId().Get_ById(Reader.GetString2());
};
CBlockLevelSdt.prototype.Draw = function(CurPage, oGraphics)
{
this.Content.Draw(CurPage, oGraphics);
var oPageBounds = this.GetPageBounds(CurPage);
oGraphics.p_color(0, 0, 255, 255);
oGraphics.drawVerLine(0, oPageBounds.Left, oPageBounds.Top, oPageBounds.Bottom, 0);
oGraphics.drawVerLine(0, oPageBounds.Right, oPageBounds.Top, oPageBounds.Bottom, 0);
oGraphics.drawHorLine(0, oPageBounds.Top, oPageBounds.Left, oPageBounds.Right, 0);
oGraphics.drawHorLine(0, oPageBounds.Bottom, oPageBounds.Left, oPageBounds.Right, 0);
};
CBlockLevelSdt.prototype.Get_CurrentPage_Absolute = function()
{
......@@ -329,7 +339,7 @@ CBlockLevelSdt.prototype.AddInlineTable = function(nCols, nRows)
};
CBlockLevelSdt.prototype.Remove = function(nCount, bOnlyText, bRemoveOnlySelection, bOnAddText)
{
return this.Content.Remove(nCount, bOnlyText, bRemoveOnlySelection, bOnlyText);
return this.Content.Remove(nCount, bOnlyText, bRemoveOnlySelection, bOnAddText);
};
CBlockLevelSdt.prototype.Is_Empty = function()
{
......@@ -455,6 +465,9 @@ window['AscCommonWord'].type_BlockLevelSdt = type_BlockLevelSdt;
function TEST_ADD_SDT()
{
var oLogicDocument = editor.WordControl.m_oLogicDocument;
oLogicDocument.Create_NewHistoryPoint();
var oSdt = new CBlockLevelSdt(oLogicDocument, oLogicDocument);
oSdt.Content.Paragraph_Add(new ParaText("S"));
oSdt.Content.Paragraph_Add(new ParaText("d"));
......
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