'
'Class description:
'
!short:View class structure:
Class View:
~~~~~~~~~~~
this is standard I/O engine for your programs, which with exception of menu
maintains the user interface. The data are displayed in two modes (Form and
Browse). The databases can be viewed, edited, the information can be
selected, with use of user defined indexes, filters and reports.
All this functionality is network capable.


Common use:
~~~~~~~~~~~
The best is to study the examples DEMO1.prg, DEMO2.prg and DEMO3.prg.

The source code is in C_View.prg

!seealso: c_dbrows.ngo:DBrowse c_task.ngo:Task c_report.ngo:Report c_finfo.ngo:FInfo c_menu.ngo:Menu c_dbf.ngo:Dbf c_color.ngo:Color ob_class.ngo:"Class hierarchy"

!short:~~~~~~~~~~~~~~~~~~~~~
!short:create class View from DBrowse
!short:  export:
!short:  var ViewID    //0
^BView:ViewID^N: read-only: numeric
  the unique object identification number for user defined indexes,filters
  and reports in a database cIFR (OBasic1.dbf). All copies odf the object
  have this number same to have the same menu.

!short:  var MenuID    //0
^BView:MenuID^N: private: numeric
  The menu item number, which started it to active this menu item as a local
  task menu. See the static function ViewSlipMenu() in C_View.prg.

!short:  var MenuNtxID //0
^BView:MenuNtxID^N: private: numeric
  The number for index definition for supressing of a recursive index
  definition.

!short:  var MenuFltID //0
^BView:MenuFltID^N: private: numeric
  Number for filter definition, to supress the recursive filter definition
  for this object.

!short:  var MenuRptID //0
^BView:MenuRptID^N: private: numeric
  Number for report definition, to supress the recursive report definition
  for this object.

!short:  var CanGoto   //true
^BView:CanGoto^N: private: logical
  Enables / disables the goto command for this object, to select the record
  must be the window active.

