// $Id: JvNavPaneDemoMainForm.pas 10610 2006-05-19 13:35:08Z elahn $
unit JvNavPaneDemoMainForm;

{$mode objfpc}{$H+}

interface

uses
  LCLIntf, LMessages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, {JvOutlookBar,} ComCtrls, CheckLst, //JvComponent,
  JvNavigationPane, ImgList, Menus, {JvPageList, JclWin32, JvExControls,} ExtCtrls,
  {JvExExtCtrls,} ExtDlgs, LResources;

type
  TJvNavPaneDemoMainFrm = class(TForm)
    PopupMenu1: TPopupMenu;
    LargeImages: TImageList;
    HideAll1: TMenuItem;
    ShowAll1: TMenuItem;
    N1: TMenuItem;
    Dontallowresize1: TMenuItem;
    ChangeFont1: TMenuItem;
    SmallImages: TImageList;
    Colors1: TMenuItem;
    Standard1: TMenuItem;
    Blue1: TMenuItem;
    Silver1: TMenuItem;
    Olive1: TMenuItem;
    N2: TMenuItem;
    ShowToolPanel1: TMenuItem;
    ToolImages: TImageList;
    ShowCloseButton1: TMenuItem;
    N3: TMenuItem;
    BackgroundImage1: TMenuItem;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure FormCreate(Sender: TObject);
    procedure Dontallowresize1Click(Sender: TObject);
    procedure HideAll1Click(Sender: TObject);
    procedure ShowAll1Click(Sender: TObject);
    procedure ChangeFont1Click(Sender: TObject);
    procedure SchemaClick(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure ShowToolPanel1Click(Sender: TObject);
    procedure ShowCloseButton1Click(Sender: TObject);
    procedure BackgroundImage1Click(Sender: TObject);
  private
    JvNavPaneStyleManager1: TJvNavPaneStyleManager;
    JvOutlookSplitter1: TJvOutlookSplitter;
    { Private declarations }
    procedure DoToolMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
    procedure DoToolMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
    procedure DoToolPanelClose(Sender: TObject);
    procedure DoToolButtonClick(Sender: TObject; Index: integer);
    procedure DoToolEndDock(Sender, Target: TObject; X, Y: Integer);
  public
    { Public declarations }
    NP: TJvNavigationPane;
    NT: TJvNavPaneToolPanel;
  end;

var
  JvNavPaneDemoMainFrm: TJvNavPaneDemoMainFrm;

implementation
uses
  CommCtrl;

procedure TJvNavPaneDemoMainFrm.FormCreate(Sender: TObject);
var
  Page: TJvNavPanelPage;
  N: TTreeNode;
  R: TRect;
  i: integer;
  
  tv: TTreeView;
  
  dummy: integer;
begin
  //Self.Height := 600;
  //Self.Width := 800;
  (*
  object JvNavPaneStyleManager1: TJvNavPaneStyleManager
    Theme = nptXPOlive
    Left = 32
    Top = 50
  end
  object JvOutlookSplitter1: TJvOutlookSplitter
    Left = 0
    Top = 0
    Width = 7
    Height = 434
    Cursor = crSizeWE
    Align = alLeft
    ColorFrom = 7703937
    ColorTo = 3823693
    StyleManager = JvNavPaneStyleManager1
    ParentStyleManager = False
  end
  *)
  JvNavPaneStyleManager1 := TJvNavPaneStyleManager.Create(Self);
  JvNavPaneStyleManager1.Theme := nptXPOlive;
  
  JvOutlookSplitter1 := TJvOutlookSplitter.Create(Self);
  JvOutlookSplitter1.Parent := Self;
  JvOutlookSplitter1.Align := alLeft;
  JvOutlookSplitter1.ColorFrom := TColor(7703937);
  JvOutlookSplitter1.ColorTo := TColor(3823693);
  JvOutlookSplitter1.StyleManager := JvNavPaneStyleManager1;
  JvOutlookSplitter1.ParentStyleManager := False;

  JvNavPaneStyleManager1.Theme := nptCustom;
  // this is how to create a NavPane at run-time
  // also shows how to create and insert pages as well as controls on pages
  NP := TJvNavigationPane.Create(Self);

  NP.Parent := Self;
  NP.Cursor := crHandPoint;
  NP.Width := 220;
  //  NP.BorderWidth := 2;
  NP.Align := alLeft;
  JvOutlookSplitter1.Left := 225;
  JvOutlookSplitter1.MinSize := 220;
  NP.DropDownMenu := PopupMenu1;
  NP.SmallImages := SmallImages;
  NP.LargeImages := LargeImages;
  NP.AutoHeaders := True;
  NP.StyleManager := JvNavPaneStyleManager1;

  Page := TJvNavPanelPage.Create(Self);
  Page.Caption := '&Mail';
  Page.ImageIndex := 0;
  Page.PageList := NP;

  with TJvNavPanelDivider.Create(Self) do
  begin
    Caption := 'Favorite Folders';
    Parent := Page;
    Top := 100;
    Align := alTop;
    Enabled := false;
    Cursor := crDefault;
    StyleManager := JvNavPaneStyleManager1;
  end;

  tv := TTreeView.Create(Self);
  with tv do
  begin
    Parent := Page;
    Top := 200;
    Align := alTop;
    Font.Style := [];
    BorderStyle := bsNone;
    Items.Add(nil, 'Inbox');
    Items.Add(nil, 'Unread Mail');
    Items.Add(nil, 'For Follow Up [4]');
    Items.Add(nil, 'Sent Items');
    Height := 100;
  end;

  with TJvNavPanelDivider.Create(Self) do
  begin
    Caption := 'All Mail Folders';
    Parent := Page;
    Top := tv.Top + tv.Height; // 201; // old = 100
    Align := alTop;
    Cursor := crSizeNS;
    StyleManager := JvNavPaneStyleManager1;
  end;

  with TTreeView.Create(Self) do
  begin
    Parent := Page;
    Align := alClient;
    BorderStyle := bsNone;
    Font.Style := [];
    N := Items.Add(nil, 'Mailbox - Chris Gray');
    Items.AddChild(N, 'Deleted Items');
    Items.AddChild(N, 'Drafts');
    Items.AddChild(N, 'Inbox');
    Items.AddChild(N, 'Junk E-mail');
    Items.AddChild(N, 'Outbox');
    Items.AddChild(N, 'Sent Items');
    N := Items.AddChild(N, 'Search Folders');
    Items.AddChild(N, 'For Follow Up [4]');
    Items.AddChild(N, 'Large Mail');
    Items.AddChild(N, 'Unread Mail');
    FullExpand;
  end;

  Page := TJvNavPanelPage.Create(Self);
  Page.Caption := '&Calendar';
  Page.ImageIndex := 1;
  Page.PageList := NP;
  //TODO: replace
  (*
  // NB! TMonthCalendar messes up the form when you size the form smaller than one calendar width
  with TMonthCalendar.Create(Self) do
  begin
    Parent := Page;
    Align := alTop;
    AutoSize := true;
    AutoSize := false;
    Date := SysUtils.Date;
    MonthCal_GetMinReqRect(Handle, R);
  end;
  Constraints.MinHeight := R.Bottom - R.Top + 12;
  Constraints.MinWidth := R.Right - R.Left + 12;
  *)

  with TJvNavPanelDivider.Create(Self) do
  begin
    Caption := 'My Calendars';
    Parent := Page;
    Top := 1500;
    Align := alTop;
    Cursor := crDefault;
    Enabled := false;
    StyleManager := JvNavPaneStyleManager1;
  end;
  with TCheckListBox.Create(Self) do
  begin
    Parent := Page;
    Checked[Items.Add('Calendar')] := true;
    Items.Add('Project Schedule');
    Top := 1500;
    Height := 32;
    Align := alTop;
  end;
  with TJvNavPanelDivider.Create(Self) do
  begin
    Caption := 'Other Calendars';
    Parent := Page;
    Top := 1500;
    Align := alTop;
    Cursor := crSizeNS;
    StyleManager := JvNavPaneStyleManager1;
  end;
  with TCheckListBox.Create(Self) do
  begin
    Parent := Page;
    Checked[Items.Add('Alan Chong')] := Random(4) = 1;
    Checked[Items.Add('Andreas Hausladen')] := Random(4) = 1;
    Checked[Items.Add('André Snepvangers')] := Random(4) = 1;
    Checked[Items.Add('Michael Beck')] := Random(4) = 1;
    Checked[Items.Add('Leroy Casterline')] := Random(4) = 1;
    Checked[Items.Add('Chris Latta')] := Random(4) = 1;
    Checked[Items.Add('Erwin Molendijk')] := Random(4) = 1;
    Checked[Items.Add('James Lan')] := Random(4) = 1;
    Checked[Items.Add('Ignacio Vazquez')] := Random(4) = 1;
    Checked[Items.Add('Marcel Bestebroer')] := Random(4) = 1;
    Checked[Items.Add('Jens Fudickar')] := Random(4) = 1;
    Checked[Items.Add('Jose Perez')] := Random(4) = 1;
    Checked[Items.Add('Marc Hoffmann')] := Random(4) = 1;
    Checked[Items.Add('Fernando Silva')] := Random(4) = 1;
    Checked[Items.Add('Robert Marquardt')] := Random(4) = 1;
    Checked[Items.Add('Matthias Thoma')] := Random(4) = 1;
    Checked[Items.Add('Olivier Sannier')] := Random(4) = 1;
    Checked[Items.Add('Oliver Giesen')] := Random(4) = 1;
    Checked[Items.Add('Dmitry Osinovsky')] := Random(4) = 1;
    Checked[Items.Add('Peter Thornqvist')] := Random(4) = 1;
    Checked[Items.Add('henri gourvest')] := Random(4) = 1;
    Checked[Items.Add('Rob den Braasem')] := Random(4) = 1;
    Checked[Items.Add('Remko Bonte')] := Random(4) = 1;
    Checked[Items.Add('Christian Vogt')] := Random(4) = 1;
    Checked[Items.Add('Warren Postma')] := Random(4) = 1;
    Top := 1500;
    Align := alClient;
  end;

  Page := TJvNavPanelPage.Create(Self);
  Page.Caption := 'C&ontacts';
  Page.ImageIndex := 2;
  Page.PageList := NP;

  with TListBox.Create(Self) do
  begin
    Parent := Page;
    Align := alClient;
    Items.Add('Alan Chong');
    Items.Add('Andreas Hausladen');
    Items.Add('André Snepvangers');
    Items.Add('Michael Beck');
    Items.Add('Leroy Casterline');
    Items.Add('Chris Latta');
    Items.Add('Erwin Molendijk');
    Items.Add('James Lan');
    Items.Add('Ignacio Vazquez');
    Items.Add('Marcel Bestebroer');
    Items.Add('Jens Fudickar');
    Items.Add('Jose Perez');
    Items.Add('Marc Hoffmann');
    Items.Add('Fernando Silva');
    Items.Add('Robert Marquardt');
    Items.Add('Matthias Thoma');
    Items.Add('Olivier Sannier');
    Items.Add('Oliver Giesen');
    Items.Add('Dmitry Osinovsky');
    Items.Add('Peter Thornqvist');
    Items.Add('henri gourvest');
    Items.Add('Rob den Braasem');
    Items.Add('Remko Bonte');
    Items.Add('Christian Vogt');
    Items.Add('Warren Postma');
  end;

  Page := TJvNavPanelPage.Create(Self);
  Page.Caption := '&Tasks';
  Page.ImageIndex := 3;
  Page.PageList := NP;

  Page := TJvNavPanelPage.Create(Self);
  Page.Caption := '&Notes';
  Page.ImageIndex := 4;
  Page.PageList := NP;

  Page := TJvNavPanelPage.Create(Self);
  Page.Caption := '&Folder List';
  Page.ImageIndex := 5;
  Page.PageList := NP;

  {  with TJvOutlookSplitter.Create(Self) do
    begin
      Align := alNone;
      Parent := Self;
      Left := NP.Width + 100;
      Align := alLeft;
      Width := 7;
      Cursor := crSizeWE;
    end;
    }
  NP.ActivePageIndex := 0;

  NT := TJvNavPaneToolPanel.Create(Self);
  NT.DragKind := dkDock;
  //  NT.DragMode := dmAutomatic;
  NT.Parent := Self;
  NT.Align := alClient;
  NT.Caption := 'Sample Tool Panel';
  NT.StyleManager := JvNavPaneStyleManager1;
  NT.Images := ToolImages;
  NT.DropDownMenu := PopupMenu1;
  for i := 0 to ToolImages.Count - 1 do
    NT.Buttons.Add.ImageIndex := i;
  NT.OnButtonClick := @DoToolButtonClick;
  NT.OnMouseDown := @DoToolMouseDown;
  NT.OnMouseMove := @DoToolMouseMove;
  NT.OnEndDock := @DoToolEndDock;

  NT.CloseButton := false;
  NT.OnClose := @DoToolPanelClose;
  // now, set the real start theme:
  JvNavPaneStyleManager1.Theme := nptStandard;
  
  // SESS
  NT.ShowHint := true;
  NT.Hint := 'Hello world !!';

end;

procedure TJvNavPaneDemoMainFrm.Dontallowresize1Click(Sender: TObject);
begin
  Dontallowresize1.Checked := not Dontallowresize1.Checked;
  NP.Resizable := not Dontallowresize1.Checked;
end;

procedure TJvNavPaneDemoMainFrm.HideAll1Click(Sender: TObject);
begin
  NP.MaximizedCount := 0;
end;

procedure TJvNavPaneDemoMainFrm.ShowAll1Click(Sender: TObject);
begin
  NP.MaximizedCount := NP.PageCount;
end;

procedure TJvNavPaneDemoMainFrm.ChangeFont1Click(Sender: TObject);
var
  FD: TFontDialog;
begin
  FD := TFontDialog.Create(nil);
  try
    FD.Font := NP.NavPanelFont;
    if FD.Execute then
      NP.NavPanelFont := FD.Font;
  finally
    FD.Free;
  end;
end;

procedure TJvNavPaneDemoMainFrm.SchemaClick(Sender: TObject);
begin
  JvNavPaneStyleManager1.Theme := TJvNavPanelTheme((Sender as TMenuItem).Tag);
  (Sender as TMenuItem).Checked := true;
end;

procedure TJvNavPaneDemoMainFrm.DoToolPanelClose(Sender: TObject);
begin
  if MessageDlg('Close this window?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    JvOutlookSplitter1.Visible := False;
    NT.Visible := False;
    NP.Align := alClient;
  end;
end;

procedure TJvNavPaneDemoMainFrm.PopupMenu1Popup(Sender: TObject);
begin
  ShowToolPanel1.Enabled := not NT.Visible;
  ShowCloseButton1.Checked := NT.CloseButton;
end;

procedure TJvNavPaneDemoMainFrm.ShowToolPanel1Click(Sender: TObject);
begin
  NP.Align := alLeft;
  NP.Width := 220;
  JvOutlookSplitter1.Visible := True;
  JvOutlookSplitter1.Left := 225;
  NT.Visible := True;
end;

procedure TJvNavPaneDemoMainFrm.DoToolButtonClick(Sender: TObject; Index: integer);
begin
  ShowMessageFmt('You clicked button %d ', [Index]);
end;

procedure TJvNavPaneDemoMainFrm.ShowCloseButton1Click(Sender: TObject);
begin
  ShowCloseButton1.Checked := not ShowCloseButton1.Checked;
  NT.CloseButton := ShowCloseButton1.Checked;
end;

type
  THackForm = class(TCustomForm);

procedure TJvNavPaneDemoMainFrm.DoToolEndDock(Sender, Target: TObject; X, Y: Integer);
begin
  if (Target is TCustomForm) and (Target <> Self) then
  begin
    TCustomForm(Target).BorderStyle := bsSizeable;
    //TODO:
    //SetWindowLong(TCustomForm(Target).Handle, GWL_STYLE, GetWindowLong(TCustomForm(Target).Handle, GWL_STYLE) and not WS_CAPTION);
    TCustomForm(Target).Width := TCustomForm(Target).Width + 1;
    TCustomForm(Target).Width := TCustomForm(Target).Width - 1;
  end
  else
    NT.Align := alClient;
end;

procedure TJvNavPaneDemoMainFrm.DoToolMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
begin
  if phtGrabber in NT.GetHitTestInfoAt(X, Y) then
    NT.BeginDrag(false);
end;

procedure TJvNavPaneDemoMainFrm.DoToolMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: integer);
begin
  if phtGrabber in NT.GetHitTestInfoAt(X, Y) then
    NT.Cursor := crSize
  else
    NT.Cursor := crDefault;
end;

procedure TJvNavPaneDemoMainFrm.BackgroundImage1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    NP.Background.Picture.LoadFromFile(OpenPictureDialog1.Filename);
    NP.Background.Tile := True;
    NT.Background.Picture.LoadFromFile(OpenPictureDialog1.Filename);
    NT.Background.Tile := True;
  end;
end;

initialization
  {$i JvNavPaneDemoMainForm.lrs}
  {$i JvNavPaneDemoMainForm.lrs}
  {$i JvNavPaneDemoMainForm.lrs}

end.

