
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6953 8e941d3f-bd1b-0410-a28a-d453659cc2b4
1615 lines
43 KiB
ObjectPascal
1615 lines
43 KiB
ObjectPascal
{-----------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/MPL-1.1.html
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: JvYearGrid.PAS, released on 2002-06-15.
|
|
|
|
The Initial Developer of the Original Code is Jan Verhoeven [jan1 dott verhoeven att wxs dott nl]
|
|
Portions created by Jan Verhoeven are Copyright (C) 2002 Jan Verhoeven.
|
|
All Rights Reserved.
|
|
|
|
Contributor(s):
|
|
Robert Love [rlove at slcdug dot org].
|
|
Olivier Sannier [obones at users dot sourceforge dot net]
|
|
|
|
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
|
|
located at http://jvcl.delphi-jedi.org
|
|
|
|
Known Issues:
|
|
-----------------------------------------------------------------------------}
|
|
// $Id$
|
|
|
|
unit JvYearGrid;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
LCLIntf, Types,
|
|
Graphics, Controls, Forms, Dialogs, Grids, Menus, Clipbrd,
|
|
SysUtils, StdCtrls, Classes,
|
|
JvJVCLUtils, JvTypes;
|
|
|
|
const
|
|
JvDefaultBorderColor = TColor($EEF5FF);
|
|
JvDefaultBookmarkColor = clYellow;
|
|
JvDefaultWeekendColor = TColor($DFDFDF);
|
|
|
|
type
|
|
TYearData = record
|
|
DisplayText: string;
|
|
InfoText: string;
|
|
DayInMonth: Integer;
|
|
DefaultColor: TColor;
|
|
CustomColor: TColor;
|
|
Custom: Boolean;
|
|
BookMark: Boolean; // this is not saved
|
|
end;
|
|
|
|
TJvYearGridOrientation = (yoHorizontal, yoVertical);
|
|
TJvWeekDay = (wdMonday, wdTuesday, wdWednesday, wdThursday, wdFriday, wdSaturday, wdSunday);
|
|
TJvWeekDaySet = set of TJvWeekDay;
|
|
TJvMonthFormat = (mfShort, mfLong);
|
|
TJvDayFormat = (dfInitial, dfShort, dfLong);
|
|
TJvAutoSizeOptions = set of (aoGrid, aoFirstColumn, aoFirstRow, aoColumns, aoRows);
|
|
|
|
TOnYearChanged = procedure(Sender: TObject; AYear: Integer) of object;
|
|
TOnSelectDate = procedure(Sender: TObject; ADate: TDate; InfoText: string; InfoColor: TColor) of object;
|
|
TOnInfoChanging = procedure(Sender: TObject; var InfoText: string; var CanChange: Boolean) of object;
|
|
|
|
TDays = array [1..12] of Integer;
|
|
TYearDataMatrix = array [0..37, 0..12] of TYearData;
|
|
|
|
TJvYearGrid = class(TCustomDrawGrid)
|
|
private
|
|
FGridPop: TPopupMenu;
|
|
FCurrentYear: Word;
|
|
FCurrentMonth: Word;
|
|
FCurrentDay: Word;
|
|
FHTMLBorder: Boolean;
|
|
FHTMLFontName: string;
|
|
FBorderColor: TColor;
|
|
FBookMarkColor: TColor;
|
|
FWeekendColor: TColor;
|
|
FAutoSize: Boolean;
|
|
FDayFormat: TJvDayFormat;
|
|
FMonthFormat: TJvMonthFormat;
|
|
FOnInfoChanging: TOnInfoChanging;
|
|
FOnSelectDate: TOnSelectDate;
|
|
FOnYearChanged: TOnYearChanged;
|
|
|
|
DaysInMonth: TDays;
|
|
StartDays: TDays;
|
|
|
|
FYearData: TYearDataMatrix;
|
|
FYearFile: string;
|
|
FOrientation: TJvYearGridOrientation;
|
|
FSavedScrollBars: TScrollStyle;
|
|
FFirstDayOfWeek: TJvWeekDay;
|
|
FWeekendDays: TJvWeekDaySet;
|
|
FAutoSizeOptions: TJvAutoSizeOptions;
|
|
FCellMargins: TJvRect;
|
|
FDaysAlignment: TAlignment;
|
|
FDayNamesAlignment: TAlignment;
|
|
FMonthNamesAlignment: TAlignment;
|
|
FYearAlignment: TAlignment;
|
|
FYear: Integer;
|
|
|
|
// Getters, setters
|
|
function GetFlat: Boolean;
|
|
procedure SetAutoSizeOptions(const Value: TJvAutoSizeOptions);
|
|
procedure SetBookMarkColor(const Value: TColor);
|
|
procedure SetBorderColor(const Value: TColor);
|
|
procedure SetCellMargins(const Value: TJvRect);
|
|
procedure SetDayFormat(const AValue: TJvDayFormat);
|
|
procedure SetDayNamesAlignment(const Value: TAlignment);
|
|
procedure SetDaysAlignment(const Value: TAlignment);
|
|
procedure SetFirstDayOfWeek(const Value: TJvWeekDay);
|
|
procedure SetFlat(AValue: Boolean);
|
|
procedure SetHTMLBorder(const Value: Boolean);
|
|
procedure SetHTMLFontName(const Value: string);
|
|
procedure SetMonthFormat(const AValue: TJvMonthFormat);
|
|
procedure SetMonthNamesAlignment(const Value: TAlignment);
|
|
procedure SetOrientation(const Value: TJvYearGridOrientation);
|
|
procedure SetWeekendColor(const AValue: TColor);
|
|
procedure SetWeekendDays(const Value: TJvWeekDaySet);
|
|
procedure SetYear(const Value: Integer);
|
|
procedure SetYearAlignment(const Value: TAlignment);
|
|
|
|
// Event handlers
|
|
procedure Color1Click(Sender: TObject);
|
|
procedure Copy1Click(Sender: TObject);
|
|
procedure Cut1Click(Sender: TObject);
|
|
procedure Delete1Click(Sender: TObject);
|
|
procedure DoShowHint(var HintStr: THintString; var CanShow: Boolean;
|
|
var HintInfo: THintInfo);
|
|
procedure Edit1Click(Sender: TObject);
|
|
procedure NoColor1Click(Sender: TObject);
|
|
procedure Paste1Click(Sender: TObject);
|
|
procedure SaveAsHTML(Sender: TObject);
|
|
procedure SetupGridPop(Sender: TObject);
|
|
procedure SetYearChanged(const Value: TOnYearChanged);
|
|
procedure Year1Click(Sender: TObject);
|
|
|
|
// Utilities
|
|
procedure MakeHTML(AList: TStringList; Border, Filter: Boolean);
|
|
|
|
procedure SetupYearData;
|
|
procedure SetupMonths;
|
|
function GetCellData(var S: string): Boolean;
|
|
function SetCellData(S: string): Boolean;
|
|
procedure CreatePopup;
|
|
procedure Launch(AFile: string);
|
|
procedure SetSelectDate(const Value: TOnSelectDate);
|
|
procedure BorderColor1Click(Sender: TObject);
|
|
procedure SetInfoChanging(const Value: TOnInfoChanging);
|
|
procedure ClearBookMarks;
|
|
procedure BookMarkColor1Click(Sender: TObject);
|
|
procedure Find1Click(Sender: TObject);
|
|
procedure ClearFind1Click(Sender: TObject);
|
|
procedure SaveFound(Sender: TObject);
|
|
function IsCurrentYear: Boolean;
|
|
|
|
procedure CellMarginsChange(Sender: TObject);
|
|
function GetDefaultColWidth: Integer;
|
|
procedure SetDefaultColWidth(const Value: Integer);
|
|
procedure SetDefaultRowHeihgt(const Value: Integer);
|
|
procedure SetFirstColWidth(const Value: Integer);
|
|
procedure SetFirstRowHeight(const Value: Integer);
|
|
function GetFirstColWidth: Integer;
|
|
function GetFirstRowHeight: Integer;
|
|
procedure ColRowToDayMonthIndex(ACol, ARow: Integer; out DayIndex, MonthIndex: Integer);
|
|
procedure DayMonthIndexToColRow(DayIndex: Integer; MonthIndex: Integer; out ACol, ARow: Integer);
|
|
|
|
protected
|
|
procedure DrawTextInCell(aCol,aRow: Integer; aRect: TRect; aState: TGridDrawState); override;
|
|
function SelectCell(ACol, ARow: Integer): Boolean; override;
|
|
procedure DblClick; override;
|
|
procedure DoPrepareCanvas(aCol,aRow:Integer; aState: TGridDrawState); override;
|
|
procedure SetAutoSize(Value: Boolean); override;
|
|
procedure UpdateAllSizes;
|
|
procedure AdjustBounds;
|
|
procedure Loaded; override;
|
|
procedure SetParent( AParent: TWinControl); override;
|
|
// function GetDefaultRowHeight: Integer; override;
|
|
|
|
// Those three methods are used to provide support for reading
|
|
// the GridYear property from DFM files that were using
|
|
// this component before its rewrite. The writer does nothing
|
|
// because the value is now stored as Year.
|
|
procedure ReadGridYear(Reader: TReader);
|
|
procedure WriteGridYear(Writer: TWriter);
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
|
|
procedure LoadYear(FileName: string = '');
|
|
procedure SaveYear(FileName: string = '');
|
|
|
|
function GetSelDateText: string;
|
|
procedure SetSelDateText(AText: string);
|
|
|
|
function GetDateInfo(ADate: TDate; var AText: string): Boolean;
|
|
function SetDateInfo(ADate: TDate; AText: string): Boolean;
|
|
|
|
function CellToDate(ACol, ARow: Integer): TDate;
|
|
function DateToCell(ADate: TDate; out ACol, ARow: Integer): Boolean;
|
|
|
|
// This procedure does the default drawing for a given cell
|
|
// It is made public so that you can call it in your OnDrawCell event
|
|
// procedure DefaultDrawCell(ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
|
|
|
|
// Converts a (col, row) pair to a (day, month) couple taking
|
|
// into account the orientation. If no day is in the indicated cell
|
|
// then the value of ADay is 0 on exit.
|
|
procedure ColRowToDayMonth(ACol, ARow: Integer; var ADay, AMonth: Integer);
|
|
|
|
// Converts a (day, month) couple to a (col, row) couple taking
|
|
// into account the orientation. If the day doesn't exist in the month
|
|
// the indicated cell may be outside the grid
|
|
procedure DayMonthToColRow(ADay, AMonth: Integer; var ACol, ARow: Integer);
|
|
|
|
procedure Find;
|
|
published
|
|
property HTMLBorder: Boolean read FHTMLBorder write SetHTMLBorder;
|
|
property HTMLFontName: string read FHTMLFontName write SetHTMLFontName;
|
|
property BorderColor: TColor read FBorderColor write SetBorderColor default JvDefaultBorderColor;
|
|
property BookMarkColor: TColor read FBookMarkColor write SetBookMarkColor default JvDefaultBookmarkColor;
|
|
property WeekendColor: TColor read FWeekendColor write SetWeekendColor default JvDefaultWeekendColor;
|
|
property Orientation: TJvYearGridOrientation read FOrientation write SetOrientation default yoHorizontal;
|
|
property FirstDayOfWeek: TJvWeekDay read FFirstDayOfWeek write SetFirstDayOfWeek default wdMonday;
|
|
|
|
property Year: Integer read FYear write SetYear;
|
|
property YearFile: string read FYearFile write FYearFile;
|
|
|
|
property AutoSize: Boolean read FAutoSize write SetAutoSize default True;
|
|
property AutoSizeOptions: TJvAutoSizeOptions read FAutoSizeOptions write SetAutoSizeOptions;
|
|
|
|
property FirstColWidth: Integer read GetFirstColWidth write SetFirstColWidth;
|
|
property FirstRowHeight: Integer read GetFirstRowHeight write SetFirstRowHeight;
|
|
property CellMargins: TJvRect read FCellMargins write SetCellMargins;
|
|
|
|
property DayFormat: TJvDayFormat read FDayFormat write SetDayFormat default dfInitial;
|
|
property MonthFormat: TJvMonthFormat read FMonthFormat write SetMonthFormat default mfLong;
|
|
property WeekendDays: TJvWeekDaySet read FWeekendDays write SetWeekendDays;
|
|
|
|
property MonthNamesAlignment: TAlignment read FMonthNamesAlignment write SetMonthNamesAlignment default taLeftJustify;
|
|
property DayNamesAlignment: TAlignment read FDayNamesAlignment write SetDayNamesAlignment default taLeftJustify;
|
|
property DaysAlignment: TAlignment read FDaysAlignment write SetDaysAlignment default taLeftJustify;
|
|
property YearAlignment: TAlignment read FYearAlignment write SetYearAlignment default taLeftJustify;
|
|
|
|
property OnSelectCell;
|
|
property OnDrawCell;
|
|
property OnYearChanged: TOnYearChanged read FOnYearChanged write SetYearChanged;
|
|
property OnSelectDate: TOnSelectDate read FOnSelectDate write SetSelectDate;
|
|
property OnInfoChanging: TOnInfoChanging read FOnInfoChanging write SetInfoChanging;
|
|
property OnDblClick;
|
|
property OnClick;
|
|
|
|
property DefaultColWidth: Integer read GetDefaultColWidth write SetDefaultColWidth default 16;
|
|
property DefaultRowHeight default 18; //: Integer read GetDefaultRowHeight write SetDefaultRowHeihgt default 18;
|
|
|
|
property Align;
|
|
property Anchors;
|
|
property BorderSpacing;
|
|
property BorderStyle;
|
|
property Flat read GetFlat write SetFlat default true;
|
|
property ScrollBars;
|
|
property TitleStyle;
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses
|
|
JvConsts, JvResources, JvYearGridEditForm;
|
|
|
|
const
|
|
TodayFontColor = clWhite;
|
|
TodayBrushColor = clRed;
|
|
|
|
constructor TJvYearGrid.Create(AOwner: TComponent);
|
|
var
|
|
AYear, AMonth, ADay: Word;
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
FCellMargins := TJvRect.Create;
|
|
FCellMargins.Top := 2;
|
|
FCellMargins.Left := 2;
|
|
FCellMargins.Bottom := 2;
|
|
FCellMargins.Right := 2;
|
|
FCellMargins.OnChange := @CellMarginsChange; // Must be set last
|
|
|
|
FOrientation := yoHorizontal;
|
|
FDaysAlignment := taCenter;
|
|
FDayNamesAlignment := taCenter;
|
|
FMonthNamesAlignment := taLeftJustify;
|
|
|
|
FDayFormat := dfInitial;
|
|
FMonthFormat := mfLong;
|
|
|
|
FFirstDayOfWeek := wdMonday;
|
|
FWeekendDays := [wdSaturday, wdSunday];
|
|
|
|
FAutoSizeOptions := [aoGrid, aoFirstColumn, aoFirstRow, aoColumns, aoRows];
|
|
|
|
FBorderColor := JvDefaultBorderColor;
|
|
FBookMarkColor := JvDefaultBookmarkColor;
|
|
FWeekendColor := JvDefaultWeekendcolor;
|
|
ShowHint := True;
|
|
CreatePopup;
|
|
PopupMenu := FGridPop;
|
|
FGridPop.OnPopup := @SetupGridPop;
|
|
|
|
// Those two must be set before setting DefaultColWidth and DefaultRowHeight
|
|
FirstRowHeight := 18;
|
|
FirstColWidth := 70;
|
|
|
|
DefaultColWidth := 16;
|
|
DefaultRowHeight := 18;//FFirstRowHeight;
|
|
|
|
ColCount := 38;
|
|
RowCount := 13;
|
|
FixedCols := 1;
|
|
FixedRows := 1;
|
|
Width := 512;
|
|
Height := 213;
|
|
Flat := true;
|
|
|
|
// THIS IS WRONG, VERY WRONG! (obones)
|
|
Application.ShowHint := True;
|
|
Application.OnShowHint := @DoShowHint;
|
|
Application.HintHidePause := 5000;
|
|
|
|
DecodeDate(Now, FCurrentYear, FCurrentMonth, FCurrentDay);
|
|
HTMLFontName := 'Arial';
|
|
|
|
DecodeDate(Now, AYear, AMonth, ADay);
|
|
FYear := AYear;
|
|
SetupYearData;
|
|
|
|
FAutoSize := True;
|
|
FSavedScrollBars := ScrollBars;
|
|
Invalidate;
|
|
end;
|
|
|
|
destructor TJvYearGrid.Destroy;
|
|
begin
|
|
// SaveYear;
|
|
FGridPop.Free;
|
|
FCellMargins.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TJvYearGrid.DoShowHint(var HintStr: THintString; var CanShow: Boolean;
|
|
var HintInfo: THintInfo);
|
|
var
|
|
ACol, ARow, X, Y: Integer;
|
|
S, DS: string;
|
|
begin
|
|
if HintInfo.HintControl = Self then
|
|
begin
|
|
X := HintInfo.CursorPos.X;
|
|
Y := HintInfo.CursorPos.Y;
|
|
MouseToCell(X, Y, ACol{%H-}, ARow{%H-});
|
|
if (ACol < 0) or (ARow < 0) then
|
|
Exit;
|
|
DS := FYearData[ACol, ARow].DisplayText;
|
|
if IsCurrentYear and (ARow = FCurrentMonth) and (DS = IntToStr(FCurrentDay)) then
|
|
S := RsToday;
|
|
CanShow := False;
|
|
if (ACol >= 0) and (ARow >= 0) then
|
|
begin
|
|
S := S + FYearData[ACol, ARow].InfoText;
|
|
if S <> '' then
|
|
begin
|
|
HintInfo.CursorRect := CellRect(ACol, ARow);
|
|
HintStr := S;
|
|
CanShow := True;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.MakeHTML(AList: TStringList; Border, Filter: Boolean);
|
|
var
|
|
ACol, ARow, W: Integer;
|
|
DS, Tbs, Infs: string;
|
|
Month, Day: Word;
|
|
ADate: TDate;
|
|
CanAdd: Boolean;
|
|
begin
|
|
AList.Clear;
|
|
if Border then
|
|
Tbs := '1'
|
|
else
|
|
Tbs := '0';
|
|
AList.Append('<html><head><title>Year ' + IntToStr(Year) + '</title></head>');
|
|
AList.Append('<body>');
|
|
AList.Append('<font size=2 face="' + HTMLFontName + '">');
|
|
AList.Append('<center><h3>Year ' + IntToStr(Year) + '</h3></center>');
|
|
AList.Append('<Table width=100% border=' + Tbs + '>');
|
|
for ARow := 1 to 12 do
|
|
for ACol := 1 to 37 do
|
|
begin
|
|
CanAdd := FYearData[ACol, ARow].DisplayText <> '';
|
|
if CanAdd then
|
|
CanAdd := FYearData[ACol, ARow].InfoText <> '';
|
|
if CanAdd and Filter then
|
|
CanAdd := FYearData[ACol, ARow].BookMark;
|
|
if CanAdd then
|
|
begin
|
|
Month := ARow;
|
|
Day := StrToInt(FYearData[ACol, ARow].DisplayText);
|
|
ADate := EncodeDate(Year, Month, Day);
|
|
DS := FormatDateTime('d-mmm-yyyy', ADate);
|
|
W := DayOfWeek(ADate);
|
|
DS := FormatSettings.ShortDayNames[W] + ' ' + DS;
|
|
AList.Append('<tr>');
|
|
AList.Append('<td width=20%>' + DS + '</td>');
|
|
Infs := FYearData[ACol, ARow].InfoText;
|
|
Infs := StringReplace(Infs, Cr, '<br>', [rfReplaceAll]);
|
|
AList.Append('<td>' + Infs + '</td>');
|
|
AList.Append('</tr>');
|
|
end;
|
|
end;
|
|
AList.Append('</table>');
|
|
AList.Append('</font></body></html>');
|
|
end;
|
|
|
|
procedure TJvYearGrid.SaveAsHTML(Sender: TObject);
|
|
var
|
|
List: TStringList;
|
|
FileName: string;
|
|
begin
|
|
List := TStringList.Create;
|
|
MakeHTML(List, HTMLBorder, False);
|
|
FileName := ChangeFileExt(FYearFile, '.htm');
|
|
List.SaveToFile(FileName);
|
|
List.Free;
|
|
Launch(FileName);
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetHTMLBorder(const Value: Boolean);
|
|
begin
|
|
FHTMLBorder := Value;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetYearChanged(const Value: TOnYearChanged);
|
|
begin
|
|
FOnYearChanged := Value;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetYear(const Value: Integer);
|
|
var
|
|
AYear, AMonth, ADay: Word;
|
|
begin
|
|
if Value <> FYear then
|
|
begin
|
|
FYear := Value;
|
|
if Value = 0 then
|
|
begin
|
|
DecodeDate(Now, AYear, AMonth, ADay);
|
|
FYear := AYear;
|
|
end
|
|
else
|
|
FYear := Value;
|
|
SetupYearData;
|
|
|
|
if Assigned(FOnYearChanged) then
|
|
FOnYearChanged(Self, FYear);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SaveYear(FileName: string);
|
|
var
|
|
MonthIndex, DayIndex: Integer;
|
|
YList, DList: TStringList;
|
|
S: string;
|
|
begin
|
|
YList := TStringList.Create;
|
|
DList := TStringList.Create;
|
|
try
|
|
for MonthIndex := 0 to 12 do
|
|
begin
|
|
for DayIndex := 0 to 37 do
|
|
begin
|
|
DList.Clear;
|
|
DList.Append(FYearData[DayIndex, MonthIndex].DisplayText);
|
|
S := FYearData[DayIndex, MonthIndex].InfoText;
|
|
S := StringReplace(S, Cr, '||', [rfReplaceAll]);
|
|
DList.Append(S);
|
|
DList.Append(ColorToString(FYearData[DayIndex, MonthIndex].DefaultColor));
|
|
DList.Append(ColorToString(FYearData[DayIndex, MonthIndex].CustomColor));
|
|
if FYearData[DayIndex, MonthIndex].Custom then
|
|
S := 'true'
|
|
else
|
|
S := 'false';
|
|
DList.Append(S);
|
|
YList.Append(DList.CommaText);
|
|
end;
|
|
end;
|
|
if FileName = '' then
|
|
YList.SaveToFile(FYearFile)
|
|
else
|
|
YList.SaveToFile(FileName);
|
|
finally
|
|
DList.Free;
|
|
YList.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.LoadYear(FileName: string);
|
|
var
|
|
MonthIndex, DayIndex, Index: Integer;
|
|
YList, DList: TStringList;
|
|
S: string;
|
|
begin
|
|
YList := TStringList.Create;
|
|
DList := TStringList.Create;
|
|
try
|
|
if FileName = '' then
|
|
YList.LoadFromFile(FYearFile)
|
|
else
|
|
YList.LoadFromFile(FileName);
|
|
|
|
Index := 0;
|
|
for MonthIndex := 0 to 12 do
|
|
begin
|
|
for DayIndex := 0 to 37 do
|
|
begin
|
|
DList.CommaText := YList[Index];
|
|
Inc(Index);
|
|
FYearData[DayIndex, MonthIndex].DisplayText := DList[0];
|
|
S := DList[1];
|
|
S := StringReplace(S, '||', Cr, [rfReplaceAll]);
|
|
FYearData[DayIndex, MonthIndex].InfoText := S;
|
|
FYearData[DayIndex, MonthIndex].DefaultColor := StringToColor(DList[2]);
|
|
FYearData[DayIndex, MonthIndex].CustomColor := StringToColor(DList[3]);
|
|
FYearData[DayIndex, MonthIndex].Custom := (DList[4] = 'true');
|
|
end;
|
|
end;
|
|
finally
|
|
DList.Free;
|
|
YList.Free;
|
|
end;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetupYearData;
|
|
var
|
|
S, D: string;
|
|
DayOfWeekIndex, DayIndex, MonthIndex: Integer;
|
|
AColor: TColor;
|
|
begin
|
|
SetupMonths;
|
|
for MonthIndex := 0 to 12 do
|
|
for DayIndex := 0 to 37 do
|
|
begin
|
|
S := '';
|
|
if DayIndex > 0 then
|
|
begin
|
|
// This gives a value from 1 to 7, with 1 being the first day
|
|
// of the week.
|
|
DayOfWeekIndex := ((DayIndex - 1) mod 7) + 1;
|
|
|
|
// As ShortDayNames considers the first day to be a Sunday,
|
|
// we have to offset the value of DayOfTheWeekIndex to match the
|
|
// desired first day of the week
|
|
Inc(DayOfWeekIndex, Integer(FFirstDayOfWeek)+1);
|
|
If DayOfWeekIndex > 7 then
|
|
DayOfWeekIndex := DayOfWeekIndex - 7;
|
|
case FDayFormat of
|
|
dfInitial: D := FormatSettings.ShortDayNames[DayOfWeekIndex][1];
|
|
dfShort : D := FormatSettings.ShortDayNames[DayOfWeekIndex];
|
|
dfLong : D := FormatSettings.LongDayNames[DayOfWeekIndex];
|
|
end;
|
|
end;
|
|
|
|
// By default, there is no day in the current cell
|
|
FYearData[DayIndex, MonthIndex].DayInMonth := 0;
|
|
|
|
if (MonthIndex = 0) and (DayIndex = 0) then
|
|
S := IntToStr(Year);
|
|
if (MonthIndex = 0) and (DayIndex > 0) then
|
|
S := D;
|
|
if (MonthIndex <> 0) and (DayIndex = 0) then
|
|
case FMonthFormat of
|
|
mfShort: S := FormatSettings.ShortMonthNames[MonthIndex];
|
|
mfLong : S := FormatSettings.LongMonthNames[MonthIndex];
|
|
end;
|
|
if (MonthIndex <> 0) and (DayIndex > 0) then
|
|
begin
|
|
if (DayIndex >= StartDays[MonthIndex]) and (DayIndex < StartDays[MonthIndex] + DaysInMonth[MonthIndex]) then
|
|
begin
|
|
FYearData[DayIndex, MonthIndex].DayInMonth := DayIndex - StartDays[MonthIndex] + 1;
|
|
S := IntToStr(FYearData[DayIndex, MonthIndex].DayInMonth);
|
|
end;
|
|
end;
|
|
|
|
// AColor might have not been initialized with the following code.
|
|
//if ((ACol>0)and (D='S')) then
|
|
// AColor:=clsilver;
|
|
//if ((ACol>0)and (D<>'S')) then
|
|
// AColor:=clwhite;
|
|
// Change to:
|
|
if (DayIndex > 0) and (DayOfWeekIndex in [1, 7]) then //(D = 'S') then
|
|
AColor := FWeekendColor
|
|
else
|
|
AColor := clWhite;
|
|
FYearData[DayIndex, MonthIndex].DisplayText := S;
|
|
FYearData[DayIndex, MonthIndex].InfoText := '';
|
|
FYearData[DayIndex, MonthIndex].DefaultColor := AColor;
|
|
FYearData[DayIndex, MonthIndex].CustomColor := AColor;
|
|
FYearData[DayIndex, MonthIndex].Custom := False;
|
|
FYearData[DayIndex, MonthIndex].BookMark := False;
|
|
end;
|
|
AdjustBounds;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvYearGrid.ClearBookMarks;
|
|
var
|
|
ACol, ARow: Integer;
|
|
Cleared: Boolean;
|
|
begin
|
|
Cleared := False;
|
|
for ARow := 0 to 12 do
|
|
for ACol := 0 to 37 do
|
|
begin
|
|
Cleared := Cleared or FYearData[ACol, ARow].BookMark;
|
|
FYearData[ACol, ARow].BookMark := False;
|
|
end;
|
|
if Cleared then
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetupMonths;
|
|
var
|
|
AYear, AMonth, ADay: Word;
|
|
ADate: TDate;
|
|
I: Integer;
|
|
begin
|
|
for I := 1 to 12 do
|
|
begin
|
|
AYear := Self.Year;
|
|
AMonth := I + 1;
|
|
if AMonth = 13 then
|
|
begin
|
|
AYear := AYear + 1;
|
|
AMonth := 1;
|
|
end;
|
|
ADay := 1;
|
|
ADate := EncodeDate(AYear, AMonth, ADay);
|
|
ADate := ADate - 1;
|
|
DecodeDate(ADate, AYear, AMonth, ADay);
|
|
DaysInMonth[I] := ADay;
|
|
AYear := Self.Year;
|
|
AMonth := I;
|
|
ADay := 1;
|
|
ADate := EncodeDate(AYear, AMonth, ADay);
|
|
StartDays[I] := DayOfWeek(ADate);
|
|
Dec(StartDays[I], Integer(FFirstDayOfWeek)+1);
|
|
If StartDays[I] < 1 then
|
|
StartDays[I] := StartDays[I] + 7;
|
|
end;
|
|
end;
|
|
|
|
function TJvYearGrid.GetCellData(var S: string): Boolean;
|
|
var
|
|
ACol, ARow: Integer;
|
|
begin
|
|
ACol := Col;
|
|
ARow := Row;
|
|
Result := False;
|
|
if (ACol > 0) and (ARow > 0) then
|
|
if FYearData[ACol, ARow].DisplayText <> '' then
|
|
begin
|
|
S := FYearData[ACol, ARow].InfoText;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
function TJvYearGrid.SetCellData(S: string): Boolean;
|
|
var
|
|
ACol, ARow: Integer;
|
|
begin
|
|
ACol := Col;
|
|
ARow := Row;
|
|
Result := False;
|
|
if (ACol > 0) and (ARow > 0) then
|
|
if FYearData[ACol, ARow].DisplayText <> '' then
|
|
begin
|
|
FYearData[ACol, ARow].InfoText := S;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Copy1Click(Sender: TObject);
|
|
var
|
|
S: string;
|
|
begin
|
|
if GetCellData(S) then
|
|
Clipboard.AsText := S;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Cut1Click(Sender: TObject);
|
|
var
|
|
S: string;
|
|
begin
|
|
if GetCellData(S) then
|
|
begin
|
|
Clipboard.AsText := S;
|
|
SetCellData('');
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Year1Click(Sender: TObject);
|
|
var
|
|
S: string;
|
|
AYear: Word;
|
|
begin
|
|
S := InputBox(RsYearGrid, RsEnterYear, IntToStr(Self.Year));
|
|
try
|
|
if S = '' then
|
|
Exit;
|
|
AYear := StrToInt(S);
|
|
if (AYear < 1999) or (AYear > 2050) then
|
|
Exit;
|
|
Self.Year := AYear;
|
|
except
|
|
ShowMessage(RsInvalidYear);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Paste1Click(Sender: TObject);
|
|
var
|
|
S: string;
|
|
begin
|
|
if GetCellData(S) then
|
|
if Clipboard.HasFormat(CF_TEXT) then
|
|
SetCellData(Clipboard.AsText);
|
|
end;
|
|
|
|
procedure TJvYearGrid.Delete1Click(Sender: TObject);
|
|
var
|
|
S: string;
|
|
begin
|
|
if GetCellData(S) then
|
|
SetCellData('');
|
|
end;
|
|
|
|
procedure TJvYearGrid.CreatePopup;
|
|
const
|
|
cMenuBreakCaption = '-';
|
|
var
|
|
G: TPopupMenu;
|
|
M: TMenuItem;
|
|
begin
|
|
FGridPop := TPopupMenu.Create(Self);
|
|
G := FGridPop;
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsYear;
|
|
M.OnClick := @Year1Click;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := cMenuBreakCaption;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsEdit;
|
|
M.OnClick := @Edit1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsColor;
|
|
M.OnClick := @Color1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsNoColor;
|
|
M.OnClick := @NoColor1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := cMenuBreakCaption;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsCopyItem;
|
|
M.OnClick := @Copy1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsCutItem;
|
|
M.OnClick := @Cut1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsPasteItem;
|
|
M.OnClick := @Paste1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsDeleteItem;
|
|
M.OnClick := @Delete1Click;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := cMenuBreakCaption;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsSaveAllInfo;
|
|
M.OnClick := @SaveAsHTML;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsSaveFoundInfo;
|
|
M.OnClick := @SaveFound;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := cMenuBreakCaption;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsBorderColor;
|
|
M.OnClick := @BorderColor1Click;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsBookMarkColor;
|
|
M.OnClick := @BookMarkColor1Click;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := cMenuBreakCaption;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsFindItem;
|
|
M.OnClick := @Find1Click;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
M := TMenuItem.Create(G);
|
|
M.Caption := RsClearFind;
|
|
M.OnClick := @ClearFind1Click;
|
|
M.Tag := 1;
|
|
G.Items.Add(M);
|
|
end;
|
|
|
|
procedure TJvYearGrid.Edit1Click(Sender: TObject);
|
|
var
|
|
DS: string;
|
|
lCol, lRow: Integer;
|
|
F: TYearGridEditForm;
|
|
CanChange: Boolean;
|
|
InfoText: string;
|
|
begin
|
|
lCol := Col;
|
|
lRow := Row;
|
|
if (lCol < 1) or (lRow < 1) then
|
|
Exit;
|
|
DS := FYearData[lCol, lRow].DisplayText;
|
|
if DS = '' then
|
|
Exit;
|
|
F := TYearGridEditForm.Create(Application);
|
|
try
|
|
InfoText := FYearData[lCol, lRow].InfoText;
|
|
F.MemoText.Text := InfoText;
|
|
F.Caption := 'Edit ' + DateToStr(CellToDate(lCol, lRow));
|
|
if F.ShowModal = mrOk then
|
|
begin
|
|
InfoText := F.MemoText.Text;
|
|
CanChange := True;
|
|
if Assigned(FOnInfoChanging) then
|
|
FOnInfoChanging(Self, InfoText, CanChange);
|
|
if CanChange then
|
|
begin
|
|
FYearData[lCol, lRow].InfoText := InfoText;
|
|
if InfoText = '' then
|
|
FYearData[lCol, lRow].Custom := False
|
|
else
|
|
if not FYearData[lCol, lRow].Custom then
|
|
begin
|
|
FYearData[lCol, lRow].Custom := True;
|
|
FYearData[lCol, lRow].CustomColor := RGB(206, 250, 253);
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
F.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Color1Click(Sender: TObject);
|
|
var
|
|
CD: TColorDialog;
|
|
begin
|
|
if (Col < 1) or (Row < 1) or (FYearData[Col, Row].DisplayText = '') then
|
|
Exit;
|
|
CD := TColorDialog.Create(Application);
|
|
{ -- not available in LCL:
|
|
CD.Options := [cdFullOpen, cdAnyColor];
|
|
}
|
|
if CD.Execute then
|
|
begin
|
|
FYearData[Col, Row].CustomColor := CD.Color;
|
|
FYearData[Col, Row].Custom := True;
|
|
Invalidate;
|
|
end;
|
|
CD.Free;
|
|
end;
|
|
|
|
procedure TJvYearGrid.NoColor1Click(Sender: TObject);
|
|
begin
|
|
if (Col < 1) or (Row < 1) or (FYearData[Col, Row].DisplayText = '') then
|
|
Exit;
|
|
FYearData[Col, Row].Custom := False;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetupGridPop(Sender: TObject);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if (Col > 0) and (Row > 0) and (FYearData[Col, Row].DisplayText <> '') then
|
|
for I := 0 to FGridPop.Items.Count - 1 do
|
|
FGridPop.Items[I].Enabled := True
|
|
else
|
|
for I := 0 to FGridPop.Items.Count - 1 do
|
|
FGridPop.Items[I].Enabled := (FGridPop.Items[I].Tag = 1);
|
|
end;
|
|
|
|
procedure TJvYearGrid.Launch(AFile: string);
|
|
begin
|
|
OpenDocument(AFile);
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetHTMLFontName(const Value: string);
|
|
begin
|
|
FHTMLFontName := Value;
|
|
end;
|
|
|
|
function TJvYearGrid.GetSelDateText: string;
|
|
var
|
|
DS: string;
|
|
begin
|
|
if (Col < 1) or (Row < 1) then
|
|
Exit;
|
|
DS := FYearData[Col, Row].DisplayText;
|
|
if DS = '' then
|
|
Exit;
|
|
Result := FYearData[Col, Row].InfoText;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetSelDateText(AText: string);
|
|
var
|
|
DS: string;
|
|
begin
|
|
if (Col < 1) or (Row < 1) then
|
|
Exit;
|
|
DS := FYearData[Col, Row].DisplayText;
|
|
if DS = '' then
|
|
Exit;
|
|
FYearData[Col, Row].InfoText := AText;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetSelectDate(const Value: TOnSelectDate);
|
|
begin
|
|
FOnSelectDate := Value;
|
|
end;
|
|
|
|
function TJvYearGrid.SelectCell(ACol, ARow: Longint): Boolean;
|
|
var
|
|
DS: string;
|
|
ADate: TDate;
|
|
InfoText: string;
|
|
InfoColor: TColor;
|
|
// Month, Day: Word;
|
|
MonthIndex, DayIndex: Integer;
|
|
CanSelect: Boolean;
|
|
begin
|
|
CanSelect := True;
|
|
if Assigned(OnSelectCell) then
|
|
OnSelectCell(Self, ACol, ARow, CanSelect);
|
|
if not CanSelect then
|
|
begin
|
|
Result := False;
|
|
Exit;
|
|
end;
|
|
Result := False;
|
|
if (ACol < 1) or (ARow < 1) then
|
|
Exit;
|
|
|
|
ColRowToDayMonthIndex(ACol, ARow, DayIndex, MonthIndex);
|
|
|
|
DS := FYearData[DayIndex, MonthIndex].DisplayText;
|
|
if DS = '' then
|
|
Exit;
|
|
// Month := ARow;
|
|
// Day := StrToInt(FYearData[ACol, ARow].DisplayText);
|
|
ADate := EncodeDate(Year, MonthIndex, FYearData[DayIndex, MonthIndex].DayInMonth);
|
|
InfoText := FYearData[DayIndex, MonthIndex].InfoText;
|
|
if FYearData[DayIndex, MonthIndex].Custom then
|
|
InfoColor := FYearData[DayIndex, MonthIndex].CustomColor
|
|
else
|
|
InfoColor := FYearData[DayIndex, MonthIndex].DefaultColor;
|
|
if Assigned(FOnSelectDate) then
|
|
FOnSelectDate(Self, ADate, InfoText, InfoColor);
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TJvYearGrid.DblClick;
|
|
begin
|
|
if Assigned(OnDblClick) then
|
|
OnDblClick(Self)
|
|
else
|
|
if (Col > 0) and (Row > 0) and (FYearData[Col, Row].DisplayText <> '') then
|
|
Edit1Click(nil);
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetBorderColor(const Value: TColor);
|
|
begin
|
|
if Value <> FBorderColor then
|
|
begin
|
|
FBorderColor := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.BorderColor1Click(Sender: TObject);
|
|
var
|
|
CD: TColorDialog;
|
|
begin
|
|
CD := TColorDialog.Create(Application);
|
|
{ --- not available in LCL
|
|
CD.Options := [cdFullOpen, cdAnyColor];
|
|
}
|
|
if CD.Execute then
|
|
BorderColor := CD.Color;
|
|
CD.Free;
|
|
end;
|
|
|
|
procedure TJvYearGrid.BookMarkColor1Click(Sender: TObject);
|
|
var
|
|
CD: TColorDialog;
|
|
begin
|
|
CD := TColorDialog.Create(Application);
|
|
{ --- not available in LCL
|
|
CD.Options := [cdFullOpen, cdAnyColor];
|
|
}
|
|
if CD.Execute then
|
|
BookMarkColor := CD.Color;
|
|
CD.Free;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetInfoChanging(const Value: TOnInfoChanging);
|
|
begin
|
|
FOnInfoChanging := Value;
|
|
end;
|
|
|
|
function TJvYearGrid.DateToCell(ADate: TDate; out ACol, ARow: Integer): Boolean;
|
|
var
|
|
AYear, AMonth, ADay: Word;
|
|
WD: Integer;
|
|
begin
|
|
Result := False;
|
|
DecodeDate(ADate, AYear, AMonth, ADay);
|
|
if AYear <> Self.Year then
|
|
Exit;
|
|
WD := DayOfWeek(EncodeDate(AYear, AMonth, 1));
|
|
Inc(WD, Integer(FirstDayOfWeek));
|
|
if WD > 7 then
|
|
Dec(WD, 7);
|
|
DayMonthIndexToColRow(WD + ADay - 1, AMonth, ACol, ARow);
|
|
Result := True;
|
|
end;
|
|
|
|
function TJvYearGrid.CellToDate(ACol, ARow: Integer): TDate;
|
|
var
|
|
WD: Integer;
|
|
lMonth, lDay: Integer;
|
|
begin
|
|
lMonth := ARow;
|
|
ColRowToDayMonthIndex(ACol, ARow, lDay, lMonth);
|
|
WD := DayOfWeek(EncodeDate(FYear, lMonth, 1));
|
|
Inc(WD, Integer(FirstDayOfWeek));
|
|
if WD > 7 then
|
|
Dec(WD, 7);
|
|
lDay := lDay - WD + 2;
|
|
if lDay < 1 then lDay := 1;
|
|
if lDay > DaysInMonth[lMonth] then lDay := DaysInMonth[lMonth];
|
|
Result := EncodeDate(FYear, lMonth, lDay);
|
|
end;
|
|
|
|
function TJvYearGrid.GetDateInfo(ADate: TDate; var AText: string): Boolean;
|
|
var
|
|
lCol, lRow: Integer;
|
|
begin
|
|
Result := DateToCell(ADate, lCol, lRow);
|
|
if Result then
|
|
AText := FYearData[lCol, lRow].InfoText;
|
|
end;
|
|
|
|
function TJvYearGrid.SetDateInfo(ADate: TDate; AText: string): Boolean;
|
|
var
|
|
lCol, lRow: Integer;
|
|
begin
|
|
Result := DateToCell(ADate, lCol, lRow);
|
|
if Result then
|
|
FYearData[lCol, lRow].InfoText := AText;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetBookMarkColor(const Value: TColor);
|
|
begin
|
|
if Value <> FBookMarkColor then
|
|
begin
|
|
FBookMarkColor := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Find1Click(Sender: TObject);
|
|
var
|
|
S: string;
|
|
lCol, lRow: Integer;
|
|
begin
|
|
ClearBookMarks;
|
|
S := InputBox(RsYearGridFind, RsEnterSeachText, '');
|
|
if S = '' then
|
|
Exit;
|
|
S := LowerCase(S);
|
|
for lRow := 0 to 12 do
|
|
for lCol := 0 to 37 do
|
|
if Pos(S, LowerCase(FYearData[lCol, lRow].InfoText)) > 0 then
|
|
FYearData[lCol, lRow].BookMark := True;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvYearGrid.ClearFind1Click(Sender: TObject);
|
|
begin
|
|
ClearBookMarks;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Find;
|
|
begin
|
|
Find1Click(nil);
|
|
end;
|
|
|
|
procedure TJvYearGrid.SaveFound(Sender: TObject);
|
|
var
|
|
List: TStringList;
|
|
FileName: string;
|
|
begin
|
|
List := TStringList.Create;
|
|
MakeHTML(List, HTMLBorder, True);
|
|
FileName := Format(RsFounds, [ChangeFileExt(FYearFile, '.htm')]);
|
|
List.SaveToFile(FileName);
|
|
List.Free;
|
|
Launch(FileName);
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetOrientation(const Value: TJvYearGridOrientation);
|
|
begin
|
|
if FOrientation <> Value then
|
|
begin
|
|
FOrientation := Value;
|
|
if FOrientation = yoHorizontal then
|
|
begin
|
|
ColCount := 38;
|
|
RowCount := 13;
|
|
end
|
|
else
|
|
begin
|
|
ColCount := 13;
|
|
RowCount := 38;
|
|
end;
|
|
AdjustBounds;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetFirstDayOfWeek(const Value: TJvWeekDay);
|
|
begin
|
|
if FFirstDayOfWeek <> Value then
|
|
begin
|
|
FFirstDayOfWeek := Value;
|
|
SetupYearData;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetAutoSize(Value: Boolean);
|
|
begin
|
|
if Value then
|
|
begin
|
|
if (aoGrid in AutoSizeOptions) then
|
|
begin
|
|
FSavedScrollBars := ScrollBars;
|
|
ScrollBars := ssNone;
|
|
end;
|
|
end
|
|
else
|
|
ScrollBars := FSavedScrollBars;
|
|
|
|
FAutoSize := Value;
|
|
AdjustBounds;
|
|
end;
|
|
|
|
function TJvYearGrid.GetDefaultColWidth: Integer;
|
|
begin
|
|
Result := inherited DefaultColWidth;
|
|
end;
|
|
{
|
|
function TJvYearGrid.GetDefaultRowHeight: Integer;
|
|
begin
|
|
Result := inherited DefaultRowHeight;
|
|
end;
|
|
}
|
|
procedure TJvYearGrid.SetDefaultColWidth(const Value: Integer);
|
|
var
|
|
SavedFirstColWidth: Integer;
|
|
begin
|
|
SavedFirstColWidth := ColWidths[0];
|
|
inherited DefaultColWidth := Value;
|
|
ColWidths[0] := SavedFirstColWidth;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetDefaultRowHeihgt(const Value: Integer);
|
|
var
|
|
SavedFirstRowHeight: Integer;
|
|
begin
|
|
SavedFirstRowHeight := RowHeights[0];
|
|
inherited DefaultRowHeight := Value;
|
|
RowHeights[0] := SavedFirstRowHeight;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetFirstColWidth(const Value: Integer);
|
|
begin
|
|
ColWidths[0] := Value;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetFirstRowHeight(const Value: Integer);
|
|
begin
|
|
RowHeights[0] := Value;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetWeekendColor(const AValue: TColor);
|
|
begin
|
|
if FWeekendColor <> AValue then begin
|
|
FWeekendColor := AValue;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetWeekendDays(const Value: TJvWeekDaySet);
|
|
begin
|
|
FWeekendDays := Value;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetAutoSizeOptions(const Value: TJvAutoSizeOptions);
|
|
begin
|
|
FAutoSizeOptions := Value;
|
|
end;
|
|
|
|
procedure TJvYearGrid.UpdateAllSizes;
|
|
var
|
|
I: Integer;
|
|
CurValue: Integer;
|
|
MaxValue: Integer;
|
|
|
|
function GetHighestTextInRow(Row: Integer): Integer;
|
|
var
|
|
I: Integer;
|
|
CurValue: Integer;
|
|
begin
|
|
// find the highest text in the row.
|
|
Result := 0;
|
|
for I := 0 to ColCount-1 do
|
|
begin
|
|
if Orientation = yoHorizontal then
|
|
CurValue := Canvas.TextHeight(FYearData[I,Row].DisplayText)
|
|
else
|
|
CurValue := Canvas.TextHeight(FYearData[Row,I].DisplayText);
|
|
if CurValue > Result then
|
|
Result := CurValue;
|
|
end;
|
|
end;
|
|
|
|
function GetWidestTextInColumn(Column: Integer): Integer;
|
|
var
|
|
I: Integer;
|
|
CurValue: Integer;
|
|
begin
|
|
// find the largest text in the column
|
|
Result := 0;
|
|
for I := 0 to RowCount-1 do
|
|
begin
|
|
if Orientation = yoHorizontal then
|
|
CurValue := Canvas.TextWidth(FYearData[Column,I].DisplayText)
|
|
else
|
|
CurValue := Canvas.TextWidth(FYearData[I,Column].DisplayText);
|
|
if CurValue > Result then
|
|
Result := CurValue;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if AutoSize then
|
|
begin
|
|
Canvas.Font.Style := [fsBold];
|
|
if aoFirstRow in AutoSizeOptions then
|
|
RowHeights[0] := GetHighestTextInRow(0) + CellMargins.Top + CellMargins.Bottom;
|
|
|
|
if aoFirstColumn in AutoSizeOptions then
|
|
ColWidths[0] := GetWidestTextInColumn(0) + CellMargins.Left + CellMargins.Right;
|
|
|
|
if aoRows in AutoSizeOptions then
|
|
begin
|
|
// find the highest text in each row and only use the
|
|
// highest value among those found
|
|
MaxValue := 0;
|
|
for I := 1 to RowCount-1 do
|
|
begin
|
|
CurValue := GetHighestTextInRow(I);
|
|
if CurValue > MaxValue then
|
|
MaxValue := CurValue;
|
|
end;
|
|
|
|
for I := 1 to RowCount-1 do
|
|
RowHeights[I] := MaxValue + CellMargins.Top + CellMargins.Bottom;
|
|
end;
|
|
|
|
if aoColumns in AutoSizeOptions then
|
|
begin
|
|
// find the widest text in each column and only use
|
|
// the highest value among those found
|
|
MaxValue := 0;
|
|
for I := 1 to ColCount-1 do
|
|
begin
|
|
CurValue := GetWidestTextInColumn(I);
|
|
if CurValue > MaxValue then
|
|
MaxValue := CurValue;
|
|
end;
|
|
for I := 1 to ColCount-1 do
|
|
ColWidths[I] := MaxValue + CellMargins.Left + CellMargins.Right;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetCellMargins(const Value: TJvRect);
|
|
begin
|
|
FCellMargins.Assign(Value);
|
|
AdjustBounds;
|
|
end;
|
|
|
|
procedure TJvYearGrid.AdjustBounds;
|
|
var
|
|
NewWidth, NewHeight: Integer;
|
|
tmp: Integer;
|
|
begin
|
|
if not (csReading in ComponentState) and FAutoSize then
|
|
begin
|
|
UpdateAllSizes;
|
|
if aoGrid in AutoSizeOptions then
|
|
begin
|
|
Scrollbars := ssNone;
|
|
ColRowToOffset(true, false, ColCount-1, tmp, NewWidth);
|
|
ColRowToOffset(false, false, RowCount-1, tmp, NewHeight);
|
|
SetBounds(Left, Top, NewWidth, NewHeight);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.Loaded;
|
|
begin
|
|
inherited Loaded;
|
|
AdjustBounds;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetParent( AParent: TWinControl);
|
|
begin
|
|
inherited SetParent(AParent);
|
|
if Parent <> nil then
|
|
AdjustBounds;
|
|
end;
|
|
|
|
procedure TJvYearGrid.CellMarginsChange(Sender: TObject);
|
|
begin
|
|
AdjustBounds;
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetDayFormat(const AValue: TJvDayFormat);
|
|
begin
|
|
if FDayFormat <> AValue then
|
|
begin
|
|
FDayFormat := AValue;
|
|
SetupYearData;
|
|
AdjustBounds;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetDayNamesAlignment(const Value: TAlignment);
|
|
begin
|
|
if FDayNamesAlignment <> Value then
|
|
begin
|
|
FDayNamesAlignment := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetDaysAlignment(const Value: TAlignment);
|
|
begin
|
|
if FDaysAlignment <> Value then
|
|
begin
|
|
FDaysAlignment := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetMonthFormat(const AValue: TJvMonthFormat);
|
|
begin
|
|
if FMonthFormat <> AValue then
|
|
begin
|
|
FMonthFormat := AValue;
|
|
SetupYearData;
|
|
AdjustBounds;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetMonthNamesAlignment(const Value: TAlignment);
|
|
begin
|
|
if FMonthNamesAlignment <> Value then
|
|
begin
|
|
FMonthNamesAlignment := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetYearAlignment(const Value: TAlignment);
|
|
begin
|
|
if FYearAlignment <> Value then
|
|
begin
|
|
FYearAlignment := Value;
|
|
Invalidate;
|
|
end;
|
|
end;
|
|
|
|
function TJvYearGrid.GetFirstColWidth: Integer;
|
|
begin
|
|
Result := ColWidths[0];
|
|
end;
|
|
|
|
function TJvYearGrid.GetFirstRowHeight: Integer;
|
|
begin
|
|
Result := RowHeights[0];
|
|
end;
|
|
|
|
function TJvYearGrid.GetFlat: Boolean;
|
|
begin
|
|
Result := inherited Flat;
|
|
end;
|
|
|
|
procedure TJvYearGrid.SetFlat(AValue: Boolean);
|
|
begin
|
|
inherited Flat := AValue;
|
|
AdjustBounds;
|
|
end;
|
|
|
|
function TJvYearGrid.IsCurrentYear: Boolean;
|
|
begin
|
|
Result := Year = FCurrentYear;
|
|
end;
|
|
|
|
procedure TJvYearGrid.ReadGridYear(Reader: TReader);
|
|
begin
|
|
Year := Reader.ReadInteger;
|
|
end;
|
|
|
|
procedure TJvYearGrid.WriteGridYear(Writer: TWriter);
|
|
begin
|
|
// Do nothing, we only provide read support for legacy reasons
|
|
end;
|
|
|
|
procedure TJvYearGrid.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('GridYear', @ReadGridYear, @WriteGridYear, False);
|
|
end;
|
|
|
|
procedure TJvYearGrid.ColRowToDayMonthIndex(ACol, ARow: Integer;
|
|
out DayIndex, MonthIndex: Integer);
|
|
begin
|
|
if Orientation = yoHorizontal then
|
|
begin
|
|
DayIndex := ACol;
|
|
MonthIndex := ARow;
|
|
end
|
|
else
|
|
begin
|
|
DayIndex := ARow;
|
|
MonthIndex := ACol;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.DayMonthIndexToColRow(DayIndex, MonthIndex: Integer;
|
|
out ACol, ARow: Integer);
|
|
begin
|
|
if Orientation = yoHorizontal then
|
|
begin
|
|
ACol := DayIndex;
|
|
ARow := MonthIndex;
|
|
end
|
|
else
|
|
begin
|
|
ARow := DayIndex;
|
|
ACol := MonthIndex;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.ColRowToDayMonth(ACol, ARow: Integer; var ADay,
|
|
AMonth: Integer);
|
|
var
|
|
DayIndex, MonthIndex: Integer;
|
|
begin
|
|
ColRowToDayMonthIndex(ACol, ARow, DayIndex, MonthIndex);
|
|
AMonth := MonthIndex;
|
|
ADay := FYearData[MonthIndex, DayIndex].DayInMonth;
|
|
end;
|
|
|
|
procedure TJvYearGrid.DayMonthToColRow(ADay, AMonth: Integer; var ACol,
|
|
ARow: Integer);
|
|
begin
|
|
DayMonthIndexToColRow(ADay, AMonth, ACol, ARow);
|
|
end;
|
|
|
|
procedure TJvYearGrid.DoPrepareCanvas(ACol, ARow:Integer; AState: TGridDrawState);
|
|
var
|
|
DayIndex, MonthIndex: Integer;
|
|
S: String;
|
|
begin
|
|
ColRowToDayMonthIndex(ACol, ARow, DayIndex, MonthIndex);
|
|
S := FYearData[DayIndex, MonthIndex].DisplayText;
|
|
|
|
with Canvas do
|
|
begin
|
|
Font.Color := clBlack;
|
|
if (ACol = 0) and (ARow = 0) then
|
|
Font.Style := Font.Style + [fsBold]
|
|
else
|
|
Font.Style := Font.Style - [fsBold];
|
|
|
|
if (DayIndex = 0) or (MonthIndex = 0) then
|
|
Brush.Color := BorderColor;
|
|
|
|
if (DayIndex > 0) and (MonthIndex > 0) then
|
|
begin
|
|
if IsCurrentYear and (MonthIndex = FCurrentMonth) and (S = IntToStr(FCurrentDay)) then
|
|
begin
|
|
Font.Color := TodayFontColor;
|
|
Brush.Color := TodayBrushColor;
|
|
Font.Style := Font.Style + [fsBold];
|
|
end
|
|
else
|
|
if FYearData[DayIndex, MonthIndex].Custom then
|
|
Brush.Color := FYearData[DayIndex, MonthIndex].CustomColor
|
|
else
|
|
Brush.Color := FYearData[DayIndex, MonthIndex].DefaultColor;
|
|
end;
|
|
if FYearData[DayIndex, MonthIndex].BookMark then
|
|
Brush.Color := BookMarkColor;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvYearGrid.DrawTextInCell(ACol,ARow: Integer;
|
|
ARect: TRect; AState: TGridDrawState);
|
|
var
|
|
DayIndex, MonthIndex: Integer;
|
|
S: String;
|
|
SExt: TSize;
|
|
textLeft: Integer;
|
|
|
|
function GetTextLeft(Alignment: TAlignment; AWidth: Integer): Integer;
|
|
begin
|
|
case Alignment of
|
|
taRightJustify:
|
|
Result := ARect.Right - AWidth - CellMargins.Right;
|
|
taCenter:
|
|
Result := ARect.Left + (ARect.Right - ARect.Left - AWidth) div 2;
|
|
else
|
|
Result := ARect.Left + CellMargins.Left;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
ColRowToDayMonthIndex(ACol, ARow, DayIndex, MonthIndex);
|
|
S := FYearData[DayIndex, MonthIndex].DisplayText;
|
|
textLeft := ARect.Left;
|
|
|
|
with Canvas do
|
|
begin
|
|
SExt := TextExtent(S);
|
|
|
|
if (DayIndex = 0) then
|
|
textLeft := GetTextLeft(MonthNamesAlignment, SExt.CX);
|
|
|
|
if (MonthIndex = 0) then
|
|
begin
|
|
if DayIndex = 0 then
|
|
textLeft := GetTextLeft(YearAlignment, SExt.CX)
|
|
else
|
|
textLeft := GetTextLeft(DayNamesAlignment, SExt.CX);
|
|
end;
|
|
|
|
if (DayIndex > 0) and (MonthIndex > 0) then
|
|
textLeft := GetTextLeft(DaysAlignment, SExt.CX);
|
|
|
|
TextRect(ARect, textLeft, (ARect.Top + ARect.Bottom - SExt.CY) div 2, S);
|
|
end;
|
|
end;
|
|
|
|
end.
|