672 lines
20 KiB
JavaScript
672 lines
20 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
|
||
*
|
||
*/
|
||
|
||
"use strict";
|
||
|
||
(function(window, undefined){
|
||
|
||
window["AscCommon"] = window.AscCommon = (window["AscCommon"] || {});
|
||
|
||
/**
|
||
* 1st version:
|
||
*
|
||
* 0) Вводим текст - произносим его. Copy/Paste не произносим.
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.Text, "a");
|
||
* 1) Ходим курсором по тексту - произносим следующую а курсором букву. Если пробел - присылаем пустой текст.
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.Text, "a");
|
||
* 2) Ходим по тексту по словам - произносим следующее за курсором слово. Если конец - посылаем пустой текст.
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.Text, "hello");
|
||
* 3) Селект/УменьшениеСелета по клавиатуре/конец селекта мышью - произносится изменение в селекте (новый текст/тот что ушел из селекта).
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.TextSelected, { text: "текст", isBefore: false });
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.TextUnselected, { text: "текст", isBefore: false });
|
||
* 4) Селект автофигуры/диаграммы/картинки/...
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.DrawingSelected, { altText: "текст" });
|
||
* 5) Селект слайда
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.SlideSelected, { num: 1 });
|
||
* 6) Ходим по ячейкам в Cell
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.CellSelected, { text: "cell value", cell: "A1" });
|
||
* 7) Селект/УменьшениеСелета по клавиатуре/конец селекта мышью - смотрим,
|
||
* если +/- одна ячейка, то используем CellRangeSelectedChangeOne/CellRangeUnselectedChangeOne
|
||
* если нет - то CellRangeSelected/CellRangeUnselected
|
||
* 8) Ходим по листам - даем информацию о нем
|
||
* --- SpeechWorker.speech(AscCommon.SpeechWorkerCommands.SheetSelected, { ... });
|
||
*
|
||
*/
|
||
|
||
// types for SpeechWorker.speech method
|
||
var SpeechWorkerType = {
|
||
|
||
// text
|
||
Text : 0,
|
||
|
||
// { text: "text", isBefore: true }
|
||
TextSelected : 1,
|
||
|
||
// { text: "text", isBefore: true }
|
||
TextUnselected : 2,
|
||
|
||
// { indexes: [1, 2, ..] }
|
||
SlidesSelected : 3,
|
||
|
||
// { indexes: [1, 2, ..] }
|
||
SlidesUnselected : 4,
|
||
|
||
// { altText: "text" }
|
||
DrawingSelected : 5,
|
||
|
||
// { text: "text", cell: "A1" }
|
||
CellSelected : 6,
|
||
|
||
// { start: { text: "text", cell: "A1" }, end: { text: "text", cell: "A2" }] } }
|
||
CellRangeSelected : 7,
|
||
|
||
// { start: { text: "text", cell: "A1" }, end: { text: "text", cell: "A2" }] } }
|
||
CellRangeUnselected : 8,
|
||
|
||
// { text: "text", cell: "A1" }
|
||
CellRangeSelectedChangeOne : 9,
|
||
|
||
// { text: "text", cell: "A1" }
|
||
CellRangeUnselectedChangeOne : 10,
|
||
|
||
// { text: "text", ranges: [startCell: "A1" , endCell: "A2" }] }
|
||
MultipleRangesSelected : 11,
|
||
|
||
// { name: "sheet 1", cell: "A1", text: "text", cellEnd: "D5", cellsCount: 10, objectsCount: 5 }
|
||
SheetSelected : 12
|
||
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
*/
|
||
function CWorkerSpeech()
|
||
{
|
||
this.isEnabled = false;
|
||
this.speechElement = null;
|
||
this.isLogEnabled = false;
|
||
|
||
this.timerSetValue = -1;
|
||
this.value = "";
|
||
this.valueEqualAddon = false;
|
||
|
||
this.equalAddon = " ";
|
||
if (AscCommon.AscBrowser.isMacOs)
|
||
this.equalAddon = "<br/>";
|
||
|
||
this.setEnabled = function(isEnabled)
|
||
{
|
||
if (this.isEnabled === isEnabled)
|
||
return;
|
||
|
||
if (!AscCommon.g_inputContext)
|
||
{
|
||
var worker = this;
|
||
AscCommon.inputMethodAddInitEvent(function() {
|
||
worker.setEnabled(isEnabled);
|
||
});
|
||
return;
|
||
}
|
||
|
||
this.isEnabled = isEnabled;
|
||
if (this.isEnabled)
|
||
{
|
||
this.speechElement = document.createElement("div");
|
||
this.speechElement.innerHTML = "";
|
||
this.speechElement.id = "area_id_screen_reader";
|
||
|
||
let style = "position: absolute; left:0; top:-1; z-index: -2; opacity: 0;";
|
||
this.speechElement.setAttribute("style", style);
|
||
|
||
this.speechElement.setAttribute("role", "region");
|
||
this.speechElement.setAttribute("aria-label", "");
|
||
this.speechElement.setAttribute("aria-live", "assertive");
|
||
if (!(AscCommon.AscBrowser.isMozilla && AscCommon.AscBrowser.isWindows))
|
||
this.speechElement.setAttribute("aria-atomic", "true");
|
||
this.speechElement.setAttribute("aria-hidden", "false");
|
||
|
||
//AscCommon.g_inputContext.HtmlArea.setAttribute("aria-describedby", "area_id_screen_reader");
|
||
AscCommon.g_inputContext.HtmlDiv.appendChild(this.speechElement);
|
||
}
|
||
else if (this.speechElement)
|
||
{
|
||
AscCommon.g_inputContext.HtmlArea.removeAttribute("aria-describedby");
|
||
AscCommon.g_inputContext.HtmlDiv.removeChild(this.speechElement);
|
||
this.speechElement = null;
|
||
}
|
||
};
|
||
|
||
this._log = function(message)
|
||
{
|
||
if (!this.isLogEnabled)
|
||
return;
|
||
console.log(message);
|
||
};
|
||
|
||
// Variants for text setting
|
||
|
||
// 1) Resolve the problem with equals with temporary set empty value
|
||
this._setValueWithCheckEqual = function(value)
|
||
{
|
||
if (-1 !== this.timerSetValue)
|
||
{
|
||
clearTimeout(this.timerSetValue);
|
||
this.timerSetValue = -1;
|
||
}
|
||
|
||
if (value !== this.speechElement.innerHTML)
|
||
{
|
||
this.speechElement.innerHTML = value;
|
||
if (this.isLogEnabled)
|
||
console.log("[speech]: " + value);
|
||
}
|
||
else
|
||
{
|
||
this.speechElement.innerHTML = "";
|
||
|
||
if ("" !== value)
|
||
{
|
||
this.timerSetValue = setTimeout(function(){
|
||
AscCommon.SpeechWorker.timerSetValue = -1;
|
||
AscCommon.SpeechWorker._setValuePermanently(value);
|
||
}, 50);
|
||
}
|
||
}
|
||
};
|
||
|
||
// 2) Set value permanently
|
||
this._setValuePermanently = function(value)
|
||
{
|
||
this.speechElement.innerHTML = value;
|
||
if (this.isLogEnabled)
|
||
console.log("[speech]: " + value);
|
||
};
|
||
|
||
// 3) Resolve the problem with equals with nbsp
|
||
this._setValuePermanentlyDiffEqual = function(value)
|
||
{
|
||
if (this.value !== value)
|
||
{
|
||
this.value = value;
|
||
this.speechElement.innerHTML = this.value;
|
||
this.valueEqualAddon = false;
|
||
}
|
||
else
|
||
{
|
||
this.valueEqualAddon = !this.valueEqualAddon;
|
||
if (this.valueEqualAddon)
|
||
{
|
||
this.speechElement.innerHTML = this.value + this.equalAddon;
|
||
}
|
||
else
|
||
{
|
||
this.speechElement.innerHTML = this.value;
|
||
}
|
||
}
|
||
|
||
if (this.isLogEnabled)
|
||
console.log("[speech]: " + this.speechElement.innerHTML);
|
||
};
|
||
|
||
// 4) Simple timer
|
||
this._setValueWithTimeout = function(value)
|
||
{
|
||
if (-1 !== this.timerSetValue)
|
||
{
|
||
clearTimeout(this.timerSetValue);
|
||
this.timerSetValue = -1;
|
||
}
|
||
|
||
this.timerSetValue = setTimeout(function(){
|
||
AscCommon.SpeechWorker._setValuePermanentlyDiffEqual(value);
|
||
AscCommon.SpeechWorker.timerSetValue = -1;
|
||
}, 5000);
|
||
};
|
||
|
||
this._setValue = this._setValuePermanentlyDiffEqual;
|
||
|
||
this.isSpeechEnabled = function()
|
||
{
|
||
if (!this.isEnabled)
|
||
return false;
|
||
|
||
if (AscCommon.g_inputContext && AscCommon.g_inputContext.isCompositionProcess())
|
||
return false;
|
||
|
||
return true;
|
||
};
|
||
|
||
this.speech = function(type, obj)
|
||
{
|
||
if (!this.isSpeechEnabled())
|
||
return;
|
||
|
||
if (undefined === obj)
|
||
obj = {};
|
||
|
||
if (obj.cancelSelection)
|
||
this._log("Text selection has been canceled");
|
||
|
||
if (obj.moveToMainPart)
|
||
this._log("Main document part");
|
||
else if (obj.moveToFootnote)
|
||
this._log("Footnote");
|
||
else if (obj.moveToFootnote)
|
||
this._log("Drawing");
|
||
else if (obj.moveToHdrFtr)
|
||
this._log("Header/Footer");
|
||
|
||
if (obj.moveToStartOfDocument)
|
||
this._log("Start of the document");
|
||
else if (obj.moveToStartOfLine)
|
||
this._log("Start of the line");
|
||
else if (obj.moveToEndOfDocument)
|
||
this._log("End of the document");
|
||
else if (obj.moveToEndOfLine)
|
||
this._log("End of the line");
|
||
else if (obj.movePageUp)
|
||
this._log("Page up");
|
||
else if (obj.movePageDown)
|
||
this._log("Page down");
|
||
|
||
let translateManager = AscCommon.translateManager;
|
||
switch (type)
|
||
{
|
||
case SpeechWorkerType.Text:
|
||
case SpeechWorkerType.TextSelected:
|
||
case SpeechWorkerType.TextUnselected:
|
||
{
|
||
if (obj.text === " ")
|
||
obj.text = translateManager.getValue("space");
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
|
||
switch (type)
|
||
{
|
||
case SpeechWorkerType.Text:
|
||
{
|
||
this._setValue(obj.text);
|
||
break;
|
||
}
|
||
case SpeechWorkerType.TextSelected:
|
||
{
|
||
if (obj.isBefore)
|
||
this._setValue(translateManager.getValue("select") + " " + obj.text);
|
||
else
|
||
this._setValue(obj.text + " " + translateManager.getValue("select"));
|
||
break;
|
||
}
|
||
case SpeechWorkerType.TextUnselected:
|
||
{
|
||
if (obj.isBefore)
|
||
this._setValue(translateManager.getValue("unselected") + " " + obj.text);
|
||
else
|
||
this._setValue(obj.text + " " + translateManager.getValue("unselected"));
|
||
break;
|
||
}
|
||
case SpeechWorkerType.SlidesSelected:
|
||
{
|
||
if (obj.indexes.length === 1)
|
||
{
|
||
this._setValue(translateManager.getValue("slide") + " " + (obj.indexes[0]));
|
||
}
|
||
else
|
||
{
|
||
this._setValue(obj.indexes.length + " " + translateManager.getValue("slides added to selection"));
|
||
}
|
||
break;
|
||
}
|
||
case SpeechWorkerType.SlidesUnselected:
|
||
{
|
||
if (obj.indexes.length === 1)
|
||
{
|
||
this._setValue(translateManager.getValue("slide") + " " + (obj.indexes[0]) + " " + translateManager.getValue("unselected"));
|
||
}
|
||
else
|
||
{
|
||
this._setValue(obj.indexes.length + " " + translateManager.getValue("slides unselected"));
|
||
}
|
||
break;
|
||
}
|
||
case SpeechWorkerType.DrawingSelected:
|
||
{
|
||
this._setValue(translateManager.getValue("drawing select") + (obj.altText ? (" " + obj.altText) : ""));
|
||
break;
|
||
}
|
||
case SpeechWorkerType.CellSelected:
|
||
{
|
||
this._setValue((obj.text ? obj.text : translateManager.getValue("empty cell")) + " " + obj.cell);
|
||
break;
|
||
}
|
||
case SpeechWorkerType.CellRangeSelected:
|
||
{
|
||
let result = translateManager.getValue("selected range select") + " ";
|
||
result += obj.start.text ? obj.start.text : translateManager.getValue("empty");
|
||
result += (" " + obj.start.cell);
|
||
result += obj.end.text ? " " + obj.end.text : " " + translateManager.getValue("empty");
|
||
result += (" " + obj.end.cell);
|
||
|
||
this._setValue(result);
|
||
break;
|
||
}
|
||
case SpeechWorkerType.CellRangeUnselected:
|
||
{
|
||
let result = translateManager.getValue("unselected range select") + " ";
|
||
result += obj.start.text ? obj.start.text : translateManager.getValue("empty");
|
||
result += (" " + obj.start.cell);
|
||
result += obj.end.text ? " " + obj.end.text : " " + translateManager.getValue("empty");
|
||
result += (" " + obj.end.cell);
|
||
|
||
this._setValue(result);
|
||
break;
|
||
}
|
||
case SpeechWorkerType.CellRangeSelectedChangeOne:
|
||
{
|
||
let result = translateManager.getValue("select") + " ";
|
||
result += obj.text ? obj.text : translateManager.getValue("empty");
|
||
result += (" " + obj.cell);
|
||
|
||
this._setValue(result);
|
||
break;
|
||
}
|
||
case SpeechWorkerType.CellRangeUnselectedChangeOne:
|
||
{
|
||
let result = translateManager.getValue("unselected") + " ";
|
||
result += obj.text ? obj.text : translateManager.getValue("empty");
|
||
result += (" " + obj.cell);
|
||
|
||
this._setValue(result);
|
||
break;
|
||
}
|
||
case SpeechWorkerType.MultipleRangesSelected:
|
||
{
|
||
if (obj.ranges)
|
||
{
|
||
let result = translateManager.getValue("selected") + " ";
|
||
result += obj.ranges.length + " " + translateManager.getValue("areas") + " ";
|
||
|
||
for (let i = 0; i < obj.ranges.length; i++) {
|
||
result += obj.ranges[i].startCell + "-" + obj.ranges[i].endCell + " ";
|
||
}
|
||
result += obj.text ? obj.text : translateManager.getValue("empty");
|
||
|
||
this._setValue(result);
|
||
}
|
||
break;
|
||
}
|
||
case SpeechWorkerType.SheetSelected:
|
||
{
|
||
//ms read after "objects" only selection
|
||
//we read selection in next command
|
||
let isEmpty = 0 === obj.cellsCount && 0 === obj.objectsCount;
|
||
let result = "";
|
||
if (isEmpty)
|
||
{
|
||
//ms not read it, read only else
|
||
result = obj.name + " " + translateManager.getValue("empty sheet") + " "/*+ obj.cell*/;
|
||
}
|
||
else
|
||
{
|
||
result = obj.name + " " + translateManager.getValue("end of sheet") + " " + obj.cellEnd + " " +
|
||
obj.cellsCount + " " + translateManager.getValue("cells") + " "
|
||
obj.objectsCount + " " + translateManager.getValue("objects") /*+
|
||
obj.text + " " + obj.cell*/;
|
||
}
|
||
this._setValue(result);
|
||
break;
|
||
}
|
||
default:
|
||
break;
|
||
}
|
||
};
|
||
}
|
||
|
||
window.AscCommon.SpeechWorker = new CWorkerSpeech();
|
||
window.AscCommon.SpeechWorkerCommands = SpeechWorkerType;
|
||
|
||
const SpeakerActionType = {
|
||
unknown : 0,
|
||
keyDown : 1,
|
||
sheetChange : 2,
|
||
undoRedo: 3
|
||
};
|
||
|
||
/**
|
||
* @constructor
|
||
*/
|
||
function EditorActionSpeaker()
|
||
{
|
||
this.speechWorker = window.AscCommon.SpeechWorker;
|
||
this.editor = null;
|
||
|
||
this.isLanched = false;
|
||
|
||
this.onSelectionChange = null;
|
||
this.onActionStart = null;
|
||
this.onActionEnd = null;
|
||
this.onBeforeKeyDown = null;
|
||
this.onKeyDown = null;
|
||
this.onBeforeApplyChanges = null;
|
||
this.onApplyChanges = null;
|
||
this.onBeforeUndoRedo = null;
|
||
this.onUndoRedo = null;
|
||
this.onCloseFile = null;
|
||
|
||
this.selectionState = null;
|
||
this.isAction = false;
|
||
this.isApplyChanges = false;
|
||
this.isKeyDown = false;
|
||
this.isUndoRedo = false;
|
||
|
||
if (AscCommon.EditorActionSpeakerInitData && AscCommon.EditorActionSpeakerInitData.isEnabled)
|
||
this.run();
|
||
}
|
||
EditorActionSpeaker.prototype.toggle = function()
|
||
{
|
||
if (this.isLanched)
|
||
this.stop();
|
||
else
|
||
this.run();
|
||
};
|
||
EditorActionSpeaker.prototype.run = function()
|
||
{
|
||
this.editor = Asc.editor;
|
||
if (!this.editor || this.isLanched)
|
||
return;
|
||
|
||
this.isLanched = true;
|
||
|
||
this.initEvents();
|
||
this.editor.asc_registerCallback('asc_onSelectionEnd', this.onSelectionChange);
|
||
this.editor.asc_registerCallback('asc_onCursorMove', this.onSelectionChange);
|
||
this.editor.asc_registerCallback('asc_onUserActionStart', this.onActionStart);
|
||
this.editor.asc_registerCallback('asc_onUserActionEnd', this.onActionEnd);
|
||
this.editor.asc_registerCallback('asc_onBeforeKeyDown', this.onBeforeKeyDown);
|
||
this.editor.asc_registerCallback('asc_onKeyDown', this.onKeyDown);
|
||
this.editor.asc_registerCallback('asc_onBeforeApplyChanges', this.onBeforeApplyChanges);
|
||
this.editor.asc_registerCallback('asc_onApplyChanges', this.onApplyChanges);
|
||
this.editor.asc_registerCallback('asc_onBeforeUndoRedo', this.onBeforeUndoRedo);
|
||
this.editor.asc_registerCallback('asc_onUndoRedo', this.onUndoRedo);
|
||
this.editor.asc_registerCallback('asc_onBeforeUndoRedoInCollaboration', this.onBeforeUndoRedo);
|
||
this.editor.asc_registerCallback('asc_onUndoRedoInCollaboration', this.onUndoRedo);
|
||
this.editor.asc_registerCallback('asc_onCloseFile', this.onCloseFile);
|
||
|
||
//se
|
||
this.editor.asc_registerCallback('asc_onActiveSheetChanged', this.onActiveSheetChanged);
|
||
|
||
this.selectionState = this.editor.isDocumentLoadComplete ? this.editor.getSelectionState() : null;
|
||
this.isAction = false;
|
||
this.isApplyChanges = false;
|
||
this.isKeyDown = false;
|
||
this.isUndoRedo = false;
|
||
|
||
this.speechWorker.setEnabled(true);
|
||
};
|
||
EditorActionSpeaker.prototype.stop = function()
|
||
{
|
||
if (!this.isLanched)
|
||
return;
|
||
|
||
this.editor.asc_unregisterCallback('asc_onSelectionEnd', this.onSelectionChange);
|
||
this.editor.asc_unregisterCallback('asc_onCursorMove', this.onSelectionChange);
|
||
this.editor.asc_unregisterCallback('asc_onUserActionStart', this.onActionStart);
|
||
this.editor.asc_unregisterCallback('asc_onUserActionEnd', this.onActionEnd);
|
||
this.editor.asc_unregisterCallback('asc_onBeforeKeyDown', this.onBeforeKeyDown);
|
||
this.editor.asc_unregisterCallback('asc_onKeyDown', this.onKeyDown);
|
||
this.editor.asc_unregisterCallback('asc_onBeforeApplyChanges', this.onBeforeApplyChanges);
|
||
this.editor.asc_unregisterCallback('asc_onApplyChanges', this.onApplyChanges);
|
||
this.editor.asc_unregisterCallback('asc_onBeforeUndoRedo', this.onBeforeUndoRedo);
|
||
this.editor.asc_unregisterCallback('asc_onUndoRedo', this.onUndoRedo);
|
||
this.editor.asc_unregisterCallback('asc_onBeforeUndoRedoInCollaboration', this.onBeforeUndoRedo);
|
||
this.editor.asc_unregisterCallback('asc_onUndoRedoInCollaboration', this.onUndoRedo);
|
||
this.editor.asc_unregisterCallback('asc_onCloseFile', this.onCloseFile);
|
||
|
||
//se
|
||
this.editor.asc_unregisterCallback('asc_onActiveSheetChanged', this.onActiveSheetChanged);
|
||
|
||
this.selectionState = null;
|
||
this.isAction = false;
|
||
this.isKeyDown = false;
|
||
this.isApplyChanges = false;
|
||
this.isUndoRedo = false;
|
||
|
||
this.speechWorker.setEnabled(false);
|
||
|
||
this.isLanched = false;
|
||
};
|
||
EditorActionSpeaker.prototype.initEvents = function()
|
||
{
|
||
let _t = this;
|
||
|
||
this.onSelectionChange = function()
|
||
{
|
||
if (_t.isAction
|
||
|| _t.isKeyDown
|
||
|| _t.isApplyChanges
|
||
|| _t.isUndoRedo)
|
||
return;
|
||
|
||
_t.handleSpeechDescription(null);
|
||
};
|
||
|
||
this.onActionStart = function()
|
||
{
|
||
_t.isAction = true;
|
||
};
|
||
|
||
this.onActionEnd = function()
|
||
{
|
||
_t.isAction = false;
|
||
_t.updateState();
|
||
// TODO: Если нужно, то добавить описание действия
|
||
};
|
||
|
||
this.onBeforeKeyDown = function()
|
||
{
|
||
_t.isKeyDown = true;
|
||
};
|
||
|
||
this.onKeyDown = function(e)
|
||
{
|
||
_t.isKeyDown = false;
|
||
_t.handleSpeechDescription({type: SpeakerActionType.keyDown, event : e});
|
||
};
|
||
|
||
this.onBeforeApplyChanges = function()
|
||
{
|
||
_t.isApplyChanges = true;
|
||
};
|
||
|
||
this.onApplyChanges = function()
|
||
{
|
||
_t.isApplyChanges = false;
|
||
_t.updateState();
|
||
// TODO: Если дополнительно сообщить о совместке, то добавить тут
|
||
};
|
||
|
||
this.onBeforeUndoRedo = function()
|
||
{
|
||
_t.isUndoRedo = true;
|
||
};
|
||
|
||
this.onUndoRedo = function()
|
||
{
|
||
_t.isUndoRedo = false;
|
||
_t.handleSpeechDescription({type: SpeakerActionType.undoRedo});
|
||
_t.updateState();
|
||
// TODO: Если дополнительно сообщить об Undo/Redo, то добавить тут
|
||
};
|
||
|
||
this.onActiveSheetChanged = function(index)
|
||
{
|
||
_t.handleSpeechDescription({type: SpeakerActionType.sheetChange, index : index});
|
||
};
|
||
|
||
this.onCloseFile = function()
|
||
{
|
||
_t.resetState();
|
||
};
|
||
|
||
};
|
||
EditorActionSpeaker.prototype.handleSpeechDescription = function(action)
|
||
{
|
||
let state = this.editor.getSelectionState();
|
||
if (!this.selectionState)
|
||
{
|
||
this.selectionState = state;
|
||
return;
|
||
}
|
||
|
||
let speechInfo = this.editor.getSpeechDescription(this.selectionState, action);
|
||
this.selectionState = state;
|
||
if (!speechInfo)
|
||
return;
|
||
|
||
this.speechWorker.speech(speechInfo.type, speechInfo.obj);
|
||
};
|
||
EditorActionSpeaker.prototype.updateState = function()
|
||
{
|
||
this.selectionState = this.editor.getSelectionState();
|
||
};
|
||
EditorActionSpeaker.prototype.resetState = function()
|
||
{
|
||
this.selectionState = null;
|
||
};
|
||
|
||
window.AscCommon.EditorActionSpeaker = new EditorActionSpeaker();
|
||
window.AscCommon.SpeakerActionType = SpeakerActionType;
|
||
|
||
})(window);
|