{*********************************************************}
{*                     OVCBCALC.PAS 4.06                 *}
{*********************************************************}

{* ***** BEGIN LICENSE BLOCK *****                                            *}
{* Version: MPL 1.1                                                           *}
{*                                                                            *}
{* 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/                                                *}
{*                                                                            *}
{* Software distributed under the License is distributed on an "AS IS" basis, *}
{* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License   *}
{* for the specific language governing rights and limitations under the       *}
{* License.                                                                   *}
{*                                                                            *}
{* The Original Code is TurboPower Orpheus                                    *}
{*                                                                            *}
{* The Initial Developer of the Original Code is TurboPower Software          *}
{*                                                                            *}
{* Portions created by TurboPower Software Inc. are Copyright (C)1995-2002    *}
{* TurboPower Software Inc. All Rights Reserved.                              *}
{*                                                                            *}
{* Contributor(s):                                                            *}
{*                                                                            *}
{* ***** END LICENSE BLOCK *****                                              *}

{$I OVC.INC}

{$B-} {Complete Boolean Evaluation}
{$I+} {Input/Output-Checking}
{$P+} {Open Parameters}
{$T-} {Typed @ Operator}
{.W-} {Windows Stack Frame}
{$X+} {Extended Syntax}

{$J+} {Writable constants}


unit ovcbcalc;
  {-base edit field class w/ label and borders}

interface

uses
  {$IFNDEF LCL} Windows, Messages, {$ELSE} LclIntf, LMessages, LclType, MyMisc, {$ENDIF} 
  Buttons, Classes, Controls, ExtCtrls, Forms, Graphics, Menus,
  {$IFDEF VERSION4}{$IFNDEF LCL} MultiMon, {$ENDIF}{$ENDIF}
  StdCtrls, SysUtils, OvcBase, OvcVer, OvcMisc,
  OvcEditF, OvcBordr, OvcEdClc, ovcCalc, ovcEdPop;

const
  BorderMsgClose = WM_USER+10;
  BorderMsgOpen  = WM_USER+11;

type
  TOvcPopupEvent =
    procedure(Sender : TObject) of object;

  TOvcPopupAnchor = (paLeft, paRight);


  TOvcBorderEdPopup = class;

  TOvcNumberEditEx = class(TOvcNumberEdit)
  protected
    BorderParent : TOvcBorderEdPopup;
  end;

  TOvcBorderEdPopup = class(TOvcBorderParent)
  protected {private}
    {new property variables}
    FEdit          : TOvcCustomEdit;
    FButton        : TOvcEdButton;

    FButtonGlyph   : TBitmap;
    FController    : TOvcController;
    FPopupActive   : Boolean;
    FPopupAnchor   : TOvcPopupAnchor;
    FOnPopupClose  : TOvcPopupEvent;
    FOnPopupOpen   : TOvcPopupEvent;
    FShowButton    : Boolean;


  protected
    {property methods}
    function  GetButtonGlyph : TBitmap;

    procedure SetButtonGlyph(Value : TBitmap);
    procedure SetShowButton(Value : Boolean);

    {internal methods}
    function GetButtonWidth : Integer;

{$IFDEF VERSION4}
    procedure CMDialogKey(var Msg : TCMDialogKey);
      message CM_DIALOGKEY;
{$ENDIF}

    procedure CreateParams(var Params : TCreateParams);
      override;
    procedure CreateWnd;
      override;

    function GetButtonEnabled : Boolean;
      dynamic;
    procedure GlyphChanged;
      dynamic;
    procedure Loaded;
      override;

    procedure OnMsgClose(var M : TMessage);
      message BorderMsgClose;
    procedure OnMsgOpen(var M : TMessage);
      message BorderMsgOpen;

  public
    constructor Create(AOwner : TComponent);
      override;
    destructor Destroy;
      override;

    procedure PopupClose(Sender : TObject);
      dynamic;
    procedure PopupOpen;
      dynamic;

    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
      override;

    procedure SetEditControl(EC : TOvcCustomEdit); override;

    property Canvas;

    property PopupActive : Boolean
      read FPopupActive;

    property PopupAnchor : TOvcPopupAnchor
      read FPopupAnchor
      write FPopupAnchor;

  published
    property ButtonGlyph : TBitmap
      read GetButtonGlyph
      write SetButtonGlyph;
  end;


  TOvcBorderedNumberEdit = class(TOvcBorderEdPopup)
  protected
    {base property values}
    FOvcEdit : TOvcNumberEditEx;

    {$IFDEF VERSION4}
{$IFNDEF LCL}
    FBiDiMode      : TBiDiMode;
{$ENDIF}
    FConstraints   : TSizeConstraints;
    FParentBiDiMode: Boolean;
    FDragKind      : TDragKind;
    {$ENDIF}
    FAbout         : string;
{$IFNDEF LCL}
    FAutoSelect    : Boolean;
{$ENDIF}
    FAutoSize      : Boolean;
    FBorderStyle   : TBorderStyle;
    FCharCase      : TEditCharCase;
    FController    : TOvcController;
    FCursor        : TCursor;
    FDragCursor    : TCursor;
    FDragMode      : TDragMode;
    FEnabled       : Boolean;
    FFont          : TFont;
    FHeight        : integer;
{$IFNDEF LCL}
    FHideSelection : Boolean;
    FImeMode       : TImeMode;
{$ENDIF}
    FImeName       : string;
    FMaxLength     : Integer;
{$IFNDEF LCL}
    FOEMConvert    : Boolean;
{$ENDIF}
    FParentFont    : Boolean;
    FParentShowHint: Boolean;
    FPasswordChar  : Char;
    FPopupMenu     : TPopupMenu;
    FReadOnly      : Boolean;
    FShowHint      : Boolean;
    FTabOrder      : TTabOrder;
    FVisible       : Boolean;
    FWidth         : integer;

    {events}
    FOnChange      : TNotifyEvent;
    FOnClick       : TNotifyEvent;
    FOnDblClick    : TNotifyEvent;
    FOnDragDrop    : TDragDropEvent;
    FOnDragOver    : TDragOverEvent;

    FOnEndDrag     : TEndDragEvent;
    FOnEnter       : TNotifyEvent;
    FOnExit        : TNotifyEvent;
    FOnKeyDown     : TKeyEvent;
    FOnKeyPress    : TKeyPressEvent;
    FOnKeyUp       : TKeyEvent;
    FOnMouseDown   : TMouseEvent;
    FOnMouseMove   : TMouseMoveEvent;
    FOnMouseUp     : TMouseEvent;
    FOnStartDrag   : TStartDragEvent;


    FAllowIncDec     : Boolean;
    FCalculator      : TOvcCalculator;

    {internal variables}
    PopupClosing     : Boolean;
    HoldCursor       : TCursor;
    WasAutoScroll    : Boolean;

    {base property methods}
    {$IFDEF VERSION4}
     {$IFNDEF LCL}
    function GetBiDiMode : TBiDiMode;
     {$ENDIF}
    function GetDragKind : TDragKind;
     {$IFNDEF LCL}
    function GetParentBiDiMode : Boolean;
     {$ENDIF}

