📄 jvqtimeline.pas
字号:
{******************************************************************************}
{* WARNING: JEDI VCL To CLX Converter generated unit. *}
{* Manual modifications will be lost on next release. *}
{******************************************************************************}
{-----------------------------------------------------------------------------
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: JvTimeLine.PAS, released on 2002-05-26.
The Initial Developer of the Original Code is Peter Th鰎nqvist [peter3 at sourceforge dot net]
Portions created by Peter Th鰎nqvist are Copyright (C) 2002 Peter Th鰎nqvist.
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Description:
A timeline component with support for inserting items at selectable dates.
Known Issues:
2004-12-07:
- ShowSelection: if true, the selected item is painted with clHighlight/clHighlightText
- OnItemMouseMove event
- Bug fix for dragging: if DragMode is dmManual, no drag is performed automatically (duh!)
- SupportsColor property to set the color of the support lines (vert and horz)
Bugs / Limitations:
* DateAtPos is approximate
* PosAtDate is slightly better
* FirstVisibleDate always start at day 1 of month
-----------------------------------------------------------------------------}
// $Id: JvQTimeLine.pas,v 1.23 2005/02/11 10:11:57 asnepvangers Exp $
unit JvQTimeLine;
{$I jvcl.inc}
interface
uses
SysUtils, Classes,
QWindows, QMessages, QGraphics, QControls, QForms, QStdCtrls, QExtCtrls, QImgList,
JvQComponent;
const
CM_MOVEDRAGLINE = CM_BASE + 1;
type
TJvTimeItems = class;
TJvCustomTimeLine = class;
TJvTimeItemType = (asPixels, asDays);
TJvTimeLineState = (tlDragPending, tlDragging, tlMouseDown, tlClearPending);
TJvTimeLineStates = set of TJvTimeLineState;
TJvTimeItem = class(TCollectionItem)
private
FRect: TRect;
FParent: TJvTimeItems;
FData: Pointer;
FImageIndex: Integer;
FImageOffset: Integer;
FDate: TDateTime;
FCaption: string;
FColor: TColor;
FTextColor: TColor;
FHint: string;
FLevel: Integer;
FWidth: Integer;
FStyle: TJvTimeItemType;
FSelected: Boolean;
FEnabled: Boolean;
procedure SetEnabled(Value: Boolean);
procedure SetImageOffset(Value: Integer);
procedure SetStyle(Value: TJvTimeItemType);
procedure SetSelected(Value: Boolean);
procedure SetDate(Value: TDateTime);
procedure SetCaption(Value: string);
procedure SetColor(Value: TColor);
procedure SetTextColor(Value: TColor);
procedure SetImageIndex(Value: Integer);
procedure SetLevel(Value: Integer);
procedure SetWidth(Value: Integer);
function GetBounds(Index: Integer): Integer;
procedure SetBounds(Index: Integer; Value: Integer);
protected
procedure Update; virtual;
function GetDisplayName: string; override;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
procedure Remove; virtual;
procedure Assign(Source: TPersistent); override;
property Data: Pointer read FData write FData;
published
property Enabled: Boolean read FEnabled write SetEnabled default True;
property Left: Integer index 0 read GetBounds write SetBounds;
property Top: Integer index 1 read GetBounds write SetBounds;
property Caption: string read FCaption write SetCaption;
property Color: TColor read FColor write SetColor default clWindow;
property Date: TDateTime read FDate write SetDate;
property Hint: string read FHint write FHint;
property ImageIndex: Integer read FImageIndex write SetImageIndex default -1;
property ImageOffset: Integer read FImageOffset write SetImageOffset default 0;
property Level: Integer read FLevel write SetLevel default 0;
property Selected: Boolean read FSelected write SetSelected default False;
property TextColor: TColor read FTextColor write SetTextColor default clBlack;
property WidthAs: TJvTimeItemType read FStyle write SetStyle default asPixels;
property Width: Integer read FWidth write SetWidth default 50;
end;
TJvTimeItems = class(TCollection)
private
FTimeLine: TJvCustomTimeLine;
function GetItem(Index: Integer): TJvTimeItem;
procedure SetItem(Index: Integer; Value: TJvTimeItem);
protected
function GetOwner: TPersistent; override;
procedure Update(Item: TCollectionItem); override;
public
constructor Create(TimeLine: TJvCustomTimeLine);
function Add: TJvTimeItem;
procedure Refresh;
property Items[Index: Integer]: TJvTimeItem read GetItem write SetItem; default;
end;
TJvYearWidth = 12..MaxInt;
// TItemAlign=(tiCenter,tiLeft);
TJvTimeLineStyle = (tlDefault, tlOwnerDrawFixed, tlOwnerDrawVariable);
TJvScrollArrow = (scrollLeft, scrollRight, scrollUp, scrollDown);
TJvScrollArrows = set of TJvScrollArrow;
TJvTimeItemClickEvent = procedure(Sender: TObject; Item: TJvTimeItem) of object;
TJvDrawTimeItemEvent = procedure(Sender: TObject; Canvas: TCanvas; Item:
TJvTimeItem; var R: TRect) of object;
TJvMeasureTimeItemEvent = procedure(Sender: TObject; Item: TJvTimeItem; var
ItemHeight: Integer) of object;
TJvStreamItemEvent = procedure(Sender: TObject; Item: TJvTimeItem; Stream:
TStream) of object;
TJvItemMovedEvent = procedure(Sender: TObject; Item: TJvTimeItem;
var NewStartDate: TDateTime; var NewLevel: Integer) of object;
TJvItemMovingEvent = procedure(Sender: TObject; Item: TJvTimeItem; var
AllowMove: Boolean) of object;
TJvItemMouseMove = procedure(Sender: TObject; Item: TJvTimeItem; X, Y: Integer) of object;
TJvTLScrollBtn = class(TJvGraphicControl)
private
FFlat: Boolean;
FPushed: Boolean;
FTimeLine: TJvCustomTimeLine;
FDirection: TJvScrollArrow;
FRepeatClick: Boolean;
FTimer: TTimer;
procedure SetDirection(const Value: TJvScrollArrow);
procedure SetFlat(const Value: Boolean);
procedure SeTJvTimeLine(const Value: TJvCustomTimeLine);
procedure UpdatePlacement;
procedure OnTimer(Sender: TObject);
protected
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure Click; override;
public
constructor Create(AOwner: TComponent); override;
procedure Paint; override;
property RepeatClick: Boolean read FRepeatClick write FRepeatClick;
published
property Flat: Boolean read FFlat write SetFlat;
property Direction: TJvScrollArrow read FDirection write SetDirection;
property TimeLine: TJvCustomTimeLine read FTimeLine write SeTJvTimeLine;
end;
TJvCustomTimeLine = class(TJvCustomControl)
private
FItemHintImageList: TCustomImageList;
FArrows: array [TJvScrollArrow] of TJvTLScrollBtn;
FList: TList;
FBmp: TBitmap;
FYearWidth: TJvYearWidth;
FBorderStyle: TBorderStyle;
FUpdate: Integer;
FMonthWidth: Extended;
FTopOffset: Integer;
FItemOffset: Integer;
FScrollHeight: Integer;
FScrollWidth: Integer;
FFirstDate: TDate;
FShowMonths: Boolean;
FShowDays: Boolean;
FMultiSelect: Boolean;
FShowItemHint: Boolean;
FSupportLines: Boolean;
FFlat: Boolean;
FHelperYears: Boolean;
FDragLine: Boolean;
FLineVisible: Boolean;
//--FMouseDown: Boolean;
FNewHeight: Integer;
FOldX: Integer;
FOldHint: string;
FStyle: TJvTimeLineStyle;
FScrollArrows: TJvScrollArrows;
FTimeItems: TJvTimeItems;
FItemHeight: Integer;
FTopLevel: Integer;
FImages: TCustomImageList;
FYearFont: TFont;
FSelectedItem: TJvTimeItem;
FYearList: TList;
FImageChangeLink: TChangeLink;
FOnVertScroll: TScrollEvent;
FOnHorzScroll: TScrollEvent;
FOnItemClick: TJvTimeItemClickEvent;
FOnDrawItem: TJvDrawTimeItemEvent;
FOnMeasureItem: TJvMeasureTimeItemEvent;
FOnLoadItem: TJvStreamItemEvent;
FOnSaveItem: TJvStreamItemEvent;
FOnSize: TNotifyEvent;
FOnItemMoved: TJvItemMovedEvent;
FOnItemMoving: TJvItemMovingEvent;
FLastScrollCode: TScrollCode;
FHorzSupport: Boolean;
FShowHiddenItemHints: Boolean;
FOnItemDblClick: TJvTimeItemClickEvent;
FCanvas: TControlCanvas;
FAutoDrag: Boolean;// automatic (or allowed) drag start
FStartPos: TPoint;
FStates: TJvTimeLineStates;
FRangeAnchor: TJvTimeItem;
FAutoSize: Boolean;
FShowSelection: Boolean;
FOnItemMouseMove: TJvItemMouseMove;
FSupportsColor: TColor;
procedure SetHelperYears(Value: Boolean);
procedure SetFlat(Value: Boolean);
procedure SetScrollArrows(Value: TJvScrollArrows);
procedure SetBorderStyle(Value: TBorderStyle);
procedure SetYearFont(Value: TFont);
procedure SetYearWidth(Value: TJvYearWidth);
procedure SetFirstDate(Value: TDate);
procedure SetTimeItems(Value: TJvTimeItems);
procedure SetImages(Value: TCustomImageList);
procedure SetShowMonths(Value: Boolean);
procedure SetShowDays(Value: Boolean);
procedure SetSelectedItem(Value: TJvTimeItem);
procedure SetMultiSelect(Value: Boolean);
procedure SetTopOffset(Value: Integer);
procedure SetTopLevel(Value: Integer);
// procedure SetItemAlign(Value: TItemAlign);
procedure SetSupportLines(Value: Boolean);
procedure SetStyle(Value: TJvTimeLineStyle);
procedure SetItemHeight(Value: Integer);
procedure ImagesChanged(Sender: TObject);
function GetLastDate: TDate;
procedure HighLiteItem(Item: TJvTimeItem);
procedure UpdateOffset;
procedure DrawDays(ACanvas: TCanvas; Days, StartAt: Integer);
procedure DrawDayNumbers(ACanvas: TCanvas; Days, StartAt: Integer);
procedure DrawMonth(ACanvas: TCanvas; StartAt, M: Integer);
procedure DrawMonthName(ACanvas: TCanvas; Month, StartAt: Integer);
procedure DrawYear(ACanvas: TCanvas; StartAt: Integer; YR: string);
procedure DrawTimeLine(ACanvas: TCanvas);
procedure DrawVertSupport(ACanvas: TCanvas; StartAt: Integer);
procedure DrawHorzSupports(ACanvas: TCanvas);
procedure DrawFocus;
procedure DrawLeftItemHint(ACanvas: TCanvas);
procedure DrawRightItemHint(ACanvas: TCanvas);
procedure DrawScrollButtons;
procedure DoYearFontChange(Sender: TObject);
function HasItemsToLeft: Boolean;
function HasItemsToRight: Boolean;
procedure SetHorzSupport(const Value: Boolean);
function GetMonth: Word;
function GetYear: Word;
procedure SetMonth(const Value: Word);
procedure SetYear(const Value: Word);
procedure SetShowHiddenItemHints(const Value: Boolean);
procedure HandleClickSelection(LastFocused, NewItem: TJvTimeItem;
Shift: TShiftState);
function HasMoved(P: TPoint): Boolean;
function GetHint: string;
procedure SetHint(const Value: string);
procedure SetShowSelection(const Value: Boolean);
procedure SetSupportsColor(const Value: TColor);
procedure RecreateWnd;
protected
// Some helper functions for selection
procedure AddToSelection(AItem: TJvTimeItem); overload;
procedure SelectItems(StartItem, EndItem: TJvTimeItem; AddOnly: Boolean);
procedure RemoveFromSelection(AItem: TJvTimeItem);
procedure ClearSelection;
function ItemMoving(Item: TJvTimeItem): Boolean; virtual;
procedure ItemMoved(Item: TJvTimeItem; var NewDate: TDateTime; var NewLevel: Integer); virtual;
function ItemMouseMove(X, Y: Integer): Boolean; virtual;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure DblClick; override;
procedure Click; override;
procedure Paint; override;
procedure DrawDragLine(X: Integer); virtual;
procedure MoveDragLine(ANewX: Integer); virtual;
procedure VertScroll(ScrollCode: TScrollCode; var ScrollPos: Integer); virtual;
procedure HorzScroll(ScrollCode: TScrollCode; var ScrollPos: Integer); virtual;
procedure ItemClick(Item: TJvTimeItem); virtual;
procedure ItemDblClick(Item: TJvTimeItem); virtual;
procedure Size; virtual;
procedure SaveItem(Item: TJvTimeItem; Stream: TStream); virtual;
procedure LoadItem(Item: TJvTimeItem; Stream: TStream); virtual;
procedure MeasureItem(Item: TJvTimeItem; var ItemHeight: Integer); virtual;
procedure DrawItem(Item: TJvTimeItem; ACanvas: TCanvas; var R: TRect); virtual;
procedure UpdateItem(Index: Integer; ACanvas: TCanvas); virtual;
procedure UpdateItems; virtual;
procedure UpdateItemHint(X,Y: Integer);
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure CreateWidget; override;
property Align default alTop;
property Color default clWindow;
{ new properties }
property Year: Word read GetYear write SetYear;
property Month: Word read GetMonth write SetMonth;
property Selected: TJvTimeItem read FSelectedItem write SetSelectedItem;
property ShowHiddenItemHints: Boolean read FShowHiddenItemHints write
SetShowHiddenItemHints default True;
property BorderStyle: TBorderStyle read FBorderStyle write SetBorderStyle
default bsSingle;
property DragLine: Boolean read FDragLine write FDragLine default True;
property ShowItemHint: Boolean read FShowItemHint write FShowItemHint default False;
property HelperYears: Boolean read FHelperYears write SetHelperYears default True;
property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default False;
property Flat: Boolean read FFlat write SetFlat default False;
property Hint: string read GetHint write SetHint;
property YearFont: TFont read FYearFont write SetYearFont;
property YearWidth: TJvYearWidth read FYearWidth write SetYearWidth default 140;
property TopOffset: Integer read FTopOffset write SetTopOffset default 21;
property ShowMonthNames: Boolean read FShowMonths write SetShowMonths;
property ShowSelection: Boolean read FShowSelection write SetShowSelection default False;
property ShowDays: Boolean read FShowDays write SetShowDays default False;
property FirstVisibleDate: TDate read FFirstDate write SetFirstDate;
property Images: TCustomImageList read FImages write SetImages;
property Items: TJvTimeItems read FTimeItems write SetTimeItems;
property ItemHeight: Integer read FItemHeight write SetItemHeight default 12;
// property ItemAlign: TItemAlign read FItemAlign write SetItemAlign default tiCenter;
property VertSupports: Boolean read FSupportLines write SetSupportLines default False;
property HorzSupports: Boolean read FHorzSupport write SetHorzSupport;
property SupportsColor: TColor read FSupportsColor write SetSupportsColor default clBtnFace;
property Style: TJvTimeLineStyle read FStyle write SetStyle default tlDefault;
property TopLevel: Integer read FTopLevel write SetTopLevel default 0;
property ScrollArrows: TJvScrollArrows read FScrollArrows write
SetScrollArrows default [scrollLeft..scrollDown];
property OnItemClick: TJvTimeItemClickEvent read FOnItemClick write FOnItemClick;
property OnItemDblClick: TJvTimeItemClickEvent read FOnItemDblClick write FOnItemDblClick;
property OnSize: TNotifyEvent read FOnSize write FOnSize;
property OnHorzScroll: TScrollEvent read FOnHorzScroll write FOnHorzScroll;
property OnVertScroll: TScrollEvent read FOnVertScroll write FOnVertScroll;
property OnDrawItem: TJvDrawTimeItemEvent read FOnDrawItem write FOnDrawItem;
property OnMeasureItem: TJvMeasureTimeItemEvent read FOnMeasureItem write FOnMeasureItem;
property OnSaveItem: TJvStreamItemEvent read FOnSaveItem write FOnSaveItem;
property OnLoadItem: TJvStreamItemEvent read FOnLoadItem write FOnLoadItem;
property OnItemMoved: TJvItemMovedEvent read FOnItemMoved write FOnItemMoved;
property OnItemMouseMove: TJvItemMouseMove read FOnItemMouseMove write FOnItemMouseMove;
property OnItemMoving: TJvItemMovingEvent read FOnItemMoving write FOnItemMoving;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure NextYear;
procedure PrevYear;
procedure NextMonth;
procedure PrevMonth;
function ItemAtPos(X, Y: Integer): TJvTimeItem; virtual;
function LevelAtPos(Pos: Integer): Integer; virtual;
function DateAtPos(Pos: Integer): TDateTime; virtual;
function PosAtDate(Date: TDateTime): Integer; virtual;
procedure AutoLevels(Complete, ResetLevels: Boolean); virtual;
procedure LoadFromFile(FileName: string); virtual;
procedure SaveToFile(FileName: string); virtual;
procedure LoadFromStream(Stream: TStream); virtual;
procedure SaveToStream(Stream: TStream); virtual;
procedure BeginUpdate; virtual;
procedure EndUpdate; virtual;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure BeginDrag(Immediate: Boolean; Threshold: Integer = -1);
end;
TJvTimeLine = class(TJvCustomTimeLine)
public
property Selected;
published
property Align;
property Color;
property Cursor;
property DoubleBuffered default True;
property DragLine;
property Enabled;
property Height;
property HelperYears;
property ShowSelection;
property Hint;
property Left;
property PopupMenu;
property ParentShowHint;
property ShowHint;
property Top;
property Visible;
property Width;
property Font;
property ScrollArrows;
property TabStop;
property TabOrder;
property OnMouseDown;
property OnMouseUp;
property OnMouseMove;
property OnMouseEnter;
property OnMouseLeave;
property OnDblClick;
property OnClick;
property BorderStyle;
property MultiSelect;
property Flat;
property YearFont;
property YearWidth;
property TopOffset;
property ShowDays;
property ShowHiddenItemHints;
property ShowItemHint;
property ShowMonthNames;
property FirstVisibleDate;
property Images;
property Items;
property ItemHeight;
// property ItemAlign;
property VertSupports;
property HorzSupports;
property SupportsColor;
property Style;
property TopLevel;
property OnItemClick;
property OnItemDblClick;
property OnSize;
property OnHorzScroll;
property OnVertScroll;
property OnDrawItem;
property OnMeasureItem;
property OnSaveItem;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -