Здравствуйте, VladD2, Вы писали:
VD>Приверствуются ссылки и рассуждения.
В редакторе Турбо Паскаля, когда ввели собсно Undo/Redo, была такая фича, как group together similar actions.
Идея ее проста как грабли: все действия раскладываются по определенным группам (тайпинг, навигация, вставка, удаление); действия из одной группы, идущие подряд, трактуются как атом undo/redo. Имхо, ворд использует подобную технику.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, VladD2, Вы писали:
VD>Вот тупо смотрю на то как Word и другие редакторы делают Undo/Redo и не могу уловить закономерности. То они включают в Undo одну строку, то несоклько. То одно слово.
VD>Приверствуются ссылки и рассуждения.
Не знаю, какой логике следует Word, но по поводу Rich Edit Control в MSDN-е есть такая инфа:
A rich edit control groups consecutive typing actions, including characters deleted by using the BackSpace key, into a single undo action until one of the following events occurs:
The control receives an EM_STOPGROUPTYPING message.
The control loses focus.
The user moves the current selection, either by using the arrow keys or by clicking the mouse.
The user presses the Delete key.
The user performs any other action, such as a paste operation that does not involve typing.
Здравствуйте, VladD2, Вы писали:
S>>В редакторе Турбо Паскаля, когда ввели собсно Undo/Redo, была такая фича, как group together similar actions. S>>Идея ее проста как грабли: все действия раскладываются по определенным группам (тайпинг, навигация, вставка, удаление); действия из одной группы, идущие подряд, трактуются как атом undo/redo. Имхо, ворд использует подобную технику.
VD>А как тогда понять, что Ворд при разбиении строк иногда склеивает анду (видимо когда строки короткие), а иногда нет?
Я думаю, что есть ряд правил, которые заставляют прервать накопление группы. Такими правилами могут быть:
1. В группе уже больше N команд
2. Пользователь сохранил файл
3. Пользователь ничего не делал 3 секунды (by Cyberax)
4. Нажатие специальных клавиш (ентер для разделения строк, пробел и знаки препинания для разделения слов), активация меню, манипуляции мышкой, переключение приложения и т.п.
Т.е. пока фокус пользователя (всмысле мозговой, а не клавиатурный) находится в приложении — группируем. Как только фокус пользователя потеряли — завершаем группу и начинаем новую. При этом для каждого типа действия могут быть свои правила "прерывания". Соответственно, в зависимости от своего приложения стоит разбить действия на типы, понять как пользователь ожидает undo/redo для данного типа, сформировать правила группировки и разбиения и реализовать
Если конкретно про Word — не знаю, но сами группы можно посмотреть в выпадающем меню кнопки undo, хотя уверен ты это знаешь
VladD2 wrote:
> C>Такая логика группировки операций делается с помощью метода > C>IOleUndoUnit::OnNextAdd. > Речь не об реализации самого анду, а о *логике*.
Где-то в MSDN видел совет склеивать действия до нажатия enter/esc/alt
или до паузы в три секунды.
VD>Пока что мнея поняли только двое — Синклер и c-smile но и от них информация очень скудна .
Ну дык это из за раплывчатой постановки задачи. Что тебе надо?
1. Сэмулировать Word,
2. Сделать более-менее привычно,
3. Изобрести свое супер-круглое колесо.
Если первое, то это надо спрашивать разработчиков ворда, если второе, то делай как предложили вышеуказанные люди. Если третье — надо изобретать самому и никто тебе здесь не указ.
А вообще-то я бы ввел как минимум два уровня детализации, типа Ctrl-Z — group undo, Ctrl-Shift-Z — detailed Undo. Сложность логики IMO не сильно страдает.
А еще было бы хорошо уметь ставить контрольные точки. Поставил точку — после нее редактируй хоть сколько, операция Undo (специальная) вернет к предыдущему состоянию за один клик. То есть, как бы, ручная группировка.
Конечно, можно вручную сохранять версии файлов, а потом к ним возвращаться если что, но это так утомительно и лениво... Даже при наличии всяких Version Control, тем более, что в них-то как раз мусорить по малейшему поводу нехорошо.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Вот тупо смотрю на то как Word и другие редакторы делают Undo/Redo и не могу уловить закономерности. То они включают в Undo одну строку, то несоклько. То одно слово.
Приверствуются ссылки и рассуждения.
26.05.05 12:59: Перенесено модератором из 'Философия программирования' — AndrewVK
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VladD2 wrote:
> Вот тупо смотрю на то как Word и другие редакторы делают Undo/Redo и > не могу уловить закономерности. То они включают в Undo одну строку, то > несоклько. То одно слово. > Приверствуются ссылки и рассуждения.
В OLE (а значит и в Ворде) используется специальная Undo/Redo
подсистема, основанная на интерфейсах IOleUndoManager, IOleUndoUnit и т.п.
Такая логика группировки операций делается с помощью метода
IOleUndoUnit::OnNextAdd.
Здравствуйте, VladD2, Вы писали:
VD>Вот тупо смотрю на то как Word и другие редакторы делают Undo/Redo и не могу уловить закономерности. То они включают в Undo одну строку, то несоклько. То одно слово.
VD>Приверствуются ссылки и рассуждения.
В Emacs всегда известно, что отправляется в kill ring. Если две или больше операций удаления следуют непрерывно одна за другой, то удаленный текст склеивается.
Здравствуйте, VladD2, Вы писали:
VD>Вот тупо смотрю на то как Word и другие редакторы делают Undo/Redo и не могу уловить закономерности. То они включают в Undo одну строку, то несоклько. То одно слово.
VD>Приверствуются ссылки и рассуждения.
S>В редакторе Турбо Паскаля, когда ввели собсно Undo/Redo, была такая фича, как group together similar actions. S>Идея ее проста как грабли: все действия раскладываются по определенным группам (тайпинг, навигация, вставка, удаление); действия из одной группы, идущие подряд, трактуются как атом undo/redo. Имхо, ворд использует подобную технику.
А как тогда понять, что Ворд при разбиении строк иногда склеивает анду (видимо когда строки короткие), а иногда нет?
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Cyberax, Вы писали:
C>В OLE (а значит и в Ворде) используется специальная Undo/Redo C>подсистема, основанная на интерфейсах IOleUndoManager, IOleUndoUnit и т.п.
C>Такая логика группировки операций делается с помощью метода C>IOleUndoUnit::OnNextAdd.
Речь не об реализации самого анду, а о логике.
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Меня не интересует процес реализации, паттенрны или сруктуры данных. Они примитивены. Меня интиресует логика применяемая в хороших текстовых редакторах.
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
В одном очень хорошем редакторе и естественно в этом тоже единица undo это напечатанное слово. При удалении единицей является символ.
Почему так — я думаю очевидно.
Просто по частоте: человек больше печатает буковок чем удаляет.
И всегда можно удалить выделив фрагмент первоначально.
Мне лично показалось что слово как единица undo (а не прарграф целиком) наиболее удобно.
Юзеры тоже говорят что это самое оно.
Ну, представь, что видимый объект суть некий эталон + набор изменений к нему. Изменения связаны, поскольку результат предыдущего является контекстом очередного. Соответственно, отмена — по стековому принципу. Возможно, что в каких-то случаях нужно будет расставлять контрольные точки с хранением промежуточного результата. Например, для того, чтобы при отмене некоторого действия восстанавливать контекст применяя оставшиеся действия между контрольной точкой и отменённым действием.
Делаем Undo для Action5, который, такая зараза, не откатывается просто так, а требует повторного применения действий от контрольной точки. Соответственно,
1. Делаем текущим Control point_A
2. Применяем Action2 ... Action4
Вот так, или примерно так.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
А дальше — игры в паттерны, оптимизации, яхты, девки, самолёты и т.п.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, c-smile, Вы писали:
CS>Мне лично показалось что слово как единица undo (а не прарграф целиком) наиболее удобно. CS>Юзеры тоже говорят что это самое оно.
Я тоже думал о том, что слово — это логично. Но вот гляжу на самые популярные редакторы и вижу, что похоже моя логика не соотвествует текущим предпочтениям.
Пользуясь Вордом или Студией я вроде как не напрягаюсь, от излишней детализации анду. Стало быть она в нем выбрана правильно. Хотя может я просто привык.
Слишком большая детализация может ведь напрягать. Люди не очено любят безсцельно жать одни и те же кнопки.
Возможно в намках одной строки анду на слово — это нормально. Но в разрезе текста скорее всего абзац будет более приемленмее.
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Ну, представь, что видимый объект суть некий эталон + набор изменений к нему. Изменения связаны, поскольку результат предыдущего является контекстом очередного. Соответственно, отмена — по стековому принципу. Возможно, что в каких-то случаях нужно будет расставлять контрольные точки с хранением промежуточного результата. Например, для того, чтобы при отмене некоторого действия восстанавливать контекст применяя оставшиеся действия между контрольной точкой и отменённым действием.
ГВ>Например, стек действий (от раннего к позднему):
ГВ>Action1 ГВ>[ControlPoint_A] ГВ>Action2 ГВ>Action3 ГВ>Action4 ГВ>Action5
ГВ>Делаем Undo для Action5, который, такая зараза, не откатывается просто так, а требует повторного применения действий от контрольной точки. Соответственно, ГВ>1. Делаем текущим Control point_A ГВ>2. Применяем Action2 ... Action4
ГВ>Вот так, или примерно так.
И ты свалился на обсуждение реализации. Это не проблема. Паттерн команда, два стека и инверсия команд при перекладывании из одного стека в другой спасают отцов русской демократии влет. У меня нет пробелм при любой детализации анду. Я просто сплющу две команды редакрирования и создам из них одну.
Проблема же в самой логике "сплющивания". Обрати внимание на то что Ворд и Синтила по разному агреггируют анду-информацию. Винтила похоже ориентируется на блоки определенного размера, а Ворд применяет какую-то совсем хитрую логику. Вот мне и интересно услышать про стратегии оных.
Пока что мнея поняли только двое — Синклер и c-smile но и от них информация очень скудна .
... << RSDN@Home 1.1.4 beta 7 rev. 457>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Пользуясь Вордом или Студией я вроде как не напрягаюсь, от излишней детализации анду. Стало быть она в нем выбрана правильно. Хотя может я просто привык.
VD>Слишком большая детализация может ведь напрягать. Люди не очено любят безсцельно жать одни и те же кнопки.
VD>Возможно в намках одной строки анду на слово — это нормально. Но в разрезе текста скорее всего абзац будет более приемленмее.
Ну дык на то selection есть. Выделил и удалил сколько надо если массивный delete нужен.
Меня лично в Ворде сильно напрягает удаление всей строки.
И еще этот capitalizing "невмиручий" — просто раздражает.
Имхо, эту ветку лучше в User Interface перенести. Там она уместна и даже очень.
ГВ>>А дальше — игры в паттерны, оптимизации, яхты, девки, самолёты и т.п. VD>Меня интересуют аспекты идущие за паттернами и потимизацией. Мне интересна логика объеденения отдельных команд редактирования при вооде. VD>Логика же самого анду яйца выеденного не стоит. Весь исходный код можно уместить в одном сообщении.
А где можно посмотреть кошерные реализации? А чует моё сердце что сейчас велосипед напишу. Язык — С#.
Здравствуйте, VladD2, Вы писали:
VD>Вот тупо смотрю на то как Word и другие редакторы делают Undo/Redo и не могу уловить закономерности. То они включают в Undo одну строку, то несоклько. То одно слово.
VD>Приверствуются ссылки и рассуждения.
Попробую вставить свои две копейки.
Имхо, есть изменяющие содержимое текста действия (удаления, вставка, форматирование), которые можно назвать change-actions, и неизменяющие (перемещения всяческие), которые можно назвать read-only-actions. Первое деление можно делать по этому признаку: все идущие подряд change-actions объединяются до тех пор, пока не встретиться read-only-action.
Далее делаем более подробную классификацию change-actions:
— удаления (delete-actions);
— вставка (insert-actions);
— замена (overwrite-actions), может быть реализована как агрегат delete-action и insert-action;
— форматирование (format-actions);
— и т.д., зависит от функциональности редактора.
Так вот, внутри общей последовательности change-actions объединяем вместе последовательно идущие действия, которые попадают в одну группу (т.е. insert-actions к insert-actions, delete-actions к delete-actions и т.д.).
Так же можно органичивать область действия для отдельных групп. Например, delete-actions не объединяются, если они относятся к разным абзацам или выделениям).
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.