{$IFNDEF LCL}
    procedure SetBiDiMode(Value : TBiDiMode); override;
{$ENDIF}
    procedure SetDragKind(Value : TDragKind);
{$IFNDEF LCL}
    procedure SetParentBiDiMode(Value : Boolean); override;
{$ENDIF}
    {$ENDIF}

    function GetAbout : string;
{$IFNDEF LCL}
    function GetAutoSelect : Boolean;
{$ENDIF}
    function GetAutoSize : Boolean;
    function GetCharCase : TEditCharCase;
    function GetController : TOvcController;
    function GetCursor : TCursor;
    function GetDragCursor : TCursor;
    function GetDragMode : TDragMode;
    function GetEditEnabled : Boolean;
    function GetFont : TFont;
{$IFNDEF LCL}
    function GetHideSelection : Boolean;
    function GetImeMode : TImeMode;
    function GetImeName : string;
{$ENDIF}
    function GetMaxLength : Integer;
{$IFNDEF LCL}
    function GetOEMConvert : Boolean;
{$ENDIF}
    function GetParentShowHint : Boolean;
    function GetPasswordChar : Char;
    function GetReadOnly : Boolean;
    function GetEditShowButton : Boolean;

    function GetParentFont : Boolean;
    function GetEditParentShowHint : Boolean;

    function GetOnChange   : TNotifyEvent;
    function GetOnClick    : TNotifyEvent;
    function GetOnDblClick : TNotifyEvent;
    function GetOnDragDrop : TDragDropEvent;
    function GetOnDragOver : TDragOverEvent;
    function GetOnEndDrag  : TEndDragEvent;
    function GetOnKeyDown  : TKeyEvent;
    function GetOnKeyPress : TKeyPressEvent;
    function GetOnKeyUp    : TKeyEvent;
    function GetOnMouseDown: TMouseEvent;
    function GetOnMouseMove: TMouseMoveEvent;
    function GetOnMouseUp  : TMouseEvent;

    function  GetOnPopupClose : TOvcPopupEvent;
    function  GetOnPopupOpen : TOvcPopupEvent;
    function  GetPopupAnchor : TOvcPopupAnchor;

    procedure SetAbout(const Value : string);
{$IFNDEF LCL}
    procedure SetAutoSelect(Value : Boolean);
{$ENDIF}
    procedure SetAutoSize(Value : Boolean); {$IFDEF VERSION6}{$IFNDEF LCL} override;{$ENDIF}{$ENDIF}
    procedure SetCharCase(Value : TEditCharCase);
    procedure SetCursor(Value : TCursor);
    procedure SetDragCursor(Value : TCursor);
    procedure SetEditController(Value : TOvcController);
    procedure SetEditDragMode(Value : TDragMode);
    procedure SetEditEnabled(Value : Boolean);
    procedure SetFont(Value : TFont);
{$IFNDEF LCL}
    procedure SetHideSelection(Value : Boolean);
    procedure SetImeMode(Value : TImeMode);
    procedure SetImeName(const Value : string);
{$ENDIF}
    procedure SetMaxLength(Value : Integer);
{$IFNDEF LCL}
    procedure SetOEMConvert(Value : Boolean);
{$ENDIF}
    procedure SetParentShowHint(Value : Boolean);
    procedure SetPasswordChar(Value : Char);
    procedure SetReadOnly(Value : Boolean);
    procedure SetEditShowButton(Value : Boolean);

    procedure SetOnChange(Value : TNotifyEvent);
    procedure SetOnClick(Value : TNotifyEvent);
    procedure SetOnDblClick(Value : TNotifyEvent);
    procedure SetOnDragDrop(Value : TDragDropEvent);
    procedure SetOnDragOver(Value : TDragOverEvent);
    procedure SetOnEndDrag(Value : TEndDragEvent);
    procedure SetOnKeyDown(Value : TKeyEvent);
    procedure SetOnKeyPress(Value : TKeyPressEvent);
    procedure SetOnKeyUp(Value : TKeyEvent);
    procedure SetOnMouseDown(Value : TMouseEvent);
    procedure SetOnMouseMove(Value : TMouseMoveEvent);
    procedure SetOnMouseUp(Value : TMouseEvent);

    procedure SetOnPopupClose(Value : TOvcPopupEvent);
    procedure SetOnPopupOpen(Value : TOvcPopupEvent);
    procedure SetPopupAnchor(Value : TOvcPopupAnchor);


    {property methods}
    function GetAsFloat : Double;
    function GetAsInteger : LongInt;
    function GetAsString : string;
    function GetPopupColors : TOvcCalcColors;
    function GetPopupDecimals : Integer;
    function GetPopupFont : TFont;
    function GetPopupHeight : Integer;
    function GetPopupWidth : Integer;
    procedure SetAsFloat(Value : Double);
    procedure SetAsInteger(Value : LongInt);
    procedure SetAsString(const Value : string);
    procedure SetPopupColors(Value : TOvcCalcColors);
    procedure SetPopupDecimals(Value : Integer);
    procedure SetPopupFont(Value : TFont);
    procedure SetPopupHeight(Value : Integer);
    procedure SetPopupWidth(Value : Integer);

    procedure SetParentFont(Value : Boolean);
    procedure SetEditParentShowHint(Value : Boolean);

  protected
    procedure GlyphChanged;
      override;

  public
    constructor Create(AOwner : TComponent);
      override;

    destructor Destroy; override;

    property AsInteger : LongInt
      read GetAsInteger
      write SetAsInteger;

    property AsFloat : Double
      read GetAsFloat
      write SetAsFloat;

    property AsString : string
      read GetAsString
      write SetAsString;

    property Calculator : TOvcCalculator
      read FCalculator;

    property EditControl : TOvcNumberEditEx
      read FOvcEdit;


  published
    {$IFDEF VERSION4}
    property Anchors;

