Artifact [d861caeda4] Вы: nobody
Вход

Artifact d861caeda40d67730c39a12936016011143a3489:


$engine JScript
$uname SciColorerV8Manager
$dname SciColorerV8 Manager
$addin stdcommands

var addinSciColorerV8 = 0;
var objectSciColorerV8 = 0;
InitAddin()

function macros_ПриКликеПоГиперссылке(){ //предопределенная, вызывается при Ctrl+Click на любом идентификаторе в тексте модуля
    addins.byUniqueName("SnegopatMainScript").invokeMacros("ПерейтиКОпределению")
}

function macros_ПриКонтекстномМенюНаНомерахСтрок(){ //предопределенная, вызывается при правом клике на номерах строк
    addins.byUniqueName("SciColorerV8").invokeMacros("_ПоказатьМеню");
}

function macrosОтключитьАвтосравнениеДляТекущегоОкнаОтладка(){
    addins.byUniqueName("SciColorerV8").invokeMacros("_ОтключитьАвтосравнениеДляТекущегоОкна")
}

SelfScript.self['macrosСвернуть или развернуть текущий блок'] = function() {
    addins.byUniqueName("SciColorerV8").invokeMacros("_СвернутьРазвернутьТекущийБлок")
}

SelfScript.self['macrosСвернуть все'] = function()
{
    addins.byUniqueName("SciColorerV8").invokeMacros("_СвернутьВсе")
}

SelfScript.self['macrosСвернуть все (с учетом настроек)'] = function()
{
    addins.byUniqueName("SciColorerV8").invokeMacros("_СвернутьВсеПоНастройкам")
}

SelfScript.self['macrosРазвернуть все'] = function()
{
    addins.byUniqueName("SciColorerV8").invokeMacros("_РазвернутьВсе")
}

SelfScript.self['macrosПрокрутка строки вверх'] = function()
{
    addins.byUniqueName("SciColorerV8").invokeMacros("_ПрокруткаСтрокиВверх")
}

SelfScript.self['macrosПрокрутка строки вниз'] = function()
{
    addins.byUniqueName("SciColorerV8").invokeMacros("_ПрокруткаСтрокиВниз")
}

SelfScript.self['macrosСброс модифицированности строк'] = function()
{
    addins.byUniqueName("SciColorerV8").invokeMacros("_СбросМодифицированныхСтрок")
}

function macrosНастройки(){
    addins.byUniqueName("SciColorerV8").invokeMacros("_Настройки")
}

SelfScript.self['macrosСкрыть\\Показать Scintilla'] = function(){
    addins.byUniqueName("SciColorerV8").invokeMacros("_Скрыть")
}

//подробное описание по работе с компонентой Scintilla находится здесь http://www.scintilla.org/ScintillaDoc.html
SelfScript.self['macrosКлонировать текущий блок'] = function()
{
    var hwnd = getActiveScintillaHandle()
    if (hwnd){
        var curPos = SendSciMessage(hwnd,SCI_GETCURRENTPOS);
        var curLine = SendSciMessage(hwnd,SCI_LINEFROMPOSITION,curPos);
        var startLine = curLine;
        if (!(SendSciMessage(hwnd,SCI_GETFOLDLEVEL,curLine) & SC_FOLDLEVELHEADERFLAG))
            startLine = SendSciMessage(hwnd,SCI_GETFOLDPARENT,curLine);
        var endLine = SendSciMessage(hwnd,SCI_GETLASTCHILD,startLine,-1);
        var startPos = SendSciMessage(hwnd,SCI_POSITIONFROMLINE,startLine);
        var endPos = SendSciMessage(hwnd,SCI_GETLINEENDPOSITION,endLine);
        SendSciMessage(hwnd,SCI_SETSEL,startPos,endPos);
        addins.byUniqueName("textEditorExt").invokeMacros("КлонироватьТекст")
    }
}

SelfScript.self['macrosПерейти к следующему изменённому блоку'] = function()
{
    var hwnd = getActiveScintillaHandle()
    if (hwnd){
        var curPos = SendSciMessage(hwnd,SCI_GETCURRENTPOS);
        var curLine = SendSciMessage(hwnd,SCI_LINEFROMPOSITION,curPos);
        var nextModLine = SendSciMessage(hwnd,SCI_GETNEXTMODLINE,0,curLine);
        var startPos = SendSciMessage(hwnd,SCI_POSITIONFROMLINE,nextModLine);
        SendSciMessage(hwnd,SCI_SETSEL,startPos,startPos);
    }
}

SelfScript.self['macrosПерейти к предыдущему изменённому блоку'] = function()
{
    var hwnd = getActiveScintillaHandle()
    if (hwnd){
        var curPos = SendSciMessage(hwnd,SCI_GETCURRENTPOS);
        var curLine = SendSciMessage(hwnd,SCI_LINEFROMPOSITION,curPos);
        var nextModLine = SendSciMessage(hwnd,SCI_GETPREVMODLINE,0,curLine);
        var startPos = SendSciMessage(hwnd,SCI_POSITIONFROMLINE,nextModLine);
        SendSciMessage(hwnd,SCI_SETSEL,startPos,startPos);
    }
}

