Перетаскивание содержимого списка
Элементы управления списками могут выступать в роли палитр объ' ектов для использования в идиомах непосредственного манипулирова' ния. Если бы список был, скажем, частью программы для генерации отчетов, то можно было бы, щелкнув по элементу списка, перетащить его в область отчета, чтобы добавить в отчет указанное поле. Эта опера' ция не является выбором в обычном смысле, поскольку она полностью самодостаточна. Без сомнения, многие программы стали бы удобнее, если бы использовали списки, поддерживающие перетаскивание.
Перетаскиваемые элементы помогают пользователям формировать на' боры объектов. Два смежных списка, один из которых перечисляет все доступные элементы, а другой – выбранные, стали обычной идиомой графического пользовательского интерфейса. Между такими списка' ми помещается одна кнопка или пара разнонаправленных кнопок, с помощью которых производится перенос элементов между списками, как показано на рис. 21.13. Гораздо более приятно, когда есть идиома,
Рис. 21.13. Это диалоговое окно Microsoft Outlook Express определенно стало бы более удобным, если бы позволяло перетаскивать контакт из списка сле- ва в списки To (Кому), Cc (Копия) и Bcc (Скрытая копия) справа. Попутно обратите внимание на неудачное использование горизонтальных полос про- крутки во всех списках. Строка с полной информацией могла бы выводиться в виде всплывающей подсказки (особенно это касается левого списка).
(Как вариант, диалоговое окно можно было бы расширить – ведь нет никаких разумных причин ограничивать его имеющимся размером.)
позволяющая перетаскивать желаемый объект из одного списка в дру' гой без необходимости что'то выбирать и вызывать какие'то функции.
Упорядоченные списки
Иногда возникает необходимость перенести элемент списка на другую позицию внутри того же списка. (Вообще говоря, эта потребность воз' никает намного чаще, чем предполагает большинство проектировщи' ков взаимодействия.) Многие программы предлагают средства автома' тической сортировки для важных списков. Проводник, например, по' зволяет сортировать файлы по имени, типу, дате модификации и раз' меру. Это прекрасно, но не было бы еще лучше иметь возможность упорядочивать файлы по их важности? На практике программа вполне могла бы упорядочить их в соответствии с частотой обращения пользо' вателя, но такой подход не всегда будет давать верные результаты. Учет даты и времени последнего обращения к файлам даст более близ' кие к истине результаты, но все еще недостаточно точные. (Microsoft применяет этот подход в средствах выбора шрифтов в некоторых при' ложениях, и в этих случаях алгоритм работает вполне прилично.) По' чему бы не позволить пользователю переместить наиболее важные для него объекты в начало списка и сортировать их отдельно (в алфавит' ном или каком'либо другом порядке) в дополнение к сортировке, рас' положенной ниже оставшейся части списка? Например, вы могли бы пожелать переупорядочить список сотрудников вашего отдела в по' рядке убывания – по тому, где они сидят. Не существует автоматиче' ской функции, которая сделала бы это, – придется самостоятельно сортировать записи о сотрудниках до тех пор, пока не будет получен требуемый порядок следования. Но ведь именно такого рода настрой' ка может потребоваться опытному пользователю после многих часов изучения приложения. Чтобы упорядочить каталог подобным обра' зом, потребуются серьезные усилия, и программа обязана запоминать точный порядок следования от сеанса к сеансу – в противном случае ее способность изменять порядок следования объектов ничего не стоит.
Возможность перемещать элементы внутри списка из одного места в другое крайне полезна, но она требует реализации автоматической прокрутки (см. главу 19). Если мы выбрали элемент в списке, а место, в которое его требуется перенести, находится за пределами видимости, должна быть возможность прокрутить содержимое списка, не отпус' кая перемещаемый объект.
Горизонтальная прокрутка
Обычно в списках присутствует вертикальная полоса прокрутки, по' зволяющая перемещаться по списку вверх и вниз. Кроме того, списки могут предусматривать и горизонтальную прокрутку, что позволяет программистам втискивать очень длинные строки текста в списки с ми' нимальными усилиями. Однако пользователям эта возможность не приносит ничего, кроме головной боли.
Горизонтальная прокрутка текста – это нечто ужасное, и она не должна применяться нигде и никогда – за исключением больших таблиц (на' пример, электронных), где фиксированные заголовки колонок и строк способны порождать локальный контекст. При горизонтальной про' крутке текста из виду скрываются один или более первых символов каждой строки отображаемого текста. Это делает нечитаемыми все строки, что приводит к потере целостности восприятия текста.
Ни в коем случае не используйте горизонтальную прокрут- ку текста.
Если вы столкнетесь с ситуацией, которая, на ваш взгляд, просто'таки требует горизонтальной прокрутки, попробуйте поискать альтерна' тивные решения. Прежде всего попытайтесь ответить, почему текст в списке такой длинный. Можно ли сократить его? Можно ли перене' сти текст на следующую строку, чтобы сократить его длину? Можно ли позволить пользователю заменить длинные строки более короткими ва' риантами? Можно ли вместо текста использовать небольшие графиче' ские изображения? Можно ли использовать всплывающие подсказки? Рассмотрите также возможность увеличения ширины списка. Может быть, имеется способ как'то иначе перераспределить элементы управ' ления в окне, с тем чтобы увеличить горизонтальный размер списка?
Если нет возможности увеличить ширину элемента управления, наи' лучший выход – перенос текста на следующую строку. Используйте отступ, чтобы перенесенная строка отличалась от других. Это означа' ет, что теперь вам придется иметь дело со списком, в котором элемен' ты имеют переменную высоту, но это все равно лучше, чем горизон' тальная прокрутка.
Помните: мы говорим только о тексте. Для графических изображений и больших таблиц нет ничего плохого в горизонтальных полосах про' крутки, как нет ничего плохого в самих по себе окнах с горизонтальной прокруткой. Но предложить пользователю горизонтальную прокрутку в текстовом списке – практически то же самое, что предложить компь' ютер с педальным приводом… чрезвычайно удобно, не так ли?
Прямой ввод данных в список
Исторически сложилось так, что программисты не особенно утружда' ли себя попытками обеспечить пользователям возможность ввода тек' ста напрямую внутри списков. Конечно, потребность вводить текст прямо по месту нахождения текстового элемента возникает достаточ' но часто, и неуклюжие диалоговые окна во многом являются следстви' ем желания программистов увернуться от написания кода для редак' тирования по месту.
Однако современные элементы управления, предназначенные для просмотра списков и деревьев в операционной системе Windows и на
других платформах, предлагают средства редактирования по месту. Оба этих элемента управления используются в Проводнике (Windows Explorer); можно увидеть, как они работают, если попытаться пере' именовать файл или каталог. Чтобы переименовать файл в Mac OS или в Windows 95, вы дважды щелкаете мышью на имени объекта (но не слишком быстро, чтобы два щелчка не были восприняты как один двойной щелчок, по которому открывается рассматриваемый объект). После этого вы вносите необходимые изменения. (Это поведение пре' терпело некоторые изменения в Windows XP, так что в некоторых представлениях, чтобы войти в режим переименования, приходится щелкать правой кнопкой мыши и выбирать из контекстного меню пункт Переименовать; можно ли это назвать прогрессом?) Объекты, ко' торые можно отредактировать вне списков, должны быть доступными для редактирования и внутри списков.
Граничный случай, превращающий редактирование по месту в настоя' щую проблему, – добавление в список нового элемента. Большинство проектировщиков для добавления новых элементов в список задейст' вует другие идиомы – кнопку или соответствующий пункт меню, – до' бавляющие в список новый, пустой элемент, после чего пользователь может редактировать его название по месту. Наверное, более разум' ным было бы предусмотреть возможность создания пустого элемента двойным щелчком мыши по пустому пространству между существую' щими элементами или, по крайней мере, иметь свободное пространст' во в начале или в конце списка с надписью «Добавить новый элемент», чтобы пользователь легко мог обнаружить эту возможность. Другое решение этой проблемы связано с применением комбо'списка, о кото' ром мы расскажем ниже.
Комбо−списки
В Windows 3.0 появился новый элемент управления – комбинирован' ный список, или комбо-список (combobox). Как следует из названия, этот элемент представляет собой сочетание списка и поля редактиро' вания (рис. 21.14). Он обеспечивает недвусмысленный метод ввода данных в список. Вариант с раскрывающимся списком, к тому же, значительно экономит экранное пространство.
В комбо'списках четко разграничиваются собственно список и поле вво' да, что сводит к минимуму непонимание со стороны пользователя. Ком' бо'список превосходно подходит для тех случаев, когда необходимо ор' ганизовать выбор единственного объекта. Поле редактирования может использоваться для ввода новых элементов списка, и, кроме того, в нем отображается текущий, выбранный из списка объект. Когда текущий объект отображается в поле редактирования, пользователь может изме' нять его. Это своего рода урезанный вариант редактирования по месту.
Рис. 21.14. Раскрывающееся поле со списком в редакторе Word позволяет пользователям выбирать шрифты из списка или просто набирать название нужного шрифта в текстовом поле
Поскольку поле редактирования комбо'списка отображает текущий выбор, этот элемент неизбежно предназначен для выбора единственно' го значения. Не существует полей со списком, предлагающих возмож' ность множественного выбора. Единственность выбора подразумевает взаимное исключение, и это одна из причин того, почему поле со спи' ском легко может использоваться для замены групп радиокнопок. (В операционной системе Mac OS заменой крупных групп радиокно' пок служили всплывающие меню, которые появились раньше, чем комбо'списки в Windows, однако у этого варианта не было возможно' сти редактирования данных, которая есть у комбо'списков.) Другой причиной является высокая степень экономии пространства и воз' можность динамического добавления элементов – то, что радиокноп' ки делать не позволяют.
Когда комбо'список реализован как раскрывающийся список, он по' казывает текущий выбор, не занимая места для отображения всех ва' риантов выбора. По существу, собственно список доступен по первому требованию и этим напоминает меню, отображающее список команд по желанию пользователя. На практике обычно используются именно раскрывающиеся комбо'списки.
Бережливое отношение комбо'списка к экранному пространству по' зволяет такому сложному элементу вытворять удивительные вещи, например находиться внутри главного окна программы. Он может до' статочно удобно расположиться даже на панели инструментов. Это очень эффективный элемент управления для всех монопольных при' ложений. Применение полей со списками на панелях инструментов более эффективно, нежели размещение эквивалентных функций в ме' ню, поскольку пользователь может видеть состояние комбо'списка не' посредственно, не совершая дополнительных действий, – нет необхо' димости открывать меню.
Раз перетаскивание реализовано для списков, оно должно быть реали' зовано и для комбо'списков. Возможность раскрыть комбо'список, прокрутить его до нужного элемента, а затем перетащить этот элемент внутрь документа порождает очень мощную идиому. Возможность пе' ретаскивания следует делать естественной частью комбо'списков.