begin ! Fil: ~in105/wndperson.sim; external class Windowtools; % Datastruktur (modell): ref(Set) Personer; element class Person; begin text navn; Boolean snill; integer alder; text procedure key; key :- navn; procedure Vis; begin person_vnd.SetHeading("Data om " & navn & ":"); person_vnd.VisNavn(navn); person_vnd.VisAlder(alder); person_vnd.VisSnill(snill); end; ref(Person) procedure Hent; begin navn :- person_vnd.HentNavn; alder := person_vnd.HentAlder; snill := person_vnd.HentSnill; Hent :- this Person; end; end; % Framvisning: ref(PersonVindu) person_vnd; SubWindow class PersonVindu; begin ref(TextItemWindow) navne_vnd; ref(IntItemWindow) alder_vnd; ref(BoolItemWindow) snill_vnd; procedure VisNavn(n); text n; navne_vnd.puttext(n); procedure VisAlder(a); integer a; alder_vnd.putint(a); procedure VisSnill(s); Boolean s; snill_vnd.putBool(s); text procedure HentNavn; HentNavn :- navne_vnd.gettext; integer procedure HentAlder; HentAlder := alder_vnd.getint; Boolean procedure HentSnill; HentSnill := snill_vnd.getBool; ref(Button) aksept_knapp, bryt_knapp; Boolean aksept, bryt; procedure ClickInButton(b); ref(Button) b; if b == aksept_knapp then aksept := true else if b == bryt_knapp then bryt := true; ref(Person) procedure NyPerson; begin SetHeading("Skriv data om ny person:"); MakeEmpty; ! Tømmer de tre item-vinduene; AllowInput; ! Tillater input i de tre item-vinduene; navne_vnd.PlacePointerRight; ! Plasserer kursoren tilhøyre i navne-vinduet; aksept_knapp.Show; bryt_knapp.Show; aksept := false; bryt := false; while not (aksept or bryt) do handle_event; DisAllowInput; aksept_knapp.Hide; bryt_knapp.Hide; NyPerson :- if aksept then new Person.Hent else none; end; procedure IngenPerson; begin SetHeading("Ingen person vises"); MakeEmpty; end; IngenPerson; navne_vnd :- MakeTextItemWindow .SetMaxChars(35) .SetLabel("Navn:"); alder_vnd :- MakeIntItemWindow .SetMaxChars(4) .PlaceBelow(navne_vnd) .SetLabel("Alder:"); snill_vnd :- MakeBoolItemWindow .PlaceRightof(alder_vnd) .SetLabel("Snill?"); aksept_knapp :- MakeButton("OK") .SetShortCut('o') .Hide .PlaceDownRight; bryt_knapp :- MakeButton("Bryt") .Hide .PlaceLeftOf(aksept_knapp); SetBackGround("gray25"); SetSizeToSubWindowSize; Show; end PersonVindu; % Kontroll: MainWindow class KontrollVindu; begin ref(Button) ny_knapp, vis_knapp, liste_knapp, stopp_knapp; ref(ScrollWindow) liste_vnd; ref(PromptWindow) be_vnd; procedure ClickInButton(b); ref(Button) b; if b == ny_knapp then NyPerson else if b == vis_knapp then VisPerson else if b == liste_knapp then ListPersoner; procedure LineChoice(line); text line; Personer.find_element(line) qua Person.Vis; procedure NyPerson; begin ref(Person) p; p :- new Person; ny_knapp.SetActiveDisAllow; ! Markerer visuelt at ny-knappen er aktiv, ! forbyr klikking i dette vinduets knapper; p :- person_vnd.NyPerson; ny_knapp.SetInActiveAllow; ! Fjerner aktiv-markering, ! Tillater klikking i vinduets knapper; if p =/= none then Personer.add_element(p); end; procedure VisPerson; begin ref(Person) p; p :- Personer.find_element(be_vnd.ask_for_text("Navn?")); if p =/= none then p.Vis else person_vnd.IngenPerson; end; procedure ListPersoner; begin procedure list(p); ref(Person) p; liste_vnd.outline(p.navn); liste_vnd.MakeEmpty; liste_vnd.SetHeading(int_as_text(Personer.size) & " personer registrert:"); Personer.for_each_element(list); end; SettNorskTekst; ny_knapp :- MakeButton("Ny person") .SetShortCut('n'); vis_knapp :- MakeButton("Vis person") .SetShortCut('v'); liste_knapp :- MakeButton("List") .SetShortCut('l'); stopp_knapp :- MakeButton("Stopp") .SetShortCut('s') .PlaceUpRight; person_vnd :- new PersonVindu(this KontrollVindu) .PlaceLeftBelow(stopp_knapp); liste_vnd :- MakeScrollWindow .AllowChoice .PlaceLeftBelow(person_vnd) .SetHeading("Person-liste") .SetLines(6) .SetWidth(person_vnd.width); be_vnd :- MakePromptWindow; SetBackGround("gray75"); SetSizeToSubWindowSize; Show; stopp_knapp.Wait; end KontrollVindu; Personer :- new Set; new KontrollVindu(" Persondata "); end;