Differences From
Artifact [00b8c05415]:
- File
extSearch.js
— part of check-in
[6dffec6439]
at
2012-09-04 10:45:17
on branch trunk
— Добавил еще макрос по глобальному поиску по октыртому контейнеру метаданных
(user:
sosnae
size: 39511)
- File
extSearch.js
— part of check-in
[d8b3f65f4a]
at
2012-09-19 09:27:32
on branch trunk
— рефакторинг, для глобального поиска добавил отдельное окно результатов
(user:
sosnae
size: 41239)
72 72 }
73 73
74 74 SelfScript.self['macrosГлобальный поиск'] = function() {
75 75
76 76 var w = GetTextWindow();
77 77 if (!w) return false;
78 78
79 - var es = GetExtSearch();
79 + var es = GetExtSearchGlobal();
80 80
81 81 var selText = w.GetSelectedText();
82 82 if (selText == '')
83 83 selText = w.GetWordUnderCursor();
84 84
85 85 es.isGlobalFind = true;
86 86 es.isInCurrentMdConteinerFind = false;
................................................................................
103 103 //будет открыта внешняя обработка, занчит ищем глобально только по этой обработке.
104 104 //открыт cf файл или же cf базы данных и мы находимся в текстовом модуле определенной
105 105 //конфигурации, значит искать будет по текущей контейнеру.
106 106
107 107 var w = GetTextWindow();
108 108 if (!w) return false;
109 109
110 - var es = GetExtSearch();
110 + var es = GetExtSearchGlobal();
111 111
112 112 var selText = w.GetSelectedText();
113 113 if (selText == '')
114 114 selText = w.GetWordUnderCursor();
115 115
116 116 es.isGlobalFind = true;
117 117 es.isInCurrentMdConteinerFind = true;
................................................................................
128 128
129 129 return true;
130 130 }
131 131
132 132
133 133
134 134 SelfScript.self['macrosОтменить глобальный поиск'] = function() {
135 - var es = GetExtSearch();
135 + var es = GetExtSearchGlobal();
136 136 if (es.startGlobalSearch){
137 137 es.startGlobalSearch = false;
138 138 }
139 139 }
140 140
141 141 SelfScript.self['macrosОткрыть окно поиска'] = function() {
142 142 GetExtSearch().show();
................................................................................
209 209 'WholeWords' : false, // Поиск слова целиком.
210 210 'SearchHistory' : v8New('ValueList'), // История поиска.
211 211 'HistoryDepth' : 15, // Количество элементов истории поиска.
212 212 'TreeView' : false // Группировать результаты поиска по методам.
213 213 }
214 214 },
215 215
216 - construct : function () {
217 -
216 + construct : function (isExtend) {
217 +
218 + if (isExtend == undefined) isExtend = false;
218 219 this._super("scripts\\extSearch.results.ssf");
219 220
220 221 this.form.КлючСохраненияПоложенияОкна = "extSearch.js"
221 222 this.results = this.form.Controls.SearchResults.Value;
222 223 this.results.Columns.Add('_method');
223 224 this.results.Columns.Add('groupsCache');
224 225 this.results.Columns.Add('_object');
................................................................................
235 236 'Proc': this.form.Controls.PicProc.Picture
236 237 }
237 238
238 239 this.SearchDocRowFont = v8New('Font', undefined, undefined, true);
239 240 this.isGlobalFind = false;
240 241
241 242 this.SetControlsVisible();
242 -
243 - ExtSearch._instance = this;
243 + if (!isExtend) ExtSearch._instance = this;
244 244
245 245 },
246 246
247 247 setSimpleQuery : function (query) {
248 248 this.form.Query = query;
249 249 this.form.IsRegExp = false;
250 250 this.form.CaseSensetive = false;
................................................................................
320 320 activeWndResRow = docRow;
321 321 }
322 322 })(windows.mdiView.enumChilds());
323 323
324 324 this.showSearchResult(activeWndResRow, fromHotKey);
325 325 },
326 326
327 - searchByUuid: function(row) {
328 - mdObj = findMdObj(this.currentMdContainer, row.UUID);
329 - var docRow = null;
330 - if (mdObj){
331 -
332 - var obj = this.getWindowObject({
333 - mdObj:mdObj,
334 - mdProp:row.mdProp,
335 - title:row.title});
336 - docRow = this.search(obj, this.re);
337 - }
338 - return docRow;
339 - },
340 -
341 - searchInMetadata : function(fromHotKey){
342 -
343 - var md = null;
344 - if (this.isInCurrentMdConteinerFind ) {
345 - var activeWindow = this.watcher.getActiveTextWindow();
346 - if (!activeWindow) {
347 - } else {
348 - var activeView = activeWindow.GetView();
349 - if (!activeView) {
350 - } else {
351 - if (activeView.mdObj && activeView.mdProp) {
352 - md = activeView.mdObj.container;
353 - }
354 - }
355 - }
356 - }
357 -
358 -
359 - if (!md) {
360 - md = metadata.current;
361 - }
362 - if (!md) return;
363 -
364 - this.currentMdContainer = md;
365 - this.clearSearchResults();
366 - this.re = this.buildSearchRegExpObject();
367 - if (!this.re) return;
368 -
369 - this.curCaption = windows.caption; //а вдруг, еще кто-то не пользуется configCaption...
370 -
371 - this.startGlobalSearch = true;
372 - if (!this.vtMD){
373 - this.vtMD = {};
374 - }
375 - this.readMdToVt(this.currentMdContainer);
376 -
377 - this.curId = 0;
378 -
379 - events.connect(Designer, "onIdle", this);
380 -
381 - //this.showSearchResult(docRow, fromHotKey);
382 - //windows.caption = curCaption;
383 - },
384 -
385 - onIdle:function(){
386 - if (!this.startGlobalSearch) {
387 - windows.caption = this.curCaption;
388 - events.disconnect(Designer, "onIdle", this);
389 - this.showSearchResult(docRow, false);
390 - return;
391 - }
392 - var currentId = this.currentMdContainer.rootObject.id;
393 - if (this.vtMD[currentId].length<1) {
394 - this.startGlobalSearch = false;
395 - events.disconnect(Designer, "onIdle", this);
396 - return;
397 - }
398 -
399 - var count = 0;
400 - var docRow = null;
401 - while (count < 25){
402 - if (this.curId<this.vtMD[currentId].length){
403 - docRow = this.searchByUuid(this.vtMD[currentId][this.curId]);
404 - windows.caption = this.vtMD[currentId][this.curId].mdName;
405 - } else {
406 - this.startGlobalSearch = false;
407 - break;
408 - }
409 - this.curId ++;
410 - count++;
411 - }
412 - this.showSearchResult(null, false);
413 -
414 - },
415 -
416 - readMdToVt:function(MdContainer){
417 - var currentId = MdContainer.rootObject.id;
418 - if (!this.vtMD[currentId]){
419 - var docRow = null;
420 - this.vtMD[currentId] = [];
421 - var es = this;
422 - //Реквизиты пропустим
423 - var ignoredMdClass = {
424 - "Реквизиты":"",
425 - "Макеты" : "" ,
426 - "ОбщиеКартинки" : "" ,
427 - "Элементы стиля" : "" ,
428 - "Подсистемы" : "" ,
429 - "Языки" : "" ,
430 - "Стили" : "" ,
431 - "Интерфейсы" : "" ,
432 - "ПараметрыСеанса" : "" ,
433 - "Роли" : "" ,
434 - "ОбщиеМакеты" : "" ,
435 - "КритерииОтбора" : "" ,
436 - "ОбщиеРеквизиты" : "" ,
437 - "ТабличныеЧасти" : "" ,
438 - "Параметры" : ""
439 - };
440 -
441 - var sort = 0; //Для сортировки модулей функций по порядку обхода, а не по алфавиту.
442 -
443 - (function (mdObj){
444 - if (!es.startGlobalSearch) {return}
445 -
446 - var mdc = mdObj.mdclass;
447 -
448 - function getMdName(mdObj) {
449 - if (mdObj.parent && mdObj.parent.mdClass.name(1) != 'Конфигурация')
450 - return getMdName(mdObj.parent) + '.' + mdObj.mdClass.name(1) + ' ' + mdObj.name;
451 - var cname = mdObj.mdClass.name(1);
452 - return (cname ? cname + ' ' : '') + mdObj.name;
453 - }
454 - var mdName = getMdName(mdObj)
455 -
456 - for(var i = 0, c = mdc.propertiesCount; i < c; i++){
457 - var mdProp = mdc.propertyAt(i);
458 - var mdPropName = mdc.propertyAt(i).name(1);
459 -
460 - if (mdObj.isPropModule(mdProp.id)){
461 - var row = {UUID : mdObj.id}
462 - row.mdProp = mdProp;
463 - row.mdName = mdName;
464 -
465 - sort++;
466 - strSort = "000000"+sort;
467 - strSort = strSort.substr(strSort.length-5);
468 - title = ''+strSort+' '+mdName + ': ' + mdPropName;
469 -
470 - row.title = title;
471 -
472 - es.vtMD[currentId].push(row);
473 - }
474 - }
475 - // Перебираем классы потомков (например у Документа это Реквизиты, ТабличныеЧасти, Формы)
476 - for(var i = 0; i < mdc.childsClassesCount; i++)
477 - {
478 - var childMdClass = mdc.childClassAt(i)
479 -
480 - if (!(ignoredMdClass[childMdClass.name(1, true)]==undefined)){
481 - continue;
482 - }
483 -
484 - // Для остального переберем потомков этого класса.
485 - for(var chldidx = 0, c = mdObj.childObjectsCount(i); chldidx < c; chldidx++){
486 - var childObject = mdObj.childObject(i, chldidx);
487 - arguments.callee(childObject);
488 - }
489 - }
490 - })(MdContainer.rootObject)
491 -
492 - }
493 - },
494 -
495 327 searchActiveDoc : function (fromHotKey) {
496 328
497 329 this.clearSearchResults();
498 330
499 331 var activeWindow = this.watcher.getActiveTextWindow();
500 332 if (!activeWindow) return;
501 333
................................................................................
502 334 var re = this.buildSearchRegExpObject();
503 335 if (!re) return;
504 336
505 337 var obj = this.getWindowObject(activeWindow.GetView());
506 338 if (!obj) return;
507 339
508 340 var docRow = this.search(obj, re);
509 - this.isGlobalFind = false;
510 341
511 342 this.showSearchResult(docRow, fromHotKey);
512 343 },
513 344
514 345 buildSearchRegExpObject : function () {
515 346
516 347 var pattern = this.form.Query;
................................................................................
597 428 {
598 429 this.results.Rows.Delete(docRow);
599 430 docRow = null;
600 431 }
601 432
602 433 return docRow;
603 434 },
604 -
605 - showSearchResult: function (docRow, fromHotKey) {
606 -
435 +
436 + showResult: function(docRow, fromHotKey){
607 437 this.results.Rows.Sort('FoundLine', false);
608 -
609 - this.expandTree();
610 -
611 438 // Запомним строку поиска в истории.
612 439 this.addToHistory(this.form.Query);
613 -
614 - if (this.results.Rows.Count() == 0)
615 - {
616 - if(!this.isGlobalFind){
617 - DoMessageBox('Совпадений не найдено!');
618 - }
619 - return;
620 - }
621 -
440 +
622 441 if (fromHotKey == true)
623 442 {
624 443 // Для того чтобы курсор не прыгал при поиске текущего слова,
625 444 // тут бы еще добавить чтобы активизировалась именно текущая строка
626 445 this.form.Open();
627 446 this.form.CurrentControl=this.form.Controls.SearchResults;
628 447 if (docRow)
................................................................................
635 454 else if (docRow)
636 455 {
637 456 if (this.form.TreeView)
638 457 this.goToLine(docRow.Rows.Get(0).Rows.Get(0));
639 458 else
640 459 this.goToLine(docRow.Rows.Get(0));
641 460 }
642 - //this.SetControlsVisible();
461 +
462 + },
463 +
464 + showSearchResult: function (docRow, fromHotKey) {
465 +
466 + this.showResult(docRow, fromHotKey);
467 + this.expandTree();
468 +
469 + if (this.results.Rows.Count() == 0)
470 + {
471 + DoMessageBox('Совпадений не найдено!');
472 + return;
473 + }
474 +
475 + this.SetControlsVisible();
643 476 },
644 477
645 478 getRowForTheCurrentLine: function(docRow) {
646 479 var twnd = docRow._object.activate();
647 480 return docRow.Rows.Find(twnd.GetCaretPos().beginRow, "LineNo", true);
648 481 },
649 482
................................................................................
851 684
852 685 CmdBar_BtNext : function (control) {
853 686 this.moveRowCursor(true);
854 687 },
855 688
856 689 Query_OnChange : function (control) {
857 690 if (this.form.Query != '')
858 - if (!this.isGlobalFind){ // Если глобальный поиск, тогда автоматом не будем искать.
859 691 this.searchActiveDoc();
860 - }
861 692 },
862 693
863 694 Query_StartListChoice : function (control, defaultHandler) {
864 695 control.val.ChoiceList = this.form.SearchHistory;
865 696 },
866 697
867 698 BtSearch_Click : function (control) {
868 699
869 700 if (this.form.Query == '')
870 701 {
871 702 DoMessageBox('Не задана строка поиска');
872 703 return;
873 704 }
874 - if (this.isGlobalFind) {
875 - this.searchInMetadata(true);
876 - } else {
877 - this.searchActiveDoc();
878 - }
879 705
706 + this.searchActiveDoc();
880 707 },
881 708
882 709 CmdBarOptions_BtAbout : function (control) {
883 710 RunApp('http://snegopat.ru/scripts/wiki?name=extSearch.js');
884 711 },
885 712
886 713 SearchResults_Selection : function (control, selectedRow, selectedCol, defaultHandler) {
................................................................................
1016 843
1017 844 var buttons = this.form.Controls.CmdBar.Buttons;
1018 845 buttons.ExpandAll.Enabled = this.form.TreeView;
1019 846 buttons.Actions.Buttons.ExpandAll.Enabled = this.form.TreeView;
1020 847 buttons.CollapseAll.Enabled = this.form.TreeView;
1021 848 buttons.Actions.Buttons.CollapseAll.Enabled = this.form.TreeView;
1022 849
1023 - if (this.isGlobalFind){
1024 - this.form.caption = "Расширенный поиск в модуле (глобальный)";
1025 - } else {
1026 - this.form.caption = "Расширенный поиск в модуле";
1027 -
1028 - }
1029 -
850 + this.form.caption = "Расширенный поиск в модуле";
1030 851 }
1031 852
1032 853 }); // end of ExtSearch class
854 +
855 +ExtSearchGlobal = ExtSearch.extend({
856 +
857 + settingsRootPath : SelfScript.uniqueName+"Global", // тест, пускай у нас и настройки будут глобальными.
858 +
859 + settings : {
860 + pflSnegopat : {
861 + 'IsRegExp' : false, // Поиск регулярными выражениями.
862 + 'CaseSensetive' : false, // Учитывать регистр при поиске.
863 + 'WholeWords' : false, // Поиск слова целиком.
864 + 'SearchHistory' : v8New('ValueList'), // История поиска.
865 + 'HistoryDepth' : 15, // Количество элементов истории поиска.
866 + 'TreeView' : false // Группировать результаты поиска по методам.
867 + }
868 + },
869 +
870 + construct : function () {
871 +
872 + this._super(true);
873 +
874 + this._instance = null;
875 +
876 + this.form.КлючСохраненияПоложенияОкна = "extGlobalSearch.js";
877 +
878 + this.isGlobalFind = true;
879 +
880 + this.SetControlsVisible();
881 +
882 + ExtSearchGlobal._instance = this;
883 + },
884 +
885 + searchByUuid: function(row) {
886 + mdObj = findMdObj(this.currentMdContainer, row.UUID);
887 + var docRow = null;
888 + if (mdObj){
889 +
890 + var obj = this.getWindowObject({
891 + mdObj:mdObj,
892 + mdProp:row.mdProp,
893 + title:row.title});
894 + docRow = this.search(obj, this.re);
895 + }
896 + return docRow;
897 + },
898 +
899 + searchInMetadata : function(fromHotKey){
900 +
901 + var md = null;
902 + if (this.isInCurrentMdConteinerFind ) {
903 + var activeWindow = this.watcher.getActiveTextWindow();
904 + if (!activeWindow) {
905 + } else {
906 + var activeView = activeWindow.GetView();
907 + if (!activeView) {
908 + } else {
909 + if (activeView.mdObj && activeView.mdProp) {
910 + md = activeView.mdObj.container;
911 + }
912 + }
913 + }
914 + }
915 +
916 +
917 + if (!md) {
918 + md = metadata.current;
919 + }
920 + if (!md) return;
921 +
922 + this.currentMdContainer = md;
923 + this.clearSearchResults();
924 + this.re = this.buildSearchRegExpObject();
925 + if (!this.re) return;
926 +
927 + this.curCaption = windows.caption; //а вдруг, еще кто-то не пользуется configCaption...
928 +
929 + this.startGlobalSearch = true;
930 + if (!this.vtMD){
931 + this.vtMD = {};
932 + }
933 + this.readMdToVt(this.currentMdContainer);
934 +
935 + this.curId = 0;
936 +
937 + events.connect(Designer, "onIdle", this);
938 +
939 + //this.showSearchResult(docRow, fromHotKey);
940 + //windows.caption = curCaption;
941 + },
942 +
943 + onIdle:function(){
944 + if (!this.startGlobalSearch) {
945 + windows.caption = this.curCaption;
946 + events.disconnect(Designer, "onIdle", this);
947 + this.showSearchResult(docRow, false);
948 + return;
949 + }
950 + var currentId = this.currentMdContainer.rootObject.id;
951 + if (this.vtMD[currentId].length<1) {
952 + this.startGlobalSearch = false;
953 + events.disconnect(Designer, "onIdle", this);
954 + return;
955 + }
956 +
957 + var count = 0;
958 + var docRow = null;
959 + while (count < 25){
960 + if (this.curId<this.vtMD[currentId].length){
961 + docRow = this.searchByUuid(this.vtMD[currentId][this.curId]);
962 + windows.caption = this.vtMD[currentId][this.curId].mdName;
963 + } else {
964 + this.startGlobalSearch = false;
965 + break;
966 + }
967 + this.curId ++;
968 + count++;
969 + }
970 + this.showSearchResult(null, false);
971 +
972 + },
973 +
974 + readMdToVt:function(MdContainer){
975 + var currentId = MdContainer.rootObject.id;
976 + if (!this.vtMD[currentId]){
977 + var docRow = null;
978 + this.vtMD[currentId] = [];
979 + var es = this;
980 + //Реквизиты пропустим
981 + var ignoredMdClass = {
982 + "Реквизиты":"",
983 + "Макеты" : "" ,
984 + "ОбщиеКартинки" : "" ,
985 + "Элементы стиля" : "" ,
986 + "Подсистемы" : "" ,
987 + "Языки" : "" ,
988 + "Стили" : "" ,
989 + "Интерфейсы" : "" ,
990 + "ПараметрыСеанса" : "" ,
991 + "Роли" : "" ,
992 + "ОбщиеМакеты" : "" ,
993 + "КритерииОтбора" : "" ,
994 + "ОбщиеРеквизиты" : "" ,
995 + "ТабличныеЧасти" : "" ,
996 + "Параметры" : ""
997 + };
998 +
999 + var sort = 0; //Для сортировки модулей функций по порядку обхода, а не по алфавиту.
1000 +
1001 + (function (mdObj){
1002 + if (!es.startGlobalSearch) {return}
1003 +
1004 + var mdc = mdObj.mdclass;
1005 +
1006 + function getMdName(mdObj) {
1007 + if (mdObj.parent && mdObj.parent.mdClass.name(1) != 'Конфигурация')
1008 + return getMdName(mdObj.parent) + '.' + mdObj.mdClass.name(1) + ' ' + mdObj.name;
1009 + var cname = mdObj.mdClass.name(1);
1010 + return (cname ? cname + ' ' : '') + mdObj.name;
1011 + }
1012 + var mdName = getMdName(mdObj)
1013 +
1014 + for(var i = 0, c = mdc.propertiesCount; i < c; i++){
1015 + var mdProp = mdc.propertyAt(i);
1016 + var mdPropName = mdc.propertyAt(i).name(1);
1017 +
1018 + if (mdObj.isPropModule(mdProp.id)){
1019 + var row = {UUID : mdObj.id}
1020 + row.mdProp = mdProp;
1021 + row.mdName = mdName;
1022 +
1023 + sort++;
1024 + strSort = "000000"+sort;
1025 + strSort = strSort.substr(strSort.length-5);
1026 + title = ''+strSort+' '+mdName + ': ' + mdPropName;
1027 +
1028 + row.title = title;
1029 +
1030 + es.vtMD[currentId].push(row);
1031 + }
1032 + }
1033 + // Перебираем классы потомков (например у Документа это Реквизиты, ТабличныеЧасти, Формы)
1034 + for(var i = 0; i < mdc.childsClassesCount; i++)
1035 + {
1036 + var childMdClass = mdc.childClassAt(i)
1037 +
1038 + if (!(ignoredMdClass[childMdClass.name(1, true)]==undefined)){
1039 + continue;
1040 + }
1041 +
1042 + // Для остального переберем потомков этого класса.
1043 + for(var chldidx = 0, c = mdObj.childObjectsCount(i); chldidx < c; chldidx++){
1044 + var childObject = mdObj.childObject(i, chldidx);
1045 + arguments.callee(childObject);
1046 + }
1047 + }
1048 + })(MdContainer.rootObject)
1049 +
1050 + }
1051 + },
1052 +
1053 +
1054 + Query_OnChange : function(Control){
1055 +
1056 + return;
1057 +
1058 + },
1059 +
1060 + BtSearch_Click : function (control) {
1061 +
1062 + if (this.form.Query == '')
1063 + {
1064 + DoMessageBox('Не задана строка поиска');
1065 + return;
1066 + }
1067 +
1068 + this.searchInMetadata(true);
1069 + },
1070 +
1071 +
1072 + SetControlsVisible : function(){
1073 + this._super();
1074 + if (this.isGlobalFind){
1075 + this.form.caption = "Расширенный поиск в модуле (глобальный)";
1076 + }
1077 + },
1078 +
1079 + showSearchResult: function (docRow, fromHotKey) {
1080 + this.showResult(docRow, fromHotKey);
1081 + this.expandTree();
1082 + }
1083 +
1084 +
1085 +})
1033 1086
1034 1087 ////} ExtSearch
1035 1088
1036 1089 ////////////////////////////////////////////////////////////////////////////////////////
1037 1090 ////{ Вспомогательные объекты.
1038 1091 ////
1039 1092
................................................................................
1142 1195 ////
1143 1196 function GetExtSearch() {
1144 1197 if (!ExtSearch._instance)
1145 1198 new ExtSearch();
1146 1199
1147 1200 return ExtSearch._instance;
1148 1201 }
1202 +
1203 +function GetExtSearchGlobal() {
1204 + if (!ExtSearchGlobal._instance)
1205 + new ExtSearchGlobal();
1206 +
1207 + return ExtSearchGlobal._instance;
1208 +}
1209 +
1149 1210
1150 1211 events.connect(Designer, "beforeExitApp", GetExtSearch());
1212 +events.connect(Designer, "beforeExitApp", GetExtSearchGlobal());
1151 1213 ////}