1

Тема: Создание панели для быстрого ввода Building Blocks.

Создание панели для быстрого ввода Building Blocks.
(По неостывшим следам Александра Витера.) 
cool

Суть проблемы.
Предположим, вам приходится в короткое время давать описание какому-нибудь животному или растению. Да, прямо перед вами сидит посетитель и ожидает этого описания.

Количество различных существ и определяющих признаков ограничено, но не настолько, чтобы ограничится только заранее написанными вариантами – файлами. Нужны изменяемые шаблоны! С другой стороны, можно приложить усилия и попытаться систематизировать признаки каждого существа в рамках шаблона: Корень, ствол, крона. Голова, туловище, хвост.

Зафиксировать признаки в виде кусков автотекста и куски этого автотекста удобно расположить на панели, то можно с определённой натяжкой охватить бесконечное разнообразие вариантов.

Лучшее уже было! sad
Как я решал эту проблему в W2003.
Я создавал шаблон под каждое животное. Под каждый шаблон писал индивидуальный автотекст и сохранял его именно в шаблоне, а не в нашем Normal.dot. Далее на панели автотекста выводил средствами самого редактора новое меню, посвящённое каждой части тела. На это меню сверху сажал ещё несколько новых меню посвящённых каждому признаку. В результате получалась стройная система легко доступных меню. К концевому меню был привязан кусок автотекста.

Нет, ну некоторые американцы точно тупые! mad

Нагадано пришла беда в виде красиво-бесполезного W2007,
где вышеуказанный механизм постройки меню исчез!
Система экспресс блоков, пришедшая на смену компактному автотексту из W2003 огромна и трудно контролируема. Даже возможность сортировки по коллекциям не помогает!
Представьте себе мешанину из стволов, хвостов, корней, голов в одном, распадающемся до пола окне Building blocks. А теперь помножьте раздражения от мягко говоря, непростых поисков, на необходимость писать быстро, так как у посетителя собака, рычит, яблоня вянет, а кошка рвёт колготки девушке на reception.

И все смотрят на вас, что вы там возитесь! mad  sad

В довершении ко всем издевательствам команда Большого Билла накидала в стандартные экспресс блоки ещё кучу всяких гадких примеров колонтитулов, рисунков и т.п.  mad
От чего просто лезть туда уже даже страшно! yikes
Ситуация незначительно улучшилась в W2010 sad
Стало можно создать отдельную вкладку и попытаться средствами офиса вывести на неё значки: автотекст, настраиваемый автотекст, экспресс блоки, и того до 9 крупных как бы индивидуальных меню.
Так я и пытался работать последние 4 месяца.  sad
Но, поверьте, если ты держишь в голове «у этой коровы нет правого рога», big_smile  а в прихожей визжит секретарша отрывая колготки от когтей следующей бешеной кошки, big_smile  сразу вспомнить что хвосты у тебя в настраиваемой коллекции №4 в середине, потому что хвост снизу и ты расположил его рядом с копытами – бывает очень сложно. sad
Лучик Надежды.
Уже здесь, с лёгкой руки Антона Вадимовича и Александра Витера, я познакомился с замечательной программой Ribbon XML Editor. Её автор Новикова Максима Глебовича. внешняя ссылка 
Человек замечательный, ещё более замечательная его программа. Ну, посудите сами, уже одно то, что она проверяет синтаксис таких криворуких «программистов» как я говорит о многом. Именно благодаря ей и забрезжил лучик надежды…
Ну и конечно благодаря нашим друзьям Антону Вадимовичу и Александру Витеру, который оставил записки с сокровенными знаниями в своём блоге внешняя ссылка 

В жизни просто не бывает!
Бывает или сложно или очень сложно. Каюсь, пока Александр Витер присутствовал на сайте я откладывал решительный штурм проблемы… Уж очень запутанной она казалась. Он написал отдельную доску в своём блоге про автотекст. Но каюсь понять её я не смог.
А потом Александр Витер уехал и конечно, ожидать, что он вернётся разъяснить сокровенную истину, заключённую в своих скрижалях я конечно не могу. У него там и без нас наверняка проблем достаточно.

