diff --git a/components/jvcllaz/design/JvJans/images/images.txt b/components/jvcllaz/design/JvJans/images/images.txt new file mode 100644 index 000000000..7ffe3857a --- /dev/null +++ b/components/jvcllaz/design/JvJans/images/images.txt @@ -0,0 +1 @@ +tjvyeargrid.bmp diff --git a/components/jvcllaz/design/JvJans/images/make_res.bat b/components/jvcllaz/design/JvJans/images/make_res.bat new file mode 100644 index 000000000..674a3c543 --- /dev/null +++ b/components/jvcllaz/design/JvJans/images/make_res.bat @@ -0,0 +1 @@ +lazres ../../../resource/jvjansreg.res @images.txt diff --git a/components/jvcllaz/design/JvJans/images/tjvyeargrid.bmp b/components/jvcllaz/design/JvJans/images/tjvyeargrid.bmp new file mode 100644 index 000000000..32b379682 Binary files /dev/null and b/components/jvcllaz/design/JvJans/images/tjvyeargrid.bmp differ diff --git a/components/jvcllaz/design/JvJans/jvjansreg.pas b/components/jvcllaz/design/JvJans/jvjansreg.pas new file mode 100644 index 000000000..0f6cbb3aa --- /dev/null +++ b/components/jvcllaz/design/JvJans/jvjansreg.pas @@ -0,0 +1,27 @@ +unit JvJansReg; + +{$mode objfpc}{$H+} + +interface + +uses + SysUtils; + +procedure Register; + +implementation + +{$R ../../resource/jvjansreg.res} + +uses + Classes, JvDsgnConsts, JvYearGrid; + +procedure Register; +begin + RegisterComponents(RsPaletteJvcl, [ + TJvYearGrid + ]); +end; + +end. + diff --git a/components/jvcllaz/packages/jvjanslazd.lpk b/components/jvcllaz/packages/jvjanslazd.lpk new file mode 100644 index 000000000..6685b2ac7 --- /dev/null +++ b/components/jvcllaz/packages/jvjanslazd.lpk @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/jvcllaz/packages/jvjanslazr.lpk b/components/jvcllaz/packages/jvjanslazr.lpk new file mode 100644 index 000000000..678f04989 --- /dev/null +++ b/components/jvcllaz/packages/jvjanslazr.lpk @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/jvcllaz/resource/jvjansreg.res b/components/jvcllaz/resource/jvjansreg.res new file mode 100644 index 000000000..3c12f20cd Binary files /dev/null and b/components/jvcllaz/resource/jvjansreg.res differ diff --git a/components/jvcllaz/run/JvCore/JvJVCLUtils.pas b/components/jvcllaz/run/JvCore/JvJVCLUtils.pas index 40c00db0a..1fd101861 100644 --- a/components/jvcllaz/run/JvCore/JvJVCLUtils.pas +++ b/components/jvcllaz/run/JvCore/JvJVCLUtils.pas @@ -529,7 +529,7 @@ type property OnChange: TNotifyEvent read FOnChange write FOnChange; end; { end JvGraph } - + *) type // equivalent of TPoint, but that can be a published property TJvPoint = class(TPersistent) @@ -610,7 +610,7 @@ type property Width: Longint read FWidth write SetWidth default 0; property Height: Longint read FHeight write SetHeight default 0; end; - + (* { begin JvCtrlUtils } //------------------------------------------------------------------------------ @@ -6790,7 +6790,7 @@ begin else Result := Value; end; -end; +end; *) //=== { TJvPoint } =========================================================== @@ -7011,7 +7011,7 @@ begin DoChange; end; end; - + (* function SelectColorByLuminance(AColor, DarkColor, BrightColor: TColor): TColor; var ACol: Longint; diff --git a/components/jvcllaz/run/JvJans/JvYearGrid.pas b/components/jvcllaz/run/JvJans/JvYearGrid.pas new file mode 100644 index 000000000..c1cad99f9 --- /dev/null +++ b/components/jvcllaz/run/JvJans/JvYearGrid.pas @@ -0,0 +1,1618 @@ +{----------------------------------------------------------------------------- +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, + {$IFDEF MSWINDOWS} + //ShellAPI, + {$ENDIF MSWINDOWS} + //Windows, Messages, + Graphics, Controls, Forms, Dialogs, Grids, Menus, Clipbrd, + SysUtils, StdCtrls, Classes, + {$IFDEF HAS_UNIT_SYSTEM_UITYPES} + System.UITypes, + {$ENDIF HAS_UNIT_SYSTEM_UITYPES} + 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 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('Year ' + IntToStr(Year) + ''); + AList.Append(''); + AList.Append(''); + AList.Append('

Year ' + IntToStr(Year) + '

