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

Исправлен баг с определением попадание в текст.

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@56747 954022d7-b5bf-4e40-9824-e11837661b57
parent 558223bb
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// При добавлении нового элемента ParagraphContent, добавить его обработку в // При добавлении нового элемента ParagraphContent, добавить его обработку в
// следующие функции: // следующие функции:
// Internal_Recalculate1, Internal_Recalculate2, Draw, Add, Internal_GetContentPosByXY, // Internal_Recalculate1, Internal_Recalculate2, Draw, Add,
// Selection_SetEnd, Selection_CalculateTextPr, IsEmpty, Selection_IsEmpty, // Selection_SetEnd, Selection_CalculateTextPr, IsEmpty, Selection_IsEmpty,
// Cursor_IsStart, Cursor_IsEnd, Is_ContentOnFirstPage // Cursor_IsStart, Cursor_IsEnd, Is_ContentOnFirstPage
...@@ -5854,21 +5854,6 @@ Paragraph.prototype = ...@@ -5854,21 +5854,6 @@ Paragraph.prototype =
return this.Selection.Use; return this.Selection.Use;
}, },
Internal_SelectMath : function(Pos)
{
if ( undefined === this.Content[Pos] || para_Math != this.Content[Pos].Type )
return;
this.Selection.Use = true;
this.Selection.Start = false;
this.Selection.StartPos = Pos;
this.Selection.EndPos = Pos + 1;
this.Selection.StartPos2 = Pos;
this.Selection.EndPos2 = Pos;
this.Document_SetThisElementCurrent();
},
// Функция определяет начальную позицию курсора в параграфе // Функция определяет начальную позицию курсора в параграфе
Internal_GetStartPos : function() Internal_GetStartPos : function()
{ {
...@@ -6038,429 +6023,6 @@ Paragraph.prototype = ...@@ -6038,429 +6023,6 @@ Paragraph.prototype =
return CenterRunPos; return CenterRunPos;
}, },
Internal_AddHyperlink : function(Hyperlink_start)
{
// Создаем текстовую настройку для гиперссылки
var Hyperlink_end = new ParaHyperlinkEnd();
var RStyle = editor.WordControl.m_oLogicDocument.Get_Styles().Get_Default_Hyperlink();
if ( true === this.ApplyToAll )
{
// TODO: Надо выяснить, нужно ли в данном случае делать гиперссылку
return;
}
var CurPos = this.CurPos.ContentPos;
if ( true === this.Selection.Use )
{
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if ( StartPos > EndPos )
{
var Temp = EndPos;
EndPos = StartPos;
StartPos = Temp;
}
// Если селект продолжается до конца параграфа, не ставим отметку в конце
var LastPos = this.Internal_GetEndPos();
if ( EndPos > LastPos )
EndPos = LastPos;
var TextPr_end = this.Internal_GetTextPr( EndPos );
var TextPr_start = this.Internal_GetTextPr( StartPos );
TextPr_start.RStyle = RStyle;
TextPr_start.Underline = undefined;
TextPr_start.Color = undefined;
this.Internal_Content_Add( EndPos, new ParaTextPr( TextPr_end ) );
this.Internal_Content_Add( EndPos, Hyperlink_end );
this.Internal_Content_Add( StartPos, new ParaTextPr( TextPr_start ) );
this.Internal_Content_Add( StartPos, Hyperlink_start );
// Если внутри выделения были изменения текстовых настроек, тогда удаляем только те записи, которые
// меняются сейчас. Например, у нас изменен только размер шрифта, то удаляем запись о размере шрифта.
for ( var Pos = StartPos + 2; Pos < EndPos + 1; Pos++ )
{
if ( this.Content[Pos].Type == para_TextPr )
{
var Item = this.Content[Pos];
Item.Set_RStyle( RStyle );
Item.Set_Underline( undefined );
Item.Set_Color( undefined );
}
}
return;
}
return;
// При изменении шрифта ведем себе следующим образом:
// 1. Если мы в конце параграфа, тогда добавляем запись о шрифте (применимо к знаку конца параграфа)
// 2. Если справа или слева стоит пробел (начало параграфа или перенос строки(командный)), тогда ставим метку со шрифтом и фокусим канву.
// 3. Если мы посередине слова, тогда меняем шрифт для данного слова
var oEnd = this.Internal_FindForward ( CurPos, [para_PageNum, para_Drawing, para_Tab, para_Text, para_Space, para_End, para_NewLine] );
var oStart = this.Internal_FindBackward( CurPos - 1, [para_PageNum, para_Drawing, para_Tab, para_Text, para_Space, para_NewLine] );
var CurType = this.Content[CurPos].Type;
if ( !oEnd.Found )
return;
if ( para_End == oEnd.Type )
{
// Вставляем запись о новых настройках перед концом параграфа, а текущую позицию выставляем на конец параграфа
var Pos = oEnd.LetterPos;
var TextPr_start = this.Internal_GetTextPr( Pos );
TextPr_start.Merge( TextPr );
this.Internal_Content_Add( Pos, new ParaTextPr( TextPr_start ) );
this.Set_ContentPos( Pos + 1, false, -1 );
}
else if ( para_PageNum === CurType || para_Drawing === CurType || para_Tab == CurType || para_Space == CurType || para_NewLine == CurType || !oStart.Found || para_NewLine == oEnd.Type || para_Space == oEnd.Type || para_NewLine == oStart.Type || para_Space == oStart.Type || para_Tab == oEnd.Type || para_Tab == oStart.Type || para_Drawing == oEnd.Type || para_Drawing == oStart.Type || para_PageNum == oEnd.Type || para_PageNum == oStart.Type )
{
var TextPr_old = this.Internal_GetTextPr( CurPos );
var TextPr_new = TextPr_old.Copy();
TextPr_new.Merge( TextPr );
this.Internal_Content_Add( CurPos, new ParaTextPr( TextPr_old ) );
this.Internal_Content_Add( CurPos, new ParaTextPr( TextPr_new ) );
this.Set_ContentPos( CurPos + 1, false, -1 );
this.RecalculateCurPos();
}
else
{
// Мы находимся посередине слова. В начале слова ставим запись о новом шрифте,
// а в конце слова старый шрифт. Кроме этого, надо удалить все записи о шрифте внутри слова.
// Найдем начало слова
var oWordStart = this.Internal_FindBackward( CurPos, [para_PageNum, para_Drawing, para_Tab, para_Space, para_NewLine] );
if ( !oWordStart.Found )
oWordStart = this.Internal_FindForward( 0, [para_Text] );
else
oWordStart.LetterPos++;
var oWordEnd = this.Internal_FindForward( CurPos, [para_PageNum, para_Drawing, para_Tab, para_Space, para_End, para_NewLine] );
if ( !oWordStart.Found || !oWordEnd.Found )
return;
// Рассчитываем настройки, которые используются после слова
var TextPr_end = this.Internal_GetTextPr( oWordEnd.LetterPos );
var TextPr_start = this.Internal_GetTextPr( oWordStart.LetterPos );
TextPr_start.Merge( TextPr );
this.Internal_Content_Add( oWordStart.LetterPos, new ParaTextPr( TextPr_start ) );
this.Internal_Content_Add( oWordEnd.LetterPos + 1 /* из-за предыдущего Internal_Content_Add */, new ParaTextPr( TextPr_end ) );
this.Set_ContentPos( CurPos + 1, false, -1 );
// Если внутри слова были изменения текстовых настроек, тогда удаляем только те записи, которые
// меняются сейчас. Например, у нас изменен только размер шрифта, то удаляем запись о размере шрифта.
for ( var Pos = oWordStart.LetterPos + 1; Pos < oWordEnd.LetterPos; Pos++ )
{
if ( this.Content[Pos].Type == para_TextPr )
this.Content[Pos].Apply_TextPr( TextPr );
}
}
},
Internal_GetContentPosByXY : function(X,Y, bLine, PageNum, bCheckNumbering)
{
if ( this.Lines.length <= 0 )
return {Pos : 0, End:false, InText : false};
// Сначала определим на какую строку мы попали
var PNum = 0;
if ( "number" == typeof(PageNum) )
{
PNum = PageNum - this.PageNum;
}
else
PNum = 0;
if ( PNum >= this.Pages.length )
{
PNum = this.Pages.length - 1;
bLine = true;
Y = this.Lines.length - 1;
}
else if ( PNum < 0 )
{
PNum = 0;
bLine = true;
Y = 0;
}
var bFindY = false;
var CurLine = this.Pages[PNum].FirstLine;
var CurLineY = this.Pages[PNum].Y + this.Lines[CurLine].Y + this.Lines[CurLine].Metrics.Descent + this.Lines[CurLine].Metrics.LineGap;
var LastLine = ( PNum >= this.Pages.length - 1 ? this.Lines.length - 1 : this.Pages[PNum + 1].FirstLine - 1 );
if ( true === bLine )
CurLine = Y;
else
{
while ( !bFindY )
{
if ( Y < CurLineY )
break;
if ( CurLine >= LastLine )
break;
CurLine++;
CurLineY = this.Lines[CurLine].Y + this.Pages[PNum].Y + this.Lines[CurLine].Metrics.Descent + this.Lines[CurLine].Metrics.LineGap;
}
}
// Ищем позицию в строке
var CurRange = 0;
var CurX = this.Lines[CurLine].Ranges[CurRange].XVisible;
var DiffX = 1000000;//this.XLimit; // километра для ограничения должно хватить
var NumberingDiffX = 1000000;//this.XLimit;
var DiffPos = -1;
var bEnd = false;
var bInText = false;
var Result = { Pos : 0, End : false };
var StartPos = this.Lines[CurLine].StartPos;
var ResultLine = -1;
var Pos2 = StartPos;
var ItemNum = StartPos;
for ( ; ItemNum < this.Content.length; ItemNum++ )
{
var Item = this.Content[ItemNum];
if ( undefined != Item.CurLine )
{
if ( CurLine != Item.CurLine )
break;
if ( CurRange != Item.CurRange )
{
CurRange = Item.CurRange;
CurX = this.Lines[CurLine].Ranges[CurRange].XVisible;
}
}
var TempDx = 0;
var bCheck = false;
if ( ItemNum === this.Numbering.Pos )
{
if ( para_Numbering === this.Numbering.Type )
{
var NumberingItem = this.Numbering;
var NumPr = this.Numbering_Get();
var NumJc = this.Parent.Get_Numbering().Get_AbstractNum( NumPr.NumId ).Lvl[NumPr.Lvl].Jc;
var NumX0 = CurX;
var NumX1 = CurX;
switch( NumJc )
{
case align_Right:
{
NumX0 -= NumberingItem.WidthNum;
break;
}
case align_Center:
{
NumX0 -= NumberingItem.WidthNum / 2;
NumX1 += NumberingItem.WidthNum / 2;
break;
}
case align_Left:
default:
{
NumX1 += NumberingItem.WidthNum;
break;
}
}
if ( X >= NumX0 && X <= NumX1 )
NumberingDiffX = 0;
}
CurX += this.Numbering.WidthVisible;
if ( -1 != DiffPos )
{
DiffX = Math.abs( X - CurX );
DiffPos = ItemNum;
}
}
switch( Item.Type )
{
case para_Drawing:
{
if ( Item.DrawingType != drawing_Inline )
{
bCheck = false;
TempDx = 0;
}
else
{
TempDx = Item.WidthVisible;
bCheck = true;
}
break;
}
case para_PageNum:
case para_Text:
case para_Math:
TempDx = Item.WidthVisible;
bCheck = true;
break;
case para_Space:
TempDx = Item.WidthVisible;
bCheck = true;
break;
case para_Tab:
TempDx = Item.WidthVisible;
bCheck = true;
break;
case para_NewLine:
bCheck = true;
TempDx = Item.WidthVisible;
break;
case para_End:
bEnd = true;
bCheck = true;
TempDx = Item.WidthVisible;
break;
case para_TextPr:
case para_CommentEnd:
case para_CommentStart:
case para_CollaborativeChangesEnd:
case para_CollaborativeChangesStart:
case para_HyperlinkEnd:
case para_HyperlinkStart:
bCheck = true;
TempDx = 0;
break;
}
if ( bCheck )
{
if ( Math.abs( X - CurX ) < DiffX + 0.001 )
{
DiffX = Math.abs( X - CurX );
DiffPos = ItemNum;
}
if ( true != bEnd && ItemNum === this.Lines[CurLine].EndPos && X > CurX + TempDx && para_NewLine != Item.Type )
{
ResultLine = CurLine;
DiffPos = ItemNum + 1;
}
// Заглушка для знака параграфа
if ( bEnd )
{
CurX += TempDx;
if ( Math.abs( X - CurX ) < DiffX )
{
Result.End = true;
}
break;
}
}
if ( X >= CurX - 0.001 && X <= CurX + TempDx + 0.001 )
{
bInText = true;
Pos2 = ItemNum;
}
CurX += TempDx;
}
// По Х попали в какой-то элемент, проверяем по Y
if ( true === bInText && Y >= this.Pages[PNum].Y + this.Lines[CurLine].Y - this.Lines[CurLine].Metrics.Ascent - 0.01 && Y <= this.Pages[PNum].Y + this.Lines[CurLine].Y + this.Lines[CurLine].Metrics.Descent + this.Lines[CurLine].Metrics.LineGap + 0.01 )
Result.InText = true;
else
{
Result.InText = false;
Pos2 = ItemNum - 1;
}
if ( NumberingDiffX <= DiffX )
Result.Numbering = true;
else
Result.Numbering = false;
Result.Pos = DiffPos; // Позиция ближайшего элемента (по его начальной точке)
Result.Pos2 = Pos2; // Позиция элемента в который мы попали точно
Result.Line = ResultLine;
return Result;
},
Internal_GetXYByContentPos : function(Pos)
{
return this.Internal_Recalculate_CurPos(Pos, false, false, false);
},
Internal_Selection_CheckHyperlink : function()
{
// Если у нас начало селекта находится внутри гиперссылки, а конец
// нет (или наоборот), тогда выделяем всю гиперссылку.
var Direction = 1;
var StartPos = this.Selection.StartPos;
var EndPos = this.Selection.EndPos;
if ( StartPos > EndPos )
{
StartPos = this.Selection.EndPos;
EndPos = this.Selection.StartPos;
Direction = -1;
}
var Hyperlink_start = this.Check_Hyperlink2( StartPos );
var Hyperlink_end = this.Check_Hyperlink2( EndPos );
if ( null != Hyperlink_start && Hyperlink_end != Hyperlink_start )
StartPos = this.Internal_FindBackward( StartPos, [para_HyperlinkStart]).LetterPos;
if ( null != Hyperlink_end && Hyperlink_end != Hyperlink_start )
EndPos = this.Internal_FindForward( EndPos, [para_HyperlinkEnd]).LetterPos + 1;
if ( Direction > 0 )
{
this.Selection.StartPos = StartPos;
this.Selection.EndPos = EndPos;
}
else
{
this.Selection.StartPos = EndPos;
this.Selection.EndPos = StartPos;
}
},
Check_Hyperlink : function(X, Y, PageNum) Check_Hyperlink : function(X, Y, PageNum)
{ {
var SearchPosXY = this.Get_ParaContentPosByXY( X, Y, PageNum, false, false ); var SearchPosXY = this.Get_ParaContentPosByXY( X, Y, PageNum, false, false );
...@@ -6472,55 +6034,6 @@ Paragraph.prototype = ...@@ -6472,55 +6034,6 @@ Paragraph.prototype =
return null; return null;
}, },
Check_Hyperlink2 : function(Pos, bCheckEnd, bNoSelectCheck)
{
if ( undefined === bNoSelectCheck )
bNoSelectCheck = false;
if ( undefined === bCheckEnd )
bCheckEnd = true;
// TODO : Специальная заглушка, для конца селекта. Неплохо бы переделать.
if ( true === bCheckEnd && Pos > 0 )
{
while ( this.Content[Pos - 1].Type === para_TextPr || this.Content[Pos - 1].Type === para_HyperlinkEnd || this.Content[Pos - 1].Type === para_CollaborativeChangesStart || this.Content[Pos - 1].Type === para_CollaborativeChangesEnd )
{
Pos--;
if ( Pos <= 0 )
return null;
}
}
// TODO: специальная заглушка, для случая, когда курсор стоит перед гиперссылкой, чтобы мы определяли данную ситуацию как попадание в гиперссылку
if ( true === bNoSelectCheck )
{
Pos = this.Internal_Correct_HyperlinkPos(Pos);
}
var Find = this.Internal_FindBackward( Pos - 1, [para_HyperlinkStart, para_HyperlinkEnd] );
if ( true === Find.Found && para_HyperlinkStart === Find.Type )
return this.Content[Find.LetterPos];
return null;
},
Internal_Correct_HyperlinkPos : function(_Pos)
{
var Pos = _Pos;
var Count = this.Content.length;
while ( Pos < Count )
{
var TempType = this.Content[Pos].Type;
if ( para_HyperlinkStart === TempType || para_TextPr === TempType || para_CollaborativeChangesEnd === TempType || para_CollaborativeChangesStart === TempType )
Pos++;
else
break;
}
return Pos;
},
Hyperlink_Add : function(HyperProps) Hyperlink_Add : function(HyperProps)
{ {
if ( true === this.Selection.Use ) if ( true === this.Selection.Use )
...@@ -7661,12 +7174,12 @@ Paragraph.prototype = ...@@ -7661,12 +7174,12 @@ Paragraph.prototype =
// Проверяем, попали ли мы в текст // Проверяем, попали ли мы в текст
Is_InText : function(X, Y, PageNum_Abs) Is_InText : function(X, Y, PageNum_Abs)
{ {
var PNum = PageNum_Abs - this.Get_StartPage_Absolute(); var PageNum = PageNum_Abs - this.Get_StartPage_Absolute();
if ( PNum < 0 || PNum >= this.Pages.length ) if ( PageNum < 0 || PageNum >= this.Pages.length )
return null; return null;
var Result = this.Internal_GetContentPosByXY( X, Y, false, PNum + this.PageNum, false); var SearchPosXY = this.Get_ParaContentPosByXY( X, Y, PageNum, false, false );
if ( true === Result.InText ) if ( true === SearchPosXY.InText )
return this; return this;
return null; return null;
......
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