Listing 2 (DR.L)

main
{
  w = new window;
  w.menu = new menu
    << (new menu ("&Draw")
      << (line_menu = new menuitem ("&Line"))
      << (circle_menu = new menuitem ("&Circle"))
      << (rectangle_menu = new menuitem ("&Rectangle")));
  w.display_list = new displaylist;
  line ();
  w.show;
}

set_figure (menuitem, type)
{
  if (::menuitem)
    ::menuitem.checked = false;
  (::menuitem = menuitem).checked = true;
  figure = type;
}

line {set_figure (line_menu, "line");}
circle {set_figure (circle_menu, "circle");}
rectangle {set_figure (rectangle_menu, "rectangle");}

startdrag (x1, y1, x2, y2)
{
  w.cursor = "cross";
  obj = new (figure) (x1, y1, x2, y2);
  #pragma new circle, line, rectangle
  w.xor = true;
  obj.draw (w);
}

drag (x,y)
{
  obj.draw (w);
  obj.stretch_to (x, y);
  obj.draw (w);
}

enddrag (x, y)
{
  w.xor = false;
  obj.draw (w);
  w.display_list << obj;
  w.cursor = "arrow";
}
// End of File