{******************************************************************************} { } { Tulip - User Interface Library } { } { Copyright(c) 2012 - 2013 Marcos Gomes. All rights Reserved. } { } { -------------------------------------------------------------------------- } { } { This product is based on Asphyre Sphinx (c) 2000 - 2012 Yuriy Kotsarenko. } { All rights reserved. Official web site: http://www.afterwarp.net } { } {******************************************************************************} { } { Important Notice: } { } { If you modify/use this code or one of its parts either in original or } { modified form, you must comply with Mozilla Public License Version 2.0, } { including section 3, "Responsibilities". Failure to do so will result in } { the license breach, which will be resolved in the court. Remember that } { violating author's rights either accidentally or intentionally is } { considered a serious crime in many countries. Thank you! } { } { !! Please *read* Mozilla Public License 2.0 document located at: } { http://www.mozilla.org/MPL/ } { } { -------------------------------------------------------------------------- } { } { The contents of this file are subject to the Mozilla Public License } { Version 2.0 (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 Tulip.UI.Forms.pas. } { } { The Initial Developer of the Original Code is Marcos Gomes. } { Portions created by Marcos Gomes are Copyright (C) 2012, Marcos Gomes. } { All Rights Reserved. } { } {******************************************************************************} { } { Tulip.UI.Forms.pas Modified: 23-Mar-2013 } { -------------------------------------------------------------------------- } { } { Base Implementations for Form Controls } { } { Version 1.03 } { } {******************************************************************************} unit Tulip.UI.Forms; interface uses System.SysUtils, System.Types, System.Classes, // Aspryre units AsphyreTypes, AbstractCanvas, AsphyreFonts, AsphyreImages, AsphyreUtils, Vectors2, // Tulip UI units Tulip.UI.Types, Tulip.UI.Classes, Tulip.UI.Controls, Tulip.UI.Utils, Tulip.UI.Helpers; type {$REGION 'TCustomAForm'} TCustomAForm = class(TWControl) private FAntialiased: Boolean; FBorder: TBorder; FBoundToScreen: Boolean; FCanMove: Boolean; FCaption: String; FColor: TFillColor; FFont: TFormatedFont; FImage: TImage; FIsMoving: Boolean; FMargin: Word; FModal: Boolean; FShadow: Boolean; FWordWrap: Boolean; procedure SetAntialiased(Value: Boolean); procedure SetBorder(Value: TBorder); procedure SetCaption(Value: String); procedure SetColor(Color: TFillColor); procedure SetImage(Value: TImage); procedure SetMargin(Value: Word); procedure SetCanMove(Value: Boolean); procedure SetShadow(Value: Boolean); procedure SetFont(Value: TFormatedFont); procedure SetWordWrap(Value: Boolean); protected procedure AssignTo(Dest: TPersistent); override; procedure Paint; override; procedure SetLeft(Value: Integer); override; procedure SetHeight(Value: Integer); override; procedure SetTop(Value: Integer); override; procedure SetWidth(Value: Integer); override; public procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function IsModal: Boolean; procedure Close; procedure Show(Modal: Boolean = False); property Antialiased: Boolean read FAntialiased write SetAntialiased; property Border: TBorder read FBorder write SetBorder; property BoundToScreen: Boolean read FBoundToScreen write FBoundToScreen; property Caption: String read FCaption write SetCaption; property CanMove: Boolean read FCanMove write SetCanMove; property Color: TFillColor read FColor write SetColor; property Font: TFormatedFont read FFont write SetFont; property Image: TImage read FImage write SetImage; property IsMoving: Boolean read FIsMoving write FIsMoving; property Margin: Word read FMargin write SetMargin; property Shadow: Boolean read FShadow write SetShadow; property WordWrap: Boolean read FWordWrap write SetWordWrap; end; {$ENDREGION} implementation // ---------------------------------------------------------------------------- var XOffSet, YOffSet: Integer; {$REGION 'TCustomAForm'} { TCustomAForm } procedure TCustomAForm.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) and (FCanMove) then begin XOffSet := X - Left; YOffSet := Y - Top; FIsMoving := True; end; inherited MouseDown(Button, Shift, X, Y); end; procedure TCustomAForm.MouseMove(Shift: TShiftState; X, Y: Integer); begin if FIsMoving = True then begin Left := X - XOffSet; Top := Y - YOffSet; end; inherited MouseMove(Shift, X, Y); end; procedure TCustomAForm.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (Button = mbLeft) and (FIsMoving) then FIsMoving := False; inherited MouseUp(Button, Shift, X, Y); end; procedure TCustomAForm.AssignTo(Dest: TPersistent); begin ControlState := ControlState + [csReadingState]; inherited AssignTo(Dest); if Dest is TCustomAForm then with TCustomAForm(Dest) do begin Antialiased := Self.Antialiased; Border := Self.Border; BoundToScreen := Self.BoundToScreen; Caption := Self.Caption; Color := Self.Color; Font := Self.Font; Image := Self.Image; CanMove := Self.CanMove; Margin := Self.Margin; Shadow := Self.Shadow; WordWrap := Self.WordWrap; end; ControlState := ControlState - [csReadingState]; end; procedure TCustomAForm.Close; begin FModal := False; Visible := False; end; constructor TCustomAForm.Create(AOwner: TComponent); var Num: Integer; begin ControlState := ControlState + [csCreating]; inherited Create(AOwner); if (AOwner <> nil) and (AOwner <> Self) and (AOwner is TWControl) then begin // Auto generate name Num := 1; while TWControl(AOwner).FindChildControl('Form' + IntToStr(Num), True) <> nil do Inc(Num); Name := 'Form' + IntToStr(Num); end; // fields FAntialiased := True; FBorder := TBorder.Create; FBorder.Color := $80000000; FBoundToScreen := False; FCanMove := True; FCaption := ''; FColor := TFillColor.Create($FFA6CAF0, $FFA6CAF0, $FF4090F0, $FF4090F0); FFont := TFormatedFont.Create; FImage := TImage.Create; FIsMoving := False; FMargin := 3; FModal := False; FShadow := True; FWordWrap := True; // properties Left := 0; Top := 0; Width := 320; Height := 240; ControlState := ControlState - [csCreating]; end; destructor TCustomAForm.Destroy; begin FBorder.Free; FColor.Free; FFont.Free; FImage.Free; inherited Destroy; end; function TCustomAForm.IsModal: Boolean; begin Result := FModal; end; procedure TCustomAForm.Paint; var X, Y: Integer; AFont: TAsphyreFont; AImage: TAsphyreImage; bTop, bBottom: TConstraintSize; I: Integer; ARect: TRect; AHeight, AWidth: Integer; vLeft, vTop: Integer; begin // Get size Canvas ARect := ControlManager.Canvas.ClipRect; // Set initial values X := ClientLeft; Y := ClientTop; ControlManager.Canvas.Antialias := FAntialiased; if FShadow then begin // Draw Shadow I := 12; while I > 5 do begin ControlManager.Canvas.FillRect(Rect(X - I, Y - I, X + Width + I, Y + Height + I), cAlpha4(1), beShadow); Dec(I, 2); end; I := 5; while I > 3 do begin ControlManager.Canvas.FillRect(Rect(X - I, Y - I, X + Width + I, Y + Height + I), cAlpha4(2), beShadow); Dec(I, 1); end; I := 3; while I > 0 do begin ControlManager.Canvas.FillRect(Rect(X - I, Y - I, X + Width + I, Y + Height + I), cAlpha4(4), beShadow); Dec(I, 1); end; end; // Draw Background AImage := ControlManager.Images.Image[FImage.Image]; if AImage <> nil then begin ControlManager.Canvas.UseImagePx(AImage, pRect4(FImage.Rect)); ControlManager.Canvas.TexMap(pRect4(Rect(X, Y, X + Width, Y + Height)), cAlpha4(FColor), beNormal); end else begin ControlManager.Canvas.FillRect(Rect(X, Y, X + Width, Y + Height), cColor4(FColor), beNormal); end; // Draw Border if Border.Size > 0 then begin bTop := 0; bBottom := 0; if eTop in Border.Edges then begin ControlManager.Canvas.FillRect(Rect(X, Y, X + Width, Y + Border.Size), Border.Color, beNormal); bTop := Border.Size; end; if eBottom in Border.Edges then begin ControlManager.Canvas.FillRect(Rect(X, Y + Height - Border.Size, X + Width, Y + Height), Border.Color, beNormal); bBottom := Border.Size; end; if eLeft in Border.Edges then ControlManager.Canvas.FillRect(Rect(X, Y + bTop, X + Border.Size, Y + Height - bBottom), Border.Color, beNormal); if eRight in Border.Edges then ControlManager.Canvas.FillRect(Rect(X + Width - Border.Size, Y + bTop, X + Width, Y + Height - bBottom), Border.Color, beNormal); end; // Draw DisplayText AFont := ControlManager.Fonts.Font[FFont.Name]; if (AFont <> nil) and (FCaption <> '') then begin if WordWrap then begin AFont.TextRectEx(Point2(X + Border.Size + Margin, Y + Border.Size + Margin + 1), Point2(Width - (Border.Size * 2) - (Margin * 2), Height - (Border.Size * 2) - (Margin * 2)), FCaption, cColor2(FFont.Color), 1.0, FFont.HorizontalAlign, FFont.VerticalAlign, FFont.ParagraphLine); end else begin // Set Bounds X := ClientLeft + Margin + Border.Size; Y := ClientTop + Margin + Border.Size; AWidth := Width - Margin * 2 - Border.Size * 2; AHeight := Height - Margin * 2 - Border.Size * 2; // Set Rect Canvas ControlManager.Canvas.ClipRect := ShortRect(Rect(X - 1, Y, X + AWidth, Y + AHeight), ARect); case Self.FFont.VerticalAlign of aTop: vTop := Y; aMiddle: vTop := Y + (AHeight div 2) - (AFont.TexHeight(FCaption) div 2); aBottom: vTop := Y + AHeight - AFont.TexHeight(FCaption); else vTop := X; end; case FFont.HorizontalAlign of aLeft, aJustify: vLeft := X; aCenter: vLeft := X + (AWidth div 2) - Round(AFont.TextWidth(FCaption) / 2); aRight: vLeft := X + AWidth - Round(AFont.TextWidth(FCaption)); else vLeft := X; end; AFont.TextOut(Point2(vLeft, vTop),FCaption, cColor2(FFont.Color), 1.0); // Restore Rect Canvas ControlManager.Canvas.ClipRect := ARect; end; end; inherited Paint; end; procedure TCustomAForm.SetAntialiased(Value: Boolean); begin FAntialiased := Value; end; procedure TCustomAForm.SetBorder(Value: TBorder); begin if Value <> nil then FBorder.Assign(Value); end; procedure TCustomAForm.SetCanMove(Value: Boolean); begin FCanMove := Value; end; procedure TCustomAForm.SetCaption(Value: String); begin FCaption := Value; end; procedure TCustomAForm.SetColor(Color: TFillColor); begin if Color <> nil then FColor.Assign(Color); end; procedure TCustomAForm.SetHeight(Value: Integer); begin if (FBoundToScreen) then begin if Value < 0 then begin Value := 0; end; if Top + Value > Parent.Height then begin Value := Parent.Height - Top; end; end; inherited SetHeight(Value); end; procedure TCustomAForm.SetFont(Value: TFormatedFont); begin if Value <> nil then FFont.Assign(Value); end; procedure TCustomAForm.SetTop(Value: Integer); begin if (FBoundToScreen) then begin if Value < 0 then begin Value := 0; end; if Value + Height > Parent.Height then begin Value := Parent.Height - Height; end; end; inherited SetTop(Value); end; procedure TCustomAForm.SetWidth(Value: Integer); begin if (FBoundToScreen) then begin if Value < 0 then begin Value := 0; end; if Left + Value > Parent.Width then begin Value := Parent.Width - Left; end; end; inherited SetWidth(Value); end; procedure TCustomAForm.SetWordWrap(Value: Boolean); begin FWordWrap := Value; end; procedure TCustomAForm.SetImage(Value: TImage); begin if Value <> nil then FImage.Assign(Value); end; procedure TCustomAForm.SetLeft(Value: Integer); begin if (FBoundToScreen) then begin if Value < 0 then begin Value := 0; end; if Value + Width > Parent.Width then begin Value := Parent.Width - Width; end; end; inherited SetLeft(Value); end; procedure TCustomAForm.SetMargin(Value: Word); begin if FMargin <> Value then FMargin := Value; end; procedure TCustomAForm.SetShadow(Value: Boolean); begin FShadow := Value; end; procedure TCustomAForm.Show(Modal: Boolean = False); begin FModal := Modal; Visible := True; BringToFront; SetFocus; SelectFirst; end; {$ENDREGION} end.