home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / nastroje / d3456 / KBMWABD.ZIP / WABD_FormEditor.pas < prev    next >
Pascal/Delphi Source File  |  2001-07-15  |  16KB  |  583 lines

  1. unit WABD_FormEditor;
  2.  
  3. {$I kbmWABD.inc}
  4. {$IFDEF VER100}
  5. {$ASSERTIONS ON}
  6. {$ENDIF}
  7.  
  8. interface
  9.  
  10. uses
  11. {$ifdef LEVEL6}
  12.   DesignEditors, DesignIntf,
  13. {$else}
  14.   DsgnIntf,
  15. {$endif}
  16.   WABD_FormSecEditor,
  17.   WABD_Reg,
  18.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  19.   WABD_Objects, StdCtrls, ExtCtrls, Menus, Buttons,
  20.   ShellAPI
  21.  ;
  22.  
  23.  
  24. type
  25.    TWABDFormEditor = class(TForm)
  26.     Panel1: TPanel;
  27.     Panel2: TPanel;
  28.     Panel3: TPanel;
  29.     Label1: TLabel;
  30.     AddButton: TButton;
  31.     DeleteBut: TButton;
  32.     AddCombo: TComboBox;
  33.     PreviewBut: TButton;
  34.     Panel6: TPanel;
  35.     UpBut: TSpeedButton;
  36.     DownBut: TSpeedButton;
  37.     ToolPanel: TPanel;
  38.     ToolMenu: TPopupMenu;
  39.     FlatButtons1: TMenuItem;
  40.     TopButPanel: TPanel;
  41.     HeaderSpeed: TSpeedButton;
  42.     FormSecSpeed: TSpeedButton;
  43.     TableSpeed: TSpeedButton;
  44.     DataTableSpeed: TSpeedButton;
  45.     HiddenSpeed: TSpeedButton;
  46.     SecButPanel: TPanel;
  47.     AnchorSpeed: TSpeedButton;
  48.     ImageSpeed: TSpeedButton;
  49.     LabelSpeed: TSpeedButton;
  50.     MemoSpeed: TSpeedButton;
  51.     ButtonSpeed: TSpeedButton;
  52.     EditSpeed: TSpeedButton;
  53.     ComboSpeed: TSpeedButton;
  54.     RadioSpeed: TSpeedButton;
  55.     ListSpeed: TSpeedButton;
  56.     CheckSpeed: TSpeedButton;
  57.     ChildrenBox: TListBox;
  58.     FSPanel: TPanel;
  59.     Label2: TLabel;
  60.     AddSectionBut: TButton;
  61.     DeleteSecBut: TButton;
  62.     AddSectionCombo: TComboBox;
  63.     SectionCombo: TListBox;
  64.     ShowFormSecBut: TButton;
  65.     LiveImageSpeed: TSpeedButton;
  66.     SpeedButton1: TSpeedButton;
  67.     SpeedButton2: TSpeedButton;
  68.     SpeedButton3: TSpeedButton;
  69.     procedure AddButtonClick(Sender: TObject);
  70.     procedure AddSectionButClick(Sender: TObject);
  71.     procedure ChildrenBoxChange(Sender: TObject);
  72.     procedure DeleteButClick(Sender: TObject);
  73.     procedure SectionComboChange(Sender: TObject);
  74.     procedure DeleteSecButClick(Sender: TObject);
  75.     procedure AddComboChange(Sender: TObject);
  76.     procedure AddSectionComboChange(Sender: TObject);
  77.     procedure FlatButtons1Click(Sender: TObject);
  78.     procedure SecLevelSpeedClick(Sender: TObject);
  79.     procedure UpButClick(Sender: TObject);
  80.     procedure DownButClick(Sender: TObject);
  81.     procedure FormCreate(Sender: TObject);
  82.     procedure ShowFormSecButClick(Sender: TObject);
  83.     procedure PreviewButClick(Sender: TObject);
  84.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  85.     procedure FormDestroy(Sender: TObject);
  86.     procedure FormSecSpeedClick(Sender: TObject);
  87.     procedure HeaderSpeedClick(Sender: TObject);
  88.     procedure TableSpeedClick(Sender: TObject);
  89.     procedure DataTableSpeedClick(Sender: TObject);
  90.     procedure HiddenSpeedClick(Sender: TObject);
  91.    private
  92.       FWABDForm   : TWABD_Form;
  93.       FSEditor    : TFormSectionEditor;
  94.       procedure   SetWABDForm(NewForm: TWABD_Form);
  95.    public
  96. {$ifdef LEVEL6}
  97.       MyDesigner   : IDesigner;
  98. {$else}
  99.  {$ifdef LEVEL5}
  100.       MyDesigner   : IFormDesigner;
  101.  {$else}
  102.   {$ifdef LEVEL4}
  103.       MyDesigner   : IFormDesigner;
  104.   {$else}
  105.    {$ifdef LEVEL3}
  106.       MyDesigner   : TFormDesigner; // Delphi 3, C++ Builder 3
  107.    {$endif}
  108.   {$endif}
  109.  {$endif}
  110. {$endif}
  111.  
  112.       fs          : TWABD_FormSection;
  113.       property    WABDForm: TWABD_Form read FWABDForm write SetWABDForm;
  114.       procedure   ReflectedNotify(Sender: TObject; AComponent: TComponent; Operation: TOperation);
  115.       procedure   ChildNameChanged(Sender: TObject; const OldName, NewName: string);
  116.       procedure   Initialize;
  117.       procedure   InitializeSection;
  118.       procedure   AddTopLevelClass(newc: TComponentClass);
  119.       procedure   AddTopLevel(Index: integer);
  120.       function    AddSectionLevel(Index: integer): TWABD_SectionObject;
  121.       procedure   EnableSectionButs(b: boolean);
  122.    end;
  123.  
  124. var
  125.   WABDFormEditor: TWABDFormEditor;
  126.  
  127. implementation
  128.  
  129. {$R *.DFM}
  130.  
  131. function MaxInt(a, b: integer): integer;
  132. begin
  133.    if a < b then Result := a
  134.       else Result := b;
  135. end;
  136.  
  137. procedure TWABDFormEditor.SetWABDForm(NewForm: TWABD_Form);
  138. begin
  139.    FWABDForm := NewForm;
  140. end;
  141.  
  142. procedure TWABDFormEditor.AddTopLevelClass(newc: TComponentClass);
  143. var
  144.    c     : TWABD_Object;
  145.    ni    : integer;
  146. begin
  147.    if newc = nil then exit;
  148.  
  149.    c := MyDesigner.CreateComponent(newc, WABDForm, 0, 0, 0, 0) as TWABD_Object;
  150.    if c=nil then exit;
  151.    c.Parent := WABDForm;
  152.    MyDesigner.Modified;
  153.    ni := ChildrenBox.Items.Add(c.Name);
  154.    ChildrenBox.ItemIndex := ni;
  155.    ChildrenBoxChange(Self);
  156. end;
  157.  
  158. procedure TWABDFormEditor.AddTopLevel(Index: integer);
  159. var
  160.    newc  : TComponentClass;
  161. begin
  162.    newc := GetWABDClassListItem(Index);
  163.    AddTopLevelClass(newc);
  164. end;
  165.  
  166.  
  167. procedure TWABDFormEditor.AddButtonClick(Sender: TObject);
  168. var
  169.    pc    : TPersistentClass;
  170. begin
  171.    pc := GetClass(AddCombo.Items[AddCombo.ItemIndex]);
  172.    Assert(pc<>nil, 'Can not find class name: ' + AddCombo.Items[AddCombo.ItemIndex]);
  173.    AddTopLevel(AddCombo.ItemIndex);
  174. end;
  175.  
  176. function TWABDFormEditor.AddSectionLevel(Index: integer): TWABD_SectionObject;
  177. var
  178.    newc  : TComponentClass;
  179.    c     : TWABD_Object;
  180.    ni    : integer;
  181. begin
  182.    newc := nil;
  183.    case Index of
  184.       0  :  newc := TWABD_Anchor;
  185.       1  :  newc := TWABD_Image;
  186.       2  :  newc := TWABD_Label;
  187.       3  :  newc := TWABD_Memo;
  188.       4  :  newc := TWABD_Button;
  189.       5  :  newc := TWABD_Edit;
  190.       6  :  newc := TWABD_ComboBox;
  191.       7  :  newc := TWABD_RadioButton;
  192.       8  :  newc := TWABD_ListBox;
  193.       9  :  newc := TWABD_CheckBox;
  194.       10 :  newc := TWABD_LiveImage;
  195.       11 :  newc := TWABD_Chart;
  196.       12 :  newc := TWABD_HTMLEmbed;
  197.       13 :  newc := TWABD_HTMLFileEmbed;
  198.       14 :  newc := TWABD_UploadFile;
  199.    end;
  200.    Result := nil;
  201.    if newc = nil then exit;
  202.  
  203.    Assert(fs<>nil, 'c = nil');
  204.    c := MyDesigner.CreateComponent(newc, fs, 0, 0, 0, 0) as TWABD_Object;
  205.    Assert(c<>nil, 'c = nil');
  206.    c.Parent := fs;
  207.    MyDesigner.Modified;
  208.    ni := SectionCombo.Items.Add(c.Name);
  209.    SectionCombo.ItemIndex := ni;
  210.    SectionComboChange(Self);
  211.  
  212.    if FSEditor.Visible then FSEditor.Init;
  213.    Result := c as TWABD_SectionObject;
  214. end;
  215.  
  216. procedure TWABDFormEditor.AddSectionButClick(Sender: TObject);
  217. begin
  218.    AddSectionLevel(AddSectionCombo.ItemIndex);
  219. end;
  220.  
  221. procedure TWABDFormEditor.Initialize;
  222. var
  223.    i : integer;
  224.    c : TWABD_Object;
  225. begin
  226.    Caption := 'WABD Form Designer - ' + WABDForm.Name;
  227.    Assert(MyDesigner<>nil, 'Designer = nil');
  228.  
  229.    WABDForm.RefNotify := ReflectedNotify;
  230.    WABDForm.OnChildNameChanged := ChildNameChanged;
  231.    // WABDForm.FreeNotification(Self);
  232.    ChildrenBox.Items.Clear;
  233.    SectionCombo.Items.Clear;
  234.  
  235.    Assert(WABDForm<>nil, 'WABDForm = nil');
  236.    for i := 0 to WABDForm.ChildCount-1 do begin
  237.       c := WABDForm.Children[i];
  238.       Assert(c<>nil, 'c = nil');
  239.       ChildrenBox.Items.Add(c.Name);
  240.    end;
  241.    ChildrenBoxChange(Self);
  242.    AddCombo.ItemIndex := 0;
  243.    AddComboChange(Self);
  244.    AddSectionCombo.ItemIndex := 0;
  245.    AddSectionComboChange(Self);
  246.    SectionComboChange(Self);
  247. end;
  248.  
  249.  
  250. procedure TWABDFormEditor.ChildrenBoxChange(Sender: TObject);
  251. var
  252.    c        : TWABD_Object;
  253.    ni       : integer;
  254.    HaveSect : boolean;
  255. begin
  256.    HaveSect := False;
  257.    ni := ChildrenBox.ItemIndex;
  258.  
  259.    DeleteBut.Enabled := ni<>-1;
  260.    UpBut.Enabled     := ni<>-1;
  261.    DownBut.Enabled   := ni<>-1;
  262.  
  263.    if ni = -1 then begin
  264.       FSPanel.Visible := False;
  265.       FSEditor.Visible := False;
  266.       EnableSectionButs(False);
  267.       exit;
  268.    end;
  269.  
  270.    if ni<>-1 then begin
  271.       c := WABDForm.ChildByName(ChildrenBox.Items[ni]);
  272.       Assert(c<>nil, 'c = nil');
  273.       MyDesigner.SelectComponent(c);
  274.       FSPanel.Visible := c is TWABD_FormSection;
  275.       if (c is TWABD_FormSection) then begin
  276.          HaveSect := True;
  277.          fs := c as TWABD_FormSection;
  278.          InitializeSection;
  279.          FSEditor.FS := fs;
  280.          FSEditor.Init;
  281.          FSPanel.Invalidate;
  282.       end;
  283.    end;
  284.    FSPanel.Visible := HaveSect;
  285.    if not FSPanel.Visible then
  286.       FSEditor.Visible := False;
  287.    EnableSectionButs(HaveSect);
  288.  
  289. end;
  290.  
  291. procedure TWABDFormEditor.DeleteButClick(Sender: TObject);
  292. var
  293.    c     : TWABD_Object;
  294.    ni    : integer;
  295. begin
  296.    ni := ChildrenBox.ItemIndex;
  297.    if ni=-1 then exit;
  298.  
  299.    c := WABDForm.ChildByName(ChildrenBox.Items[ni]);
  300.    Assert(c<>nil, 'c = nil');
  301.  
  302.    c.Free;
  303.    MyDesigner.SelectComponent(nil);
  304.    //   ChildrenBox.Items.Delete(ni);  // No need for this, ReflectedNotify removes it automatically
  305.    ni := MaxInt(ni, ChildrenBox.Items.Count-1);
  306.    ChildrenBox.ItemIndex := ni;
  307.    if ChildrenBox.Items.Count=0 then ChildrenBox.Items.Clear;  // ComboBox Bug
  308.    ChildrenBoxChange(Self);
  309. end;
  310.  
  311. procedure TWABDFormEditor.InitializeSection;
  312. var
  313.    i : integer;
  314.    c : TWABD_Object;
  315. begin
  316.    SectionCombo.Items.Clear;
  317.  
  318.    for i := 0 to fs.ChildCount-1 do begin
  319.       c := fs.Children[i];
  320.       Assert(c<>nil, 'c = nil');
  321.       SectionCombo.Items.Add(c.Name);
  322.    end;
  323. end;
  324.  
  325.  
  326. procedure TWABDFormEditor.SectionComboChange(Sender: TObject);
  327. var
  328.    ni : integer;
  329.    c  : TWABD_Object;
  330. begin
  331.    ni := SectionCombo.ItemIndex;
  332.  
  333.    DeleteSecBut.Enabled := ni<>-1;
  334.  
  335.    if ni=-1 then exit;
  336.    c := fs.ChildByName(SectionCombo.Items[ni]) as TWABD_Object;
  337.    Assert(c<>nil, 'c = nil');
  338.    MyDesigner.SelectComponent(c);
  339. end;
  340.  
  341. procedure TWABDFormEditor.DeleteSecButClick(Sender: TObject);
  342. var
  343.    ni : integer;
  344.    c  : TWABD_Object;
  345. begin
  346.    ni := SectionCombo.ItemIndex;
  347.  
  348.    if ni=-1 then exit;
  349.    c := fs.ChildByName(SectionCombo.Items[ni]) as TWABD_Object;
  350.    Assert(c<>nil, 'c = nil');
  351.  
  352.    c.Free;
  353.    MyDesigner.SelectComponent(nil);
  354.    // SectionCombo.Items.Delete(ni); // No need for this, ReflectedNotify removes it automatically
  355.    ni := MaxInt(ni, SectionCombo.Items.Count-1);
  356.    SectionCombo.ItemIndex := ni;
  357.    if SectionCombo.Items.Count=0 then SectionCombo.Items.Clear;  // ComboBox Bug
  358.    SectionComboChange(Self);
  359. end;
  360.  
  361. procedure TWABDFormEditor.AddComboChange(Sender: TObject);
  362. begin
  363.    AddButton.Enabled := AddCombo.ItemIndex <> -1;
  364. end;
  365.  
  366. procedure TWABDFormEditor.AddSectionComboChange(Sender: TObject);
  367. begin
  368.    AddSectionBut.Enabled := AddSectionCombo.ItemIndex <> -1;
  369. end;
  370.  
  371. // I had to do this hack because Delphi 3 won't let me compile with
  372. // the DsgnWnds unit.
  373. procedure TWABDFormEditor.ReflectedNotify(Sender: TObject; AComponent: TComponent; Operation: TOperation);
  374. var
  375.    i : integer;
  376. begin
  377.    // Pass it on to the Form Section Editor
  378.    FSEditor.ReflectedNotify(Sender, AComponent, Operation);
  379.  
  380.    if (Operation <> opRemove) then exit;
  381.  
  382.    if AComponent=WABDForm then begin
  383.       WABDForm.RefNotify := nil;
  384.       WABDForm := nil;
  385.       Visible  := False;
  386.       FSEditor.Visible := False;
  387.    end;
  388.  
  389.    i := ChildrenBox.Items.IndexOf(AComponent.Name);
  390.    if i<>-1 then begin
  391.       ChildrenBox.Items.Delete(i);
  392.       if ChildrenBox.Items.Count=0 then ChildrenBox.Items.Clear;  // ComboBox Bug
  393.       ChildrenBoxChange(Self);
  394.    end;
  395.  
  396.    i := SectionCombo.Items.IndexOf(AComponent.Name);
  397.    if i<>-1 then begin
  398.       SectionCombo.Items.Delete(i);
  399.       if SectionCombo.Items.Count=0 then SectionCombo.Items.Clear;  // ComboBox Bug
  400.       SectionComboChange(Self);
  401.    end;
  402. end;
  403.  
  404.  
  405.  
  406. procedure TWABDFormEditor.FlatButtons1Click(Sender: TObject);
  407. var
  408.    i : integer;
  409.    c : TControl;
  410. begin
  411.    FlatButtons1.Checked := not FlatButtons1.Checked;
  412.  
  413.    for i := 0 to TopButPanel.ControlCount-1 do begin
  414.       c := TopButPanel.Controls[i];
  415.       if (c is TSpeedButton) then begin
  416.          {$IFDEF VER100}
  417.          (c as TSpeedButton).Flat := FlatButtons1.Checked;
  418.          {$ENDIF}
  419.       end;
  420.    end;
  421.  
  422.    for i := 0 to SecButPanel.ControlCount-1 do begin
  423.       c := SecButPanel.Controls[i];
  424.       if (c is TSpeedButton) then begin
  425.          {$IFDEF VER100}
  426.          (c as TSpeedButton).Flat := FlatButtons1.Checked;
  427.          {$ENDIF}
  428.       end;
  429.    end;
  430. end;
  431.  
  432. procedure TWABDFormEditor.SecLevelSpeedClick(Sender: TObject);
  433. begin
  434.    AddSectionLevel((Sender as TSpeedButton).Tag);
  435. end;
  436.  
  437. procedure TWABDFormEditor.EnableSectionButs(b: boolean);
  438. var
  439.    i : integer;
  440.    c : TControl;
  441. begin
  442.    for i := 0 to SecButPanel.ControlCount-1 do begin
  443.       c := SecButPanel.Controls[i];
  444.       if (c is TSpeedButton) then
  445.          (c as TSpeedButton).Enabled := b;
  446.    end;
  447. end;
  448.  
  449. procedure TWABDFormEditor.UpButClick(Sender: TObject);
  450. var
  451.    c     : TWABD_Object;
  452.    ni    : integer;
  453.    n     : string;
  454. begin
  455.    ni := ChildrenBox.ItemIndex;
  456.    if ni=-1 then exit;
  457.  
  458.    c := WABDForm.ChildByName(ChildrenBox.Items[ni]);
  459.    Assert(c<>nil, 'c = nil');
  460.    n := c.Name;
  461.  
  462.    c.Order := c.Order-1;
  463.    MyDesigner.Modified;
  464.    Initialize;
  465.    ChildrenBox.ItemIndex := ChildrenBox.Items.IndexOf(n);
  466.    ChildrenBoxChange(Self);
  467. end;
  468.  
  469. procedure TWABDFormEditor.DownButClick(Sender: TObject);
  470. var
  471.    c     : TWABD_Object;
  472.    ni    : integer;
  473.    n     : string;
  474. begin
  475.    ni := ChildrenBox.ItemIndex;
  476.    if ni=-1 then exit;
  477.  
  478.    c := WABDForm.ChildByName(ChildrenBox.Items[ni]);
  479.    Assert(c<>nil, 'c = nil');
  480.    n := c.Name;
  481.  
  482.    c.Order := c.Order+1;
  483.    MyDesigner.Modified;
  484.    Initialize;
  485.    ChildrenBox.ItemIndex := ChildrenBox.Items.IndexOf(n);
  486.    ChildrenBoxChange(Self);
  487. end;
  488.  
  489. procedure TWABDFormEditor.FormCreate(Sender: TObject);
  490. var
  491.    i : integer;
  492. begin
  493.    FSEditor := TFormSectionEditor.Create(Self);
  494.  
  495.    AddCombo.Items.Clear;
  496.    for i := 0 to GetWABDClassListCount-1 do begin
  497.       AddCombo.Items.Add(GetWABDClassListItem(i).ClassName);
  498.    end;
  499. end;
  500.  
  501. procedure TWABDFormEditor.ShowFormSecButClick(Sender: TObject);
  502. begin
  503.    FSEditor.MyDesigner:=MyDesigner;
  504.    FSEditor.FS := FS;
  505.    FSEditor.Init;
  506.    FSEditor.Show;
  507. end;
  508.  
  509. procedure TWABDFormEditor.PreviewButClick(Sender: TObject);
  510. var
  511.    f    : string;
  512.    h    : string;
  513.    fstm : TFileStream;
  514.    rc   : integer;
  515. begin
  516.    f := 'LocalTemp.htm';
  517.    h := WABDForm.Object_To_HTML;
  518.    fstm := TFileStream.Create(f, fmCreate or fmOpenWrite or fmShareDenyWrite);
  519.    fstm.Write(h[1], Length(h));
  520.    fstm.Free;
  521.  
  522.    rc := ShellExecute(Handle, 'open', PChar(f), nil, nil, SW_SHOWNORMAL);
  523.    if (rc <= 32) then ShowMessage('Unable to execute: ' + f + #13#10 + 'Browser not installed?');
  524. end;
  525.  
  526. procedure TWABDFormEditor.Notification(AComponent: TComponent; Operation: TOperation);
  527. begin
  528.    if (Operation = opRemove) and (AComponent = WABDForm) then begin
  529.       WABDForm := nil;
  530.       Hide;
  531.       FSEditor.Hide;
  532.    end;
  533. end;
  534.  
  535. procedure TWABDFormEditor.FormDestroy(Sender: TObject);
  536. begin
  537.    if WABDForm<>nil then WABDForm.RefNotify := nil;
  538. end;
  539.  
  540.  
  541. procedure TWABDFormEditor.FormSecSpeedClick(Sender: TObject);
  542. begin
  543.    AddTopLevelClass(TWABD_FormSection);
  544. end;
  545.  
  546. procedure TWABDFormEditor.HeaderSpeedClick(Sender: TObject);
  547. begin
  548.    AddTopLevelClass(TWABD_Header);
  549. end;
  550.  
  551. procedure TWABDFormEditor.TableSpeedClick(Sender: TObject);
  552. begin
  553.    AddTopLevelClass(TWABD_Table);
  554. end;
  555.  
  556. procedure TWABDFormEditor.DataTableSpeedClick(Sender: TObject);
  557. begin
  558.    AddTopLevelClass(TWABD_DataTable);
  559. end;
  560.  
  561. procedure TWABDFormEditor.HiddenSpeedClick(Sender: TObject);
  562. begin
  563.    AddTopLevelClass(TWABD_Hidden);
  564. end;
  565.  
  566. procedure TWABDFormEditor.ChildNameChanged(Sender: TObject; const OldName, NewName: string);
  567. var
  568.    i : integer;
  569. begin
  570.    i := ChildrenBox.Items.IndexOf(OldName);
  571.    if i<>-1 then begin
  572.       ChildrenBox.Items[i] := NewName;
  573.    end;
  574.  
  575.    i := SectionCombo.Items.IndexOf(OldName);
  576.    if i<>-1 then begin
  577.       SectionCombo.Items[i] := NewName;
  578.    end;
  579. end;
  580.  
  581.  
  582. end.
  583.