unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, SpkToolbar,
  SpkGUITools, SpkMath, SpkGraphTools, spkt_Tab, spkt_Pane, spkt_Types,
  spkt_Tools, ImgList, ComCtrls, Menus, Grids, ExtCtrls, StdCtrls,
  spkt_BaseItem, spkt_Buttons, spkt_Checkboxes;

type

  { TForm1 }

  TForm1 = class(TForm)
    ImageList: TImageList;
    LargeImageList: TImageList;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MnuOffice2007Blue: TMenuItem;
    MnuOffice2007Silver1: TMenuItem;
    MnuOffice2007Silver2: TMenuItem;
    MnuMetroLight: TMenuItem;
    MnuMetroDark: TMenuItem;
    Panel1: TPanel;
    SpkLargeButton1: TSpkLargeButton;
    SpkLargeButton2: TSpkLargeButton;
    SpkPane2: TSpkPane;
    StylePopupMenu: TPopupMenu;
    RecentFilesPopupMenu: TPopupMenu;
    SpkPane1: TSpkPane;
    SpkSmallButton1: TSpkSmallButton;
    SpkSmallButton2: TSpkSmallButton;
    SpkSmallButton3: TSpkSmallButton;
    SpkTab1: TSpkTab;
    StatusBar1: TStatusBar;
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure StyleChangeHandler(Sender: TObject);
  private
    { private declarations }
    SpkToolbar : TSpkToolbar;
    CbHorizGrid : TSpkCheckbox;
    CbVertGrid: TSpkCheckbox;
    CbRowSelect: TSpkCheckbox;
    procedure AboutHandler(Sender: TObject);
    procedure FileOpenHandler(Sender: TObject);
    procedure FileSaveHandler(Sender: TObject);
    procedure FileQuitHandler(Sender: TObject);
    procedure HorizontalGridLinesHandler(Sender: TObject);
    procedure VerticalGridLinesHandler(Sender: TObject);
    procedure RowSelectHandler(Sender: TObject);
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

uses
  LCLIntf, spkt_Appearance;

{ TAboutForm }
type
  TAboutForm = class(TForm)
  private
    FIconLink: TLabel;
    procedure LinkClickHandler(Sender: TObject);
    procedure LinkMouseEnterHandler(Sender: TObject);
    procedure LinkMouseLeaveHandler(Sender: TObject);
  public
    constructor CreateNew(AOwner: TComponent; Num: Integer = 0); override;
  end;

constructor TAboutForm.CreateNew(AOwner: TComponent; Num: Integer = 0);
begin
  inherited;
  Width := 300;
  Height := 180;
  Caption := 'About';
  Position := poMainFormCenter;
  with TLabel.Create(self) do begin
    Caption := 'SpkToolbar demo';
    Parent := self;
    Align := alTop;
    BorderSpacing.Top := 16;
    Font.Size := 16;
    Alignment := taCenter;
  end;
  with TLabel.Create(self) do begin
    Caption := 'Icons kindly provided by';
    Parent := self;
    Align := alTop;
    Alignment := taCenter;
    BorderSpacing.Top := 16;
    Left := 16;
    Top := 999;
  end;
  FIconLink := TLabel.Create(self);
  with FIconLink do begin
    Caption := 'http://www.fatcow.com/free-icons';
    Font.Color := clBlue;
    //Font.Style := [fsUnderline];
    Parent := self;
    Align := alTop;
    Alignment := taCenter;
    Top := 9999;
    OnClick := @LinkClickHandler;
    OnMouseEnter := @LinkMouseEnterHandler;
    OnMouseLeave := @LinkMouseLeaveHandler;
  end;
  with TButton.Create(self) do begin
    Caption := 'Close';
    Parent := Self;
    Left := (Self.Width - Width) div 2;
    Top := Self.Height - 16 - Height;
    ModalResult := mrOK;
    Default := true;
    Cancel := true;
  end;
end;

procedure TAboutForm.LinkClickHandler(Sender: TObject);
begin
  OpenURL((Sender as TLabel).Caption);
end;

procedure TAboutForm.LinkMouseEnterHandler(Sender: TObject);
begin
  FIconLink.Font.Style := [fsUnderline];
end;

procedure TAboutForm.LinkMouseLeaveHandler(Sender: TObject);
begin
  FIconLink.Font.Style := [];
end;


{ TForm1 }

procedure TForm1.AboutHandler(Sender: TObject);
var
  F: TForm;
begin
  F := TAboutForm.CreateNew(nil);
  try
    F.ShowModal;
  finally
    F.Free;
  end;
end;

