home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / tvision / newed / nedemo.pas < prev    next >
Pascal/Delphi Source File  |  1993-10-30  |  71KB  |  2,129 lines

  1. { FILE:  nedemo.pas }
  2.  
  3.  
  4.  
  5. program EditDemo;
  6.  
  7.  
  8.  
  9. { -------------------------------------------------------------------- }
  10. {                                                                      }
  11. {                                                                      }
  12. { NEDEMO.PAS is loosly based on the Borland TVEDIT program.            }
  13. { Therefore, as with NEWEDIT, all copyrights apply.  However,          }
  14. { I've freely "included" code from other CIS BPASCAL contributers,     }
  15. { and have made every attempt to give credit where it is due.          }
  16. {                                                                      }
  17. { This file contains the driver code for the NEWEDIT unit.  The        }
  18. { driver is NOT necessary to use NEWEDIT.  You can plug NEWEDIT        }
  19. { into your application or Borland's TVEDIT demo if you like.          }
  20. { Please read the NEWEDIT.DOC file for further information on          }
  21. { how to use NEWEDIT with other programs.                              }
  22. {                                                                      }
  23. { You should NOT place anything in here that does not have to do       }
  24. { with menus, the status line, the video screen, or the desktop.       }
  25. {                                                                      }
  26. { NEDEMO.PAS shows various techniques to modify the screen size,       }
  27. { keep the GADGETS heap view under control when switching screen       }
  28. { sizes, load and store the desktop, modifying the status line to      }
  29. { change when certain keys are pressed, and a quick and dirty method   }
  30. { of setting your own palette colors.                                  }
  31. {                                                                      }
  32. { Each of these techniques is clearly marked by a "label."  If you     }
  33. { are interested in a particular technique, search for one of the      }
  34. { labels listed below to see the applicable code.                      }
  35. {                                                                      }
  36. { Label    Description:                                                }
  37. { ------   ------------                                                }
  38. {                                                                      }
  39. { COLORS  - A quick and dirty method to modify the TV palette.         }
  40. {                                                                      }
  41. { DESKTOP - Methods for loading and storing the desktop                }
  42. {           automatically.                                             }
  43. {                                                                      }
  44. { MEMWIN  - How to keep the memory indicator view positioned properly. }
  45. {                                                                      }
  46. { SCRNSZ  - Method for switching between normal and 43/50 lines.       }
  47. {                                                                      }
  48. { SPLCHK  - Shows how to close an edit window to process a file        }
  49. {           (such as spell checking) and reopen the window when done.  }
  50. {                                                                      }
  51. { STATLN  - Method for modifying the status line.                      }
  52. {                                                                      }
  53. { Al Andersen - 10/31/93.                                              }
  54. {                                                                      }
  55. { -------------------------------------------------------------------- }
  56.  
  57.  
  58. {$F+,X+,S-,D-}
  59. {$M 16384,8192,655360}
  60.  
  61.  
  62.  
  63. { -------------------------------------------------------------------------- }
  64. {                                                                            }
  65. {                        UNITS REQUIRED BY APPLICATION                       }
  66. {                                                                            }
  67. { -------------------------------------------------------------------------- }
  68.  
  69.  
  70. uses
  71.  
  72.   Dos,
  73.   Objects,
  74.   Drivers,
  75.   Memory,
  76.   Views,
  77.   Menus,
  78.   Dialogs,
  79.   StdDlg,
  80.   MsgBox,
  81.   App,
  82.   HelpFile,
  83.   Gadgets,
  84.   CmdFile,      { Add CmdFile, EditPkg, and NewEdit. }
  85.   EditPkg,
  86.   NewEdit;
  87.  
  88.  
  89.  
  90. { -------------------------------------------------------------------------- }
  91. {                                                                            }
  92. {              GLOBAL OBJECT, VARIABLE, CONSTANT DECLARATIONS                }
  93. {                                                                            }
  94. { -------------------------------------------------------------------------- }
  95.  
  96.  
  97.  
  98.   { ------------------------------------------------ }
  99.   {                                                  }
  100.   { Define object for application called T_EditDemo. }
  101.   { Override and/or add methods to utilize object.   }
  102.   {                                                  }
  103.   { ------------------------------------------------ }
  104.  
  105.  
  106. TYPE
  107.  
  108.   P_EditDemo = ^T_EditDemo;
  109.   T_EditDemo = object (App.TApplication)
  110.  
  111.     { MEMWIN - Start. }
  112.  
  113.     Memory_Indicator : PHeapView;
  114.  
  115.     { MEMWIN - Stop. } { For heap display on satus line. }
  116.  
  117.     constructor Init;
  118.     destructor  Done; virtual;
  119.  
  120.     { DESKTOP - Start. }
  121.  
  122.     procedure   DesktopReadViews (VAR S : TStream);
  123.     procedure   DesktopWriteViews (VAR S : TStream);
  124.  
  125.     { DESKTOP - Stop. } { Methods to read and write the desktop file. }
  126.  
  127.     { COLORS  - Start. }
  128.  
  129.     function    GetPalette : Views.PPalette; virtual;
  130.  
  131.     { COLORS - Stop. } { Method to replace the current palette with our palette. }
  132.  
  133.     procedure   GetEvent (var Event : Drivers.TEvent); virtual;
  134.     procedure   HandleEvent (var Event : Drivers.TEvent); virtual;
  135.     procedure   Idle; virtual;
  136.     procedure   InitMenuBar; virtual;
  137.     procedure   InitStatusLine; virtual;
  138.  
  139.     { MEMWIN  - Start. }
  140.  
  141.     function    Insert_Memory_Indicator : Boolean;
  142.  
  143.     { MEMWIN  - Stop. } { Method to put heap memory view on status line. }
  144.  
  145.     { DESKTOP - Start. }
  146.  
  147.     function    Load_Desktop : Boolean;
  148.  
  149.     { DESKTOP - Stop. } { Method to read desktop off the disk. }
  150.  
  151.     procedure   OutOfMemory; virtual;
  152.  
  153.     { DESKTOP - Start. }
  154.  
  155.     function    Save_Desktop : Boolean;
  156.  
  157.     { DESKTOP - Stop. } { Method to write the desktop to the disk. }
  158.  
  159.     { SCRNSZ  - Start. }
  160.  
  161.     procedure   Toggle_Video_Mode;
  162.  
  163.     { SCRNSZ  - Stop. } { Method to toggle between normal and 43/50 line mode. }
  164.  
  165.   end;
  166.  
  167.  
  168.  
  169.   { --------------------------------------------------------------- }
  170.   {                                                                 }
  171.   { Define object to display what menu items do on the status line. }
  172.   {                                                                 }
  173.   { --------------------------------------------------------------- }
  174.  
  175.  
  176.   { STATLN - Start. }
  177.  
  178.   P_Status_Line_Help  = ^T_Status_Line_Help;
  179.   T_Status_Line_Help  = object (Menus.TStatusLine)
  180.     function Hint (AHelpCtx : Word): String; virtual;
  181.   end;
  182.  
  183.   { STATLN - Stop. } { Object and method to print help on status line. }
  184.  
  185.  
  186.  
  187.   { ----------------------------------------------------- }
  188.   {                                                       }
  189.   { I don't even like the default colors, so I'm creating }
  190.   { a brand new, customized application COLOR palette.    }
  191.   { The monochrome and black-and-white palettes remain    }
  192.   { untouched.                                            }
  193.   {                                                       }
  194.   { ----------------------------------------------------- }
  195.  
  196.  
  197. CONST
  198.  
  199.   { COLORS - Start }
  200.  
  201.   New_Colors      = { 0   1   2   3   4   5   6   7   8   9 }
  202.  
  203.                         #$17#$70#$78#$74#$1F#$47#$1E#$17#$1F +
  204.                     #$1A#$17#$4F#$1E#$71#$00#$30#$3F#$3A#$13 +
  205.                     #$13#$3E#$21#$00#$70#$7F#$7A#$13#$13#$70 +
  206.                     #$1F#$00#$70#$7F#$7A#$17#$1F#$70#$70#$7E +
  207.                     #$74#$60#$6B#$6F#$67#$6E#$70#$30#$3F#$3E +
  208.                     #$1F#$30#$1A#$5F#$75#$17#$5F#$30#$2F#$2F +
  209.                     #$31#$2F#$00#$00#$17#$1F#$1A#$71#$71#$1E +
  210.                     #$17#$1F#$1E#$20#$2B#$2F#$78#$2E#$10#$30 +
  211.                     #$3F#$3E#$70#$2F#$7A#$20#$12#$31#$31#$30 +
  212.                     #$2F#$3E#$31#$13#$38#$00#$37#$3F#$3A#$13 +
  213.                     #$13#$3E#$30#$3F#$3E#$20#$2B#$2F#$78#$2E +
  214.                     #$30#$70#$7F#$7E#$1F#$2F#$1A#$20#$32#$31 +
  215.                     #$71#$70#$2F#$7E#$71#$13#$38#$00;
  216.  
  217.   { COLORS - Stop } { Custom application palatte. }
  218.  
  219.  
  220.  
  221.   { ------------------------------------------ }
  222.   {                                            }
  223.   { Define any other global constants we need. }
  224.   {                                            }
  225.   { ------------------------------------------ }
  226.  
  227.  
  228. CONST { Command constants. }
  229.  
  230.   { DESKTOP - Start. }
  231.  
  232.   Desktop_Name     : string = 'NEDEMO.DSK';
  233.  
  234.   { DESKTOP - Stop. } { Default name for the desktop disk file. }
  235.  
  236.   Application_Name = 'NEDEMO'; { Application filename required for help. }
  237.  
  238.  
  239. VAR
  240.  
  241.   { SCRNSZ - Start. }
  242.  
  243.   Current_Screen_Mode : Word;
  244.  
  245.   { SCRNSZ - Stop. } { Desktop variable to keep track of current screen mode. }
  246.  
  247.  
  248.  
  249. { -------------------------------------------------------------------------- }
  250. {                                                                            }
  251. {                           PROCEDURES AND FUNCTIONS                         }
  252. {                                                                            }
  253. { -------------------------------------------------------------------------- }
  254.  
  255.  
  256.  
  257. { STATLN - Start. }
  258.  
  259. procedure Change_Status_Line;
  260.  
  261.  
  262.   { -------------------------------------------------- }
  263.   {                                                    }
  264.   { This procedure changes the state of the status bar }
  265.   { when the user presses Shift, Alt, and Ctrl keys.   }
  266.   {                                                    }
  267.   { Note the following values:                         }
  268.   {                                                    }
  269.   {    $80 - Ins Active                                }
  270.   {    $40 - Caps Lock Active                          }
  271.   {    $20 - Num Lock Active                           }
  272.   {    $10 - Scroll Lock Active                        }
  273.   {    $08 - Alt Depressed                             }
  274.   {    $04 - Ctrl Depressed                            }
  275.   {    $02 - Left Shift Depressed                      }
  276.   {    $01 - Right Shift Depressed                     }
  277.   {                                                    }
  278.   { -------------------------------------------------- }
  279.  
  280.  
  281.   procedure Set_Context;
  282.  
  283.   VAR
  284.  
  285.     KbdWord : Word absolute $0040:$0017;    { Memory location of scancode. }
  286.  
  287.   begin
  288.  
  289.     if KbdWord and $01 <> 0 then
  290.       Desktop^.HelpCtx := CmdFile.hckbShift else              { RightShift }
  291.  
  292.     if KbdWord and $02 <> 0 then
  293.       Desktop^.HelpCtx := CmdFile.hckbShift else              { LeftShift  }
  294.  
  295.     if KbdWord and $04 <> 0 then
  296.       Desktop^.HelpCtx := CmdFile.hckbCtrl else               { Ctrl       }
  297.  
  298.     if KbdWord and $08 <> 0 then
  299.       Desktop^.HelpCtx := CmdFile.hckbAlt else                { Alt        }
  300.  
  301.     Desktop^.HelpCtx := Views.hcNoContext;
  302.  
  303.   end; { Set_Context }
  304.  
  305.  
  306.  
  307. begin { Change_Status_Line }
  308.  
  309.    case Desktop^.HelpCtx of
  310.  
  311.      Views.hcNoContext,
  312.      CmdFile.hckbShift,
  313.      CmdFile.hckbAlt,
  314.      CmdFile.hckbCtrl    : Set_Context;
  315.  
  316.    end;
  317.  
  318. end; { Change_Status_Line }
  319.  
  320. { STATLN - Stop. } { Procedure responsible placing Shift, Alt, Ctrl stats. }
  321.  
  322.  
  323.  
  324. { -------------------------------------------------------------------------- }
  325.  
  326.  
  327.  
  328. function ExecDialog (P : PDialog; Data : Pointer) : Word;
  329.  
  330.  
  331.   { ------------------------------------------------------------- }
  332.   {                                                               }
  333.   { This function handles any dialog box requests you might have. }
  334.   {                                                               }
  335.   { ------------------------------------------------------------- }
  336.  
  337.  
  338. VAR
  339.  
  340.   Result : Word;  { Holds result of last dialog box event. }
  341.  
  342. begin
  343.  
  344.   ExecDialog := Views.cmCancel;
  345.   Result := Views.cmCancel;
  346.  
  347.   P := PDialog (App.Application^.ValidView (P));
  348.  
  349.  
  350.  
  351.   { ------------------------------------------------ }
  352.   {                                                  }
  353.   { If we can't find the dialog box code (programmer }
  354.   { forgot it) tell the user that it is missing.     }
  355.   {                                                  }
  356.   { ------------------------------------------------ }
  357.  
  358.  
  359.   if P = nil then
  360.     begin
  361.       MsgBox.MessageBox (^C'Dialog is missing!', nil,
  362.                          MsgBox.mfError + MsgBox.mfOkButton);
  363.       Exit;
  364.     end;
  365.  
  366.  
  367.  
  368.   { --------------------------------------------------------- }
  369.   {                                                           }
  370.   { If you have a data record for the dialog box, pass it     }
  371.   { to the dialog.  Put the dialog on the desktop and store   }
  372.   { the last event result.  If the result indicates the user  }
  373.   { did NOT cancel the dialog AND the user entered data,      }
  374.   { get the data back from the dialog so the caller has       }
  375.   { access to it.                                             }
  376.   {                                                           }
  377.   { --------------------------------------------------------- }
  378.  
  379.  
  380.   if Data <> nil then
  381.     P^.SetData (Data^);
  382.  
  383.   Result := DeskTop^.ExecView (P);
  384.  
  385.   if (Result <> cmCancel) and (Data <> nil) then
  386.     P^.GetData (Data^);
  387.  
  388.  
  389.  
  390.   { -------------------------------------------------------------- }
  391.   {                                                                }
  392.   { Dispose of the dialog and return the last event to the caller. }
  393.   {                                                                }
  394.   { -------------------------------------------------------------- }
  395.  
  396.  
  397.   Dispose (P, Done);
  398.  
  399.   ExecDialog := Result;
  400.  
  401.  
  402. end; { ExecDialog }
  403.  
  404.  
  405.  
  406. { -------------------------------------------------------------------------- }
  407.  
  408.  
  409.  
  410. { STATLN - Start. }
  411.  
  412. function T_Status_Line_Help.Hint (AHelpCtx : Word): String;
  413.  
  414.  
  415.   { -------------------------------------------- }
  416.   {                                              }
  417.   { This function puts a hint on the status line }
  418.   { as to what a menu option is supposed to do.  }
  419.   { Hints are arranged in order by menu.         }
  420.   {                                              }
  421.   { -------------------------------------------- }
  422.  
  423.  
  424. begin
  425.  
  426.   case AHelpCtx of
  427.  
  428.     CmdFile.hcFile_Menu      : Hint := 'This menu contains file and DOS features.';
  429.     CmdFile.hcOpen           : Hint := 'Open a file for editing.';
  430.     CmdFile.hcNew            : Hint := 'Create a new file for editing.';
  431.     CmdFile.hcSave           : Hint := 'Save current file and continue editing.';
  432.     CmdFile.hcSaveDone       : Hint := 'Save current file and close window.';
  433.     CmdFile.hcSaveAs         : Hint := 'Save current file to a different file name.';
  434.     CmdFile.hcChangeDir      : Hint := 'Change to another directory.';
  435.     CmdFile.hcShellToDos     : Hint := 'Drop into MS-DOS command shell.';
  436.     CmdFile.hcExit           : Hint := 'Exit application and return to MS-DOS.';
  437.  
  438.     CmdFile.hcEdit_Menu      : Hint := 'This menu contains cut and paste features.';
  439.     CmdFile.hcUndo           : Hint := 'Undo last non-wordwrap operation.';
  440.     CmdFile.hcCopy           : Hint := 'Copy selected text into clipboard.';
  441.     CmdFile.hcCut            : Hint := 'Delete selected text and put into clipboard.';
  442.     CmdFile.hcPaste          : Hint := 'Paste clipboard contents into document.';
  443.     CmdFile.hcClipboard      : Hint := 'View the contents of the clipboard.';
  444.     CmdFile.hcClear          : Hint := 'Delete selected text, do NOT put in clipboard.';
  445.     CmdFIle.hcSpellCheck     : Hint := 'Run spelling check on current document.';
  446.  
  447.     CmdFile.hcSearch_Menu    : Hint := 'This menu contains find and replace features.';
  448.     CmdFile.hcFind           : Hint := 'Find particular text.';
  449.     CmdFile.hcReplace        : Hint := 'Find text and replace it with new text.';
  450.     CmdFile.hcAgain          : Hint := 'Repeat last FIND or SEARCH operation.';
  451.  
  452.     CmdFile.hcWindows_Menu   : Hint := 'This menu contains windowing features.';
  453.     CmdFile.hcResize         : Hint := 'Change current window size and/or position.';
  454.     CmdFile.hcZoom           : Hint := 'Toggle current window to full/normal size.';
  455.     CmdFile.hcNext           : Hint := 'Go to next window.';
  456.     CmdFIle.hcPrev           : Hint := 'Go to previous window.';
  457.     CmdFile.hcClose          : Hint := 'Close current window.';
  458.     CmdFile.hcTile           : Hint := 'Arrange desktop windows into tile pattern.';
  459.     CmdFile.hcCascade        : Hint := 'Arrange desktop windows into cascade pattern.';
  460.  
  461.     CmdFile.hcDesktop_Menu   : Hint := 'This menu contains Desktop/Video options.';
  462.     CmdFile.hcLoadDesktop    : Hint := 'Load contents of previous desktop.';
  463.     CmdFile.hcSaveDesktop    : Hint := 'Save contents of current desktop.';
  464.     CmdFile.hcToggleVideo    : Hint := ' Toggle between 25 and 43/50 line screen.';
  465.  
  466.     CmdFile.hckbAlt          : Hint := '[ALT] KEY';
  467.     CmdFile.hckbCtrl         : Hint := '[CTRL] KEY';
  468.     CmdFile.hckbShift        : Hint := '[SHIFT] KEY';
  469.  
  470.     Views.hcDragging         : Hint := 'RESIZE VIEW';
  471.     $FFFF                    : Hint := 'HELP MODE';
  472.  
  473.    else
  474.      Hint := '';
  475.    end;
  476.  
  477.  
  478. end; { T_Status_Line.Hint }
  479.  
  480. { STATLN - Stop. } { Function responsible for putting menu help on status line. }
  481.  
  482.  
  483.  
  484. { -------------------------------------------------------------------------- }
  485.  
  486.  
  487.  
  488. constructor T_EditDemo.Init;
  489.  
  490.  
  491.   { --------------------------------------------------------------------- }
  492.   {                                                                       }
  493.   { This constructor registers all associated TPU's, initializes buffers, }
  494.   { and sets up any unique processes for the application.                 }
  495.   {                                                                       }
  496.   { --------------------------------------------------------------------- }
  497.  
  498.  
  499. VAR
  500.  
  501.   Counter     : Integer;                { General purpose index counter.    }
  502.   Event       : Drivers.TEvent;         { Object to push onto event queue.  }
  503.   File_Name   : DOS.PathStr;            { String to hold default file name. }
  504.  
  505. begin
  506.  
  507.  
  508.  
  509.   { ---------------------------------------------- }
  510.   {                                                }
  511.   { System.File mode controls open but not create. }
  512.   { Do a fixup so networks don't run into hassles. }
  513.   {                                                }
  514.   { ---------------------------------------------- }
  515.  
  516.  
  517.   if Lo (DosVersion) >= 3 then
  518.     System.FileMode := $20        { OPEN Read_Only + Deny_Write }
  519.   else
  520.     System.FileMode := $0;        { ATTR:  Read_Only            }
  521.  
  522.  
  523.  
  524.   { ---------------------------------------- }
  525.   {                                          }
  526.   { Allocate a buffer for use by the editor. }
  527.   { Call ancestor Init constructor and then  }
  528.   { register all required object streams.    }
  529.   {                                          }
  530.   { ---------------------------------------- }
  531.  
  532.  
  533.   EditPkg.Initialize_The_Editor;
  534.  
  535.   App.TApplication.Init;
  536.  
  537.    Objects.RegisterObjects;
  538.      Views.RegisterViews;
  539.      Menus.RegisterMenus;
  540.    Dialogs.RegisterDialogs;
  541.        App.RegisterApp;
  542.   Helpfile.RegisterHelpFile;
  543.    NewEdit.RegisterEditors;
  544.  
  545.  
  546.  
  547.   { ------------------------------------------------- }
  548.   {                                                   }
  549.   { The GADGETS heap view is a handy little critter,  }
  550.   { especially for ensuring we allocate/deallocate    }
  551.   { objects correctly.  So I included it.  Initialize }
  552.   { it, and load a previous desktop, if any.          }
  553.   {                                                   }
  554.   { ------------------------------------------------- }
  555.  
  556.  
  557.   { MEMWIN  - Start. }
  558.  
  559.   Insert_Memory_Indicator;
  560.  
  561.   { MEMWIN  - Stop. } { Insert heap view window on status line. }
  562.  
  563.   { SCRNSZ - Start. }
  564.  
  565.   Current_Screen_Mode := Drivers.ScreenMode;
  566.  
  567.   { SCRNSZ - Start. }
  568.  
  569.  
  570.  
  571.   { ---------------------------------------------- }
  572.   {                                                }
  573.   { Disable commands that are of no immediate use. }
  574.   { Note that not all of these are necessary, for  }
  575.   { you can change the menus to suit your tastes.  }
  576.   { I have commented out all those not used here.  }
  577.   {                                                }
  578.   { ---------------------------------------------- }
  579.  
  580.  
  581.   DisableCommands ([Views.cmCascade,
  582.                     Views.cmClear,
  583.                     Views.cmCopy,
  584.                     Views.cmCut,
  585.                     Views.cmPaste,
  586.                     Views.cmTile,
  587.                     Views.cmUndo,
  588.                     NewEdit.cmFind,
  589.                     NewEdit.cmReplace,
  590.                     NewEdit.cmSave,
  591.                     NewEdit.cmSaveAs,
  592.                     NewEdit.cmSaveDone,
  593.                     NewEdit.cmSearchAgain]);
  594.  
  595.                     { NewEdit.cmCenterText,  }
  596.                     { NewEdit.cmIndentMode,  }
  597.                     { NewEdit.cmJumpLine,    }
  598.                     { NewEdit.cmJumpMark1,   }
  599.                     { NewEdit.cmJumpMark1,   }
  600.                     { NewEdit.cmJumpMark2,   }
  601.                     { NewEdit.cmJumpMark3,   }
  602.                     { NewEdit.cmJumpMark4,   }
  603.                     { NewEdit.cmJumpMark5,   }
  604.                     { NewEdit.cmJumpMark6,   }
  605.                     { NewEdit.cmJumpMark7,   }
  606.                     { NewEdit.cmJumpMark8,   }
  607.                     { NewEdit.cmJumpMark9,   }
  608.                     { NewEdit.cmJumpMark0,   }
  609.                     { NewEdit.cmReformDoc,   }
  610.                     { NewEdit.cmReformPara,  }
  611.                     { NewEdit.cmRightMargin, }
  612.                     { NewEdit.cmSetMark1,    }
  613.                     { NewEdit.cmSetMark1,    }
  614.                     { NewEdit.cmSetMark2,    }
  615.                     { NewEdit.cmSetMark3,    }
  616.                     { NewEdit.cmSetMark4,    }
  617.                     { NewEdit.cmSetMark5,    }
  618.                     { NewEdit.cmSetMark6,    }
  619.                     { NewEdit.cmSetMark7,    }
  620.                     { NewEdit.cmSetMark8,    }
  621.                     { NewEdit.cmSetMark9,    }
  622.                     { NewEdit.cmSetMark0,    }
  623.                     { NewEdit.cmSetTabs,     }
  624.                     { NewEdit.cmWordWrap]);  }
  625.  
  626.   { DESKTOP - Start. }
  627.  
  628.   Load_Desktop;
  629.  
  630.   { DESKTOP - Stop. } { Load previous desktop, if any. }
  631.  
  632.  
  633.  
  634.   { ---------------------------------------- }
  635.   {                                          }
  636.   { We need to disable the 43/50 column mode }
  637.   { if the video card doesn't support it.    }
  638.   {                                          }
  639.   { ---------------------------------------- }
  640.  
  641.  
  642.   { SCRNSZ - Start. }
  643.  
  644.   if Drivers.HiresScreen = False then
  645.     DisableCommands ([CmdFile.cmToggleVideo]);
  646.  
  647.   { SCRNSZ - Stop. }
  648.  
  649.  
  650.  
  651.   { ------------------------------------------------- }
  652.   {                                                   }
  653.   { Call the EDITPKG unit to intialize the clipboard. }
  654.   {                                                   }
  655.   { ------------------------------------------------- }
  656.  
  657.  
  658.   EditPkg.Initialize_The_Clipboard;
  659.  
  660.  
  661.  
  662.   { -------------------------------------------------------- }
  663.   {                                                          }
  664.   { We allow the user to pass a file name parameter from DOS }
  665.   { when running the program.  If a parameter was passed in  }
  666.   { call the editor to open an edit window for the file.     }
  667.   {                                                          }
  668.   { -------------------------------------------------------- }
  669.  
  670.  
  671.   for Counter := 1 to ParamCount do
  672.     if (pos ('*', ParamStr (Counter)) = 0) and (pos ('?', ParamStr (Counter)) = 0) then
  673.       EditPkg.Open_Editor (ParamStr (Counter), TRUE);
  674.  
  675.  
  676.  
  677.   { ------------------------------------------------------------ }
  678.   {                                                              }
  679.   { The desktop is ready, so now a brief word from your sponsor. }
  680.   { Push cmAbout event on the event queue so the About box       }
  681.   { will appear when we first run the application.               }
  682.   {                                                              }
  683.   { ------------------------------------------------------------ }
  684.  
  685.  
  686.   Event.What := Drivers.evCommand;
  687.   Event.command := CmdFile.cmAbout;
  688.   PutEvent (Event);
  689.  
  690.  
  691. end; { T_EditDemo.Init }
  692.  
  693.  
  694.  
  695. { -------------------------------------------------------------------------- }
  696.  
  697.  
  698.  
  699. destructor T_EditDemo.Done;
  700.  
  701.  
  702.   { --------------------------------------------------------------------- }
  703.   {                                                                       }
  704.   { This destructor deallocates any unique processes for the application. }
  705.   { Currently it saves the current desktop, calls the ancestor done       }
  706.   { method, and then deallocates any buffers set up by the editor.        }
  707.   {                                                                       }
  708.   { --------------------------------------------------------------------- }
  709.  
  710.  
  711. begin
  712.  
  713.   Save_Desktop;
  714.   App.TApplication.Done;
  715.   EditPkg.Deallocate_The_Editor;
  716.  
  717.  
  718. end; { T_EditDemo.Done }
  719.  
  720.  
  721.  
  722. { -------------------------------------------------------------------------- }
  723.  
  724.  
  725.  
  726. { DESKTOP - Start. }
  727.  
  728. procedure T_EditDemo.DesktopReadViews (VAR S : TStream);
  729.  
  730.  
  731.   { ------------------------------------------- }
  732.   {                                             }
  733.   { This procedure closes all desktop views     }
  734.   { and then reads in each view from a previous }
  735.   { desktop, putting it on the current desktop. }
  736.   {                                             }
  737.   { ------------------------------------------- }
  738.  
  739.  
  740. VAR
  741.  
  742.   P : Views.PView;    { Pointer to each of the desktop views. }
  743.  
  744.  
  745.  
  746.   { -------------------------------------------------------------------------- }
  747.  
  748.  
  749.  
  750.   procedure Command_All (Command_Constant : Word );
  751.  
  752.     procedure Action (P : Views.PView); far;
  753.  
  754.     begin
  755.  
  756.       Message (P, evCommand, Command_Constant, nil);
  757.  
  758.     end; { Action }
  759.  
  760.   begin { Command_All }
  761.  
  762.      Desktop^.ForEach (@Action);
  763.  
  764.   end; { Command_All }
  765.  
  766.  
  767.  
  768.   { -------------------------------------------------------------------------- }
  769.  
  770.  
  771.  
  772.   procedure Close_All_Views;
  773.  
  774.   begin
  775.  
  776.      Command_All (cmClose);
  777.  
  778.   end; { Close_All_Views }
  779.  
  780.  
  781.  
  782.   { -------------------------------------------------------------------------- }
  783.  
  784.  
  785.  
  786. begin { DesktopReadViews }
  787.  
  788.  
  789.  
  790.   { ----------------------------------------------------- }
  791.   {                                                       }
  792.   { If we don't have a valid desktop, forget it and exit. }
  793.   { Otherwise, close all current views on the desktop.    }
  794.   {                                                       }
  795.   { ----------------------------------------------------- }
  796.  
  797.  
  798.   if not Desktop^.Valid (Views.cmClose) then
  799.     Exit;
  800.  
  801.   Close_All_Views;
  802.  
  803.  
  804.  
  805.   { -------------------------------------------------------- }
  806.   {                                                          }
  807.   { The first item in any previous desktop that was saved is }
  808.   { the Current_Screen_Mode.  Get it and determine if it was }
  809.   { 43/50 line mode.  If so, toggle the screen to that mode. }
  810.   {                                                          }
  811.   { -------------------------------------------------------- }
  812.  
  813.  
  814.   S.Read (Current_Screen_Mode, SizeOf (Current_Screen_Mode));
  815.  
  816.   if (Current_Screen_Mode <> Drivers.ScreenMode) then
  817.     Toggle_Video_Mode;
  818.  
  819.  
  820.  
  821.   { ----------------------------------------------- }
  822.   {                                                 }
  823.   { Now read in each view from the previous desktop }
  824.   { and insert it on our desktop.  Exit when there  }
  825.   { are no more views to read in.                   }
  826.   {                                                 }
  827.   { ----------------------------------------------- }
  828.  
  829.  
  830.   while True do
  831.     begin
  832.  
  833.       P := Views.PView (S.Get);
  834.  
  835.       Desktop^.InsertBefore (App.Application^.ValidView (P), Desktop^.Last);
  836.  
  837.       if P = nil then
  838.         Exit;
  839.  
  840.     end;
  841.  
  842.  
  843. end; { T_EditDemo.DesktopReadViews }
  844.  
  845. { DESKTOP - Stop. } { Procedure responsible for actually reading desktop file. }
  846.  
  847.  
  848.  
  849. { -------------------------------------------------------------------------- }
  850.  
  851.  
  852.  
  853. { DESKTOP - Start. }
  854.  
  855. procedure T_EditDemo.DesktopWriteViews (VAR S : TStream);
  856.  
  857.  
  858.   { ----------------------------------------------- }
  859.   {                                                 }
  860.   { This procedure writes all current desktop views }
  861.   { and and the Current_Screen_Mode to the disk.    }
  862.   {                                                 }
  863.   { ----------------------------------------------- }
  864.  
  865.  
  866. VAR
  867.  
  868.   P : Views.PView;    { Pointer to each of the desktop views. }
  869.  
  870.  
  871.  
  872.   { -------------------------------------------------------------------------- }
  873.  
  874.  
  875.  
  876.   procedure WriteView (P : PView); far;
  877.  
  878.     { ----------------------------------------------------------- }
  879.     {                                                             }
  880.     { A local procedure that actually puts all the views to disk. }
  881.     {                                                             }
  882.     { ----------------------------------------------------------- }
  883.  
  884.   begin
  885.  
  886.     if P <> Desktop^.Last then
  887.        S.Put (P);
  888.  
  889.   end; { WriteView }
  890.  
  891.  
  892.  
  893.   { -------------------------------------------------------------------------- }
  894.  
  895.  
  896.  
  897. begin { DesktopWriteViews }
  898.  
  899.  
  900.  
  901.   { ------------------------------------------------------------------------ }
  902.   {                                                                          }
  903.   { First write the Current_Screen_Mode to disk, and then each desktop view. }
  904.   {                                                                          }
  905.   { ------------------------------------------------------------------------ }
  906.  
  907.  
  908.   S.Write (Current_Screen_Mode, SizeOf (Current_Screen_Mode));
  909.  
  910.   Desktop^.ForEach (@WriteView);
  911.   S.Put (nil);
  912.  
  913.  
  914. end; { T_EditDemo.DesktopWriteViews }
  915.  
  916. { DESKTOP - Stop. } { Procedure responsible for actually writing desktop file. }
  917.  
  918.  
  919.  
  920. { ------------------------------------------------------------------------ }
  921.  
  922.  
  923.  
  924. procedure T_EditDemo.GetEvent (var Event : Drivers.TEvent);
  925.  
  926.  
  927.   { ---------------------------------------- }
  928.   {                                          }
  929.   { This procedure intercepts system events, }
  930.   { constantly looking to see if help has    }
  931.   { been requested.                          }
  932.   {                                          }
  933.   { ---------------------------------------- }
  934.  
  935.  
  936. VAR
  937.  
  938.   File_Mode   : Word;                   { Used for networking access.        }
  939.   Help_Stream : Objects.PDosStream;     { DOS stream to place help file on.  }
  940.   Help_File   : HelpFile.PHelpFile;     { Name of the help file.             }
  941.   W           : Views.PWindow;          { Help file window.                  }
  942.  
  943.  
  944. CONST
  945.  
  946.   Help_In_Use : Boolean = False; { Prevents user from opening more than 1 help file. }
  947.  
  948.  
  949.  
  950.   { -------------------------------------------------------------------------- }
  951.  
  952.  
  953.  
  954.   function Calc_Help_Name : DOS.PathStr;
  955.  
  956.  
  957.     { ------------------------------------------------ }
  958.     {                                                  }
  959.     { This function calculates what the help file name }
  960.     { is, based on the application name being run.     }
  961.     {                                                  }
  962.     { ------------------------------------------------ }
  963.  
  964.  
  965.   VAR
  966.  
  967.     Directory      : DOS.DirStr;        { Home directory of the application. }
  968.     EXE_File       : DOS.PathStr;       { Name of the EDITDEMO.EXE file.     }
  969.     File_Extension : DOS.ExtStr;        { The file name extension.           }
  970.     File_Name      : DOS.NameStr;       { The file name minus the extension. }
  971.  
  972.  
  973.   begin
  974.  
  975.  
  976.     { -------------------------------------------------------- }
  977.     {                                                          }
  978.     { Check for the DOS version.  If it is >= 3 the file name  }
  979.     { is in parameter #0 of the arguments passed into program. }
  980.     { Otherwise, we have to search for the file in the PATH.   }
  981.     {                                                          }
  982.     { -------------------------------------------------------- }
  983.  
  984.  
  985.     if Lo (DOS.DosVersion) >= 3 then
  986.       EXE_File := ParamStr (0)
  987.     else
  988.       EXE_File := DOS.FSearch (Application_Name, GetEnv ('PATH'));
  989.  
  990.  
  991.  
  992.     { ---------------------------------------------- }
  993.     {                                                }
  994.     { Split the File_Name into its component parts.  }
  995.     { Search for the help file in current directory. }
  996.     {                                                }
  997.     { ---------------------------------------------- }
  998.  
  999.  
  1000.     DOS.FSplit (EXE_File, Directory, File_Name, File_Extension);
  1001.  
  1002.     if Directory[Length (Directory)] = '\' then
  1003.       Dec (Directory[0]);
  1004.  
  1005.     Calc_Help_Name := DOS.FSearch (Application_Name + '.HLP', Directory);
  1006.  
  1007.   end; { Calc_Help_Name }
  1008.  
  1009.  
  1010.  
  1011.   { -------------------------------------------------------------------------- }
  1012.  
  1013.  
  1014.  
  1015. begin { GetEvent }
  1016.  
  1017.  
  1018.  
  1019.   { -------------------------------------------------------------- }
  1020.   {                                                                }
  1021.   { Get the event and see if 1) it is for help and 2) help is NOT  }
  1022.   { being used.  If true, then allocate a stream and put the help  }
  1023.   { file on it.  Then test if stream opened OK.  If not, tell user }
  1024.   { couldn't open the help file.  Otherwise, open a help view.     }
  1025.   { Clear the event and set Help_In_Use to FALSE before exiting.   }
  1026.   {                                                                }
  1027.   { -------------------------------------------------------------- }
  1028.  
  1029.  
  1030.   App.TApplication.GetEvent (Event);
  1031.  
  1032.   case Event.What of
  1033.     evCommand:
  1034.  
  1035.       if (Event.Command = Views.cmHelp) and not Help_In_Use then
  1036.         begin
  1037.  
  1038.  
  1039.  
  1040.           { ----------------------------------------------------- }
  1041.           {                                                       }
  1042.           { Help requested.  Disallow use of multiple help files. }
  1043.           {                                                       }
  1044.           { ----------------------------------------------------- }
  1045.  
  1046.  
  1047.           Help_In_Use := True;
  1048.  
  1049.  
  1050.  
  1051.           { ----------------------------------------- }
  1052.           {                                           }
  1053.           { Set File_Mode to default to read only.    }
  1054.           { If MS-DOS is 3 or better set to read only }
  1055.           { and deny write privleges.                 }
  1056.           {                                           }
  1057.           { ----------------------------------------- }
  1058.  
  1059.  
  1060.           File_Mode := Objects.stOpenRead;
  1061.  
  1062.           if Lo (DosVersion) >= 3 then
  1063.             File_Mode := $3d20;
  1064.  
  1065.  
  1066.  
  1067.           { -------------------------------------------------------- }
  1068.           {                                                          }
  1069.           { Calculate help file name based on the applications name. }
  1070.           {                                                          }
  1071.           { -------------------------------------------------------- }
  1072.  
  1073.  
  1074.           Help_Stream := New (Objects.PDosStream, Init (Calc_Help_Name, File_Mode));
  1075.           Help_File := New (HelpFile.PHelpFile, Init (Help_Stream));
  1076.  
  1077.  
  1078.  
  1079.           { ------------------------------------------------------------------- }
  1080.           {                                                                     }
  1081.           { Let the user know if there was a problem opening/finding help file. }
  1082.           {                                                                     }
  1083.           { ------------------------------------------------------------------- }
  1084.  
  1085.  
  1086.           if Help_Stream^.Status <> Objects.stOk then
  1087.             begin
  1088.  
  1089.               MsgBox.MessageBox (^C'Could not open help file.',
  1090.                                  nil, MsgBox.mfError + MsgBox.mfOkButton);
  1091.               Dispose (Help_File, Done);
  1092.  
  1093.             end
  1094.  
  1095.           else
  1096.  
  1097.             begin
  1098.  
  1099.  
  1100.  
  1101.               { --------------------------------------------------- }
  1102.               {                                                     }
  1103.               { Allocate the help view.  If we've got enough memory }
  1104.               { attach the help view to the desktop.  Dispose the   }
  1105.               { view when we are done, and clear the event.         }
  1106.               {                                                     }
  1107.               { --------------------------------------------------- }
  1108.  
  1109.  
  1110.               W := New (HelpFile.PHelpWindow, Init (Help_File, GetHelpCtx));
  1111.  
  1112.               if ValidView (W) <> nil then
  1113.               begin
  1114.  
  1115.                 W^.HelpCtx := $FFFF;
  1116.                 ExecView (W);
  1117.                 Dispose (W, Done);
  1118.  
  1119.               end;
  1120.  
  1121.               ClearEvent (Event);
  1122.  
  1123.             end;
  1124.  
  1125.  
  1126.  
  1127.           { --------------------------------------------------------------- }
  1128.           {                                                                 }
  1129.           { Signal that a help window can is allowed to be be opened again. }
  1130.           {                                                                 }
  1131.           { --------------------------------------------------------------- }
  1132.  
  1133.  
  1134.           Help_In_Use := False;
  1135.  
  1136.         end;
  1137.  
  1138.     Drivers.evMouseDown:
  1139.  
  1140.     if Event.Buttons <> 1 then
  1141.       Event.What := Drivers.evNothing;
  1142.  
  1143.   end;
  1144.  
  1145.  
  1146. end; { T_EditDemo.GetEvent }
  1147.  
  1148.  
  1149.  
  1150. { -------------------------------------------------------------------------- }
  1151.  
  1152.  
  1153.  
  1154. { COLORS - Start. }
  1155.  
  1156. function T_EditDemo.GetPalette : Views.PPalette;
  1157.  
  1158.  
  1159.   { --------------------------------------------- }
  1160.   {                                               }
  1161.   { This is an oveload method on TApplication.    }
  1162.   { We simply reset the application COLOR palette }
  1163.   { with our New_Colors.                          }
  1164.   {                                               }
  1165.   { --------------------------------------------- }
  1166.  
  1167.  
  1168. CONST
  1169.  
  1170.   CNewBlackWhite = App.CBlackWhite  + HelpFile.CHelpBlackWhite;
  1171.   CNewColor      = New_Colors       + HelpFile.CHelpColor;
  1172.   CNewMonochrome = App.CMonochrome  + HelpFile.CHelpMonochrome;
  1173.  
  1174.   P : array[App.apColor..App.apMonochrome] of string[Length (CNewColor)] = (CNewColor,
  1175.                                                                             CNewBlackWhite,
  1176.                                                                             CNewMonochrome);
  1177.  
  1178. begin
  1179.  
  1180.   GetPalette := @P[AppPalette];
  1181.  
  1182.  
  1183. end; { T_EditDemo.GetPalette }
  1184.  
  1185. { COLORS - Stop. } { Required to replace current palatte with our New_Colors. }
  1186.  
  1187.  
  1188.  
  1189. { -------------------------------------------------------------------------- }
  1190.  
  1191.  
  1192.  
  1193. procedure T_EditDemo.HandleEvent (var Event : TEvent);
  1194.  
  1195.  
  1196.   { ----------------------------------------------- }
  1197.   {                                                 }
  1198.   { This procedure handles all the system events.   }
  1199.   { If at all possible, try to keep event handlers  }
  1200.   { local to this procedure, in alphabetical order. }
  1201.   {                                                 }
  1202.   { ----------------------------------------------- }
  1203.  
  1204.  
  1205.  
  1206.   { ------------------------------------------------------------------------ }
  1207.  
  1208.  
  1209.  
  1210.   procedure About_Dialog;
  1211.  
  1212.  
  1213.     { -------------------------------------------------------------- }
  1214.     {                                                                }
  1215.     { This procedure simply brings the "About The Program" dialog    }
  1216.     { up for the user to see.  It's only used once so I put it here. }
  1217.     { You can change the text to anything you want.  Remember that   }
  1218.     { there is a 128 character limitation on static text!            }
  1219.     {                                                                }
  1220.     { -------------------------------------------------------------- }
  1221.  
  1222.  
  1223.   VAR
  1224.  
  1225.     D : Dialogs.PDialog;     { The Dialog box.        }
  1226.     R : TRect;               { The bounds of the box. }
  1227.  
  1228.  
  1229.   begin
  1230.  
  1231.  
  1232.     { ------------------------------------------------------------ }
  1233.     {                                                              }
  1234.     { Assign the bounds of the box, then insert the label into it. }
  1235.     { Now shrink it so we are inside of frame., Insert some text   }
  1236.     { that is centered into it, then assign an OK button.          }
  1237.     {                                                              }
  1238.     { ------------------------------------------------------------ }
  1239.  
  1240.  
  1241.     R.Assign (0, 0, 50, 16);
  1242.     D := New (Dialogs.PDialog, Init (R, 'About The Program'));
  1243.  
  1244.     with D^ do
  1245.       begin
  1246.         Options := Options or Views.ofCentered;
  1247.         D^.HelpCtx := CmdFile.hcDAbout;
  1248.  
  1249.         R.Grow (-1, -1);
  1250.         Dec (R.B.Y, 3);
  1251.         Insert (New (Dialogs.PStaticText, Init (R,       + #13       +
  1252.           ^C'NewEdit v2.00 Demonstration Program'        + #13 + #13 +
  1253.           ^C'Author:  Al Andersen'                       + #13       +
  1254.           ^C'PO Box 2436'                                + #13 +
  1255.           ^C'Sierra Vista, AZ 85636'                     + #13 + #13 +
  1256.           ^C'CIS ID: 71610,3214'                         + #13 + #13 +
  1257.           ^C'You will need BP 7.0 to compile this code.')));
  1258.  
  1259.         R.Assign (20, 13, 30, 15);
  1260.         Insert (New (Dialogs.PButton, Init (R, 'O~K~', Views.cmOk, Dialogs.bfDefault)));
  1261.  
  1262.       end;
  1263.  
  1264.  
  1265.  
  1266.     { ------------------------------------------------------------------- }
  1267.     {                                                                     }
  1268.     { Test to see if the view is valid, and if so, put it on the desktop. }
  1269.     {                                                                     }
  1270.     { ------------------------------------------------------------------- }
  1271.  
  1272.  
  1273.     if ValidView (D) <> nil then
  1274.       ExecDialog (D, nil);
  1275.  
  1276.  
  1277.   end; { About_Dialog }
  1278.  
  1279.  
  1280.  
  1281.   { ------------------------------------------------------------------------ }
  1282.  
  1283.  
  1284.  
  1285.   procedure Change_Directory;
  1286.  
  1287.  
  1288.     { --------------------------------------------------------------- }
  1289.     {                                                                 }
  1290.     { This procedure brings up a "tree" dialog to change directories. }
  1291.     {                                                                 }
  1292.     { --------------------------------------------------------------- }
  1293.  
  1294.  
  1295.   VAR
  1296.  
  1297.      D : Dialogs.PDialog;
  1298.  
  1299.   begin
  1300.  
  1301.      D := New (StdDlg.PChDirDialog, Init (StdDlg.cdNormal, 0));
  1302.      D^.HelpCtx := CmdFile.hcDDirName;
  1303.      ExecDialog (D, nil);
  1304.  
  1305.   end; { Change_Directory }
  1306.  
  1307.  
  1308.  
  1309.   { ------------------------------------------------------------------------ }
  1310.  
  1311.  
  1312.   procedure Quit_Program;
  1313.  
  1314.  
  1315.     { ------------------------------------------ }
  1316.     {                                            }
  1317.     { This procedure calls EndModal to close all }
  1318.     { views before terminating the application.  }
  1319.     { Yeah, I know, but its the way I do things! }
  1320.     {                                            }
  1321.     { ------------------------------------------ }
  1322.  
  1323.  
  1324.   begin
  1325.  
  1326.     TView.EndModal (cmQuit);
  1327.  
  1328.  
  1329.   end; { Quit_Program}
  1330.  
  1331.  
  1332.  
  1333.   { -------------------------------------------------------------------------}
  1334.  
  1335.  
  1336.  
  1337. { -------------------------------------- }
  1338. {                                        }
  1339. { Main body of T_EditDemo.HandleEvent.   }
  1340. { All commands are dispatched from here. }
  1341. {                                        }
  1342. { -------------------------------------- }
  1343.  
  1344.  
  1345. begin
  1346.  
  1347.   App.TApplication.HandleEvent (Event);
  1348.  
  1349.   case Event.What of evCommand:
  1350.  
  1351.     begin
  1352.  
  1353.       case Event.Command of
  1354.  
  1355.         CmdFile.cmAbout        : About_Dialog;
  1356.         CmdFile.cmChangeDir    : Change_Directory;
  1357.         CmdFile.cmClipboard    : EditPkg.Show_ClipBoard;
  1358.  
  1359.         { DESKTOP - Start. }
  1360.  
  1361.         CmdFile.cmLoadDesktop  : Load_Desktop;
  1362.  
  1363.         { DESKTOP - Stop. }
  1364.  
  1365.         CmdFile.cmNew          : EditPkg.Open_Editor ('', True);
  1366.         CmdFile.cmOpen         : EditPkg.Run_The_Editor;
  1367.  
  1368.  
  1369.         { DESKTOP - Start. }
  1370.  
  1371.         CmdFile.cmSaveDesktop  : Save_Desktop;
  1372.  
  1373.         { DESKTOP - Stop. }
  1374.  
  1375.         CmdFile.cmShellToDos   : App.TApplication.DosShell;
  1376.  
  1377.         { SPLCHK - Start. }
  1378.  
  1379.         CmdFile.cmSpellCheck   : EditPkg.SpellIt;
  1380.  
  1381.         { SPLCHK - Stop.  }
  1382.  
  1383.         { SCRNSZ - Start. }
  1384.  
  1385.         CmdFile.cmToggleVideo  : Toggle_Video_Mode;
  1386.  
  1387.         { SCRNSZ - Stop. }
  1388.  
  1389.         Views.cmCascade        : App.TApplication.Cascade;
  1390.         Views.cmQuit           : Quit_Program;
  1391.         Views.cmTile           : App.TApplication.Tile;
  1392.  
  1393.       else
  1394.  
  1395.         Exit;
  1396.  
  1397.       end;
  1398.  
  1399.       ClearEvent (Event);
  1400.  
  1401.     end;
  1402.   end;
  1403.  
  1404.  
  1405. end; { TApplication.HandleEvent }
  1406.  
  1407.  
  1408.  
  1409. { ---------------------------------------------------------------------------}
  1410.  
  1411.  
  1412.  
  1413. procedure T_EditDemo.Idle;
  1414.  
  1415.  
  1416.   { ---------------------------------------------------------- }
  1417.   {                                                            }
  1418.   { This function handles events during system idle time.      }
  1419.   { Specifically, toggling on off of menu options that need    }
  1420.   { changing, updating the memory indicator view, and changing }
  1421.   { the status line if Shift, Alt, or Ctrl keys are pressed.   }
  1422.   {                                                            }
  1423.   { ---------------------------------------------------------- }
  1424.  
  1425.  
  1426.  
  1427.   { ------------------------------------------------------------------------ }
  1428.  
  1429.  
  1430.  
  1431.   function Is_Tileable (P : Views.PView) : Boolean; far;
  1432.  
  1433.  
  1434.     { ------------------------------------------ }
  1435.     {                                            }
  1436.     { This is a local function that tests to see }
  1437.     { if views can be tiled and/or cascaded.     }
  1438.     {                                            }
  1439.     { ------------------------------------------ }
  1440.  
  1441.  
  1442.   begin
  1443.  
  1444.     Is_Tileable := P^.Options and Views.ofTileable <> 0;
  1445.  
  1446.   end;
  1447.  
  1448.  
  1449.  
  1450. begin { T_EditDemo.Idle }
  1451.  
  1452.  
  1453.  
  1454.   { ------------------------------------------------ }
  1455.   {                                                  }
  1456.   { We don't have anything real special to do here,  }
  1457.   { so call ancestor Idle method first.  Then update }
  1458.   { the Memory_Indicator view and check to see if    }
  1459.   { the status line needs to be changed.             }
  1460.   {                                                  }
  1461.   { ------------------------------------------------ }
  1462.  
  1463.  
  1464.   App.TApplication.Idle;
  1465.  
  1466.   { MEMWIN - Start. }
  1467.   { STATLN - Start. }
  1468.  
  1469.   Memory_Indicator^.Update;
  1470.   Change_Status_Line;
  1471.  
  1472.   { STATLN - Stop. } { Constantly check if we need to update status line.    }
  1473.   { MEMWIN - Stop. } { Constantly update heap view window to reflect memory. }
  1474.  
  1475.  
  1476.  
  1477.   { ----------------------------------------------------- }
  1478.   {                                                       }
  1479.   { Check to see if first window in desktop can be tiled. }
  1480.   { If it can, then we can toggle the cascade/tile and    }
  1481.   { Next/Prev on.  Once the window disappears, disable    }
  1482.   { the cascade/tile and Next/Prev options.               }
  1483.   {                                                       }
  1484.   { ----------------------------------------------------- }
  1485.  
  1486.  
  1487.   if Desktop^.FirstThat (@Is_Tileable) <> nil then
  1488.     EnableCommands ([Views.cmTile,
  1489.                      Views.cmCascade,
  1490.                      Views.cmNext,
  1491.                      Views.cmPrev])
  1492.   else
  1493.     DisableCommands ([Views.cmTile,
  1494.                       Views.cmCascade,
  1495.                       Views.cmNext,
  1496.                       Views.cmPrev]);
  1497.  
  1498.  
  1499. end; { T_EditDemo.Idle }
  1500.  
  1501.  
  1502.  
  1503. { ---------------------------------------------------------------------------}
  1504.  
  1505.  
  1506.  
  1507. procedure T_EditDemo.InitMenuBar;
  1508.  
  1509.  
  1510.   { --------------------------------------------------------------- }
  1511.   {                                                                 }
  1512.   { This procedure sets up the menu bar and all its pulldown menus. }
  1513.   {                                                                 }
  1514.   { --------------------------------------------------------------- }
  1515.  
  1516.  
  1517. VAR
  1518.  
  1519.   R : TRect;   { Bounds of the desktop. }
  1520.  
  1521. begin
  1522.  
  1523.  
  1524.   { --------------------------------------------------- }
  1525.   {                                                     }
  1526.   { Get the extent of the desktop and drop top line +1. }
  1527.   {                                                     }
  1528.   { --------------------------------------------------- }
  1529.  
  1530.  
  1531.   GetExtent (R);
  1532.   R.B.Y := R.A.Y + 1;
  1533.  
  1534.  
  1535.  
  1536.   { --------------------------------------------------------------------- }
  1537.   {                                                                       }
  1538.   { This is the MenuBar initialization.  Note that it consists            }
  1539.   { of submenus.  The format for declaring a NewItem in a submenu         }
  1540.   { consists of the following:                                            }
  1541.   {                                                                       }
  1542.   { Name         - a string, surrounding select characters with tilde's.  }
  1543.   { Keys         - a string indicating which key is a "hot key" for item. }
  1544.   { Key Command  - TurboVision "kb????" command to bind as hot key.       }
  1545.   { Item Command - TurboVision "cm????" command to bind to item.          }
  1546.   { Help Context - TurboVision help context command to bind to item.      }
  1547.   {                                                                       }
  1548.   { --------------------------------------------------------------------- }
  1549.  
  1550.  
  1551.   MenuBar := New (Menus.PMenuBar, Init (R, NewMenu (
  1552.  
  1553.  
  1554.  
  1555.     { ---------------------------------------- }
  1556.     {                                          }
  1557.     { This is the FILE submenu initialization. }
  1558.     {                                          }
  1559.     { ---------------------------------------- }
  1560.  
  1561.  
  1562.     NewSubMenu ('~F~ile',  CmdFile.hcFile_Menu,     NewMenu (
  1563.  
  1564.       NewItem  ('~O~pen',               'F3',  Drivers.kbF3,       CmdFile.cmOpen,          CmdFile.hcOpen,
  1565.       NewItem  ('~N~ew',                  '',  Drivers.kbNoKey,    CmdFile.cmNew,           CmdFile.hcNew,
  1566.  
  1567.       NewLine  (
  1568.  
  1569.       NewItem  ('Save ~C~ontinue',      'F2',  Drivers.kbF2,       NewEdit.cmSave,          CmdFile.hcSave,
  1570.       NewItem  ('Save ~D~one',         '^KD',  Drivers.kbNoKey,    NewEdit.cmSaveDone,      CmdFile.hcSaveDone,
  1571.       NewItem  ('Save ~F~ile',         '^KF',  Drivers.kbNoKey,    NewEdit.cmSaveAs,        CmdFile.hcSaveAs,
  1572.  
  1573.       NewLine  (
  1574.  
  1575.       NewItem  ('C~h~ange Dir',           '',  Drivers.kbNoKey,    CmdFile.cmChangeDir,     CmdFile.hcChangeDir,
  1576.       NewItem  ('~S~hell To DOS',         '',  Drivers.kbNoKey,    CmdFile.cmShellToDos,    CmdFile.hcShellToDos,
  1577.  
  1578.       NewLine  (
  1579.  
  1580.       NewItem  ('~E~xit',            'Alt-X',  Drivers.kbAltX,     Views.cmQuit,            CmdFile.hcExit,
  1581.  
  1582.     nil)))))))))))),
  1583.  
  1584.  
  1585.  
  1586.     { ---------------------------------------- }
  1587.     {                                          }
  1588.     { This is the EDIT submenu initialization. }
  1589.     {                                          }
  1590.     { ---------------------------------------- }
  1591.  
  1592.  
  1593.     NewSubMenu ('~E~dit', CmdFile.hcEdit_Menu, NewMenu (
  1594.  
  1595.       NewItem  ('~U~ndo',               '^U',  Drivers.kbNoKey,    Views.cmUndo,            CmdFile.hcUndo,
  1596.  
  1597.       NewLine  (
  1598.  
  1599.       NewItem  ('~C~lipboard',            '',  Drivers.kbNoKey,    CmdFile.cmClipboard,     CmdFile.hcClipboard,
  1600.       NewItem  ('C~o~py',         'Ctrl-Ins',  Drivers.kbCtrlIns,  Views.cmCopy,            CmdFile.hcCopy,
  1601.       NewItem  ('Cu~t~',         'Shift-Del',  Drivers.kbShiftDel, Views.cmCut,             CmdFile.hcCut,
  1602.       NewItem  ('~P~aste',       'Shift-Ins',  Drivers.kbShiftIns, Views.cmPaste,           CmdFile.hcPaste,
  1603.  
  1604.       NewLine  (
  1605.  
  1606.       NewItem  ('C~l~ear',        'Ctrl-Del',  Drivers.kbCtrlDel,  Views.cmClear,           CmdFile.hcClear,
  1607.  
  1608.       NewLine  (
  1609.  
  1610.       NewItem  ('~S~pell Check',          '',  Drivers.kbNoKey,    CmdFile.cmSpellCheck,    CmdFile.hcSpellCheck,
  1611.  
  1612.     nil))))))))))),
  1613.  
  1614.  
  1615.  
  1616.     { ------------------------------------------ }
  1617.     {                                            }
  1618.     { This is the SEARCH submenu initialization. }
  1619.     {                                            }
  1620.     { ------------------------------------------ }
  1621.  
  1622.  
  1623.     NewSubMenu ('~S~earch', CmdFile.hcSearch_Menu, NewMenu (
  1624.  
  1625.       NewItem  ('~F~ind',              '^QF',  Drivers.kbNoKey,    NewEdit.cmFind,          CmdFile.hcFind,
  1626.       NewItem  ('~S~earch/Replace',    '^QA',  Drivers.kbNoKey,    NewEdit.cmReplace,       CmdFile.hcReplace,
  1627.  
  1628.       NewLine  (
  1629.  
  1630.       NewItem  ('~A~gain',              '^L',  Drivers.kbNoKey,    NewEdit.cmSearchAgain,   CmdFile.hcAgain,
  1631.  
  1632.     nil))))),
  1633.  
  1634.  
  1635.  
  1636.     { ----------------------------------------- }
  1637.     {                                           }
  1638.     { This is the WINDOW submenu initalization. }
  1639.     {                                           }
  1640.     { ----------------------------------------- }
  1641.  
  1642.  
  1643.     NewSubMenu ('~W~indows', CmdFile.hcWindows_Menu,   NewMenu (
  1644.  
  1645.       NewItem  ('~R~esize/Move',   'Ctrl-F5',  Drivers.kbCtrlF5,  Views.cmResize,           CmdFile.hcResize,
  1646.       NewItem  ('~Z~oom',               'F5',  Drivers.kbF5,      Views.cmZoom,             CmdFile.hcZoom,
  1647.       NewItem  ('~P~revious',     'Shift-F6',  Drivers.kbShiftF6, Views.cmPrev,             CmdFile.hcPrev,
  1648.       NewItem  ('~N~ext',               'F6',  Drivers.kbF6,      Views.cmNext,             CmdFile.hcNext,
  1649.       NewItem  ('~C~lose',          'Alt-F3',  Drivers.kbAltF3,   Views.cmClose,            CmdFile.hcClose,
  1650.       NewItem  ('~T~ile',                 '',  Drivers.kbNoKey,   Views.cmTile,             CmdFile.hcTile,
  1651.       NewItem  ('C~a~scade',              '',  Drivers.kbNoKey,   Views.cmCascade,          CmdFile.hcCascade,
  1652.  
  1653.     nil)))))))),
  1654.  
  1655.  
  1656.  
  1657.     { ------------------------------------------ }
  1658.     {                                            }
  1659.     { This is the DESKTOP submenu initalization. }
  1660.     {                                            }
  1661.     { ------------------------------------------ }
  1662.  
  1663.  
  1664.     NewSubMenu ('~D~esktop', CmdFile.hcDesktop_Menu,  NewMenu (
  1665.  
  1666.       NewItem  ('~L~oad Desktop',         '',  Drivers.kbNoKey,   CmdFile.cmLoadDesktop,    CmdFile.hcLoadDesktop,
  1667.       NewItem  ('~S~ave Desktop',         '',  Drivers.kbNoKey,   CmdFile.cmSaveDesktop,    CmdFile.hcSaveDesktop,
  1668.  
  1669.       NewLine  (
  1670.  
  1671.       NewItem  ('~4~3/50 Lines',          '',  Drivers.kbNoKey,   CmdFile.cmToggleVideo,    CmdFile.hcToggleVideo,
  1672.  
  1673.     nil))))),
  1674.  
  1675.   nil))))))));
  1676.  
  1677.  
  1678. end; { T_EditDemo.InitMenuBar }
  1679.  
  1680.  
  1681.  
  1682. { ---------------------------------------------------------------------------}
  1683.  
  1684.  
  1685.  
  1686. procedure T_EditDemo.InitStatusLine;
  1687.  
  1688.  
  1689.   { ------------------------------------------------------- }
  1690.   {                                                         }
  1691.   { This procedure sets up the status line and its options. }
  1692.   {                                                         }
  1693.   { ------------------------------------------------------- }
  1694.  
  1695.  
  1696. VAR
  1697.  
  1698.   R : TRect;  { Bounds of the desktop. }
  1699.  
  1700.  
  1701. begin
  1702.  
  1703.  
  1704.  
  1705.   { --------------------------------------------------------- }
  1706.   {                                                           }
  1707.   { Get the extent of the desktop and pull up bottom line -1. }
  1708.   {                                                           }
  1709.   { --------------------------------------------------------- }
  1710.  
  1711.  
  1712.   GetExtent (R);
  1713.   R.A.Y := R.B.Y - 1;
  1714.  
  1715.  
  1716.  
  1717.   { ------------------------------------------------------------------------- }
  1718.   {                                                                           }
  1719.   { This is the Statusline initialization.                                    }
  1720.   { The format for declaring a NewStatusKey in a NewStatusDef is:             }
  1721.   {                                                                           }
  1722.   { Name and Keys - a string, surrounding key select characters with tilde's. }
  1723.   { Key Command   - TurboVision "kb????" command to bind as hot key.          }
  1724.   { Item Command  - TurboVision "cm????" commnad to bind to item.             }
  1725.   {                                                                           }
  1726.   { ------------------------------------------------------------------------- }
  1727.  
  1728.  
  1729.   StatusLine := New (P_Status_Line_Help, Init (R,
  1730.  
  1731.      NewStatusDef (Views.hcDragging, Views.hcDragging,
  1732.  
  1733.        NewStatusKey ('',                     Drivers.kbF1,       Views.cmHelp,
  1734.        NewStatusKey ('~' + #24 + #25
  1735.                          + #26 + #27
  1736.                          + '~:Move',         Drivers.kbNoKey,    Views.cmValid,
  1737.        NewStatusKey ('~Shift-' + #24
  1738.                          + #25 + #26
  1739.                          + #27 + '~:Resize', Drivers.kbNoKey,    Views.cmValid,
  1740.        NewStatusKey ('~Enter~:Done',         Drivers.kbNoKey,    Views.cmValid,
  1741.        NewStatusKey ('~Esc~:Cancel',         Drivers.kbNoKey,    Views.cmValid,
  1742.  
  1743.     nil))))),
  1744.  
  1745.     NewStatusDef   (0, CmdFile.hcExtra_Menu,
  1746.  
  1747.       NewStatusKey ('~F1~:Help',             Drivers.kbF1,       Views.cmHelp,
  1748.       NewStatusKey ('~F2~:Save',             Drivers.kbF2,       NewEdit.cmSave,
  1749.       NewStatusKey ('~F3~:Open',             Drivers.kbF3,       CmdFile.cmOpen,
  1750.       NewStatusKey ('~F5~:Zoom',             Drivers.kbF5,       Views.cmZoom,
  1751.       NewStatusKey ('~F6~:Next',             Drivers.kbF6,       Views.cmNext,
  1752.       NewStatusKey ('~F10~:Menu',            Drivers.kbF10,      Views.cmMenu,
  1753.  
  1754.       NewStatusKey ('',                      Drivers.kbF1,       Views.cmHelp,
  1755.       NewStatusKey ('',                      Drivers.kbAltF3,    Views.cmClose,
  1756.       NewStatusKey ('',                      Drivers.kbF5,       Views.cmZoom,
  1757.       NewStatusKey ('',                      Drivers.kbF6,       Views.cmNext,
  1758.       NewStatusKey ('',                      Drivers.kbShiftF6,  Views.cmPrev,
  1759.       NewStatusKey ('',                      Drivers.kbCtrlF5,   Views.cmResize,
  1760.       NewStatusKey ('',                      Drivers.kbF10,      Views.cmMenu,
  1761.       NewStatusKey ('',                      Drivers.kbAltX,     Views.cmQuit,
  1762.  
  1763.     nil)))))))))))))),
  1764.  
  1765.     NewStatusDef   (CmdFile.hcExtra_Menu, CmdFile.hcMisc_Commands,
  1766.  
  1767.       NewStatusKey ('~F1~:Help',             Drivers.kbF1,       Views.cmHelp,
  1768.  
  1769.     nil),
  1770.  
  1771.     NewStatusDef   (CmdFile.hckbShift, CmdFile.hckbShift,
  1772.  
  1773.       NewStatusKey ('~Del~:Cut',             Drivers.kbShiftDel, Views.cmCut,
  1774.       NewStatusKey ('~F6~:Prev',             Drivers.kbShiftF6,  Views.cmPrev,
  1775.       NewStatusKey ('~Ins~:Paste',           Drivers.kbShiftIns, Views.cmPaste,
  1776.  
  1777.     nil))),
  1778.  
  1779.     NewStatusDef   (CmdFile.hckbCtrl, CmdFile.hckbCtrl,
  1780.  
  1781.       NewStatusKey ('~B~:Reformat',          Drivers.kbNoKey,    NewEdit.cmReformPara,
  1782.       NewStatusKey ('~Del~:Clear',           Drivers.kbCtrlDel,  Views.cmClear,
  1783.       NewStatusKey ('~F5~:Resize',           Drivers.kbCtrlF5,   Views.cmResize,
  1784.       NewStatusKey ('~Ins~:Copy',            Drivers.kbCtrlIns,  Views.cmCopy,
  1785.       NewStatusKey ('~U~:Undo',              Drivers.kbNoKey,    Views.cmUndo,
  1786.  
  1787.     nil))))),
  1788.  
  1789.     NewStatusDef   (CmdFile.hckbAlt, CmdFile.hckbAlt,
  1790.  
  1791.       NewStatusKey ('~F3~:Close',            Drivers.kbAltF3,    Views.cmClose,
  1792.       NewStatusKey ('~X~:Exit',              Drivers.kbAltX,     Views.cmQuit,
  1793.  
  1794.     nil)),
  1795.  
  1796.     NewStatusDef   (CmdFile.hcEditor_Commands, $FFFE,
  1797.  
  1798.       NewStatusKey ('~F1~:Help',             Drivers.kbF1,       Views.cmHelp,
  1799.       NewStatusKey ('~F2~:Save',             Drivers.kbF2,       NewEdit.cmSave,
  1800.       NewStatusKey ('~F3~:Open',             Drivers.kbF3,       CmdFile.cmOpen,
  1801.       NewStatusKey ('~F5~:Zoom',             Drivers.kbF5,       Views.cmZoom,
  1802.       NewStatusKey ('~F6~:Next',             Drivers.kbF6,       Views.cmNext,
  1803.       NewStatusKey ('~F10~:Menu',            Drivers.kbF10,      Views.cmMenu,
  1804.  
  1805.       NewStatusKey ('',                      Drivers.kbF1,       Views.cmHelp,
  1806.       NewStatusKey ('',                      Drivers.kbAltF3,    Views.cmClose,
  1807.       NewStatusKey ('',                      Drivers.kbF5,       Views.cmZoom,
  1808.       NewStatusKey ('',                      Drivers.kbF6,       Views.cmNext,
  1809.       NewStatusKey ('',                      Drivers.kbShiftF6,  Views.cmPrev,
  1810.       NewStatusKey ('',                      Drivers.kbCtrlF5,   Views.cmResize,
  1811.       NewStatusKey ('',                      Drivers.kbF10,      Views.cmMenu,
  1812.       NewStatusKey ('',                      Drivers.kbAltX,     Views.cmQuit,
  1813.  
  1814.     nil)))))))))))))),
  1815.  
  1816.     NewStatusDef   ($FFFF, $FFFF,
  1817.  
  1818.       NewStatusKey ('~Enter~:Select',        Drivers.kbNoKey,    Views.cmValid,
  1819.       NewStatusKey ('~Esc~:Exit',            Drivers.kbEsc,      Views.cmClose,
  1820.       NewStatusKey ('~F5~:Zoom',             Drivers.kbF5,       Views.cmZoom,
  1821.       NewStatusKey ('~Shift-Tab~:Prev',      Drivers.kbNoKey,    Views.cmValid,
  1822.       NewStatusKey ('~Tab~:Next',            Drivers.kbNoKey,    Views.cmValid,
  1823.       NewStatusKey ('',                      Drivers.kbAltF3,    Views.cmClose,
  1824.       NewStatusKey ('',                      Drivers.kbF5,       Views.cmZoom,
  1825.       NewStatusKey ('',                      Drivers.kbCtrlF5,   Views.cmResize,
  1826.  
  1827.     nil)))))))),
  1828.  
  1829.   nil))))))))));
  1830.  
  1831.  
  1832. end; { T_EditDemo.InitStatusLine }
  1833.  
  1834.  
  1835.  
  1836. { ---------------------------------------------------------------------------}
  1837.  
  1838.  
  1839.  
  1840. { MEMWIN - Start. }
  1841.  
  1842. function T_EditDemo.Insert_Memory_Indicator : Boolean;
  1843.  
  1844.  
  1845.   { -------------------------------------------------------------------- }
  1846.   {                                                                      }
  1847.   { This function installs the memory indicator view on the status line. }
  1848.   { A separate function was required because we need to dispose of it    }
  1849.   { and re-insert it whenever we toggle screen modes.                    }
  1850.   {                                                                      }
  1851.   { -------------------------------------------------------------------- }
  1852.  
  1853.  
  1854. VAR
  1855.  
  1856.   R : TRect;  { Object to show rectangle bounds.  }
  1857.  
  1858. begin
  1859.  
  1860.   GetExtent (R);
  1861.   Dec (R.B.X);
  1862.   R.A.X := R.B.X - 9;
  1863.   R.A.Y := R.B.Y - 1;
  1864.  
  1865.   Memory_Indicator := New (Gadgets.PHeapView, Init (R));
  1866.   Insert (Memory_Indicator);
  1867.  
  1868.  
  1869. end; { T_EditDemo.Insert_Memory_Indicator }
  1870.  
  1871. { MEMWIN - Stop. } { Function responsible for inserting heap view on status line. }
  1872.  
  1873.  
  1874.  
  1875. { ---------------------------------------------------------------------------}
  1876.  
  1877.  
  1878.  
  1879. { DESKTOP - Start. }
  1880.  
  1881. function  T_EditDemo.Load_Desktop : Boolean;
  1882.  
  1883.  
  1884.   { ---------------------------------------------------------------- }
  1885.   {                                                                  }
  1886.   { Since the safety pool is only large enough to guarantee that     }
  1887.   { allocating a window will not run out of memory, loading the      }
  1888.   { entire desktop without checking LowMemory could cause a heap     }
  1889.   { error.  This means that each window should be read individually, }
  1890.   { instead of using Desktop's Load.                                 }
  1891.   {                                                                  }
  1892.   { ---------------------------------------------------------------- }
  1893.  
  1894.  
  1895. VAR
  1896.  
  1897.    S : PStream;
  1898.  
  1899. begin
  1900.  
  1901.   Load_Desktop := False;
  1902.  
  1903.   if Desktop_Name = '' then
  1904.     Exit;
  1905.  
  1906.   S := New (Objects.PBufStream, Init (Desktop_Name, Objects.stOpenRead, 1024));
  1907.  
  1908.  
  1909.  
  1910.   { ------------------------------------------------------------- }
  1911.   {                                                               }
  1912.   { If not enough memory, then tell user.  If the desktop file    }
  1913.   { does not exist, or could not be read, tell the user about it. }
  1914.   {                                                               }
  1915.   { ------------------------------------------------------------- }
  1916.  
  1917.  
  1918.   if Memory.LowMemory then
  1919.     App.Application^.OutOfMemory
  1920.   else
  1921.     if S^.Status <> Objects.stOk then
  1922.       MsgBox.MessageBox (^C'Could not open desktop file ' + #13 + #13
  1923.                        + ^C + Desktop_Name, nil, MsgBox.mfOkButton + MsgBox.mfError)
  1924.     else
  1925.       begin
  1926.  
  1927.  
  1928.  
  1929.         { --------------------------------------------------------------- }
  1930.         {                                                                 }
  1931.         { Go read the desktop file and insert all views into the desktop. }
  1932.         { Tell the user if we encounter any sort of a problem.            }
  1933.         {                                                                 }
  1934.         { --------------------------------------------------------------- }
  1935.  
  1936.  
  1937.         DesktopReadViews (S^);
  1938.  
  1939.         if S^.Status <> Objects.stOk then
  1940.           MsgBox.MessageBox (^C'Error reading desktop file', nil,
  1941.                              MsgBox.mfOkButton + MsgBox.mfError)
  1942.         else
  1943.           Load_Desktop := True;
  1944.  
  1945.       end;
  1946.  
  1947.   Dispose (S, Done);
  1948.  
  1949.  
  1950. end; { T_EditDemo.Load_Desktop }
  1951.  
  1952. { DESKTOP - Stop. } { "Driver" code to load the desktop. }
  1953.  
  1954.  
  1955.  
  1956. { ------------------------------------------------------------------------ }
  1957.  
  1958.  
  1959.  
  1960. procedure T_EditDemo.OutOfMemory;
  1961.  
  1962.  
  1963.   { --------------------------------------------------------- }
  1964.   {                                                           }
  1965.   { This procedure is an overload method for the application. }
  1966.   { It brings up a message box stating "Not enough memory     }
  1967.   { available" whenever the user tries to open an application }
  1968.   { which can't fit into its place in the desktop.            }
  1969.   {                                                           }
  1970.   { --------------------------------------------------------- }
  1971.  
  1972.  
  1973. begin
  1974.  
  1975.   MsgBox.MessageBox (^C'Not enough memory available.',
  1976.     nil, MsgBox.mfError + Msgbox.mfOkButton);
  1977.  
  1978.  
  1979. end; { T_EditDemo.OutOfMemory }
  1980.  
  1981.  
  1982.  
  1983. { -------------------------------------------------------------------------- }
  1984.  
  1985.  
  1986.  
  1987. { DESKTOP - Start. }
  1988.  
  1989. function T_EditDemo.Save_Desktop : Boolean;
  1990.  
  1991.  
  1992.   { -------------------------------------------------------------- }
  1993.   {                                                                }
  1994.   { This function will save the current desktop to a file on disk. }
  1995.   {                                                                }
  1996.   { -------------------------------------------------------------- }
  1997.  
  1998.  
  1999. VAR
  2000.  
  2001.   S : Objects.PStream;
  2002.   F : File;
  2003.  
  2004. begin
  2005.  
  2006.   Save_Desktop := False;
  2007.  
  2008.   if Desktop_Name = '' then
  2009.     Exit;
  2010.  
  2011.   S := New (Objects.PBufStream, Init (Desktop_Name, Objects.stCreate, 1024));
  2012.  
  2013.  
  2014.  
  2015.   { ------------------------------------------------------------------ }
  2016.   {                                                                    }
  2017.   { If we have enough memory, and there's no problem with the stream   }
  2018.   { deallocate the editor clipboard, write all the desktop views to    }
  2019.   { desktop file on disk, and then reallocate the editor clipboard.    }
  2020.   { The clipboard MUST be deallocated and reallocated or the desktop   }
  2021.   { file will start filling with duplicate information with each save. }
  2022.   {                                                                    }
  2023.   { ------------------------------------------------------------------ }
  2024.  
  2025.  
  2026.   if not Memory.LowMemory and (S^.Status = Objects.stOk) then
  2027.     begin
  2028.  
  2029.       EditPkg.Deallocate_The_Clipboard;
  2030.  
  2031.       DesktopWriteViews (S^);
  2032.  
  2033.       EditPkg.Initialize_The_Clipboard;
  2034.  
  2035.  
  2036.  
  2037.       { ----------------------------------------------------------------- }
  2038.       {                                                                   }
  2039.       { Tell the user if there was any sort of error in writing the file. }
  2040.       {                                                                   }
  2041.       { ----------------------------------------------------------------- }
  2042.  
  2043.  
  2044.       if S^.Status <> Objects.stOk then
  2045.         begin
  2046.           MsgBox.MessageBox (^C'Could not create ' + Desktop_Name, nil,
  2047.                              MsgBox.mfOkButton + MsgBox.mfError);
  2048.           Dispose (S, Done);
  2049.           Assign (F, Desktop_Name);
  2050.           Erase (F);
  2051.           Exit;
  2052.         end;
  2053.     end;
  2054.  
  2055.   Dispose (S, Done);
  2056.   Save_Desktop := True;
  2057.  
  2058.  
  2059. end; { T_EditDemo.Save_Desktop }
  2060.  
  2061. { DESKTOP - Stop. } { "Driver" code to store the desktop. }
  2062.  
  2063.  
  2064.  
  2065. { ------------------------------------------------------------------------ }
  2066.  
  2067.  
  2068.  
  2069. { SCRNSZ - Start. }
  2070.  
  2071. procedure T_EditDemo.Toggle_Video_Mode;
  2072.  
  2073.  
  2074.   { --------------------------------------------------------------------- }
  2075.   {                                                                       }
  2076.   { This procedure toggles the video mode between normal and 43/50 lines. }
  2077.   { Each time the video mode is toggled, the memory indicator view must   }
  2078.   { be deallocated and re-inserted into the desktop.  Failure to do so    }
  2079.   { will result in the memory indicator view showing up in the middle of  }
  2080.   { the screen in 43/50 line mode -- not pretty!                          }
  2081.   {                                                                       }
  2082.   { --------------------------------------------------------------------- }
  2083.  
  2084.  
  2085. begin
  2086.  
  2087.   if Drivers.HiresScreen = True then
  2088.     begin
  2089.  
  2090.       if Memory_Indicator <> nil then
  2091.         Dispose (Memory_Indicator, Done);
  2092.  
  2093.       App.TApplication.SetScreenMode (Drivers.ScreenMode XOR Drivers.smFont8x8);
  2094.       Current_Screen_Mode := Drivers.ScreenMode;
  2095.  
  2096.       Insert_Memory_Indicator;
  2097.  
  2098.     end;
  2099.  
  2100.  
  2101. end; { T_EditDemo.Toggle_Video_Mode }
  2102.  
  2103. { SCRNSZ - Stop. } { Procedure responsible for toggling normal and 43/50 line mode. }
  2104.  
  2105.  
  2106.  
  2107. { ---------------------------------------------------------------------------}
  2108. {                                                                            }
  2109. {                               MAIN PROCEDURE                               }
  2110. {                                                                            }
  2111. { ---------------------------------------------------------------------------}
  2112.  
  2113.  
  2114. VAR
  2115.  
  2116.   Demo_Application : T_EditDemo;         { The demo program desktop. }
  2117.  
  2118.  
  2119. begin
  2120.  
  2121.   Demo_Application.Init;                 { Initialize the system.    }
  2122.   Demo_Application.Run;                  { Run the system.           }
  2123.   Demo_Application.Done;                 { Deallocate the system.    }
  2124.  
  2125.   writeln ('End program.');
  2126.  
  2127.  
  2128. end. { Program EditDemo }
  2129.