HSolo
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Представляю всем добавку (правда только в WIN версию) которая позволяет настраивать иерархию в меню Tools. Лично мне это очень надо (и я был просто крайне удивлен что такую простую добавку так долго не сделали). Надеюсь что она приживется и войдет в официальную версию SciTE. Кстати на форум я выложить ничего не могу, поэтому залил на rapidshare.com Вот ссылка: http://rapidshare.com/files/136919/WSciTE.rar.html Regards HSolo. Как пользоваться: В файле SciTEGlobal.properties (или например в locale.properties) делаем что либо подобное в соответствии со вкусами и требованиями (я еще не проработал как мне удобно, поэтому пока только пример): [User Submenu] Настройки иерархии подменюшек для меню "Tools" # ---------------------------------------------- user.menu.name.1.*=Работа с текстом user.menu.name.2.*=ASCII user.menu.parent.2=1 user.menu.name.3.*=Полезные утилитки # ---------------------------------------------- Это означает что подменю Работа с текстом имеет номер 1, подменю ASCII - 2 и вложено в подменю 1 и т.д. Далее добавляем строки формата command.menu.x.y для тех инструментов x которые желаете разместить в меню y Если ничего не добавлять то поведение меню останется без изменений, итак например: [Tools Menu] Пользовательские команды меню "Tools" # ---------------------------------------------- command.menu.10=1 command.name.10.*=Make Selection Uppercase command.10.*=dostring case="U" dofile(props["SciteDefaultHome"].."\\tools\\ChangeCase.lua") command.mode.10.*=subsystem:lua,savebefore:no command.shortcut.10.*=Ctrl+Shift+U command.menu.11=2 command.name.11.*=Make Selection Lowercase command.11.*=dostring case="L" dofile(props["SciteDefaultHome"].."\\tools\\ChangeCase.lua") command.mode.11.*=subsystem:lua,savebefore:no command.shortcut.11.*=Ctrl+U command.menu.12=3 command.name.12.*=Make Selection Invertcase command.12.*=dostring case="I" dofile(props["SciteDefaultHome"].."\\tools\\ChangeCase.lua") command.mode.12.*=subsystem:lua,savebefore:no # ---------------------------------------------- Чтобы все это работало были внесены изменения в 3 файла: PlatWin.cxx SciTEWinBar.cxx SciTEBuffers.cxx По поводу оформления претензий не принимаю, т.к. это только рабочий образец и если его сделать по уму то надо внести в соответствующие классы (которые я пока трогать не стал) ну и для PLAT_GTK надо написать что-либо подобное (к сожалению тут помочь не могу). Измененные файлы и скомпилированный рабочий модуль прилагаются, сами изменения смотрите в папке DiFF. Добавлено: Кстати совсем забыл, чтобы в подменю действовали keycode's надо например создать копию функции void SciTEWin::SetMenuItem(int menuNumber, int position, ... т.е. в файл SciTEWinBar.cxx надо добавить что то типа //~ Добавлено HSolo void SciTEWin::AppendMenuItem(HMENU hmenu, int itemID, const char *text, const char *mnemonic) { SString sTextMnemonic = text; long keycode; if (mnemonic && *mnemonic) { keycode = SciTEKeys::ParseKeyCode(mnemonic); if (keycode) { sTextMnemonic += "\t"; sTextMnemonic += LocaliseAccelerator(mnemonic, itemID); } // the keycode could be used to make a custom accelerator table // but for now, the menu's item data is used instead for command // tools, and for other menu entries it is just discarded. } else { keycode = 0; //I don't think this is needed in ANSI C++. } if (::GetMenuState(hmenu, itemID, MF_BYCOMMAND) == 0xffffffff) { if (text[0]) ::AppendMenu(hmenu, MF_STRING, itemID, sTextMnemonic.c_str()); else ::AppendMenu(hmenu, MF_STRING | MF_SEPARATOR, itemID, sTextMnemonic.c_str()); } if (itemID >= IDM_TOOLS && itemID < IDM_TOOLS + toolMax) { // Stow the keycode for later retrieval. // Do this even if 0, in case the menu already existed (e.g. ModifyMenu) MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_DATA; mii.dwItemData = reinterpret_cast<DWORD&>(keycode); ::SetMenuItemInfo(hmenu, itemID, FALSE, &mii); } } Ну и естественно (не хотел этого делать но пришлось) прописать ее в классах SciTEBase.h и SciTEWin.h, т.е добавить строчки: virtual void AppendMenuItem(HMENU hmenu, int itemID, const char *text, const char *mnemonic = 0) = 0; И последнее в SciTEBuffers.cxx меняем блок: //~ HSolo ~ start // Ну и наконец-то добавляем команды в указанные "command.menu." меню (по умолчанию как раньше) prefix = "command.menu."; prefix += SString(item); int toMenu = props.GetInt(prefix.c_str()); if(toMenu && toMenu < toolMax && UMenu[toMenu].hMenu) { SString localised = LocaliseString(sMenuItem.c_str()); //~ HSolo ~ new AppendMenuItem(UMenu[toMenu].hMenu, itemID, localised.c_str(), sMnemonic[0] ? sMnemonic.c_str() : NULL); } else { //*mozers*/-start // SetMenuItem(menuTools, menuPos, itemID, sMenuItem.c_str(), sMnemonic[0] ? sMnemonic.c_str() : NULL); SetMenuItemLocalised(menuTools, menuPos, itemID, sMenuItem.c_str(), sMnemonic[0] ? sMnemonic.c_str() : NULL); //*mozers*/-end menuPos++; } //~ HSolo ~ end |