i21sys/Docu/ru/Desktop.odc

i21sysDesktop

DEFINITION i21sysDesktop;
	IMPORT Files;
	VAR
		saveName-: Files.Name;
		savePath-: ARRAY 2000 OF CHAR;
	PROCEDURE Close;
	PROCEDURE Exit;
	PROCEDURE Open;
	PROCEDURE Restore;
	PROCEDURE RestoreFrom (name: ARRAY OF CHAR);
	PROCEDURE Save;
	PROCEDURE SaveAs;
END i21sysDesktop.

Средства сохранения и восстановления состояния и расположения окон.
Авторы первоначальной версии: Bruno Essmann (bessmann@iiic.ethz.ch), Guy Laden (laden@math.tau.ac.il), Iain Scott (iain.i.scott@gecm.com); см. также пакет Desktop на сайте  http://www.zinnamturm.eu.
Автор данной версии: Ф.В.Ткачев (ftkachov@inr.ac.ru); конструктивная критика: Е.Э.Темиргалеев.
Этот модуль использует недокументированные модули, в том числе из подсистемы Host. Модуль был разработан в BlackBox 1.5.
Эта версия преследует несколько целей:
 облегчить жонглирование многими разными проектами в разных рабочих папках и на разных компьютерах, обеспечивая непрерывность каждого по крайней мере со стороны Блэкбокса;
 уменьшить потери времени в компьютерном классе (см. проект Информатика21, http://www.inr.ac.ru/~info21/);
 способствовать подготовке интерактивных пособий (возможность восстановления нужной конфигурации окон с нужными документами одной командой);
 для чего, среди прочего, упростить и прояснить исходинк, в том числе чтобы обеспечить восстановление порядка окон в точном соответствии с состоянием на момент сохранения, включая порядок окон на экране, показываемый и выделенный фрагмент в каждом окне;

Простейшая схема работы
Настройки для простейшей схемы уже сделаны в сборках Блэкбокса от Информатики-21, где всё устроено так, что окна сохраняются и восстанавливаются без дополнительных усилий со стороны пользователя. Нужно только заканчивать работу в Блэкбоксе соответствующей (настроенной) командой меню; ни Alt+F4, ни клик по крестику вверху справа не дадут эффекта.
Если Блэкбокс вызывается с помощью vbs-файлов в разных рабочих папках, то в каждой из них будет автоматически сохраняться своя конфигурация окон, ничего не знающая о других.

PROCEDURE Exit;
Сохраняет конфигурацию окон (в служебный файл desktop.i21) и закрывает Блэкбокс. 
Если есть несохраненные документы, то появляются диалоговые окна, чтобы подтвердить сохранение документов (и задать им имена, если документы новые). 
Любой отказ от сохранения (No, Cancel) трактуется как прерывание всей операции, а окно с проблемным документом выводится вперёд. Разобравшись с документом, можно повторить попытку выхода.
Удобно в раздел File (Файлы) основного меню System добавить команду меню следующего вида:
	"Сохранить окна и выйти"	""	"i21sysDesktop.Exit"	""

PROCEDURE Restore;
Открывает окна в тех же позициях и состояниях, в каких они были при сохранении. Для её автоматического вызова при запуске Блэкбокса достаточно в процедуру Setup модуля Config вставить её вызов в следующей форме (и не забыть скомпилировать изменённый исходник): 	Dialog.Call('i21sysDesktop.Restore','', res);
Всевозможные вспомогательные документы (справки, DEFINITION и т.п.; в том числе открытые командой StdCmds.OpenAux и используемые для черновиков), имеют желтую иконку, никогда не бывают грязными, и всегда автоматически сохраняются/восстанавливаются вместе со всем своим содержимым. 

В редких случаях, когда процедура восстановления окон мешает запуститься Блэкбоксу, достаточно переименовать файл desktop.21.
Простейшая схема особенно удобна, когда с Блэкбоксом работают в серверном режиме, и каждому проекту соответствует отдельная рабочая папка. Тогда продвинутые возможности можно игнорировать.

Продвинутые возможности
По умолчанию для сохранения и восстановления состояния окон используется файл desktop.i21 в текущей рабочей папке. 
В случае проблем при открытии desktop.i21 достаточно переименовать его.

NB Все команды, подразумевающие сохранение конфигурации окон (Save, SaveAs, Close, Exit), для успешного завершения предварительно проверяют, чтобы среди открытых окон не было грязных (они отличаются потемневшей иконкой в левом верхнем углу окна документа).
Если грязное окно обнаружено, выполнение команды останавливается, а окно выводится вперёд.
Грязные окна соответствуют документам, в которые были внесены изменения после последнего сохранения. 
Всевозможные вспомогательные документы (в том числе открытые командой StdCmds.OpenAux), имеют желтую иконку, никогда не бывают грязными, и всегда автоматически сохраняются/восстанавливаются вместе со всем своим содержимым. Исключение  Рабочий журнал (Log), содержимое которого не сохраняется и не восстанавливается.

Форсировать сохранение всех документов можно командой HostCmds.SaveAll (удобно поставить её в меню File наряду с Save и SaveAs).

PROCEDURE SaveAs
Открывает диалог для сохранения состояния окон в новом файле с расширением .i21. Имя файла и его местонахождение будут запомнены в saveName и savePath, и в дальнейшем команды Save/Restore будут работать с этим новым файлом. 

VAR saveName-: Files.Name;
Имя с расширением текущего файла, в котором сохраняется конфигурация окон.

VAR savePath-: ARRAY 2000 OF CHAR;
Либо полный путь, либо путь относительно текущей рабочей папки к файлу, в котором сохраняется конфигурация окон.

PROCEDURE RestoreFrom (name: ARRAY OF CHAR) 
PROCEDURE Open 
Позволяют программно восстановить указанную конфигурацию окон из файла с расширением .i21.
В случае Open открывается диалог для выбора файла.
В обоих случаях новые окна открываются в дополнение к уже открытым.
В обоих случаях имя файла и его местонахождение будут запомнены в переменных saveName и savePath, так что в дальнейшем команды Save/Restore будут работать с этим новым файлом.

PROCEDURE Close 
Вызывает сохранение конфигурации окон в текущем файле .i21, после чего все окна закрываются (и можно вызвать, например, RestoreFrom).