Страница 9 из 21
Добавлено: Вт мар 15, 2011 15:57
MVV
Как вариант, можно создать внутреннюю команду для refresh. Но её нельзя будет выполнить с кнопки, только вручную написать в командной строке и выполнить.
А если изменять путь для refresh, то возвращаться к предыдущему всегда придется вручную.
Добавлено: Вт мар 15, 2011 16:01
Flasher
bob_tm
Ага, ясно. Теперь понимаю почему и cd "... " не срабатывает.
Как вариант предлагаю парсить по соответствующей строке текущего bar-а, если, конечно, есть возможность вычислять какой текущий.
MVV писал(а):Как вариант, можно создать внутреннюю команду для refresh. Но её нельзя будет выполнить с кнопки, только вручную написать в командной строке и выполнить.
Ну, для кнопки уже есть решение по отдельному рефрешу:
bob_tm писал(а):/L="\\\DiskInterals Reader\<Refresh>" - можно повесить на отдельную кнопку, чтобы делать Refresh когда захочется
только какое отношение это имеет к обсуждаемой команде перехода?
Добавлено: Вт мар 15, 2011 16:16
MVV
Самое прямое - запуск тотала с параметром /L как раз команду перехода cd и вызывает. И тотал переходит в указанную папку, запрашивая у плагина её содержимое, вызывая FsFindFirst и потом FsFindNext, пишет в заголовке панели новый путь и отображает в панели новое содержимое.
Добавлено: Вт мар 15, 2011 16:22
Flasher
Причём тут это? Я спрашиваю, какое отношение отдельный рефреш может иметь к кнопке, которая выполняет сразу два действия? Команда, о которой ты пишешь, в такую кнопку никаким боком не встанет, кроме двух вариантов: * и *.* на конце.
Добавлено: Вт мар 15, 2011 16:34
MVV
Раз refresh в виде команды перехода получается коряво, то вполне разумно предусмотреть для этого специальную команду. Но проблема тотала в том, что такие команды плагину с кнопки отправлять нельзя.
Добавлено: Вт мар 15, 2011 16:55
Flasher
MVV писал(а):Но проблема тотала в том, что такие команды плагину с кнопки отправлять нельзя.
С обратным слешем работает ведь. Значит можно.
Добавлено: Вт мар 15, 2011 18:06
bob_tm
Flasher писал(а):MVV писал(а):Но проблема тотала в том, что такие команды плагину с кнопки отправлять нельзя.
С обратным слешем работает ведь. Значит можно.
Можно, но появляется у тотала в пути "\", а это не хорошо

хотя кому как
Я предлагаю сделать две кнопки, первая делает Refresh, а вторая cd.
Получается если вы хотите, чтобы плагин зашел в папку и при этом выполнился Refresh, то жмете первую кнопку, а потом вторую. и все

Если Refresh не нужен, значит жмете только вторую кнопку

Добавлено: Вт мар 15, 2011 18:14
Flasher
bob_tm
Это слишком очевидные вещи, чтобы об этом повторно писать. Тут мне лишняя кнопка проблему в тулбаре создаёт, поэтому не вариант.
Как там насчёт моего предложения по парсингу текущего bar-a?
Добавлено: Вт мар 15, 2011 18:18
bob_tm
Flasher писал(а):Как там насчёт моего предложения по парсингу текущего bar-a?
без понятия как такое сделать

