anchor.diff:      cur.Attach(rsOutln, 'nid');
       cur.canHideRows := true; cur.hideFlag := 'hidden';
       cur.OnMarkChanged := self.OnCursorChange;
  -
  -    // TODO: eventually i'll build a little lazarus-like RAD thing
  -    // to manage these components as data rather than code.
  +    tg := TDbTreeGrid.Create(dbc);
  +    with tg do begin
  +      x := 1; y := 2; h := vsplit-y; w := 18; datacursor := cur
  +    end;
  +
  +    { the type menu that pops up on ^T from the outliner }
       typeMenu := TDBMenu.Create(self);
       typeMenu.rs := dbc.query('SELECT * FROM kinds ORDER BY kind');
       typeMenu.key := 'knd';
       typeMenu.OnSave := self.OnChooseType;
  ++{ procedure TMinApp.Init  2/2 }
  +
  +    { a menu for selecting pages (on ^G }
       pageMenu := TDBMenu.Create(self);
       pageMenu.rs := dbc.query(
  -	     'SELECT nid, val AS page FROM node NATURAL JOIN kinds '+
  -	     'WHERE kind=:k', ['Page']);
  +       'SELECT nid, val AS page FROM node NATURAL JOIN kinds '+
  +       'WHERE kind=:k', ['Page']);
       pageMenu.key := 'nid';
  -    vsplit := kvm.ymax - 1;
  -    tg := TDbTreeGrid.Create(dbc);
  -    with tg do begin
  -      x := 1; y := 2; h := vsplit-y; w := 18; datacursor := cur
  -    end;
  -    ed := TEditor.Create(self);
  -    ed.x := 20; ed.y := 2; ed.w := kvm.width - 21;
  -    ed.h := vsplit-ed.y-1;  //  why is this different than tg?
  +
  +    { a virtual machine  - not actually used yet! }
       b4 := TB4VM.Create(self);
  -    mb := ZInput.default(1, kvm.ymax - 1, kvm.xmax-2, kvm.xmax-2 );
  -
  -    _views.append(ed);
  -    _views.append(tg);
  -    _views.append(mb);
  -
  +
  +    { impshell (the stack based ui widget) }
  +    imp := TImpForth.Create(self);
  +    imp.mount('term', TTermWords);
  +    imp.mount('forth', TForthWords);
  +    ish := TImpShell.Create(self, imp);
  +    ish.resize(16,8); ish.center(kvm.width div 2, kvm.height div 2);
  +    imp.OnChange := ish.smudge; // so it updates the stack view
  +
  +    { impterm (for showing results/text/etc) }
  +    itv := utv.TTermView.Create(self);
  +    itv.resize(xpc.min(kvm.width, 64), xpc.min(kvm.height, 16));
  +    itv.x := 0; itv.y := kvm.height - itv.h;
  +    TTermWords(imp.modules['term']).term := itv;
  +
  +    { set up component rendering  }
  +    ish.visible := false; itv.visible := false;
  +    _views.extend([ ed, tg, ish, itv ]);
  +
  +    { handle command line arguments }
       if ParamCount = 1 then
         if not ed.Load( ParamStr( 1 )) then
  -	fail( utf8encode('unable to load file: ' +
  -			 utf8decode(ansistring(paramstr( 1 )))))
  +	fail( u2a('unable to load file: ' + paramstr( 1 )))
         else ed.status := 'welcome to minneron.'
       else ok
     end;
  
positive.code: 
  procedure TMinApp.OtherWindow;
    begin
      // focus.defocus;
      if focus = ed then
        begin
  	focus := tg; keymap := km_tg; kvm.HideCursor;
        end
      else if focus = tg then
        begin
  	focus := mb; keymap := km_mb; kvm.ShowCursor;
        end
      else
        begin
  	focus := ed; keymap := km_ed; kvm.ShowCursor;
        end;
      // focus.focus;
    end;
  
negative.code: 
  // TODO : OnCursorChange should be part of the gridview itself.
  procedure TMinApp.OnCursorChange( Sender : TObject );
    begin tg.smudge;
    end;
  
  