Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
sdkjs
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boris Kocherov
sdkjs
Commits
2be97d0f
Commit
2be97d0f
authored
Apr 17, 2017
by
Ilya Kirillov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove function was moved to Base class and was adapted for the new class CBlockLevelSdt.
parent
85dc3772
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
394 additions
and
792 deletions
+394
-792
word/Editor/Document.js
word/Editor/Document.js
+2
-410
word/Editor/DocumentContent.js
word/Editor/DocumentContent.js
+1
-379
word/Editor/DocumentContentBase.js
word/Editor/DocumentContentBase.js
+375
-0
word/Editor/StructuredDocumentTags/BlockLevel.js
word/Editor/StructuredDocumentTags/BlockLevel.js
+16
-3
No files found.
word/Editor/Document.js
View file @
2be97d0f
...
...
@@ -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
;
this
.
private_Remove
(
Count
,
bOnlyText
,
bRemoveOnlySelection
,
bOnTextAdd
);
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
);
// Запоминаем новую позицию курсора, после совмещения параграфов
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
.
Recalculate
();
this
.
Document_UpdateInterfaceState
();
this
.
Document_UpdateRulersState
();
...
...
word/Editor/DocumentContent.js
View file @
2be97d0f
...
...
@@ -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
()
{
...
...
word/Editor/DocumentContentBase.js
View file @
2be97d0f
...
...
@@ -325,4 +325,379 @@ 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
word/Editor/StructuredDocumentTags/BlockLevel.js
View file @
2be97d0f
...
...
@@ -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
.
WriteString
2
(
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
,
bOn
ly
Text
);
return
this
.
Content
.
Remove
(
nCount
,
bOnlyText
,
bRemoveOnlySelection
,
bOn
Add
Text
);
};
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
"
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment