Componentes.Terceros.jvcl/official/3.32/run/JvInspExtraEditors.pas

1028 lines
30 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: JvInspExtraEditors.pas, released on 2001-02-28.
The Initial Developer of the Original Code is Marcel Bestebroer
<jedi_mbe (at) users (dot) sf (dot) net>.
Portions created by Marcel Bestebroer are Copyright (C) 2000 - 2001 mbeSoft.
All Rights Reserved.
Contributor(s): Michael Beck [mbeck att bigfoot dott com], Markus Spoettl.
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Description:
Additional editors for JvInspector.
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvInspExtraEditors.pas 10612 2006-05-19 19:04:09Z jfudickar $
unit JvInspExtraEditors;
{$I jvcl.inc}
interface
uses
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
SysUtils, Classes,
Windows, Graphics, Controls, StdCtrls, ImgList,
JvInspector;
type
// In the same spirit as the TJvTypeInfoHelper class in JvInspector.pas
// we define here a TJvTypeInfoExtraHelper class for the types that
// are used by the editors in this unit. Please refer to JvInspector.pas
// for more details on this C++ Builder compatibility issue.
TJvTypeInfoExtraHelper = class(TJvTypeInfoHelper)
private
FTAlignProp: TAlign;
FTAnchorsProp: TAnchors;
FTColorProp: TColor;
FTImageIndexProp: TImageIndex;
published
property TAlignProp: TAlign read FTAlignProp;
property TAnchorsProp: TAnchors read FTAnchorsProp;
property TColorProp: TColor read FTColorProp;
property TImageIndexProp: TImageIndex read FTImageIndexProp;
end;
{ TAlign item editor. Descents from the enumeration item to keep DisplayValue available }
TJvInspectorAlignItem = class(TJvInspectorEnumItem)
private
FUnassignedColor: TColor;
FNormalColor: TColor;
FActiveColor: TColor;
protected
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure PaintAlignBox(const Align: TAlign; const ACanvas: TCanvas; const ARect: TRect;
const UseUnassigned: Boolean);
public
constructor Create(const AParent: TJvCustomInspectorItem;
const AData: TJvCustomInspectorData); override;
procedure DoneEdit(const CancelEdits: Boolean = False); override;
procedure DrawValue(const ACanvas: TCanvas); override;
procedure InitEdit; override;
class procedure RegisterAsDefaultItem;
class procedure UnregisterAsDefaultItem;
property UnassignedColor: TColor read FUnassignedColor;
property NormalColor: TColor read FNormalColor;
property ActiveColor: TColor read FActiveColor;
end;
{ TAnchors item editor. Descents from the set item to keep DisplayValue available }
TJvInspectorAnchorsItem = class(TJvInspectorSetItem)
private
FUnassignedColor: TColor;
FNormalColor: TColor;
FActiveColor: TColor;
protected
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure SetFlags(const Value: TInspectorItemFlags); override;
procedure SetItemSetFlags(const Value: TInspectorSetFlags); override;
procedure PaintAnchorsBox(const Anchors: TAnchors; const ACanvas: TCanvas; const ARect: TRect;
const UseUnassigned: Boolean);
public
constructor Create(const AParent: TJvCustomInspectorItem;
const AData: TJvCustomInspectorData); override;
procedure DoneEdit(const CancelEdits: Boolean = False); override;
procedure DrawValue(const ACanvas: TCanvas); override;
procedure InitEdit; override;
class procedure RegisterAsDefaultItem;
class procedure UnregisterAsDefaultItem;
property UnassignedColor: TColor read FUnassignedColor;
property NormalColor: TColor read FNormalColor;
property ActiveColor: TColor read FActiveColor;
end;
{ TColor item editor. Will render the color in a box, together with the name/value }
TJvInspectorColorItem = class(TJvCustomInspectorItem)
private
FColors: TStringList;
FStdColors: TStringList;
FIncludeStdColors: Boolean;
protected
procedure AddStdColor(const S: string);
function BorderColor(const ABackgroundColor, AInternalColor: TColor): TColor;
function NameForColor(const Color: TColor): string;
procedure PaintValue(const Color: TColor; const ColorName: string; const ACanvas: TCanvas;
const ARect: TRect);
{$IFDEF VCL}
procedure DoDrawListItem(Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState); override;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure DoDrawListItem(Control: TObject; Index: Integer; Rect: TRect;
State: TOwnerDrawState; var Handled: Boolean); override;
{$ENDIF VisualCLX}
procedure DoMeasureListItem(Control: TWinControl; Index: Integer; var Height: Integer); override;
procedure DoMeasureListItemWidth(Control: TWinControl; Index: Integer; var Width: Integer); override;
function GetDisplayValue: string; override;
procedure GetValueList(const Strings: TStrings); override;
procedure SetDisplayValue(const Value: string); override;
procedure SetFlags(const Value: TInspectorItemFlags); override;
procedure SetRects(const RectKind: TInspectorPaintRect; Value: TRect); override;
public
constructor Create(const AParent: TJvCustomInspectorItem;
const AData: TJvCustomInspectorData); override;
procedure BeforeDestruction; override;
procedure DrawValue(const ACanvas: TCanvas); override;
class procedure RegisterAsDefaultItem;
class procedure UnregisterAsDefaultItem;
property IncludeStdColors: Boolean read FIncludeStdColors write FIncludeStdColors;
end;
{ TImageList image index editor. Will render the image next to the value }
TJvInspectorTImageIndexItem = class(TJvCustomInspectorItem)
private
FImageList: TCustomImageList;
protected
procedure PaintValue(const ImgNum: Integer; const ImgName: string; const ACanvas: TCanvas;
const ARect: TRect);
{$IFDEF VCL}
procedure DoDrawListItem(Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState); override;
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure DoDrawListItem(Control: TObject; Index: Integer; Rect: TRect;
State: TOwnerDrawState; var Handled: Boolean); override;
{$ENDIF VisualCLX}
procedure DoMeasureListItem(Control: TWinControl; Index: Integer; var Height: Integer); override;
procedure DoMeasureListItemWidth(Control: TWinControl; Index: Integer; var Width: Integer); override;
function GetDisplayValue: string; override;
procedure GetValueList(const Strings: TStrings); override;
procedure SetDisplayValue(const Value: string); override;
procedure SetFlags(const Value: TInspectorItemFlags); override;
procedure SetRects(const RectKind: TInspectorPaintRect; Value: TRect); override;
public
procedure DrawValue(const ACanvas: TCanvas); override;
class procedure RegisterAsDefaultItem;
class procedure UnregisterAsDefaultItem;
property Images: TCustomImageList read FImageList write FImageList;
end;
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvInspExtraEditors.pas $';
Revision: '$Revision: 10612 $';
Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
implementation
uses
TypInfo,
JclRTTI,
JvResources;
type
TColorQuad = packed record
Red: Byte;
Green: Byte;
Blue: Byte;
Alpha: Byte;
end;
//=== { TJvInspectorAlignItem } ==============================================
constructor TJvInspectorAlignItem.Create(const AParent: TJvCustomInspectorItem;
const AData: TJvCustomInspectorData);
begin
inherited Create(AParent, AData);
FUnassignedColor := clGrayText;
FNormalColor := clWindowText;
FActiveColor := clBlue;
end;
procedure TJvInspectorAlignItem.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
NewAlign: TAlign;
begin
if Editing and (Shift = [ssCtrl]) then
begin
if Data.IsAssigned then
NewAlign := TAlign(Data.AsOrdinal)
else
NewAlign := alNone;
case Key of
VK_UP, VK_NUMPAD8:
begin
if NewAlign = alTop then
NewAlign := alNone
else
NewAlign := alTop;
end;
VK_RIGHT, VK_NUMPAD6:
begin
if NewAlign = alRight then
NewAlign := alNone
else
NewAlign := alRight;
end;
VK_DOWN, VK_NUMPAD2:
begin
if NewAlign = alBottom then
NewAlign := alNone
else
NewAlign := alBottom;
end;
VK_LEFT, VK_NUMPAD4:
begin
if NewAlign = alLeft then
NewAlign := alNone
else
NewAlign := alLeft;
end;
VK_NUMPAD5, VK_HOME, VK_NUMPAD7:
begin
if NewAlign = alClient then
NewAlign := alNone
else
NewAlign := alClient;
end;
end;
case Key of
VK_UP, VK_NUMPAD8, VK_RIGHT, VK_NUMPAD6, VK_DOWN, VK_NUMPAD2,
VK_LEFT, VK_NUMPAD4, VK_NUMPAD5, VK_HOME, VK_NUMPAD7:
begin
Data.AsOrdinal := Ord(NewAlign);
Key := 0;
end;
else
inherited EditKeyDown(Sender, Key, Shift);
end;
end;
end;
procedure TJvInspectorAlignItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
NewAlign: TAlign;
ValueRect: TRect;
begin
if Editing and (Shift = [ssLeft]) then
begin
if Data.IsAssigned then
NewAlign := TAlign(Data.AsOrdinal)
else
NewAlign := alNone;
ValueRect := Rects[iprValueArea];
with ValueRect do
begin
if PtInRect(Rect(Left + 5, Top, Right - 5, Top + 5), Point(X, Y)) then
begin
if NewAlign = alTop then
NewAlign := alNone
else
NewAlign := alTop;
end
else
if PtInRect(Rect(Right - 5, Top + 5, Right, Bottom - 5), Point(X, Y)) then
begin
if NewAlign = alRight then
NewAlign := alNone
else
NewAlign := alRight;
end
else
if PtInRect(Rect(Left + 5, Bottom - 5, Right - 5, Bottom), Point(X, Y)) then
begin
if NewAlign = alBottom then
NewAlign := alNone
else
NewAlign := alBottom;
end
else
if PtInRect(Rect(Left, Top + 5, Left + 5, Bottom - 5), Point(X, Y)) then
begin
if NewAlign = alLeft then
NewAlign := alNone
else
NewAlign := alLeft;
end
else
if PtInRect(ValueRect, Point(X, Y)) then
begin
if NewAlign = alClient then
NewAlign := alNone
else
NewAlign := alClient;
end;
end;
Data.AsOrdinal := Ord(NewAlign);
end;
end;
procedure TJvInspectorAlignItem.PaintAlignBox(const Align: TAlign;
const ACanvas: TCanvas; const ARect: TRect; const UseUnassigned: Boolean);
var
NoAlignColor: TColor;
procedure RenderAlign(const Check: TAlign; const X, Y: Integer);
begin
if (Align = alClient) or (Align = Check) then
ACanvas.Pen.Color := ActiveColor
else
ACanvas.Pen.Color := NoAlignColor;
ACanvas.LineTo(X, Y);
end;
begin
if UseUnassigned then
NoAlignColor := UnassignedColor
else
NoAlignColor := NormalColor;
ACanvas.Pen.Width := 2;
ACanvas.MoveTo(ARect.Left + 2, ARect.Top + 2);
RenderAlign(alTop, ARect.Right - 3, ARect.Top + 2);
RenderAlign(alRight, ARect.Right - 3, ARect.Bottom - 3);
RenderAlign(alBottom, ARect.Left + 2, ARect.Bottom - 3);
RenderAlign(alLeft, ARect.Left + 2, ARect.Top + 1);
end;
procedure TJvInspectorAlignItem.DoneEdit(const CancelEdits: Boolean = False);
begin
SetEditing(False);
end;
procedure TJvInspectorAlignItem.DrawValue(const ACanvas: TCanvas);
var
IsValid: Boolean;
Align: TAlign;
ARect: TRect;
begin
IsValid := Data.IsInitialized and Data.IsAssigned and Data.HasValue;
if IsValid then
Align := TAlign(Data.AsOrdinal)
else
Align := alNone;
if Editing and Data.IsAssigned then
ACanvas.Brush.Color := clWindow;
ARect := Rects[iprValueArea];
ACanvas.FillRect(ARect);
PaintAlignBox(Align, ACanvas, ARect, not IsValid);
end;
procedure TJvInspectorAlignItem.InitEdit;
begin
SetEditing(CanEdit);
end;
class procedure TJvInspectorAlignItem.RegisterAsDefaultItem;
begin
with TJvCustomInspectorData.ItemRegister do
begin
if IndexOf(Self) = -1 then
Add(TJvInspectorTypeInfoRegItem.Create(Self, TypeInfo(TAlign)));
end;
end;
class procedure TJvInspectorAlignItem.UnregisterAsDefaultItem;
begin
TJvCustomInspectorData.ItemRegister.Delete(Self);
end;
//=== { TJvInspectorColorItem } ==============================================
constructor TJvInspectorColorItem.Create(const AParent: TJvCustomInspectorItem;
const AData: TJvCustomInspectorData);
begin
inherited Create(AParent, AData);
FColors := TStringList.Create;
FStdColors := TStringList.Create;
GetColorValues(AddStdColor);
FStdColors.Sort;
IncludeStdColors := True;
Flags := [iifVisible, iifValueList, iifAllowNonListValues, iifOwnerDrawListVariable];
end;
procedure TJvInspectorColorItem.AddStdColor(const S: string);
begin
FStdColors.AddObject(S, TObject(JclStrToTypedInt(S, TypeInfo(TColor))));
end;
function TJvInspectorColorItem.BorderColor(const ABackgroundColor, AInternalColor: TColor): TColor;
var
BckRGB: TColor;
ColRGB: TColor;
function IsLightColor(const RGB: TColor): Boolean;
begin
with TColorQuad(RGB) do
Result := (Red > 192) or (Green > 192) or (Blue > 192);
end;
begin
BckRGB := ColorToRGB(ABackgroundColor);
ColRGB := ColorToRGB(AInternalColor);
if IsLightColor(BckRGB) and IsLightColor(ColRGB) then
Result := clBlack
else
if not IsLightColor(BckRGB) and not IsLightColor(ColRGB) then
Result := clWhite
else
Result := AInternalColor;
end;
function TJvInspectorColorItem.NameForColor(const Color: TColor): string;
begin
Result := JclTypedIntToStr(Color, TypeInfo(TColor));
end;
procedure TJvInspectorColorItem.PaintValue(const Color: TColor; const ColorName: string;
const ACanvas: TCanvas; const ARect: TRect);
var
TH: Integer;
BoxRect: TRect;
bc: TColor;
pc: TColor;
txtRect: TRect;
begin
TH := Rects[iprValue].Bottom - Rects[iprValue].Top - 2;
BoxRect.Left := ARect.Left + (ARect.Bottom - ARect.Top - TH) div 2;
BoxRect.Top := ARect.Top + BoxRect.Left - ARect.Left;
BoxRect.Right := BoxRect.Left + TH;
BoxRect.Bottom := BoxRect.Top + TH;
with ACanvas do
begin
if Color <> clNone then
begin
bc := Brush.Color;
pc := Pen.Color;
try
Brush.Color := Color;
Pen.Color := BorderColor(bc, Color);
Rectangle(BoxRect);
finally
Pen.Color := pc;
Brush.Color := bc;
end;
end;
txtRect := ARect;
txtRect.Left := txtRect.Left + (txtRect.Bottom-txtRect.Top)+ 1;
TextRect(txtRect, txtRect.Left, BoxRect.Top, ColorName);
end;
end;
{$IFDEF VCL}
procedure TJvInspectorColorItem.DoDrawListItem(Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure TJvInspectorColorItem.DoDrawListItem(Control: TObject; Index: Integer; Rect: TRect;
State: TOwnerDrawState; var Handled: Boolean);
{$ENDIF VisualCLX}
begin
with TListBox(Control) do
begin
if odSelected in State then
Canvas.Brush.Color := clHighlight;
Canvas.FillRect(Rect);
Rect.Top := Rect.Top + 1;
Rect.Bottom := Rect.Bottom - 1;
PaintValue(TColor(Items.Objects[Index]), Items[Index], Canvas, Rect);
end;
{$IFDEF VisualCLX}
Handled := True;
{$ENDIF VisualCLX}
end;
procedure TJvInspectorColorItem.DoMeasureListItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
with Rects[iprValueArea] do
Height := Bottom - Top + 2;
end;
procedure TJvInspectorColorItem.DoMeasureListItemWidth(Control: TWinControl; Index: Integer;
var Width: Integer);
begin
with Rects[iprValueArea] do
Width := Width + Bottom - Top + 2;
end;
function TJvInspectorColorItem.GetDisplayValue: string;
var
TempSL: TStringList;
I: Integer;
begin
TempSL := TStringList.Create;
try
GetValueList(TempSL);
I := TempSL.IndexOfObject(TObject(Data.AsOrdinal));
if I = -1 then
Result := JclTypedIntToStr(Data.AsOrdinal, TypeInfo(TColor))
else
Result := TempSL[I];
finally
TempSL.Free;
end;
end;
procedure TJvInspectorColorItem.GetValueList(const Strings: TStrings);
var
TempSL: TStringList;
begin
TempSL := TStringList.Create;
try
if IncludeStdColors then
TempSL.AddStrings(FStdColors);
TempSL.AddStrings(FColors);
DoGetValueList(Strings);
TempSL.AddStrings(Strings);
TempSL.Sort;
Strings.Assign(TempSL);
finally
TempSL.Free;
end;
end;
procedure TJvInspectorColorItem.SetDisplayValue(const Value: string);
var
SL: TStringList;
I: Integer;
begin
SL := TStringList.Create;
try
GetValueList(SL);
I := SL.IndexOf(Value);
if I > -1 then
I := Integer(SL.Objects[I])
else
I := JclStrToTypedInt(Value, TypeInfo(TColor));
Data.AsOrdinal := I;
finally
SL.Free;
end;
end;
procedure TJvInspectorColorItem.SetFlags(const Value: TInspectorItemFlags);
begin
inherited SetFlags(Value + [iifValueList, iifAllowNonListValues, iifOwnerDrawListFixed] -
[iifOwnerDrawListVariable]);
end;
procedure TJvInspectorColorItem.SetRects(const RectKind: TInspectorPaintRect; Value: TRect);
begin
if RectKind = iprValue then
Value.Left := Value.Left + (Value.Bottom - Value.Top) + 2;
inherited SetRects(RectKind, Value);
end;
procedure TJvInspectorColorItem.BeforeDestruction;
begin
FStdColors.Free;
FColors.Free;
inherited BeforeDestruction;
end;
procedure TJvInspectorColorItem.DrawValue(const ACanvas: TCanvas);
var
Color: TColor;
S: string;
ARect: TRect;
SafeColor: TColor;
begin
Color := clNone;
if Data = nil then
S := RsJvInspItemUnInitialized
else
try
if not Data.IsInitialized then
S := RsJvInspItemUnInitialized
else
if not Data.HasValue then
S := RsJvInspItemNoValue
else
if not Data.IsAssigned then
S := RsJvInspItemUnassigned
else
begin
S := DisplayValue;
Color := Data.AsOrdinal;
end;
except
S := RsJvInspItemValueException + ExceptObject.ClassName + ': ' +
Exception(ExceptObject).Message;
end;
ARect := Rects[iprValueArea];
SafeColor := ACanvas.Brush.Color;
if Editing then
ACanvas.Brush.Color := clWindow;
try
ACanvas.FillRect(ARect);
PaintValue(Color, S, ACanvas, ARect);
if Editing then
DrawEditor(ACanvas);
finally
if Editing then
ACanvas.Brush.Color := SafeColor;
end;
end;
class procedure TJvInspectorColorItem.RegisterAsDefaultItem;
begin
with TJvCustomInspectorData.ItemRegister do
if IndexOf(Self) = -1 then
Add(TJvInspectorTypeInfoRegItem.Create(Self, TypeInfo(TColor)));
end;
class procedure TJvInspectorColorItem.UnregisterAsDefaultItem;
begin
TJvCustomInspectorData.ItemRegister.Delete(Self);
end;
//=== { TJvInspectorAnchorsItem } ============================================
constructor TJvInspectorAnchorsItem.Create(const AParent: TJvCustomInspectorItem;
const AData: TJvCustomInspectorData);
begin
inherited Create(AParent, AData);
FUnassignedColor := clGrayText;
FNormalColor := clWindowText;
FActiveColor := clBlue;
end;
procedure TJvInspectorAnchorsItem.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
NewAnchors: TAnchors;
procedure Toggle(const Side: TAnchorKind);
begin
if Side in NewAnchors then
Exclude(NewAnchors, Side)
else
Include(NewAnchors, Side)
end;
begin
if Editing and (Shift = [ssCtrl]) then
begin
if Data.IsAssigned then
Data.GetAsSet(NewAnchors)
else
NewAnchors := [];
case Key of
VK_UP, VK_NUMPAD8:
Toggle(akTop);
VK_RIGHT, VK_NUMPAD6:
Toggle(akRight);
VK_DOWN, VK_NUMPAD2:
Toggle(akBottom);
VK_LEFT, VK_NUMPAD4:
Toggle(akLeft);
VK_NUMPAD5, VK_HOME, VK_NUMPAD7:
begin
if NewAnchors <> [] then
NewAnchors := []
else
NewAnchors := [akLeft, akTop, akRight, akBottom];
end;
end;
case Key of
VK_UP, VK_NUMPAD8, VK_RIGHT, VK_NUMPAD6, VK_DOWN, VK_NUMPAD2, VK_LEFT,
VK_NUMPAD4, VK_NUMPAD5, VK_HOME, VK_NUMPAD7:
begin
Data.SetAsSet(NewAnchors);
Key := 0;
end;
else
inherited EditKeyDown(Sender, Key, Shift);
end;
end;
end;
procedure TJvInspectorAnchorsItem.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
NewAnchors: TAnchors;
OrgAnchors: TAnchors;
ValueRect: TRect;
procedure Toggle(const Side: TAnchorKind);
begin
if Side in NewAnchors then
Exclude(NewAnchors, Side)
else
Include(NewAnchors, Side);
end;
begin
if Editing and (Shift = [ssLeft]) then
begin
if Data.IsAssigned then
Data.GetAsSet(NewAnchors)
else
NewAnchors := [];
OrgAnchors := NewAnchors;
ValueRect := Rects[iprValueArea];
with ValueRect do
begin
if PtInRect(Rect(Left + 5, Top, Right - 5, Top + 5), Point(X, Y)) then
Toggle(akTop)
else
if PtInRect(Rect(Right - 5, Top + 5, Right, Bottom - 5), Point(X, Y)) then
Toggle(akRight)
else
if PtInRect(Rect(Left + 5, Bottom - 5, Right - 5, Bottom), Point(X, Y)) then
Toggle(akBottom)
else
if PtInRect(Rect(Left, Top + 5, Left + 5, Bottom - 5), Point(X, Y)) then
Toggle(akLeft)
else
if PtInRect(ValueRect, Point(X, Y)) then
begin
if NewAnchors <> [] then
NewAnchors := []
else
NewAnchors := [akLeft, akTop, akRight, akBottom];
end;
end;
if OrgAnchors <> NewAnchors then
Data.SetAsSet(NewAnchors);
end;
end;
procedure TJvInspectorAnchorsItem.SetFlags(const Value: TInspectorItemFlags);
begin
inherited SetFlags(Value);
end;
procedure TJvInspectorAnchorsItem.SetItemSetFlags(const Value: TInspectorSetFlags);
begin
inherited SetItemSetFlags(Value - [isfCreateMemberItems] + [isfEditString]);
end;
procedure TJvInspectorAnchorsItem.PaintAnchorsBox(const Anchors: TAnchors;
const ACanvas: TCanvas; const ARect: TRect; const UseUnassigned: Boolean);
var
NoAnchorsColor: TColor;
procedure RenderAnchors(const Check: TAnchorKind; const X, Y: Integer);
begin
if Check in Anchors then
ACanvas.Pen.Color := ActiveColor
else
ACanvas.Pen.Color := NoAnchorsColor;
ACanvas.LineTo(X, Y);
end;
begin
if UseUnassigned then
NoAnchorsColor := UnassignedColor
else
NoAnchorsColor := NormalColor;
ACanvas.Pen.Width := 2;
ACanvas.MoveTo(ARect.Left + 2, ARect.Top + 2);
RenderAnchors(akTop, ARect.Right - 3, ARect.Top + 2);
RenderAnchors(akRight, ARect.Right - 3, ARect.Bottom - 3);
RenderAnchors(akBottom, ARect.Left + 2, ARect.Bottom - 3);
RenderAnchors(akLeft, ARect.Left + 2, ARect.Top + 1);
end;
procedure TJvInspectorAnchorsItem.DoneEdit(const CancelEdits: Boolean = False);
begin
SetEditing(False);
end;
procedure TJvInspectorAnchorsItem.DrawValue(const ACanvas: TCanvas);
var
IsValid: Boolean;
Anchors: TAnchors;
ARect: TRect;
begin
IsValid := Data.IsInitialized and Data.IsAssigned and Data.HasValue;
if IsValid then
Data.GetAsSet(Anchors)
else
Anchors := [];
if Editing and Data.IsAssigned then
ACanvas.Brush.Color := clWindow;
ARect := Rects[iprValueArea];
ACanvas.FillRect(ARect);
PaintAnchorsBox(Anchors, ACanvas, ARect, not IsValid);
end;
procedure TJvInspectorAnchorsItem.InitEdit;
begin
SetEditing(CanEdit);
end;
class procedure TJvInspectorAnchorsItem.RegisterAsDefaultItem;
begin
with TJvCustomInspectorData.ItemRegister do
if IndexOf(Self) = -1 then
Add(TJvInspectorTypeInfoRegItem.Create(Self, TypeInfo(TAnchors)));
end;
class procedure TJvInspectorAnchorsItem.UnregisterAsDefaultItem;
begin
TJvCustomInspectorData.ItemRegister.Delete(Self);
end;
//=== { TJvInspectorTImageIndexItem } ========================================
procedure TJvInspectorTImageIndexItem.PaintValue(const ImgNum: Integer; const ImgName: string;
const ACanvas: TCanvas; const ARect: TRect);
var
TH: Integer;
BoxRect: TRect;
Bmp: TBitmap;
begin
TH := Rects[iprValue].Bottom - Rects[iprValue].Top - 2;
BoxRect.Left := ARect.Left + (ARect.Bottom - ARect.Top - TH) div 2;
BoxRect.Top := ARect.Top + BoxRect.Left - ARect.Left;
BoxRect.Right := BoxRect.Left + TH;
BoxRect.Bottom := BoxRect.Top + TH;
with ACanvas do
begin
if (ImgNum > -1) and (Images <> nil) and (ImgNum < Images.Count) then
begin
Bmp := TBitmap.Create;
try
Images.GetBitmap(ImgNum, Bmp);
StretchDraw(BoxRect, Bmp);
finally
Bmp.Free;
end;
end;
TextOut(ARect.Left + (ARect.Bottom - ARect.Top) + 1, BoxRect.Top, ImgName);
end;
end;
{$IFDEF VCL}
procedure TJvInspectorTImageIndexItem.DoDrawListItem(Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
{$ENDIF VCL}
{$IFDEF VisualCLX}
procedure TJvInspectorTImageIndexItem.DoDrawListItem(Control: TObject; Index: Integer; Rect: TRect;
State: TOwnerDrawState; var Handled: Boolean);
{$ENDIF VisualCLX}
begin
with TListBox(Control) do
begin
if odSelected in State then
Canvas.Brush.Color := clHighlight;
Canvas.FillRect(Rect);
Rect.Top := Rect.Top + 1;
Rect.Bottom := Rect.Bottom - 1;
PaintValue(Integer(Items.Objects[Index]), Items[Index], Canvas, Rect);
end;
{$IFDEF VisualCLX}
Handled := True;
{$ENDIF VisualCLX}
end;
procedure TJvInspectorTImageIndexItem.DoMeasureListItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
with Rects[iprValueArea] do
Height := Bottom - Top + 2;
end;
procedure TJvInspectorTImageIndexItem.DoMeasureListItemWidth(Control: TWinControl; Index: Integer;
var Width: Integer);
begin
with Rects[iprValueArea] do
Width := Width + Bottom - Top + 2;
end;
function TJvInspectorTImageIndexItem.GetDisplayValue: string;
begin
Result := JclTypedIntToStr(Integer(Data.AsOrdinal), Data.TypeInfo);
end;
procedure TJvInspectorTImageIndexItem.GetValueList(const Strings: TStrings);
var
I: Integer;
begin
Strings.BeginUpdate;
try
Strings.AddObject('-1', TObject(-1000));
for I := 0 to FImageList.Count - 1 do
Strings.AddObject(IntToStr(I), TObject(I));
finally
Strings.EndUpdate;
end;
end;
procedure TJvInspectorTImageIndexItem.SetDisplayValue(const Value: string);
var
TmpOrd: Integer;
begin
TmpOrd := JclStrToTypedInt(Value, Data.TypeInfo);
if (JclTypeInfo(Data.TypeInfo) as IJclOrdinalRangeTypeInfo).OrdinalType = otULong then
Data.AsOrdinal := Cardinal(TmpOrd)
else
Data.AsOrdinal := TmpOrd;
end;
procedure TJvInspectorTImageIndexItem.SetFlags(const Value: TInspectorItemFlags);
begin
inherited SetFlags(Value + [iifValueList, iifAllowNonListValues, iifOwnerDrawListVariable] -
[iifOwnerDrawListFixed]);
end;
procedure TJvInspectorTImageIndexItem.SetRects(const RectKind: TInspectorPaintRect; Value: TRect);
begin
if RectKind = iprValue then
Value.Left := Value.Left + (Value.Bottom -Value.Top) + 2;
inherited SetRects(RectKind, Value);
end;
procedure TJvInspectorTImageIndexItem.DrawValue(const ACanvas: TCanvas);
var
Idx: Integer;
S: string;
ARect: TRect;
SafeColor: TColor;
begin
Idx := -1;
if Data = nil then
S := RsJvInspItemUnInitialized
else
try
if not Data.IsInitialized then
S := RsJvInspItemUnInitialized
else
if not Data.HasValue then
S := RsJvInspItemNoValue
else
if not Data.IsAssigned then
S := RsJvInspItemUnassigned
else
begin
S := DisplayValue;
Idx := Data.AsOrdinal;
end;
except
S := RsJvInspItemValueException + ExceptObject.ClassName + ': ' +
Exception(ExceptObject).Message;
end;
ARect := Rects[iprValueArea];
SafeColor := ACanvas.Brush.Color;
if Editing then
ACanvas.Brush.Color := clWindow;
try
ACanvas.FillRect(ARect);
PaintValue(Idx, S, ACanvas, ARect);
if Editing then
DrawEditor(ACanvas);
finally
if Editing then
ACanvas.Brush.Color := SafeColor;
end;
end;
class procedure TJvInspectorTImageIndexItem.RegisterAsDefaultItem;
begin
with TJvCustomInspectorData.ItemRegister do
begin
if IndexOf(Self) = -1 then
Add(TJvInspectorTypeInfoRegItem.Create(Self, TypeInfo(TImageIndex)));
end;
end;
class procedure TJvInspectorTImageIndexItem.UnregisterAsDefaultItem;
begin
TJvCustomInspectorData.ItemRegister.Delete(Self);
end;
initialization
{$IFDEF UNITVERSIONING}
RegisterUnitVersion(HInstance, UnitVersioning);
{$ENDIF UNITVERSIONING}
// Register our Extra TypeInfo helper class for BCB
RegisterTypeInfoHelper(TJvTypeInfoExtraHelper);
{$IFDEF UNITVERSIONING}
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.