home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / OPHPCK.ZIP / OPHPICK.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1992-11-20  |  15.2 KB  |  474 lines

  1. {$R-,S-,I-,V-,B-,F+,O+,A-}
  2.  
  3. {Conditional defines that may affect this unit}
  4. {$I OPDEFINE.INC}
  5.  
  6. {*********************************************************}
  7. {*                   OPHPICK.PAS 1.03                    *}
  8. {*      Copyright (c) TurboPower Software 1987,1989.     *}
  9. {*                 All rights reserved.                  *}
  10. {*********************************************************}
  11.  
  12. unit OpHPick;
  13.   {-Single column pick with horizontal scroll}
  14.  
  15. interface
  16.  
  17. uses
  18.   OpInline,
  19.   OpString,
  20.   {$IFDEF OPro12}
  21.   OpConst,
  22.   {$ENDIF}
  23.   OpRoot,
  24.   OpCrt,
  25.   {$IFDEF UseMouse}
  26.   OpMouse,
  27.   {$ENDIF}
  28.   OpCmd,
  29.   OpFrame,
  30.   OpWindow,
  31.   {$IFDEF UseDrag}
  32.   OpDrag,
  33.   {$ENDIF}
  34.   OpPick;
  35.  
  36.   {.F-}
  37. const
  38.   {Stream codes}
  39.   otHPickList      = 300;
  40.   veHPickList      = 00;
  41.   ptNoHPickString  = 300;
  42.  
  43. type
  44.   HPickListPtr     = ^HPickList;
  45.  
  46.   hpStringProc     =
  47.     procedure (Item : Word;
  48.                Mode : pkMode;
  49.                HScroll : Word;    {Horizontal scroll offset}
  50.                var IType : pkItemType;
  51.                var IString : String;
  52.                HPickPtr : HPickListPtr);
  53.  
  54.   HPickList        =
  55.     object(PickList)
  56.       hpScroll     : Word;              {Scroll offset}
  57.       hpMaxCols    : Word;              {Maximum columns in each item}
  58.       hpString     : hpStringProc;      {String procedure}
  59.       hpSetScroll  : pkSetScrollProc;   {Saved scroll procedure}
  60.  
  61.       constructor Init(X1, Y1, X2, Y2 : Byte;
  62.                        MaxItemWidth : Word;
  63.                        NumItems : Word;
  64.                        StringProc : hpStringProc;
  65.                        CommandHandler : pkGenlProc);
  66.         {-Initialize a pick window}
  67.       constructor InitCustom(X1, Y1, X2, Y2 : Byte;
  68.                              var Colors : ColorSet;
  69.                              Options : LongInt;
  70.                              MaxItemWidth : Word;
  71.                              NumItems : Word;
  72.                              StringProc : hpStringProc;
  73.                              CommandHandler : pkGenlProc);
  74.         {-Initialize a pick window with custom window options}
  75.       constructor InitAbstract(X1, Y1, X2, Y2 : Byte;
  76.                                var Colors : ColorSet;
  77.                                Options : LongInt;
  78.                                MaxItemWidth : Word;
  79.                                NumItems : Word;
  80.                                CommandHandler : pkGenlProc);
  81.          {-Constructor to be called by derived types that override
  82.            the ItemString method}
  83.       constructor InitDeluxe(X1, Y1, X2, Y2 : Byte;
  84.                              var Colors : ColorSet;
  85.                              Options : LongInt;
  86.                              MaxItemWidth : Word;
  87.                              NumItems : Word;
  88.                              StringProc : hpStringProc;
  89.                              CommandHandler : pkGenlProc;
  90.                              PickOptions : Word);
  91.         {-Initialize a pick window with custom window and pick options}
  92.       constructor InitAbstractDeluxe(X1, Y1, X2, Y2 : Byte;
  93.                                      var Colors : ColorSet;
  94.                                      Options : LongInt;
  95.                                      MaxItemWidth : Word;
  96.                                      NumItems : Word;
  97.                                      CommandHandler : pkGenlProc;
  98.                                      PickOptions : Word);
  99.          {-Constructor to be called by derived types that override the
  100.            HItemString method, with custom pick options}
  101.  
  102.       function GetCurrentCol : Word;
  103.         {-Get column currently displayed at left edge of window}
  104.       function GetMaxWidth : Word;
  105.         {-Get the maximum number of columns in any string}
  106.       procedure SetMaxWidth(MaxItemWidth : Word);
  107.         {-Change the maximum number of columns in any string}
  108.  
  109.       procedure ItemString(Item : Word; Mode : pkMode;
  110.                            var IType : pkItemType;
  111.                            var IString : String); virtual;
  112.         {-Overrides picklist ItemString}
  113.       procedure HItemString(Item : Word;
  114.                             Mode : pkMode;
  115.                             HScroll : Word;    {Horizontal scroll offset}
  116.                             var IType : pkItemType;
  117.                             var IString : String); virtual;
  118.         {-Returns item string}
  119.  
  120.     {$IFDEF UseStreams}
  121.       constructor Load(var S : IdStream);
  122.         {-Load a pick list from a stream}
  123.       procedure Store(var S : IdStream);
  124.         {-Store a pick list in a stream}
  125.     {$ENDIF}
  126.  
  127.       {.Z+}
  128.       {$IFDEF UseAdjustableWindows}
  129.       procedure AdjustWindow(X1, Y1, X2, Y2 : Word); virtual;
  130.       {$ENDIF}
  131.       procedure hpSetPrimMoves;
  132.       {.Z-}
  133.     end;
  134.   {.F+}
  135.  
  136.   procedure NoHPickString(Item : Word; Mode : pkMode; HScroll : Word;
  137.                           var IType : pkItemType; var IString : String;
  138.                           HPickPtr : HPickListPtr);
  139.     {-Dummy string procedure used for HPickList derivatives}
  140.  
  141. {$IFDEF UseStreams}
  142.   {---- Stream registration ----}
  143.   procedure HPickListStream(SPtr : IdStreamPtr);
  144.     {-Register all types needed for streams containing h-pick lists}
  145. {$ENDIF}
  146.  
  147.   {====================================================================}
  148.  
  149. implementation
  150.  
  151. {$F+}
  152. procedure ReinitHPick(P : PickListPtr);
  153.   {-Reinitialize some fields based on width, height and orientation}
  154. var
  155.   MaxHz : Word;
  156. begin
  157.   with HPickListPtr(P)^ do begin
  158.     {pkMaxFirst controls how much vertical scrolling, if any, is possible}
  159.     pkMaxFirst := pkItemRows-pkHeight+1;
  160.     {Amount to change pkFirst by when scrolling}
  161.     pkScroll := 1;
  162.     {$IFDEF UseScrollBars}
  163.     {Set up for scroll bars}
  164.     if hpMaxCols <= Width then
  165.       MaxHz := 0
  166.     else
  167.       MaxHz := hpMaxCols-Width;
  168.     ChangeAllScrollBars(0, MaxHz, 1, pkItemRows);
  169.     {$ENDIF}
  170.   end;
  171. end;
  172.  
  173. procedure LeftAction(P : PickListPtr);
  174.   {-Handle left arrow movements}
  175. begin
  176.   with HPickListPtr(P)^ do
  177.     if hpScroll > 0 then begin
  178.       dec(hpScroll);
  179.       SetFlag(pkSecFlags, pkRedrawPage);
  180.     end;
  181. end;
  182.  
  183. procedure RightAction(P : PickListPtr);
  184.   {-Handle right arrow movements}
  185. begin
  186.   with HPickListPtr(P)^ do
  187.     if hpScroll+Width < hpMaxCols then begin
  188.       inc(hpScroll);
  189.       SetFlag(pkSecFlags, pkRedrawPage);
  190.     end;
  191. end;
  192.  
  193. {$IFDEF UseScrollBars}
  194. procedure UpdScrollHPick(P : PickListPtr);
  195.   {-Update scroll bars for vertical orientation}
  196. begin
  197.   with HPickListPtr(P)^ do
  198.     DrawAllSliders(hpScroll, pkFirst+pkRow-1);
  199. end;
  200.  
  201. procedure SetScrollHPick(FramePos : FramePosType;
  202.                          MPosX, MPosY : Byte;
  203.                          UserVal : LongInt; P : PickListPtr);
  204.   {-Set pick position based on slider position}
  205. var
  206.   nScroll : Word;
  207. begin
  208.   with HPickListPtr(P)^ do begin
  209.     case FramePos of
  210.       frLL, frRR :   {Vertical scroll bar}
  211.         {Let PickList handle it}
  212.         hpSetScroll(FramePos, MPosX, MPosY, UserVal, P);
  213.     else
  214.       {Horizontal scroll bar}
  215.       if Width < hpMaxCols then begin
  216.         UserVal := TweakSlider(FramePos, MPosX, UserVal, 1);
  217.         if UserVal <= 0 then
  218.           nScroll := 0
  219.         else if UserVal > hpMaxCols-Width then
  220.           nScroll := hpMaxCols-Width
  221.         else
  222.           nScroll := UserVal;
  223.         if nScroll <> hpScroll then begin
  224.           hpScroll := nScroll;
  225.           SetFlag(pkSecFlags, pkRedrawPage);
  226.         end;
  227.       end;
  228.     end;
  229.   end;
  230. end;
  231. {$ENDIF}
  232.  
  233. procedure NoPickString(Item : Word;
  234.                        Mode : pkMode;
  235.                        var IType : pkItemType;
  236.                        var IString : String;
  237.                        PickPtr : PickListPtr);
  238.   {-Default user string proc must be overridden}
  239. begin
  240.   Abstract;
  241. end;
  242.  
  243. procedure NoHPickString(Item : Word; Mode : pkMode; HScroll : Word;
  244.                         var IType : pkItemType; var IString : String;
  245.                         HPickPtr : HPickListPtr);
  246.   {-Dummy string procedure used for HPickList derivatives}
  247. begin
  248.   Abstract;
  249. end;
  250. {$F-}
  251.  
  252. procedure HPickList.hpSetPrimMoves;
  253.   {-Take over primitive move functions from PickList}
  254. begin
  255.   pkReinit := ReinitHPick;
  256.   pkPrimMoves[LeftTop] := LeftAction;
  257.   pkPrimMoves[LeftMiddle] := LeftAction;
  258.   pkPrimMoves[LeftBottom] := LeftAction;
  259.   pkPrimMoves[RightTop] := RightAction;
  260.   pkPrimMoves[RightMiddle] := RightAction;
  261.   pkPrimMoves[RightBottom] := RightAction;
  262.   {$IFDEF UseScrollBars}
  263.   pkUpdScrBar := UpdScrollHPick;
  264.   hpSetScroll := pkSetScroll; {Save value to call}
  265.   pkSetScroll := SetScrollHPick;
  266.   {$ENDIF}
  267. end;
  268.  
  269. constructor HPickList.Init(X1, Y1, X2, Y2 : Byte;
  270.                            MaxItemWidth : Word;
  271.                            NumItems : Word;
  272.                            StringProc : hpStringProc;
  273.                            CommandHandler : pkGenlProc);
  274.   {-Initialize a pick window}
  275. begin
  276.   if not HPickList.InitDeluxe(X1, Y1, X2, Y2,
  277.                               DefaultColorSet, DefWindowOptions,
  278.                               MaxItemWidth, NumItems,
  279.                               StringProc, CommandHandler, DefPickOptions) then
  280.     Fail;
  281. end;
  282.  
  283. constructor HPickList.InitCustom(X1, Y1, X2, Y2 : Byte;
  284.                                  var Colors : ColorSet;
  285.                                  Options : LongInt;
  286.                                  MaxItemWidth : Word;
  287.                                  NumItems : Word;
  288.                                  StringProc : hpStringProc;
  289.                                  CommandHandler : pkGenlProc);
  290.   {-Initialize a pick window with custom window options}
  291. begin
  292.   if not HPickList.InitDeluxe(X1, Y1, X2, Y2,
  293.                               Colors, Options,
  294.                               MaxItemWidth, NumItems,
  295.                               StringProc, CommandHandler, DefPickOptions) then
  296.     Fail;
  297. end;
  298.  
  299. constructor HPickList.InitAbstract(X1, Y1, X2, Y2 : Byte;
  300.                                    var Colors : ColorSet;
  301.                                    Options : LongInt;
  302.                                    MaxItemWidth : Word;
  303.                                    NumItems : Word;
  304.                                    CommandHandler : pkGenlProc);
  305.    {-Constructor to be called by derived types that override
  306.      the ItemString method}
  307. begin
  308.   if not HPickList.InitDeluxe(X1, Y1, X2, Y2,
  309.                               Colors, Options,
  310.                               MaxItemWidth, NumItems,
  311.                               NoHPickString,
  312.                               CommandHandler, DefPickOptions) then
  313.     Fail;
  314. end;
  315.  
  316. constructor HPickList.InitDeluxe(X1, Y1, X2, Y2 : Byte;
  317.                                  var Colors : ColorSet;
  318.                                  Options : LongInt;
  319.                                  MaxItemWidth : Word;
  320.                                  NumItems : Word;
  321.                                  StringProc : hpStringProc;
  322.                                  CommandHandler : pkGenlProc;
  323.                                  PickOptions : Word);
  324.   {-Initialize a pick window with custom window and pick options}
  325. begin
  326.   hpScroll := 0;
  327.   hpString := StringProc;
  328.   hpMaxCols := MaxItemWidth;
  329.   if not PickList.InitDeluxe(X1, Y1, X2, Y2,
  330.                              Colors, Options,
  331.                              X2-X1+1, NumItems,
  332.                              NoPickString, PickVertical,
  333.                              CommandHandler, PickOptions) then
  334.     Fail;
  335.  
  336.   {Take over some primitive move functions from pick list}
  337.   hpSetPrimMoves;
  338.  
  339. end;
  340.  
  341. constructor HPickList.InitAbstractDeluxe(X1, Y1, X2, Y2 : Byte;
  342.                                          var Colors : ColorSet;
  343.                                          Options : LongInt;
  344.                                          MaxItemWidth : Word;
  345.                                          NumItems : Word;
  346.                                          CommandHandler : pkGenlProc;
  347.                                          PickOptions : Word);
  348.    {-Constructor to be called by derived types that override the
  349.      HItemString method, with custom pick options}
  350. begin
  351.   if not HPickList.InitDeluxe(X1, Y1, X2, Y2,
  352.                               Colors, Options,
  353.                               MaxItemWidth, NumItems,
  354.                               NoHPickString,
  355.                               CommandHandler, PickOptions) then
  356.     Fail;
  357. end;
  358.  
  359. function HPickList.GetCurrentCol : Word;
  360.   {-Get column currently displayed at left edge of window}
  361. begin
  362.   GetCurrentCol := hpScroll+1;
  363. end;
  364.  
  365. function HPickList.GetMaxWidth : Word;
  366.   {-Get the maximum number of columns in any string}
  367. begin
  368.   GetMaxWidth := hpMaxCols;
  369. end;
  370.  
  371. procedure HPickList.SetMaxWidth(MaxItemWidth : Word);
  372.   {-Change the maximum number of columns in any string}
  373. begin
  374.   hpMaxCols := MaxItemWidth;
  375. end;
  376.  
  377. procedure HPickList.ItemString(Item : Word; Mode : pkMode;
  378.                                var IType : pkItemType;
  379.                                var IString : String);
  380.   {-Overrides PickList.ItemString}
  381. begin
  382.   HItemString(Item, Mode, hpScroll, IType, IString);
  383. end;
  384.  
  385. procedure HPickList.HItemString(Item : Word;
  386.                                 Mode : pkMode;
  387.                                 HScroll : Word;    {Horizontal scroll offset}
  388.                                 var IType : pkItemType;
  389.                                 var IString : String);
  390.   {-Returns item string}
  391. begin
  392.   hpString(Item, Mode, HScroll, IType, IString, @Self);
  393. end;
  394.  
  395. {$IFDEF UseAdjustableWindows}
  396. procedure HPickList.AdjustWindow(X1, Y1, X2, Y2 : Word);
  397. begin
  398.   {Always treat each item as full window width}
  399.   pkItemWidth := X2-X1+1;
  400.   pkReqdWidth := pkItemWidth;
  401.  
  402.   {Adjust scroll if needed}
  403.   if hpMaxCols-hpScroll < pkItemWidth then begin
  404.     if hpMaxCols < pkItemWidth then
  405.       hpScroll := 0
  406.     else
  407.       hpScroll := hpMaxCols-pkItemWidth;
  408.   end;
  409.  
  410.   PickList.AdjustWindow(X1, Y1, X2, Y2);
  411.  
  412.   {In case of error}
  413.   pkItemWidth := Width;
  414.   pkReqdWidth := pkItemWidth;
  415. end;
  416. {$ENDIF}
  417.  
  418.  
  419. {$IFDEF UseStreams}
  420. constructor HPickList.Load(var S : IdStream);
  421.   {-Load a pick list from a stream}
  422. begin
  423.   {Load the underlying pick list}
  424.   if not PickList.Load(S) then
  425.     Fail;
  426.  
  427.   {Read data specific to the h-pick list}
  428.   S.ReadRange(hpScroll, hpString);
  429.  
  430.   {Read the user routine}
  431.   @hpString := S.ReadUserPointer(@NoHPickString);
  432.  
  433.   if S.PeekStatus <> 0 then begin
  434.     Done;
  435.     Fail;
  436.   end;
  437.  
  438.   {Take over primitive move functions}
  439.   hpSetPrimMoves;
  440. end;
  441.  
  442. procedure HPickList.Store(var S : IdStream);
  443.   {-Store a pick list in a stream}
  444. begin
  445.   {Store the underlying pick list}
  446.   PickList.Store(S);
  447.   if S.PeekStatus <> 0 then
  448.     Exit;
  449.  
  450.   {Write data specific to the h-pick list}
  451.   S.WriteRange(hpScroll, hpString);
  452.  
  453.   {Write the user-provided routine}
  454.   S.WriteUserPointer(@hpString, ptNoHPickString);
  455. end;
  456.  
  457. procedure HPickListStream(SPtr : IdStreamPtr);
  458.   {-Register all types needed for streams containing h-pick lists}
  459. begin
  460.   PickListStream(SPtr);
  461.   with SPtr^ do begin
  462.     RegisterType(otHPickList, veHPickList, TypeOf(HPickList),
  463.                  @HPickList.Store, @HPickList.Load);
  464.     RegisterPointer(ptNoHPickString, @NoHPickString);
  465.     RegisterPointer(ptPickVertical, @PickVertical);
  466.   end;
  467. end;
  468. {$ENDIF}
  469.  
  470. {$IFDEF InitAllUnits}
  471. begin
  472. {$ENDIF}
  473. end.
  474.