331 lines
11 KiB
JavaScript
331 lines
11 KiB
JavaScript
/*
|
||
* (c) Copyright Ascensio System SIA 2010-2024
|
||
*
|
||
* This program is a free software product. You can redistribute it and/or
|
||
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
||
* version 3 as published by the Free Software Foundation. In accordance with
|
||
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
||
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
||
* of any third-party rights.
|
||
*
|
||
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
||
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||
*
|
||
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
|
||
* street, Riga, Latvia, EU, LV-1050.
|
||
*
|
||
* The interactive user interfaces in modified source and object code versions
|
||
* of the Program must display Appropriate Legal Notices, as required under
|
||
* Section 5 of the GNU AGPL version 3.
|
||
*
|
||
* Pursuant to Section 7(b) of the License you must retain the original Product
|
||
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
||
* grant you any rights under trademark law for use of our trademarks.
|
||
*
|
||
* All the Product's GUI elements, including illustrations and icon sets, as
|
||
* well as technical writing content are licensed under the terms of the
|
||
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||
*
|
||
*/
|
||
|
||
|
||
$(function () {
|
||
|
||
let logicDocument = AscTest.CreateLogicDocument();
|
||
let styleManager = logicDocument.GetStyleManager();
|
||
|
||
let paraStyle1 = AscTest.CreateParagraphStyle("ParaStyle1");
|
||
let paraStyle2 = AscTest.CreateParagraphStyle("ParaStyle2");
|
||
|
||
let runStyle1 = AscTest.CreateRunStyle("RunStyle1");
|
||
let runStyle2 = AscTest.CreateRunStyle("RunStyle2");
|
||
|
||
let defaultPStyle = styleManager.Get(styleManager.GetDefaultParagraph());
|
||
let noStyle = "";
|
||
|
||
function AddParagraph(pos)
|
||
{
|
||
let p = AscTest.CreateParagraph();
|
||
logicDocument.AddToContent(pos, p);
|
||
return p;
|
||
}
|
||
function CreateRun(text)
|
||
{
|
||
let r = AscTest.CreateRun();
|
||
r.AddText(text);
|
||
return r;
|
||
}
|
||
function SetPStyle(p, pStyle)
|
||
{
|
||
p.SetPStyle(pStyle ? pStyle.GetId() : null);
|
||
}
|
||
function SetRStyle(run, rStyle)
|
||
{
|
||
run.SetRStyle(rStyle ? rStyle.GetId() : null);
|
||
}
|
||
|
||
let displayStyleName = "";
|
||
editor.isDocumentLoadComplete = true;
|
||
editor.sync_ParaStyleName = function(styleName)
|
||
{
|
||
displayStyleName = styleName;
|
||
};
|
||
|
||
function CheckStyle(assert, expectedStyle, message)
|
||
{
|
||
logicDocument.UpdateInterface();
|
||
assert.strictEqual(displayStyleName, expectedStyle ? expectedStyle.GetName() : "", message ? message : "");
|
||
}
|
||
|
||
QUnit.module("Cursor");
|
||
|
||
QUnit.test("Run with/without style in paragraph", function(assert)
|
||
{
|
||
let word = "Word!";
|
||
|
||
AscTest.ClearDocument();
|
||
let p = AddParagraph(0);
|
||
let run = CreateRun(word);
|
||
p.AddToContentToEnd(run);
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(false, false, 1);
|
||
|
||
SetPStyle(p, paraStyle1);
|
||
SetRStyle(run, runStyle1);
|
||
|
||
CheckStyle(assert, runStyle1, "Move cursor to the last letter of the run with a style");
|
||
run.SetRStyle(null);
|
||
CheckStyle(assert, paraStyle1, "Remove style from run");
|
||
p.SetPStyle(null);
|
||
CheckStyle(assert, defaultPStyle, "Remove style from paragraph");
|
||
});
|
||
|
||
QUnit.module("Select");
|
||
|
||
QUnit.test("Two different paragraphs", function(assert)
|
||
{
|
||
let word1 = "Word!";
|
||
let word2 = "Hello!";
|
||
|
||
AscTest.ClearDocument();
|
||
|
||
let p1 = AddParagraph(0);
|
||
let run1 = CreateRun(word1);
|
||
p1.AddToContentToEnd(run1);
|
||
|
||
let p2 = AddParagraph(1);
|
||
let run2 = CreateRun(word2);
|
||
p2.AddToContentToEnd(run2);
|
||
AscTest.SelectDocumentRange(0, 1);
|
||
|
||
CheckStyle(assert, defaultPStyle, "Both paragraph have no style (no run style)");
|
||
|
||
SetPStyle(p1, paraStyle1);
|
||
SetPStyle(p2, paraStyle1);
|
||
CheckStyle(assert, paraStyle1, "Both paragraphs have the same style ParaStyle1 (no run style)");
|
||
|
||
SetPStyle(p1, paraStyle1);
|
||
SetPStyle(p2, paraStyle2);
|
||
CheckStyle(assert, noStyle, "Paragraphs have different styles (no run style)");
|
||
|
||
SetRStyle(run1, runStyle1);
|
||
SetRStyle(run2, runStyle2);
|
||
|
||
logicDocument.RemoveSelection();
|
||
AscTest.MoveCursorToParagraph(p2, false);
|
||
AscTest.MoveCursorLeft(true, false, word2.length - 1);
|
||
CheckStyle(assert, runStyle2, "Apply RunStyle1 to run1 and RunStyle2 to run2. Partially select the second run");
|
||
|
||
SetRStyle(run1, null);
|
||
SetRStyle(run2, null);
|
||
CheckStyle(assert, paraStyle2, "Remove style from runs. Leave partially select");
|
||
|
||
AscTest.SelectDocumentRange(1, 1);
|
||
CheckStyle(assert, paraStyle2, "Select entire second paragraph");
|
||
|
||
logicDocument.RemoveSelection();
|
||
AscTest.MoveCursorToParagraph(p2, false);
|
||
AscTest.MoveCursorLeft(true, false, word1.length + word2.length);
|
||
CheckStyle(assert, noStyle, "Select both paragraph by key arrows");
|
||
});
|
||
|
||
QUnit.test("Different runs in one paragraph", function(assert)
|
||
{
|
||
let word1 = "Word!";
|
||
let word2 = "Hello!";
|
||
|
||
AscTest.ClearDocument();
|
||
|
||
let p = AddParagraph(0);
|
||
let run1 = CreateRun(word1);
|
||
let run2 = CreateRun(word2);
|
||
|
||
p.AddToContentToEnd(run1);
|
||
p.AddToContentToEnd(run2);
|
||
|
||
SetPStyle(p, paraStyle1);
|
||
SetRStyle(run1, runStyle1);
|
||
SetRStyle(run2, runStyle1);
|
||
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(true, false, word2.length);
|
||
CheckStyle(assert, runStyle1, "Add two runs with different styles in one paragraph and select second run");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, runStyle1, "Add first run to selection");
|
||
|
||
SetRStyle(run2, runStyle2);
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(true, false, word2.length);
|
||
CheckStyle(assert, runStyle2, "Set the style of run2 to RunStyle2 and select second run");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, paraStyle1, "Add first run to selection (runs with different styles in the selection)");
|
||
});
|
||
|
||
QUnit.test("Multiple runs with same style in different paragraphs", function(assert)
|
||
{
|
||
let word1 = "Word!";
|
||
let word2 = "NextWord";
|
||
let word3 = "Hello!";
|
||
|
||
AscTest.ClearDocument();
|
||
|
||
let p1 = AddParagraph(0);
|
||
let run1 = CreateRun(word1);
|
||
let run2 = CreateRun(word2);
|
||
p1.AddToContentToEnd(run1);
|
||
p1.AddToContentToEnd(run2);
|
||
|
||
let p2 = AddParagraph(1);
|
||
let run3 = CreateRun(word3);
|
||
p2.AddToContentToEnd(run3);
|
||
|
||
SetPStyle(p1, paraStyle1);
|
||
SetPStyle(p2, paraStyle2);
|
||
|
||
SetRStyle(run1, runStyle1);
|
||
SetRStyle(run2, runStyle2);
|
||
SetRStyle(run3, runStyle2);
|
||
|
||
AscTest.MoveCursorToParagraph(p2, false);
|
||
AscTest.MoveCursorLeft(true, false, word3.length + word2.length);
|
||
CheckStyle(assert, runStyle2, "Select two last runs with same style in different paragraphs with different styles");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, noStyle, "Add the first run to selection");
|
||
|
||
SetPStyle(p1, paraStyle1);
|
||
SetPStyle(p2, paraStyle1);
|
||
CheckStyle(assert, paraStyle1, "Make both paragraphs the same style");
|
||
|
||
SetPStyle(p1, null);
|
||
SetPStyle(p2, null);
|
||
CheckStyle(assert, defaultPStyle, "Remove style from both paragraphs");
|
||
});
|
||
|
||
QUnit.test("Combination of spaces and text", function(assert)
|
||
{
|
||
// Если есть хоть 1 текстовый элемент в выделении, то используем его стиль.
|
||
// В противном случае используем первый попавшийся стиль
|
||
// Если стиля нет, то используем уже стиль параграфа
|
||
|
||
let word1 = "Word!";
|
||
let space1 = " ";
|
||
let space2 = " ";
|
||
let space3 = " ";
|
||
let word2 = "Hello!";
|
||
|
||
AscTest.ClearDocument();
|
||
|
||
let p = AddParagraph(0);
|
||
let textRun1 = CreateRun(word1);
|
||
let textRun2 = CreateRun(word2);
|
||
let spaceRun1 = CreateRun(space1);
|
||
let spaceRun2 = CreateRun(space2);
|
||
let spaceRun3 = CreateRun(space3);
|
||
|
||
p.AddToContentToEnd(textRun1);
|
||
p.AddToContentToEnd(spaceRun1);
|
||
p.AddToContentToEnd(spaceRun2);
|
||
p.AddToContentToEnd(spaceRun3);
|
||
p.AddToContentToEnd(textRun2);
|
||
|
||
SetPStyle(p, paraStyle1);
|
||
SetRStyle(textRun1, runStyle1);
|
||
SetRStyle(spaceRun1, null);
|
||
SetRStyle(spaceRun2, runStyle2);
|
||
SetRStyle(spaceRun3, runStyle1);
|
||
SetRStyle(textRun2, runStyle1);
|
||
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(true, false, word2.length);
|
||
CheckStyle(assert, runStyle1, "Select second word");
|
||
|
||
AscTest.MoveCursorLeft(true, false, space3.length);
|
||
CheckStyle(assert, runStyle1, "Add last run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, space2.length);
|
||
CheckStyle(assert, runStyle1, "Add second run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, space1.length);
|
||
CheckStyle(assert, runStyle1, "Add first run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, runStyle1, "Add the first run with text to selection");
|
||
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(false, false, word2.length);
|
||
AscTest.MoveCursorLeft(true, false, space3.length);
|
||
CheckStyle(assert, runStyle1, "Add last run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, space2.length);
|
||
CheckStyle(assert, runStyle2, "Add second run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, space1.length);
|
||
CheckStyle(assert, paraStyle1, "Add first run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, runStyle1, "Add the first run with text to selection");
|
||
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(false, false, word2.length + space3.length);
|
||
AscTest.MoveCursorLeft(true, false, space2.length);
|
||
CheckStyle(assert, runStyle2, "Add second run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, space1.length);
|
||
CheckStyle(assert, paraStyle1, "Add first run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, runStyle1, "Add the first run with text to selection");
|
||
|
||
AscTest.MoveCursorToParagraph(p, false);
|
||
AscTest.MoveCursorLeft(false, false, word2.length + space3.length + space2.length);
|
||
AscTest.MoveCursorLeft(true, false, space1.length);
|
||
CheckStyle(assert, paraStyle1, "Add first run with spaces to selection");
|
||
|
||
AscTest.MoveCursorLeft(true, false, word1.length);
|
||
CheckStyle(assert, runStyle1, "Add the first run with text to selection");
|
||
|
||
// Check simple cursor position
|
||
|
||
AscTest.MoveCursorToParagraph(p, true);
|
||
AscTest.MoveCursorRight(false, false, 1);
|
||
CheckStyle(assert, runStyle1, "Move to 1 position in the first word");
|
||
|
||
AscTest.MoveCursorRight(false, false, word1.length);
|
||
CheckStyle(assert, paraStyle1, "Move to 1 position in the first space run");
|
||
|
||
AscTest.MoveCursorRight(false, false, space1.length);
|
||
CheckStyle(assert, runStyle2, "Move to 1 position in the second space run");
|
||
|
||
AscTest.MoveCursorRight(false, false, space2.length);
|
||
CheckStyle(assert, runStyle1, "Move to 1 position in the last space run");
|
||
|
||
AscTest.MoveCursorRight(false, false, space3.length);
|
||
CheckStyle(assert, runStyle1, "Move to 1 position in the last word");
|
||
});
|
||
});
|