Страница 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
Костыли... Думаю, правильнее было бы в таком случае сделать вот как:

Обычный переход:

Код: Выделить всё

cd
\\\DiskInterals Reader\%P
Переход с обновлением:

Код: Выделить всё

cd
\\\DiskInterals Reader\Refresh\%P
При этом содержимое любой подпапки 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 писал(а):Переход с обновлением:

Код: Выделить всё

cd
\\\DiskInterals Reader\Refresh\%P
При этом содержимое любой подпапки Refresh всегда возвращается как пустое
Опять те же грабли со вторым слешем, только уже перед %P, а не после? Это ещё хуже.

Добавлено: Вт мар 15, 2011 21:09
MVV
Ты вчитайся в пост вначале. А потом объясни, чем хуже? Плагин выполнит refresh и изменит путь на нормальный. В итоге ты получишь нормальный путь в панели, безо всяких граблей.

Добавлено: Вт мар 15, 2011 21:13
Flasher
Я понял. Я вот о каких строках подумал:
MVV писал(а):подставляя путь без папки Refresh и указывая в параметрах, что открыть путь надо в активной панели
Теперь понимаю, что программно правильную замену пути труда сделать не составит. Была мысль, что уберётся лишь Refresh без косой черты.

Добавлено: Вт мар 15, 2011 21:50
MVV
Ну, я предложил идею, а грамотно вырезать лишнюю папку из пути - уже задача автора плагина. :D

Но если учесть, что путь будет начинаться с имени этой папки, нужно будет просто прибавить её длину к указателю на строку, чтобы получить правильный путь для перехода. Если функция FsFindFirst получит путь в виде \Refresh\c:\1\, то после прибавления 8 к указателю на начало строки получится указатель на строку \c:\1\. Останется лишь приписать спереди \\\ и имя плагина.