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
541601ac
Commit
541601ac
authored
Sep 09, 2016
by
Ilya Kirillov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Continued to rework calculation of footnotes.
parent
746c3d02
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
158 additions
and
243 deletions
+158
-243
word/Editor/Document.js
word/Editor/Document.js
+2
-5
word/Editor/Footnotes.js
word/Editor/Footnotes.js
+26
-179
word/Editor/Paragraph_Recalculate.js
word/Editor/Paragraph_Recalculate.js
+129
-58
word/Editor/Run.js
word/Editor/Run.js
+1
-1
No files found.
word/Editor/Document.js
View file @
541601ac
...
...
@@ -1665,10 +1665,8 @@ CDocument.prototype.Get_PageContentStartPos2 = function(StartPageIndex, St
var
ColumnAbs
=
(
StartColumnIndex
+
ElementPageIndex
)
-
((
StartColumnIndex
+
ElementPageIndex
)
/
ColumnsCount
|
0
)
*
ColumnsCount
;
var
PageAbs
=
StartPageIndex
+
((
StartColumnIndex
+
ElementPageIndex
)
/
ColumnsCount
|
0
);
var
FootnotesHeight
=
this
.
Footnotes
.
GetHeight
(
PageAbs
,
ColumnAbs
);
var
Y
=
SectPr
.
Get_PageMargin_Top
();
var
YLimit
=
SectPr
.
Get_PageHeight
()
-
SectPr
.
Get_PageMargin_Bottom
()
-
FootnotesHeight
;
var
YLimit
=
SectPr
.
Get_PageHeight
()
-
SectPr
.
Get_PageMargin_Bottom
();
var
X
=
SectPr
.
Get_PageMargin_Left
();
var
XLimit
=
SectPr
.
Get_PageWidth
()
-
SectPr
.
Get_PageMargin_Right
();
...
...
@@ -1677,7 +1675,7 @@ CDocument.prototype.Get_PageContentStartPos2 = function(StartPageIndex, St
if
(
this
.
Pages
[
PageAbs
]
&&
this
.
Pages
[
PageAbs
].
Sections
[
SectionIndex
])
{
Y
=
this
.
Pages
[
PageAbs
].
Sections
[
SectionIndex
].
Get_Y
();
YLimit
=
this
.
Pages
[
PageAbs
].
Sections
[
SectionIndex
].
Get_YLimit
()
-
FootnotesHeight
;
YLimit
=
this
.
Pages
[
PageAbs
].
Sections
[
SectionIndex
].
Get_YLimit
();
}
var
HdrFtrLine
=
this
.
HdrFtr
.
Get_HdrFtrLines
(
PageAbs
);
...
...
@@ -2300,7 +2298,6 @@ CDocument.prototype.Recalculate_PageColumn = function()
PageColumn
.
SpaceBefore
=
StartPos
.
ColumnSpaceBefore
;
PageColumn
.
SpaceAfter
=
StartPos
.
ColumnSpaceAfter
;
//var YLimitOrigin = YLimit;
this
.
Footnotes
.
ContinueElementsFromPreviousColumn
(
PageIndex
,
ColumnIndex
,
Y
,
YLimit
);
var
SectElement
=
this
.
SectionsInfo
.
Get_SectPr
(
StartIndex
);
...
...
word/Editor/Footnotes.js
View file @
541601ac
...
...
@@ -215,7 +215,6 @@ CFootnotesController.prototype.ContinueElementsFromPreviousColumn = function(nPa
// Начиная с данной сноски мы все оставшиеся сноски заносим в массив ContinuesElements у данной колонки
var
arrContniuesElements
=
arrElements
.
slice
(
nIndex
);
oColumn
.
SetContinutesElements
(
arrContniuesElements
);
break
;
}
else
if
(
recalcresult2_CurPage
===
nRecalcResult
)
{
...
...
@@ -225,6 +224,9 @@ CFootnotesController.prototype.ContinueElementsFromPreviousColumn = function(nPa
var
oBounds
=
oFootnote
.
Get_PageBounds
(
nRelativePage
);
_Y
+=
oBounds
.
Bottom
-
oBounds
.
Top
;
oColumn
.
Height
=
_Y
;
if
(
recalcresult2_NextPage
===
nRecalcResult
)
break
;
}
}
};
...
...
@@ -255,7 +257,7 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
var
XLimit
=
oColumn
.
XLimit
;
var
_Y
=
oColumn
.
Height
;
var
_YLimit
=
oColumn
.
YLimit
-
oColumn
.
Y
;
var
_YLimit
=
oColumn
.
YLimit
-
Y
;
if
(
oColumn
.
Elements
.
length
<=
0
&&
null
!==
this
.
SeparatorFootnote
)
{
...
...
@@ -306,98 +308,6 @@ CFootnotesController.prototype.RecalculateFootnotes = function(nPageAbs, nColumn
return
true
;
};
/**
* Пересчитываем сноски на заданной странице.
*/
CFootnotesController
.
prototype
.
Recalculate
=
function
(
nPageAbs
,
nColumnAbs
,
Y
,
YLimit
)
{
var
oPrevColumn
=
(
nColumnAbs
>
0
?
this
.
Pages
[
nPageAbs
].
Columns
[
nColumnAbs
-
1
]
:
(
nPageAbs
>
0
?
this
.
Pages
[
nPageAbs
-
1
].
Columns
[
this
.
Pages
[
nPageAbs
-
1
].
Columns
.
length
-
1
]
:
null
));
if
(
true
===
this
.
IsEmptyPageColumn
(
nPageAbs
,
nColumnAbs
)
&&
(
null
===
oPrevColumn
||
true
!==
oPrevColumn
.
Continue
))
return
;
var
oPage
=
this
.
Pages
[
nPageAbs
];
var
oColumn
=
oPage
.
Columns
[
nColumnAbs
];
var
nColumnsCount
=
oPage
.
Columns
.
length
;
var
X
=
oColumn
.
X
;
var
XLimit
=
oColumn
.
XLimit
;
oColumn
.
YLimit
=
YLimit
;
// Мы пересчет начинаем с 0, потом просто делаем сдвиг, через функцию Shift.
if
(
null
!==
oPrevColumn
&&
true
===
oPrevColumn
.
Continue
&&
oPrevColumn
.
Elements
.
length
>
0
)
{
var
oLastFootnote
=
oPrevColumn
.
Elements
[
oPrevColumn
.
Elements
.
length
-
1
];
if
(
oLastFootnote
!==
oColumn
.
Elements
[
0
])
oColumn
.
Elements
.
splice
(
0
,
0
,
oLastFootnote
);
oColumn
.
ContinuePrev
=
true
;
oColumn
.
Y
=
Y
;
}
var
_YLimit
=
YLimit
-
oColumn
.
Y
;
var
CurY
=
0
;
if
(
oColumn
.
ContinuePrev
)
{
if
(
null
!==
this
.
ContinuationSeparatorFootnote
)
{
this
.
ContinuationSeparatorFootnote
.
Prepare_RecalculateObject
();
this
.
ContinuationSeparatorFootnote
.
Reset
(
X
,
CurY
,
XLimit
,
_YLimit
);
this
.
ContinuationSeparatorFootnote
.
Set_StartPage
(
nPageAbs
,
nColumnAbs
,
nColumnsCount
);
this
.
ContinuationSeparatorFootnote
.
Recalculate_Page
(
0
,
true
);
oColumn
.
ContinuationSeparatorRecalculateObject
=
this
.
ContinuationSeparatorFootnote
.
Save_RecalculateObject
();
var
Bounds
=
this
.
ContinuationSeparatorFootnote
.
Get_PageBounds
(
0
);
CurY
+=
Bounds
.
Bottom
-
Bounds
.
Top
;
}
}
else
{
if
(
null
!==
this
.
SeparatorFootnote
)
{
this
.
SeparatorFootnote
.
Prepare_RecalculateObject
();
this
.
SeparatorFootnote
.
Reset
(
X
,
CurY
,
XLimit
,
_YLimit
);
this
.
SeparatorFootnote
.
Set_StartPage
(
nPageAbs
,
nColumnAbs
,
nColumnsCount
);
this
.
SeparatorFootnote
.
Recalculate_Page
(
0
,
true
);
oColumn
.
SeparatorRecalculateObject
=
this
.
SeparatorFootnote
.
Save_RecalculateObject
();
var
Bounds
=
this
.
SeparatorFootnote
.
Get_PageBounds
(
0
);
CurY
+=
Bounds
.
Bottom
-
Bounds
.
Top
;
}
}
oColumn
.
YStart
=
CurY
;
for
(
var
nIndex
=
0
;
nIndex
<
oColumn
.
Elements
.
length
;
++
nIndex
)
{
var
Footnote
=
oColumn
.
Elements
[
nIndex
];
if
(
0
!==
nIndex
||
true
!==
oColumn
.
ContinuePrev
)
{
Footnote
.
Reset
(
X
,
CurY
,
XLimit
,
_YLimit
);
Footnote
.
Set_StartPage
(
nPageAbs
,
nColumnAbs
,
nColumnsCount
);
}
var
nRelativePage
=
Footnote
.
GetElementPageIndex
(
nPageAbs
,
nColumnAbs
);
if
(
recalcresult2_NextPage
===
Footnote
.
Recalculate_Page
(
nRelativePage
,
true
))
{
if
(
nIndex
===
oColumn
.
Elements
.
length
-
1
)
{
// Продолжаем сноску
oColumn
.
Continue
=
true
;
}
else
{
// TODO: Надо пересчитать данную колонку заново, с учетом того, что последнюю сноску необходимо перенести на новую страницу
}
break
;
}
var
Bounds
=
Footnote
.
Get_PageBounds
(
nRelativePage
);
CurY
+=
Bounds
.
Bottom
-
Bounds
.
Top
;
}
this
.
NeedShift
=
true
;
};
/**
* Получаем суммарную высоту, занимаемую сносками на заданной странице.
* @param {number} nPageAbs
...
...
@@ -406,41 +316,11 @@ CFootnotesController.prototype.Recalculate = function(nPageAbs, nColumnAbs, Y, Y
*/
CFootnotesController
.
prototype
.
GetHeight
=
function
(
nPageAbs
,
nColumnAbs
)
{
if
(
true
===
this
.
IsEmptyPageColumn
(
nPageAbs
,
nColumnAbs
))
var
oColumn
=
this
.
private_GetPageColumn
(
nPageAbs
,
nColumnAbs
);
if
(
!
oColumn
)
return
0
;
var
oColumn
=
this
.
Pages
[
nPageAbs
].
Columns
[
nColumnAbs
];
var
nHeight
=
0
;
if
(
true
===
oColumn
.
ContinuePrev
)
{
if
(
null
!==
oColumn
.
ContinuationSeparatorRecalculateObject
)
{
this
.
ContinuationSeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
ContinuationSeparatorRecalculateObject
);
var
oBounds
=
this
.
ContinuationSeparatorFootnote
.
Get_PageBounds
(
0
);
nHeight
+=
oBounds
.
Bottom
-
oBounds
.
Top
;
}
}
else
{
if
(
null
!==
oColumn
.
SeparatorRecalculateObject
)
{
this
.
SeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
SeparatorRecalculateObject
);
var
oBounds
=
this
.
SeparatorFootnote
.
Get_PageBounds
(
0
);
nHeight
+=
oBounds
.
Bottom
-
oBounds
.
Top
;
}
}
for
(
var
nIndex
=
0
,
nCount
=
oColumn
.
Elements
.
length
;
nIndex
<
nCount
;
++
nIndex
)
{
var
oFootnote
=
oColumn
.
Elements
[
nIndex
];
var
nFootnotePageIndex
=
oFootnote
.
GetElementPageIndex
(
nPageAbs
,
nColumnAbs
);
var
oBounds
=
oFootnote
.
Get_PageBounds
(
nFootnotePageIndex
);
nHeight
+=
oBounds
.
Bottom
-
oBounds
.
Top
;
}
return
nHeight
;
return
oColumn
.
Height
;
};
/**
* Отрисовываем сноски на заданной странице.
...
...
@@ -460,21 +340,15 @@ CFootnotesController.prototype.Draw = function(nPageAbs, pGraphics)
if
(
!
oColumn
||
oColumn
.
Elements
.
length
<=
0
)
continue
;
if
(
true
===
oColumn
.
ContinuePrev
)
if
(
null
!==
this
.
ContinuationSeparatorFootnote
&&
null
!==
oColumn
.
ContinuationSeparatorRecalculateObject
)
{
if
(
null
!==
this
.
ContinuationSeparatorFootnote
&&
null
!==
oColumn
.
ContinuationSeparatorRecalculateObject
)
{
this
.
ContinuationSeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
ContinuationSeparatorRecalculateObject
);
this
.
ContinuationSeparatorFootnote
.
Draw
(
nPageAbs
,
pGraphics
);
}
this
.
ContinuationSeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
ContinuationSeparatorRecalculateObject
);
this
.
ContinuationSeparatorFootnote
.
Draw
(
nPageAbs
,
pGraphics
);
}
else
if
(
null
!==
this
.
SeparatorFootnote
&&
null
!==
oColumn
.
SeparatorRecalculateObject
)
{
if
(
null
!==
this
.
SeparatorFootnote
&&
null
!==
oColumn
.
SeparatorRecalculateObject
)
{
this
.
SeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
SeparatorRecalculateObject
);
this
.
SeparatorFootnote
.
Draw
(
nPageAbs
,
pGraphics
);
}
this
.
SeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
SeparatorRecalculateObject
);
this
.
SeparatorFootnote
.
Draw
(
nPageAbs
,
pGraphics
);
}
for
(
var
nIndex
=
0
,
nCount
=
oColumn
.
Elements
.
length
;
nIndex
<
nCount
;
++
nIndex
)
...
...
@@ -494,30 +368,21 @@ CFootnotesController.prototype.Draw = function(nPageAbs, pGraphics)
*/
CFootnotesController
.
prototype
.
Shift
=
function
(
nPageAbs
,
nColumnAbs
,
dX
,
dY
)
{
if
(
true
!==
this
.
NeedShift
)
return
;
var
oColumn
=
this
.
private_GetPageColumn
(
nPageAbs
,
nColumnAbs
);
if
(
!
oColumn
)
return
;
if
(
true
===
oColumn
.
ContinuePrev
)
if
(
null
!==
this
.
ContinuationSeparatorFootnote
&&
null
!==
oColumn
.
ContinuationSeparatorRecalculateObject
)
{
if
(
null
!==
this
.
ContinuationSeparatorFootnote
&&
null
!==
oColumn
.
ContinuationSeparatorRecalculateObject
)
{
this
.
ContinuationSeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
ContinuationSeparatorRecalculateObject
);
this
.
ContinuationSeparatorFootnote
.
Shift
(
0
,
dX
,
dY
);
oColumn
.
ContinuationSeparatorRecalculateObject
=
this
.
ContinuationSeparatorFootnote
.
Save_RecalculateObject
();
}
this
.
ContinuationSeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
ContinuationSeparatorRecalculateObject
);
this
.
ContinuationSeparatorFootnote
.
Shift
(
0
,
dX
,
dY
);
oColumn
.
ContinuationSeparatorRecalculateObject
=
this
.
ContinuationSeparatorFootnote
.
Save_RecalculateObject
();
}
else
if
(
null
!==
this
.
SeparatorFootnote
&&
null
!==
oColumn
.
SeparatorRecalculateObject
)
{
if
(
null
!==
this
.
SeparatorFootnote
&&
null
!==
oColumn
.
SeparatorRecalculateObject
)
{
this
.
SeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
SeparatorRecalculateObject
);
this
.
SeparatorFootnote
.
Shift
(
0
,
dX
,
dY
);
oColumn
.
SeparatorRecalculateObject
=
this
.
SeparatorFootnote
.
Save_RecalculateObject
();
}
this
.
SeparatorFootnote
.
Load_RecalculateObject
(
oColumn
.
SeparatorRecalculateObject
);
this
.
SeparatorFootnote
.
Shift
(
0
,
dX
,
dY
);
oColumn
.
SeparatorRecalculateObject
=
this
.
SeparatorFootnote
.
Save_RecalculateObject
();
}
for
(
var
nIndex
=
0
,
nCount
=
oColumn
.
Elements
.
length
;
nIndex
<
nCount
;
++
nIndex
)
...
...
@@ -526,8 +391,6 @@ CFootnotesController.prototype.Shift = function(nPageAbs, nColumnAbs, dX, dY)
var
nFootnotePageIndex
=
oFootnote
.
GetElementPageIndex
(
nPageAbs
,
nColumnAbs
);
oFootnote
.
Shift
(
nFootnotePageIndex
,
dX
,
dY
);
}
this
.
NeedShift
=
false
;
};
/**
* Добавляем заданную сноску на страницу для пересчета.
...
...
@@ -687,7 +550,7 @@ CFootnotesController.prototype.Get_PageContentStartPos = function(nPageAbs, nCol
if
(
!
oColumn
)
return
{
X
:
0
,
Y
:
0
,
XLimit
:
0
,
YLimit
:
0
};
return
{
X
:
oColumn
.
X
,
Y
:
oColumn
.
YStar
t
,
XLimit
:
oColumn
.
XLimit
,
YLimit
:
oColumn
.
YLimit
-
oColumn
.
Y
};
return
{
X
:
oColumn
.
X
,
Y
:
oColumn
.
Heigh
t
,
XLimit
:
oColumn
.
XLimit
,
YLimit
:
oColumn
.
YLimit
-
oColumn
.
Y
};
};
CFootnotesController
.
prototype
.
GetCurFootnote
=
function
()
{
...
...
@@ -3081,36 +2944,20 @@ function CFootEndnotePageColumn()
this
.
Y
=
0
;
this
.
XLimit
=
0
;
this
.
YLimit
=
0
;
this
.
YStart
=
0
;
// фактически тут задается высота специальной сноски-разделителя
this
.
Height
=
0
;
this
.
ElementsY
=
[];
// Начальная позиция
this
.
Height
=
0
;
this
.
Elements
=
[];
// Элементы, которые пересчитаны на данной странице
this
.
ContniuesElements
=
[];
// Элементы, которые нужно пересчитывать на следующей колонке
this
.
Continue
=
false
;
this
.
ContinuePrev
=
false
;
this
.
SeparatorRecalculateObject
=
null
;
this
.
ContinuationSeparatorRecalculateObject
=
null
;
this
.
ContinuationNoticeRecalculateObject
=
null
;
}
CFootEndnotePageColumn
.
prototype
.
Reset
=
function
()
{
this
.
X
=
0
;
this
.
Y
=
0
;
this
.
XLimit
=
0
;
this
.
YLimit
=
0
;
this
.
YStart
=
0
;
this
.
Elements
=
[];
this
.
Continue
=
false
;
this
.
ContinuePrev
=
false
;
this
.
Height
=
0
;
this
.
Elements
=
[];
this
.
ContniuesElements
=
[];
this
.
SeparatorRecalculateObject
=
null
;
this
.
ContinuationSeparatorRecalculateObject
=
null
;
...
...
word/Editor/Paragraph_Recalculate.js
View file @
541601ac
...
...
@@ -79,11 +79,16 @@ Paragraph.prototype.Recalculate_FastWholeParagraph = function()
// последнюю строку на pageBreak/columnBreak, а во время пересчета смотрим изменяeтся ли положение
// flow-объектов, привязанных к данному параграфу, кроме того, если по какой-то причине пересчет возвращает
// не recalcresult_NextElement, тогда тоже отменяем быстрый пересчет
this
.
m_oPRSW
.
SetFast
(
true
);
var
OldBounds
=
this
.
Pages
[
0
].
Bounds
;
var
isPageBreakLastLine1
=
this
.
Lines
[
this
.
Lines
.
length
-
1
].
Info
&
paralineinfo_BreakPage
;
var
isPageBreakLastLine2
=
this
.
Lines
[
this
.
Lines
.
length
-
1
].
Info
&
paralineinfo_BreakRealPage
;
var
FastRecalcResult
=
this
.
Recalculate_Page
(
0
,
true
);
this
.
m_oPRSW
.
SetFast
(
false
);
if
(
FastRecalcResult
&
recalcresult_NextElement
&&
1
===
this
.
Pages
.
length
&&
true
===
this
.
Pages
[
0
].
Bounds
.
Compare
(
OldBounds
)
...
...
@@ -118,12 +123,17 @@ Paragraph.prototype.Recalculate_FastWholeParagraph = function()
var
OldLinesCount_0
=
this
.
Pages
[
0
].
EndLine
-
this
.
Pages
[
0
].
StartLine
+
1
;
var
OldLinesCount_1
=
this
.
Pages
[
1
].
EndLine
-
this
.
Pages
[
1
].
StartLine
+
1
;
var
FastRecalcResult
=
this
.
Recalculate_Page
(
0
,
true
);
this
.
m_oPRSW
.
SetFast
(
true
);
var
FastRecalcResult
=
this
.
Recalculate_Page
(
0
,
true
);
if
(
!
(
FastRecalcResult
&
recalcresult_NextPage
))
return
[];
if
(
!
(
FastRecalcResult
&
recalcresult_NextPage
))
{
this
.
m_oPRSW
.
SetFast
(
false
);
return
[];
}
FastRecalcResult
=
this
.
Recalculate_Page
(
1
);
this
.
m_oPRSW
.
SetFast
(
false
);
if
(
!
(
FastRecalcResult
&
recalcresult_NextElement
))
return
[];
...
...
@@ -252,6 +262,8 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
var
PrevLine
=
Line
;
var
PrevRange
=
Range
;
this
.
m_oPRSW
.
SetFast
(
true
);
while
(
PrevLine
>=
0
)
{
PrevRange
--
;
...
...
@@ -317,7 +329,10 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
{
var
TempResult
=
this
.
private_RecalculateFastRange
(
CurRange
,
CurLine
);
if
(
-
1
===
TempResult
)
return
-
1
;
{
this
.
m_oPRSW
.
SetFast
(
false
);
return
-
1
;
}
if
(
CurLine
===
Line
&&
CurRange
===
Range
)
Result
=
TempResult
;
...
...
@@ -339,12 +354,13 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
//console.log("Recalc Fast Range");
this
.
m_oPRSW
.
SetFast
(
false
);
return
this
.
Get_AbsolutePage
(
Result
);
};
/**
* Функция для пересчета страницы параграфа.
* @param {number}
PageIndex
- Номер страницы, которую нужно пересчитать (относительный номер страницы для параграфа).
* @param {number}
CurPage
- Номер страницы, которую нужно пересчитать (относительный номер страницы для параграфа).
* Предыдущая страница ДОЛЖНА быть пересчитана, если задано не нулевое значение.
* @returns {*} Возвращается результат пересчета
*/
...
...
@@ -1307,6 +1323,9 @@ Paragraph.prototype.private_RecalculateLinePosition = function(CurLine, CurPa
Bottom
+=
ParaPr
.
Brd
.
Between
.
Space
;
}
// TODO: Здесь нужно сделать корректировку YLimit с учетом сносок. Надо разобраться почему вообще здесь
// используется this.YLimit вместо Page.YLimit
if
(
false
===
this
.
Parent
.
Is_TableCellContent
()
&&
Bottom
>
this
.
YLimit
&&
Bottom
-
this
.
YLimit
<=
ParaPr
.
Spacing
.
After
)
Bottom
=
this
.
YLimit
;
}
...
...
@@ -1343,14 +1362,31 @@ Paragraph.prototype.private_RecalculateLineBottomBound = function(CurLine, CurPa
var
RealCurPage
=
this
.
private_GetRelativePageIndex
(
CurPage
)
-
this
.
Get_StartPage_Relative
();
var
YLimit
=
PRS
.
YLimit
;
var
oTopDocument
=
PRS
.
TopDocument
;
var
bNoFootnotes
=
true
;
if
(
oTopDocument
instanceof
CDocument
&&
oTopDocument
.
Footnotes
.
GetHeight
(
PRS
.
PageAbs
,
PRS
.
ColumnAbs
)
>
0.001
)
bNoFootnotes
=
false
;
if
(
oTopDocument
instanceof
CDocument
)
{
// bNoFootnotes - означает есть или нет сноска на данной колонке
var
nHeight
=
oTopDocument
.
Footnotes
.
GetHeight
(
PRS
.
PageAbs
,
PRS
.
ColumnAbs
);
if
(
nHeight
>
0.001
)
{
bNoFootnotes
=
false
;
YLimit
-=
nHeight
;
}
}
else
if
(
oTopDocument
instanceof
CFootEndnote
)
{
// bNoFootnotes - означает, первая или нет данная сноска в колонке. Если она не первая,
// тогда если у нее не убирается первая строка первого параграфа, все равно надо делать перенос
var
oLogicDocument
=
this
.
LogicDocument
;
if
(
true
!==
oLogicDocument
.
Footnotes
.
IsEmptyPageColumn
(
PRS
.
PageAbs
,
PRS
.
ColumnAbs
))
bNoFootnotes
=
false
;
}
// Сначала проверяем не нужно ли сделать перенос страницы в данном месте
// Перенос не делаем, если это первая строка на новой странице
if
(
true
===
this
.
Use_YLimit
()
&&
(
Top
>
PRS
.
YLimit
||
Bottom2
>
PRS
.
YLimit
)
&&
(
CurLine
!=
this
.
Pages
[
CurPage
].
FirstLine
||
false
===
bNoFootnotes
||
(
0
===
RealCurPage
&&
(
null
!=
this
.
Get_DocumentPrev
()
||
(
true
===
this
.
Parent
.
Is_TableCellContent
()
&&
true
!==
this
.
Parent
.
Is_TableFirstRowOnNewPage
()))))
&&
false
===
BreakPageLineEmpty
)
if
(
true
===
this
.
Use_YLimit
()
&&
(
Top
>
YLimit
||
Bottom2
>
YLimit
)
&&
(
CurLine
!=
this
.
Pages
[
CurPage
].
FirstLine
||
false
===
bNoFootnotes
||
(
0
===
RealCurPage
&&
(
null
!=
this
.
Get_DocumentPrev
()
||
(
true
===
this
.
Parent
.
Is_TableCellContent
()
&&
true
!==
this
.
Parent
.
Is_TableFirstRowOnNewPage
()))))
&&
false
===
BreakPageLineEmpty
)
{
// TODO: Неразрывные абзацы и висячие строки внутри колонок вместе с плавающими объектами пока не обсчитываем
var
bSkipWidowAndKeepLines
=
this
.
private_CheckSkipKeepLinesAndWidowControl
(
CurPage
);
...
...
@@ -1835,56 +1871,84 @@ Paragraph.prototype.private_RecalculateLineCheckFootnotes = function(CurLine, Cu
if
(
!
((
PRS
.
RecalcResult
&
recalcresult_NextElement
)
||
(
PRS
.
RecalcResult
&
recalcresult_NextLine
)))
return
false
;
var
oTopDocument
=
PRS
.
TopDocument
;
for
(
var
nIndex
=
0
,
nCount
=
PRS
.
Footnotes
.
length
;
nIndex
<
nCount
;
++
nIndex
)
{
var
oFootnote
=
PRS
.
Footnotes
[
nIndex
].
FootnoteReference
.
Get_Footnote
();
var
oPos
=
PRS
.
Footnotes
[
nIndex
].
Pos
;
// Проверим позицию
if
(
true
===
this
.
MoveToLBP
&&
PRS
.
LineBreakPos
.
Compare
(
oPos
)
>=
0
)
return
true
;
// TODO: Здесь надо разобраться с параграфами внутри таблицы.
if
(
oTopDocument
instanceof
CDocument
)
{
var
RecalcInfo
=
oTopDocument
.
RecalcInfo
;
var
nPageAbs
=
PRS
.
PageAbs
;
var
nColumnAbs
=
PRS
.
ColumnAbs
;
if
(
true
===
RecalcInfo
.
Can_RecalcObject
())
{
RecalcInfo
.
Set_FootnoteReference
(
oFootnote
,
nPageAbs
,
nColumnAbs
);
oTopDocument
.
Footnotes
.
AddFootnoteToPage
(
nPageAbs
,
nColumnAbs
,
oFootnote
,
this
.
Pages
[
CurPage
].
Y
+
this
.
Lines
[
CurLine
].
Bottom
);
PRS
.
RecalcResult
=
recalcresult_CurPage
|
recalcresultflags_Column
|
recalcresultflags_Footnotes
;
return
false
;
}
else
if
(
true
===
RecalcInfo
.
Check_FootnoteReference
(
oFootnote
))
{
if
(
true
===
RecalcInfo
.
Is_PageBreakBefore
())
{
//PRS.RecalcResult
}
if
(
PRS
.
Fast
)
return
true
;
if
(
nPageAbs
===
RecalcInfo
.
FootnotePage
&&
nColumnAbs
===
RecalcInfo
.
FootnoteColumn
)
{
// Все нормально пересчиталось
RecalcInfo
.
Reset_FootnoteReference
();
}
else
{
// TODO: Реализовать
RecalcInfo
.
Set_PageBreakBefore
(
true
);
oTopDocument
.
Footnotes
.
RemoveFootnoteFromPage
(
nPageAbs
,
nColumnAbs
,
oFootnote
);
PRS
.
RecalcResult
=
recalcresult_CurPage
|
recalcresultflags_Column
|
recalcresultflags_Footnotes
;
return
false
;
}
}
else
{
// Ничего не делаем, просто пропускаем ссылку на данную сноску
}
}
}
var
oTopDocument
=
PRS
.
TopDocument
;
// for (var nIndex = 0, nCount = PRS.Footnotes.length; nIndex < nCount; ++nIndex)
// {
// var oFootnote = PRS.Footnotes[nIndex].FootnoteReference.Get_Footnote();
// var oPos = PRS.Footnotes[nIndex].Pos;
//
// // Проверим позицию
// if (true === this.MoveToLBP && PRS.LineBreakPos.Compare(oPos) >= 0)
// return true;
//
// // TODO: Здесь надо разобраться с параграфами внутри таблицы.
// if (oTopDocument instanceof CDocument)
// {
// var RecalcInfo = oTopDocument.RecalcInfo;
// var nPageAbs = PRS.PageAbs;
// var nColumnAbs = PRS.ColumnAbs;
// if (true === RecalcInfo.Can_RecalcObject())
// {
// RecalcInfo.Set_FootnoteReference(oFootnote, nPageAbs, nColumnAbs);
// oTopDocument.Footnotes.AddFootnoteToPage(nPageAbs, nColumnAbs, oFootnote, this.Pages[CurPage].Y + this.Lines[CurLine].Bottom);
// PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column | recalcresultflags_Footnotes;
// return false;
// }
// else if (true === RecalcInfo.Check_FootnoteReference(oFootnote))
// {
// if (true === RecalcInfo.Is_PageBreakBefore())
// {
// //PRS.RecalcResult
// }
//
// if (nPageAbs === RecalcInfo.FootnotePage && nColumnAbs === RecalcInfo.FootnoteColumn)
// {
// // Все нормально пересчиталось
// RecalcInfo.Reset_FootnoteReference();
// }
// else
// {
// // TODO: Реализовать
// RecalcInfo.Set_PageBreakBefore(true);
// oTopDocument.Footnotes.RemoveFootnoteFromPage(nPageAbs, nColumnAbs, oFootnote);
// PRS.RecalcResult = recalcresult_CurPage | recalcresultflags_Column | recalcresultflags_Footnotes;
// return false;
// }
// }
// else
// {
// // Ничего не делаем, просто пропускаем ссылку на данную сноску
// }
// }
// }
var
arrFootnotes
=
[];
for
(
var
nIndex
=
0
,
nCount
=
PRS
.
Footnotes
.
length
;
nIndex
<
nCount
;
++
nIndex
)
{
var
oFootnote
=
PRS
.
Footnotes
[
nIndex
].
FootnoteReference
.
Get_Footnote
();
var
oPos
=
PRS
.
Footnotes
[
nIndex
].
Pos
;
// Проверим позицию
if
(
true
===
this
.
MoveToLBP
&&
PRS
.
LineBreakPos
.
Compare
(
oPos
)
>=
0
)
return
true
;
arrFootnotes
.
push
(
oFootnote
);
}
if
(
oTopDocument
instanceof
CDocument
)
{
if
(
oTopDocument
.
Footnotes
.
RecalculateFootnotes
(
PRS
.
PageAbs
,
PRS
.
ColumnAbs
,
this
.
Pages
[
CurPage
].
Y
+
this
.
Lines
[
CurLine
].
Bottom
,
arrFootnotes
))
{
// Все нормально
}
else
{
console
.
log
(
"
Данную строчку нужно перенести на новую строку
"
);
}
}
return
true
;
};
...
...
@@ -2527,6 +2591,8 @@ function CParagraphRecalculateStateWrap(Para)
this
.
PageAbs
=
0
;
this
.
ColumnAbs
=
0
;
this
.
Fast
=
false
;
// Быстрый ли пересчет
//
this
.
Page
=
0
;
this
.
Line
=
0
;
...
...
@@ -2946,7 +3012,12 @@ CParagraphRecalculateStateWrap.prototype =
Add_FootnoteReference
:
function
(
FootnoteReference
,
Pos
)
{
this
.
Footnotes
.
push
({
FootnoteReference
:
FootnoteReference
,
Pos
:
Pos
});
}
},
SetFast
:
function
(
bValue
)
{
this
.
Fast
=
bValue
;
}
};
function
CParagraphRecalculateStateCounter
()
...
...
word/Editor/Run.js
View file @
541601ac
...
...
@@ -1404,7 +1404,7 @@ ParaRun.prototype.Is_SimpleChanges = function(Changes)
// нельзя обсчитывать функцией Recalculate_Fast.
// TODO: Но на самом деле стоило бы сделать нормальную проверку на высоту строки в функции Recalculate_Fast
var
ItemType
=
Item
.
Type
;
if
(
para_Drawing
===
ItemType
||
para_NewLine
===
ItemType
)
if
(
para_Drawing
===
ItemType
||
para_NewLine
===
ItemType
||
para_FootnoteRef
===
ItemType
||
para_FootnoteReference
===
ItemType
)
return
false
;
// Проверяем, что все изменения произошли в одном и том же отрезке
...
...
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