в общем, доклада́ю. бага два. баг нумеро уно в отцеплении окон: там надо починить DoOpen:
заменить
Код:
IF (d # NIL) & (d.context # NIL) THEN view := Views.CopyOf(view, Views.shallow); d := NIL END
на:
Код:
IF (d # NIL) & (d.context # NIL) THEN
IF FALSE THEN
view := Views.CopyOf(view, Views.shallow); d := NIL
ELSE (* need to do it this way, otherwise BAD THINGS HAPPENS! *)
d := DuplicateAs(d, Documents.dir);
view := d.ThisView()
END
END;
`DuplicateAs()` забрать из `StdWindows`, например. это чинит скроллбары (в том числе баг с «двойным» скроллбаром).
баг нумеро до: надо в `StdDocuments.Restore()` заменить:
Код:
IF m.unit = 0 THEN DoRecalc(d, f.unit, forceRecalc) END;
на:
Код:
VAR
…
dw, dh: INTEGER;
…
(* k8: we need to recalc if document size was changed. fixes bug with scrollbars in subwindows. *)
d.context.GetSize(^dw, ^dh);
IF (m.unit = 0) OR (d.prevW # dw) OR (d.prevH # dh) THEN DoRecalc(d, f.unit, forceRecalc) END;
d.prevW := dw; d.prevH := dh;
и добавить поля `prevW, prevH: INTEGER` в запись документа.
и мелкобаг нумеро тре, бонусный: в StdScrollbars, в процедуте `TrackShaft()` в конце заменить:
Код:
f.Input(x, y, mod, isDown)
UNTIL ~isDown
на:
Код:
IF f.rider # NIL THEN f.Input(x, y, mod, isDown) END
UNTIL (f.rider = NIL) OR ~isDown
rationale: в StdDocuments раньше всё это дело охранял просто `m.unit`, но и то не очень надёжно. теперь мы во-первых, создаём фрэймы документа ещё до того, как отрисуется его окно (а потом окно рисуется, и размеры могут опять поменяться; а один restore в невидимую область уже был, `m.unit` установлена); а во-вторых, при изменении размеров треков юнит каков был — таков и есть. а размеры поменялись. надо пересчитать скроллбары и прочее — а никто этого не делает. точнее, делают, но очень потом, не вовремя, и не всегда.
потому надо помнить размеры документа с прошлой отрисовки, и если они поменялись — то рихтовать всё заново.
в StdTiles надо создавать клон документа с правильными размерами примерно по той же причине. мне лень разбираться, честно говоря, что где триггерится при создании документа с размерами undefined вместо правильных, но оно вот так. а, и опции контроллера трансферить, они отвечают за то, чтобы горизонтального скроллбара не было.
от так уот.
p.s.: там ещё тонкости механики с subwindows, в которые я здесь вникать не буду. скажу только, что они ответственны за то, что слово для леса и мира одно^w^w^w^w^w^w скроллбары для недубликатов более-менее работали при изменени размеров именно потому, что не-дубликаты.