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

Исправлен баг в сохранении документа (баг 26649). Исправлен баг с обновлением...

Исправлен баг в сохранении документа (баг 26649). Исправлен баг с обновлением линеек после Undo/Redo, или изменения ориентации, размера страниц или полей, или изменения положения буквицы  (баги 26655, 26621, 26597, 26593). Исправлен баг с перескаиванием в конец документа при нажатии Ctrl+A (баг 26607). Исправлен баг с быстрым пересчетом в пустом параграфе с окончанием секции (баг 26606). Исправлен баг с пересчетом строк с переносом строки (баг 26677). Исправлен баг с пересчетом строки с разрывом параграфа(баг 26678). Исправлен баг с рассчетом текста, который идет в одном ране с автофигурой (баг 26667). Сделано, чтобы знак закрывающейся ковычки воспринимался как апостроф для орфографии (баг 26626). Исправлены баги, связанные с работой цвета текста (баги 26594, 26592).

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@58494 954022d7-b5bf-4e40-9824-e11837661b57
parent 7c0e6105
...@@ -569,7 +569,7 @@ function CCollaborativeChanges() ...@@ -569,7 +569,7 @@ function CCollaborativeChanges()
if ( "undefined" != typeof(Class.Save_Changes2) ) if ( "undefined" != typeof(Class.Save_Changes2) )
{ {
var Writer2 = CollaborativeEditing.m_oMemory; var Writer2 = CollaborativeEditing.m_oMemory;
Writer.Seek(0); Writer2.Seek(0);
if ( true === Class.Save_Changes2( Data, Writer2 ) ) if ( true === Class.Save_Changes2( Data, Writer2 ) )
return Len + ";" + Writer.GetBase64Memory2(Pos, Len) + ";" + Writer2.GetCurPosition() + ";" + Writer2.GetBase64Memory(); return Len + ";" + Writer.GetBase64Memory2(Pos, Len) + ";" + Writer2.GetCurPosition() + ";" + Writer2.GetBase64Memory();
} }
......
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
// //
// Графическая часть: // Графическая часть:
// TODO: Сейчас Paragraph.Recalculate_FastWholePAragraph работает только на добавлении текста, надо переделать
// алгоритм определения изменений, чтобы данная функция работала и при других изменениях.
var Page_Width = 210; var Page_Width = 210;
var Page_Height = 297; var Page_Height = 297;
...@@ -7524,6 +7527,7 @@ CDocument.prototype = ...@@ -7524,6 +7527,7 @@ CDocument.prototype =
this.Document_UpdateSelectionState(); this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState(); this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
}, },
Set_DocumentPageSize : function(W, H, bNoRecalc) Set_DocumentPageSize : function(W, H, bNoRecalc)
...@@ -7542,6 +7546,7 @@ CDocument.prototype = ...@@ -7542,6 +7546,7 @@ CDocument.prototype =
this.Document_UpdateSelectionState(); this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState(); this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
} }
}, },
...@@ -7575,6 +7580,7 @@ CDocument.prototype = ...@@ -7575,6 +7580,7 @@ CDocument.prototype =
this.Document_UpdateSelectionState(); this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState(); this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
} }
}, },
...@@ -8591,9 +8597,13 @@ CDocument.prototype = ...@@ -8591,9 +8597,13 @@ CDocument.prototype =
} }
} }
// TODO: Пока делаем Start = true, чтобы при Ctrl+A не происходил переход к концу селекта, надо будет
// сделать по нормальному
this.Selection.Start = true;
this.Document_UpdateSelectionState(); this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState(); this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState(); this.Document_UpdateRulersState();
this.Selection.Start = false;
}, },
On_DragTextEnd : function(NearPos, bCopy) On_DragTextEnd : function(NearPos, bCopy)
...@@ -9565,6 +9575,7 @@ CDocument.prototype = ...@@ -9565,6 +9575,7 @@ CDocument.prototype =
else if ( e.KeyCode == 65 && true === e.CtrlKey ) // Ctrl + A - выделяем все else if ( e.KeyCode == 65 && true === e.CtrlKey ) // Ctrl + A - выделяем все
{ {
this.Select_All(); this.Select_All();
bUpdateSelection = false;
bRetValue = true; bRetValue = true;
} }
else if ( e.KeyCode == 66 && false === editor.isViewMode && true === e.CtrlKey ) // Ctrl + B - делаем текст жирным else if ( e.KeyCode == 66 && false === editor.isViewMode && true === e.CtrlKey ) // Ctrl + B - делаем текст жирным
...@@ -11893,6 +11904,7 @@ CDocument.prototype = ...@@ -11893,6 +11904,7 @@ CDocument.prototype =
this.Document_UpdateSelectionState(); this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState(); this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
}, },
Document_Redo : function() Document_Redo : function()
...@@ -11909,6 +11921,7 @@ CDocument.prototype = ...@@ -11909,6 +11921,7 @@ CDocument.prototype =
this.Document_UpdateSelectionState(); this.Document_UpdateSelectionState();
this.Document_UpdateInterfaceState(); this.Document_UpdateInterfaceState();
this.Document_UpdateRulersState();
}, },
Get_SelectionState : function() Get_SelectionState : function()
......
...@@ -8816,6 +8816,7 @@ Paragraph.prototype = ...@@ -8816,6 +8816,7 @@ Paragraph.prototype =
LogicDocument.Recalculate(); LogicDocument.Recalculate();
LogicDocument.Document_UpdateInterfaceState(); LogicDocument.Document_UpdateInterfaceState();
LogicDocument.Document_UpdateRulersState();
} }
}, },
......
...@@ -80,6 +80,8 @@ g_aPunctuation[0x201C] = 1; // символ “ ...@@ -80,6 +80,8 @@ g_aPunctuation[0x201C] = 1; // символ “
g_aPunctuation[0x201D] = 1; // символ ” g_aPunctuation[0x201D] = 1; // символ ”
g_aPunctuation[0x2026] = 1; // символ ... g_aPunctuation[0x2026] = 1; // символ ...
var g_aNumber = []; var g_aNumber = [];
g_aNumber[0x0030] = 1; g_aNumber[0x0030] = 1;
g_aNumber[0x0031] = 1; g_aNumber[0x0031] = 1;
...@@ -271,6 +273,21 @@ ParaText.prototype = ...@@ -271,6 +273,21 @@ ParaText.prototype =
return (this.Flags & PARATEXT_FLAGS_SPACEAFTER ? true : false); return (this.Flags & PARATEXT_FLAGS_SPACEAFTER ? true : false);
}, },
Get_CharForSpellCheck : function(bCaps)
{
// Закрывающуюся кавычку (0x2019), посылаем как апостроф
if (0x2019 === this.Value)
return String.fromCharCode(0x0027);
else
{
if (true === bCaps)
return (String.fromCharCode(this.Value)).toUpperCase();
else
return String.fromCharCode(this.Value);
}
},
Set_SpaceAfter : function(bSpaceAfter) Set_SpaceAfter : function(bSpaceAfter)
{ {
if (bSpaceAfter ) if (bSpaceAfter )
...@@ -608,7 +625,10 @@ ParaTextPr.prototype = ...@@ -608,7 +625,10 @@ ParaTextPr.prototype =
this.Set_FontSizeCS( TextPr.FontSizeCS ); this.Set_FontSizeCS( TextPr.FontSizeCS );
if ( undefined != TextPr.Color ) if ( undefined != TextPr.Color )
this.Set_Color( TextPr.Color ); {
this.Set_Color(TextPr.Color);
this.Set_Unifill(undefined);
}
if ( undefined != TextPr.VertAlign ) if ( undefined != TextPr.VertAlign )
this.Set_VertAlign( TextPr.VertAlign ); this.Set_VertAlign( TextPr.VertAlign );
...@@ -643,6 +663,7 @@ ParaTextPr.prototype = ...@@ -643,6 +663,7 @@ ParaTextPr.prototype =
if(undefined != TextPr.Unifill) if(undefined != TextPr.Unifill)
{ {
this.Set_Unifill(TextPr.Unifill.createDuplicate()); this.Set_Unifill(TextPr.Unifill.createDuplicate());
this.Set_Color(undefined);
} }
}, },
...@@ -1071,11 +1092,13 @@ ParaTextPr.prototype = ...@@ -1071,11 +1092,13 @@ ParaTextPr.prototype =
Set_Unifill : function(Value) Set_Unifill : function(Value)
{ {
var OldValue = this.Value.Unifill;
if ( undefined != Value ) if ( undefined != Value )
this.Value.Unifill = Value; this.Value.Unifill = Value;
else else
this.Value.Unifill = undefined; this.Value.Unifill = undefined;
History.Add(this, {Type: historyitem_TextPr_Unifill, New: Value, Old: this.Value.Unifill}); History.Add(this, {Type: historyitem_TextPr_Unifill, New: Value, Old: OldValue});
}, },
//----------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------
// Undo/Redo функции // Undo/Redo функции
......
...@@ -21,6 +21,10 @@ Paragraph.prototype.Recalculate_FastWholeParagraph = function() ...@@ -21,6 +21,10 @@ Paragraph.prototype.Recalculate_FastWholeParagraph = function()
if (true === this.Parent.Is_HdrFtr(false)) if (true === this.Parent.Is_HdrFtr(false))
return []; return [];
// Если изменения происходят в специальном пустом параграфе-конце секции, тогда запускаем обычный пересчет
if (true === this.LogicDocument.Pages[this.Get_StartPage_Absolute()].Check_EndSectionPara(this))
return [];
// Здесь мы отдельно обрабатываем случаи быстрого пересчета параграфов, которые были разбиты на 1-2 // Здесь мы отдельно обрабатываем случаи быстрого пересчета параграфов, которые были разбиты на 1-2
// страницы. Если параграф был разбит более чем на 2 страницы, то такое ускорение уже не имеет смысла. // страницы. Если параграф был разбит более чем на 2 страницы, то такое ускорение уже не имеет смысла.
if (1 === this.Pages.length) if (1 === this.Pages.length)
...@@ -139,7 +143,7 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges) ...@@ -139,7 +143,7 @@ Paragraph.prototype.Recalculate_FastRange = function(SimpleChanges)
} }
// Если у нас есть PageBreak в строке, запускаем обычный пересчет, либо если это пустой параграф. // Если у нас есть PageBreak в строке, запускаем обычный пересчет, либо если это пустой параграф.
if ( this.Lines[Line].LineInfo & 1 || ( this.Lines[Line].LineInfo & 2 && this.Lines[Line].LineInfo & 4 ) ) if (this.Lines[Line].Info & paralineinfo_BreakPage || (this.Lines[Line].Info & paralineinfo_Empty && this.Lines[Line].Info & paralineinfo_End))
return -1; return -1;
// Если у нас отрезок, в котором произошли изменения является отрезком с нумерацией, тогда надо запустить // Если у нас отрезок, в котором произошли изменения является отрезком с нумерацией, тогда надо запустить
...@@ -696,48 +700,48 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa ...@@ -696,48 +700,48 @@ Paragraph.prototype.private_RecalculateLine = function(CurLine, CurPa
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 1. Заполняем информацию о строке // 5. Заполняем информацию о строке
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
this.private_RecalculateLineInfo(CurLine, CurPage, PRS, ParaPr); this.private_RecalculateLineInfo(CurLine, CurPage, PRS, ParaPr);
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 1. Пересчитываем метрики данной строки // 6. Пересчитываем метрики данной строки
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
this.private_RecalculateLineMetrics(CurLine, CurPage, PRS, ParaPr); this.private_RecalculateLineMetrics(CurLine, CurPage, PRS, ParaPr);
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 2. Рассчитываем высоту строки, а также положение верхней и нижней границ // 7. Рассчитываем высоту строки, а также положение верхней и нижней границ
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
this.private_RecalculateLinePosition(CurLine, CurPage, PRS, ParaPr); this.private_RecalculateLinePosition(CurLine, CurPage, PRS, ParaPr);
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 3. Проверяем достигла ли данная строка конца страницы // 8. Проверяем достигла ли данная строка конца страницы
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineBottomBound(CurLine, CurPage, PRS, ParaPr)) if (false === this.private_RecalculateLineBottomBound(CurLine, CurPage, PRS, ParaPr))
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 4. Проверяем обтекание данной строки относительно плавающих объектов // 9. Проверяем обтекание данной строки относительно плавающих объектов
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineCheckRanges(CurLine, CurPage, PRS, ParaPr)) if (false === this.private_RecalculateLineCheckRanges(CurLine, CurPage, PRS, ParaPr))
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 5. Выставляем вертикальное смещение данной строки // 10. Пересчитываем сдвиги элементов внутри параграфа и видимые ширины пробелов, в зависимости от align.
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineBaseLine(CurLine, CurPage, PRS, ParaPr)) this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, false);
return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 6. Последние проверки // 11. Выставляем вертикальное смещение данной строки
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
if (false === this.private_RecalculateLineEnd(CurLine, CurPage, PRS, ParaPr)) if (false === this.private_RecalculateLineBaseLine(CurLine, CurPage, PRS, ParaPr))
return; return;
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
// 7. Пересчитываем сдвиги элементов внутри параграфа и видимые ширины пробелов, в зависимости от align. // 12. Последние проверки
//------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------
this.private_RecalculateLineAlign(CurLine, CurPage, PRS, ParaPr, false); if (false === this.private_RecalculateLineEnd(CurLine, CurPage, PRS, ParaPr))
return;
}; };
Paragraph.prototype.private_RecalculateLineWidow = function(CurLine, CurPage, PRS, ParaPr) Paragraph.prototype.private_RecalculateLineWidow = function(CurLine, CurPage, PRS, ParaPr)
...@@ -850,7 +854,7 @@ Paragraph.prototype.private_RecalculateLineMetrics = function(CurLine, CurPa ...@@ -850,7 +854,7 @@ Paragraph.prototype.private_RecalculateLineMetrics = function(CurLine, CurPa
// текста, на котором закончилась данная строка. // текста, на котором закончилась данная строка.
if ( true === PRS.EmptyLine || PRS.LineAscent < 0.001 ) if ( true === PRS.EmptyLine || PRS.LineAscent < 0.001 )
{ {
var LastItem = ( true === PRS.End ? this.Content[this.Content.length - 1] : this.Content[this.Lines[CurLine].EndPos] ); var LastItem = (true === PRS.End ? this.Content[this.Content.length - 1] : this.Content[this.Lines[CurLine].Ranges[this.Lines[CurLine].Ranges.length - 1].EndPos]);
if ( true === PRS.End ) if ( true === PRS.End )
{ {
...@@ -1293,7 +1297,7 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa ...@@ -1293,7 +1297,7 @@ Paragraph.prototype.private_RecalculateLineEnd = function(CurLine, CurPa
if ( true === ParaPr.WidowControl && CurLine === this.Pages[CurPage].StartLine && CurLine >= 1 ) if ( true === ParaPr.WidowControl && CurLine === this.Pages[CurPage].StartLine && CurLine >= 1 )
{ {
// Проверим не встречается ли в предыдущей строке BreakPage, если да, тогда не учитываем WidowControl // Проверим не встречается ли в предыдущей строке BreakPage, если да, тогда не учитываем WidowControl
var BreakPagePrevLine = (this.Lines[CurLine].Info & paralineinfo_BreakPage) | 0; var BreakPagePrevLine = (this.Lines[CurLine - 1].Info & paralineinfo_BreakPage) | 0;
if ( this.Parent instanceof CDocument && true === this.Parent.RecalcInfo.Can_RecalcObject() && 0 === BreakPagePrevLine && ( 1 === CurPage && null != this.Get_DocumentPrev() ) && this.Lines[CurLine - 1].Ranges.length <= 1 ) if ( this.Parent instanceof CDocument && true === this.Parent.RecalcInfo.Can_RecalcObject() && 0 === BreakPagePrevLine && ( 1 === CurPage && null != this.Get_DocumentPrev() ) && this.Lines[CurLine - 1].Ranges.length <= 1 )
{ {
......
...@@ -1459,6 +1459,13 @@ ParaRun.prototype.Recalculate_MeasureContent = function() ...@@ -1459,6 +1459,13 @@ ParaRun.prototype.Recalculate_MeasureContent = function()
} }
Item.Measure( g_oTextMeasurer, Pr ); Item.Measure( g_oTextMeasurer, Pr );
if (para_Drawing === Item.Type)
{
// После автофигур надо заново выставлять настройки
g_oTextMeasurer.SetTextPr(Pr, Theme);
g_oTextMeasurer.SetFontSlot(fontslot_ASCII);
}
} }
this.RecalcInfo.Recalc = true; this.RecalcInfo.Recalc = true;
...@@ -3520,6 +3527,7 @@ ParaRun.prototype.Draw_Elements = function(PDSE) ...@@ -3520,6 +3527,7 @@ ParaRun.prototype.Draw_Elements = function(PDSE)
EndTextPr.Unifill.check(PDSE.Theme, PDSE.ColorMap); EndTextPr.Unifill.check(PDSE.Theme, PDSE.ColorMap);
var RGBAEnd = EndTextPr.Unifill.getRGBAColor(); var RGBAEnd = EndTextPr.Unifill.getRGBAColor();
pGraphics.SetTextPr(EndTextPr, PDSE.Theme); pGraphics.SetTextPr(EndTextPr, PDSE.Theme);
pGraphics.b_color1(RGBAEnd.R, RGBAEnd.G, RGBAEnd.B, 255);
} }
else else
{ {
......
...@@ -933,20 +933,14 @@ ParaRun.prototype.Check_Spelling = function(SpellCheckerEngine, Depth) ...@@ -933,20 +933,14 @@ ParaRun.prototype.Check_Spelling = function(SpellCheckerEngine, Depth)
bWord = true; bWord = true;
if ( true != CurTextPr.Caps ) sWord = Item.Get_CharForSpellCheck(CurTextPr.Caps);
sWord = String.fromCharCode(Item.Value);
else
sWord = (String.fromCharCode(Item.Value)).toUpperCase();
SpellCheckerEngine.StartPos = StartPos; SpellCheckerEngine.StartPos = StartPos;
SpellCheckerEngine.EndPos = EndPos; SpellCheckerEngine.EndPos = EndPos;
} }
else else
{ {
if ( true != CurTextPr.Caps ) sWord += Item.Get_CharForSpellCheck(CurTextPr.Caps);
sWord += String.fromCharCode(Item.Value);
else
sWord += (String.fromCharCode(Item.Value)).toUpperCase();
var EndPos = ContentPos.Copy(); var EndPos = ContentPos.Copy();
EndPos.Update( Pos + 1, Depth ); EndPos.Update( Pos + 1, Depth );
......
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