home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 October / PCWorld_2000-10_cd2.bin / Borland / interbase / IBConsole_src.ZIP / ibconsole / frmuObjectWindow.pas < prev    next >
Pascal/Delphi Source File  |  2000-07-24  |  41KB  |  1,404 lines

  1. {
  2.  * The contents of this file are subject to the InterBase Public License
  3.  * Version 1.0 (the "License"); you may not use this file except in
  4.  * compliance with the License.
  5.  * 
  6.  * You may obtain a copy of the License at http://www.Inprise.com/IPL.html.
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS IS"
  9.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  10.  * the License for the specific language governing rights and limitations
  11.  * under the License.  The Original Code was created by Inprise
  12.  * Corporation and its predecessors.
  13.  * 
  14.  * Portions created by Inprise Corporation are Copyright (C) Inprise
  15.  * Corporation. All Rights Reserved.
  16.  * 
  17.  * Contributor(s): ______________________________________.
  18. }
  19.  
  20. unit frmuObjectWindow;
  21.  
  22. interface
  23.  
  24. uses
  25.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  26.   StdCtrls, ToolWin, ComCtrls, ImgList, Buttons, Grids, DBGrids,
  27.   ActnList, Db, ExtCtrls, RichEditX, IBDatabase, IBCustomDataset, DBCtrls,
  28.   IBTable;
  29.  
  30. type
  31.   TTblData = record
  32.     Columns,
  33.     Indexes,
  34.     Triggers,
  35.     CheckConst,
  36.     UniqueConst,
  37.     RefConst: TStringList;
  38.   end;
  39.  
  40.   TProcedureData = record
  41.     Params: TStringList;
  42.     Source: TStringList;
  43.   end;
  44.  
  45.   TFunctionData = record
  46.     Params: TStringList;
  47.     ReturnVal,
  48.     EntryPoint,
  49.     ModuleName: String;
  50.   end;
  51.  
  52.   TTableData = array of TTblData;
  53.   TProcData = array of TProcedureData;
  54.   TFuncData = array of TFunctionData;
  55.  
  56.   TfrmObjectView = class(TForm)
  57.     StatusBar: TStatusBar;
  58.     ToolBar1: TToolBar;
  59.     cbObjectList: TComboBox;
  60.     pgcProperties: TPageControl;
  61.     tabProperties: TTabSheet;
  62.     tabMetadata: TTabSheet;
  63.     tabPermissions: TTabSheet;
  64.     tabData: TTabSheet;
  65.     dbgData: TDBGrid;
  66.     tabDependencies: TTabSheet;
  67.     dbgDataSource: TDataSource;
  68.     btnApply: TButton;
  69.     objControl: TPageControl;
  70.     tabDomains: TTabSheet;
  71.     Label5: TLabel;
  72.     reConstraint: TRichEditX;
  73.     tabTables: TTabSheet;
  74.     ToolBar2: TToolBar;
  75.     tbCols: TToolButton;
  76.     tbTriggers: TToolButton;
  77.     tbChkConst: TToolButton;
  78.     tbIndexes: TToolButton;
  79.     tbUnique: TToolButton;
  80.     TableActions: TActionList;
  81.     ShowColumns: TAction;
  82.     ShowTriggers: TAction;
  83.     ShowCheckConstraints: TAction;
  84.     ShowIndexes: TAction;
  85.     ShowUniqueConstraints: TAction;
  86.     ShowReferentialConstraints: TAction;
  87.     tbRef: TToolButton;
  88.     lvTableObjects: TListView;
  89.     reTriggerSource: TRichEditX;
  90.     tabProcedures: TTabSheet;
  91.     tabFunctions: TTabSheet;
  92.     tabExceptions: TTabSheet;
  93.     tabGenerators: TTabSheet;
  94.     Splitter2: TSplitter;
  95.     reProcSource: TRichEditX;
  96.     lvParams: TListView;
  97.     lvFuncView: TListView;
  98.     tabFilters: TTabSheet;
  99.     Label11: TLabel;
  100.     Label12: TLabel;
  101.     Label13: TLabel;
  102.     Label14: TLabel;
  103.     edFilterModule: TEdit;
  104.     edFilterEntry: TEdit;
  105.     edFilterInput: TEdit;
  106.     edFilterOutput: TEdit;
  107.     Label3: TLabel;
  108.     Label18: TLabel;
  109.     edExceptionNumber: TEdit;
  110.     Label19: TLabel;
  111.     edMessage: TEdit;
  112.     edGenID: TEdit;
  113.     Label21: TLabel;
  114.     edNextValue: TEdit;
  115.     Panel5: TPanel;
  116.     Label8: TLabel;
  117.     Label9: TLabel;
  118.     Label10: TLabel;
  119.     edReturnVal: TEdit;
  120.     edEntrypoint: TEdit;
  121.     edModName: TEdit;
  122.     reMetadata: TRichEditX;
  123.     lvDomains: TListView;
  124.     lblFileName: TLabel;
  125.     SplitterWnd: TSplitter;
  126.     Panel2: TPanel;
  127.     rbDependent: TRadioButton;
  128.     rbDependedOn: TRadioButton;
  129.     pnlDependents: TPanel;
  130.     tvDependents: TTreeView;
  131.     pnlDependencies: TPanel;
  132.     tvDependencies: TTreeView;
  133.     lvPermissions: TListView;
  134.     Panel1: TPanel;
  135.     Image1: TImage;
  136.     Label1: TLabel;
  137.     IBTable: TIBTable;
  138.     DBNavigator1: TDBNavigator;
  139.     procedure cbObjectListChange(Sender: TObject);
  140.     procedure pgcPropertiesChange(Sender: TObject);
  141.     procedure dbgDataCellClick(Column: TColumn);
  142.     procedure dbgDataDrawColumnCell(Sender: TObject; const Rect: TRect;
  143.       DataCol: Integer; Column: TColumn; State: TGridDrawState);
  144.     procedure dbgDataEditButtonClick(Sender: TObject);
  145.     procedure cbGetIndex(Sender: TObject);
  146.     procedure ObjectChange(Sender: TObject);
  147.     procedure ShowColumnsExecute(Sender: TObject);
  148.     procedure ShowTriggersExecute(Sender: TObject);
  149.     procedure ShowObjectSource(Sender: TObject; Item: TListItem;
  150.       Change: TItemChange);
  151.     procedure ShowCheckConstraintsExecute(Sender: TObject);
  152.     procedure ShowIndexesExecute(Sender: TObject);
  153.     procedure ShowUniqueConstraintsExecute(Sender: TObject);
  154.     procedure ShowReferentialConstraintsExecute(Sender: TObject);
  155.     procedure ShowProcSource(Sender: TObject; Item: TListItem;
  156.       Change: TItemChange);
  157.     procedure FormShow(Sender: TObject);
  158.     procedure rbDependentClick(Sender: TObject);
  159.     procedure rbDependedOnClick(Sender: TObject);
  160.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  161.  
  162.   private
  163.     { Private declarations }
  164.     FObjectArray: TStringList;
  165.     FObjNameList: TStringList;
  166.  
  167.     { For displaying Object Information }
  168.     FTableData : TTableData;
  169.     FProcedureData: TProcData;
  170.     FFunctionData: TFuncData;
  171.  
  172.     FRoleData: TStringList;
  173.     FDomainData: TStringList;
  174.     FViewData: TStringList;
  175.     FGenData: TStringList;
  176.     FFilterData: TStringList;
  177.     FExceptionData: TStringList;
  178.  
  179.     FMetadataRefreshList: array of boolean;
  180.     FRefreshList: array of boolean;
  181.     
  182.     FIndex,
  183.     FObjType: Integer;
  184.     FShowSystem: boolean;
  185.     FDatabase: TIBDatabase;
  186.     FDataSet: TIBDataSet;
  187.     FTransaction: TIBTransaction;
  188.     FObjName: String;
  189.     FIdx: Integer;
  190.  
  191.     procedure GetDependencies (const ObjName: String; const ObjType: Integer);
  192.     procedure GetPermissions (const ObjName: String; const ObjType: Integer);
  193.     procedure GetDomainProperties(const ObjName: String);
  194.     procedure GetTableProperties;
  195.     procedure GetProcedureProperties;
  196.     procedure GetFunctionProperties;
  197.     procedure GetFilterProperties;
  198.     procedure GetRoleProperties;
  199.     procedure GetViewProperties;
  200.     procedure GetExceptionProperties;
  201.     procedure GetGeneratorProperties;
  202.     procedure FillList (var ListObject: TListView; const StringList: TStringList);
  203.   public
  204.     { Public declarations }
  205.     constructor Create (AOwner: TComponent); override;
  206.     destructor Destroy; override;
  207.     procedure InitDlg(ObjType: Integer; ObjList: TStringList; ObjName: String;
  208.                       Database: TIBDatabase; ObjIcon: TIcon;
  209.                       const Showsystem, Refetch: boolean);
  210.     procedure Refetch;
  211.   end;
  212.  
  213. var
  214.   frmObjectView: TfrmObjectView;
  215.  
  216. implementation
  217.  
  218. uses
  219.   frmuMessage, frmuDisplayBlob, frmuDispMemo, dmuMain,
  220.   zluUtility, zluGlobal, IBSQL, IBExtract, frmuMain, filectrl, registry;
  221.  
  222. type
  223.   TWinState = record
  224.     _Top,
  225.     _Left,
  226.     _Height,
  227.     _Width: integer;
  228.     _State: TWindowState;
  229.     _Read: boolean;
  230.   end;
  231.  
  232. {$R *.DFM}
  233.  
  234. const
  235.   TAB_DOMAIN = 0;
  236.   TAB_TABLE = 1;
  237.   TAB_PROCEDURE = 2;
  238.   TAB_TRIGGER = 3;
  239.   TAB_EXCEPTION = 4;
  240.   TAB_FILTER = 5;
  241.   TAB_FUNCTION = 6;
  242.   TAB_GENERATOR = 7;
  243.   TAB_ROLE = 8;
  244.   TAB_VIEW = 9;
  245.  
  246.   USR_COL = 0;
  247.   SEL_COL = 1;
  248.   DEL_COL = 2;
  249.   INS_COL = 3;
  250.   UPD_COL = 4;
  251.   REF_COL = 5;
  252.   EXE_COL = 6;
  253.   MEM_COL = 7;
  254.   GRANT_COL = 8;
  255.  
  256.   DESCRIPTION_ROW = 0;
  257.  
  258.   COLUMN_LIST = 0;
  259.   TRIGGER_LIST = 1;
  260.   CHECK_CONST_LIST = 2;
  261.   INDEX_LIST = 3;
  262.   UNIQUE_CONST_LIST = 4;
  263.   REF_CONST_LIST = 5;
  264.  
  265. { TfrmObjectView }
  266.  
  267. destructor TfrmObjectView.Destroy;
  268. var
  269.   lCnt: integer;
  270.  
  271. begin
  272.   if Assigned (FObjNameList) then
  273.     FObjNameList.Free;
  274.  
  275.   if Assigned(FObjectArray) then
  276.     FObjectArray.Free;
  277.  
  278.   for lCnt := 0 to High(FTableData) do
  279.   begin
  280.     with FTableData[lCnt] do
  281.     begin
  282.       if Assigned (Columns) then Columns.Free;
  283.       if Assigned (Indexes) then Indexes.Free;
  284.       if Assigned (TriggerS) then Triggers.Free;
  285.       if Assigned (CheckConst) then CheckConst.Free;
  286.       if Assigned (UniqueConst) then UniqueConst.Free;
  287.       if Assigned (RefConst) then RefConst.Free;
  288.     end;
  289.   end;
  290.  
  291.   for lCnt := 0 to High(FProcedureData) do
  292.   begin
  293.     with FProcedureData[lCnt] do
  294.     begin
  295.       if Assigned(Params) then Params.Free;
  296.       if Assigned(Source) then Source.Free;
  297.     end;
  298.   end;
  299.  
  300.   for lCnt := 0 to High(FFunctionData) do
  301.     if Assigned (FFunctionData[lCnt].Params) then FFunctionData[lCnt].Params.Free;
  302.  
  303.  
  304.   if Assigned(FFilterData) then
  305.     FFilterData.Free;
  306.  
  307.   if Assigned (FRoleData) then FRoleData.Free;
  308.   if Assigned (FExceptionData) then FExceptionData.Free;
  309.   if Assigned (FViewData) then FViewData.Free;
  310.   if Assigned (FGenData) then FGenData.Free;
  311.   if Assigned (FDomainData) then FDomainData.Free;
  312.  
  313.   if Assigned (FDataSet) then
  314.     FDataSet.Free;
  315.  
  316.   if Assigned (FTransaction) then
  317.   begin
  318.     if FTransaction.InTransaction then
  319.       FTransaction.Commit;
  320.     FTransaction.Free;
  321.   end;
  322.  
  323.   inherited;
  324. end;
  325.  
  326. procedure TfrmObjectView.InitDlg(ObjType: Integer;
  327.                                  ObjList: TStringList;
  328.                                  ObjName: String;
  329.                                  Database: TIBDatabase; ObjIcon: TIcon;
  330.                                  const Showsystem, Refetch: boolean);
  331. var
  332.   lRefetch: boolean;
  333.   lCnt: Integer;
  334.   s: string;
  335.  
  336. begin
  337.   FObjType := ObjType;
  338.   if not (ShowSystem = FShowSystem) then
  339.     { All lists need to be refetched }
  340.     lRefetch := true
  341.   else
  342.     lRefetch := Refetch;
  343.   FShowSystem := ShowSystem;
  344.   FDatabase := Database;
  345.   FObjName := Trim(ObjName);
  346.   Caption := Format('Properties for: %s',[Trim(ObjName)]);
  347.   Icon := ObjIcon;
  348.   FObjNameList := TStringList.Create;
  349.   FObjectArray := TStringList.Create;
  350.   cbObjectList.Items.Clear;
  351.   reMetadata.Clear;
  352.   for lCnt := 1 to ObjList.Count -1 do
  353.   begin
  354.     s := ObjList.Strings[lCnt];
  355.     s := Trim(GetNextField(s,DEL));
  356.     FObjNameList.Append (s);
  357.     cbObjectList.Items.Append (s);
  358.   end;
  359.  
  360.   { Set up the array to hold object data }
  361.   cbObjectList.ItemIndex := FObjNameList.IndexOf(FObjName);
  362.   FIdx := cbObjectList.ItemIndex;
  363.   lblFileName.Caption := Database.DatabaseName;
  364.   StatusBar.Panels[0].Text := MinimizeName (lblFileName.Caption, lblFileName.Canvas,
  365.     StatusBar.Panels[0].Width);
  366.   StatusBar.Panels[1].Text := NODE_ARRAY[FObjType];
  367.  
  368.   tabData.tabVisible := false;
  369.   tabPermissions.tabVisible := false;
  370.   tabProperties.TabVisible := true;
  371.  
  372.   SetLength (FRefreshList, ObjList.Count-1);
  373.   SetLength (FMetadataRefreshList,ObjList.Count-1);
  374.   for lCnt := Low(FRefreshList) to High(FRefreshList) do
  375.   begin
  376.     FRefreshList[lCnt] := lRefetch;
  377.     FMetadataRefreshList[lCnt] := lRefetch;
  378.   end;
  379.  
  380.   for lCnt := 0 to objControl.PageCount-1 do
  381.     ObjControl.Pages[lCnt].TabVisible := false;
  382.     
  383.   pgcProperties.ActivePageIndex := 0;
  384.   case FObjType of
  385.     NODE_VIEWS,
  386.     NODE_TABLES:
  387.     begin
  388.       tabData.tabVisible := true;
  389.       tabPermissions.TabVisible := true;
  390.       objControl.ActivePage := tabTables;
  391.       SetLength(FTableData, ObjList.Count-1);
  392.     end;
  393.  
  394.     NODE_DOMAINS:
  395.     begin
  396.       tabPermissions.tabVisible := false;
  397.       objControl.ActivePage := tabDomains;
  398.     end;
  399.  
  400.     NODE_PROCEDURES:
  401.      begin
  402.      { Do not show the data tab for procedures }
  403. //     tabData.tabVisible := true;
  404.        tabPermissions.tabVisible := true;
  405.        objControl.ActivePage := tabProcedures;
  406.        SetLength(FProcedureData, ObjList.Count-1);
  407.      end;
  408.  
  409.     NODE_FUNCTIONS:
  410.     begin
  411.       tabPermissions.tabVisible := false;
  412.       objControl.ActivePage := tabFunctions;
  413.       SetLength(FFunctionData, ObjList.Count-1);
  414.     end;
  415.  
  416.     NODE_BLOB_FILTERS:
  417.     begin
  418.       tabPermissions.tabVisible := false;
  419.       objControl.ActivePage := tabFilters;
  420.     end;
  421.  
  422.     NODE_ROLES:
  423.     begin
  424.       tabProperties.TabVisible := false;
  425.       tabPermissions.TabVisible := true;
  426.       pgcProperties.ActivePage := tabPermissions;
  427.     end;
  428.  
  429.     NODE_EXCEPTIONS:
  430.     begin
  431.       ObjControl.ActivePage := tabExceptions;
  432.     end;
  433.  
  434.     NODE_GENERATORS:
  435.     begin
  436.       ObjControl.ActivePage := tabGenerators;
  437.     end;
  438.   end;
  439.  
  440.   pgcPropertiesChange(pgcProperties);
  441. end;
  442.  
  443. procedure TfrmObjectView.cbObjectListChange(Sender: TObject);
  444. begin
  445.   frmMain.UpdateWindowList(Caption, Self, true);
  446.   with Sender as TComboBox do
  447.   begin
  448.     Caption := Format('Properties for: %s',[Items[ItemIndex]]);;
  449.     FObjName := Items[ItemIndex];
  450.     FIdx := ItemIndex;
  451.     FObjectArray.Append (IntToStr(FIndex));
  452.   end;
  453.   reMetadata.Clear;
  454.   pgcPropertiesChange(pgcProperties);
  455.   frmMain.UpdateWindowList(Caption, Self);  
  456. end;
  457.  
  458. constructor TfrmObjectView.Create(AOwner: TComponent);
  459. begin
  460.   inherited;
  461.   Visible := false;
  462.  
  463.   FDataSet := TIBDataSet.Create (self);
  464.   with FDataSet do
  465.   begin
  466.     Database := FDatabase;
  467.     Transaction := FTransaction;
  468.     ObjectView := true;
  469.     SparseArrays := true;
  470.   end;
  471.  
  472. end;
  473.  
  474. procedure TfrmObjectView.pgcPropertiesChange(Sender: TObject);
  475.  
  476. var
  477.   lSQLScript: TStringList;
  478.   ObjName: String;
  479.   IBExtract: TIBExtract;
  480.  
  481. begin
  482.  
  483.   with Sender as TPageControl do
  484.   begin
  485.     ObjName := cbObjectList.Items[cbObjectList.ItemIndex];
  486.     if ActivePage = tabMetadata then
  487.     begin
  488.       { Only refetch if there is nothing there or something caused
  489.         a refresh }
  490.       if (reMetadata.Lines.Count = 0) or FMetadataRefreshList[FIdx] = true then
  491.       begin
  492.         FMetadataRefreshList[FIdx] := false;
  493.         IBExtract := TIBExtract.Create (self);
  494.         lSQLScript := TStringList.Create;
  495.         lSQLScript.Text := '';
  496.         Screen.Cursor := crHourGlass;
  497.  
  498.         with IBExtract do
  499.         begin
  500.           Database := FDatabase;
  501.           Items := lSQLScript;
  502.           ObjectName := ObjName;
  503.           ShowSystem := FShowSystem;
  504.  
  505.           case FObjType of
  506.             NODE_DOMAINS:
  507.               ObjectType := eoDomain;
  508.             NODE_TABLES:
  509.               ObjectType := eoTable;
  510.             NODE_VIEWS:
  511.               ObjectType := eoView;
  512.             NODE_PROCEDURES:
  513.               ObjectType := eoProcedure;
  514.             NODE_FUNCTIONS:
  515.               ObjectType := eoFunction;
  516.             NODE_GENERATORS:
  517.               ObjectType := eoGenerator;
  518.             NODE_EXCEPTIONS:
  519.               ObjectType := eoException;
  520.             NODE_BLOB_FILTERS:
  521.               ObjectType := eoBLOBFilter;
  522.             NODE_ROLES:
  523.               ObjectType := eoRole;
  524.           end;
  525.           ExtractObject;
  526.           Free;
  527.         end;
  528.  
  529.         reMetadata.Text := lSQLScript.Text;
  530.         reMetadata.Perform( EM_SCROLLCARET, 0, 0 );
  531.         Screen.Cursor := crDefault;
  532.         lSQLScript.Free;
  533.       end;
  534.     end;
  535.  
  536.     if ActivePage = tabData then
  537.     begin
  538.       IBTable.Active := false;
  539.       IBTable.Database := FDatabase;
  540.       IBTable.TableName := ObjName;
  541.       IBTable.ReadOnly := false;
  542.       IBTable.Active := true;
  543.     end;
  544.  
  545.     if ActivePage = tabPermissions then
  546.       GetPermissions (ObjName, FObjType);
  547.  
  548.     if ActivePage = tabDependencies then
  549.       GetDependencies (ObjName, FObjType);
  550.  
  551.     if ActivePage = tabProperties then
  552.     begin
  553.       case FObjType of
  554.         NODE_DOMAINS:
  555.           GetDomainProperties (ObjName);
  556.         NODE_TABLES:
  557.           GetTableProperties;
  558.         NODE_PROCEDURES:
  559.           GetProcedureProperties;
  560.         NODE_FUNCTIONS:
  561.           GetFunctionProperties;
  562.         NODE_BLOB_FILTERS:
  563.           GetFilterProperties;
  564.         NODE_ROLES:
  565.           GetRoleProperties;
  566.         NODE_VIEWS:
  567.         begin
  568.           GetViewProperties;
  569.           GetTableProperties;
  570.         end;
  571.         NODE_GENERATORS:
  572.           GetGeneratorProperties;
  573.         NODE_EXCEPTIONS:
  574.           GetExceptionProperties;
  575.       end;
  576.     end;
  577.   end;
  578. end;
  579.  
  580. procedure TfrmObjectView.dbgDataCellClick(Column: TColumn);
  581. begin
  582.   if Column.Field.DataType in [ftMemo, ftBlob] then
  583.     Column.ButtonStyle := cbsEllipsis;
  584. end;
  585.  
  586. procedure TfrmObjectView.dbgDataDrawColumnCell(Sender: TObject;
  587.   const Rect: TRect; DataCol: Integer; Column: TColumn;
  588.   State: TGridDrawState);
  589. var
  590.   DisplayStr: string;
  591.  
  592. begin
  593.   with Sender as TDBGrid do begin
  594.     if Column.Field = nil then begin
  595.       with Canvas do begin
  596.         font.color := clBlue;
  597.         TextRect(Rect, Rect.Left, Rect.top, NULL_STR);
  598.       end
  599.     end
  600.     else begin
  601.       if Column.Field.IsNull then begin
  602.         with Canvas do begin
  603.           font.color := clBlue;
  604.           TextRect(Rect, Rect.Left, Rect.top, NULL_STR);
  605.         end;
  606.       end
  607.       else
  608.       begin
  609.         if Column.Field.DataType in [ftDateTime, ftTime] then
  610.         begin
  611.           { make sure that the time portion is always displayed! }
  612.           if Column.Field.DataType = ftDateTime then
  613.             if FDatabase.SQLDialect = 3 then
  614.               DisplayStr := FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', Column.Field.AsDateTime)
  615.             else
  616.               DisplayStr := FormatDateTime('c', Column.Field.AsDateTime)
  617.           else
  618.             DisplayStr := FormatDateTime('hh:nn:ss.zzz', Column.Field.AsDateTime);
  619.           Canvas.TextRect(Rect, Rect.Left, Rect.Top, DisplayStr);
  620.         end;
  621.       end;
  622.     end;
  623.   end;
  624. end;
  625.  
  626. procedure TfrmObjectView.dbgDataEditButtonClick(Sender: TObject);
  627. var
  628.   FieldObj: TField;
  629.  
  630. begin
  631.   with Sender as TDBGrid do begin
  632.     FieldObj := SelectedField;
  633.     case FieldObj.DataType of
  634.       ftBlob:
  635.          DisplayBlob (frmObjectView, FieldObj, TIBDataSet(IBTable));
  636.       ftMemo:
  637.         DisplayMemo (frmObjectView, FieldObj, TIBDataSet(IBTable));
  638.       else
  639.           ShowMessage (FieldObj.DisplayName+' is unknown');
  640.     end;
  641.   end;
  642. end;
  643.  
  644. procedure TfrmObjectView.GetDependencies(const ObjName: String;
  645.   const ObjType: Integer);
  646. var
  647.   RelName, SqlStr: String;
  648.   Query: TIBSql;
  649.   Trans: TIBTransaction;
  650.   ParentNode, ChildNode: TTreeNode;
  651.  
  652. begin
  653.   Query := nil;
  654.   Trans := nil;
  655.   ParentNode := nil;
  656.  
  657.   if ObjType in [NODE_TABLES, NODE_GENERATORS, NODE_EXCEPTIONS, NODE_FUNCTIONS] then
  658.     rbDependent.Checked := true
  659.   else
  660.     rbDependedOn.Checked := true;
  661.  
  662.   case ObjType of
  663.     NODE_DOMAINS:
  664.     begin
  665.       SQLStr := 'select rdb$relation_name, rdb$field_name';
  666.       SQLStr := Format('%s from rdb$relation_fields where', [SqlStr]);
  667.       SQLStr := Format('%s rdb$field_source = ''%s''', [SQLStr, ObjName]);
  668.       SQLStr := Format('%s order by rdb$relation_name, rdb$field_name', [SQLStr]);
  669.     end;
  670.     else
  671.     begin
  672.       SQLStr := 'select rdb$dependent_name, rdb$depended_on_name,';
  673.       SQLStr := Format('%s rdb$field_name, rdb$dependent_type, rdb$depended_on_type', [SQLStr]);
  674.       SQLStr := Format('%s from rdb$dependencies where', [SQLStr]);
  675.       SQLStr := Format('%s rdb$dependent_name= ''%s''', [SQLStr, ObjName]);
  676.       SQLStr := Format('%s order by rdb$field_name, rdb$depended_on_name', [SQLStr]);
  677.     end;
  678.   end;
  679.  
  680.   try
  681.     Query := TIBSql.Create (self);
  682.     Trans := TIBTransaction.Create (self);
  683.  
  684.     Trans.DefaultDatabase := FDatabase;
  685.     Query.Transaction := Trans;
  686.     Query.Database := FDatabase;
  687.  
  688.     with Query do
  689.     begin
  690.       SQL.Add (SQLStr);
  691.       Transaction.StartTransaction;
  692.       Prepare;
  693.       ExecQuery;
  694.       tvDependencies.Items.BeginUpdate;
  695.       tvDependencies.Items.Clear;
  696.       if ObjType = NODE_DOMAINS then
  697.       begin
  698.         while not EOF do
  699.         begin
  700.           if AnsiCompareText (RelName, Trim(Fields[0].AsString)) <> 0 then
  701.           begin
  702.             RelName := Trim(Fields[0].AsString);
  703.             ParentNode := tvDependencies.Items.Add (nil, RelName);
  704.             ParentNode.ImageIndex := NODE_TABLES_IMG;
  705.             ParentNode.SelectedIndex := NODE_TABLES_IMG;
  706.           end;
  707.           ChildNode := tvDependencies.Items.AddChild(ParentNode, Trim(Fields[1].AsString));
  708.           ChildNode.ImageIndex := NODE_COLUMNS_IMG;
  709.           ChildNode.SelectedIndex := NODE_COLUMNS_IMG;
  710.           ParentNode.Expand (true);
  711.           Next;
  712.         end;
  713.       end
  714.       else
  715.       begin
  716.         while not EOF do
  717.         begin
  718.           if AnsiCompareText (RelName, Trim(Fields[1].AsString)) <> 0 then
  719.           begin
  720.             RelName := Trim(Fields[1].AsString);
  721.             if (not (Fields[2].IsNull)) or
  722.                (Fields[4].AsInteger <> 0) then
  723.             begin
  724.               ParentNode := tvDependencies.Items.Add (nil, RelName);
  725.               ParentNode.ImageIndex := GetImageIndex (Fields[4].AsInteger);
  726.               ParentNode.SelectedIndex := ParentNode.ImageIndex;
  727.             end;
  728.           end;
  729.           if not (Fields[2].IsNull) then
  730.           begin
  731.             ChildNode := tvDependencies.Items.AddChild(ParentNode, Trim(Fields[2].AsString));
  732.             ChildNode.ImageIndex := NODE_COLUMNS_IMG;
  733.             ChildNode.SelectedIndex := NODE_COLUMNS_IMG;
  734.             ParentNode.Expand (true);
  735.           end;
  736.           Next;
  737.         end;
  738.         Close;
  739.  
  740.         { Now get the objects which depend on the current object }
  741.         SQLStr := 'select rdb$dependent_name, rdb$depended_on_name,';
  742.         SQLStr := Format('%s rdb$field_name, rdb$dependent_type, rdb$depended_on_type', [SQLStr]);
  743.         SQLStr := Format('%s from rdb$dependencies where', [SQLStr]);
  744.         SQLStr := Format('%s rdb$depended_on_name= ''%s''', [SQLStr, ObjName]);
  745.         SQLStr := Format('%s order by rdb$dependent_name, rdb$field_name, rdb$depended_on_name', [SQLStr]);
  746.         Sql.Clear;
  747.         Sql.Add(SQLStr);
  748.         Prepare;
  749.         ExecQuery;
  750.         tvDependents.Items.BeginUpdate;
  751.         tvDependents.Items.Clear;
  752.         RelName := '';
  753.         while not EOF do
  754.         begin
  755.           if AnsiCompareText (RelName, Trim(Fields[0].AsString)) <> 0 then
  756.           begin
  757.             RelName := Trim(Fields[0].AsString);
  758.             if (not (Fields[2].IsNull)) or
  759.                (Fields[3].AsInteger <> 0) then
  760.             begin
  761.               ParentNode := tvDependents.Items.Add (nil, RelName);
  762.               ParentNode.ImageIndex := GetImageIndex (Fields[3].AsInteger);
  763.               ParentNode.SelectedIndex := ParentNode.ImageIndex;
  764.             end;
  765.           end;
  766.           if not (Fields[2].IsNull) then
  767.           begin
  768.             ChildNode := tvDependents.Items.AddChild(ParentNode, Trim(Fields[2].AsString));
  769.             ChildNode.ImageIndex := NODE_COLUMNS_IMG;
  770.             ChildNode.SelectedIndex := NODE_COLUMNS_IMG;
  771.             ParentNode.Expand (true);
  772.           end;
  773.           Next;
  774.         end;
  775.       end;
  776.       tvDependents.Items.Endupdate;
  777.       tvDependencies.Items.EndUpdate;
  778.       Trans.Commit;
  779.       Close;
  780.       Free;
  781.       Trans.Free;
  782.     end;
  783.   except on E: Exception do
  784.     begin
  785.       ShowMessage (E.Message);
  786.       if Assigned (Query) then
  787.         Query.Free;
  788.       if Assigned (Trans) then
  789.         Trans.Free;
  790.     end;
  791.   end;
  792. end;
  793.  
  794. procedure TfrmObjectView.GetPermissions(const ObjName: String;
  795.   const ObjType: Integer);
  796. var
  797.   GrantPermission: boolean;
  798.   RelName, SqlStr: String;
  799.   Perm: PChar;
  800.   Query: TIBSql;
  801.   Trans: TIBTransaction;
  802.   lCnt, img: integer;
  803.   ListItem: TListItem;
  804.  
  805. begin
  806.   Query := nil;
  807.   Trans := nil;
  808.   ListItem := nil;
  809.   SQLStr := 'select rdb$user, rdb$privilege, rdb$grant_option,';
  810.   SQLStr := Format('%s rdb$relation_name, rdb$user_type from rdb$user_privileges where', [SqlStr]);
  811.   SQLStr := Format('%s rdb$relation_name = ''%s''', [SQLStr, ObjName]);
  812.   SQLStr := Format('%s order by rdb$user, rdb$privilege', [SQLStr]);
  813.  
  814.   try
  815.     Query := TIBSql.Create (self);
  816.     Trans := TIBTransaction.Create (self);
  817.     Trans.DefaultDatabase := FDatabase;
  818.     Query.Transaction := Trans;
  819.     Query.Database := FDatabase;
  820.     lvPermissions.Items.Clear;
  821.     with Query do
  822.     begin
  823.       SQL.Add (SQLStr);
  824.       Transaction.StartTransaction;
  825.       Prepare;
  826.       ExecQuery;
  827.       while not EOF do
  828.       begin
  829.         if AnsiCompareText (RelName, Trim(Fields[0].AsString)) <> 0 then
  830.         begin
  831.           RelName := Trim(Fields[0].AsString);
  832.           ListItem := lvPermissions.Items.Add;
  833.           ListItem.Caption := RelName;
  834.  
  835.           case Fields[4].AsInteger of
  836.             obj_relation: img := NODE_TABLES_IMG;
  837.             obj_view: img := NODE_VIEWS_IMG;
  838.             obj_trigger: img := NODE_TRIGGERS_IMG;
  839.             obj_computed: img := NODE_UNK_IMG;
  840.             obj_validation: img := NODE_UNK_IMG;
  841.             obj_procedure: img := NODE_PROCEDUREs_IMG;
  842.             obj_expression_index: img := NODE_UNK;
  843.             obj_exception: img := NODE_EXCEPTIONS_IMG;
  844.             obj_user: img := NODE_USERS_IMG;
  845.             obj_field: img := NODE_COLUMNS_IMG;
  846.             obj_index: img := NODE_INDEXES_IMG;
  847.             obj_user_group: img := NODE_USERS_IMG;
  848.             obj_sql_role: img := NODE_ROLES_IMG
  849.             else
  850.               img := NODE_UNK_IMG;
  851.           end;
  852.           ListItem.ImageIndex := img;
  853.  
  854.           for lCnt := 1 to lvPermissions.Columns.Count-1 do
  855.             ListItem.SubItems.Add('');
  856.         end;
  857.  
  858.         GrantPermission := false;
  859.         if Fields[2].AsInteger = 1 then
  860.           GrantPermission := true;
  861.  
  862.         Perm := Fields[1].AsPointer;
  863.         case Perm^ of
  864.           'D', 'd':
  865.           begin
  866.             ListItem.SubItems[DEL_COL-1] := 'Y';
  867.             if GrantPermission then
  868.               ListItem.SubItemImages[DEL_COL-1] := IMG_GRANT_OPT
  869.             else
  870.               ListItem.SubItemImages[DEL_COL-1] := -1;
  871.           end;
  872.           'I', 'i':
  873.           begin
  874.             ListItem.SubItems[INS_COL-1] := 'Y';
  875.             if GrantPermission then
  876.               ListItem.SubItemImages[INS_COL-1] := IMG_GRANT_OPT
  877.             else
  878.               ListItem.SubItemImages[INS_COL-1] := -1;
  879.           end;
  880.           'M', 'm':
  881.           begin
  882.             ListItem.SubItems[MEM_COL-1] := 'Y';
  883.             if GrantPermission then
  884.               ListItem.SubItemImages[MEM_COL-1] := IMG_GRANT_OPT
  885.             else
  886.               ListItem.SubItemImages[MEM_COL-1] := -1;
  887.           end;
  888.           'R', 'r':
  889.           begin
  890.             ListItem.SubItems[REF_COL-1] := 'Y';
  891.             if GrantPermission then
  892.               ListItem.SubItemImages[REF_COL-1] := IMG_GRANT_OPT
  893.             else
  894.               ListItem.SubItemImages[REF_COL-1] := -1;
  895.           end;
  896.           'S', 's':
  897.           begin
  898.             ListItem.SubItems[SEL_COL-1] := 'Y';
  899.             if GrantPermission then
  900.               ListItem.SubItemImages[SEL_COL-1] := IMG_GRANT_OPT
  901.             else
  902.               ListItem.SubItemImages[SEL_COL-1] := -1;
  903.           end;
  904.           'U', 'u':
  905.           begin
  906.             ListItem.SubItems[UPD_COL-1] := 'Y';
  907.             if GrantPermission then
  908.               ListItem.SubItemImages[UPD_COL-1] := IMG_GRANT_OPT
  909.             else
  910.               ListItem.SubItemImages[UPD_COL-1] := -1;
  911.           end;
  912.           'X', 'x':
  913.           begin
  914.             ListItem.SubItems[EXE_COL-1] := 'Y';
  915.             if GrantPermission then
  916.               ListItem.SubItemImages[EXE_COL-1] := IMG_GRANT_OPT
  917.             else
  918.               ListItem.SubItemImages[EXE_COL-1] := -1;
  919.           end;
  920.         end;
  921.         Next;
  922.       end;
  923.       Trans.Commit;
  924.       Close;
  925.       Free;
  926.       Trans.Free;
  927.     end;
  928.   except on E: Exception do
  929.     begin
  930.       lvPermissions.Items.EndUpdate;    
  931.       ShowMessage (E.Message);
  932.       if Assigned (Query) then
  933.         Query.Free;
  934.       if Assigned (Trans) then
  935.         Trans.Free;
  936.     end;
  937.   end;
  938. end;
  939.  
  940. procedure TfrmObjectView.cbGetIndex(Sender: TObject);
  941. begin
  942.   FIndex := cbObjectList.ItemIndex;
  943. end;
  944.  
  945. procedure TfrmObjectView.ObjectChange(Sender: TObject);
  946. begin
  947.   btnApply.Enabled := true;
  948.   Tag := 1;
  949. end;
  950.  
  951. procedure TfrmObjectView.GetDomainProperties(const ObjName: String);
  952. var
  953.   TmpList: TStringList;
  954.   TmpString: String;
  955.   cnt: integer;
  956. begin
  957.   if not Assigned (FDomainData) then
  958.     FDomainData := TStringList.Create;
  959.  
  960.   if (FDomainData.Count = 0) or FRefreshList[FIdx] = true then
  961.   begin
  962.     FDomainData.Clear;
  963.     FRefreshList[FIdx] := false;
  964.     dmMain.GetDomainData (FDomainData, FDatabase, FShowSystem);
  965.   end;
  966.   TmpList := TStringList.create;
  967.   TmpList.Add(Format('Type%sCharacter Set%sCollation%sDefault Value%sAllow Nulls', [DEL,DEL,DEL,DEL]));
  968.   TmpList.Add (FDomainData.Strings[FIdx]);
  969.   FillList (lVDomains, TmpList);
  970.  
  971.   tmpString := FDomainData.Strings[FIdx];
  972.   for cnt := 0 to lvDomains.Items[0].SubItems.Count - 1 do
  973.     GetNextField (tmpString, DEL);
  974.  
  975.   reConstraint.Text := GetNextField(tmpString, DEL);
  976.   TmpList.Free;
  977. end;
  978.  
  979. procedure TfrmObjectView.ShowColumnsExecute(Sender: TObject);
  980. begin
  981.   tbCols.Down := true;
  982.   if FObjType <> NODE_VIEWS then
  983.   begin
  984.     reTriggerSource.Visible := false;
  985.     lvTableObjects.Align := alClient;
  986.     lvTableObjects.OnChange := nil;
  987.     SplitterWnd.Visible := false;
  988.   end;
  989.   
  990.   if not Assigned (FTableData[Fidx].Columns) then
  991.     FTableData[Fidx].Columns := TStringList.Create;
  992.  
  993.   if (FTableData[Fidx].Columns.Count <= 0) or FRefreshList[FIdx] = true then
  994.   begin
  995.     FRefreshList[FIdx] := false;
  996.     FTableData[Fidx].Columns.Clear;
  997.     dmMain.GetColumnList(FTableData[Fidx].Columns, FDatabase, FObjName);
  998.   end;
  999.  
  1000.   FillList (lvTableObjects, FTableData[Fidx].Columns);
  1001.  
  1002.   if FObjType = NODE_VIEWS then
  1003.     GetViewProperties;
  1004. end;
  1005.  
  1006. procedure TfrmObjectView.GetTableProperties;
  1007. begin
  1008.   if tbCols.Down then
  1009.     ShowColumnsExecute(nil);
  1010.  
  1011.   if tbTriggers.Down then
  1012.     ShowTriggersExecute(nil);
  1013.  
  1014.   if tbChkConst.Down then
  1015.     ShowCheckConstraintsExecute(nil);
  1016.  
  1017.   if tbIndexes.Down then
  1018.     ShowIndexesExecute(nil);
  1019.  
  1020.   if tbUnique.Down then
  1021.     ShowUniqueConstraintsExecute(nil);
  1022.  
  1023.   if tbRef.Down then
  1024.     ShowReferentialConstraintsExecute(nil);
  1025. end;
  1026.  
  1027. procedure TfrmObjectView.FillList(var ListObject: TListView; const StringList: TStringList);
  1028. var
  1029.   loListItem: TListItem;
  1030.   loListColumn: TListColumn;
  1031.   lsCurrLine: string;
  1032.   i: integer;
  1033.  
  1034. begin
  1035.   ListObject.Items.BeginUpdate;
  1036.   ListObject.Items.Clear;
  1037.  
  1038.   ListObject.Columns.Clear;
  1039.  
  1040.   ListObject.AllocBy := StringList.Count;
  1041.  
  1042.   { The column Headers are stored in element 0 }
  1043.   lsCurrLine := StringList.Strings[0];
  1044.   while Length(lsCurrLine) > 0 do
  1045.   begin
  1046.     loListColumn := ListObject.Columns.Add;
  1047.     loListColumn.Caption := GetNextField(lsCurrLine, DEL);
  1048.     loListColumn.Width := ColumnHeaderWidth;
  1049.   end;
  1050.  
  1051.   for i := 1  to StringList.Count - 1 do
  1052.   begin
  1053.     lsCurrLine := StringList.Strings[i];
  1054.     loListItem := ListObject.Items.Add;
  1055.     loListItem.Caption := GetNextField(lsCurrLine, DEL);
  1056.  
  1057.     while Length(lsCurrLine) > 0 do
  1058.     begin
  1059.       loListItem.SubItems.Add(GetNextField(lsCurrLine, DEL));
  1060.     end;
  1061.   end;
  1062.   ListObject.Items.EndUpdate;
  1063.   if ListObject.Items.Count > 0 then
  1064.     ListObject.Items[0].Selected := true;
  1065. end;
  1066.  
  1067. procedure TfrmObjectView.ShowTriggersExecute(Sender: TObject);
  1068. begin
  1069.   tbTriggers.Down := true;
  1070.   reTriggerSource.Clear;
  1071.   reTriggerSource.Visible := true;
  1072.   lvTableObjects.Align := alTop;
  1073.   lvTableObjects.Anchors := [akLeft, akRight, akTop, akBottom];
  1074.   lvTableObjects.Height := lvTableObjects.Parent.Height div 2;
  1075.   SplitterWnd.Visible := true;
  1076.   SplitterWnd.Top := lvTableObjects.Height + lvTableObjects.Top;
  1077.   if not Assigned (FTableData[Fidx].Triggers) then
  1078.     FTableData[Fidx].Triggers := TStringList.Create;
  1079.  
  1080.   if (FTableData[Fidx].Triggers.Count <= 0) or FRefreshList[FIdx] = true then
  1081.   begin
  1082.     FRefreshList[FIdx] := false;
  1083.     FTableData[Fidx].Triggers.Clear;
  1084.     dmMain.GetTriggerList(FTableData[Fidx].Triggers, FDatabase, FObjName);
  1085.   end;
  1086.  
  1087.   FillList (lvTableObjects, FTableData[Fidx].Triggers);
  1088.   reTriggerSource.Clear;
  1089.   lvTableObjects.OnChange := ShowObjectSource;
  1090.   lvTableObjects.Selected := lvTableObjects.TopItem;
  1091. end;
  1092.  
  1093. procedure TfrmObjectView.ShowObjectSource(Sender: TObject;
  1094.   Item: TListItem; Change: TItemChange);
  1095. var
  1096.   lLine: String;
  1097. begin
  1098.   if (lvTableObjects.Items.Count > 0) and
  1099.      (Item.SubItems.Count > 0) then
  1100.   begin
  1101.     reTriggerSource.Lines.BeginUpdate;
  1102.     reTriggerSource.Clear;
  1103.     lLine := Item.SubItems.Strings[Item.SubItems.Count-1];
  1104.     reTriggerSource.Lines.Text := lLine;
  1105.     reTriggerSource.Lines.EndUpdate;
  1106.   end;
  1107. end;
  1108.  
  1109. procedure TfrmObjectView.ShowCheckConstraintsExecute(Sender: TObject);
  1110. begin
  1111.   tbChkConst.Down := true;
  1112.   reTriggerSource.Visible := true;
  1113.   reTriggersource.Clear;
  1114.   lvTableObjects.Align := alTop;
  1115.   lvTableObjects.Anchors := [akLeft, akRight, akTop, akBottom];
  1116.   lvTableObjects.Height := lvTableObjects.Parent.Height div 2;
  1117.   SplitterWnd.Visible := true;
  1118.   SplitterWnd.Top := lvTableObjects.Height + lvTableObjects.Top;
  1119.   if not Assigned (FTableData[Fidx].CheckConst) then
  1120.     FTableData[Fidx].CheckConst := TStringList.Create;
  1121.  
  1122.   if (FTableData[Fidx].CheckConst.Count <= 0) or FRefreshList[FIdx] = true then
  1123.   begin
  1124.     FRefreshList[FIdx] := false;
  1125.     FTableData[Fidx].CheckConst.Clear;
  1126.     dmMain.GetCheckConstList(FTableData[Fidx].CheckConst, FDatabase, FObjName);
  1127.   end;
  1128.  
  1129.   FillList (lvTableObjects, FTableData[Fidx].CheckConst);
  1130.   reTriggerSource.Clear;
  1131.   lvTableObjects.OnChange := ShowObjectSource;
  1132.   lvTableObjects.Selected := lvTableObjects.TopItem;
  1133. end;
  1134.  
  1135. procedure TfrmObjectView.ShowIndexesExecute(Sender: TObject);
  1136. begin
  1137.   tbIndexes.Down := true;
  1138.   reTriggerSource.Visible := false;
  1139.   lvTableObjects.Align := alClient;
  1140.   lvTableObjects.OnChange := nil;
  1141.   SplitterWnd.Visible := false;
  1142.   if not Assigned (FTableData[Fidx].Indexes) then
  1143.     FTableData[Fidx].Indexes := TStringList.Create;
  1144.  
  1145.   if (FTableData[Fidx].Indexes.Count <= 0) or FRefreshList[FIdx] = true then
  1146.   begin
  1147.     FRefreshList[FIdx] := false;
  1148.     FTableData[Fidx].Indexes.Clear;    
  1149.     dmMain.GetIndexList(FTableData[Fidx].Indexes, FDatabase, FObjName);
  1150.   end;
  1151.  
  1152.   FillList (lvTableObjects, FTableData[Fidx].Indexes);
  1153. end;
  1154.  
  1155. procedure TfrmObjectView.ShowUniqueConstraintsExecute(Sender: TObject);
  1156. begin
  1157.   tbUnique.Down := true;
  1158.   reTriggerSource.Visible := false;
  1159.   lvTableObjects.Align := alClient;  
  1160.   lvTableObjects.OnChange := nil;
  1161.   SplitterWnd.Visible := false;
  1162.   if not Assigned (FTableData[Fidx].UniqueConst) then
  1163.     FTableData[Fidx].UniqueConst := TStringList.Create;
  1164.  
  1165.   if (FTableData[Fidx].UniqueConst.Count <= 0) or FRefreshList[FIdx] = true then
  1166.   begin
  1167.     FRefreshList[FIdx] := false;
  1168.     FTableData[Fidx].UniqueConst.Clear;
  1169.     dmMain.GetUniqueConstList(FTableData[Fidx].UniqueConst, FDatabase, FObjName);
  1170.   end;
  1171.  
  1172.   FillList (lvTableObjects, FTableData[Fidx].UniqueConst);
  1173. end;
  1174.  
  1175.  
  1176. procedure TfrmObjectView.ShowReferentialConstraintsExecute(
  1177.   Sender: TObject);
  1178. begin
  1179.   tbRef.Down := true;
  1180.   reTriggerSource.Visible := false;
  1181.   lvTableObjects.Align := alClient;
  1182.   lvTableObjects.OnChange := nil;
  1183.   SplitterWnd.Visible := false;
  1184.   if not Assigned (FTableData[Fidx].RefConst) then
  1185.     FTableData[Fidx].RefConst := TStringList.Create;
  1186.  
  1187.   if (FTableData[Fidx].RefConst.Count <= 0) or FRefreshList[FIdx] = true then
  1188.   begin
  1189.     FRefreshList[FIdx] := false;
  1190.     FTableData[Fidx].RefConst.Clear;    
  1191.     dmMain.GetReferentialConstList(FTableData[Fidx].RefConst, FDatabase, FObjName);
  1192.   end;
  1193.  
  1194.   FillList (lvTableObjects, FTableData[Fidx].RefConst);
  1195. end;
  1196.  
  1197. procedure TfrmObjectView.GetProcedureProperties;
  1198. begin
  1199.   if not Assigned (FProcedureData[Fidx].Params) then
  1200.   begin
  1201.     FProcedureData[Fidx].Params := TStringList.Create;
  1202.     FProcedureData[Fidx].Source := TStringList.Create;
  1203.   end;
  1204.  
  1205.   if (FProcedureData[Fidx].Source.Count = 0) or FRefreshList[FIdx] = true then
  1206.   begin
  1207.     FProcedureData[Fidx].Params.Clear;
  1208.     FProcedureData[Fidx].Source.Clear;
  1209.     FRefreshList[FIdx] := false;
  1210.     dmMain.GetProcedureInfo(FProcedureData[FIdx].Params, FProcedureData[FIdx].Source, FDatabase, FObjName);
  1211.  
  1212.     if FProcedureData[FIdx].Params.Count = 1 then
  1213.       { This procedure has no parameters, so get the source }
  1214.       dmMain.getProcedureSource (FProcedureData[FIdx].Source, FDatabase, FObjName);
  1215.   end;
  1216.  
  1217.   if FProcedureData[Fidx].Params.Count > 1 then
  1218.     FillList (lvParams, FProcedureData[Fidx].Params)
  1219.   else
  1220.   begin
  1221.     lvParams.Items.Clear;
  1222.     ShowProcSource(nil, nil, ctText);
  1223.   end;
  1224. end;
  1225.  
  1226. procedure TfrmObjectView.ShowProcSource(Sender: TObject; Item: TListItem;
  1227.   Change: TItemChange);
  1228. begin
  1229.   reProcSource.Lines.BeginUpdate;
  1230.   reProcSource.Lines.Clear;
  1231.   reProcSource.Lines.AddStrings (FProcedureData[Fidx].Source);
  1232.   reProcSource.Lines.EndUpdate
  1233. end;
  1234.  
  1235. procedure TfrmObjectView.GetFunctionProperties;
  1236. begin
  1237.   if not Assigned(FFunctionData[FIdx].Params) then
  1238.     FFunctionData[Fidx].Params := TStringList.Create;
  1239.  
  1240.   if (Length(FFunctionData[FIdx].ModuleName) = 0) or FRefreshList[FIdx] = true then
  1241.   begin
  1242.     FFunctionData[Fidx].Params.Clear;
  1243.     FRefreshList[FIdx] := false;    
  1244.     with FFunctionData[FIdx] do
  1245.       dmMain.GetFunctionData(Params, ModuleName, EntryPoint, ReturnVal, Fdatabase, FObjName);
  1246.   end;
  1247.  
  1248.   FillList (lvFuncview, FFunctionData[FIdx].Params);
  1249.   edModName.Text := FFunctionData[FIdx].ModuleName;
  1250.   edEntrypoint.Text := FFunctionData[FIdx].Entrypoint;
  1251.   edReturnVal.Text := FFunctionData[FIdx].ReturnVal;
  1252. end;
  1253.  
  1254. procedure TfrmObjectView.GetFilterProperties;
  1255. var
  1256.   lLine: String;
  1257. begin
  1258.   if not Assigned(FFilterData) then
  1259.     FFilterData := TStringList.Create;
  1260.  
  1261.   if (FFilterData.Count = 0) or FRefreshList[FIdx] = true then
  1262.   begin
  1263.     FFilterData.Clear;
  1264.     FRefreshList[FIdx] := false;    
  1265.     dmMain.GetFilterData(FFilterData, Fdatabase, FObjName);
  1266.   end;
  1267.  
  1268.   lLine := FFilterData.Strings[FIdx];
  1269.   edFilterModule.Text := GetNextField(lLine,DEL);
  1270.   edFilterEntry.Text := GetNextField(lLine,DEL);
  1271.   edFilterInput.Text := GetNextField(lLine,DEL);
  1272.   edFilterOutput.Text := GetNextField(lLine,DEL);
  1273. end;
  1274.  
  1275.  
  1276. procedure TfrmObjectView.GetRoleProperties;
  1277. begin
  1278.   if not Assigned(FRoleData) then
  1279.     FRoleData := TStringList.Create;
  1280.  
  1281.   if (FRoleData.Count = 0) or FRefreshList[FIdx] = true then
  1282.   begin
  1283.     FRoleData.Clear;
  1284.     FRefreshList[FIdx] := false;
  1285.     dmMain.GetRoleData(FRoleData, Fdatabase, FObjName);
  1286.   end;
  1287. end;
  1288.  
  1289. procedure TfrmObjectView.GetExceptionProperties;
  1290. var
  1291.   lLine: String;
  1292. begin
  1293.   if not Assigned (FExceptionData) then
  1294.     FExceptionData := TStringList.Create;
  1295.  
  1296.   if (FExceptionData.Count = 0) or FRefreshList[FIdx] = true then
  1297.   begin
  1298.     FExceptionData.Clear;
  1299.     FRefreshList[FIdx] := false;    
  1300.     dmMain.GetExceptionData (FExceptionData, FDatabase, FObjName);
  1301.   end;
  1302.  
  1303.   lLine := FExceptionData.Strings[FIdx];
  1304.   edExceptionNumber.Text := GetNextField(lLine, DEL);
  1305.   edMessage.Text := GetNextField(lLine, DEL);
  1306. end;
  1307.  
  1308. procedure TfrmObjectView.GetGeneratorProperties;
  1309. var
  1310.   lLine: String;
  1311. begin
  1312.   if not Assigned (FGenData) then
  1313.     FGenData := TStringList.Create;
  1314.  
  1315.   if (FGenData.Count = 0) or FRefreshList[FIdx] = true then
  1316.   begin
  1317.     FGenData.Clear;
  1318.     FRefreshList[FIdx] := false;    
  1319.     dmMain.GetGeneratorData (FGenData, FDatabase, FShowSystem);
  1320.   end;
  1321.  
  1322.   lLine := FGenData.Strings[FIdx];
  1323.   edGenID.Text := GetNextField(lLine, DEL);
  1324.   edNextValue.Text := GetNextField(lLine, DEL);
  1325. end;
  1326.  
  1327. procedure TfrmObjectView.GetViewProperties;
  1328. var
  1329.   lLine: String;
  1330. begin
  1331.   if not Assigned (FViewData) then
  1332.     FViewData := TStringList.Create;
  1333.  
  1334.   if (FViewData.Count = 0) or FRefreshList[FIdx] = true then
  1335.   begin
  1336.     FViewData.Clear;
  1337.     FRefreshList[FIdx] := false;
  1338.     dmMain.GetViewData (FViewData, FDatabase, FObjName);
  1339.   end;
  1340.   reTriggerSource.Clear;
  1341.   reTriggerSource.Visible := true;
  1342.   lvTableObjects.Align := alTop;
  1343.   lvTableObjects.Anchors := [akLeft, akRight, akTop, akBottom];
  1344.   lvTableObjects.Height := lvTableObjects.Parent.Height div 2;
  1345.   SplitterWnd.Visible := true;
  1346.   SplitterWnd.Top := lvTableObjects.Height + lvTableObjects.Top;
  1347.   lLine := FViewData.Strings[FIdx];
  1348.   GetNextField(lLine, DEL);
  1349.   reTriggerSource.Lines.Text := GetNextField(lLine, DEL);
  1350. end;
  1351.  
  1352. procedure TfrmObjectView.FormShow(Sender: TObject);
  1353. begin
  1354.   FIdx := cbObjectList.ItemIndex;
  1355. end;
  1356.  
  1357. procedure TfrmObjectView.rbDependentClick(Sender: TObject);
  1358. begin
  1359.   pnlDependents.Visible := true;
  1360.   pnlDependencies.Visible := false;
  1361. end;
  1362.  
  1363. procedure TfrmObjectView.rbDependedOnClick(Sender: TObject);
  1364. begin
  1365.   pnlDependents.Visible := false;
  1366.   pnlDependencies.Visible := true;
  1367. end;
  1368.  
  1369. procedure TfrmObjectView.FormClose(Sender: TObject;
  1370.   var Action: TCloseAction);
  1371. var
  1372.   Reg: TRegistry;
  1373.   State: TWinState;
  1374. begin
  1375.     with State do
  1376.     begin
  1377.       _Top := Top;
  1378.       _Left := Left;
  1379.       _Height := Height;
  1380.       _Width := Width;
  1381.       _State := WindowState;
  1382.       _Read := true;
  1383.     end;
  1384.   Reg := TRegistry.Create;
  1385.   with Reg do begin
  1386.     OpenKey(gRegSettingsKey,false);
  1387.     WriteBinaryData('ObjState', State, sizeof(State));
  1388.     CloseKey;
  1389.     Free;
  1390.   end;
  1391.   frmMain.UpdateWindowList (Caption, Self, True);
  1392. end;
  1393.  
  1394. procedure TfrmObjectView.Refetch;
  1395. var
  1396.   lCnt: integer;
  1397. begin
  1398.   for lCnt := Low(FRefreshList) to High(FRefreshList) do
  1399.     FRefreshList[lCnt] := true;
  1400.   pgcPropertiesChange(pgcProperties);
  1401. end;
  1402.  
  1403. end.
  1404.