{$IFNDEF LCL}
    property BiDiMode : TBiDiMode
      read GetBiDiMode
      write SetBiDiMode;
{$ENDIF}

    property Constraints;

{$IFNDEF LCL}
    property ParentBiDiMode : Boolean
      read GetParentBiDiMode
      write SetParentBiDiMode;
{$ENDIF}

    property DragKind : TDragKind
      read GetDragKind
      write SetDragKind;
    {$ENDIF}

    property About : string
      read GetAbout
      write SetAbout;

    property AllowIncDec : Boolean
      read FAllowIncDec
      write FAllowIncDec;

{$IFNDEF LCL}
    property AutoSelect : Boolean
      read GetAutoSelect
      write SetAutoSelect;
{$ENDIF}

    property AutoSize : Boolean
      read GetAutoSize
      write SetAutoSize;

    property CharCase : TEditCharCase
      read GetCharCase
      write SetCharCase;

    property Controller : TOvcController
      read GetController
      write SetEditController;

    property Cursor : TCursor
      read GetCursor
      write SetCursor;

    property DragCursor : TCursor
      read GetDragCursor
      write SetDragCursor;

    {$IFDEF VERSION4}
    property DragMode : TDragMode
      read GetDragMode
      write SetDragMode;
    {$ENDIF}

    property Enabled : Boolean
      read FEnabled
      write FEnabled;

    property Font : TFont
      read GetFont
      write SetFont;

{$IFNDEF LCL}
    property HideSelection : Boolean
      read GetHideSelection
      write SetHideSelection;

    property ImeMode : TImeMode
      read GetImeMode
      write SetImeMode;

    property ImeName;
{$ENDIF}

    property MaxLength : integer
      read GetMaxLength
      write SetMaxLength;

{$IFNDEF LCL}
    property OEMConvert : Boolean
      read GetOEMConvert
      write SetOEMConvert;
{$ENDIF}

    property ParentFont : Boolean
      read GetParentFont
      write SetParentFont;

    property ParentShowHint : Boolean
      read GetParentShowHint
      write SetParentShowHint;

    property PasswordChar : Char
      read GetPasswordChar
      write SetPasswordChar;

    property PopupAnchor : TOvcPopupAnchor
      read GetPopupAnchor
      write SetPopupAnchor;

    property PopupColors : TOvcCalcColors
      read GetPopupColors
      write SetPopupColors;

    property PopupDecimals : Integer
      read GetPopupDecimals
      write SetPopupDecimals;

    property PopupFont : TFont
      read GetPopupFont
      write SetPopupFont;

    property PopupHeight : Integer
      read GetPopupHeight
      write SetPopupHeight;

    property PopupMenu;

    property PopupWidth : Integer
      read GetPopupWidth
      write SetPopupWidth;

    property ReadOnly : Boolean
      read GetReadOnly
      write SetReadOnly;

    property ShowButton : Boolean
      read GetEditShowButton
      write SetEditShowButton;

    property ShowHint;
    property TabOrder;
    property TabStop;
    property Visible;

    {events}
    property OnChange : TNotifyEvent
      read GetOnChange
      write SetOnChange;

    property OnClick : TNotifyEvent
      read GetOnClick
      write SetOnClick;

    property OnDblClick : TNotifyEvent
      read GetOnDblClick
      write SetOnDblClick;

    property OnDragDrop : TDragDropEvent
      read GetOnDragDrop
      write SetOnDragDrop;

    property OnDragOver : TDragOverEvent
      read GetOnDragOver
      write SetOnDragOver;

    property OnEndDrag : TEndDragEvent
      read GetOnEndDrag
      write SetOnEndDrag;

    property OnEnter;
    property OnExit;

    property OnKeyDown : TKeyEvent
      read GetOnKeyDown
      write SetOnKeyDown;

    property OnKeyPress : TKeyPressEvent
      read GetOnKeyPress
      write SetOnKeyPress;

    property OnKeyUp : TKeyEvent
      read GetOnKeyUp
      write SetOnKeyUp;

    property OnMouseDown : TMouseEvent
      read GetOnMouseDown
      write SetOnMouseDown;

    property OnMouseMove : TMouseMoveEvent
      read GetOnMouseMove
      write SetOnMouseMove;

    property OnMouseUp : TMouseEvent
      read GetOnMouseUp
      write SetOnMouseUp;
    property OnStartDrag;

    property OnPopupClose : TOvcPopupEvent
      read GetOnPopupClose
      write SetOnPopupClose;

    property OnPopupOpen : TOvcPopupEvent
      read GetOnPopupOpen
      write SetOnPopupOpen;
  end;


implementation

constructor TOvcBorderEdPopup.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);

  ControlStyle := ControlStyle - [csSetCaption];

  ButtonWidth := ButtonGlyph.Width;
  DoShowButton := FShowButton;
end;


procedure TOvcBorderEdPopup.CreateParams(var Params : TCreateParams);
begin
  inherited CreateParams(Params);

  Params.Style := Params.Style or WS_CLIPCHILDREN;
end;

procedure TOvcBorderEdPopup.CreateWnd;
begin
  inherited CreateWnd;

  {force button placement}
  SetBounds(Left, Top, Width, Height);

  if (Assigned(FButton)) then
    FButton.Enabled := GetButtonEnabled;
end;

destructor TOvcBorderEdPopup.Destroy;
begin
  { Freeing the button glyph throws access violation for some reason }
  { we'll just let it leak for now. }
//  if FButtonGlyph <> nil then
//    FButtonGlyph.Free;
  inherited Destroy;
end;



function TOvcBorderEdPopup.GetButtonEnabled : Boolean;
begin
  Result := not TOvcEdit(FEdit).ReadOnly;
end;


function TOvcBorderEdPopup.GetButtonWidth : Integer;
begin
  if FShowButton then begin
    Result := GetSystemMetrics(SM_CXHSCROLL);
    if Assigned(FButtonGlyph) and not FButtonGlyph.Empty then
      if FButtonGlyph.Width + 4 > Result then
        Result := FButtonGlyph.Width + 4;
  end else
    Result := 0;
end;

function TOvcBorderEdPopup.GetButtonGlyph : TBitmap;
begin
  if not Assigned(FButtonGlyph) then
    FButtonGlyph := TBitmap.Create;

  Result := FButtonGlyph
end;

procedure TOvcBorderEdPopup.GlyphChanged;
begin
end;

procedure TOvcBorderEdPopup.Loaded;
begin
  inherited Loaded;

  if Assigned(FButtonGlyph) then
    FButton.Glyph.Assign(FButtonGlyph);
end;


procedure TOvcBorderEdPopup.OnMsgClose(var M : TMessage);
begin
  if (Assigned(FOnPopupClose)) then
    FOnPopupClose(Self);
end;

procedure TOvcBorderEdPopup.OnMsgOpen(var M : TMessage);
begin
  if (Assigned(FOnPopupOpen)) then
    FOnPopupOpen(Self);
end;


procedure TOvcBorderEdPopup.PopupClose;
begin
  FPopupActive := False;
  PostMessage(Handle, BorderMsgClose, 0, 0);
end;

procedure TOvcBorderEdPopup.PopupOpen;
begin
  FPopupActive := True;
  PostMessage(Handle, BorderMsgOpen, 0, 0);
end;


procedure TOvcBorderEdPopup.SetEditControl(EC : TOvcCustomEdit);
begin
  inherited SetEditControl(EC);
  FEdit := EC;
end;

procedure TOvcBorderEdPopup.SetButtonGlyph(Value : TBitmap);
begin
  if not Assigned(FButtonGlyph) then
    FButtonGlyph := TBitmap.Create;

  if not Assigned(Value) then begin
    FButtonGlyph.Free;
    FButtonGlyph := TBitmap.Create;
  end else
    FButtonGlyph.Assign(Value);

  GlyphChanged;

  FButton.Glyph.Assign(FButtonGlyph);
  SetBounds(Left, Top, Width, Height);
end;

procedure TOvcBorderEdPopup.SetShowButton(Value : Boolean);
begin
  FShowButton := Value;
  {force resize and redisplay of button}
  SetBounds(Left, Top, Width, Height);
end;

{$IFDEF VERSION4}
procedure TOvcBorderEdPopup.CMDialogKey(var Msg : TCMDialogKey);
begin
(*
  if PopupActive then begin
    with Msg do begin
      if ((CharCode = VK_RETURN) or (CHarCode = VK_ESCAPE)) then begin
        PopupClose(Self);
        Result := 1;
      end;
    end;
  end else
    inherited;
*)
end;
{$ENDIF}


procedure TOvcBorderEdPopup.SetBounds(ALeft, ATop, AWidth, AHeight : Integer);
begin
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;


{******************************************************************************}
{                        TOvcBorderedNumberEdit                                }
{******************************************************************************}

constructor TOvcBorderedNumberEdit.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);

  FOvcEdit := TOvcNumberEditEx.Create(Self);
  SetEditControl(TOvcCustomEdit(FOvcEdit));

  FOvcEdit.Ctl3D := False;
  FOvcEdit.BorderStyle := bsNone;
  FOvcEdit.ParentColor := True;
  FOvcEdit.Parent := Self;
  FOvcEdit.Top := 0;
  FOvcEdit.Left := 0;
  FOvcEdit.TabStop := TabStop;
  FOvcEdit.BorderParent := Self;

  DoShowButton := FOvcEdit.ShowButton;
  ButtonWidth := FOvcEdit.ButtonGlyph.Width + 4;

  Height := FEdit.Height;
  Width  := FEdit.Width;
  Borders.BottomBorder.Enabled := True;

  FController    := FOvcEdit.Controller;
  FButton        := FOvcEdit.FButton;
  FButtonGlyph   := FOvcEdit.FButtonGlyph;
  FPopupActive   := FOvcEdit.FPopupActive;
  FOnPopupClose  := FOvcEdit.FOnPopupClose;
  FShowButton    := FOvcEdit.FShowButton;

  {$IFDEF VERSION4}
   {$IFNDEF LCL}
  FBiDiMode      := FOvcEdit.BiDiMode;
   {$ENDIF}
  FDragKind      := FOvcEdit.DragKind;
   {$IFNDEF LCL}
  FParentBiDiMode:= FOvcEdit.ParentBiDiMode;
   {$ENDIF}
  {$ENDIF}
  FAbout         := FOvcEdit.About;
   {$IFNDEF LCL}
  FAutoSelect    := FOvcEdit.AutoSelect;
   {$ENDIF}
  FAutoSize      := FOvcEdit.AutoSize;
  FBorderStyle   := FOvcEdit.BorderStyle;
  FCharCase      := FOvcEdit.CharCase;
  FCursor        := FOvcEdit.Cursor;
  FDragCursor    := FOvcEdit.DragCursor;
  FDragMode      := FOvcEdit.DragMode;
  FEnabled       := True;
  FFont          := FOvcEdit.Font;
   {$IFNDEF LCL}
  FHideSelection := FOvcEdit.HideSelection;
  FImeMode       := FOvcEdit.ImeMode;
  FImeName       := FOvcEdit.ImeName;
   {$ENDIF}
  FMaxLength     := FOvcEdit.MaxLength;
   {$IFNDEF LCL}
  FOEMConvert    := FOvcEdit.OEMConvert;
   {$ENDIF}
  FParentFont    := FOvcEdit.ParentFont;
  FParentShowHint:= FOvcEdit.ParentShowHint;
  FPasswordChar  := FOvcEdit.PasswordChar;
  FPopupMenu     := FOvcEdit.PopupMenu;
  FReadOnly      := FOvcEdit.ReadOnly;
  FShowHint      := FOvcEdit.ShowHint;
  FTabOrder      := FOvcEdit.TabOrder;
  FVisible       := True;

  FOnChange      := FOvcEdit.OnChange;
  FOnClick       := FOvcEdit.OnClick;
  FOnDblClick    := FOvcEdit.OnDblClick;
  FOnDragDrop    := FOvcEdit.OnDragDrop;
  FOnDragOver    := FOvcEdit.OnDragOver;

  FOnEndDrag     := FOvcEdit.OnEndDrag;
  FOnEnter       := FOvcEdit.OnEnter;
  FOnExit        := FOvcEdit.OnExit;
  FOnKeyDown     := FOvcEdit.OnKeyDown;
  FOnKeyPress    := FOvcEdit.OnKeyPress;
  FOnKeyUp       := FOvcEdit.OnKeyUp;
  FOnMouseDown   := FOvcEdit.OnMouseDown;
  FOnMouseMove   := FOvcEdit.OnMouseMove;
  FOnMouseUp     := FOvcEdit.OnMouseUp;
  FOnStartDrag   := FOvcEdit.OnStartDrag;

  {load button glyph}
{$IFNDEF LCL}
  FButtonGlyph.Handle := LoadBaseBitmap('ORBTNCLC');
{$ELSE}
  FButtonGlyph.LoadFromLazarusResource('ORBTNCLC');
{$ENDIF}
  FButton.Glyph.Assign(FButtonGlyph);

  FCalculator := FOvcEdit.Calculator;
end;

destructor TOvcBorderedNumberEdit.Destroy;
begin
  FOvcEdit.Free;
  FOvcEdit := nil;

  inherited Destroy;
end;


function TOvcBorderedNumberEdit.GetAsFloat : Double;
var
  I : Integer;
  S : string;
begin
  S := Text;
  for I := Length(S) downto 1 do
    if not (S[I] in ['0'..'9', '+', '-', DecimalSeparator]) then
      Delete(S, I, 1);
  Result := StrToFloat(S);
end;

function TOvcBorderedNumberEdit.GetAsInteger : LongInt;
begin
  Result := Round(GetAsFloat);
end;

function TOvcBorderedNumberEdit.GetAsString : string;
begin
  Result := Text;
end;

function TOvcBorderedNumberEdit.GetPopupColors : TOvcCalcColors;
begin
  Result := FCalculator.Colors;
end;

function TOvcBorderedNumberEdit.GetPopupDecimals : Integer;
begin
  Result := FCalculator.Decimals;
end;

function TOvcBorderedNumberEdit.GetPopupFont : TFont;
begin
  Result := FCalculator.Font;
end;

function TOvcBorderedNumberEdit.GetPopupHeight : Integer;
begin
  Result := FCalculator.Height;
end;

function TOvcBorderedNumberEdit.GetPopupWidth : Integer;
begin
  Result := FCalculator.Width;
end;

function TOvcBorderedNumberEdit.GetReadOnly : Boolean;
begin
  Result := FOvcEdit.ReadOnly;
  FReadOnly := Result;
end;