Короче!Вариант решения.
Создаём отдельную вкладку, но не перед главной, а сразу после. Главная нужна, «руками не трогать!» Вкладку называем «Мой автотекст».
Так как придётся работать с каждым шаблоном индивидуально, то отгораживаем группу с элементами ввести «фрагмент в автотекст» «сохранить в коллекцию экспресс блоков» и «организатор экспресс блоков».
Далее выводим по 9 групп по числу автотекстов настраиваемых экспресс блоков и 5 коллекций
Почему их не заключить в отдельный контейнер и сэкономить место?
К сожалению, для моего воспалённого рассудка самоуверенного чайника это уже сложно!
Как переименовать каждый кнопарик в кошки, яблони, собаки, абрикосы, а не эти блин блоки! sad
Как вместо дурацкой книжечки, сделать другую иконку! Блин ну автотекст и настраиваемый автотекст обозначается одним значком!  mad  yikes
Ну пусть мне попробуют доказать, что у Большого Билла не шизофрения!
А тут группу можно назвать индивидуально!
Ну, так похоже уже можно боевую задачу начать выполнять! И я сам конечно и дальше намерен ковыряться в записках Александра! С другой стороны, нет предела для совершенства!
Выкладываю код и скриншот.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
   <ribbon startFromScratch="false">
   <tabs>
      <tab id="rxTabTable" label="Мой автотекст" insertAfterMso="TabHome">
         <group id="rxTabTableMain_gr1" label="Коррекция">
         <box id="rxTabTableMain_gr1_box1" boxStyle="vertical">
         <control idMso="SaveSelectionToAutoTextGallery" showLabel="false"  />
         <control idMso="SaveSelectionToQuickPartGallery" showLabel="false" />
         <control idMso="BuildingBlocksOrganizer" showLabel="false" />
         </box>   
         </group>
         <group id="rxTabTableMain_gr2" label="Автотекст">
         <box id="rxTabTableMain_gr2_box2" boxStyle="horizontal">
         <control idMso="AutoTextGallery" showLabel="false" />      
         </box>
         </group>
         <group id="rxTabTableMain_gr3" label="Настраиваемый автотекст">
         <control idMso="CustomAutoTextGallery" showLabel="false" />   
         </group>
         <group id="rxTabTableMain_gr4" label="Экспрессблоки">
         <control idMso="QuickPartsInsertGallery" showLabel="false"  />   
         </group>
         <group id="rxTabTableMain_gr5" label="Настраиваемые экспрессблоки">
         <control idMso="CustomQuickPartsGallery" showLabel="false" />
         </group>
         <group id="rxTabTableMain_gr6" label="Коллекция №1">
         <control idMso="CustomGallery1" showLabel="false" />   
         </group>
         <group id="rxTabTableMain_gr7" label="Коллекция №2">
         <control idMso="CustomGallery2" showLabel="false" />   
         </group>
         <group id="rxTabTableMain_gr8" label="Коллекция №3">
         <control idMso="CustomGallery3" showLabel="false" />   
         </group>
         <group id="rxTabTableMain_gr9" label="Коллекция №4">
         <control idMso="CustomGallery4" showLabel="false" />   
         </group>
         <group id="rxTabTableMain_gr10" label="Коллекция №5">
         <control idMso="CustomGallery5" showLabel="false" />   
         </group>
      </tab>
   </tabs>   
   </ribbon>
</customUI>

Друзья, кто не уснул от моих записок, гляньте, пожалуйста, одним глазом, может чего подскажете!
Во вложениях снимок панели которая получилась!
С уважением!

Отредактировано Vank (05.12.2010 18:29:28)

Post's attachments

Снимокпанели.PNG 87.32 Кб, 2 скачиваний с 2010-12-05 

You don't have the permssions to download the attachments of this post.
Stupid is as stupid does!

2

Re: Создание панели для быстрого ввода Building Blocks.

Vank, а вы бы приложили образец вашего шаблона, который вы делали в 2003. Мне не совсем все-таки ясно, что именно вы хотите получить...
Вот вы же сделали отдельную вкладку свою, и в ней группы команд с кнопками. Поясните простыми словами, что именно вы хотите видеть  smile

3

Re: Создание панели для быстрого ввода Building Blocks.

Ну, так это ж я и написал! Одна вкладка дополнительная рядом с главной. С неё набирать разный текст из разных коллекций.
Каждая коллекция сохраняется в шаблоне, а не в общих building bloks!
теперь каждую группу называем своим именем. В отличие от стандартного
организатора ленты, который это название железно пришпилит "навсегад" этав собственная вкладка с индивидуальными названиями будет доступна в целевом документе и не будет портить вид
обычного Word!
Далее остаётся только назвать именами каждую группу и заготовить бибилиотеку из автотеста.
Так как кнопарики генуинные Wordoвские для тупоголовых пользователей вроде меня
не придётся писать ничего и экспортировать!
То есть Что худо бедно так решать боявую задачу можно!
Но....Нет в мире совершенства. Кака-то она неказистая...
Ну и я тихонько начал последнюю скрижаль Витера (дай Бог ему удачи с его кленовым сиропом)
Мне понравилось, вернее меня озарило зачем кнопарик рядом с Dropom Downom!
И у него этот Дроп работает с одной из груп автотекста.
Его бы поболее размером сделать. Надпись написать и несколько групп также наковырять...
Будет ещё лучше Вот я тихонько и копаюсь. мне код непонятен который он в модуль в Worde
Я таких слов не знаю! НЕ то, что Цехипович - сам себе задачи ставит, сам с собой в шахматы играет, сам себя за жульничество ругает и потом выигрывает!
Но это и не важно, так как мне не грех обойтись одним копированием....
Я на большее не претендую....Доковыряю свою вкладку и буду её заполнять уже фактической информацией!
Если чего трудно будет, я Вас крикну ладно....
А то я с перепугу вон редактор открывал, а файл не загружал. Код написал и никак не пойму, чего не сохраняется.
Спасибо автор (Новиков Максим) подсказал - отзывчивый мужик, действительно...
С уважением!

Stupid is as stupid does!

4

Re: Создание панели для быстрого ввода Building Blocks.

Вышеуказанная конструкция меня изначально не удовлетворяла. Почему?
Потому что Александр Витер создал замечательный изящный шаблончик,
позволяющий вместо ограниченного количества генуинных групп (программируемый автотекст, коллекция 1, 2, 3 и т.п.) вставить распадающийся список привязанный к автотексту с кнопочкой «обновить» для того случая, когда вы свой список дополните.
Этот шаблон выложен  ссылка в блоге Александра. К сожалению без загрузки всяких кодов тут уже не обойтись. А для полного благополучия надо бы несколько таких групп и что бы каждая была привязана к своему подразделу того же автотекста.
Первое препятствие с которым я столкнулся было то, что в моём скопированном шаблоне кнопочка обновить вообще не работала.
Вроде я правильно скопировал в свой шаблон код, и далее РедакторомVBA сделал RibbonCallbacks.bas.
Редактор VBA вроде импортировал модуль…
но код написаный Александром оказался урезаным и без всяких там его индексов. sad
внешняя ссылка От чего ничего в моём шаблоне не заработало…
Почему так непонятно! Когда я вышел из ступора Я конечно решил эту проблему простым копированием по верху кода из блока, но как-то настроение упало…
К счастью автор этого шаблона, вновь появился на нашем сайте и я надеюсь не по- ошибке, от этого и оставляю ему это письмо!
Александр.
Шаблончик ваш, очень симпатичненький, мне он нравится.
Мне очень хотелось бы его воспроизвести у себя.
Чего бы мне в принципе хотелось. Вы пишите, что хотели сделать его работающим с разными группами автотекста, а не только с «Общие».
Я сначала замахал лапками – типа не надо DropDown до пола, а потом подумал, наверное хорошая идея, если в ней не будет слишком много разделов. Но и это не критично.
Мне бы научиться использовать ваш код в своих корыстных целях кусками в других шаблонах! 
Может вас не затруднит модифицировать ваш шаблон в DropDown2 (по количеству присоединённых групп). Пусть будет один только раздел Общие.
Тут бы рядом ещё одну копию группы, но предположим Автотекст с группой Общие1.
И что бы у этой группы была различимая надпись название  впрочем у вас оно есть Автотекст. Ну тогда автотекст 2.
И всё это наклепать не на TabHome, а на отдельной своей вкладке – «работаем с автотекстом».
И всё это в формате 2009.
Больше ничего не меняйте! (И тот ваш шаблон не ищите, тем более он в доме, который на батькiвщiне остался  wink ) Так Будет понятнее для таких «механических» программистов как я как воспроизводить ваш шаблончик далее.
С уважением

Отредактировано Vank (16.01.2011 16:34:04)

Stupid is as stupid does!

5

Re: Создание панели для быстрого ввода Building Blocks.

Здравствуйте!
За вечер мне удалось достигнуть грандиозных успехов. smile  roll
Правда не сразу! sad
Задача №1
Перенести, созданую группу на страничку редактора для Word 2010!
конечно соглашусь задача, прямо скажен не ахти как важная (раз разница в 7-10 не велика), но для
механического програмиста любой результат удача! roll
Итак код механически копируем в редакторе на страницу 2010 и меняем строку

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"> 

на

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> 

В результате Витеровский код на странице 2010 стал таким

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="RibbonLoading">
   <ribbon startFromScratch="false">
      <tabs>
         <tab idMso="TabHome">
            <group id="grAutoText" label="Автотекст">
               <dropDown id="ddAutoText"
                              onAction="ddAutoText_onAction"
                              getItemLabel="ddAutoText_getItemLabel"
                              getItemSupertip="ddAutoText_getItemSupertip"
                              getItemCount="ddAutoText_getItemCount"
                              getItemID="ddAutoText_getItemID"
                              getSelectedItemIndex="ddAutoText_getSelectedItemIndex" >
                  
               </dropDown>
               <button id="btnRefresh"
                           label="Обновить" 
                           imageMso="RecurrenceEdit"
                           onAction="btnRefresh_onAction" />
            </group>
         </tab>
      </tabs>
   </ribbon>
</customUI>

Далее остаётся на фиг мне непонятный  sad код в этом, вновь созданном блоке.
Ну там есть цифирки 2007, я их просто переправил на 2010. Не совсем уверен надо ли было так делать, но схема вроде заработала. Отчего "обезьяны, набирающие на машинке бессмертный шедевр dropdownAutotext
поползли на кухню получать банан за работу....
На кухне сказали, "ты там дурью маешься пока вся семья приводит дом в порядок" и в банане отказали...
Задача№2
Ну хотя бы поменять группу Общие автотекста скажем на группу Общие2

Option Explicit
Dim tmp As Template
Dim bb As BuildingBlocks
Dim MyRibbon As IRibbonUI

' (компонент: customUI, атрибут: onLoad), 2010
Sub RibbonLoading(ribbon As IRibbonUI)
Set tmp = ActiveDocument.AttachedTemplate
Set bb = tmp.BuildingBlockTypes(wdTypeAutoText).Categories("Общие2").BuildingBlocks
Set MyRibbon = ribbon
End Sub

'ddAutoText (компонент: dropDown, атрибут: onAction), 2010
Sub ddAutoText_onAction(control As IRibbonControl, selectedId As String, selectedIndex As Integer)
bb(selectedIndex + 1).Insert Where:=Selection.Range, RichText:=True
End Sub

'ddAutoText (компонент: dropDown, атрибут: getItemLabel), 2010
Sub ddAutoText_getItemLabel(control As IRibbonControl, index As Integer, ByRef label)
label = bb(index + 1).Name
End Sub

'ddAutoText (компонент: dropDown, атрибут: getItemSupertip), 2010
Sub ddAutoText_getItemSupertip(control As IRibbonControl, index As Integer, ByRef superTip)
superTip = bb(index + 1).Value
End Sub

'ddAutoText (компонент: dropDown, атрибут: getItemCount), 2010
Sub ddAutoText_getItemCount(control As IRibbonControl, ByRef count)
'  Dim tmp As Template
count = bb.count
End Sub

'ddAutoText (компонент: dropDown, атрибут: getItemID), 2010
Sub ddAutoText_getItemID(control As IRibbonControl, index As Integer, ByRef id)
id = bb(index + 1).Name
End Sub

'ddAutoText (компонент: dropDown, атрибут: getSelectedItemIndex), 2010
Sub ddAutoText_getSelectedItemIndex(control As IRibbonControl, ByRef index)
index = 0
End Sub

'btnRefresh (компонент: button, атрибут: onAction), 2010
Sub btnRefresh_onAction(control As IRibbonControl)
Set bb = tmp.BuildingBlockTypes(wdTypeAutoText).Categories("Общие2").BuildingBlocks
MyRibbon.InvalidateControl "ddAutoText"
End Sub

Public Function GetRightXMLString(ByVal str As String) As String
'
'Замена в строке XML спецсимволов на их коды
'
  Dim ar(), i%
  ar = Array("""", "<", ">", "[", "]", "'", "-", vbTab, vbCr, vbCrLf, vbLf)
  For i = 0 To UBound(ar)
    str = Replace(str, ar(i), "&#" & AscW(ar(i)) & ";")
  Next
    str = Replace(Replace(str, ChrW(7), ""), ChrW(21), "")
  GetRightXMLString = CleanString(str)
End Function

Ну, удача, вроде заработало именно в группе Автотекст, категория Общие2
За две удачи и мелкую помощь в уборке банан не дали, но вкусностей отсыпали, так, что на сегодня группа талантливых обезьянок работу закончила.
Вопрос,
А что бы создать две группы, предположим "Общие" и "Общие2"
этот витеровский код достаточно просто Paste 2 раза...
Чует моё сердце, что наверное ругаться будет этот собака... редактор... sad
Он и так ругался сегодня, всякими ошибками и жёлтым цветом мазал... sad
Ну одну я вроде понял - вначале подчеркнул надпись Общие2,
я так понял, что она несуществующая, поэтому до прикрепления кода её создал... smile
Хотя не уверен! sad
Ещё одна напасть...Я уже писал Александр описал уже в ранней теме
как осуществлять модуль и я уже жаловался, что экспорт происходит ущербный, без его индексов.
Механическое копирования содержимого в редакторе VBA, почему-то
c лишними пробелами - тоже гад мажет жёлтым... sad
Но это вроде поправимо вытравил пробелы в начале строчки...
Как бы мне прописать две группы рядом на вкладке, то я их склепаю, а в этом вордовском редакторе VBA?
Может, кто подскажет, пока Александра нет? 
Нам бы обезьянкамв нашем "DropDown и мир"  Бородино описать, а дальше мы может больше и писать  не будем smile
Но о грустном сегодня не хочется.... sad

Отредактировано Vank (16.01.2011 16:30:26)

Stupid is as stupid does!