[comp.windows.interviews] Doc bug fixes

calder@uluru.stanford.edu (Paul Calder) (05/11/91)

This patch fixes three bugs in Doc.  It is archived as
'pub/3.0-fixes/fix6' on 'interviews.stanford.edu'.

    1. Some documents were incorrectly positioned when printed.

Add a new Patch to DocumentViewer.  Affects DocumentViewer.[ch]

    2. Tables with hidden column separators were read incorrectly.

Fix it!  Affects Document.c

    3. Non-ASCII characters in Idraw drawings were read incorrently.

Check for \ddd characters.  Affects IdrawImage.c

============
    Apply with ``patch -p -N < fix6'' at the top of the source tree.

*** iv/src/bin/doc/DocumentViewer.h.beta	Thu Apr 11 23:21:10 1991
--- iv/src/bin/doc/DocumentViewer.h	        Fri May 10 11:11:33 1991
***************
*** 116,121 ****
--- 116,122 ----
  
      class Patch* _top;
      class Patch* _header_patch;
+     class Patch* _body_patch;
      class Patch* _footer_patch;
      class Patch* _page_patch;
      class Telltale* _prev_page;

*** iv/src/bin/doc/DocumentViewer.c.beta	Mon Apr 15 10:58:11 1991
--- iv/src/bin/doc/DocumentViewer.c	        Fri May 10 11:10:23 1991
***************
*** 180,185 ****
--- 180,196 ----
      _header_patch = new Patch(nil);
      _page_patch = new Patch(nil);
      _footer_patch = new Patch(new LRBox(_prev_page, _next_page));
+     _body_patch = new Patch(
+         new TBBox(
+             new Margin(
+                 new PageBorder(
+                     new Margin(_page_patch, 1, 5, 5, 1), fg
+                 ),
+                 0, 0, 0, 0, fil, 0, 5, fil, 0, 0, 0, 0
+             ),
+             _footer_patch
+         )
+     );
  
      float leftmargin = _document->document_metric("leftsidemargin");
      float rightmargin = _document->document_metric("rightsidemargin");
***************
*** 190,210 ****
          new Background(
  	    new TBBox(
  		new VCenter(_header_patch, 1.0),
! 		new VGlue(3, 0, 0),
! 		new HMargin(
! 		    new PageBorder(
! 			new Margin(
! 			    _page_patch,
! 			    leftmargin + 1, 0, leftmargin - 1,
! 			    rightmargin + 5, fil, rightmargin - 1,
! 			    bottommargin + 5, 0, bottommargin - 1,
! 			    topmargin + 1, 0, topmargin - 1
! 			), fg
! 		    ), 8.0
! 		),
! 		new VGlue(5, 0, 0),
! 		new HCenter(new RMargin(_footer_patch, 0, fil, 0), 0.0), 
! 		new VGlue(0, fil, 0)
              ), bg
          ), this
      );
--- 201,207 ----
          new Background(
  	    new TBBox(
  		new VCenter(_header_patch, 1.0),
!                 new Margin(_body_patch, 5)
              ), bg
          ), this
      );
***************
*** 219,225 ****
      _view->update();
  
      _page = new Page(_view);
!     _page_patch->body(_page);
  
      _starting_page = int(_document->document_metric("startingpage"));
      _current_page = -1;
--- 216,224 ----
      _view->update();
  
      _page = new Page(_view);
!     _page_patch->body(
!         new Margin(_page, leftmargin, rightmargin, bottommargin, topmargin)
!     );
  
      _starting_page = int(_document->document_metric("startingpage"));
      _current_page = -1;
***************
*** 490,499 ****
          page_to(_current_page - 1);
          return false;
      } else if (strncmp(command, "page", 4) == 0) {
!         int p = atoi(command + 4);
! 	if (p > 0) {
!             page_to(p);
!         }
          return false;
      } else {
          return _application->command(command);
--- 489,495 ----
          page_to(_current_page - 1);
          return false;
      } else if (strncmp(command, "page", 4) == 0) {
!         page_to(atoi(command + 4));
          return false;
      } else {
          return _application->command(command);
***************
*** 672,678 ****
      }
      ViewerFloatInfo& info = _float_info->item(i);
      _page->change(i);
!     _page_patch->reallocate();
      _reshaped = true;
  }
  
--- 668,675 ----
      }
      ViewerFloatInfo& info = _float_info->item(i);
      _page->change(i);
!     _body_patch->change(0);
!     _body_patch->reallocate();
      _reshaped = true;
  }
  
***************
*** 719,726 ****
      if (info._x != x || info._y != y) {
          _page->move(i, x, y);
      }
-     _page_patch->reallocate();
      _page->change(i);
      _reshaped = true;
      info._x = x;
      info._y = y;
--- 716,724 ----
      if (info._x != x || info._y != y) {
          _page->move(i, x, y);
      }
      _page->change(i);