!short:  var Fields    //{}
^BView:Fields^N: private: array
  All database fields to handle information in form of:
  Fields:={}
  AAdd( Fields, {cLongName,cShortName,cAlias,cField,cPicture,bWhen,bValid,;
                 [nMemoRowSize,nMemoColSize,[bDoGet]} )
  ...
Where:
  cLongName    - is the fieldname for Form mode
  cShortName   - is the fieldname for Browse (Columun header)
  cAlias       - is Alias() of fields database
  cField       - is a fieldname
  cPicture     - is a display mask
  bWhen        - is a code block evaluated before entering this field, when
                 returns false the field aditation is disabled. It can be
                 used for result fields, or read only fields.
  bValid       - is a code block to validate the entered data, when returns
                 true the data is valid.
  nMemoRowSize - window height for memo file (number of rows)
  nMemoColSize - window width for memo field (number of columns)
                 The memo field is edited in its own window of this sizes.
  bDoGet       - is a code block to edit the field, if nothing is set the
                 DoGet() method of DBrowse class is used.

!short:  var Action    //{}
^BView:Action^N: private: array
  The array with a structure:
  Action:={}
  AAdd( Action, {nKey,bNewProc,bOldProc,cShortInfo} )
  ...
  Every object of this class can have its own hot key set with connected
  functions. The element meaning is:
  nKey       - is a InKey() code of a hot key
  bNewProc   - code block to perform when a key is pressed
  bOldProc   - this key previous assigned code block
  cShortInfo - short help text to be displayed in dialog line about the
               hot key

!short:  var Filter    //{{},{},{},{}}
^BView:Filter^N: private: array
  This is object defined filter information. this instavar variable is
  composed of theree paralel arrays:
  first of them consists of filter names as menu items (character)
  second of them consists of the filter expression (Character)
  third is the array of logical values defining if the user is enabled
        to modify the filter definition. The filter definitions created
        in a program are unchangeable but there is a possiblity to change
        the user run time defined filters.

!short:  var Report    //{{},{},{}}
^BView:Report^N: private: array
  This is current object report information. This instvar variable consists
  off three paralel arrays:
  first of them consists of report names as menu items (character)
  second of them is the report definition
   array={cTop,aFields,cBottom,lOnlyTotals}
  third is the array of logical values defining if the user is enabled
        to modify the report definition. The report definitions created
        in a program are unchangeable but there is a possiblity to change
        the user run time defined reports.

  cTop is a report header, the lines are separated by semicolon (;)
  aFields={cShortName,cField,cPicture,lTotal,cSubtotal} where:
    cShortName report column header
    cField database field to print
    cPicture output mask for cField
    lTotal sets the field to be totaled
    cSubTotal sets the field to subtotal according to
  cBottom final (Bottom) report text, lines of which are semicolon (;)
    separated.
  lOnlyTotals default is false, i.e. standart (full) report.
    is is true, then report will be contain only subtotals and totals.

!short:  method New=ViewNew              //o:New() --> self --> self
^BView:New()^N: public: return self
  The object is filled with default values.

!short:  method Copy=ViewCopy            //o:Copy() --> copy_of_current_view_object
^BView:Copy()^N:public: return copy_of_self
  Returns a current copy of this class object.

!short:  method CreateObj=ViewCreateObj  //o:CreateObj() --> new_object_of_this_class
^BView:CreateObj()^N:public: return new_self_of_this_class
   Returns new object of this class.

!short:  method Init=ViewInit            //o:Init() --> true
^BView:Init()^N: public: return true
  Object internal init.

!short:  method Select=ViewSelect        //o:Select(cAlias) --> true
^BView:Select(cAlias)^N: public: return true
  Select of active database, when object is active.

!short:  method DefWindow=ViewDefWindow  //o:DefWindow(Name,R,C,Rs,Cs,Clr) --> true
^BView:DefWindow()^N:public: return true
  Object window size (fill of instavar variables)

!short:  method AddBlock=ViewAddBlock    //o:AddBlock(cLongNm,cShortNm,cVarNm,bBlock,bDoGet,cPict,bWhen,bValid) --> true
^BView:AddBlock(LongName,ShortName,VarName,Block,DoGet,Pict,When,Valid)^N:
  public: return true
  Next column appended to the object by a code block. When editing it is not
  tested the record virtuality, the records with je RecNo()>LastRec() can be
  edited.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^ULongName^N: character: default is ShortName
   Column name used in mode of Form(ular).

  ^UShortName^N: character: default is ""
   Column name used in mode of Browse.

  ^UVarName^N: character: default is ShortName
   Edited variable name, or database fieldname stored as an information to clipper
   Get object, created in this method and stored to DoGet array. The clipper get object
   should know the edited variable name.

  ^UBlock^N: code_block: no default
   Get/set code block created by the functions FieldBlock(), FieldWBlock(), MemVarBlock() or
   own code piece.

  ^UDoGet^N: code_block: default is virtual_method_Browse:DoGet()
   Code block to edit the column respective variable with use of the Get object.

  ^UPicture^N: character: default is ""
   The column picture display mask.

  ^UWhen^N: code_block: default is {||true}
   Code block to be evaluated before the entering the column editation.
   If false the editation is disabled. The result fields or read-only
   fields can be produced this way.

  ^UValid^N: code_block: default is {||true}
   Code block to validate the entered data, if the result is true the data
   is valid, if false the entered data must be reedited.

!short:  method AddMemo=ViewAddMemo      //o:AddMemo(cLongNm,cShortNm,cField,bWhen,bValid,nRowSize,nColSize) --> true
^BView:AddMemo(cLongName,cShortName,cField,bWhen,bValid,nRowSize,nColSize)^N:
  public: return true
  The object is appended with next column defined as memo field.
  The virtuality is tested, it is not allowed to edit the fields
  with RecNo()>LastRec().

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^ULongName^N: character: default is ShortName
   Column name used in mode of  Form(ular).

  ^UShortName^N: character: default is ""
   Column name used in mode of Browse.

  ^UcField^N: character: no default
   Full memo field name (field->name),
   if no prefix used, it is taken from instvar variable View:Alias.

  ^UWhen^N: code_block: default is {||true}
   Code block to be evaluated before the entering the column editation.
   If false the editation is disabled. The result fields or read-only fields
   can be produced this way.

  ^UValid^N: code_block: default is {||true}
   Code block to validate the entered data, if the result is true the data
   is valid, if false the entered data must be reedited.

  ^UnRowSize^N: numeric: default is MaxRow()/3
   The MemoEdit window height as row number.

  ^UnColSize^N: numeric: default is MaxCol()/2
   The MemoEdit window width as column number.

!short:  method AddField=ViewAddField    //o:AddField(cLongNm,cShortNm,cField,cPict,bWhen,bValid) --> true
^BView:AddField(LongName,ShortName,Field,Picture,When,Valid)^N:
  public: return true
  The object is appended with next column defined as database field.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^ULongName^N: character: default is ShortName
   Column name used in mode of  Form(ular).

  ^UShortName^N: character: default is ""
   Column name used in mode of  Browse.

  ^UcField^N: character: no default.
   Full memo field name (field->name),
   if no prefix used, it is taken from instvar variable View:Alias.

  ^UcPicture^N: character: default is ""
   The column picture display mask.

  ^UWhen^N: code_block: default is {||true}
   Code block to be evaluated before the entering the column editation.
   If false the editation is disabled. The result fields or read-only
   fields can be produced this way.

  ^UValid^N: code_block: default is {||true}
   Code block to validate the entered data, if the result is true the data
   is valid, if false the entered data must be reedited.

  ^UnRowSize^N: numeric: default is MaxRow()/3
   The MemoEdit window height as row number.

  ^UnColSize^N: numeric: default is MaxCol()/2
   The MemoEdit window width as column number.

!short:  method AddFilter=ViewAddFilter  //o:AddFilter(cName,cExpr,lMark) --> true
^BView:AddFilter(cName,cExpr)^N: public: return true
  Programmer defined filter.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcName^N: character: no default.
   Filter name to display as menu item name. The prefix ~ sets the hilited
   character to be accelerator for menu item selection speeding up.

  ^UcExpr^N: character: no default.
   The filter expression

!short:  method AddRAll=ViewAddRAll      //o:AddRAll(cName,cTop,aFields,cBottom,lOnlyTotals) --> true
^BView:AddRAll(cName,cTop,aFields,cBottom,lOnlyTotals)^N: public: return true
  One command report definition append.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcName^N is report name to diplay as a menu item, the prefix ~
  sets the hilited character to be the accelerator for
  menu item selection speeding up.

  ^UcTop^N is report header, each row is semicolon separated.

  ^UaFields^N={cShortName,cField,cPicture,lTotal,cSubtotal} kde:
   cShortName is report column header
   cField is database field to print
   cPicture is cField output picture mask
   lTotal sets the field to be totaled
   cSubTotal sets the field to total according to

  ^UcBottom^N is final report text, each line to be semicolon separated.

!short:  method AddReport=ViewAddReport  //o:AddReport(cName,lOnlyTotals) --> true
^BView:AddReport(cName,lOnlyTotals)^N: public: return true
   Begin of programmer defined report.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UcName^N is report header name, to be displayed as menu item, the
   prefix ~ is to set the hilited character to be the accelerator key,
   for speeding up the menu selection.

!short:  method AddRTop=ViewAddRTop      //o:AddRTop(cTop) --> true
^BView:AddRTop(cTop)^N: public: return true
  Continues in programmer defining of a report.
  cTop report header, the lines are semicolon separated

!short:  method AddRField=ViewAddRField  //o:AddRField(cTitle,aField,cPict,lTot,cSubT) --> true
^BView:AddRField(cTitle,cField,cPicture,lTotal,cSubTotal)^N:
  public: return true
  Continues in programmer defining of a report.
  cTitle: character: default is cField, the report column header
  cField: character: no default.
   contain full name of database field that must be printed (alias->filed)
   if isn't full name (only field part exist) then alias will be instvar
   variable View:Alias.
  cPicture: character: no default.
   Output picture mask for cField.
  lTotal: logical: default is false, sets the field to be totaled
  cSubTotal: character: default is "", sets the field to make subtotal
   according to.

!short:  method AddRBottom=ViewAddRBotto //o:AddRBottom(cBottom) --> true
^BView:AddRBottom(cBottom)^N: public: return true                                  
  Continues in programmer report definition.
  cBottom is final report text, each line to be semicolon separated.

!short:  method AddAction=ViewAddAction  //o:AddAction(nKey,bProcedure,cInfo) --> true
^BView:AddAction(nKey,bFunction,cShortInfo)^N: public: return true
  Own hot keys definition for this object, and their assigned functions
  definition, for performing these functions with a single keypress.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UnKey^N: numeric: no default.
   It is InKey() code of a "hot key"

  ^UbFunction^N: code_block: no default.
   Code block to be performed after a hot key is pressed.

  ^UcShortInfo^N: character: default is ""
   It is short help text, to be apended to a dialog line, to inform
   about the hot key.

!short:  method View=ViewView            //o:View(ID,Name,R,C,Rs,Cs,Clr,Shd) --> true
^BView:View(ID,Name,R,C,Rs,Cs,Clr,Shadow)^N: public: return true
  Copy of an object is created, default initialised as a view object,
  painted to the screen and started as the task.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UID^N: numeric no default.
   It is a menu item number to start this method, for compatibility of menu system.

  ^UName^N: text or code block: default is {||""}, no title.
   Text or code block as window title.

  ^UR^N: numeric: default is 3.
   Top window border.

  ^UC^N: numeric: default is 4.
   Left window border.

  ^URs^N: numeric: default is MaxRow()-7.
   Window height in number of rows to fit in.

  ^UCs^N: numeric: default is MaxCol()-9.
   Window width in number of columns to fit in.

  ^UClr^N: character: default is m->Color:Edit.
   Window colors.

  ^UShadow^N: logical: default is true for color monitor, false for monochrom.
   If true, the shadow will be painted.

!short:  method Edit=ViewEdit            //o:Edit(ID,Name,R,C,Rs,Cs,Clr,Shd) --> true
^BView:Edit(ID,Name,R,C,Rs,Cs,Clr,Shadow)^N: public: return true
  The same as View:View, but instead of view object is edit object created.

!short:  method ViewEdit=ViewViewEdit    //o:ViewEdit(ID,Name,R,C,Rs,Cs,Clr,Shd) --> true
^BView:ViewEdit(ID,Name,R,C,Rs,Cs,Clr,Shadow)^N: public: return true
  It is the initialising method of an new edit or view object. Use it
  to make your own object copies.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  the same as in View:View

!short:  method Goto=ViewGoto            //o:Goto(ID,Name,R,C,Rs,Cs,Clr,Shd) --> true
^BView:Goto(ID,Name,R,C,Rs,Cs,Clr,Shadow)^N: public: return true
  Jumps to user entered current database record number.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  the same as in View:View

!short:  method Locate=ViewLocate        //o:Locate(ID,Name,R,C,Rs,Cs,Clr,Shd) --> true
^BView:Locate^N: public: return true
  Searches from current record to the end of file in selected field
  for a substring.

!short:  method PreGoto=ViewPreGoto      //o:PreGoto(Menu,MdId) --> true
^BView:PreGoto(Menu,MdId)^N: public: return true
  Prevalid (when) function called from a menu to validate the atempt
  of method View:Goto() activation.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UMenu^N: object_of_Menu: no default.
   Menu which requests the validity test and sends self to the method.

  ^UMdId^N: numeric: no default.
   The MenuDataID number for setting the data structure of Menu object to
   prevalidate.

!short:  method PostGoto=ViewPostGoto    //o:PostGoto(Menu,MdId) --> true
^BView:PostGoto(Menu,MdId)^N: public: return true
  The postvalid function to be prformed after the finish of View:GoTo()
  method, to enable (if disabled by PreGoto() method) the method View:GoTo()
  activation.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  ^UMenu^N: object_of_Menu: no default.
   Menu that requested the validation sends self to the method.

  ^UMdId^N: numeric: no default.
   It is the MenuDataID number to set the Menu object data structure
   that needs the postvalidation.

!short:  method SetIndex=ViewSetIndex    //o:SetIndex(ID,R,C,CurSize,Clr,Shd) --> true
^BView:SetIndex(ID,R,C,CurSize,Clr,Shadow)^N: public: return true
  Selects the programmer defined or user runtime defined index, to be active.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  the same as in View:View

!short:  method SetFilter=ViewSetFilter  //o:SetFilter(ID,R,C,CurSize,Clr,Shd) --> true
^BView:SetFilter(ID,R,C,CurSize,Clr,Shadow)^N: public: return true
  Selects the programmer defined or user runtime defined filter, to be active.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  the same as in View:View

!short:  method SetReport=ViewSetReport  //o:SetReport(ID,WinNam,R,C,CurSize,Clr,Shd) --> true
^BView:SetReport(ID,WinName,R,C,CurSize,Clr,Shadow)^N: public: return true
  Selects the programmer defined or user runtime defined report, to be active.
  The report file is generated, it can be viewed and printed to produce
  a report.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  the same as in View:View

!short:  method ModIndex=ViewModIndex    //o:ModIndex(ID,WinNam,R,C,CurSize,Clr,Shd) --> true
^BView:ModIndex(ID,WinName,R,C,CurSize,Clr,Shadow)^N: public: return true
  User is enabled to create its own index and append it to other ones.
  He is enabled to modify himself created indexes and to delete them.
  The new index creation is performed in a child process, activated
  from a main menu or from a class view local menu. This child process,
  is assigned the indenpendent help process to, about how to create a new
  index. When finishing the child process, this process is finished too.

  Parameter description:
  ~~~~~~~~~~~~~~~~~~~~~~
  the same as in View:View

!short:  method ModFilter=ViewModFilter  //o:ModFilter(ID,WinNam,R,C,CurSize,Clr,Shd) --> true
^BView:ModFilter(ID,WinName,R,C,CurSize,Clr,Shadow)^N: public: return true
  The same as in ModIndex but handles the filter definitions.

!short:  method ModReport=ViewModReport  //o:ModReport(ID,WinNam,R,C,CurSize,Clr,Shd) --> true
^BView:ModReport(ID,WinName,R,C,CurSize,Clr,Shadow)^N: public: return true
  The same as in ModIndex but handles the report definitions and the help
  process is not created.

!short:  method VProcess=ViewVProcess    //o:VProcess() --> true
^BView:VProcess()^N: private: return true
  The parent VProcess() definition is apended with a activation
  and deactivation of object hot keys.

!short:  method Done=ViewDone            //o:Done(lRePaint) --> true
^BView:Done(lRePaint)^N: private: return true
  The parent Done() method is apended with current view objects stack top
  object erase. Pay attention that this is not class task stack.
  The view class maintains its own stack of view objects for index,
  filter and report enabling, disabling and modifiing maintenance.

!short:  private:
!short:  method EndViewEdit=ViewEndViewEdit    //o:EndViewEdit() --> true
^BView:EndViewEdit^N: public: return true
  The necessary object copy update is performed before activating of the
  VProcess(). The multiple opening of the same window must have the same
  index, filter and report definitions for all copies of the same object.
  Therefore the created object copy must be updated to have the definition
  storing fields not to be a copies (by AClone()), but only a pointers
  assigned to the same fields for all copies of an object.

!short:  endclass