SelfScript.self['macrosПоказать список изменённых блоков'] = function()
{
    var WM_COMMAND = 273
    var ID_SHOWMODLINES = 20068
    var hwnd = getActiveScintillaHandle()
    if (hwnd){
        SendSciMessage(hwnd,WM_COMMAND,ID_SHOWMODLINES);
    }
}

SelfScript.self['macrosПоказать\\Скрыть непечатные символы'] = function(){
    addins.byUniqueName("SciColorerV8").invokeMacros("_ПоказатьСкрытьНепечатныеСмволы")
}



function getPredefinedHotkeys(predef)
{
    predef.setVersion(3)
    predef.add("Свернуть или развернуть текущий блок", "Ctrl + NumAdd")
    predef.add("Свернуть или развернуть текущий блок", "Ctrl + Num-")
    predef.add("Развернуть все", "Ctrl + Shift + NumAdd")
    predef.add("Свернуть все", "Ctrl + Shift + Num-")
    predef.add("Прокрутка строки вверх", "Ctrl + Up")
    predef.add("Прокрутка строки вниз", "Ctrl + Down")
}

function InitAddin()
{
    var msgFile = v8New("ТекстовыйДокумент")
    var path = SelfScript.fullPath.replace(/^script:/i,'').replace(/SciColorerV8Manager.js$/i,'SciMessages.inl')
    try{
        msgFile.Прочитать(path)
    }catch(e){
        MessageBox("SciColorerV8: Ошибка чтения файла определений " + path + "\n" + e.description)
        return
    }
    for(i=1;i<=msgFile.КоличествоСтрок();i++){
        var curLine = msgFile.ПолучитьСтроку(i);
        var arr = curLine.split(" ")
        SelfScript.self[arr[0]] = parseInt(arr[1])
    }
}

function getActiveScintillaHandle(){
    if (!addinSciColorerV8) {
        addinSciColorerV8 = addins.byUniqueName("SciColorerV8");
        objectSciColorerV8 = addinSciColorerV8.invokeMacros("_GetObject");
    }
    return addinSciColorerV8.invokeMacros("_GetActiveScintillaHandle");
}

function SendSciMessage(hwnd,msg){
    var wparam = (arguments.length > 2) ? arguments[2] : 0;
    var lparam = (arguments.length > 3) ? arguments[3] : 0;
    return objectSciColorerV8.SendSciMessage(hwnd,msg,wparam,lparam);
}

events.connect(snegopat, "onProcessTemplate", SelfScript.self)

// Функции для фикса положения каретки после вставки шаблона
// При вставке шаблона вычисляем, куда будет вставллена каретка,
// подписываемся на onIdle и там устанавливаем ее куда надо
var fix
function onProcessTemplate(param)
{
    var caretPos = param.text.indexOf("<?>")
    if(-1 == caretPos)
        caretPos = param.text.length
    var tw = Snegopat.activeTextWindow()
    if(tw)
    {
        fix =  {line: 0, col: 0}    // Вычисляем смещение позиции вставки каретки в строках и колонках
        for(var i = 0; i < caretPos; i++)
        {
            if('\n' == param.text.charAt(i))
            {
                fix.line++;
                fix.col = 1
            }
            else
                fix.col++
        }
        events.connect(Designer, "onIdle", SelfScript.self)
    }
}
function onIdle()
{
    var tw = Snegopat.activeTextWindow()
    if(tw && fix)
    {
        // Ставим каретку куда надо
        var sel = tw.getSelection()
        tw.setCaretPos(sel.beginRow + fix.line, fix.line ? fix.col : sel.beginCol + fix.col)
    }
    // Отписываемся от события
    events.disconnect(Designer, "onIdle", SelfScript.self)
}

stdcommands.Frntend.GoToDefinition.addHandler(SelfScript.self, "onGoToDefinition");
var prevSciHwnd = 0;
var prevSciPos = 0;
function onGoToDefinition(cmd)
{
    if (cmd.isBefore){
        prevSciHwnd = getActiveScintillaHandle();
        if (prevSciHwnd) prevSciPos = SendSciMessage(prevSciHwnd,SCI_GETCURRENTPOS);
    }else{
        var hwnd = getActiveScintillaHandle()
        if (hwnd){
            var curPos = SendSciMessage(hwnd,SCI_GETCURRENTPOS);
            
            if ((hwnd==prevSciHwnd) && (curPos==prevSciPos)) return;
            
            var curLine = SendSciMessage(hwnd,SCI_LINEFROMPOSITION,curPos);
            var visibleLine = SendSciMessage(hwnd,SCI_VISIBLEFROMDOCLINE,curLine);
            var firstVisible = SendSciMessage(hwnd,SCI_GETFIRSTVISIBLELINE);
            SendSciMessage(hwnd,SCI_LINESCROLL,0,visibleLine-firstVisible-1); //скроллим редактор так чтобы текущая строка оказалась на самом верху
        }
    }
}