function TOvcBorderedNumberEdit.GetParentFont : Boolean;
begin
  Result := FOvcEdit.ParentFont;
  FParentFont := Result;
end;

function TOvcBorderedNumberEdit.GetEditParentShowHint : Boolean;
begin
  Result := FOvcEdit.ParentShowHint;
  FParentShowHint := Result;
end;


procedure TOvcBorderedNumberEdit.GlyphChanged;
begin
  inherited GlyphChanged;

  if FButtonGlyph.Empty then
{$IFNDEF LCL}
    FButtonGlyph.Handle := LoadBaseBitmap('ORBTNCLC');
{$ELSE}
    FButtonGlyph.LoadFromLazarusResource('ORBTNCLC');
{$ENDIF}
end;


procedure TOvcBorderedNumberEdit.SetAsFloat(Value : Double);
begin
  Text := FloatToStr(Value);
end;

procedure TOvcBorderedNumberEdit.SetAsInteger(Value : LongInt);
begin
  Text := IntToStr(Value);
end;

procedure TOvcBorderedNumberEdit.SetAsString(const Value : string);
begin
  Text := Value;
end;

procedure TOvcBorderedNumberEdit.SetPopupColors(Value : TOvcCalcColors);
begin
  FCalculator.Colors := Value;
end;

procedure TOvcBorderedNumberEdit.SetPopupDecimals(Value : Integer);
begin
  FCalculator.Decimals := Value;
end;

procedure TOvcBorderedNumberEdit.SetPopupFont(Value : TFont);
begin
  if Assigned(Value) then
    FCalculator.Font.Assign(Value);
end;

procedure TOvcBorderedNumberEdit.SetPopupHeight(Value : Integer);
begin
  FCalculator.Height := Value;
end;

procedure TOvcBorderedNumberEdit.SetPopupWidth(Value : Integer);
begin
  FCalculator.Width := Value;
end;

procedure TOvcBorderedNumberEdit.SetReadOnly(Value : Boolean);
begin
  FReadOnly := Value;
  FOvcEdit.ReadOnly := Value;
end;

procedure TOvcBorderedNumberEdit.SetParentFont(Value : Boolean);
begin
  FParentFont := Value;
  FOvcEdit.ParentFont := Value;
end;

procedure TOvcBorderedNumberEdit.SetEditParentShowHint(Value : Boolean);
begin
  FOvcEdit.ParentShowHint := Value;
  FParentShowHint := Value;
end;


function  TOvcBorderedNumberEdit.GetOnPopupClose : TOvcPopupEvent;
begin
  Result := FOvcEdit.OnPopupClose;
  FOnPopupClose := Result;
end;

function  TOvcBorderedNumberEdit.GetOnPopupOpen : TOvcPopupEvent;
begin
  Result := FOvcEdit.OnPopupOpen;
  FOnPopupOpen := Result;
end;

function  TOvcBorderedNumberEdit.GetPopupAnchor : TOvcPopupAnchor;
begin
  Result := FOvcEdit.BorderParent.PopupAnchor;
  FPopupAnchor := Result;
end;

function  TOvcBorderedNumberEdit.GetEditShowButton : Boolean;
begin
  Result := FOvcEdit.ShowButton;
  FShowButton := Result;
end;


procedure TOvcBorderedNumberEdit.SetOnPopupClose(Value : TOvcPopupEvent);
begin
  FOvcEdit.OnPopupClose := Value;
  FOnPopupClose := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnPopupOpen(Value : TOvcPopupEvent);
begin
  FOvcEdit.OnPopupOpen := Value;
  FOnPopupOpen := Value;
end;

procedure TOvcBorderedNumberEdit.SetPopupAnchor(Value : TOvcPopupAnchor);
begin
  FOvcEdit.BorderParent.PopupAnchor := Value;
  FPopupAnchor := Value;
end;

procedure TOvcBorderedNumberEdit.SetEditShowButton(Value : Boolean);
begin
  FOvcEdit.ShowButton := Value;
  FShowButton := Value;
end;


{base property methods}
{$IFDEF VERSION4}
 {$IFNDEF LCL}
function TOvcBorderedNumberEdit.GetBiDiMode : TBiDiMode;
begin
  Result := FOvcEdit.BiDiMode;
  FBiDiMode := Result;
end;
 {$ENDIF}

function TOvcBorderedNumberEdit.GetDragKind : TDragKind;
begin
  Result := FOvcEdit.DragKind;
  FDragKind := Result;
end;

(*
function TOvcBorderedNumberEdit.GetEditConstraints : TSizeConstraints;
begin
  Result := FOvcEdit.Constraints;
  FConstraints := Result;
end;
*)

{$IFNDEF LCL}
function TOvcBorderedNumberEdit.GetParentBiDiMode : Boolean;
begin
  Result := FOvcEdit.ParentBiDiMode;
  FParentBiDiMode := Result;
end;

procedure TOvcBorderedNumberEdit.SetBiDiMode(Value : TBiDiMode);
begin
  if (Value <> FBiDiMode) then begin
    inherited;
    FBiDiMode := Value;
    FOvcEdit.BiDiMode := Value;
  end;
end;
{$ENDIF}

(*
procedure TOvcBorderedNumberEdit.SetEditConstraints(Value : TSizeConstraints);
begin
  FConstraints := Value;
  FOvcEdit.Constraints := Value;
end;
*)

{$IFNDEF LCL}
procedure TOvcBorderedNumberEdit.SetParentBiDiMode(Value : Boolean);
begin
  if (Value <> FParentBiDiMode) then begin
    inherited;
    FParentBiDiMode := Value;
    FOvcEdit.ParentBiDiMode := Value;
  end;