Добавлено: Вт мар 15, 2011 18:30
Flasher
bob_tm
В папке TC есть текстовые файлы типа bar, в одном таком нужно осуществлять поиск строки, содержащей paramNNN=\\\DiskInterals Reader\%P*. Если на конце звёздочка, тогда вместе с переходом выполняем рефреш.
Остаётся два вопроса:
1. Можно ли при нажатии кнопки вычислять NNN?
2. Можно ли выявлять путь к текущему bar-файлу по классу/дескриптору компонент всего окна TC.
Вторую проблему можно обойти, если производить поиск сразу во всех bar-ах, не знаю насколько это накладно по времени.
Есть другой вариант. Создаём по аналогии с кнопкой пользовательскую команду в файле usercmd.ini c названием, например, em_OpenPathInDiskInterals.
Но тут опять вопрос: может ли плагин вычислить, какая команда TC его вызвала, чтобы после выполнить рефреш?
Добавлено: Вт мар 15, 2011 20:50
MVV
Костыли... Думаю, правильнее было бы в таком случае сделать вот как:
Обычный переход:
Переход с обновлением:
При этом содержимое любой подпапки
Refresh всегда возвращается как пустое (только элемент
. - если ниче вообще не вернуть, тотал подумает, что возникла ошибка). Но когда плагин получает запрос на чтение содержимого такой папки, он выполняет refresh и потом посылает тоталу сообщение
WM_COPYDATA с командой
cd, подставляя путь без папки
Refresh и указывая в параметрах, что открыть путь надо в активной панели. В итоге тотал тут же откроет в этой панели интересующую пользователя папку. Но здесь нужно, чтобы плагин знал своё корневое имя (имя в сетевом окружении). Пример кода для отправки такой команды (из Virtual Panel):
Код: Выделить всё
struct BackgroundSendDataData {
COPYDATASTRUCT CopyData;
char Raw[1];
};
DWORD __stdcall BackgroundSendData(void* Data) {
BackgroundSendDataData* bsd=(BackgroundSendDataData*)Data;
std::auto_ptr<char> ash((char*)Data);
SendMessage(hMainWnd, WM_COPYDATA, 0, (LPARAM)&bsd->CopyData);
return 0;
}
bool ChangeCurrentDir(const wchar_t* Path, bool NewTab) {
int length=lstrlen(Path), reserve=length*(Unicode ? 4 : 1);
std::auto_ptr<char> ash(new char[sizeof(BackgroundSendDataData)+16+reserve]);
BackgroundSendDataData* bsd=(BackgroundSendDataData*)ash.get();
bsd->CopyData.dwData='DC';
bsd->CopyData.lpData=bsd->Raw;
char* p=bsd->Raw;
if (Unicode) p+=wsprintfA(p, "\xEF\xBB\xBF");
p+=WideCharToMultiByte(Unicode ? CP_UTF8 : CP_ACP, 0, Path, length, p, reserve, 0, 0);
p+=wsprintfA(p, "\r%cS%s", 0, NewTab ? "T" : "");
bsd->CopyData.cbData=p-bsd->Raw+1;
HANDLE thread=CreateThread(0, 0, &BackgroundSendData, ash.get(), 0, 0);
if (!thread) return 0;
ash.release();
CloseHandle(thread);
return 1;
}
(сообщение посылается в фоновом потоке)
Хотя, наверное, можно и просто продублировать ту же иерархию в папке Refresh, что и без неё - но тогда в пути появится дополнительный каталог верхнего уровня.
Добавлено: Вт мар 15, 2011 21:06
Flasher
MVV писал(а):Переход с обновлением:
При этом содержимое любой подпапки
Refresh всегда возвращается как пустое
Опять те же грабли со вторым слешем, только уже перед %P, а не после? Это ещё хуже.
Добавлено: Вт мар 15, 2011 21:09
MVV
Ты вчитайся в пост вначале. А потом объясни, чем хуже? Плагин выполнит refresh и изменит путь на нормальный. В итоге ты получишь нормальный путь в панели, безо всяких граблей.
Добавлено: Вт мар 15, 2011 21:13
Flasher
Я понял. Я вот о каких строках подумал:
MVV писал(а):подставляя путь без папки Refresh и указывая в параметрах, что открыть путь надо в активной панели
Теперь понимаю, что программно правильную замену пути труда сделать не составит. Была мысль, что уберётся лишь Refresh без косой черты.
Добавлено: Вт мар 15, 2011 21:50
MVV
Ну, я предложил идею, а грамотно вырезать лишнюю папку из пути - уже задача автора плагина.
Но если учесть, что путь будет начинаться с имени этой папки, нужно будет просто прибавить её длину к указателю на строку, чтобы получить правильный путь для перехода. Если функция
FsFindFirst получит путь в виде
\Refresh\c:\1\, то после прибавления 8 к указателю на начало строки получится указатель на строку
\c:\1\. Останется лишь приписать спереди
\\\ и имя плагина.