$engine JScript
$uname CfgStore
$dname Хранилище
$addin global
$addin stdcommands
$addin stdlib
////////////////////////////////////////////////////////////////////////////////////////
////{ Cкрипт "Хранилище" (CfgStore.js) для проекта "Снегопат"
////
//// Описание:
//// Есть макрос Захватить объект в хранилище (временно хоткей "Ctrl + Alt + T")
//// макрос захватывает любой текущий объект (модуль, форму, макет, сам объект и т.п.) в хранилище.
//// Важно: захват всегда идет без рекурсии, только текущий объект, имхо это более правильно при редактировании текущего объекта.
//// для внешних объектов макрос ничего не делает.
////
//// Автор: Артур Аюханов <aartbear@gmail.com>
////}
////////////////////////////////////////////////////////////////////////////////////////
stdlib.require('ScriptForm.js', SelfScript);
stdlib.require('log4js.js', SelfScript);
stdlib.require('SyntaxAnalysis.js', SelfScript);
stdlib.require('TextWindow.js', SelfScript);
global.connectGlobals(SelfScript)
var logger = Log4js.getLogger(SelfScript.uniqueName);
var appender = new Log4js.BrowserConsoleAppender();
appender.setLayout(new Log4js.PatternLayout(Log4js.PatternLayout.TTCC_CONVERSION_PATTERN));
appenders = [];
appenders.push(appender);
logger.onlog = new Log4js.CustomEvent();
logger.onclear = new Log4js.CustomEvent();
logger.setAppenders(appenders);
logger.setLevel(Log4js.Level.ERROR);
function getPredefinedHotkeys(predef){
predef.setVersion(1);
predef.add("Захватить объект в хранилище", "Ctrl + Alt + T");
}
function CaptureIntoCfgStore(mdObj){
if (!mdObj)
return
try{
res1 = mdObj.activateInTree();
res2 = events.connect(windows, "onDoModal", SelfScript.self, "hookCaptureCfgStoreWindow")
isEventConnected = true
res = stdcommands.CfgStore.CaptureIntoCfgStore.send() // true если успешно
if(isEventConnected)
events.disconnect(windows, "onDoModal", SelfScript.self, "hookCaptureCfgStoreWindow")
} catch (e) {
Message("Ошибка : " + e.description)
}
}
isEventConnected = false
SelfScript.self['macrosЗахватить объект в хранилище'] = function() {
try{ //иногда вылетают странные исключения :( при работе с элементами форм
view = windows.getActiveView();
if (!view || !view.mdObj || view.mdObj.container != metadata.current) return false;
CaptureIntoCfgStore(view.mdObj);
if(view)
view.activate();
}catch(e)
{
Message("Ошибка : " + e.description)
}
return true;
}
SelfScript.self['macrosПоместить объект в хранилище'] = function() {
try{ //иногда вылетают странные исключения :( при работе с элементами форм
view = windows.getActiveView();
if (!view || !view.mdObj || view.mdObj.container != metadata.current) return false;
res1 = view.mdObj.activateInTree();
isEventConnected = true
res = stdcommands.CfgStore.StoreIntoCfgStore.send() // true если успешно
}catch(e)
{
Message("Ошибка : " + e.description)
}
return true;
}
function hookCaptureCfgStoreWindow(dlgInfo){
if(dlgInfo.stage == openModalWnd)
{
try{ //иногда вылетают странные исключения :( при работе с элементами форм
dlgInfo.form.getControl("GetRecursive").value = false;
events.disconnect(windows, "onDoModal", SelfScript.self, "hookCaptureCfgStoreWindow")
isEventConnected = false
//new ActiveXObject("WScript.Shell").SendKeys("^{ENTER}")
// Более идеологически верный способ
dlgInfo.cancel = true
dlgInfo.result = mbaOK
}catch(e)
{
Message("Ошибка : " + e.description)
}
}
}
function hookCfgStorWindow(dlgInfo){
if(dlgInfo.stage == openModalWnd)
{
try{ //иногда вылетают странные исключения :( при работе с элементами форм
//FIXME: добавить английский заголовок и других языков.
reCaptionCfgStore = /Захват\sобъектов\sв\sхранилище\sконфигурации/ig
if (reCaptionCfgStore.test(dlgInfo.Caption)){
md = metadata.current;
if (!md){
return;
}
nameMd = md.rootObject.name;
reRootObject = new RegExp(nameMd, 'ig');
reviseObjectList = toV8Value(dlgInfo.form.getControl("ReviseObjectList").value);
reviesObjectText = reviseObjectList.toStringInternal();
if (reRootObject.test(reviesObjectText)){
dlgInfo.form.getControl("GetRecursive").value = false;
}
}
}catch(e){
Message("Ошибка : " + e.description)
}
}
}
SelfScript.self['macrosПерехват рекурсивного захвата корня'] = function() {
result = events.connect(windows, "onDoModal", SelfScript.self, "hookCfgStorWindow")
}
SelfScript.self['macrosСтоп перехвата рекурсивного захвата корня'] = function() {
try{
result = events.disconnect(windows, "onDoModal", SelfScript.self, "hookCfgStorWindow")
} catch(e){
Message("Ошибка :"+e.description);
}
}
FilterCurrentUserInCfgStore = stdlib.Class.extend({
construct : function () {
this.groupId = "{6B7291BF-BCD2-41AF-BAC7-414D47CC6E6A}";
this.numId = 53;
this.count = 3;
this.re = new RegExp(/Хранилище конфигурации/);
this.Form = null;
FilterCurrentUserInCfgStore._instance = this;
stdcommands.CfgStore.OpenCfgStore.addHandler(this, "OpenCfgStore");
},
OpenCfgStore:function (cmd) {
if(!cmd.isBefore)
{
logger.debug("OpenCfgStore is before start")
try {
this.count = 3;
//start timer
stdlib.setTimeout(function(){
var filter = GetFilterCurrentUserInCfgStore();
filter.setFilter();
}, 2000);
} catch (e) { }
} else {
//Message("Удалить лишние файлы.");
logger.debug("OpenCfgStore is after start")
}
},
setFilter:function(){
this.foundWindows(windows.mdiView.enumChilds());
this.count--;
logger.debug("count "+this.count);
if(!this.Form && this.count > 0){
logger.debug("Не нашли формы, но еще раз запустим таймер "+this.count);
stdlib.setTimeout(function(){
var filter = GetFilterCurrentUserInCfgStore();
filter.setFilter();
}, 2000);
return;
} else {
this.count = 0;
}
if(!this.Form){
logger.error("Не найденна форма хранилища")
return;
}
events.connect(windows, "onDoModal", this, "setCfgWndFilter");
this.Form.sendCommand(this.groupId, this.numId);
},
setCfgWndFilter:function(dlgInfo){
logger.debug(dlgInfo.stage);
if(dlgInfo.stage == openModalWnd){
try{ //иногда вылетают странные исключения :( при работе с элементами форм
//FIXME: добавить английский заголовок и других языков.
reCaptionCfgStore = /Отбор\sобъектов\sхранилища/ig
if (reCaptionCfgStore.test(dlgInfo.Caption)){
dlgInfo.form.getControl("FilterType").value = 2
dlgInfo.cancel = true
dlgInfo.result = mbaOK
}
}catch(e){
logger.error("Ошибка : " + e.description);
}
} else if(dlgInfo.stage == afterDoModal){
try {
events.disconnect(windows, "onDoModal", this, "setCfgWndFilter");
} catch (e) {
logger.error("Ошибка disconnect: " + e.description);
}
}
},
foundWindows:function(childs){
// При посылке команды окно стает активным, чтобы не нарушить порядок окон, переберем их
// в обратном порядке
for(var i = childs.count; i-- ; )
{
var view = childs.item(i)
if(view.isContainer != vctNo)
this.foundWindows(view.enumChilds())
else
{
// Возможно, это окно формы, но не открыто на вкладке модуля
var r = view.title;
logger.debug("find "+r+"re "+this.re);
var mathes = r.match(this.re);
if (mathes && mathes.length) {
this.title = r
var caption = ''+windows.caption;
if (view.getInternalForm()){
logger.debug("found "+r);
this.Form = view.getInternalForm();
return;
}
}
//if(view.mdObj && view.mdProp && view.mdObj.isPropModule(view.mdProp.id))
// view.mdObj.openModule(view.mdProp.id) // переключим на вкладку модуля
}
}
}
})
function GetFilterCurrentUserInCfgStore() {
if (!FilterCurrentUserInCfgStore._instance)
new FilterCurrentUserInCfgStore();
return FilterCurrentUserInCfgStore._instance;
}
var fuCfgStroe = GetFilterCurrentUserInCfgStore();
//stdlib.setTimeout(function() { events.connect(windows, "onDoModal", SelfScript.self, "hookCfgStorWindow"); }, 3000);