procedure TForm1.FileOpenHandler(Sender: TObject);
begin
  Statusbar1.SimpleText := '"File" / "Open" clicked';
end;

procedure TForm1.FileSaveHandler(Sender: TObject);
begin
  Statusbar1.SimpleText := '"File" / "Save" clicked';
end;

procedure TForm1.FileQuitHandler(Sender: TObject);
begin
  Close;
end;

procedure TForm1.HorizontalGridLinesHandler(Sender: TObject);
begin
  if CbHorizGrid.Checked then
    StringGrid1.Options := StringGrid1.Options + [goHorzLine]
  else
    StringGrid1.Options := StringGrid1.Options - [goHorzLine];
end;

procedure TForm1.VerticalGridLinesHandler(Sender: TObject);
begin
  if CbVertGrid.Checked then
    StringGrid1.Options := StringGrid1.Options + [goVertLine]
  else
    StringGrid1.Options := StringGrid1.Options - [goVertLine];
end;

procedure TForm1.RowSelectHandler(Sender: TObject);
begin
  if CbRowSelect.Checked then
    StringGrid1.Options := StringGrid1.Options + [goRowSelect]
  else
    StringGrid1.Options := StringGrid1.Options - [goRowSelect];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SpkToolbar := TSpkToolbar.Create(self);

  with SpkToolbar do begin
    Parent := self;
    Appearance.Pane.CaptionFont.Style := [fsBold, fsItalic];
    Color := clSkyBlue;
    Images := ImageList;
    LargeImages := LargeImageList;
    ShowHint := true;

    with Tabs.Add do begin
      Caption := 'File';
      with Panes.Add do begin
        Caption := 'File commands';
        with Items.AddLargeButton do begin
          Caption := 'Open file';
          ButtonKind := bkButtonDropdown;
          DropdownMenu := RecentFilesPopupMenu;
          LargeImageIndex := 1;
          Hint := 'Open a file';
          OnClick := @FileOpenHandler;
        end;
        with Items.AddLargeButton do begin
          Caption := 'Save file';
          LargeImageIndex := 2;
          Hint := 'Save file';
          OnClick := @FileSaveHandler;
        end;
        with Items.AddLargeButton do begin
          Caption := 'Quit program';
          LargeImageIndex := 0;
          Hint := 'Close application';
          OnClick := @FileQuitHandler;
        end;
      end;
    end;

    with Tabs.Add do begin
      Caption := 'Edit';
      with Panes.Add do begin
        Caption := 'Edit commands';
        with Items.AddSmallButton do begin
          Caption := 'Cut';
          HideFrameWhenIdle := true;
          TableBehaviour := tbBeginsRow;
          ImageIndex := 3;
          Hint := 'Cut to clipboard';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Copy';
          HideFrameWhenIdle := true;
          TableBehaviour := tbBeginsRow;
          ImageIndex := 4;
          Hint := 'Copy to clipboard';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Paste';
          HideFrameWhenIdle := true;
          TableBehaviour := tbBeginsColumn;
          ImageIndex := 5;
          Hint := 'Paste from clipboard';
        end;
      end;
    end;

    with Tabs.Add do begin
      Caption := 'Format';
      with Panes.Add do begin
        Caption := 'Format Settings';
        with Items.AddSmallButton do begin
          Caption := 'Bold';
          ButtonKind := bkToggle;
          GroupBehaviour := gbBeginsGroup;
          TableBehaviour := tbBeginsRow;
          ImageIndex := 6;
          ShowCaption := false;
          AllowAllUp := true;
          Hint := 'Bold';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Italic';
          ButtonKind := bkToggle;
          TableBehaviour := tbContinuesRow;
          GroupBehaviour := gbContinuesGroup;
          ImageIndex := 7;
          ShowCaption := false;
          AllowAllUp := true;
          Hint := 'Italic';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Underline';
          ButtonKind := bkToggle;
          TableBehaviour := tbContinuesRow;
          GroupBehaviour := gbEndsGroup;
          ImageIndex := 8;
          ShowCaption := false;
          AllowAllUp := true;
          Hint := 'Underlined';
        end;

        with Items.AddSmallButton do begin
          Caption := 'Left-aligned';
          ButtonKind := bkToggle;
          GroupBehaviour := gbBeginsGroup;
          TableBehaviour := tbBeginsRow;
          ImageIndex := 11;
          ShowCaption := false;
          GroupIndex := 2;
          Checked := true;
          Hint := 'Left-aligned';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Centered';
          ButtonKind := bkToggle;
          TableBehaviour := tbContinuesRow;
          GroupBehaviour := gbContinuesGroup;
          ImageIndex := 12;
          ShowCaption := false;
          GroupIndex := 2;
          Checked := false;
          Hint := 'Centered';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Right-aligned';
          ButtonKind := bkToggle;
          TableBehaviour := tbContinuesRow;
          GroupBehaviour := gbContinuesGroup;
          ImageIndex := 13;
          ShowCaption := false;
          GroupIndex := 2;
          Hint := 'Right-aligned';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Block';
          ButtonKind := bkToggle;
          TableBehaviour := tbContinuesRow;
          GroupBehaviour := gbEndsGroup;
          ImageIndex := 14;
          ShowCaption := false;
          GroupIndex := 2;
          Hint := 'Block';
        end;

        with Items.AddSmallButton do begin
          Caption := 'Subscript';
          ButtonKind := bkToggle;
          TableBehaviour := tbBeginsColumn;
          GroupBehaviour := gbBeginsGroup;
          ImageIndex := 9;
          ShowCaption := false;
          AllowAllUp := true;
          GroupIndex := 1;
          Hint := 'Subscript';
        end;
        with Items.AddSmallButton do begin
          Caption := 'Superscript';
          ButtonKind := bkToggle;
          TableBehaviour := tbContinuesRow;
          GroupBehaviour := gbEndsGroup;
          ImageIndex := 10;
          ShowCaption := false;
          AllowAllUp := true;
          GroupIndex := 1;
          Hint := 'Superscript';
        end;

        With Items.AddSmallButton do begin
          Enabled := false;
          TableBehaviour := tbBeginsRow;
          HideFrameWhenIdle := true;
          Caption := '';
        end;
      end;
    end;

    with Tabs.Add do begin
      Caption := 'Options';
      with Panes.Add do begin
        Caption := 'Grid settings';
        CbHorizGrid := Items.AddCheckbox;
        with CbHorizGrid do begin
          Caption := 'Horizontal grid lines';
          TableBehaviour := tbBeginsRow;
          Checked := true;
          Hint := 'Show/hide horizontal grid lines';
          OnClick := @HorizontalGridLinesHandler;
        end;
        CbVertGrid := Items.AddCheckbox;
        with CbVertGrid do begin
          Caption := 'Vertical grid lines';
          Hint := 'Show/hide vertical grid lines';
          TableBehaviour := tbBeginsRow;
          Checked := true;
          OnClick := @VerticalGridLinesHandler;
        end;
        CbRowSelect := Items.AddCheckbox;
        with CbRowSelect do begin
          Caption := 'Row select';
          TableBehaviour := tbBeginsRow;
          Checked := false;
          Hint := 'Select entire row';
          OnClick := @RowSelectHandler;
        end;
      end;
      with Panes.Add do begin
        Caption := 'Themes';
        with Items.AddLargeButton do begin
          Caption := 'Change style';
          Hint := 'Change theme';
          ButtonKind := bkDropdown;
          DropdownMenu := StylePopupMenu;
          LargeImageIndex := 7;
        end;
      end;
      with Panes.Add do begin
        Caption := 'Save settings';
        with Items.AddSmallButton do begin
          Caption := 'Save now';
          Hint := 'Save settings now';
          ImageIndex := 2;
        end;
        with Items.AddCheckbox do begin
          Caption := 'Auto-save settings';
          Checked := true;
          Hint := 'Automatically save settings when program closes';
        end;
      end;
    end;

    with Tabs.Add do begin
      Caption := 'Help';
      with Panes.Add do begin
        Caption := 'Help commands';
        with Items.AddLargeButton do begin
          Caption := 'About...';
          LargeImageIndex := 6;
          Hint := 'About this program';
          OnClick := @AboutHandler;
        end;
      end;
    end;
  end;
end;

procedure TForm1.StyleChangeHandler(Sender: TObject);
var
  i: Integer;
begin
  for i:=0 to StylePopupMenu.Items.Count-1 do
    StylePopupMenu.Items[i].Checked := StylePopupMenu.Items[i] = TMenuItem(Sender);
  SpkToolbar.Style := TSpkStyle((Sender as TMenuItem).Tag);
  case SpkToolbar.Style of
    spkOffice2007Blue            : SpkToolbar.Color := clSkyBlue;
    spkOffice2007Silver          : SpkToolbar.Color := clWhite;
    spkOffice2007SilverTurquoise : SpkToolbar.Color := clWhite;
    spkMetroLight                : SpkToolbar.Color := clSilver;
    spkMetroDark                 : SpkToolbar.Color := $080808;
  end;
end;


end.