Представляю всем добавку (правда только в 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