end;
{$ENDIF}

procedure TOvcBorderedNumberEdit.SetDragKind(Value : TDragKind);
begin
  if (Value <> FDragKind) then begin
    FDragKind := Value;
    FOvcEdit.DragKind := Value;
  end;
end;
{$ENDIF}


function TOvcBorderedNumberEdit.GetAbout : string;
begin
  Result := OrVersionStr;
end;

{$IFNDEF LCL}
function TOvcBorderedNumberEdit.GetAutoSelect : Boolean;
begin
  Result := FOvcEdit.AutoSelect;
  FAutoSelect := FOvcEdit.AutoSelect;
end;
{$ENDIF}

function TOvcBorderedNumberEdit.GetAutoSize : Boolean;
begin
  Result := FOvcEdit.AutoSize;
  FAutoSize := FOvcEdit.AutoSize;
end;

function TOvcBorderedNumberEdit.GetCharCase : TEditCharCase;
begin
  Result := FOvcEdit.CharCase;
  FCharCase := Result;
end;

function TOvcBorderedNumberEdit.GetController : TOvcController;
begin
  Result := FOvcEdit.Controller;
  FController := Result;
end;

function TOvcBorderedNumberEdit.GetCursor : TCursor;
begin
  Result := FOvcEdit.Cursor;
  FCursor := Result;
end;


function TOvcBorderedNumberEdit.GetDragCursor : TCursor;
begin
  Result := FOvcEdit.DragCursor;
  FDragCursor := Result;
end;


function TOvcBorderedNumberEdit.GetDragMode : TDragMode;
begin
  Result := FOvcEdit.DragMode;
  FDragMode := Result;
end;


function TOvcBorderedNumberEdit.GetEditEnabled : Boolean;
begin
  Result := FOvcEdit.Enabled;
  FEnabled := FOvcEdit.Enabled;
end;

function TOvcBorderedNumberEdit.GetFont : TFont;
begin
  Result := FOvcEdit.Font;
  FFont  := Result;
end;

{$IFNDEF LCL}
function TOvcBorderedNumberEdit.GetHideSelection : Boolean;
begin
  Result := FOvcEdit.HideSelection;
  FHideSelection := Result;
end;

function TOvcBorderedNumberEdit.GetImeMode : TImeMode;
begin
  Result := FOvcEdit.ImeMode;
  FImeMode := Result;
end;

function TOvcBorderedNumberEdit.GetImeName : string;
begin
  Result := FOvcEdit.ImeName;
  FImeName := Result;
end;
{$ENDIF}

function TOvcBorderedNumberEdit.GetMaxLength : Integer;
begin
  Result := FOvcEdit.MaxLength;
  FMaxLength := Result;
end;

{$IFNDEF LCL}
function TOvcBorderedNumberEdit.GetOEMConvert : Boolean;
begin
  Result := FOvcEdit.OEMConvert;
  FOEMConvert := Result;
end;
{$ENDIF}

function TOvcBorderedNumberEdit.GetParentShowHint : Boolean;
begin
  Result := FOvcEdit.ParentShowHint;
  FParentShowHint := Result;
end;

function TOvcBorderedNumberEdit.GetPasswordChar : Char;
begin
  Result := FOvcEdit.PasswordChar;
  FPasswordChar := Result;
end;

function TOvcBorderedNumberEdit.GetOnChange : TNotifyEvent;
begin
  Result := FOvcEdit.OnChange;
  FOnChange := Result;
end;

function TOvcBorderedNumberEdit.GetOnClick : TNotifyEvent;
begin
  Result := FOvcEdit.OnClick;
  FOnClick := Result;
end;

function TOvcBorderedNumberEdit.GetOnDblClick : TNotifyEvent;
begin
  Result := FOvcEdit.OnDblClick;
  FOnDblClick := Result;
end;

function TOvcBorderedNumberEdit.GetOnDragDrop : TDragDropEvent;
begin
  Result := FOvcEdit.OnDragDrop;
  FOnDragDrop := Result;
end;

function TOvcBorderedNumberEdit.GetOnDragOver : TDragOverEvent;
begin
  Result := FOvcEdit.OnDragOver;
  FOnDragOver := Result;
end;

function TOvcBorderedNumberEdit.GetOnEndDrag : TEndDragEvent;
begin
  Result := FOvcEdit.OnEndDrag;
  FOnEndDrag := Result;
end;

function TOvcBorderedNumberEdit.GetOnKeyDown : TKeyEvent;
begin
  Result := FOvcEdit.OnKeyDown;
  FOnKeyDown := Result;
end;

function TOvcBorderedNumberEdit.GetOnKeyPress : TKeyPressEvent;
begin
  Result := FOvcEdit.OnKeyPress;
  FOnKeyPress := Result;
end;

function TOvcBorderedNumberEdit.GetOnKeyUp : TKeyEvent;
begin
  Result := FOvcEdit.OnKeyUp;
  FOnKeyUp := Result;
end;

function TOvcBorderedNumberEdit.GetOnMouseDown : TMouseEvent;
begin
  Result := FOvcEdit.OnMouseDown;
  FOnMouseDown := Result;
end;

function TOvcBorderedNumberEdit.GetOnMouseMove : TMouseMoveEvent;
begin
  Result := FOvcEdit.OnMouseMove;
  FOnMouseMove := Result;
end;

function TOvcBorderedNumberEdit.GetOnMouseUp : TMouseEvent;
begin
  Result := FOvcEdit.OnMouseUp;
  FOnMouseUp := Result;
