12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016 |
- MODULE StdCmds;
- (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Cmds.odc *)
- (* DO NOT EDIT *)
- IMPORT
- Fonts, Ports, Services, Stores, Sequencers, Models, Views,
- Controllers, Containers, Properties, Dialog, Documents, Windows, Strings,
- StdDialog, StdApi;
- CONST
- illegalSizeKey = "#System:IllegalFontSize";
- defaultAllocator = "TextViews.Deposit; StdCmds.Open";
- (* wType, hType *)
- fix = 0; page = 1; window = 2;
- VAR
- size*: RECORD
- size*: INTEGER
- END;
- layout*: RECORD
- wType*, hType*: INTEGER;
- width*, height*: REAL;
- doc: Documents.Document;
- u: INTEGER
- END;
- allocator*: Dialog.String;
-
- propEra: INTEGER; (* (propEra, props) form cache for StdProps() *)
- props: Properties.StdProp; (* valid iff propEra = Props.era *)
-
- prop: Properties.Property; (* usef for copy/paste properties *)
- (* auxiliary procedures *)
-
- PROCEDURE StdProp (): Properties.StdProp;
- BEGIN
- IF propEra # Properties.era THEN
- Properties.CollectStdProp(props);
- propEra := Properties.era
- END;
- RETURN props
- END StdProp;
- PROCEDURE Append (VAR s: ARRAY OF CHAR; t: ARRAY OF CHAR);
- VAR len, i, j: INTEGER; ch: CHAR;
- BEGIN
- len := LEN(s);
- i := 0; WHILE s[i] # 0X DO INC(i) END;
- j := 0; REPEAT ch := t[j]; s[i] := ch; INC(j); INC(i) UNTIL (ch = 0X) OR (i = len);
- s[len - 1] := 0X
- END Append;
- (* standard commands *)
- PROCEDURE OpenAuxDialog* (file, title: ARRAY OF CHAR);
- VAR v: Views.View;
- BEGIN
- StdApi.OpenAuxDialog(file, title, v)
- END OpenAuxDialog;
- PROCEDURE OpenToolDialog* (file, title: ARRAY OF CHAR);
- VAR v: Views.View;
- BEGIN
- StdApi.OpenToolDialog(file, title, v)
- END OpenToolDialog;
- PROCEDURE OpenDoc* (file: ARRAY OF CHAR);
- VAR v: Views.View;
- BEGIN
- StdApi.OpenDoc(file, v)
- END OpenDoc;
-
- PROCEDURE OpenCopyOf* (file: ARRAY OF CHAR);
- VAR v: Views.View;
- BEGIN
- StdApi.OpenCopyOf(file, v)
- END OpenCopyOf;
-
- PROCEDURE OpenAux* (file, title: ARRAY OF CHAR);
- VAR v: Views.View;
- BEGIN
- StdApi.OpenAux(file, title, v)
- END OpenAux;
- PROCEDURE OpenBrowser* (file, title: ARRAY OF CHAR);
- VAR v: Views.View;
- BEGIN
- StdApi.OpenBrowser(file, title, v)
- END OpenBrowser;
- PROCEDURE CloseDialog*;
- VAR v: Views.View;
- BEGIN
- StdApi.CloseDialog(v)
- END CloseDialog;
- PROCEDURE Open*;
- VAR i: INTEGER; v: Views.View;
- BEGIN
- i := Views.Available();
- IF i > 0 THEN Views.Fetch(v); Views.OpenView(v)
- ELSE Dialog.ShowMsg("#System:DepositExpected")
- END
- END Open;
- PROCEDURE PasteView*;
- VAR i: INTEGER; v: Views.View;
- BEGIN
- i := Views.Available();
- IF i > 0 THEN
- Views.Fetch(v);
- Controllers.PasteView(v, Views.undefined, Views.undefined, FALSE)
- ELSE Dialog.ShowMsg("#System:DepositExpected")
- END
- END PasteView;
-
- (* file menu commands *)
-
- PROCEDURE New*;
- VAR res: INTEGER;
- BEGIN
- Dialog.Call(allocator, " ", res)
- END New;
-
-
- (* edit menu commands *)
-
- PROCEDURE Undo*;
- VAR w: Windows.Window;
- BEGIN
- w := Windows.dir.Focus(Controllers.frontPath);
- IF w # NIL THEN w.seq.Undo END
- END Undo;
- PROCEDURE Redo*;
- VAR w: Windows.Window;
- BEGIN
- w := Windows.dir.Focus(Controllers.frontPath);
- IF w # NIL THEN w.seq.Redo END
- END Redo;
- PROCEDURE CopyProp*;
- BEGIN
- Properties.CollectProp(prop)
- END CopyProp;
-
- PROCEDURE PasteProp*;
- BEGIN
- Properties.EmitProp(NIL, prop)
- END PasteProp;
-
- PROCEDURE Clear*;
- (** remove the selection of the current focus **)
- VAR msg: Controllers.EditMsg;
- BEGIN
- msg.op := Controllers.cut; msg.view := NIL;
- msg.clipboard := FALSE;
- Controllers.Forward(msg)
- END Clear;
- PROCEDURE SelectAll*;
- (** select whole content of current focus **)
- VAR msg: Controllers.SelectMsg;
- BEGIN
- msg.set := TRUE; Controllers.Forward(msg)
- END SelectAll;
- PROCEDURE DeselectAll*;
- (** select whole content of current focus **)
- VAR msg: Controllers.SelectMsg;
- BEGIN
- msg.set := FALSE; Controllers.Forward(msg)
- END DeselectAll;
- PROCEDURE SelectDocument*;
- (** select whole document **)
- VAR w: Windows.Window; c: Containers.Controller;
- BEGIN
- w := Windows.dir.Focus(Controllers.path);
- IF w # NIL THEN
- c := w.doc.ThisController();
- IF (c # NIL) & ~(Containers.noSelection IN c.opts) & (c.Singleton() = NIL) THEN
- c.SetSingleton(w.doc.ThisView())
- END
- END
- END SelectDocument;
- PROCEDURE SelectNextView*;
- VAR c: Containers.Controller; v: Views.View;
- BEGIN
- c := Containers.Focus();
- IF (c # NIL) & ~(Containers.noSelection IN c.opts) THEN
- IF c.HasSelection() THEN v := c.Singleton() ELSE v := NIL END;
- IF v = NIL THEN
- c.GetFirstView(Containers.any, v)
- ELSE
- c.GetNextView(Containers.any, v);
- IF v = NIL THEN c.GetFirstView(Containers.any, v) END
- END;
- c.SelectAll(FALSE);
- IF v # NIL THEN c.SetSingleton(v) END
- ELSE Dialog.ShowMsg("#Dev:NoTargetFocusFound")
- END
- END SelectNextView;
-
- (** font menu commands **)
- PROCEDURE Font* (typeface: Fonts.Typeface);
- (** set the selection to the given font family **)
- VAR p: Properties.StdProp;
- BEGIN
- NEW(p); p.valid := {Properties.typeface}; p.typeface := typeface;
- Properties.EmitProp(NIL, p)
- END Font;
- PROCEDURE DefaultFont*;
- (** set the selection to the default font family **)
- VAR p: Properties.StdProp;
- BEGIN
- NEW(p); p.valid := {Properties.typeface}; p.typeface := Fonts.default;
- Properties.EmitProp(NIL, p)
- END DefaultFont;
- (** attributes menu commands **)
- PROCEDURE Plain*;
- (** reset the font attribute "weight" and all font style attributes of the selection **)
- VAR p: Properties.StdProp;
- BEGIN
- NEW(p); p.valid := {Properties.style, Properties.weight};
- p.style.val := {}; p.style.mask := {Fonts.italic, Fonts.underline, Fonts.strikeout};
- p.weight := Fonts.normal;
- Properties.EmitProp(NIL, p)
- END Plain;
- PROCEDURE Bold*;
- (** change the font attribute "weight" in the selection;
- if the selection has a homogeneously bold weight: toggle to normal, else force to bold **)
- VAR p, p0: Properties.StdProp;
- BEGIN
- Properties.CollectStdProp(p0);
- NEW(p); p.valid := {Properties.weight};
- IF (Properties.weight IN p0.valid) & (p0.weight # Fonts.normal) THEN
- p.weight := Fonts.normal
- ELSE p.weight := Fonts.bold
- END;
- Properties.EmitProp(NIL, p)
- END Bold;
- PROCEDURE Italic*;
- (** change the font style attribute "italic" in the selection;
- if the selection is homogeneous wrt this attribute: toggle, else force to italic **)
- VAR p, p0: Properties.StdProp;
- BEGIN
- Properties.CollectStdProp(p0);
- NEW(p); p.valid := {Properties.style}; p.style.mask := {Fonts.italic};
- IF (Properties.style IN p0.valid) & (Fonts.italic IN p0.style.val) THEN
- p.style.val := {}
- ELSE p.style.val := {Fonts.italic}
- END;
- Properties.EmitProp(NIL, p)
- END Italic;
- PROCEDURE Underline*;
- (** change the font style attribute "underline" in the selection;
- if the selection is homogeneous wrt this attribute: toggle, else force to underline **)
- VAR p, p0: Properties.StdProp;
- BEGIN
- Properties.CollectStdProp(p0);
- NEW(p); p.valid := {Properties.style}; p.style.mask := {Fonts.underline};
- IF (Properties.style IN p0.valid) & (Fonts.underline IN p0.style.val) THEN
- p.style.val := {}
- ELSE p.style.val := {Fonts.underline}
- END;
- Properties.EmitProp(NIL, p)
- END Underline;
- PROCEDURE Strikeout*;
- (** change the font style attribute "strikeout" in the selection,
- without changing other attributes;
- if the selection is homogeneous wrt this attribute: toggle,
- else force to strikeout **)
- VAR p, p0: Properties.StdProp;
- BEGIN
- Properties.CollectStdProp(p0);
- NEW(p); p.valid := {Properties.style}; p.style.mask := {Fonts.strikeout};
- IF (Properties.style IN p0.valid) & (Fonts.strikeout IN p0.style.val) THEN
- p.style.val := {}
- ELSE p.style.val := {Fonts.strikeout}
- END;
- Properties.EmitProp(NIL, p)
- END Strikeout;
- PROCEDURE Size* (size: INTEGER);
- (** set the selection to the given font size **)
- VAR p: Properties.StdProp;
- BEGIN
- NEW(p); p.valid := {Properties.size};
- p.size := size * Ports.point;
- Properties.EmitProp(NIL, p)
- END Size;
- PROCEDURE SetSize*;
- VAR p: Properties.StdProp;
- BEGIN
- IF (0 <= size.size) & (size.size < 32768) THEN
- NEW(p); p.valid := {Properties.size};
- p.size := size.size * Fonts.point;
- Properties.EmitProp(NIL, p)
- ELSE
- Dialog.ShowMsg(illegalSizeKey)
- END
- END SetSize;
- PROCEDURE InitSizeDialog*;
- VAR p: Properties.StdProp;
- BEGIN
- Properties.CollectStdProp(p);
- IF Properties.size IN p.valid THEN size.size := p.size DIV Fonts.point END
- END InitSizeDialog;
- PROCEDURE Color* (color: Ports.Color);
- (** set the color attributes of the selection **)
- VAR p: Properties.StdProp;
- BEGIN
- NEW(p); p.valid := {Properties.color};
- p.color.val := color;
- Properties.EmitProp(NIL, p)
- END Color;
- PROCEDURE UpdateAll*; (* for HostCmds.Toggle *)
- VAR w: Windows.Window; pw, ph: INTEGER; dirty: BOOLEAN; msg: Models.UpdateMsg;
- BEGIN
- w := Windows.dir.First();
- WHILE w # NIL DO
- IF ~w.sub THEN
- dirty := w.seq.Dirty();
- Models.Domaincast(w.doc.Domain(), msg);
- IF ~dirty THEN w.seq.SetDirty(FALSE) END (* not perfect: "undoable dirt" ... *)
- END;
- w.port.GetSize(pw, ph);
- w.Restore(0, 0, pw, ph);
- w := Windows.dir.Next(w)
- END
- END UpdateAll;
- PROCEDURE RestoreAll*;
- VAR w: Windows.Window; pw, ph: INTEGER;
- BEGIN
- w := Windows.dir.First();
- WHILE w # NIL DO
- w.port.GetSize(pw, ph);
- w.Restore(0, 0, pw, ph);
- w := Windows.dir.Next(w)
- END
- END RestoreAll;
-
-
- (** document layout dialog **)
-
- PROCEDURE SetLayout*;
- VAR opts: SET; l, t, r, b, r0, b0: INTEGER; c: Containers.Controller; script: Stores.Operation;
- BEGIN
- c := layout.doc.ThisController();
- opts := c.opts - {Documents.pageWidth..Documents.winHeight};
- IF layout.wType = page THEN INCL(opts, Documents.pageWidth)
- ELSIF layout.wType = window THEN INCL(opts, Documents.winWidth)
- END;
- IF layout.hType = page THEN INCL(opts, Documents.pageHeight)
- ELSIF layout.hType = window THEN INCL(opts, Documents.winHeight)
- END;
- layout.doc.PollRect(l, t, r, b); r0 := r; b0 := b;
- IF layout.wType = fix THEN r := l + SHORT(ENTIER(layout.width * layout.u)) END;
- IF layout.hType = fix THEN b := t + SHORT(ENTIER(layout.height * layout.u)) END;
- IF (opts # c.opts) OR (r # r0) OR (b # b0) THEN
- Views.BeginScript(layout.doc, "#System:ChangeLayout", script);
- c.SetOpts(opts);
- layout.doc.SetRect(l, t, r, b);
- Views.EndScript(layout.doc, script)
- END
- END SetLayout;
-
- PROCEDURE InitLayoutDialog*;
- (* guard: WindowGuard *)
- VAR w: Windows.Window; c: Containers.Controller; l, t, r, b: INTEGER;
- BEGIN
- w := Windows.dir.First();
- IF w # NIL THEN
- layout.doc := w.doc;
- c := w.doc.ThisController();
- IF Documents.pageWidth IN c.opts THEN layout.wType := page
- ELSIF Documents.winWidth IN c.opts THEN layout.wType := window
- ELSE layout.wType := fix
- END;
- IF Documents.pageHeight IN c.opts THEN layout.hType := page
- ELSIF Documents.winHeight IN c.opts THEN layout.hType := window
- ELSE layout.hType := fix
- END;
- IF Dialog.metricSystem THEN layout.u := Ports.mm * 10 ELSE layout.u := Ports.inch END;
- w.doc.PollRect(l, t, r, b);
- layout.width := (r - l) DIV (layout.u DIV 100) / 100;
- layout.height := (b - t) DIV (layout.u DIV 100) / 100
- END
- END InitLayoutDialog;
-
- PROCEDURE WidthGuard* (VAR par: Dialog.Par);
- BEGIN
- IF layout.wType # fix THEN par.readOnly := TRUE END
- END WidthGuard;
-
- PROCEDURE HeightGuard* (VAR par: Dialog.Par);
- BEGIN
- IF layout.hType # fix THEN par.readOnly := TRUE END
- END HeightGuard;
-
- PROCEDURE TypeNotifier* (op, from, to: INTEGER);
- VAR w, h, l, t, r, b: INTEGER; d: BOOLEAN;
- BEGIN
- layout.doc.PollRect(l, t, r, b);
- IF layout.wType = page THEN
- layout.doc.PollPage(w, h, l, t, r, b, d)
- ELSIF layout.wType = window THEN
- layout.doc.context.GetSize(w, h); r := w - l
- END;
- layout.width := (r - l) DIV (layout.u DIV 100) / 100;
- layout.doc.PollRect(l, t, r, b);
- IF layout.hType = page THEN
- layout.doc.PollPage(w, h, l, t, r, b, d)
- ELSIF layout.hType = window THEN
- layout.doc.context.GetSize(w, h); b := h - t
- END;
- layout.height := (b - t) DIV (layout.u DIV 100) / 100;
- Dialog.Update(layout)
- END TypeNotifier;
-
- (** window menu command **)
- PROCEDURE NewWindow*;
- (** guard ModelViewGuard **)
- VAR win: Windows.Window; doc: Documents.Document; v: Views.View; title: Views.Title;
- seq: ANYPTR; clean: BOOLEAN;
- BEGIN
- win := Windows.dir.Focus(Controllers.frontPath);
- IF win # NIL THEN
- v := win.doc.ThisView();
- IF v.Domain() # NIL THEN seq := v.Domain().GetSequencer() ELSE seq := NIL END;
- clean := (seq # NIL) & ~seq(Sequencers.Sequencer).Dirty();
- doc := win.doc.DocCopyOf(v);
- (* Stores.InitDomain(doc, v.Domain()); *)
- ASSERT(doc.Domain() = v.Domain(), 100);
- win.GetTitle(title);
- Windows.dir.OpenSubWindow(Windows.dir.New(), doc, win.flags, title);
- IF clean THEN seq(Sequencers.Sequencer).SetDirty(FALSE) END
- END
- END NewWindow;
-
- (* properties *)
-
- PROCEDURE GetCmd (name: ARRAY OF CHAR; OUT cmd: ARRAY OF CHAR);
- VAR i, j: INTEGER; ch, lch: CHAR; key: ARRAY 256 OF CHAR;
- BEGIN
- i := 0; ch := name[0]; key[0] := "#"; j := 1;
- REPEAT
- key[j] := ch; INC(j); lch := ch; INC(i); ch := name[i]
- UNTIL (ch = 0X) OR (ch = ".")
- OR ((ch >= "A") & (ch <= "Z") OR (ch >= "À") & (ch # "×") & (ch <= "Þ"))
- & ((lch < "A") OR (lch > "Z") & (lch < "À") OR (lch = "×") OR (lch > "Þ"));
- IF ch = "." THEN
- key := "#System:" + name
- ELSE
- key[j] := ":"; INC(j); key[j] := 0X; j := 0;
- WHILE ch # 0X DO name[j] := ch; INC(i); INC(j); ch := name[i] END;
- name[j] := 0X; key := key + name
- END;
- Dialog.MapString(key, cmd);
- IF cmd = name THEN cmd := "" END
- END GetCmd;
-
- PROCEDURE SearchCmd (call: BOOLEAN; OUT found: BOOLEAN);
- VAR p: Properties.Property; std: BOOLEAN; v: Views.View; cmd: ARRAY 256 OF CHAR; pos, res: INTEGER;
- BEGIN
- Controllers.SetCurrentPath(Controllers.targetPath);
- v := Containers.FocusSingleton(); found := FALSE;
- IF v # NIL THEN
- Services.GetTypeName(v, cmd);
- GetCmd(cmd, cmd);
- IF cmd # "" THEN found := TRUE;
- IF call THEN Dialog.Call(cmd, "", res) END
- END
- END;
- std := FALSE;
- Properties.CollectProp(p);
- WHILE p # NIL DO
- IF p IS Properties.StdProp THEN std := TRUE
- ELSE
- Services.GetTypeName(p, cmd);
- GetCmd(cmd, cmd);
- IF cmd # "" THEN found := TRUE;
- IF call THEN Dialog.Call(cmd, "", res) END
- ELSE
- Services.GetTypeName(p, cmd);
- Strings.Find(cmd, "Desc", LEN(cmd$)-4, pos);
- IF LEN(cmd$)-4 = pos THEN
- cmd[pos] := 0X; GetCmd(cmd, cmd);
- IF cmd # "" THEN found := TRUE;
- IF call THEN Dialog.Call(cmd, "", res) END
- END
- END
- END
- END;
- p := p.next
- END;
- IF std & ~found THEN
- Dialog.MapString("#Host:Properties.StdProp", cmd);
- IF cmd # "Properties.StdProp" THEN found := TRUE;
- IF call THEN Dialog.Call(cmd, "", res) END
- END
- END;
- IF ~found THEN
- Dialog.MapString("#System:ShowProp", cmd);
- IF cmd # "ShowProp" THEN found := TRUE;
- IF call THEN Dialog.Call(cmd, "", res) END
- END
- END;
- Controllers.ResetCurrentPath
- END SearchCmd;
-
- PROCEDURE ShowProp*;
- VAR found: BOOLEAN;
- BEGIN
- SearchCmd(TRUE, found)
- END ShowProp;
-
- PROCEDURE ShowPropGuard* (VAR par: Dialog.Par);
- VAR found: BOOLEAN;
- BEGIN
- SearchCmd(FALSE, found);
- IF ~found THEN par.disabled := TRUE END
- END ShowPropGuard;
-
-
- (* container commands *)
-
- PROCEDURE ActFocus (): Containers.Controller;
- VAR c: Containers.Controller; v: Views.View;
- BEGIN
- c := Containers.Focus();
- IF c # NIL THEN
- v := c.ThisView();
- IF v IS Documents.Document THEN
- v := v(Documents.Document).ThisView();
- IF v IS Containers.View THEN
- c := v(Containers.View).ThisController()
- ELSE c := NIL
- END
- END
- END;
- RETURN c
- END ActFocus;
- PROCEDURE ToggleNoFocus*;
- VAR c: Containers.Controller; v: Views.View;
- BEGIN
- c := ActFocus();
- IF c # NIL THEN
- v := c.ThisView();
- IF ~((v IS Documents.Document) OR (Containers.noSelection IN c.opts)) THEN
- IF Containers.noFocus IN c.opts THEN
- c.SetOpts(c.opts - {Containers.noFocus})
- ELSE
- c.SetOpts(c.opts + {Containers.noFocus})
- END
- END
- END
- END ToggleNoFocus;
- PROCEDURE OpenAsAuxDialog*;
- (** create a new sub-window onto the focus view shown in the top window, mask mode **)
- VAR win: Windows.Window; doc: Documents.Document; v, u: Views.View; title: Views.Title;
- c: Containers.Controller;
- BEGIN
- v := Controllers.FocusView();
- IF (v # NIL) & (v IS Containers.View) & ~(v IS Documents.Document) THEN
- win := Windows.dir.Focus(Controllers.frontPath); ASSERT(win # NIL, 100);
- doc := win.doc.DocCopyOf(v);
- u := doc.ThisView();
- c := u(Containers.View).ThisController();
- c.SetOpts(c.opts - {Containers.noFocus} + {Containers.noCaret, Containers.noSelection});
- IF v # win.doc.ThisView() THEN
- c := doc.ThisController();
- c.SetOpts(c.opts - {Documents.pageWidth, Documents.pageHeight}
- + {Documents.winWidth, Documents.winHeight})
- END;
- (* Stores.InitDomain(doc, v.Domain()); already done in DocCopyOf *)
- win.GetTitle(title);
- Windows.dir.OpenSubWindow(Windows.dir.New(), doc,
- {Windows.isAux, Windows.neverDirty, Windows.noResize, Windows.noHScroll, Windows.noVScroll},
- title)
- ELSE Dialog.Beep
- END
- END OpenAsAuxDialog;
- PROCEDURE OpenAsToolDialog*;
- (** create a new sub-window onto the focus view shown in the top window, mask mode **)
- VAR win: Windows.Window; doc: Documents.Document; v, u: Views.View; title: Views.Title;
- c: Containers.Controller;
- BEGIN
- v := Controllers.FocusView();
- IF (v # NIL) & (v IS Containers.View) & ~(v IS Documents.Document) THEN
- win := Windows.dir.Focus(Controllers.frontPath); ASSERT(win # NIL, 100);
- doc := win.doc.DocCopyOf(v);
- u := doc.ThisView();
- c := u(Containers.View).ThisController();
- c.SetOpts(c.opts - {Containers.noFocus} + {Containers.noCaret, Containers.noSelection});
- IF v # win.doc.ThisView() THEN
- c := doc.ThisController();
- c.SetOpts(c.opts - {Documents.pageWidth, Documents.pageHeight}
- + {Documents.winWidth, Documents.winHeight})
- END;
- (* Stores.InitDomain(doc, v.Domain()); already done in DocCopyOf *)
- win.GetTitle(title);
- Windows.dir.OpenSubWindow(Windows.dir.New(), doc,
- {Windows.isTool, Windows.neverDirty, Windows.noResize, Windows.noHScroll, Windows.noVScroll},
- title)
- ELSE Dialog.Beep
- END
- END OpenAsToolDialog;
- PROCEDURE RecalcFocusSize*;
- VAR c: Containers.Controller; v: Views.View; bounds: Properties.BoundsPref;
- BEGIN
- c := Containers.Focus();
- IF c # NIL THEN
- v := c.ThisView();
- bounds.w := Views.undefined; bounds.h := Views.undefined;
- Views.HandlePropMsg(v, bounds);
- v.context.SetSize(bounds.w, bounds.h)
- END
- END RecalcFocusSize;
- PROCEDURE RecalcAllSizes*;
- VAR w: Windows.Window;
- BEGIN
- w := Windows.dir.First();
- WHILE w # NIL DO
- StdDialog.RecalcView(w.doc.ThisView());
- w := Windows.dir.Next(w)
- END
- END RecalcAllSizes;
-
- PROCEDURE SetMode(opts: SET);
- VAR
- c: Containers.Controller; v: Views.View;
- gm: Containers.GetOpts; sm: Containers.SetOpts;
- w: Windows.Window;
- BEGIN
- c := Containers.Focus();
- gm.valid := {};
- IF (c # NIL) & (c.Singleton() # NIL) THEN
- v := c.Singleton();
- Views.HandlePropMsg(v, gm);
- END;
- IF gm.valid = {} THEN
- w := Windows.dir.Focus(Controllers.path);
- IF (w # NIL) & (w.doc.ThisView() IS Containers.View) THEN v := w.doc.ThisView() ELSE v := NIL END
- END;
- IF v # NIL THEN
- sm.valid := {Containers.noSelection, Containers.noFocus, Containers.noCaret};
- sm.opts := opts;
- Views.HandlePropMsg(v, sm);
- END;
- END SetMode;
-
- PROCEDURE GetMode(OUT found: BOOLEAN; OUT opts: SET);
- VAR c: Containers.Controller; gm: Containers.GetOpts; w: Windows.Window;
- BEGIN
- c := Containers.Focus();
- gm.valid := {};
- IF (c # NIL) & (c.Singleton() # NIL) THEN
- Views.HandlePropMsg(c.Singleton(), gm);
- END;
- IF gm.valid = {} THEN
- w := Windows.dir.Focus(Controllers.path);
- IF (w # NIL) & (w.doc.ThisView() IS Containers.View) THEN
- Views.HandlePropMsg(w.doc.ThisView(), gm);
- END
- END;
- found := gm.valid # {};
- opts := gm.opts
- END GetMode;
-
- PROCEDURE SetMaskMode*;
- (* Guard: SetMaskGuard *)
- BEGIN
- SetMode({Containers.noSelection, Containers.noCaret})
- END SetMaskMode;
- PROCEDURE SetEditMode*;
- (* Guard: SetEditGuard *)
- BEGIN
- SetMode({})
- END SetEditMode;
- PROCEDURE SetLayoutMode*;
- (* Guard: SetLayoutGuard *)
- BEGIN
- SetMode({Containers.noFocus})
- END SetLayoutMode;
- PROCEDURE SetBrowserMode*;
- (* Guard: SetBrowserGuard *)
- BEGIN
- SetMode({Containers.noCaret})
- END SetBrowserMode;
- (* standard guards *)
-
- PROCEDURE ToggleNoFocusGuard* (VAR par: Dialog.Par);
- VAR c: Containers.Controller; v: Views.View;
- BEGIN
- c := ActFocus();
- IF c # NIL THEN
- v := c.ThisView();
- IF ~((v IS Documents.Document) OR (Containers.noSelection IN c.opts)) THEN
- IF Containers.noFocus IN c.opts THEN par.label := "#System:AllowFocus"
- ELSE par.label := "#System:PreventFocus"
- END
- ELSE par.disabled := TRUE
- END
- ELSE par.disabled := TRUE
- END
- END ToggleNoFocusGuard;
- PROCEDURE ReadOnlyGuard* (VAR par: Dialog.Par);
- BEGIN
- par.readOnly := TRUE
- END ReadOnlyGuard;
-
- PROCEDURE WindowGuard* (VAR par: Dialog.Par);
- VAR w: Windows.Window;
- BEGIN
- w := Windows.dir.First();
- IF w = NIL THEN par.disabled := TRUE END
- END WindowGuard;
- PROCEDURE ModelViewGuard* (VAR par: Dialog.Par);
- VAR w: Windows.Window;
- BEGIN
- w := Windows.dir.Focus(Controllers.frontPath);
- par.disabled := (w = NIL) OR (w.doc.ThisView().ThisModel() = NIL)
- END ModelViewGuard;
- PROCEDURE SetMaskModeGuard* (VAR par: Dialog.Par);
- CONST mode = {Containers.noSelection, Containers.noFocus, Containers.noCaret};
- VAR opts: SET; found: BOOLEAN;
- BEGIN
- GetMode(found, opts);
- IF found THEN
- par.checked := opts * mode = {Containers.noSelection, Containers.noCaret}
- ELSE
- par.disabled := TRUE
- END
- END SetMaskModeGuard;
- PROCEDURE SetEditModeGuard* (VAR par: Dialog.Par);
- CONST mode = {Containers.noSelection, Containers.noFocus, Containers.noCaret};
- VAR opts: SET; found: BOOLEAN;
- BEGIN
- GetMode(found, opts);
- IF found THEN
- par.checked := opts * mode = {}
- ELSE
- par.disabled := TRUE
- END
- END SetEditModeGuard;
- PROCEDURE SetLayoutModeGuard* (VAR par: Dialog.Par);
- CONST mode = {Containers.noSelection, Containers.noFocus, Containers.noCaret};
- VAR opts: SET; found: BOOLEAN;
- BEGIN
- GetMode(found, opts);
- IF found THEN
- par.checked := opts * mode = {Containers.noFocus}
- ELSE
- par.disabled := TRUE
- END
- END SetLayoutModeGuard;
- PROCEDURE SetBrowserModeGuard* (VAR par: Dialog.Par);
- CONST mode = {Containers.noSelection, Containers.noFocus, Containers.noCaret};
- VAR opts: SET; found: BOOLEAN;
- BEGIN
- GetMode(found, opts);
- IF found THEN
- par.checked := opts * mode = {Containers.noCaret}
- ELSE
- par.disabled := TRUE
- END
- END SetBrowserModeGuard;
- PROCEDURE SelectionGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ops.valid * {Controllers.cut, Controllers.copy} = {} THEN par.disabled := TRUE END
- END SelectionGuard;
- PROCEDURE SingletonGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ops.singleton = NIL THEN par.disabled := TRUE END
- END SingletonGuard;
-
- PROCEDURE SelectAllGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ~ops.selectable THEN par.disabled := TRUE END
- END SelectAllGuard;
- PROCEDURE CaretGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ops.valid * {Controllers.pasteChar .. Controllers.paste} = {} THEN par.disabled := TRUE END
- END CaretGuard;
- PROCEDURE PasteCharGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ~(Controllers.pasteChar IN ops.valid) THEN par.disabled := TRUE END
- END PasteCharGuard;
- PROCEDURE PasteLCharGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ~(Controllers.pasteChar IN ops.valid) THEN par.disabled := TRUE END
- END PasteLCharGuard;
- PROCEDURE PasteViewGuard* (VAR par: Dialog.Par);
- VAR ops: Controllers.PollOpsMsg;
- BEGIN
- Controllers.PollOps(ops);
- IF ~(Controllers.paste IN ops.valid) THEN par.disabled := TRUE END
- END PasteViewGuard;
-
- PROCEDURE ContainerGuard* (VAR par: Dialog.Par);
- BEGIN
- IF Containers.Focus() = NIL THEN par.disabled := TRUE END
- END ContainerGuard;
-
- PROCEDURE UndoGuard* (VAR par: Dialog.Par);
- VAR f: Windows.Window; opName: Stores.OpName;
- BEGIN
- Dialog.MapString("#System:Undo", par.label);
- f := Windows.dir.Focus(Controllers.frontPath);
- IF (f # NIL) & f.seq.CanUndo() THEN
- f.seq.GetUndoName(opName);
- Dialog.MapString(opName, opName);
- Append(par.label, " ");
- Append(par.label, opName)
- ELSE
- par.disabled := TRUE
- END
- END UndoGuard;
- PROCEDURE RedoGuard* (VAR par: Dialog.Par);
- VAR f: Windows.Window; opName: Stores.OpName;
- BEGIN
- Dialog.MapString("#System:Redo", par.label);
- f := Windows.dir.Focus(Controllers.frontPath);
- IF (f # NIL) & f.seq.CanRedo() THEN
- f.seq.GetRedoName(opName);
- Dialog.MapString(opName, opName);
- Append(par.label, " ");
- Append(par.label, opName)
- ELSE
- par.disabled := TRUE
- END
- END RedoGuard;
-
- PROCEDURE PlainGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF props.known * {Properties.style, Properties.weight} # {} THEN
- par.checked := (Properties.style IN props.valid)
- & (props.style.val = {}) & ({Fonts.italic, Fonts.underline, Fonts.strikeout} - props.style.mask = {})
- & (Properties.weight IN props.valid) & (props.weight = Fonts.normal)
- ELSE
- par.disabled := TRUE
- END
- END PlainGuard;
- PROCEDURE BoldGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.weight IN props.known THEN
- par.checked := (Properties.weight IN props.valid) & (props.weight = Fonts.bold)
- ELSE
- par.disabled := TRUE
- END
- END BoldGuard;
- PROCEDURE ItalicGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.style IN props.known THEN
- par.checked := (Properties.style IN props.valid) & (Fonts.italic IN props.style.val)
- ELSE
- par.disabled := TRUE
- END
- END ItalicGuard;
- PROCEDURE UnderlineGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.style IN props.known THEN
- par.checked := (Properties.style IN props.valid) & (Fonts.underline IN props.style.val)
- ELSE
- par.disabled := TRUE
- END
- END UnderlineGuard;
- PROCEDURE StrikeoutGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.style IN props.known THEN
- par.checked := (Properties.style IN props.valid) & (Fonts.strikeout IN props.style.val)
- ELSE
- par.disabled := TRUE
- END
- END StrikeoutGuard;
- PROCEDURE SizeGuard* (size: INTEGER; VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.size IN props.known THEN
- par.checked := (Properties.size IN props.valid) & (size = props.size DIV Ports.point)
- ELSE
- par.disabled := TRUE
- END
- END SizeGuard;
- PROCEDURE ColorGuard* (color: INTEGER; VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.color IN props.known THEN
- par.checked := (Properties.color IN props.valid) & (color = props.color.val)
- ELSE
- par.disabled := TRUE
- END
- END ColorGuard;
-
- PROCEDURE DefaultFontGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF Properties.typeface IN props.known THEN
- par.checked := (Properties.typeface IN props.valid) & (props.typeface = Fonts.default)
- ELSE
- par.disabled := TRUE
- END
- END DefaultFontGuard;
- PROCEDURE TypefaceGuard* (VAR par: Dialog.Par);
- VAR props: Properties.StdProp;
- BEGIN
- props := StdProp();
- IF ~(Properties.typeface IN props.known) THEN par.disabled := TRUE END
- END TypefaceGuard;
-
- (* standard notifiers *)
-
- PROCEDURE DefaultOnDoubleClick* (op, from, to: INTEGER);
- VAR msg: Controllers.EditMsg; c: Containers.Controller;
- BEGIN
- IF (op = Dialog.pressed) & (from = 1) THEN
- Controllers.SetCurrentPath(Controllers.frontPath);
- c := Containers.Focus();
- Controllers.ResetCurrentPath;
- IF {Containers.noSelection, Containers.noCaret} - c.opts = {} THEN
- msg.op := Controllers.pasteChar;
- msg.char := 0DX; msg.modifiers := {};
- Controllers.ForwardVia(Controllers.frontPath, msg)
- END
- END
- END DefaultOnDoubleClick;
- PROCEDURE Init;
- BEGIN
- allocator := defaultAllocator;
- propEra := -1
- END Init;
- BEGIN
- Init
- END StdCmds.
|