+     _body_patch->change(0);
+     _body_patch->reallocate();
      _reshaped = true;
      info._x = x;
      info._y = y;
***************
*** 811,816 ****
--- 809,815 ----
          }
  
          LRBox* buttons = new LRBox();
+         buttons->append(nil);
          buttons->append(
              new Button(new Command(this, "page backward"), _prev_page)
          );
***************
*** 817,823 ****
          buttons->append(
              new Button(new Command(this, "page forward"), _next_page)
          );
!         buttons->append(new HGlue(5));
  
          Coord width = _document->document_metric("textwidth");
          LRComposition* comp = new LRComposition(
--- 816,822 ----
          buttons->append(
              new Button(new Command(this, "page forward"), _next_page)
          );
!         buttons->append(new HGlue(5, 0, 0));
  
          Coord width = _document->document_metric("textwidth");
          LRComposition* comp = new LRComposition(
***************
*** 836,844 ****
          }
          comp->repair();
          buttons->append(comp);
          _footer_patch->redraw();
          _footer_patch->body(buttons);
!         _footer_patch->reallocate();
      }
      page = max(0, page);
      page = min(page_count-1, page);
--- 835,846 ----
          }
          comp->repair();
          buttons->append(comp);
+         buttons->append(new HGlue());
          _footer_patch->redraw();
          _footer_patch->body(buttons);
!         _body_patch->change(1);
!         _top->change(1);
!         _top->reallocate();
      }
      page = max(0, page);
      page = min(page_count-1, page);
*** iv/src/bin/doc/Document.c.beta	Sun Apr 14 21:51:25 1991
--- iv/src/bin/doc/Document.c	        Fri May 10 10:59:08 1991
***************
*** 1057,1082 ****
  ) {
      int c;
      RowSeparator rsep = RowSeparatorOff;
      if ((c = in.get()) == '{') {
          int column = 0;
          while ((c = in.get()) != '}') {
              if (c == 'l') {
                  tabular->insert_column(column, "", ColumnAlignLeft);
                  ++column;
              } else if (c == 'c') {
                  tabular->insert_column(column, "", ColumnAlignCenter);
                  ++column;
              } else if (c == 'r') {
                  tabular->insert_column(column, "", ColumnAlignRight);
                  ++column;
              } else if (c == '|') {
!                 tabular->change_column_separator(
!                     column, ColumnSeparatorSingle
!                 );
              }
          }
          while ((c = in.get()) == '\n') { }
          in.putback(c);
      } else {
          tabular->change_row_separator(0, RowSeparatorSingle);
          tabular->insert_column(0, "", ColumnAlignLeft);
--- 1057,1088 ----
  ) {
      int c;
      RowSeparator rsep = RowSeparatorOff;
+     ColumnSeparator csep = ColumnSeparatorOff;
      if ((c = in.get()) == '{') {
          int column = 0;
          while ((c = in.get()) != '}') {
              if (c == 'l') {
                  tabular->insert_column(column, "", ColumnAlignLeft);
+                 tabular->change_column_separator(column, csep);
                  ++column;
+                 csep = ColumnSeparatorOff;
              } else if (c == 'c') {
                  tabular->insert_column(column, "", ColumnAlignCenter);
+                 tabular->change_column_separator(column, csep);
                  ++column;
+                 csep = ColumnSeparatorOff;
              } else if (c == 'r') {
                  tabular->insert_column(column, "", ColumnAlignRight);
+                 tabular->change_column_separator(column, csep);
                  ++column;
+                 csep = ColumnSeparatorOff;
              } else if (c == '|') {
!                 csep = ColumnSeparatorSingle;
              }
          }
          while ((c = in.get()) == '\n') { }
          in.putback(c);
+         tabular->change_column_separator(column, csep);
      } else {
          tabular->change_row_separator(0, RowSeparatorSingle);
          tabular->insert_column(0, "", ColumnAlignLeft);
*** iv/src/bin/doc/IdrawImage.c.beta	Thu Apr 11 23:21:20 1991
--- iv/src/bin/doc/IdrawImage.c	        Fri May 10 11:14:05 1991
***************
*** 44,49 ****
--- 44,50 ----
  #include <InterViews/world.h>
  
  #include <string.h>
+ #include <ctype.h>
  
  static boolean _idraw_font_metrics;
  
***************
*** 450,455 ****
--- 451,461 ----
                  } else if (c != ')' && c != '(') {
                      if (c == '\\') {
                          c = getc(file);
+                         if (isdigit(c)) {
+                             c = c - '0';
+                             c = (c * 8) + getc(file) - '0';
+                             c = (c * 8) + getc(file) - '0';
+                         }
                      }
                      line->append(new Character(c, f, fg));
                  }
--
Paul Calder
Computer Systems Lab
Stanford University
calder@lurch.stanford.edu