end;



procedure TOvcBorderedNumberEdit.SetAbout(const Value : string);
begin
end;


{$IFNDEF LCL}
procedure TOvcBorderedNumberEdit.SetAutoSelect(Value : Boolean);
begin
  if (Value <> FAutoSelect) then begin
    FAutoSelect := Value;
    FOvcEdit.AutoSelect := Value;
  end;
end;
{$ENDIF}


procedure TOvcBorderedNumberEdit.SetAutoSize(Value : Boolean);
begin
  FAutoSize := Value;
  FOvcEdit.AutoSize := Value;
end;


procedure TOvcBorderedNumberEdit.SetCharCase(Value : TEditCharCase);
begin
  FCharCase := Value;
  FOvcEdit.CharCase := Value;
end;

procedure TOvcBorderedNumberEdit.SetEditController(Value : TOvcController);
begin
  FController := Value;
  FOvcEdit.Controller := Value;
end;

procedure TOvcBorderedNumberEdit.SetCursor(Value : TCursor);
begin
  FCursor := Value;
  FOvcEdit.Cursor := Value;
end;


procedure TOvcBorderedNumberEdit.SetDragCursor(Value : TCursor);
begin
  if (Value <> FDragCursor) then begin
    FDragCursor := Value;
    FOvcEdit.DragCursor := Value;
  end;
end;


procedure TOvcBorderedNumberEdit.SetEditDragMode(Value : TDragMode);
begin
  if (Value <> FDragMode) then begin
    FDragMode := Value;
    FOvcEdit.DragMode := Value;
  end;
end;

procedure TOvcBorderedNumberEdit.SetEditEnabled(Value : Boolean);
begin
  if (Value <> FEnabled) then begin
    FEnabled := Value;
    Enabled  := Value;
    FOvcEdit.Enabled := Value;
  end;
end;

procedure TOvcBorderedNumberEdit.SetFont(Value : TFont);
begin
  if (Value <> FFont) then begin
    FFont := Value;
    FOvcEdit.Font := Value;
  end;
end;

{$IFNDEF LCL}
procedure TOvcBorderedNumberEdit.SetHideSelection(Value : Boolean);
begin
  if (Value <> FHideSelection) then begin
    FHideSelection := Value;
    FOvcEdit.HideSelection := Value;
  end;
end;

procedure TOvcBorderedNumberEdit.SetImeMode(Value : TImeMode);
begin
  if (Value <> FImeMode) then begin
    FImeMode := Value;
    FOvcEdit.ImeMode := Value;
  end;
end;

procedure TOvcBorderedNumberEdit.SetImeName(const Value : string);
begin
  if (Value <> FImeName) then begin
    FImeName := Value;
    FOvcEdit.ImeName := Value;
  end;
end;
{$ENDIF}

procedure TOvcBorderedNumberEdit.SetMaxLength(Value : Integer);
begin
  if (Value <> FMaxLength) then begin
    FMaxLength := Value;
    FOvcEdit.MaxLength := Value;
  end;
end;

{$IFNDEF LCL}
procedure TOvcBorderedNumberEdit.SetOEMConvert(Value : Boolean);
begin
  if (Value <> FOEMConvert) then begin
    FOEMConvert := Value;
    FOvcEdit.OEMConvert := Value;
  end;
end;
{$ENDIF}

procedure TOvcBorderedNumberEdit.SetParentShowHint(Value : Boolean);
begin
  if (Value <> FParentShowHint) then begin
    FParentShowHint := Value;
    FOvcEdit.ParentShowHint := Value;
  end;
end;

procedure TOvcBorderedNumberEdit.SetPasswordChar(Value : Char);
begin
  if (Value <> FPasswordChar) then begin
    FPasswordChar := Value;
    FOvcEdit.PasswordChar := Value;
  end;
end;

procedure TOvcBorderedNumberEdit.SetOnChange(Value : TNotifyEvent);
begin
  FOnChange := Value;
  FOvcEdit.OnChange := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnClick(Value : TNotifyEvent);
begin
  FOnClick := Value;
  FOvcEdit.OnClick := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnDblClick(Value : TNotifyEvent);
begin
  FOnDblClick := Value;
  FOvcEdit.OnDblClick := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnDragDrop(Value : TDragDropEvent);
begin
  FOnDragDrop := Value;
  FOvcEdit.OnDragDrop := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnDragOver(Value : TDragOverEvent);
begin
  FOnDragOver := Value;
  FOvcEdit.OnDragOver := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnEndDrag(Value : TEndDragEvent);
begin
  FOnEndDrag := Value;
  FOvcEdit.OnEndDrag := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnKeyDown(Value : TKeyEvent);
begin
  FOnKeyDown := Value;
  FOvcEdit.OnKeyDown := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnKeyPress(Value : TKeyPressEvent);
begin
  FOnKeyPress := Value;
  FOvcEdit.OnKeyPress := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnKeyUp(Value : TKeyEvent);
begin
  FOnKeyUp := Value;
  FOvcEdit.OnKeyUp := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnMouseDown(Value : TMouseEvent);
begin
  FOnMouseDown := Value;
  FOvcEdit.OnMouseDown := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnMouseMove(Value : TMouseMoveEvent);
begin
  FOnMouseMove := Value;
  FOvcEdit.OnMouseMove := Value;
end;

procedure TOvcBorderedNumberEdit.SetOnMouseUp(Value : TMouseEvent);
begin
  FOnMouseUp := Value;
  FOvcEdit.OnMouseUp := Value;
end;

end.