unit fConsultBS;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ORCtrls, StdCtrls, ORFn, ComCtrls, uConsults;

type
  TfrmConsultsByService = class(TForm)
    pnlBase: TORAutoPanel;
    lblService: TLabel;
    radSort: TRadioGroup;
    cmdOK: TButton;
    cmdCancel: TButton;
    treService: TORTreeView;
    cboService: TORComboBox;
    procedure cmdCancelClick(Sender: TObject);
    procedure cmdOKClick(Sender: TObject);
    procedure treServiceChange(Sender: TObject; Node: TTreeNode);
    procedure cboServiceSelect(Sender: TObject);
  private
    FChanged: Boolean;
    FService: string;
    FServiceName: string;
    FAscending: Boolean;
    fConsultUser: boolean ;
  end;

  TServiceContext = record
    Changed: Boolean;
    Service: string;
    ServiceName: string;
    Ascending: Boolean;
    ConsultUser: Boolean ;
  end;

function SelectService(FontSize: Integer; CurrentContext: TSelectContext; var ServiceContext: TServiceContext): boolean;

implementation

{$R *.DFM}

uses rConsults, rCore, uCore;

var
  SvcList: TStrings ;
  SvcInfo: string ;
  uChanging: Boolean;

const
  TX_SVC_TEXT = 'Select a consult service or press Cancel.';
  TX_SVC_CAP = 'Missing Service';

function SelectService(FontSize: Integer; CurrentContext: TSelectContext; var ServiceContext: TServiceContext): boolean;
{ displays service select form for consults and returns a record of the selection }
var
  frmConsultsByService: TfrmConsultsByService;
  W, H, i: Integer;
  CurrentService: string;
begin
  frmConsultsByService := TfrmConsultsByService.Create(Application);
  try
    with frmConsultsByService do
    begin
      Font.Size := FontSize;
      W := ClientWidth;
      H := ClientHeight;
      ResizeToFont(FontSize, W, H);
      ClientWidth  := W; pnlBase.Width  := W;
      ClientHeight := H; pnlBase.Height := H;
      FChanged := False;
      //SvcList.Assign(LoadServiceList(CN_SVC_LIST_DISP));                         {RV}
      SvcList.Assign(LoadServiceListWithSynonyms(CN_SVC_LIST_DISP));             {RV}
      SortByPiece(TStringList(SvcList), U, 2);                                   {RV}
      for i := 0 to SvcList.Count - 1 do
        if cboService.Items.IndexOf(Trim(Piece(SvcList.Strings[i], U, 2))) = -1 then   {RV}
        //if cboService.SelectByID(Piece(SvcList.Strings[i], U, 1)) = -1 then
          cboService.Items.Add(SvcList.Strings[i]);
      BuildServiceTree(treService, SvcList, '0', nil) ;
      with treService do
        for i := 0 to Items.Count-1 do
          begin
            if Items[i].Level > 0 then Items[i].Expanded := False else Items[i].Expanded := True;
            TopItem := Items[0] ;
            Selected := Items[0] ;
          end ;
      FAscending := CurrentContext.Ascending;
      radSort.ItemIndex := Ord(not FAscending);
      CurrentService := CurrentContext.Service;
      if StrToIntDef(CurrentService, 0) > 0 then
        begin
          cboservice.SelectByID(CurrentService);
          cboServiceSelect(frmConsultsByService);
        end;
      ShowModal;
      with ServiceContext do
      begin
        Changed := FChanged;
        Service := FService;
        ServiceName := FServiceName;
        Ascending := FAscending;
        ConsultUser := FConsultUser ;
        Result := Changed ;
      end; {with ServiceContext}
    end; {with frmConsultsByService}
  finally
    frmConsultsByService.Release;
  end;
end;

procedure TfrmConsultsByService.cmdCancelClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmConsultsByService.cmdOKClick(Sender: TObject);
begin
  if (treService.Selected = nil) and (StrToIntDef(FService, 0) = 0 ) then
  begin
    InfoBox(TX_SVC_TEXT, TX_SVC_CAP, MB_OK or MB_ICONWARNING);
    Exit;
  end;
  FChanged     := True;
  FService     := Piece(SvcInfo,u,1);
  FServiceName := Piece(SvcInfo,u,2) ;
  FAscending   := (radSort.ItemIndex = 0);
  FConsultUser := ConsultServiceUser(StrToIntDef(FService, 0), User.DUZ) ;
  Close;
end;

procedure TfrmConsultsByService.treServiceChange(Sender: TObject;
  Node: TTreeNode);
begin
   if uChanging then Exit;
   SvcInfo  := TORTreeNode(treService.Selected).StringData ;
   cboService.ItemIndex := cboService.Items.IndexOf(Trim(treService.Selected.Text));  {RV}
   //cboService.SelectByID(Piece(string(treService.Selected.Data), U, 1));
end;

procedure TfrmConsultsByService.cboServiceSelect(Sender: TObject);
var
  i: integer;
begin                                                                    
  uChanging := True;
  with treService do for i := 0 to Items.Count-1 do
    begin                                                                
      if Piece(TORTreeNode(Items[i]).StringData, U, 1) = cboService.ItemID then
        begin                                                            
          Selected := Items[i];                                          
          //treServiceChange(Self, Items[i]);                              
          break;                                                         
        end;                                                             
    end;
  uChanging := False;
  SvcInfo  := TORTreeNode(treService.Selected).StringData ;
end;

initialization
   SvcList := TStringList.Create ;

finalization
   SvcList.Free ;

end.