'); + AList.Append(''); + 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(''); + AList.Append(''); + Infs := FYearData[ACol, ARow].InfoText; + Infs := StringReplace(Infs, Cr, '
', [rfReplaceAll]); + AList.Append(''); + AList.Append(''); + end; + end; + AList.Append('
' + DS + '' + Infs + '
'); + AList.Append('
'); +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. diff --git a/components/jvcllaz/run/JvJans/JvYearGridEditForm.lfm b/components/jvcllaz/run/JvJans/JvYearGridEditForm.lfm new file mode 100644 index 000000000..b15d98096 --- /dev/null +++ b/components/jvcllaz/run/JvJans/JvYearGridEditForm.lfm @@ -0,0 +1,118 @@ +object YearGridEditForm: TYearGridEditForm + Left = 303 + Height = 367 + Top = 154 + Width = 394 + BorderStyle = bsDialog + Caption = 'YearGrid Edit' + ClientHeight = 367 + ClientWidth = 394 + Color = clBtnFace + Font.Color = clWindowText + OnShow = FormShow + Position = poScreenCenter + LCLVersion = '1.9.0.0' + object Panel1: TPanel + Left = 0 + Height = 35 + Top = 332 + Width = 394 + Align = alBottom + AutoSize = True + ClientHeight = 35 + ClientWidth = 394 + TabOrder = 0 + object BtnOK: TBitBtn + AnchorSideTop.Control = BitCancel + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = BitCancel + AnchorSideBottom.Side = asrBottom + Left = 241 + Height = 26 + Top = 4 + Width = 62 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Left = 16 + BorderSpacing.Right = 4 + Caption = 'OK' + Default = True + Kind = bkOK + ModalResult = 1 + TabOrder = 0 + end + object BitCancel: TBitBtn + AnchorSideTop.Control = Panel1 + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Panel1 + AnchorSideRight.Side = asrBottom + Left = 307 + Height = 26 + Top = 4 + Width = 82 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Top = 4 + BorderSpacing.Right = 4 + BorderSpacing.Bottom = 4 + Cancel = True + Caption = 'Cancel' + Kind = bkCancel + ModalResult = 2 + TabOrder = 1 + end + object BtnLoad: TButton + AnchorSideLeft.Control = Panel1 + AnchorSideTop.Control = BtnOK + AnchorSideBottom.Control = BtnOK + AnchorSideBottom.Side = asrBottom + Left = 5 + Height = 26 + Top = 4 + Width = 61 + Anchors = [akTop, akLeft, akBottom] + AutoSize = True + BorderSpacing.Left = 4 + Caption = '&Load...' + OnClick = BtnLoadClick + TabOrder = 2 + end + object BtnSave: TButton + AnchorSideLeft.Control = BtnLoad + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = BtnLoad + AnchorSideBottom.Control = BtnLoad + AnchorSideBottom.Side = asrBottom + Left = 70 + Height = 26 + Top = 4 + Width = 59 + Anchors = [akTop, akLeft, akBottom] + AutoSize = True + BorderSpacing.Left = 4 + BorderSpacing.Right = 16 + Caption = '&Save...' + OnClick = BtnSaveClick + TabOrder = 3 + end + end + object MemoText: TMemo + Left = 0 + Height = 332 + Top = 0 + Width = 394 + Align = alClient + TabOrder = 1 + end + object OpenDialog: TOpenDialog + Filter = 'Text Files|*.txt|All Files|*.*' + left = 88 + top = 104 + end + object SaveDialog: TSaveDialog + DefaultExt = '.txt' + Filter = 'Text Files|*.txt|All Files|*.*' + left = 120 + top = 104 + end +end diff --git a/components/jvcllaz/run/JvJans/JvYearGridEditForm.pas b/components/jvcllaz/run/JvJans/JvYearGridEditForm.pas new file mode 100644 index 000000000..c51672f28 --- /dev/null +++ b/components/jvcllaz/run/JvJans/JvYearGridEditForm.pas @@ -0,0 +1,85 @@ +{----------------------------------------------------------------------------- +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: JvYearGridEdit.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 att slcdug dott org]. + +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 JvYearGridEditForm; + +{$mode objfpc}{$H+} + +interface + +uses + SysUtils, Classes, Windows, Messages, Graphics, Controls, + Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, + JvComponent; + +type + TYearGridEditForm = class(TForm) //JvForm) + Panel1: TPanel; + BtnOK: TBitBtn; + BitCancel: TBitBtn; + MemoText: TMemo; + BtnLoad: TButton; + BtnSave: TButton; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + procedure BtnLoadClick(Sender: TObject); + procedure BtnSaveClick(Sender: TObject); + procedure FormShow(Sender: TObject); + public + end; + + +implementation + +{$R *.lfm} + +procedure TYearGridEditForm.BtnLoadClick(Sender: TObject); +begin + if OpenDialog.Execute then + MemoText.Lines.LoadFromFile(OpenDialog.FileName); + MemoText.SetFocus; +end; + +procedure TYearGridEditForm.BtnSaveClick(Sender: TObject); +begin + if SaveDialog.Execute then + MemoText.Lines.SaveToFile(SaveDialog.FileName); + MemoText.SetFocus; +end; + +procedure TYearGridEditForm.FormShow(Sender: TObject); +begin + MemoText.SetFocus; +end; + +{$IFDEF UNITVERSIONING} +initialization + RegisterUnitVersion(HInstance, UnitVersioning); + +finalization + UnregisterUnitVersion(HInstance); +{$ENDIF UNITVERSIONING} + +end.