Files
lazarus-ccr/applications/spready/szoomform.pas

125 lines
2.7 KiB
ObjectPascal
Raw Normal View History

unit sZoomForm;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
ButtonPanel, Spin,
fpspreadsheet;
type
{ TZoomForm }
TZoomForm = class(TForm)
ButtonPanel: TButtonPanel;
EdZoom: TSpinEdit;
LblPercent: TLabel;
LblZoom: TLabel;
TrackBar: TTrackBar;
procedure EdZoomChange(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure OKButtonClick(Sender: TObject);
procedure TrackBarChange(Sender: TObject);
private
FWorksheet: TsWorksheet;
FInitialZoom: Double;
FOKClicked: Boolean;
FLevels: array of Integer;
function GetZoomLevel: Integer;
procedure SetWorksheet(AValue: TsWorksheet);
procedure SetZoomLevel(AValue: Integer);
protected
procedure ApplyZoom;
function FindZoomLevelIndex(AValue: Integer): Integer;
public
property Worksheet: TsWorksheet read FWorksheet write SetWorksheet;
property ZoomLevel: Integer read GetZoomLevel;
end;
var
ZoomForm: TZoomForm;
implementation
{$R *.lfm}
const
ZOOM_LEVELS: array[0..26] of Integer = (
10, 20, 30, 40, 50, 60, 65, 70, 75, 80, 85, 90, 95,
100,
105, 110, 115, 120, 130, 140, 150, 160, 180, 200, 250, 300, 400);
procedure TZoomForm.ApplyZoom;
begin
if Assigned(FWorksheet) then
FWorksheet.Zoomfactor := GetZoomLevel / 100;
end;
procedure TZoomForm.EdZoomChange(Sender: TObject);
var
idx: Integer;
begin
idx := FindZoomLevelIndex(EdZoom.Value);
if idx > -1 then Trackbar.Position := idx;
ApplyZoom;
end;
function TZoomForm.FindZoomLevelIndex(AValue: Integer): Integer;
begin
for Result := Low(ZOOM_LEVELS) to High(ZOOM_LEVELS) do
if ZOOM_LEVELS[Result] = AValue then exit;
Result := -1;
end;
procedure TZoomForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
if FWorksheet <> nil then begin
if not FOKClicked then
FWorksheet.ZoomFactor := FInitialZoom;
end;
end;
procedure TZoomForm.FormCreate(Sender: TObject);
begin
Trackbar.Min := 0;
TrackBar.Max := High(ZOOM_LEVELS);
end;
function TZoomForm.GetZoomLevel: Integer;
begin
Result := EdZoom.Value;
end;
procedure TZoomForm.OKButtonClick(Sender: TObject);
begin
FOKClicked := true;
end;
procedure TZoomForm.TrackBarChange(Sender: TObject);
begin
EdZoom.Value := ZOOM_LEVELS[Trackbar.Position];
end;
procedure TZoomForm.SetWorksheet(AValue: TsWorksheet);
begin
if FWorksheet = AValue then exit;
FWorksheet := AValue;
FInitialZoom := FWorksheet.ZoomFactor;
SetZoomLevel(Round(FWorksheet.ZoomFactor * 100));
end;
procedure TZoomForm.SetZoomLevel(AValue: Integer);
begin
if AValue = GetZoomLevel then exit;
EdZoom.Value := AValue;
end;
end.