lazarus/components/lazreport/source/lr_desgn.pas
jesus e24d5e256c LazReport: Patch from Alexey Lagunov, issue #26855
1. Fix AV on TlrButtonPanel
 2. Implement highlight find text in preview report window
 3. Fix loading TlrCrossView from stream
 4. Fixed speed save changes to the data in the report (after double click on preview report window)

git-svn-id: trunk@46761 -
2014-11-05 17:48:14 +00:00

8116 lines
206 KiB
ObjectPascal

{*****************************************}
{ }
{ FastReport v2.3 }
{ Report Designer }
{ }
{ Copyright (c) 1998-99 by Tzyganenko A. }
{ }
{*****************************************}
unit LR_Desgn;
interface
{$I lr_vers.inc}
{.$Define ExtOI} // External Custom Object inspector (Christian)
{.$Define StdOI} // External Standard Object inspector (Jesus)
{$define sbod} // status bar owner draw
{$define ppaint}
uses
Classes, SysUtils, FileUtil, LResources, LMessages,
Forms, Controls, Graphics, Dialogs,ComCtrls,
ExtCtrls, Buttons, StdCtrls,Menus,
LCLType,LCLIntf,LCLProc,GraphType,Printers, ActnList,
ObjectInspector, PropEdits,TypInfo,
LR_Class, LR_Color,LR_Edit;
const
MaxUndoBuffer = 100;
crPencil = 11;
dtFastReportForm = 1;
dtFastReportTemplate = 2;
dtLazReportForm = 3;
dtLazReportTemplate = 4;
type
TLoadReportEvent = procedure(Report: TfrReport; var ReportName: String) of object;
TSaveReportEvent = procedure(Report: TfrReport; var ReportName: String;
SaveAs: Boolean; var Saved: Boolean) of object;
TfrDesignerForm = class;
{ TfrDesigner }
TfrDesigner = class(TComponent) // fake component
private
FOnLoadReport: TLoadReportEvent;
FOnSaveReport: TSaveReportEvent;
FTemplDir: String;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Loaded; override;
published
property TemplateDir: String read FTemplDir write FTemplDir;
property OnLoadReport: TLoadReportEvent read FOnLoadReport write FOnLoadReport;
property OnSaveReport: TSaveReportEvent read FOnSaveReport write FOnSaveReport;
end;
TfrSelectionType = (ssBand, ssMemo, ssOther, ssMultiple, ssClipboardFull);
TfrSelectionStatus = set of TfrSelectionType;
TfrReportUnits = (ruPixels, ruMM, ruInches);
TfrShapeMode = (smFrame, smAll);
TfrUndoAction = (acInsert, acDelete, acEdit, acZOrder, acDuplication);
PfrUndoObj = ^TfrUndoObj;
TfrUndoObj = record
Next: PfrUndoObj;
ObjID: Integer;
ObjPtr: TfrView;
Int: Integer;
end;
TfrUndoRec = record
Action: TfrUndoAction;
Page: Integer;
Objects: PfrUndoObj;
end;
PfrUndoRec1 = ^TfrUndoRec1;
TfrUndoRec1 = record
ObjPtr: TfrView;
Int: Integer;
end;
PfrUndoBuffer = ^TfrUndoBuffer;
TfrUndoBuffer = Array[0..MaxUndoBuffer - 1] of TfrUndoRec;
TfrMenuItemInfo = class(TObject)
private
MenuItem: TMenuItem;
Btn : TSpeedButton;
end;
TfrDesignerDrawMode = (dmAll, dmSelection, dmShape);
TfrCursorType = (ctNone, ct1, ct2, ct3, ct4, ct5, ct6, ct7, ct8);
TfrDesignMode = (mdInsert, mdSelect);
TfrSplitInfo = record
SplRect: TRect;
SplX : Integer;
View1,
View2 : TfrView;
end;
TViewAction = procedure(View: TFrView; Data:PtrInt) of object;
{ TfrObjectInspector }
TfrObjectInspector = Class({$IFDEF EXTOI}TForm{$ELSE}TPanel{$ENDIF})
private
FSelectedObject: TObject;
fPropertyGrid : TCustomPropertiesGrid;
{$IFNDEF EXTOI}
fcboxObjList : TComboBox;
fBtn,fBtn2 : TButton;
fPanelHeader : TPanel;
fLastHeight : Word;
fDown : Boolean;
fPt : TPoint;
procedure BtnClick(Sender : TObject);
procedure HeaderMDown(Sender: TOBject; Button: TMouseButton;
{%H-}Shift: TShiftState; X, Y: Integer);
procedure HeaderMMove(Sender: TObject; {%H-}Shift: TShiftState; {%H-}X,
{%H-}Y: Integer);
procedure HeaderMUp(Sender: TOBject; {%H-}Button: TMouseButton;
{%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
{$ENDIF}
protected
procedure CMVisibleChanged(var TheMessage: TLMessage); message CM_VISIBLECHANGED;
{$IFDEF EXTOI}
procedure DoHide; override;
{$ENDIF}
public
constructor Create(aOwner : TComponent); override;
destructor Destroy; override;
procedure Select(Obj: TObject);
procedure cboxObjListOnChanged(Sender: TObject);
procedure SetModifiedEvent(AEvent: TNotifyEvent);
procedure Refresh;
property SelectedObject:TObject read FSelectedObject;
end;
TPaintSel = class;
{ TfrDesignerPage }
TfrDesignerPage = class(TCustomControl)
private
Down, // mouse button was pressed
Moved, // mouse was moved (with pressed btn)
DFlag, // was double click
RFlag: Boolean; // selecting objects by framing
Mode : TfrDesignMode; // current mode
CT : TfrCursorType; // cursor type
LastX, LastY: Integer; // here stored last mouse coords
SplitInfo: TfrSplitInfo;
RightBottom: Integer;
LeftTop: TPoint;
FirstBandMove: Boolean;
FDesigner: TfrDesignerForm;
fOldFocusRect : TRect;
fPaintSel: TPaintSel;
fPainting: boolean;
fResizeDialog:boolean;
procedure NormalizeRect(var r: TRect);
procedure NormalizeCoord(t: TfrView);
function FindNearestEdge(var x, y: Integer): Boolean;
procedure RoundCoord(var x, y: Integer);
procedure Draw(N: Integer; AClipRgn: HRGN);
procedure DrawPage(DrawMode: TfrDesignerDrawMode);
procedure DrawRectLine(Rect: TRect);
procedure DrawFocusRect(aRect: TRect);
procedure DrawHSplitter(Rect: TRect);
procedure DrawSelection(t: TfrView);
procedure DrawShape(t: TfrView);
procedure DrawDialog(N: Integer; AClipRgn: HRGN);
procedure MDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure MUp(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
procedure MMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure CMMouseLeave(var {%H-}Message: TLMessage); message CM_MOUSELEAVE;
procedure DClick(Sender: TObject);
procedure MoveResize(Kx,Ky:Integer; UseFrames,AResize: boolean);
procedure EnableEvents(aOk: boolean = true);
// focusrect
procedure NPDrawFocusRect;
procedure NPEraseFocusRect;
// objects
procedure NPDrawLayerObjects(Rgn: HRGN; Start:Integer=10000);
procedure NPRedrawViewCheckBand(t: TfrView);
// selection
procedure NPPaintSelection; // this is the only function that works during Paint
procedure NPDrawSelection;
procedure NPEraseSelection;
protected
procedure Paint; override;
procedure WMEraseBkgnd(var {%H-}Message: TLMEraseBkgnd); message LM_ERASEBKGND;
procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
public
constructor Create(AOwner: TComponent); override;
destructor destroy; override;
procedure Init;
procedure SetPage;
procedure GetMultipleSelected;
end;
TPaintTimeStatusItem = (ptsFocusRect);
TPaintTimeStatus = set of TPaintTimeStatusItem;
{ TPaintSel }
TPaintSel=class
private
fStatus: TPaintTimeStatus;
fFocusRect: TRect;
fOwner: TfrDesignerPage;
fGreenBullet,fGrayBullet: TPortableNetworkGraphic;
procedure InvalidateFocusRect;
procedure DrawOrInvalidateViewHandles(t:TfrView; aDraw:boolean);
procedure DrawOrInvalidateSelection(aDraw:boolean);
public
constructor Create(AOwner: TfrDesignerPage);
destructor Destroy; override;
procedure FocusRect(aRect:TRect);
procedure RemoveFocusRect;
procedure InvalidateSelection;
procedure PaintSelection;
procedure Paint;
end;
{ TfrDesignerForm }
TfrDesignerForm = class(TfrReportDesigner)
acDuplicate: TAction;
MenuItem2: TMenuItem;
tlsDBFields: TAction;
FileBeforePrintScript: TAction;
FileOpen: TAction;
FilePreview: TAction;
FileSaveAs: TAction;
FileSave: TAction;
acToggleFrames: TAction;
actList: TActionList;
frSpeedButton1: TSpeedButton;
frSpeedButton2: TSpeedButton;
frSpeedButton3: TSpeedButton;
frSpeedButton4: TSpeedButton;
frSpeedButton5: TSpeedButton;
frSpeedButton6: TSpeedButton;
frTBSeparator16: TPanel;
Image1: TImage;
ActionsImageList: TImageList;
ImgIndic: TImageList;
LinePanel: TPanel;
MenuItem1: TMenuItem;
OB7: TSpeedButton;
panTab: TPanel;
panForDlg: TPanel;
PgB4: TSpeedButton;
Tab1: TTabControl;
ScrollBox1: TScrollBox;
StatusBar1: TStatusBar;
frDock1: TPanel;
frDock2: TPanel;
Popup1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
MainMenu1: TMainMenu;
FileMenu: TMenuItem;
EditMenu: TMenuItem;
ToolMenu: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N23: TMenuItem;
N24: TMenuItem;
N25: TMenuItem;
N27: TMenuItem;
N28: TMenuItem;
N26: TMenuItem;
N29: TMenuItem;
N30: TMenuItem;
N31: TMenuItem;
N32: TMenuItem;
N33: TMenuItem;
N36: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
ImageList1: TImageList;
Pan5: TMenuItem;
N8: TMenuItem;
ImageList2: TImageList;
N38: TMenuItem;
Pan6: TMenuItem;
N39: TMenuItem;
N40: TMenuItem;
N42: TMenuItem;
MastMenu: TMenuItem;
N16: TMenuItem;
Panel2: TPanel;
FileBtn1: TSpeedButton;
FileBtn2: TSpeedButton;
FileBtn3: TSpeedButton;
FileBtn4: TSpeedButton;
CutB: TSpeedButton;
CopyB: TSpeedButton;
PstB: TSpeedButton;
ZB1: TSpeedButton;
ZB2: TSpeedButton;
SelAllB: TSpeedButton;
PgB1: TSpeedButton;
PgB2: TSpeedButton;
PgB3: TSpeedButton;
GB1: TSpeedButton;
GB2: TSpeedButton;
ExitB: TSpeedButton;
Panel3: TPanel;
AlB1: TSpeedButton;
AlB2: TSpeedButton;
AlB3: TSpeedButton;
AlB4: TSpeedButton;
AlB5: TSpeedButton;
FnB1: TSpeedButton;
FnB2: TSpeedButton;
FnB3: TSpeedButton;
ClB2: TSpeedButton;
HlB1: TSpeedButton;
AlB6: TSpeedButton;
AlB7: TSpeedButton;
Panel1: TPanel;
FrB1: TSpeedButton;
FrB2: TSpeedButton;
FrB3: TSpeedButton;
FrB4: TSpeedButton;
ClB1: TSpeedButton;
ClB3: TSpeedButton;
FrB5: TSpeedButton;
FrB6: TSpeedButton;
frTBSeparator1: TPanel;
frTBSeparator2: TPanel;
frTBSeparator3: TPanel;
frTBSeparator4: TPanel;
frTBSeparator5: TPanel;
frTBPanel1: TPanel;
C3: TComboBox;
C2: TComboBox;
frTBPanel2: TPanel;
frTBSeparator6: TPanel;
frTBSeparator7: TPanel;
frTBSeparator8: TPanel;
frTBSeparator9: TPanel;
frTBSeparator10: TPanel;
N37: TMenuItem;
Pan2: TMenuItem;
Pan3: TMenuItem;
Pan1: TMenuItem;
Pan4: TMenuItem;
Panel4: TPanel;
OB1: TSpeedButton;
OB2: TSpeedButton;
OB3: TSpeedButton;
OB4: TSpeedButton;
OB5: TSpeedButton;
frTBSeparator12: TPanel;
Panel5: TPanel;
Align1: TSpeedButton;
Align2: TSpeedButton;
Align3: TSpeedButton;
Align4: TSpeedButton;
Align5: TSpeedButton;
Align6: TSpeedButton;
Align7: TSpeedButton;
Align8: TSpeedButton;
Align9: TSpeedButton;
Align10: TSpeedButton;
frTBSeparator13: TPanel;
//** Tab1: TTabControl;
frDock4: TPanel;
HelpMenu: TMenuItem;
N34: TMenuItem;
GB3: TSpeedButton;
N46: TMenuItem;
N47: TMenuItem;
UndoB: TSpeedButton;
frTBSeparator14: TPanel;
AlB8: TSpeedButton;
RedoB: TSpeedButton;
N48: TMenuItem;
OB6: TSpeedButton;
frTBSeparator15: TPanel;
Panel6: TPanel;
Pan7: TMenuItem;
N14: TMenuItem;
Panel7: TPanel;
PBox1: TPaintBox;
N17: TMenuItem;
E1: TEdit;
Panel8: TPanel;
SB1: TSpeedButton;
SB2: TSpeedButton;
HelpBtn: TSpeedButton;
frTBSeparator11: TPanel;
N18: TMenuItem;
N22: TMenuItem;
N35: TMenuItem;
Popup2: TPopupMenu;
N41: TMenuItem;
N43: TMenuItem;
N44: TMenuItem;
StB1: TSpeedButton;
procedure acDuplicateExecute(Sender: TObject);
procedure acToggleFramesExecute(Sender: TObject);
procedure C2GetItems(Sender: TObject);
procedure FileBeforePrintScriptExecute(Sender: TObject);
procedure FileOpenExecute(Sender: TObject);
procedure FilePreviewExecute(Sender: TObject);
procedure FileSaveAsExecute(Sender: TObject);
procedure FileSaveExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure DoClick(Sender: TObject);
procedure ClB1Click(Sender: TObject);
procedure GB1Click(Sender: TObject);
procedure ScrollBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure tlsDBFieldsExecute(Sender: TObject);
procedure ZB1Click(Sender: TObject);
procedure ZB2Click(Sender: TObject);
procedure PgB1Click(Sender: TObject);
procedure PgB2Click(Sender: TObject);
procedure OB2MouseDown(Sender: TObject; {%H-}Button: TMouseButton;
Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
procedure OB1Click(Sender: TObject);
procedure CutBClick(Sender: TObject);
procedure CopyBClick(Sender: TObject);
procedure PstBClick(Sender: TObject);
procedure SelAllBClick(Sender: TObject);
procedure ExitBClick(Sender: TObject);
procedure PgB3Click(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure GB2Click(Sender: TObject);
procedure FileBtn1Click(Sender: TObject);
//procedure FileBtn3Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure C2DrawItem({%H-}Control: TWinControl; Index: Integer; Rect: TRect;
{%H-}State: TOwnerDrawState);
procedure HlB1Click(Sender: TObject);
procedure N42Click(Sender: TObject);
procedure Popup1Popup(Sender: TObject);
procedure N23Click(Sender: TObject);
procedure N37Click(Sender: TObject);
procedure Pan2Click(Sender: TObject);
procedure N14Click(Sender: TObject);
procedure Align1Click(Sender: TObject);
procedure Align2Click(Sender: TObject);
procedure Align3Click(Sender: TObject);
procedure Align4Click(Sender: TObject);
procedure Align5Click(Sender: TObject);
procedure Align6Click(Sender: TObject);
procedure Align7Click(Sender: TObject);
procedure Align8Click(Sender: TObject);
procedure Align9Click(Sender: TObject);
procedure Align10Click(Sender: TObject);
procedure Tab1Change(Sender: TObject);
procedure N34Click(Sender: TObject);
procedure GB3Click(Sender: TObject);
procedure UndoBClick(Sender: TObject);
procedure RedoBClick(Sender: TObject);
//procedure N20Click(Sender: TObject);
procedure PBox1Paint(Sender: TObject);
procedure SB1Click(Sender: TObject);
procedure SB2Click(Sender: TObject);
procedure HelpBtnClick(Sender: TObject);
procedure FormMouseDown(Sender: TObject; {%H-}Button: TMouseButton;
{%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
procedure N22Click(Sender: TObject);
procedure Tab1MouseDown(Sender: TObject; Button: TMouseButton;
{%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
procedure frDesignerFormClose(Sender: TObject; var {%H-}CloseAction: TCloseAction);
procedure frDesignerFormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure frSpeedButton1Click(Sender: TObject);
procedure StB1Click(Sender: TObject);
private
//
FirstSelected : TfrView; // First Selected Object
SelNum : Integer; // number of objects currently selected
MRFlag : Boolean; // several objects was selected
ObjRepeat : Boolean; // was pressed Shift + Insert Object
{ Private declarations }
fInBuildPage : Boolean;
PageView: TfrDesignerPage;
EditorForm: TfrEditorForm;
ColorSelector: TColorSelector;
MenuItems: TFpList;
ItemWidths: TStringList;
FCurPage: Integer;
FGridSize: Integer;
FGridShow, FGridAlign: Boolean;
FUnits: TfrReportUnits;
FGrayedButtons: Boolean;
FUndoBuffer, FRedoBuffer: TfrUndoBuffer;
FUndoBufferLength, FRedoBufferLength: Integer;
FirstTime: Boolean;
MaxItemWidth, MaxShortCutWidth: Integer;
// FirstInstance: Boolean;
EditAfterInsert: Boolean;
FCurDocName, FCaption: String;
fCurDocFileType: Integer;
ShapeMode: TfrShapeMode;
{$IFDEF StdOI}
ObjInsp : TObjectInspector;
PropHook : TPropertyEditorHook;
{$ELSE}
ObjInsp : TfrObjectInspector;
{$ENDIF}
procedure CreateNewReport;
procedure DuplicateSelection;
procedure ObjInspSelect(Obj:TObject);
procedure ObjInspRefresh;
procedure GetFontList;
procedure SetMenuBitmaps;
procedure SetCurPage(Value: Integer);
procedure SetGridSize(Value: Integer);
procedure SetGridShow(Value: Boolean);
procedure SetGridAlign(Value: Boolean);
procedure SetUnits(Value: TfrReportUnits);
procedure SetGrayedButtons(Value: Boolean);
procedure SetCurDocName(Value: String);
procedure SelectionChanged;
procedure ShowPosition;
procedure ShowContent;
procedure EnableControls;
procedure ResetSelection;
procedure DeleteObjects;
procedure AddPage(ClName : string);
procedure RemovePage(n: Integer);
procedure SetPageTitles;
//** procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
procedure FillInspFields;
function RectTypEnabled: Boolean;
function FontTypEnabled: Boolean;
function ZEnabled: Boolean;
function CutEnabled: Boolean;
function CopyEnabled: Boolean;
function PasteEnabled: Boolean;
function DelEnabled: Boolean;
function EditEnabled: Boolean;
procedure ColorSelected(Sender: TObject);
procedure SelectAll;
procedure Unselect;
procedure CutToClipboard;
procedure CopyToClipboard;
procedure SaveState;
procedure RestoreState;
procedure ClearBuffer(Buffer: TfrUndoBuffer; var BufferLength: Integer);
procedure ClearUndoBuffer;
procedure ClearRedoBuffer;
procedure Undo(Buffer: PfrUndoBuffer);
procedure ReleaseAction(ActionRec: TfrUndoRec);
procedure AddAction(Buffer: PfrUndoBuffer; a: TfrUndoAction; List: TFpList);
procedure AddUndoAction(AUndoAction: TfrUndoAction);
procedure DoDrawText(aCanvas: TCanvas; aCaption: string;
Rect: TRect; Selected, aEnabled: Boolean; Flags: Longint);
procedure MeasureItem(AMenuItem: TMenuItem; ACanvas: TCanvas;
var AWidth, AHeight: Integer);
procedure DrawItem(AMenuItem: TMenuItem; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
function FindMenuItem(AMenuItem: TMenuItem): TfrMenuItemInfo;
procedure SetMenuItemBitmap(AMenuItem: TMenuItem; ABtn:TSpeedButton);
procedure FillMenuItems(MenuItem: TMenuItem);
procedure DeleteMenuItems(MenuItem: TMenuItem);
procedure OnActivateApp(Sender: TObject);
procedure OnDeactivateApp(Sender: TObject);
procedure GetDefaultSize(var dx, dy: Integer);
function SelStatus: TfrSelectionStatus;
procedure UpdScrollbars;
// procedure InsertDbFields;
{$ifdef sbod}
procedure DrawStatusPanel(const ACanvas:TCanvas; const rect: TRect);
procedure StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel;
const Rect: TRect);
{$endif}
procedure DefineExtraPopupSelected(popup: TPopupMenu);
procedure SelectSameClassClick(Sender: TObject);
procedure SelectSameClass(View: TfrView);
function CheckFileModified: Integer;
private
FDuplicateCount: Integer;
FDupDeltaX,FDupDeltaY: Integer;
FDuplicateList: TFpList;
procedure ViewsAction(Views: TFpList; TheAction:TViewAction; Data: PtrInt;
OnlySel:boolean=true; WithUndoAction:boolean=true; WithRedraw:boolean=true);
procedure ToggleFrames(View: TfrView; Data: PtrInt);
procedure DuplicateView(View: TfrView; Data: PtrInt);
procedure ResetDuplicateCount;
function lrDesignAcceptDrag(const Source: TObject): TControl;
protected
procedure SetModified(AValue: Boolean);override;
function IniFileName:string;
public
constructor Create(aOwner : TComponent); override;
destructor Destroy; override;
procedure WndProc(var Message: TLMessage); override;
procedure RegisterObject(ButtonBmp: TBitmap; const ButtonHint: String;
ButtonTag: Integer; ObjectType:TfrObjectType); override;
procedure RegisterTool(const MenuCaption: String; ButtonBmp: TBitmap;
OnClickEvnt: TNotifyEvent); override;
procedure BeforeChange; override;
procedure AfterChange; override;
procedure ShowMemoEditor;
procedure ShowEditor;
procedure RedrawPage; override;
procedure OnModify({%H-}sender: TObject);
function PointsToUnits(x: Integer): Double; override;
function UnitsToPoints(x: Double): Integer; override;
procedure MoveObjects(dx, dy: Integer; aResize: Boolean);
procedure UpdateStatus;
property CurDocName: String read FCurDocName write SetCurDocName;
property CurPage: Integer read FCurPage write SetCurPage;
property GridSize: Integer read FGridSize write SetGridSize;
property ShowGrid: Boolean read FGridShow write SetGridShow;
property GridAlign: Boolean read FGridAlign write SetGridAlign;
property Units: TfrReportUnits read FUnits write SetUnits;
property GrayedButtons: Boolean read FGrayedButtons write SetGrayedButtons;
end;
procedure frSetGlyph(aColor: TColor; sb: TSpeedButton; n: Integer);
function frCheckBand(b: TfrBandType): Boolean;
var
frTemplateDir: String;
edtScriptFontName : string = '';
edtScriptFontSize : integer = 0;
implementation
{$R *.lfm}
{$R bullets.res}
{$R fr_pencil.res}
uses
LR_Pgopt, LR_GEdit, LR_Templ, LR_Newrp, LR_DsOpt, LR_Const, LR_Pars,
LR_Prntr, LR_Hilit, LR_Flds, LR_Dopt, LR_Ev_ed, LR_BndEd, LR_VBnd,
LR_BTyp, LR_Utils, LR_GrpEd, LR_About, LR_IFlds, LR_DBRel,LR_DBSet,
DB, lr_design_ins_filed, IniFiles;
type
THackView = class(TfrView)
end;
function GetUnusedBand: TfrBandType; forward;
procedure SendBandsToDown; forward;
procedure ClearClipBoard; forward;
function Objects: TFpList; forward;
procedure GetRegion; forward;
function TopSelected: Integer; forward;
var
// FirstInst : Boolean=True;// First instance
{
FirstSelected : TfrView; // First Selected Object
SelNum : Integer; // number of objects currently selected
MRFlag : Boolean; // several objects was selected
ObjRepeat : Boolean; // was pressed Shift + Insert Object
}
WasOk : Boolean; // was Ok pressed in dialog
OldRect,OldRect1 : TRect; // object rect after mouse was clicked
Busy : Boolean; // busy flag. need!
ShowSizes : Boolean;
LastFontName : String;
LastFontSize : Integer;
LastAdjust : Integer;
LastFrameWidth : Single;
LastLineWidth : Single;
LastFrames : TfrFrameBorders;
LastFontStyle : Word;
LastFrameColor : TColor;
LastFillColor : TColor;
LastFontColor : TColor;
ClrButton : TSpeedButton;
FirstChange : Boolean;
ClipRgn : HRGN;
// globals
ClipBd : TFpList; // clipboard
GridBitmap : TBitmap; // for drawing grid in design time
ColorLocked : Boolean; // true to avoid unwished color change
frDesignerComp : TfrDesigner;
{----------------------------------------------------------------------------}
procedure AddRgn(var HR: HRGN; T: TfrView);
var
tr: HRGN;
begin
tr := t.GetClipRgn(rtExtended);
CombineRgn(HR, HR, TR, RGN_OR);
DeleteObject(TR);
end;
{ TPaintSel }
constructor TPaintSel.Create(AOwner: TfrDesignerPage);
begin
inherited Create;
fOwner := AOwner;
fGreenBullet := TPortableNetworkGraphic.Create;
fGrayBullet := TPortableNetworkGraphic.Create;
fGreenBullet.LoadFromResourceName(HInstance, 'bulletgreen');
fGrayBullet.LoadFromResourceName(HInstance, 'bulletgray');
end;
destructor TPaintSel.Destroy;
begin
fGrayBullet.Free;
fGreenBullet.Free;
inherited Destroy;
end;
procedure TPaintSel.FocusRect(aRect: TRect);
begin
fFocusRect := aRect;
Include(fStatus, ptsFocusRect);
InvalidateFocusRect;
end;
procedure TPaintSel.RemoveFocusRect;
begin
InvalidateFocusRect;
end;
procedure TPaintSel.InvalidateSelection;
begin
DrawOrInvalidateSelection(false);
end;
procedure TPaintSel.PaintSelection;
begin
DrawOrInvalidateSelection(true);
end;
procedure TPaintSel.DrawOrInvalidateSelection(aDraw:boolean);
var
i: Integer;
t: TfrView;
Lst: TfpList;
begin
Lst := Objects;
if not Assigned(Lst) then exit;
for i:=0 to Lst.Count-1 do
begin
t := TfrView(Lst[i]);
if not t.Selected then
continue;
DrawOrInvalidateViewHandles(t, aDraw);
end;
end;
procedure TPaintSel.InvalidateFocusRect;
var
R: TRect;
begin
R := fFocusRect;
fOwner.NormalizeRect(R);
InvalidateFrame(fOwner.Handle, @R, false, 1);
end;
procedure TPaintSel.DrawOrInvalidateViewHandles(t: TfrView; aDraw:boolean);
var
Bullet: TGraphic;
bdx, bdy: Integer;
procedure UpdateBullet(aBullet: TGraphic);
begin
Bullet := aBullet;
bdx := Bullet.Width div 2;
bdy := Bullet.Height div 2;
end;
procedure DrawPoint(x,y: Integer);
var
r: TRect;
begin
if aDraw then
//fOwner.Canvas.EllipseC(x, y, 1, 1)
fOwner.Canvas.Draw(x-bdx, y-bdy, Bullet)
else
begin
r := rect(x-bdx,y-bdy,x+bdx+1,y+bdy+1);
InvalidateRect(fOwner.Handle, @r, false);
end;
end;
var
px, py: Integer;
begin
with t, fOwner.Canvas do
begin
if TfrDesignerForm(frDesigner).SelNum>1 then
UpdateBullet(fGrayBullet)
else
UpdateBullet(fGreenBullet);
px := x + dx div 2;
py := y + dy div 2;
DrawPoint(x, y);
if dx>0 then
DrawPoint(x + dx, y);
if dy>0 then
DrawPoint(x, y + dy);
if TfrDesignerForm(frDesigner).SelNum = 1 then
begin
if px>x then
DrawPoint(px, y);
if py>y then
DrawPoint(x, py);
if (py>y) and (px>x) then
begin
DrawPoint(px, y + dy);
DrawPoint(x + dx, py);
end;
end;
if (dx>0) and (dy>0) then
begin
if aDraw and (Objects.IndexOf(t) = fOwner.RightBottom) then
UpdateBullet(fGreenBullet);
DrawPoint(x + dx, y + dy);
end;
end;
end;
procedure TPaintSel.Paint;
begin
if ptsFocusRect in FStatus then
begin
fOwner.Canvas.Brush.Style := bsSolid;
fOwner.Canvas.Pen.Style := psDot;
fOwner.Canvas.Pen.Color := clSkyBlue;
fOwner.Canvas.Brush.Style := bsClear;
fOwner.Canvas.Rectangle(fFocusRect);
Exclude(Fstatus, ptsFocusRect);
end;
end;
constructor TfrDesigner.Create(AOwner: TComponent);
begin
if Assigned(frDesignerComp) then
raise Exception.Create(sFRDesignerExists);
inherited Create(AOwner);
frDesignerComp:=Self;
end;
destructor TfrDesigner.Destroy;
begin
frDesignerComp:=nil;
inherited Destroy;
end;
{----------------------------------------------------------------------------}
procedure TfrDesigner.Loaded;
begin
inherited Loaded;
frTemplateDir := TemplateDir;
end;
{--------------------------------------------------}
constructor TfrDesignerPage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Parent := AOwner as TWinControl;
Color := clWhite;
EnableEvents;
fPaintSel := TPaintSel.Create(self);
end;
destructor TfrDesignerPage.destroy;
begin
fPaintSel.Free;
inherited destroy;
end;
procedure TfrDesignerPage.Init;
begin
Down := False;
DFlag:= False;
RFlag := False;
Cursor := crDefault;
CT := ctNone;
end;
procedure TfrDesignerPage.SetPage;
var
Pgw,Pgh: Integer;
begin
if not Assigned(FDesigner.Page) then Exit;
FDesigner.panForDlg.Visible:=(FDesigner.Page is TfrPageDialog);
FDesigner.panel4.Visible :=not FDesigner.panForDlg.Visible;
if (FDesigner.Page is TfrPageDialog) then
begin
Color:=clBtnFace;
SetBounds(10, 10,TfrPageDialog(FDesigner.Page).Width,TfrPageDialog(FDesigner.Page).Height);
end
else
begin
Pgw := FDesigner.Page.PrnInfo.Pgw;
Pgh := FDesigner.Page.PrnInfo.Pgh;
if Pgw > Parent.Width then
SetBounds(10, 10, Pgw, Pgh)
else
SetBounds((Parent.Width - Pgw) div 2, 10, Pgw, Pgh);
end;
end;
procedure TfrDesignerPage.Paint;
begin
fPainting := true;
Draw(10000, 0);
fPaintSel.Paint;
fPainting := false;
end;
procedure TfrDesignerPage.WMEraseBkgnd(var Message: TLMEraseBkgnd);
begin
//do nothing to avoid flicker
end;
procedure TfrDesignerPage.DoContextPopup(MousePos: TPoint; var Handled: Boolean
);
begin
Handled := true;
end;
procedure TfrDesignerPage.NormalizeCoord(t: TfrView);
begin
if t.dx < 0 then
begin
t.dx := -t.dx;
t.x := t.x - t.dx;
end;
if t.dy < 0 then
begin
t.dy := -t.dy;
t.y := t.y - t.dy;
end;
end;
procedure TfrDesignerPage.NormalizeRect(var r: TRect);
var
i: Integer;
begin
with r do
begin
if Left > Right then
begin
i := Left;
Left := Right;
Right := i;
end;
if Top > Bottom then
begin
i := Top;
Top := Bottom;
Bottom := i;
end;
end;
end;
procedure TfrDesignerPage.DrawHSplitter(Rect: TRect);
begin
with Canvas do
begin
Pen.Mode := pmXor;
Pen.Color := clSilver;
Pen.Width := 1;
MoveTo(Rect.Left, Rect.Top);
LineTo(Rect.Right, Rect.Bottom);
Pen.Mode := pmCopy;
end;
end;
procedure TfrDesignerPage.DrawRectLine(Rect: TRect);
begin
with Canvas do
begin
Pen.Mode := pmNot;
Pen.Style := psSolid;
Pen.Width := Round(LastLineWidth);
with Rect do
begin
if Abs(Right - Left) > Abs(Bottom - Top) then
begin
MoveTo(Left, Top);
LineTo(Right, Top);
end
else
begin
MoveTo(Left, Top);
LineTo(Left, Bottom);
end;
end;
Pen.Mode := pmCopy;
end;
end;
procedure DrawRubberRect(Canvas: TCanvas; aRect: TRect; Color: TColor);
procedure DrawVertLine(X1,Y1,Y2: integer);
Var Cl : TColor;
begin
Cl:=Canvas.Pen.Color;
try
if Y2<Y1 then
while Y2<Y1 do
begin
Canvas.Pen.Color:=Color;
Canvas.MoveTo(X1,Y1);
Canvas.LineTo(X1,Y1+1);
//Canvas.Pixels[X1, Y1] := Color;
dec(Y1, 2);
end
else
while Y1<Y2 do
begin
Canvas.Pen.Color:=Color;
Canvas.MoveTo(X1,Y1);
Canvas.LineTo(X1,Y1+1);
//Canvas.Pixels[X1, Y1] := Color;
inc(Y1, 2);
end;
finally
Canvas.Pen.Color:=cl;
end;
end;
procedure DrawHorzLine(X1,Y1,X2: integer);
Var Cl : TColor;
begin
Cl:=Canvas.Pen.Color;
try
if X2<X1 then
while X2<X1 do
begin
Canvas.Pen.Color:=Color;
Canvas.MoveTo(X1,Y1);
Canvas.LineTo(X1+1,Y1);
//Canvas.Pixels[X1, Y1] := Color;
dec(X1, 2);
end
else
while X1<X2 do
begin
Canvas.Pen.Color:=Color;
Canvas.MoveTo(X1,Y1);
Canvas.LineTo(X1+1,Y1);
//Canvas.Pixels[X1, Y1] := Color;
inc(X1, 2);
end;
finally
Canvas.Pen.Color:=cl;
end;
end;
begin
with aRect do
begin
DrawHorzLine(Left, Top, Right-1);
DrawVertLine(Right-1, Top, Bottom-1);
DrawHorzLine(Right-1, Bottom-1, Left);
DrawVertLine(Left, Bottom-1, Top);
end;
end;
procedure TfrDesignerPage.DrawFocusRect(aRect: TRect);
var
DCIndex: Integer;
begin
with Canvas do
begin
DCIndex := SaveDC(Handle);
Pen.Mode := pmXor;
Pen.Color := clWhite;
//DrawRubberRect(Canvas, aRect, clWhite);
Pen.Width := 1;
Pen.Style := psDot;
MoveTo(aRect.Left, aRect.Top);
LineTo(aRect.Right, aRect.Top);
LineTo(aRect.Right, aRect.Bottom);
LineTo(aRect.left, aRect.Bottom);
LineTo(aRect.left, aRect.Top);
//Brush.Style := bsClear;
//Rectangle(aRect);
RestoreDC(Handle, DCIndex);
Pen.Mode := pmCopy;
fOldFocusRect:=aRect;
end;
end;
procedure TfrDesignerPage.DrawSelection(t: TfrView);
var
px, py: Word;
procedure DrawPoint(x, y: Word);
begin
Canvas.EllipseC(x,y,1,1);
//Canvas.MoveTo(x, y);
//Canvas.LineTo(x, y);
end;
begin
if t.Selected then
with t, Self.Canvas do
begin
Pen.Width := 5;
Pen.Mode := pmXor;
Pen.Color := clWhite;
px := x + dx div 2;
py := y + dy div 2;
DrawPoint(x, y);
if dx>0 then
DrawPoint(x + dx, y);
if dy>0 then
DrawPoint(x, y + dy);
if (dx>0) and (dy>0) then
begin
if Objects.IndexOf(t) = RightBottom then
Pen.Color := clTeal;
DrawPoint(x + dx, y + dy);
end;
Pen.Color := clWhite;
if TfrDesignerForm(frDesigner).SelNum = 1 then
begin
if px>x then
DrawPoint(px, y);
if py>y then
DrawPoint(x, py);
if (py>y) and (px>x) then
begin
DrawPoint(px, y + dy);
DrawPoint(x + dx, py);
end;
end;
Pen.Mode := pmCopy;
// NOTE: ROP mode under gtk is used not only to draw with pen but
// also any other filled graphics, the problem is that brush
// handle is not invalidated when pen has changed as result
// the ROP mode is not updated and next operation will use
// the old XOR mode.
// TODO: Solve this problem in LCL-gtk, as workaround draw something
// using new pen.
EllipseC(-100,-100,1,1);
end;
end;
procedure TfrDesignerPage.DrawShape(t: TfrView);
begin
if t.Selected then
with t do
DrawFocusRect(Rect(x, y, x + dx + 1, y + dy + 1));
end;
procedure TfrDesignerPage.DrawDialog(N: Integer; AClipRgn: HRGN);
Var
Dlg : TfrPageDialog;
i, iy : Integer;
t : TfrView;
Objects : TFpList;
begin
Dlg:=TfrPageDialog(FDesigner.Page);
with Canvas do
begin
Brush.Color := clGray;
FillRect(Rect(0,0, Width, Height + 20));
Brush.Color := clBtnFace;
Brush.Style := bsSolid;
Rectangle(Rect(0,0,FDesigner.Page.Width-1,FDesigner.Page.Height-1));
Brush.Color := clBlue;
Rectangle(Rect(0,0,FDesigner.Page.Width-1,20));
Canvas.TextRect(Rect(0,0,FDesigner.Page.Width-1,20), 1, 5, Dlg.Caption);
end;
Objects := FDesigner.Page.Objects;
for i:=0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
t.draw(Canvas);
iy:=1;
//Show indicator if script it's not empty
if t.Script.Count>0 then
begin
FDesigner.ImgIndic.Draw(Canvas, t.x+1, t.y+iy, 0);
iy:=10;
end;
end;
FDesigner.ImageList2.Draw(Canvas, Width-14, Height-14, 1);
if not Down then
NPPaintSelection;
end;
procedure TfrDesignerPage.Draw(N: Integer; AClipRgn: HRGN);
var
i,iy : Integer;
t : TfrView;
R, R1 : HRGN;
Objects : TFpList;
procedure DrawBackground;
var
i, j: Integer;
Re: TRect;
begin
with Canvas do
begin
if FDesigner.ShowGrid and (FDesigner.GridSize <> 18) then
begin
with GridBitmap.Canvas do
begin
Brush.Color := clWhite;
FillRect(Rect(0, 0, 8, 8));
Pixels[0, 0] := clBlack;
if FDesigner.GridSize = 4 then
begin
Pixels[4, 0] := clBlack;
Pixels[0, 4] := clBlack;
Pixels[4, 4] := clBlack;
end;
end;
Brush.Bitmap := GridBitmap;
end
else
begin
Brush.Color := clWhite;
Brush.Style := bsSolid;
Brush.Bitmap:= nil;
end;
//FillRgn(Handle, R, Brush.Handle);
GetRgnBox(R, @Re);
FillRect(Re);
if FDesigner.ShowGrid and (FDesigner.GridSize = 18) then
begin
i := 0;
while i < Width do
begin
j := 0;
while j < Height do
begin
if RectVisible(Handle, Rect(i, j, i + 1, j + 1)) then
Pixels[i,j]:=clBlack;
Inc(j, FDesigner.GridSize);
end;
Inc(i, FDesigner.GridSize);
end;
end;
Brush.Style := bsClear;
Pen.Width := 1;
Pen.Color := clSilver;
Pen.Style := psSolid;
Pen.Mode := pmCopy;
with FDesigner.Page do
begin
if UseMargins then
Rectangle(LeftMargin, TopMargin, RightMargin, BottomMargin);
if ColCount > 1 then
begin
ColWidth := (RightMargin - LeftMargin) div ColCount;
Pen.Style := psDot;
j := LeftMargin;
for i := 1 to ColCount do
begin
Rectangle(j, -1, j + ColWidth + 1, PrnInfo.Pgh + 1);
Inc(j, ColWidth + ColGap);
end;
Pen.Style := psSolid;
end;
end;
end;
end;
function ViewIsVisible(t: TfrView): Boolean;
var
Rn: HRGN;
begin
Rn := t.GetClipRgn(rtNormal);
Result := CombineRgn(Rn, Rn, AClipRgn, RGN_AND) <> NULLREGION;
if Result then
// will this view be really visible?
Result := CombineRgn(Rn, AClipRgn, R, RGN_AND) <> NULLREGION;
DeleteObject(Rn);
end;
begin
if FDesigner.Page = nil then Exit;
DocMode := dmDesigning;
Objects := FDesigner.Page.Objects;
if FDesigner.Page is TfrPageDialog then
begin
DrawDialog(N, AClipRgn);
Exit;
end;
{$IFDEF DebugLR}
DebugLnEnter('TfrDesignerPage.Draw INIT N=%d AClipRgn=%d',[N,AClipRgn]);
{$ENDIF}
if AClipRgn = 0 then
begin
with Canvas.ClipRect do
AClipRgn := CreateRectRgn(Left, Top, Right, Bottom);
end;
R:=CreateRectRgn(0, 0, Width, Height);
for i:=Objects.Count-1 downto 0 do
begin
t := TfrView(Objects[i]);
{$IFDEF DebugLR}
DebugLn('Draw ',InttoStr(i),' ',t.Name);
{$ENDIF}
if i <= N then
begin
if t.selected then
t.draw(canvas)
else
if ViewIsVisible(t) then
begin
R1 := CreateRectRgn(0, 0, 1, 1);
CombineRgn(R1, AClipRgn, R, RGN_AND);
SelectClipRgn(Canvas.Handle, R1);
DeleteObject(R1);
t.Draw(Canvas);
iy:=1;
//Show indicator if script it's not empty
if t.Script.Count>0 then
begin
FDesigner.ImgIndic.Draw(Canvas, t.x+1, t.y+iy, 0);
iy:=10;
end;
//Show indicator if hightlight it's not empty
if (t is TfrCustomMemoView) and (Trim(TfrCustomMemoView(t).HighlightStr)<>'') then
FDesigner.ImgIndic.Draw(Canvas, t.x+1, t.y+iy, 1);
end;
end;
R1 := t.GetClipRgn(rtNormal);
CombineRgn(R, R, R1, RGN_DIFF);
DeleteObject(R1);
SelectClipRgn(Canvas.Handle, R);
end;
CombineRgn(R, R, AClipRgn, RGN_AND);
DrawBackground;
DeleteObject(R);
DeleteObject(AClipRgn);
if AClipRgn=ClipRgn then
ClipRgn := 0;
SelectClipRgn(Canvas.Handle, 0);
if not Down then
NPPaintSelection;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.Draw DONE');
{$ENDIF}
end;
procedure TfrDesignerPage.DrawPage(DrawMode: TfrDesignerDrawMode);
var
i: Integer;
t: TfrView;
begin
if DocMode <> dmDesigning then Exit;
{$ifdef ppaint}
if DrawMode=dmSelection then
begin
if not fPainting then
fPaintSel.InvalidateSelection;
exit;
end;
{$endif}
for i:=0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
case DrawMode of
dmAll: t.Draw(Canvas);
dmSelection: DrawSelection(t);
dmShape: DrawShape(t);
end;
end;
end;
function TfrDesignerPage.FindNearestEdge(var x, y: Integer): Boolean;
var
i: Integer;
t: TfrView;
min: Double;
p: TPoint;
function DoMin(a: Array of TPoint): Boolean;
var
i: Integer;
d: Double;
begin
Result := False;
for i := Low(a) to High(a) do
begin
d := sqrt((x - a[i].x) * (x - a[i].x) + (y - a[i].y) * (y - a[i].y));
if d < min then
begin
min := d;
p := a[i];
Result := True;
end;
end;
end;
begin
Result := False;
min := FDesigner.GridSize;
p := Point(x, y);
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if DoMin([Point(t.x, t.y), Point(t.x + t.dx, t.y),
Point(t.x + t.dx, t.y + t.dy), Point(t.x, t.y + t.dy)]) then
Result := True;
end;
x := p.x;
y := p.y;
end;
procedure TfrDesignerPage.RoundCoord(var x, y: Integer);
begin
with FDesigner do
if GridAlign then
begin
x := x div GridSize * GridSize;
y := y div GridSize * GridSize;
end;
end;
procedure TfrDesignerPage.GetMultipleSelected;
var
i, j, k: Integer;
t: TfrView;
begin
j := 0; k := 0;
LeftTop := Point(10000, 10000);
RightBottom := -1;
TfrDesignerForm(frDesigner).MRFlag := False;
if TfrDesignerForm(frDesigner).SelNum > 1 then {find right-bottom element}
begin
for i := 0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
begin
t.OriginalRect := Rect(t.x, t.y, t.dx, t.dy);
if (t.x + t.dx > j) or ((t.x + t.dx = j) and (t.y + t.dy > k)) then
begin
j := t.x + t.dx;
k := t.y + t.dy;
RightBottom := i;
end;
if t.x < LeftTop.x then LeftTop.x := t.x;
if t.y < LeftTop.y then LeftTop.y := t.y;
end;
end;
t := TfrView(Objects[RightBottom]);
OldRect := Rect(LeftTop.x, LeftTop.y, t.x + t.dx, t.y + t.dy);
OldRect1 := OldRect;
TfrDesignerForm(frDesigner).MRFlag := True;
end;
end;
procedure TfrDesignerPage.MDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i: Integer;
f, DontChange, v: Boolean;
t: TfrView;
p: TPoint;
begin
{$IFDEF DebugLR}
DebugLnEnter('TfrDesignerPage.MDown(X=%d,Y=%d) INIT',[x,y]);
DebugLn('Down=%s RFlag=%s',[dbgs(Down),dbgs(RFlag)]);
{$ENDIF}
// In Lazarus there is no mousedown after doubleclick so
// just ignore mousedown when doubleclick is coming.
if ssDouble in Shift then begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MDown DONE: doubleclick expected');
{$ENDIF}
exit;
end;
if (Button = mbRight) and Down and RFlag then
NPEraseFocusRect;
RFlag := False;
NPEraseSelection;
Down := True;
DontChange := False;
if Button = mbLeft then
begin
if (ssCtrl in Shift) or (Cursor = crCross) then
begin
RFlag := True;
if Cursor = crCross then
begin
NPEraseFocusRect;
RoundCoord(x, y);
OldRect1 := OldRect;
end;
OldRect := Rect(x, y, x, y);
FDesigner.Unselect;
TfrDesignerForm(frDesigner).SelNum := 0;
RightBottom := -1;
TfrDesignerForm(frDesigner).MRFlag := False;
TfrDesignerForm(frDesigner).FirstSelected := nil;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MDown DONE: Ctrl+Left o cursor=crCross');
{$ENDIF}
{$ifdef ppaint}
NPDrawSelection;
{$endif}
Exit;
end
else if Cursor = crPencil then
begin
with FDesigner do
begin
if GridAlign then
begin
if not FindNearestEdge(x, y) then
begin
x := Round(x / GridSize) * GridSize;
y := Round(y / GridSize) * GridSize;
end;
end;
end;
OldRect := Rect(x, y, x, y);
FDesigner.Unselect;
TfrDesignerForm(frDesigner).SelNum := 0;
RightBottom := -1;
TfrDesignerForm(frDesigner).MRFlag := False;
TfrDesignerForm(frDesigner).FirstSelected := nil;
LastX := x;
LastY := y;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MDown DONE: Left + cursor=crPencil');
{$ENDIF}
{$ifdef ppaint}
NPDrawSelection;
{$endif}
Exit;
end;
end;
if Cursor = crDefault then
begin
f := False;
for i := Objects.Count - 1 downto 0 do
begin
t := TfrView(Objects[i]);
V:=t.PointInView(X,Y);
{$IFDEF DebugLR}
DebugLn(t.Name,' PointInView(Rgn, X, Y)=',dbgs(V),' Selected=',dbgs(t.selected));
{$ENDIF}
if v then
begin
if ssShift in Shift then
begin
t.Selected := not t.Selected;
if t.Selected then
Inc(TfrDesignerForm(frDesigner).SelNum)
else
Dec(TfrDesignerForm(frDesigner).SelNum);
end
else
begin
if not t.Selected then
begin
FDesigner.Unselect;
TfrDesignerForm(frDesigner).SelNum := 1;
t.Selected := True;
end
else DontChange := True;
end;
if TfrDesignerForm(frDesigner).SelNum = 0 then
TfrDesignerForm(frDesigner).FirstSelected := nil
else
if TfrDesignerForm(frDesigner).SelNum = 1 then
TfrDesignerForm(frDesigner).FirstSelected := t
else
if TfrDesignerForm(frDesigner).FirstSelected <> nil then
if not TfrDesignerForm(frDesigner).FirstSelected.Selected then
TfrDesignerForm(frDesigner).FirstSelected := nil;
f := True;
break;
end;
end;
if not f then
begin
FDesigner.Unselect;
TfrDesignerForm(frDesigner).SelNum := 0;
TfrDesignerForm(frDesigner).FirstSelected := nil;
if Button = mbLeft then
begin
RFlag := True;
OldRect := Rect(x, y, x, y);
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MDown DONE: Deselection o no selection');
{$ENDIF}
{$ifdef ppaint}
NPDrawSelection;
{$endif}
Exit;
end;
end;
GetMultipleSelected;
if not DontChange then begin
FDesigner.SelectionChanged;
FDesigner.ResetDuplicateCount;
end;
end
else
if (Cursor = crSizeNWSE) and (FDesigner.Page is TfrPageDialog) then
begin
if (X > FDesigner.Page.Width - 10) and (X < FDesigner.Page.Width +10) and (Y > FDesigner.Page.Height - 10) and (Y < FDesigner.Page.Height + 10) then
fResizeDialog:=true
else
fResizeDialog:=false;
Exit;
end;
if TfrDesignerForm(frDesigner).SelNum = 0 then
begin // reset multiple selection
RightBottom := -1;
TfrDesignerForm(frDesigner).MRFlag := False;
end;
LastX := x;
LastY := y;
Moved := False;
FirstChange := True;
FirstBandMove := True;
if Button = mbRight then
begin
NPDrawSelection;
Down := False;
GetCursorPos(p{%H-});
//FDesigner.Popup1Popup(nil);
FDesigner.Popup1.PopUp(p.X,p.Y);
//**
{TrackPopupMenu(FDesigner.Popup1.Handle,
TPM_LEFTALIGN or TPM_RIGHTBUTTON, p.X, p.Y, 0, FDesigner.Handle, nil);
}
end
else if FDesigner.ShapeMode = smFrame then
DrawPage(dmShape);
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MDown DONE');
{$ENDIF}
end;
procedure TfrDesignerPage.MUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var
i, k, dx, dy: Integer;
t: TfrView;
ObjectInserted: Boolean;
procedure AddObject(ot: Byte);
begin
{ Objects.Add(frCreateObject(ot, '', FDesigner.Page));
t := TfrView(Objects.Last);}
t:=frCreateObject(ot, '', FDesigner.Page);
if t is TfrCustomMemoView then
TfrCustomMemoView(t).MonitorFontChanges;
end;
procedure CreateSection;
var
s: String;
begin
frBandTypesForm := TfrBandTypesForm.Create(FDesigner);
try
ObjectInserted := frBandTypesForm.ShowModal = mrOk;
if ObjectInserted then
begin
{ Objects.Add(TfrBandView.Create(FDesigner.Page));
t := TfrView(Objects.Last);}
t:=TfrBandView.Create(FDesigner.Page);
(t as TfrBandView).BandType := frBandTypesForm.SelectedTyp;
s := frGetBandName(frBandTypesForm.SelectedTyp);
THackView(t).BaseName := s;
SendBandsToDown;
end;
finally
frBandTypesForm.Free;
end;
end;
procedure CreateSubReport;
begin
{ Objects.Add(TfrSubReportView.Create(FDesigner.Page));
t := TfrView(Objects.Last);}
t:=TfrSubReportView.Create(FDesigner.Page);
(t as TfrSubReportView).SubPage := CurReport.Pages.Count;
CurReport.Pages.Add;
end;
begin
{$IFDEF DebugLR}
DebugLnEnter('TfrDesignerPage.MUp INIT Button=%d Cursor=%d RFlag=%s',
[ord(Button),Cursor,dbgs(RFlag)]);
{$ENDIF}
if Button <> mbLeft then
begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: Button<>mbLeft');
{$ENDIF}
Exit;
end;
Down := False;
if FDesigner.ShapeMode = smFrame then
DrawPage(dmShape);
//inserting a new object
if Cursor = crCross then
begin
{$IFDEF DebugLR}
DebugLnEnter('Inserting a New Object INIT');
{$ENDIF}
EnableEvents(false);
Mode := mdSelect;
if (OldRect.Left = OldRect.Right) and (OldRect.Top = OldRect.Bottom) then
OldRect := OldRect1
else
NPEraseFocusRect;
NormalizeRect(OldRect);
RFlag := False;
ObjectInserted := True;
if FDesigner.Panel4.Visible then
begin
with FDesigner.Panel4 do
begin
for i := 0 to ControlCount - 1 do
begin
if Controls[i] is TSpeedButton then
begin
with Controls[i] as TSpeedButton do
begin
if Down then
begin
if Tag = gtBand then
begin
if GetUnusedBand <> btNone then
CreateSection
else
begin
{$IFDEF DebugLR}
DebugLnExit('Inserting a new object DONE: GetUnusedBand=btNone');
DebugLnExit('TfrDesignerPage.MUp DONE: Inserting..');
{$ENDIF}
EnableEvents;
Exit;
end;
end
else if Tag = gtSubReport then
CreateSubReport
else
begin
if Tag >= gtAddIn then
begin
k := Tag - gtAddIn;
{ Objects.Add(frCreateObject(gtAddIn, frAddIns[k].ClassRef.ClassName, FDesigner.Page));
t := TfrView(Objects.Last);}
t:=frCreateObject(gtAddIn, frAddIns[k].ClassRef.ClassName, FDesigner.Page);
end
else
AddObject(Tag);
end;
break;
end;
end;
end;
end;
end;
end
else
begin
with FDesigner.panForDlg do
begin
for i := 0 to ControlCount - 1 do
begin
if Controls[i] is TSpeedButton then
begin
with Controls[i] as TSpeedButton do
begin
if Down then
begin
if Tag >= gtAddIn then
begin
k := Tag - gtAddIn;
{ Objects.Add(frCreateObject(gtAddIn, frAddIns[k].ClassRef.ClassName, FDesigner.Page));
t := TfrView(Objects.Last);}
t:=frCreateObject(gtAddIn, frAddIns[k].ClassRef.ClassName, FDesigner.Page);
end
else
AddObject(Tag);
break;
end;
end;
end;
end;
end;
end;
if ObjectInserted then
begin
{$IFDEF DebugLR}
debugLn('Object inserted begin');
{$ENDIF}
t.CreateUniqueName;
t.Canvas:=Canvas;
with OldRect do
begin
if (Left = Right) or (Top = Bottom) then
begin
dx := 40;
dy := 40;
if t is TfrCustomMemoView then
FDesigner.GetDefaultSize(dx, dy);
OldRect := Rect(Left, Top, Left + dx, Top + dy);
end;
end;
{$ifdef ppaint}
NPEraseSelection;
{$endif}
FDesigner.Unselect;
t.x := OldRect.Left;
t.y := OldRect.Top;
t.dx := OldRect.Right - OldRect.Left;
t.dy := OldRect.Bottom - OldRect.Top;
if (t is TfrBandView) and
(TfrBandView(t).BandType in [btCrossHeader..btCrossFooter]) and
(t.dx > Width - 10) then
t.dx := 40;
t.FrameWidth := LastFrameWidth;
t.FrameColor := LastFrameColor;
t.FillColor := LastFillColor;
t.Selected := True;
if t.Typ <> gtBand then
t.Frames:=LastFrames;
if t is TfrCustomMemoView then
begin
with t as TfrCustomMemoView do
begin
Font.Name := LastFontName;
Font.Size := LastFontSize;
Font.Color := LastFontColor;
Font.Style := frSetFontStyle(LastFontStyle);
Adjust := LastAdjust;
end;
end
else
if t is TfrControl then
TfrControl(T).UpdateControlPosition;
TfrDesignerForm(frDesigner).SelNum := 1;
NPRedrawViewCheckBand(t);
with FDesigner do
begin
SelectionChanged;
AddUndoAction(acInsert);
if EditAfterInsert then
ShowEditor;
end;
{$IFDEF DebugLR}
DebugLn('Object inserted end');
{$ENDIF}
end;
if not TfrDesignerForm(frDesigner).ObjRepeat then
begin
if FDesigner.Page is TfrPageReport then
FDesigner.OB1.Down := True
else
FDesigner.OB7.Down := True
end
else
NPEraseFocusRect;
{$IFDEF DebugLR}
DebugLnExit('Inserting a New Object DONE');
DebugLnExit('TfrDesignerPage.MUp DONE: Inserting ...');
{$ENDIF}
EnableEvents;
Exit;
end;
//line drawing
if Cursor = crPencil then
begin
DrawRectLine(OldRect);
AddObject(gtLine);
t.CreateUniqueName;
t.x := OldRect.Left; t.y := OldRect.Top;
t.dx := OldRect.Right - OldRect.Left;
t.dy := OldRect.Bottom - OldRect.Top;
if t.dx < 0 then
begin
t.dx := -t.dx; if Abs(t.dx) > Abs(t.dy) then t.x := OldRect.Right;
end;
if t.dy < 0 then
begin
t.dy := -t.dy; if Abs(t.dy) > Abs(t.dx) then t.y := OldRect.Bottom;
end;
t.Selected := True;
t.BeginUpdate;
t.FrameWidth := LastLineWidth;
t.FrameColor := LastFrameColor;
t.EndUpdate;
TfrDesignerForm(frDesigner).SelNum := 1;
NPRedrawViewCheckBand(t);
FDesigner.SelectionChanged;
FDesigner.AddUndoAction(acInsert);
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: Line Drawing');
{$ENDIF}
Exit;
end;
// calculating which objects contains in frame (if user select it with mouse+Ctrl key)
if RFlag then
begin
NPEraseFocusRect;
RFlag := False;
NormalizeRect(OldRect);
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
with OldRect do
begin
if t.Typ <> gtBand then
begin
if not ((t.x > Right) or (t.x + t.dx < Left) or
(t.y > Bottom) or (t.y + t.dy < Top)) then
begin
t.Selected := True;
Inc(TfrDesignerForm(frDesigner).SelNum);
end;
end;
end;
end;
GetMultipleSelected;
FDesigner.SelectionChanged;
NPDrawSelection;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: objects contained in frame');
{$ENDIF}
Exit;
end;
//splitting
if Moved and TfrDesignerForm(frDesigner).MRFlag and (Cursor = crHSplit) then
begin
with SplitInfo do
begin
dx := SplRect.Left - SplX;
if (View1.dx + dx > 0) and (View2.dx - dx > 0) then
begin
Inc(View1.dx, dx);
Inc(View2.x, dx);
Dec(View2.dx, dx);
end;
end;
GetMultipleSelected;
NPDrawLayerObjects(ClipRgn, TopSelected);
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: Splitting');
{$ENDIF}
Exit;
end;
//resizing several objects
if Moved and TfrDesignerForm(frDesigner).MRFlag and (Cursor <> crDefault) then
begin
{$ifdef ppaint}
NPDrawSelection;
DeleteObject(ClipRgn);
ClipRgn:=0;
{$else}
NPDrawLayerObjects(ClipRgn, TopSelected);
{$endif}
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE: resizing several objects');
{$ENDIF}
Exit;
end;
//redrawing all moved or resized objects
if not Moved then
begin
NPDrawSelection;
{$IFDEF DebugLR}
DebugLn('redrawing all moved or resized objects');
{$ENDIF}
end;
if (TfrDesignerForm(frDesigner).SelNum >= 1) and Moved then
begin
if TfrDesignerForm(frDesigner).SelNum > 1 then
begin
//JRA DebugLn('HERE, ClipRgn', Dbgs(ClipRgn));
{$ifdef ppaint}
NPDrawSelection;
if ClipRgn<>0 then
DeleteObject(ClipRgn);
ClipRgn:=0;
{$else}
NPDrawLayerObjects(ClipRgn, TopSelected);
{$endif}
GetMultipleSelected;
FDesigner.ShowPosition;
end
else
begin
t := TfrView(Objects[TopSelected]);
NormalizeCoord(t);
if Cursor <> crDefault then
t.Resized;
if T is TfrControl then
TfrControl(T).UpdateControlPosition;
{$ifdef ppaint}
NPDrawSelection;
if ClipRgn<>0 then
begin
DeleteObject(ClipRgn);
Invalidate;
end;
ClipRgn:=0;
{$else}
NPDrawLayerObjects(ClipRgn, TopSelected);
{$endif}
FDesigner.ShowPosition;
end;
end;
if (FDesigner.Page is TfrPageDialog) and (fResizeDialog ) then
begin
Width:=X;
Height:=Y;
fResizeDialog:=false;
Mode:=mdSelect;
FDesigner.Page.Width:=X;
FDesigner.Page.Height:=Y;
DrawPage(dmAll);
FDesigner.Modified:=true;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if T is TfrControl then
TfrControl(T).UpdateControlPosition;
end;
end;
Moved := False;
CT := ctNone;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MUp DONE');
{$ENDIF}
end;
procedure TfrDesignerPage.MMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
i, j, kx, ky, w, dx, dy: Integer;
t, t1, Bnd: TfrView;
nx, ny, x1, x2, y1, y2: Double;
hr, hr1,Hr2: HRGN;
function Cont(px, py, x, y: Integer): Boolean;
begin
Result := (x >= px - w) and (x <= px + w + 1) and
(y >= py - w) and (y <= py + w + 1);
end;
function GridCheck:Boolean;
begin
with FDesigner do
begin
Result := (kx >= GridSize) or (kx <= -GridSize) or
(ky >= GridSize) or (ky <= -GridSize);
if Result then
begin
kx := kx - kx mod GridSize;
ky := ky - ky mod GridSize;
end;
end;
end;
begin
{$IFDEF DebugLR}
DebugLnEnter('TfrDesignerPage.MMove(X=%d,Y=%d) INIT',[x,y]);
{$ENDIF}
Moved := True;
w := 2;
if FirstChange and Down and not RFlag then
begin
kx := x - LastX;
ky := y - LastY;
if not FDesigner.GridAlign or GridCheck then
begin
GetRegion; //JRA 1
FDesigner.AddUndoAction(acEdit);
end;
end;
if not Down then
begin
if FDesigner.panForDlg.Visible then
begin
if FDesigner.OB7.Down then
begin
Mode := mdSelect;
if (X > FDesigner.Page.Width - 10) and (X < FDesigner.Page.Width + 10) and (Y > FDesigner.Page.Height - 10) and (Y < FDesigner.Page.Height + 10) then
Cursor := crSizeNWSE
else
Cursor := crDefault;
end
else
begin
Mode := mdInsert;
if Cursor <> crCross then
begin
RoundCoord(x, y);
kx := Width; ky := 40;
// if not FDesigner.OB3.Down then
FDesigner.GetDefaultSize(kx, ky);
OldRect := Rect(x, y, x + kx, y + ky);
NPDrawFocusRect;
end;
Cursor := crCross;
end;
end
else
if FDesigner.OB6.Down then
begin
Mode := mdSelect;
Cursor := crPencil;
end
else
if FDesigner.OB1.Down then
begin
Mode := mdSelect;
Cursor := crDefault;
end
else
begin
Mode := mdInsert;
if Cursor <> crCross then
begin
RoundCoord(x, y);
kx := Width; ky := 40;
if not FDesigner.OB3.Down then
FDesigner.GetDefaultSize(kx, ky);
OldRect := Rect(x, y, x + kx, y + ky);
NPDrawFocusRect;
end;
Cursor := crCross;
end;
end;
{$IFDEF DebugLR}
DebugLn('Mode Insert=%s Down=%s',[dbgs(Mode=mdInsert),dbgs(Down)]);
{$ENDIF}
if (Mode = mdInsert) and not Down then
begin
NPEraseFocusRect;
RoundCoord(x, y);
OffsetRect(OldRect, x - OldRect.Left, y - OldRect.Top);
NPDrawFocusRect;
ShowSizes := True;
FDesigner.UpdateStatus;
ShowSizes := False;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: Mode Insert and not Down');
{$ENDIF}
Exit;
end;
//cursor shapes
if not Down and (TfrDesignerForm(frDesigner).SelNum = 1) and (Mode = mdSelect) and
not FDesigner.OB6.Down then
begin
t := TfrView(Objects[TopSelected]);
if Cont(t.x, t.y, x, y) or Cont(t.x + t.dx, t.y + t.dy, x, y) then
Cursor := crSizeNWSE
else if Cont(t.x + t.dx, t.y, x, y) or Cont(t.x, t.y + t.dy, x, y)then
Cursor := crSizeNESW
else if Cont(t.x + t.dx div 2, t.y, x, y) or Cont(t.x + t.dx div 2, t.y + t.dy, x, y) then
Cursor := crSizeNS
else if Cont(t.x, t.y + t.dy div 2, x, y) or Cont(t.x + t.dx, t.y + t.dy div 2, x, y) then
Cursor := crSizeWE
else
Cursor := crDefault;
end;
//selecting a lot of objects
if Down and RFlag then
begin
NPEraseFocusRect;
if Cursor = crCross then
RoundCoord(x, y);
OldRect := Rect(OldRect.Left, OldRect.Top, x, y);
NPDrawFocusRect;
ShowSizes := True;
if Cursor = crCross then
FDesigner.UpdateStatus;
ShowSizes := False;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: DOWN and RFLag (sel alot of objs)');
{$ENDIF}
Exit;
end;
//line drawing
if Down and (Cursor = crPencil) then
begin
kx := x - LastX;
ky := y - LastY;
if FDesigner.GridAlign and not GridCheck then begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: not gridcheck and gridalign');
{$ENDIF}
Exit;
end;
DrawRectLine(OldRect);
OldRect := Rect(OldRect.Left, OldRect.Top, OldRect.Right + kx, OldRect.Bottom + ky);
DrawRectLine(OldRect);
Inc(LastX, kx);
Inc(LastY, ky);
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: Line drawing');
{$ENDIF}
Exit;
end;
//check for multiple selected objects - right-bottom corner
if not Down and (TfrDesignerForm(frDesigner).SelNum > 1) and (Mode = mdSelect) then
begin
t := TfrView(Objects[RightBottom]);
if Cont(t.x + t.dx, t.y + t.dy, x, y) then
Cursor := crSizeNWSE
end;
//split checking
if not Down and (TfrDesignerForm(frDesigner).SelNum > 1) and (Mode = mdSelect) then
begin
for i := 0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
if (t.Typ <> gtBand) and t.Selected then
if (x >= t.x) and (x <= t.x + t.dx) and (y >= t.y) and (y <= t.y + t.dy) then
begin
for j := 0 to Objects.Count - 1 do
begin
t1 := TfrView(Objects[j]);
if (t1.Typ <> gtBand) and (t1 <> t) and t1.Selected then
if ((t.x = t1.x + t1.dx) and ((x >= t.x) and (x <= t.x + 2))) or
((t1.x = t.x + t.dx) and ((x >= t1.x - 2) and (x <= t.x))) then
begin
Cursor := crHSplit;
with SplitInfo do
begin
SplRect := Rect(x, t.y, x, t.y + t.dy);
if t.x = t1.x + t1.dx then
begin
SplX := t.x;
View1 := t1;
View2 := t;
end
else
begin
SplX := t1.x;
View1 := t;
View2 := t1;
end;
SplRect.Left := SplX;
SplRect.Right := SplX;
end;
end;
end;
end;
end;
end;
// splitting
if Down and TfrDesignerForm(frDesigner).MRFlag and (Mode = mdSelect) and (Cursor = crHSplit) then
begin
kx := x - LastX;
ky := 0;
if FDesigner.GridAlign and not GridCheck then begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: Splitting not grid check');
{$ENDIF}
Exit;
end;
with SplitInfo do
begin
DrawHSplitter(SplRect);
SplRect := Rect(SplRect.Left + kx, SplRect.Top, SplRect.Right + kx, SplRect.Bottom);
DrawHSplitter(SplRect);
end;
Inc(LastX, kx);
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: Splitting');
{$ENDIF}
Exit;
end;
// sizing several objects
if Down and TfrDesignerForm(frDesigner).MRFlag and (Mode = mdSelect) and (Cursor <> crDefault) then
begin
kx := x - LastX;
ky := y - LastY;
if FDesigner.GridAlign and not GridCheck then begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: sizing seveal, not gridcheck');
{$ENDIF}
Exit;
end;
if FDesigner.ShapeMode = smFrame then
DrawPage(dmShape)
else
begin
hr := CreateRectRgn(0, 0, 0, 0);
hr1 := CreateRectRgn(0, 0, 0, 0);
end;
OldRect := Rect(OldRect.Left, OldRect.Top, OldRect.Right + kx, OldRect.Bottom + ky);
nx := (OldRect.Right - OldRect.Left) / (OldRect1.Right - OldRect1.Left);
ny := (OldRect.Bottom - OldRect.Top) / (OldRect1.Bottom - OldRect1.Top);
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if (t.Selected) and not (lrrDontSize in T.Restrictions) then
begin
if FDesigner.ShapeMode = smAll then
AddRgn(hr, t);
x1 := (t.OriginalRect.Left - LeftTop.x) * nx;
x2 := t.OriginalRect.Right * nx;
dx := Round(x1 + x2) - (Round(x1) + Round(x2));
t.x := LeftTop.x + Round(x1);
t.dx := Round(x2) + dx;
y1 := (t.OriginalRect.Top - LeftTop.y) * ny;
y2 := t.OriginalRect.Bottom * ny;
dy := Round(y1 + y2) - (Round(y1) + Round(y2));
t.y := LeftTop.y + Round(y1);
t.dy := Round(y2) + dy;
if FDesigner.ShapeMode = smAll then
AddRgn(hr1, t);
end;
end;
if FDesigner.ShapeMode = smFrame then
DrawPage(dmShape)
else
begin
NPDrawLayerObjects(hr);
NPDrawLayerObjects(hr1);
end;
Inc(LastX, kx);
Inc(LastY, ky);
FDesigner.UpdateStatus;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: Sizing several objects');
{$ENDIF}
Exit;
end;
//moving
if Down and (Mode = mdSelect) and (TfrDesignerForm(frDesigner).SelNum >= 1) and (Cursor = crDefault) then
begin
kx := x - LastX;
ky := y - LastY;
if FDesigner.GridAlign and not GridCheck then begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: moving');
{$ENDIF}
Exit;
end;
if FirstBandMove and (TfrDesignerForm(frDesigner).SelNum = 1) and ((kx <> 0) or (ky <> 0)) and
not (ssAlt in Shift) then
begin
if Assigned(Objects[TopSelected]) and (TFrView(Objects[TopSelected]).Typ = gtBand) then
begin
Bnd := TfrView(Objects[TopSelected]);
for i := 0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
if t.Typ <> gtBand then
begin
if (t.x >= Bnd.x) and (t.x + t.dx <= Bnd.x + Bnd.dx) and
(t.y >= Bnd.y) and (t.y + t.dy <= Bnd.y + Bnd.dy) then
begin
t.Selected := True;
Inc(TfrDesignerForm(frDesigner).SelNum);
end;
end;
end;
ColorLocked := True;
FDesigner.SelectionChanged;
GetMultipleSelected;
ColorLocked := False;
end;
end;
FirstBandMove := False;
MoveResize(kx,ky,FDesigner.ShapeMode=smFrame, false);
Inc(LastX, kx);
Inc(LastY, ky);
FDesigner.UpdateStatus;
end;
{$IFDEF DebugLR}
// else debugLn('Down=',BoolToStr(Down),' Mode=',IntToStr(Ord(Mode)),' SelNum=',IntToStr(Selnum),' Cursor=',IntToStr(Cursor));
{$ENDIF}
//resizing
if Down and (Mode = mdSelect) and (TfrDesignerForm(frDesigner).SelNum = 1) and (Cursor <> crDefault) then
begin
kx := x - LastX;
ky := y - LastY;
if FDesigner.GridAlign and not GridCheck then begin
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove DONE: resizing');
{$ENDIF}
Exit;
end;
t := TfrView(Objects[TopSelected]);
if (lrrDontSize in T.Restrictions) then
exit;
if FDesigner.ShapeMode = smFrame then
DrawPage(dmShape)
else
hr:=t.GetClipRgn(rtExtended);
w := 3;
if Cursor = crSizeNWSE then
begin
if (CT <> ct2) and ((CT = ct1) or Cont(t.x, t.y, LastX, LastY)) then
begin
t.x := t.x + kx;
t.dx := t.dx - kx;
t.y := t.y + ky;
t.dy := t.dy - ky;
CT := ct1;
end
else
begin
t.dx := t.dx + kx;
t.dy := t.dy + ky;
CT := ct2;
end;
end;
if Cursor = crSizeNESW then
begin
if (CT <> ct4) and ((CT = ct3) or Cont(t.x + t.dx, t.y, LastX, LastY)) then
begin
t.y := t.y + ky;
t.dx := t.dx + kx;
t.dy := t.dy - ky;
CT := ct3;
end
else
begin
t.x := t.x + kx;
t.dx := t.dx - kx;
t.dy := t.dy + ky;
CT := ct4;
end;
end;
if Cursor = crSizeWE then
begin
if (CT <> ct6) and ((CT = ct5) or Cont(t.x, t.y + t.dy div 2, LastX, LastY)) then
begin
t.x := t.x + kx;
t.dx := t.dx - kx;
CT := ct5;
end
else
begin
t.dx := t.dx + kx;
CT := ct6;
end;
end;
if Cursor = crSizeNS then
begin
if (CT <> ct8) and ((CT = ct7) or Cont(t.x + t.dx div 2, t.y, LastX, LastY)) then
begin
t.y := t.y + ky;
t.dy := t.dy - ky;
CT := ct7;
end
else
begin
t.dy := t.dy + ky;
CT := ct8;
end;
end;
if FDesigner.ShapeMode = smFrame then
begin
DrawPage(dmShape);
{$IFDEF DebugLR}
DebugLn('MDown resizing 1');
{$ENDIF}
end
else
begin
Hr1:=CreateRectRgn(0,0,0,0);
Hr2:=t.GetClipRgn(rtExtended);
CombineRgn(hr1, hr, hr2, RGN_OR);
DeleteObject(Hr2);
NPDrawLayerObjects(hr1);
DeleteObject(Hr);
{$IFDEF DebugLR}
DebugLn('MDown resizing 2');
{$ENDIF}
end;
Inc(LastX, kx);
Inc(LastY, ky);
end;
if fResizeDialog then
begin
Width:=X;
Height:=Y;
FDesigner.Page.Width:=X;
FDesigner.Page.Height:=Y;
DrawPage(dmAll);
// Invalidate;
// DrawDialog(0,0);
end;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.MMove END');
{$ENDIF}
end;
procedure TfrDesignerPage.DClick(Sender: TObject);
begin
{$IFDEF DebugLR}
DebugLnEnter('TfrDesignerPage.DClick INIT DFlag=%s',[dbgs(DFlag)]);
{$ENDIF}
Down := False;
if TfrDesignerForm(frDesigner).SelNum = 0 then
begin
if FDesigner.Page is TfrPageDialog then
FDesigner.ShowEditor
else
FDesigner.PgB3Click(nil);
DFlag := True;
end
else
if TfrDesignerForm(frDesigner).SelNum = 1 then
begin
DFlag := True;
FDesigner.ShowEditor;
end;
{$IFDEF DebugLR}
DebugLnExit('TfrDesignerPage.DClick DONE DFlag=%s',[dbgs(DFlag)]);
{$ENDIF}
end;
procedure TfrDesignerPage.MoveResize(Kx, Ky: Integer; UseFrames,AResize: boolean);
var
hr,hr1: HRGN;
i: Integer;
t: TFrView;
begin
If UseFrames then
DrawPage(dmShape)
else
begin
hr := CreateRectRgn(0, 0, 0, 0);
hr1 := CreateRectRgn(0, 0, 0, 0);
end;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if (not t.Selected) or (AResize and (lrrDontSize in T.Restrictions)) or
((lrrDontMove in T.Restrictions) and not AResize) then
continue;
if FDesigner.ShapeMode = smAll then
AddRgn(hr, t);
if aResize then
begin
t.dx := t.dx + kx;
t.dy := t.dy + ky;
end
else
begin
t.x := t.x + kx;
t.y := t.y + ky;
end;
if FDesigner.ShapeMode = smAll then
AddRgn(hr1, t);
end;
if UseFrames then
DrawPage(dmShape)
else
begin
CombineRgn(hr, hr, hr1, RGN_OR);
DeleteObject(hr1);
NPDrawLayerObjects(hr);
end;
end;
procedure TfrDesignerPage.EnableEvents(aOk: boolean);
begin
if aOk then
begin
OnMouseDown := @MDown;
OnMouseUp := @MUp;
OnMouseMove := @MMove;
OnDblClick := @DClick;
end else
begin
OnMouseDown := nil;
OnMouseUp := nil;
OnMouseMove := nil;
OnDblClick := nil;
end;
end;
procedure TfrDesignerPage.NPDrawFocusRect;
begin
{$ifdef ppaint}
fPaintSel.FocusRect(OldRect);
{$else}
DrawFocusRect(OldRect);
{$endif}
end;
procedure TfrDesignerPage.NPEraseFocusRect;
begin
{$ifdef ppaint}
fPaintSel.RemoveFocusRect;
{$else}
DrawFocusRect(OldRect);
{$endif}
end;
procedure TfrDesignerPage.NPDrawLayerObjects(Rgn: HRGN; Start:Integer=10000);
{$ifdef ppaint}
var
R: HRGN;
t: TfrView;
i: Integer;
{$endif}
begin
{$ifdef ppaint}
if Rgn = 0 then
begin
// here just make sure all objects, starting at Start
// are invalidated so in next paint cycle they are drawn
Rgn := CreateRectRgn(0, 0, 0, 0);
for i := Objects.Count-1 downto 0 do
if i<=Start then begin
t := TfrView(Objects[i]);
R := t.GetClipRgn(rtNormal);
CombineRgn(Rgn, Rgn, R, RGN_OR);
DeleteObject(R);
end;
end;
InvalidateRgn(Handle, Rgn, false);
DeleteObject(Rgn);
if Rgn=ClipRgn then
ClipRgn := 0;
SelectClipRgn(Canvas.Handle, 0);
{$else}
Draw(Start, Rgn);
{$endif}
end;
procedure TfrDesignerPage.NPDrawSelection;
begin
{$ifdef ppaint}
fPaintSel.InvalidateSelection;
{$else}
DrawPage(dmSelection);
{$endif}
end;
procedure TfrDesignerPage.NPPaintSelection;
begin
{$ifdef ppaint}
fPaintSel.PaintSelection;
{$else}
DrawPage(dmSelection);
{$endif}
end;
procedure TfrDesignerPage.NPEraseSelection;
begin
{$ifdef ppaint}
fPaintSel.InvalidateSelection;
{$else}
DrawPage(dmSelection);
{$endif}
end;
procedure TfrDesignerPage.NPRedrawViewCheckBand(t: TfrView);
begin
{$ifdef ppaint}
if t.typ = gtBand then
NPDrawLayerObjects(t.GetClipRgn(rtExtended))
else
fPaintSel.InvalidateSelection;
{$else}
if t.Typ = gtBand then
begin
{$IFDEF DebugLR}
DebugLn('A new band was inserted');
{$ENDIF}
Draw(10000, t.GetClipRgn(rtExtended))
end
else
begin
t.Draw(Canvas);
DrawSelection(t);
end;
{$endif}
end;
procedure TfrDesignerPage.CMMouseLeave(var Message: TLMessage);
begin
if (Mode = mdInsert) and not Down then
begin
NPEraseFocusRect;
OffsetRect(OldRect, -10000, -10000);
end;
end;
{-----------------------------------------------------------------------------}
procedure BDown(SB: TSpeedButton);
begin
SB.Down := True;
end;
procedure BUp(SB: TSpeedButton);
begin
SB.Down := False;
end;
{
function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data: Pointer): Integer; stdcall;
begin
TfrDesignerForm(frDesigner).C2.Items.AddObject(StrPas(LogFont.lfFaceName), TObject(FontType));
Result := 1;
end;
}
function EnumFontsProc(
var LogFont: TEnumLogFontEx;
var {%H-}Metric: TNewTextMetricEx;
FontType: Longint;
{%H-}Data: LParam):LongInt; stdcall;
var
S: String;
Lst: TStrings;
begin
s := StrPas(LogFont.elfLogFont.lfFaceName);
Lst := TStrings(PtrInt(Data));
if Lst.IndexOf(S)<0 then
Lst.AddObject(S, TObject(PtrInt(FontType)));
Result := 1;
end;
constructor TfrDesignerForm.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
fInBuildPage:=False;
{$IFDEF STDOI}
// create the ObjectInspector
PropHook:= TPropertyEditorHook.Create;
ObjInsp := TObjectInspector.Create(Self);
ObjInsp.SetInitialBounds(10,10,220,400);
ObjInsp.ShowComponentTree := False;
ObjInsp.ShowFavoritePage := False;
ObjInsp.PropertyEditorHook := PropHook;
{$ELSE}
ObjInsp := TFrObjectInspector.Create(Self);
ObjInsp.SetModifiedEvent(@OnModify);
{$ENDIF}
{$ifdef sbod}
StatusBar1.Panels[1].Style := psOwnerDraw;
StatusBar1.OnDrawPanel := @StatusBar1Drawpanel;
Panel7.Visible := false;
{$endif}
end;
destructor TfrDesignerForm.Destroy;
begin
{$IFDEF EXTOI}
ObjInsp.Free;
{$ENDIF}
{$IFDEF STDOI}
PropHook.Free;
{$ENDIF}
inherited Destroy;
end;
procedure TfrDesignerForm.GetFontList;
var
DC: HDC;
Lf: TLogFont;
S: String;
{$IFDEF USE_PRINTER_FONTS}
Lst: TStrings;
i: Integer;
j: PtrInt;
{$ENDIF}
begin
C2.Items.Clear;
DC := GetDC(0);
try
Lf.lfFaceName := '';
Lf.lfCharSet := DEFAULT_CHARSET;
Lf.lfPitchAndFamily := 0;
EnumFontFamiliesEx(DC, @Lf, @EnumFontsProc, PtrInt(C2.Items), 0);
finally
ReleaseDC(0, DC);
end;
{$IFDEF USE_PRINTER_FONTS}
if not CurReport.PrintToDefault then
begin
// we could use prn.Printer.Fonts but we would be tied to
// implementation detail of list.objects[] encoded with fonttype
// that's why we collect the fonts ourselves here
//
Lst := TStringList.Create;
try
EnumFontFamiliesEx(Prn.Printer.Canvas.Handle, @Lf, @EnumFontsProc, PtrInt(Lst), 0);
for i:=0 to Lst.Count-1 do
if C2.Items.IndexOf(Lst[i])<0 then begin
j := PtrInt(Lst.Objects[i]) or $100;
C2.Items.AddObject(Lst[i], TObject(j));
end;
finally
Lst.free;
end;
end;
{$ENDIF}
if (SelNum>0) and (FirstSelected is TfrCustomMemoView) then
begin
// font of selected memo has preference, select it
LastFontname := TfrCustomMemoView(FirstSelected).Font.Name;
LastFontSize := TfrCustomMemoView(FirstSelected).Font.Size;
end else
if C2.Items.IndexOf(LastFontName)>=0 then
// last font name remains valid, keep it together with lastFontSize
else begin
// setup an initial font name and size
if C2.Items.Count>0 then
LastFontName := C2.Items[0]
else
LastFontName := '';
if C2.Items.IndexOf('Arial') <> -1 then
LastFontName := 'Arial'
else if C2.Items.IndexOf('helvetica [urw]')<>-1 then
LastFontName := 'helvetica [urw]'
else if C2.Items.IndexOf('Arial Cyr') <> -1 then
LastFontName := 'Arial Cyr';
LastFontSize := 10;
end;
end;
procedure TfrDesignerForm.FormCreate(Sender: TObject);
var
i: Integer;
begin
FGridSize := 4;
FGridAlign := True;
FGridShow := False; //True;
FUnits := TfrReportUnits(0);
EditAfterInsert := True;
ShapeMode := TfrShapeMode(1);
Busy := True;
FirstTime := True;
// FirstInstance := FirstInst;
PageView := TfrDesignerPage.Create(Self{ScrollBox1});
PageView.Parent := ScrollBox1;
PageView.FDesigner := Self;
PageView.PopupMenu := Popup1;
PageView.ShowHint := True;
PageView.OnDragDrop:=@ScrollBox1DragDrop;
PageView.OnDragOver:=@ScrollBox1DragOver;
ColorSelector := TColorSelector.Create(Self);
ColorSelector.OnColorSelected := @ColorSelected;
ColorSelector.Hide;
for i := 0 to frAddInsCount - 1 do
with frAddIns[i] do
begin
if Assigned(frAddIns[i].InitializeProc) then
frAddIns[i].InitializeProc;
RegisterObject(ButtonBMP, ButtonHint, Integer(gtAddIn) + i, ObjectType);
end;
for i := 0 to frToolsCount - 1 do
RegisterTool(frTools[i].Caption, frTools[i].ButtonBMP, frTools[i].OnClick);
EditorForm := TfrEditorForm.Create(nil);
MenuItems := TFpList.Create;
ItemWidths := TStringlist.Create;
{
if FirstInstance then
begin
//** Application.OnActivate := OnActivateApp;
//** Application.OnDeactivate := OnDeactivateApp;
end
else
begin
PgB1.Enabled := False;
PgB2.Enabled := False;
N41.Enabled := False;
N43.Enabled := False;
N29.Enabled := False;
N30.Enabled := False;
end;
FirstInst := False;
}
FCaption := sFRDesignerFormCapt;
//Panel1.Caption := sFRDesignerFormrect;
//Panel2.Caption := sFRDesignerFormStd;
//Panel3.Caption := sFRDesignerFormText;
//Panel5.Caption := sFRDesignerFormAlign;
//Panel6.Caption := sFRDesignerFormTools;
FileBtn1.Hint := sFRDesignerFormNewRp;
//FileBtn2.Hint := sFRDesignerFormOpenRp;
FileOpen.Hint:= sFRDesignerFormOpenRp;
FileOpen.Caption:= sFRDesignerForm_Open;
FileSave.Hint:= sFRDesignerFormSaveRp;
FilePreview.Hint := sFRDesignerFormPreview;
CutB.Hint := sFRDesignerFormCut;
CopyB.Hint := sFRDesignerFormCopy;
PstB.Hint := sFRDesignerFormPast;
UndoB.Hint := sFRDesignerFormUndo;
RedoB.Hint := sFRDesignerFormRedo;
ZB1.Hint := sFRDesignerFormBring;
ZB2.Hint := sFRDesignerFormBack;
SelAllB.Hint := sFRDesignerFormSelectAll;
PgB1.Hint := sFRDesignerFormAddPg;
PgB2.Hint := sFRDesignerFormRemovePg;
PgB3.Hint := sFRDesignerFormPgOption;
GB1.Hint := sFRDesignerFormGrid;
GB2.Hint := sFRDesignerFormGridAlign;
GB3.Hint := sFRDesignerFormFitGrid;
HelpBtn.Hint := sPreviewFormHelp;
ExitB.Caption := sFRDesignerFormClose;
ExitB.Hint := sFRDesignerFormCloseDesigner;
AlB1.Hint := sFRDesignerFormLeftAlign;
AlB2.Hint := sFRDesignerFormRightAlign;
AlB3.Hint := sFRDesignerFormCenerAlign;
AlB4.Hint := sFRDesignerFormNormalText;
AlB5.Hint := sFRDesignerFormVertCenter;
AlB6.Hint := sFRDesignerFormTopAlign;
AlB7.Hint := sFRDesignerFormBottomAlign;
AlB8.Hint := sFRDesignerFormWidthAlign;
FnB1.Hint := sFRDesignerFormBold;
FnB2.Hint := sFRDesignerFormItalic;
FnB3.Hint := sFRDesignerFormUnderLine;
ClB2.Hint := sFRDesignerFormFont;
HlB1.Hint := sFRDesignerFormHightLight;
C3.Hint := sFRDesignerFormFontSize;
C2.Hint := sFRDesignerFormFontName;
FrB1.Hint := sFRDesignerFormTopFrame;
FrB2.Hint := sFRDesignerFormleftFrame;
FrB3.Hint := sFRDesignerFormBottomFrame;
FrB4.Hint := sFRDesignerFormRightFrame;
FrB5.Hint := sFRDesignerFormAllFrame;
FrB6.Hint := sFRDesignerFormNoFrame;
ClB1.Hint := sFRDesignerFormBackColor;
ClB3.Hint := sFRDesignerFormFrameColor;
E1.Hint := sFRDesignerFormFrameWidth;
OB1.Hint := sFRDesignerFormSelObj;
OB2.Hint := sFRDesignerFormInsRect;
OB3.Hint := sFRDesignerFormInsBand;
OB4.Hint := sFRDesignerFormInsPict;
OB5.Hint := sFRDesignerFormInsSub;
OB6.Hint := sFRDesignerFormDrawLine;
Align1.Hint := sFRDesignerFormAlignLeftedge;
Align2.Hint := sFRDesignerFormAlignHorzCenter;
Align3.Hint := sFRDesignerFormCenterHWind;
Align4.Hint := sFRDesignerFormSpace;
Align5.Hint := sFRDesignerFormAlignRightEdge;
Align6.Hint := sFRDesignerFormAligneTop;
Align7.Hint := sFRDesignerFormAlignVertCenter;
Align8.Hint := sFRDesignerFormCenterVertWing;
Align9.Hint := sFRDesignerFormSpaceEqVert;
Align10.Hint := sFRDesignerFormAlignBottoms;
N2.Caption := sFRDesignerForm_Cut;
N1.Caption := sFRDesignerForm_Copy;
N3.Caption := sFRDesignerForm_Paste;
N5.Caption := sFRDesignerForm_Delete;
N16.Caption := sFRDesignerForm_SelectAll;
N6.Caption := sFRDesignerForm_Edit;
FileMenu.Caption := sFRDesignerForm_File;
N23.Caption := sFRDesignerForm_New;
//N19.Caption := sFRDesignerForm_Open;
//N20.Caption := sFRDesignerForm_Save;
//N17.Caption := sFRDesignerForm_SaveAs;
FileSaveAs.Caption:= sFRDesignerForm_Save;
FileSaveAs.Caption:= sFRDesignerForm_SaveAs;
FileBeforePrintScript.Caption := sFRDesignerForm_BeforePrintScript;
N42.Caption := sFRDesignerForm_Var;
N8.Caption := sFRDesignerForm_RptOpt;
N25.Caption := sFRDesignerForm_PgOpt;
N39.Caption := sFRDesignerForm_preview;
N10.Caption := sFRDesignerForm_Exit;
EditMenu.Caption := sFRDesignerForm_Edit2;
N46.Caption := sFRDesignerForm_Undo;
N48.Caption := sFRDesignerForm_Redo;
N11.Caption := sFRDesignerForm_Cut;
N12.Caption := sFRDesignerForm_Copy;
N13.Caption := sFRDesignerForm_Paste;
N27.Caption := sFRDesignerForm_Delete;
N28.Caption := sFRDesignerForm_SelectAll;
N36.Caption := sFRDesignerForm_Editp;
N29.Caption := sFRDesignerForm_AddPg;
N30.Caption := sFRDesignerForm_RemovePg;
N32.Caption := sFRDesignerForm_Bring;
N33.Caption := sFRDesignerForm_Back;
ToolMenu.Caption := sFRDesignerForm_Tools;
N37.Caption := sFRDesignerForm_ToolBars;
MastMenu.Caption := sFRDesignerForm_Tools2;
N14.Caption := sFRDesignerForm_Opts;
Pan1.Caption := sFRDesignerForm_Rect;
Pan2.Caption := sFRDesignerForm_Std;
Pan3.Caption := sFRDesignerForm_Text;
Pan4.Caption := sFRDesignerForm_Obj;
Pan5.Caption := sFRDesignerForm_Insp;
Pan6.Caption := sFRDesignerForm_AlignPalette;
Pan7.Caption := sFRDesignerForm_Tools3;
MenuItem2.Caption:= sFRDesignerForm_DataInsp;
N34.Caption := sFRDesignerForm_About;
N22.Caption := sFRDesignerForm_Help1;
N35.Caption := sFRDesignerForm_Help2;
StB1.Hint := sFRDesignerForm_Line;
//** FnB1.Glyph.Handle := LoadBitmap(hInstance, 'FR_BOLD');
//** FnB2.Glyph.Handle := LoadBitmap(hInstance, 'FR_ITALIC');
//** FnB3.Glyph.Handle := LoadBitmap(hInstance, 'FR_UNDRLINE');
N41.Caption := N29.Caption;
N41.OnClick := N29.OnClick;
N43.Caption := N30.Caption;
N43.OnClick := N30.OnClick;
N44.Caption := N25.Caption;
N44.OnClick := N25.OnClick;
end;
procedure TfrDesignerForm.C2GetItems(Sender: TObject);
var
i: Integer;
begin
if C2.Items.Count=0 then begin
Screen.Cursor := crHourglass;
GetFontList;
i := C2.Items.IndexOf(LastFontName);
if i<>-1 then
C2.ItemIndex := i;
Screen.Cursor := crDefault;
end;
end;
procedure TfrDesignerForm.FileBeforePrintScriptExecute(Sender: TObject);
begin
EditorForm.View := nil;
EditorForm.M2.Lines.Assign(CurReport.Script);
EditorForm.MemoPanel.Visible:=false;
EditorForm.CB1.OnClick:=nil;
EditorForm.CB1.Checked:=true;
EditorForm.CB1.OnClick:=@EditorForm.CB1Click;
EditorForm.ScriptPanel.Align:=alClient;
if EditorForm.ShowModal = mrOk then
begin
CurReport.Script.Assign(EditorForm.M2.Lines);
end;
EditorForm.ScriptPanel.Align:=alBottom;
EditorForm.MemoPanel.Visible:=true;
end;
procedure TfrDesignerForm.FileOpenExecute(Sender: TObject);
var
FRepName:string;
begin
if CheckFileModified=mrCancel then
exit;
if Assigned(frDesignerComp) and Assigned(frDesignerComp.FOnLoadReport) then
begin
FRepName:='';
frDesignerComp.FOnLoadReport(CurReport, FRepName);
FCurDocFileType := dtLazReportForm;
CurDocName := FRepName;
end
else
with OpenDialog1 do
begin
Filter := sFormFile + ' (*.frf)|*.frf|' +
sLazFormFile + ' (*.lrf)|*.lrf' +
'';
InitialDir:=ExtractFilePath(ParamStrUTF8(0));
FileName := CurDocName;
FilterIndex := 2;
if Execute then
begin
ClearUndoBuffer;
CurDocName := OpenDialog1.FileName;
case FilterIndex of
1: // fastreport form format
begin
CurReport.LoadFromFile(CurDocName);
FCurDocFileType := dtFastReportForm;
end;
2: // lasreport form xml format
begin
CurReport.LoadFromXMLFile(CurDocName);
FCurDocFileType := dtLazReportForm;
end;
else
raise Exception.Create('Unrecognized file format');
end;
//FileModified := False;
Modified := False;
CurPage := 0; // do all
end;
end;
end;
procedure TfrDesignerForm.FilePreviewExecute(Sender: TObject); // preview
var
v1, v2: Boolean;
TestRepStream:TMemoryStream;
Rep, SaveR:TfrReport;
procedure DoClearFormsName;
var
i:integer;
begin
for i:=0 to CurReport.Pages.Count - 1 do
if CurReport.Pages[i] is TfrPageDialog then
TfrPageDialog(CurReport.Pages[i]).Form.Name:='';
end;
procedure DoResoreFormsName;
var
i:integer;
begin
for i:=0 to CurReport.Pages.Count - 1 do
if CurReport.Pages[i] is TfrPageDialog then
TfrPageDialog(CurReport.Pages[i]).Form.Name:=TfrPageDialog(CurReport.Pages[i]).Name;
end;
begin
if CurReport is TfrCompositeReport then Exit;
Application.ProcessMessages;
SaveR:=CurReport;
TestRepStream:=TMemoryStream.Create;
CurReport.SaveToXMLStream(TestRepStream);
TestRepStream.Position:=0;
// DoClearFormsName;
CurReport:=nil;
Rep:=TfrReport.Create(SaveR.Owner);
Rep.OnBeginBand:=SaveR.OnBeginBand;
Rep.OnBeginColumn:=SaveR.OnBeginColumn;
Rep.OnBeginDoc:=SaveR.OnBeginDoc;
Rep.OnBeginPage:=SaveR.OnBeginPage;
Rep.OnDBImageRead:=SaveR.OnDBImageRead;
Rep.OnEndBand:=SaveR.OnEndBand;
Rep.OnEndDoc:=SaveR.OnEndDoc;
Rep.OnEndPage:=SaveR.OnEndPage;
Rep.OnEnterRect:=SaveR.OnEnterRect;
Rep.OnExportFilterSetup:=SaveR.OnExportFilterSetup;
Rep.OnGetValue:=SaveR.OnGetValue;
Rep.OnManualBuild:=SaveR.OnManualBuild;
Rep.OnMouseOverObject:=SaveR.OnMouseOverObject;
Rep.OnObjectClick:=SaveR.OnObjectClick;
Rep.OnPrintColumn:=SaveR.OnPrintColumn;
Rep.OnProgress:=SaveR.OnProgress;
Rep.OnUserFunction:=SaveR.OnUserFunction;
try
Rep.LoadFromXMLStream(TestRepStream);
Rep.ShowReport;
FreeAndNil(Rep)
except
on E:Exception do
begin
ShowMessage(E.Message);
if Assigned(Rep) then
FreeAndNil(Rep)
end;
end;
TestRepStream.Free;
CurReport:=SaveR;
CurPage := 0;
// DoResoreFormsName;
end;
procedure TfrDesignerForm.FileSaveAsExecute(Sender: TObject);
var
s: String;
begin
WasOk := False;
if Assigned(frDesignerComp) and Assigned(frDesignerComp.FOnSaveReport) then
begin
S:='';
frDesignerComp.FOnSaveReport(CurReport, S, true, WasOk);
if WasOk then
begin
CurDocName:=S;
Modified:=false;
end;
end
else
begin
with SaveDialog1 do
begin
Filter := sFormFile + ' (*.frf)|*.frf|' +
sTemplFile + ' (*.frt)|*.frt|' +
sLazFormFile + ' (*.lrf)|*.lrf|' +
sLazTemplateFile + ' (*.lrt)|*.lrt';
InitialDir:=ExtractFilePath(ParamStrUTF8(0));
FileName := CurDocName;
FilterIndex := 3;
if Execute then
FCurDocFileType := FilterIndex;
case FCurDocFileType of
dtFastReportForm:
begin
s := ChangeFileExt(FileName, '.frf');
CurReport.SaveToFile(s);
CurDocName := s;
WasOk := True;
end;
dtFastReportTemplate,
dtLazReportTemplate:
begin
if FCurDocFileType = dtLazReportTemplate then
s := ExtractFileName(ChangeFileExt(FileName, '.lrt'))
else
s := ExtractFileName(ChangeFileExt(FileName, '.frt'));
if frTemplateDir <> '' then
s := AppendPathDelim(frTemplateDir) + s;
frTemplNewForm := TfrTemplNewForm.Create(nil);
if frTemplNewForm.ShowModal = mrOk then
begin
if frTemplateDir<>'' then
begin
if not DirectoryExistsUTF8(frTemplateDir) then begin
if not ForceDirectoriesUTF8(frTemplateDir) then begin
ShowMessage(sFrDesignerFormUnableToCreateTemplateDir);
exit;
end;
end;
end;
if FCurDocFileType = dtLazReportTemplate then
CurReport.SaveTemplateXML(s, frTemplNewForm.Memo1.Lines, frTemplNewForm.Image1.Picture.Bitmap)
else
CurReport.SaveTemplate(s, frTemplNewForm.Memo1.Lines, frTemplNewForm.Image1.Picture.Bitmap);
WasOk := True;
end;
frTemplNewForm.Free;
end;
dtLazReportForm: // lasreport form xml format
begin
s := ChangeFileExt(FileName, '.lrf');
CurReport.SaveToXMLFile(s);
CurDocName := s;
WasOk := True;
end;
end;
end;
end;
end;
procedure TfrDesignerForm.FileSaveExecute(Sender: TObject);
var
S:string;
F:boolean;
begin
if CurDocName <> sUntitled then
begin
if Assigned(frDesignerComp) and Assigned(frDesignerComp.FOnSaveReport) then
begin
S:=CurDocName;
F:=false;
frDesignerComp.FOnSaveReport(CurReport, S, false, F);
if F then
begin
CurDocName:=S;
Modified := False;
end;
end
else
begin
if FCurDocFileType=dtLazReportForm then
CurReport.SaveToXMLFile(curDocName)
else
CurReport.SaveToFile(CurDocName);
Modified := False;
end;
end
else
FileSaveAs.Execute;
end;
procedure TfrDesignerForm.acDuplicateExecute(Sender: TObject);
begin
DuplicateSelection;
end;
procedure TfrDesignerForm.acToggleFramesExecute(Sender: TObject);
begin
if DelEnabled then
ViewsAction(nil, @ToggleFrames, -1);
end;
procedure TfrDesignerForm.FormShow(Sender: TObject);
var
CursorImage: TCursorImage;
begin
CursorImage := TCursorImage.Create;
try
CursorImage.LoadFromResourceName(hInstance, 'FR_PENCIL');
Screen.Cursors[crPencil] := CursorImage.ReleaseHandle;
finally
CursorImage.Free;
end;
{$ifndef sbod}
Panel7.Hide;
{$endif}
if FirstTime then
SetMenuBitmaps;
FirstTime := False;
// FileBtn1.Enabled := FirstInstance;
FilePreview.Enabled := {FirstInstance and }not (CurReport is TfrCompositeReport);
{ N23.Enabled := FirstInstance;
OB3.Enabled := FirstInstance;
OB5.Enabled := FirstInstance;}
ClearUndoBuffer;
ClearRedoBuffer;
Modified := False;
//FileModified := False;
Busy := True;
DocMode := dmDesigning;
//if C2.Items.Count=0 then
// GetFontList; // defered to speed loading
LastFontSize := 10;
{$IFDEF WIN32}
LastFontName := 'Arial';
{$ELSE}
LastFontName := 'helvetica [urw]';
{$ENDIF}
//** C2.Perform(CB_SETDROPPEDWIDTH, 170, 0);
CurPage := 0; // this cause page sizing
CurDocName := CurReport.FileName;
Unselect;
PageView.Init;
EnableControls;
BDown(OB1);
ColorLocked:=True;
frSetGlyph(clNone, ClB1, 1);
frSetGlyph(clNone, ClB2, 0);
frSetGlyph(clNone, ClB3, 2);
ColorLocked:=False;
ColorSelector.Hide;
LinePanel.Hide;
ShowPosition;
RestoreState;
FormResize(nil);
end;
procedure TfrDesignerForm.FormHide(Sender: TObject);
begin
ClearUndoBuffer;
ClearRedoBuffer;
SaveState;
if CurReport<>nil then
CurReport.FileName := CurDocName;
end;
procedure TfrDesignerForm.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i := 0 to MenuItems.Count - 1 do
TfrMenuItemInfo(MenuItems[i]).Free;
MenuItems.Free;
ItemWidths.Free;
PageView.Free;
ColorSelector.Free;
EditorForm.Free;
end;
procedure TfrDesignerForm.FormResize(Sender: TObject);
begin
if csDestroying in ComponentState then Exit;
//{$IFDEF WIN32}
//if FirstTime then
// self.OnShow(self);
//{$ENDIF}
with ScrollBox1 do
begin
HorzScrollBar.Position := 0;
VertScrollBar.Position := 0;
end;
if PageView<>nil then
PageView.SetPage;
StatusBar1.Top:=Height-StatusBar1.Height-3;
{$ifndef sbod}
Panel7.Top := StatusBar1.Top + 3;
Panel7.Show;
{$endif}
UpdScrollbars;
end;
//**
{
procedure TfrDesignerForm.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin // for best view - not actual in Win98 :(
with Msg.MinMaxInfo^ do
begin
ptMaxSize.x := Screen.Width;
ptMaxSize.y := Screen.Height;
ptMaxPosition.x := 0;
ptMaxPosition.y := 0;
end;
end;
}
procedure TfrDesignerForm.SetCurPage(Value: Integer);
begin // setting curpage and do all manipulation
fInBuildPage:=True;
try
FCurPage := Value;
Page := CurReport.Pages[CurPage];
ScrollBox1.VertScrollBar.Position := 0;
ScrollBox1.HorzScrollBar.Position := 0;
PageView.SetPage;
SetPageTitles;
Tab1.TabIndex := Value;
ResetSelection;
SendBandsToDown;
PageView.Invalidate;
finally
fInBuildPage:=False;
end;
end;
procedure TfrDesignerForm.SetGridSize(Value: Integer);
begin
if FGridSize = Value then Exit;
FGridSize := Value;
PageView.Invalidate;
end;
procedure TfrDesignerForm.SetGridShow(Value: Boolean);
begin
if FGridShow = Value then Exit;
FGridShow:= Value;
GB1.Down := Value;
PageView.Invalidate;
end;
procedure TfrDesignerForm.SetGridAlign(Value: Boolean);
begin
if FGridAlign = Value then Exit;
GB2.Down := Value;
FGridAlign := Value;
end;
procedure TfrDesignerForm.SetUnits(Value: TfrReportUnits);
var
s: String;
begin
FUnits := Value;
case Value of
ruPixels: s := sPixels;
ruMM: s := sMM;
ruInches: s := sInches;
end;
StatusBar1.Panels[0].Text := s;
ShowPosition;
end;
procedure TfrDesignerForm.SetGrayedButtons(Value: Boolean);
procedure DoButtons(t: Array of TControl);
var
i, j: Integer;
c: TWinControl;
c1: TControl;
begin
for i := Low(t) to High(t) do
begin
c := TWinControl(t[i]);
for j := 0 to c.ControlCount - 1 do
begin
c1 := c.Controls[j];
if c1 is TSpeedButton then
TSpeedButton(c1).Enabled := FGrayedButtons; //** GrayedInactive := FGrayedButtons;
end;
end;
end;
begin
FGrayedButtons := Value;
DoButtons([Panel1, Panel2, Panel3, Panel4, Panel5, Panel6]);
end;
procedure TfrDesignerForm.SetCurDocName(Value: String);
begin
FCurDocName := Value;
// if FirstInstance then
Caption := FCaption + ' - ' + ExtractFileName(Value)
// else
// Caption := FCaption;
end;
procedure TfrDesignerForm.RegisterObject(ButtonBmp: TBitmap;
const ButtonHint: String; ButtonTag: Integer; ObjectType: TfrObjectType);
var
b: TSpeedButton;
begin
b := TSpeedButton.Create(Self);
with b do
begin
Glyph := ButtonBmp;
Hint := ButtonHint;
Flat := True;
GroupIndex := 1;
Align:=alTop;
SetBounds(1000, 1000, 22, 22);
Visible:=True;
Tag := ButtonTag;
if ObjectType = otlReportView then
begin
OnMouseDown := @OB2MouseDown;
Parent := Panel4;
end
else
begin
OnMouseDown := @OB2MouseDown;
Parent := panForDlg;
end;
end;
end;
procedure TfrDesignerForm.RegisterTool(const MenuCaption: String; ButtonBmp: TBitmap;
OnClickEvnt: TNotifyEvent);
var
m: TMenuItem;
b: TSpeedButton;
w:integer;
i: Integer;
begin
m := TMenuItem.Create(MastMenu);
m.Caption := MenuCaption;
m.OnClick := OnClickEvnt;
MastMenu.Enabled := True;
MastMenu.Add(m);
M.Bitmap.Assign(ButtonBmp);
Panel6.Height := 26;
Panel6.Width := 26;
W:=0;
for i:=0 to Panel6.ControlCount-1 do
if Panel6.Controls[i] is TSpeedButton then
begin
W:=W + Panel6.Controls[i].Width;
end;
b := TSpeedButton.Create(Self);
with b do
begin
Parent := Panel6;
Glyph := ButtonBmp;
Hint := MenuCaption;
Flat := True;
Align:=alLeft;
// Align:=alTop;
SetBounds(W, 1, 22, 22);
Visible:=True;
ShowHint:=True;
Tag := 36;
end;
b.OnClick := OnClickEvnt;
if Panel6.Width < (B.Left + B.Width) then
Panel6.Width:=W + B.Width + 4;
end;
procedure TfrDesignerForm.AddPage(ClName : string);
begin
fInBuildPage:=True;
try
CurReport.Pages.Add(ClName);
Page := CurReport.Pages[CurReport.Pages.Count - 1];
if Page is TfrPageReport then
PgB3Click(nil)
else
WasOk:=True;
if WasOk then
begin
Modified := True;
CurPage := CurReport.Pages.Count - 1
end
else
begin
CurReport.Pages.Delete(CurReport.Pages.Count - 1);
CurPage := CurPage;
end;
finally
fInBuildPage:=False;
end;
end;
procedure TfrDesignerForm.RemovePage(n: Integer);
procedure AdjustSubReports;
var
i, j: Integer;
t: TfrView;
begin
with CurReport do
for i := 0 to Pages.Count - 1 do
begin
j := 0;
while j < Pages[i].Objects.Count do
begin
t := TfrView(Pages[i].Objects[j]);
if t.Typ = gtSubReport then
if TfrSubReportView(t).SubPage = n then
begin
Pages[i].Delete(j);
Dec(j);
end
else if TfrSubReportView(t).SubPage > n then
Dec(TfrSubReportView(t).SubPage);
Inc(j);
end;
end;
end;
begin
fInBuildPage:=True;
try
Modified := True;
with CurReport do
begin
if (n >= 0) and (n < Pages.Count) then
if Pages.Count = 1 then
Pages[n].Clear
else
begin
CurReport.Pages.Delete(n);
Tab1.Tabs.Delete(n);
Tab1.TabIndex := 0;
AdjustSubReports;
CurPage := 0;
end;
end;
ClearUndoBuffer;
ClearRedoBuffer;
finally
fInBuildPage:=False;
end;
end;
procedure TfrDesignerForm.SetPageTitles;
var
i: Integer;
s: String;
function IsSubreport(PageN: Integer): Boolean;
var
i, j: Integer;
t: TfrView;
begin
Result := False;
with CurReport do
for i := 0 to Pages.Count - 1 do
for j := 0 to Pages[i].Objects.Count - 1 do
begin
t := TfrView(Pages[i].Objects[j]);
if t.Typ = gtSubReport then
if TfrSubReportView(t).SubPage = PageN then
begin
s := t.Name;
Result := True;
Exit;
end;
end;
end;
begin
if Tab1.Tabs.Count = CurReport.Pages.Count then
begin
for i := 0 to Tab1.Tabs.Count - 1 do
begin
if not IsSubreport(i) then
s := sPg + IntToStr(i + 1);
if Tab1.Tabs[i] <> s then
Tab1.Tabs[i] := s;
end;
end
else
begin
Tab1.Tabs.Clear;
for i := 0 to CurReport.Pages.Count - 1 do
begin
if not IsSubreport(i) then
s := sPg + IntToStr(i + 1);
Tab1.Tabs.Add(s);
end;
end;
end;
procedure TfrDesignerForm.CutToClipboard;
var
i: Integer;
T: TfrView;
begin
ClearClipBoard;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if (t.Selected) and not (lrrDontDelete in T.Restrictions) and not (doChildComponent in T.DesignOptions) then
begin
ClipBd.Add(frCreateObject(t.Typ, t.ClassName, Page));
TfrView(ClipBd.Last).Assign(t);
end;
end;
for i := Objects.Count - 1 downto 0 do
begin
t := TfrView(Objects[i]);
if t.Selected and not (lrrDontDelete in T.Restrictions) and not (doChildComponent in T.DesignOptions) then
Page.Delete(i);
end;
SelNum := 0;
PageView.Invalidate;
end;
procedure TfrDesignerForm.CopyToClipboard;
var
i: Integer;
t: TfrView;
begin
ClearClipBoard;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected and not (doChildComponent in T.DesignOptions) then
begin
ClipBd.Add(frCreateObject(t.Typ, t.ClassName, nil));
TfrView(ClipBd.Last).Assign(t);
end;
end;
end;
procedure TfrDesignerForm.SelectAll;
var
i: Integer;
begin
SelNum := 0;
for i := 0 to Objects.Count - 1 do
begin
TfrView(Objects[i]).Selected := True;
Inc(SelNum);
end;
end;
procedure TfrDesignerForm.Unselect;
var
i: Integer;
begin
SelNum := 0;
for i := 0 to Objects.Count - 1 do
TfrView(Objects[i]).Selected := False;
end;
procedure TfrDesignerForm.ResetSelection;
begin
Unselect;
EnableControls;
ShowPosition;
end;
function TfrDesignerForm.PointsToUnits(x: Integer): Double;
begin
Result := x;
case FUnits of
ruMM: Result := x / 18 * 5;
ruInches: Result := x / 18 * 5 / 25.4;
end;
end;
function TfrDesignerForm.UnitsToPoints(x: Double): Integer;
begin
Result := Round(x);
case FUnits of
ruMM: Result := Round(x / 5 * 18);
ruInches: Result := Round(x * 25.4 / 5 * 18);
end;
end;
procedure TfrDesignerForm.RedrawPage;
begin
PageView.NPDrawLayerObjects(0);
end;
procedure TfrDesignerForm.OnModify(sender: TObject);
begin
Modified:=true;
SelectionChanged;
end;
procedure TfrDesignerForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
StepX, StepY: Integer;
i, tx, ty, tx1, ty1, d, d1: Integer;
t, t1: TfrView;
procedure CheckStepFactor(var pStep: integer; aValue: integer);
begin
if (ssAlt in Shift) or (Shift = [ssShift,ssCtrl]) then
pStep := aValue * 10
else
pStep := aValue;
end;
begin
{$IFNDEF EXTOI}
if (ActiveControl<>nil) and (ActiveControl.Parent=ObjInsp.fPropertyGrid) then
exit;
{$ENDIF}
StepX := 0; StepY := 0;
if (Key=VK_F11) then
ObjInsp.Visible:=not ObjInsp.Visible;
if (Key = VK_RETURN) and (ActiveControl = C3) then
begin
Key := 0;
DoClick(C3);
end;
if (Key = VK_RETURN) and (ActiveControl = E1) then
begin
Key := 0;
DoClick(E1);
end;
if (Key = VK_DELETE) and DelEnabled then
begin
DeleteObjects;
Key := 0;
end;
if (Key = VK_RETURN) and EditEnabled then
begin
if ssCtrl in Shift then
ShowMemoEditor
else
ShowEditor;
end;
if (Chr(Key) in ['1'..'9']) and (ssCtrl in Shift) and DelEnabled then
begin
E1.Text := Chr(Key);
DoClick(E1);
Key := 0;
end;
if (Chr(Key) = 'G') and (ssCtrl in Shift) then
begin
ShowGrid := not ShowGrid;
Key := 0;
end;
if (Chr(Key) = 'B') and (ssCtrl in Shift) then
begin
GridAlign := not GridAlign;
Key := 0;
end;
if CutEnabled then
if (Key = VK_DELETE) and (ssShift in Shift) then CutBClick(Self);
if CopyEnabled then
if (Key = VK_INSERT) and (ssCtrl in Shift) then CopyBClick(Self);
if PasteEnabled then
if (Key = VK_INSERT) and (ssShift in Shift) then PstBClick(Self);
if Key = VK_PRIOR then
with ScrollBox1.VertScrollBar do
begin
Position := Position - 200;
Key := 0;
end;
if Key = VK_NEXT then
with ScrollBox1.VertScrollBar do
begin
Position := Position + 200;
Key := 0;
end;
if SelNum > 0 then
begin
if Key = vk_Up then CheckStepFactor(StepY, -1)
else if Key = vk_Down then CheckStepFactor(StepY, 1)
else if Key = vk_Left then CheckStepFactor(StepX, -1)
else if Key = vk_Right then CheckStepFactor(StepX, 1);
if (StepX <> 0) or (StepY <> 0) then
begin
if ssCtrl in Shift then
MoveObjects(StepX, StepY, False)
else if ssShift in Shift then
MoveObjects(StepX, StepY, True)
else if SelNum = 1 then
begin
t := TfrView(Objects[TopSelected]);
tx := t.x; ty := t.y; tx1 := t.x + t.dx; ty1 := t.y + t.dy;
d := 10000; t1 := nil;
for i := 0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
if not t.Selected and (t.Typ <> gtBand) then
begin
d1 := 10000;
if StepX <> 0 then
begin
if t.y + t.dy < ty then
d1 := ty - (t.y + t.dy)
else if t.y > ty1 then
d1 := t.y - ty1
else if (t.y <= ty) and (t.y + t.dy >= ty1) then
d1 := 0
else
d1 := t.y - ty;
if ((t.x <= tx) and (StepX = 1)) or
((t.x + t.dx >= tx1) and (StepX = -1)) then
d1 := 10000;
if StepX = 1 then
if t.x >= tx1 then
d1 := d1 + t.x - tx1 else
d1 := d1 + t.x - tx
else if t.x + t.dx <= tx then
d1 := d1 + tx - (t.x + t.dx) else
d1 := d1 + tx1 - (t.x + t.dx);
end
else if StepY <> 0 then
begin
if t.x + t.dx < tx then
d1 := tx - (t.x + t.dx)
else if t.x > tx1 then
d1 := t.x - tx1
else if (t.x <= tx) and (t.x + t.dx >= tx1) then
d1 := 0
else
d1 := t.x - tx;
if ((t.y <= ty) and (StepY = 1)) or
((t.y + t.dy >= ty1) and (StepY = -1)) then
d1 := 10000;
if StepY = 1 then
if t.y >= ty1 then
d1 := d1 + t.y - ty1 else
d1 := d1 + t.y - ty
else if t.y + t.dy <= ty then
d1 := d1 + ty - (t.y + t.dy) else
d1 := d1 + ty1 - (t.y + t.dy);
end;
if d1 < d then
begin
d := d1;
t1 := t;
end;
end;
end;
if t1 <> nil then
begin
t := TfrView(Objects[TopSelected]);
if not (ssAlt in Shift) then
begin
PageView.NPEraseSelection;
Unselect;
SelNum := 1;
t1.Selected := True;
PageView.NPDrawSelection;
end
else
begin
if (t1.x >= t.x + t.dx) and (Key = VK_RIGHT) then
t.x := t1.x - t.dx
else if (t1.y > t.y + t.dy) and (Key = VK_DOWN) then
t.y := t1.y - t.dy
else if (t1.x + t1.dx <= t.x) and (Key = VK_LEFT) then
t.x := t1.x + t1.dx
else if (t1.y + t1.dy <= t.y) and (Key = VK_UP) then
t.y := t1.y + t1.dy;
RedrawPage;
end;
SelectionChanged;
end;
end;
Key := 0;
end; // if (StepX <> 0) or (StepY <> 0)
end; // if SelNum > 0 then
end;
procedure TfrDesignerForm.MoveObjects(dx, dy: Integer; aResize: Boolean);
begin
AddUndoAction(acEdit);
PageView.NPEraseSelection;
PageView.MoveResize(Dx,Dy, false, aResize);
ShowPosition;
PageView.GetMultipleSelected;
end;
procedure TfrDesignerForm.UpdateStatus;
begin
{$ifdef sbod}
StatusBar1.Update;
{$else}
PBox1Paint(nil);
{$endif}
end;
procedure TfrDesignerForm.DeleteObjects;
var
i: Integer;
t: TfrView;
begin
AddUndoAction(acDelete);
GetRegion; // JRA 3
PageView.NPEraseSelection;
for i := Objects.Count - 1 downto 0 do
begin
t := TfrView(Objects[i]);
if t.Selected and not (lrrDontDelete in T.Restrictions) then
Page.Delete(i);
end;
SetPageTitles;
ObjInsp.Select(nil);
ResetSelection;
FirstSelected := nil;
PageView.Invalidate;
end;
function TfrDesignerForm.SelStatus: TfrSelectionStatus;
var
t: TfrView;
begin
Result := [];
if SelNum = 1 then
begin
t := TfrView(Objects[TopSelected]);
if t.Typ = gtBand then
Result := [ssBand]
else
if t is TfrCustomMemoView then
Result := [ssMemo]
else
Result := [ssOther];
end
else if SelNum > 1 then
Result := [ssMultiple];
if ClipBd.Count > 0 then
Result := Result + [ssClipboardFull];
end;
procedure TfrDesignerForm.UpdScrollbars;
begin
ScrollBox1.Autoscroll := False;
ScrollBox1.Autoscroll := True;
ScrollBox1.VertScrollBar.Range := ScrollBox1.VertScrollBar.Range + 10;
end;
{$HINTS OFF}
{$ifdef sbod}
procedure TfrDesignerForm.DrawStatusPanel(const ACanvas: TCanvas;
const rect: TRect);
var
t: TfrView;
s: String;
nx, ny: Double;
x, y, dx, dy: Integer;
begin
with ACanvas do
begin
Brush.Color := StatusBar1.Color;
FillRect(Rect);
ImageList1.Draw(ACanvas, Rect.Left + 2, Rect.Top+2, 0);
ImageList1.Draw(ACanvas, Rect.Left + 92, Rect.Top+2, 1);
if (SelNum = 1) or ShowSizes then
begin
t := nil;
if ShowSizes then
begin
x := OldRect.Left;
y := OldRect.Top;
dx := OldRect.Right - x;
dy := OldRect.Bottom - y;
end
else
begin
t := TfrView(Objects[TopSelected]);
x := t.x;
y := t.y;
dx := t.dx;
dy := t.dy;
end;
if FUnits = ruPixels then
s := IntToStr(x) + ';' + IntToStr(y)
else
s := FloatToStrF(PointsToUnits(x), ffFixed, 4, 2) + '; ' +
FloatToStrF(PointsToUnits(y), ffFixed, 4, 2);
TextOut(Rect.Left + 20, Rect.Top + 1, s);
if FUnits = ruPixels then
s := IntToStr(dx) + ';' + IntToStr(dy)
else
s := FloatToStrF(PointsToUnits(dx), ffFixed, 4, 2) + '; ' +
FloatToStrF(PointsToUnits(dy), ffFixed, 4, 2);
TextOut(Rect.Left + 110, Rect.Top + 1, s);
if not ShowSizes and (t.Typ = gtPicture) then
begin
with t as TfrPictureView do
begin
if (Picture.Graphic <> nil) and not Picture.Graphic.Empty then
begin
s := IntToStr(dx * 100 div Picture.Width) + ',' +
IntToStr(dy * 100 div Picture.Height);
TextOut(Rect.Left + 170, Rect.Top + 1, '% ' + s);
end;
end;
end;
end
else if (SelNum > 0) and MRFlag then
begin
nx := 0;
ny := 0;
if OldRect1.Right - OldRect1.Left <> 0 then
nx := (OldRect.Right - OldRect.Left) / (OldRect1.Right - OldRect1.Left);
if OldRect1.Bottom - OldRect1.Top <> 0 then
ny := (OldRect.Bottom - OldRect.Top) / (OldRect1.Bottom - OldRect1.Top);
s := IntToStr(Round(nx * 100)) + ',' + IntToStr(Round(ny * 100));
TextOut(Rect.left + 170, Rect.Top + 1, '% ' + s);
end;
end;
end;
procedure TfrDesignerForm.StatusBar1DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
if Panel.Index=1 then
DrawStatusPanel(StatusBar.Canvas, Rect);
end;
procedure TfrDesignerForm.DefineExtraPopupSelected(popup: TPopupMenu);
var
m: TMenuItem;
begin
m := TMenuItem.Create(Popup);
m.Caption := '-';
Popup.Items.Add(m);
m := TMenuItem.Create(Popup);
m.Caption := sFRDesignerFormSelectSameClass;
m.OnClick := @SelectSameClassClick;
m.Tag := PtrInt(Objects[TopSelected]);
Popup.Items.Add(m);
end;
procedure TfrDesignerForm.SelectSameClassClick(Sender: TObject);
var
View: TfrView;
begin
if Sender is TMenuItem then
begin
View := TfrView(TMenuItem(Sender).Tag);
if Objects.IndexOf(View)>=0 then
begin
PageView.NPEraseSelection;
SelectSameClass(View);
PageView.GetMultipleSelected;
PageView.NPDrawSelection;
SelectionChanged;
end;
end;
end;
procedure TfrDesignerForm.SelectSameClass(View: TfrView);
var
i: Integer;
v: TfrView;
begin
SelNum := 0;
for i := 0 to Objects.Count - 1 do
begin
v := TfrView(Objects[i]);
if v.ClassName=View.ClassName then
begin
v.Selected := True;
Inc(SelNum);
end;
end;
end;
function TfrDesignerForm.CheckFileModified: Integer;
begin
result := mrNo;
// if FileModified then
if Modified then
begin
result:=MessageDlg(sSaveChanges + ' ' + sTo + ' ' +
ExtractFileName(CurDocName) + '?',mtConfirmation,
[mbYes,mbNo,mbCancel],0);
if result = mrCancel then Exit;
if result = mrYes then
begin
FileSave.Execute;
// FileBtn3Click(nil);
if not WasOk then
result := mrCancel;
end;
end;
end;
// if AList is specified always process the list being objects selected or not
// if AList is not specified, all objects are processed but check Selected state
procedure TfrDesignerForm.ViewsAction(Views: TFpList; TheAction: TViewAction;
Data: PtrInt; OnlySel:boolean=true; WithUndoAction:boolean=true;
WithRedraw:boolean=true);
var
i, n: Integer;
List: TFpList;
begin
if not assigned(TheAction) then
exit;
List := Views;
if List=nil then
List := Objects;
n := 0;
for i:=List.Count-1 downto 0 do begin
if (Views=nil) and OnlySel and not TfrView(List[i]).Selected then
continue;
inc(n);
end;
if n=0 then
exit;
if WithUndoAction then
AddUndoAction(acEdit);
if WithRedraw then begin
PageView.NPEraseSelection;
GetRegion;
end;
for i:=List.Count-1 downto 0 do begin
if (Views=nil) and OnlySel and not TfrView(List[i]).Selected then
continue;
TheAction(TfrView(List[i]), Data);
end;
if WithRedraw then
PageView.NPDrawLayerObjects(ClipRgn, TopSelected);
end;
// data=0 remove all borders
// data=1 set all borders
// data=-1 toggle all borders
procedure TfrDesignerForm.ToggleFrames(View: TfrView; Data: PtrInt);
begin
if (Data=0) or ((Data=-1) and (View.Frames<>[])) then
View.Frames := []
else
if (Data=1) or ((Data=-1) and (View.Frames=[])) then
View.Frames := [frbLeft, frbTop, frbRight, frbBottom];
if SelNum=1 then
LastFrames := View.Frames;
end;
procedure TfrDesignerForm.DuplicateView(View: TfrView; Data: PtrInt);
var
t: TfrView;
begin
// check if view is unique instance band kind and if there is already one
if (View is TfrBandView) and
not (TfrBandView(View).BandType in [btMasterHeader..btSubDetailFooter,
btGroupHeader, btGroupFooter])
and frCheckBand(TfrBandView(View).BandType)
then
exit;
t := frCreateObject(View.Typ, View.ClassName, Page);
TfrView(t).Assign(View);
t.y := t.y + FDuplicateCount * FDupDeltaY;
t.x := t.x + FDuplicateCount * FDupDeltaX;
t.Selected := false;
if CurReport.FindObject(t.Name) <> nil then
t.CreateUniqueName;
// Objects.Add(t);
end;
procedure TfrDesignerForm.ResetDuplicateCount;
begin
FDuplicateCount := 0;
FreeThenNil(FDuplicateList);
end;
function TfrDesignerForm.lrDesignAcceptDrag(const Source: TObject): TControl;
begin
if Source is TControl then
Result:=Source as TControl
else
if Source is TDragControlObject then
Result:=(Source as TDragControlObject).Control
else
Result:=nil;
end;
{$endif}
procedure TfrDesignerForm.SetModified(AValue: Boolean);
begin
inherited SetModified(AValue);
if AValue then
StatusBar1.Panels[2].Text:=sFRDesignerForm_Modified
else
StatusBar1.Panels[2].Text:='';
FileSave.Enabled:=AValue;
end;
function TfrDesignerForm.IniFileName: string;
begin
Result:=AppendPathDelim(lrConfigFolderName(false))+'lrDesigner.cfg';
end;
{$HINTS ON}
function TfrDesignerForm.RectTypEnabled: Boolean;
begin
Result := [ssMemo, ssOther, ssMultiple] * SelStatus <> [];
end;
function TfrDesignerForm.FontTypEnabled: Boolean;
begin
Result := [ssMemo, ssMultiple] * SelStatus <> [];
end;
function TfrDesignerForm.ZEnabled: Boolean;
begin
Result := [ssBand, ssMemo, ssOther, ssMultiple] * SelStatus <> [];
end;
function TfrDesignerForm.CutEnabled: Boolean;
begin
Result := [ssBand, ssMemo, ssOther, ssMultiple] * SelStatus <> [];
end;
function TfrDesignerForm.CopyEnabled: Boolean;
begin
Result := [ssBand, ssMemo, ssOther, ssMultiple] * SelStatus <> [];
end;
function TfrDesignerForm.PasteEnabled: Boolean;
begin
Result := ssClipboardFull in SelStatus;
end;
function TfrDesignerForm.DelEnabled: Boolean;
begin
Result := [ssBand, ssMemo, ssOther, ssMultiple] * SelStatus <> [];
end;
function TfrDesignerForm.EditEnabled: Boolean;
begin
Result:=[ssBand,ssMemo,ssOther]*SelStatus <> [];
end;
procedure TfrDesignerForm.EnableControls;
procedure SetCtrlEnabled(const Ar: Array of TObject; en: Boolean);
var
i: Integer;
begin
for i := Low(Ar) to High(Ar) do
if Ar[i] is TControl then
(Ar[i] as TControl).Enabled := en
else if Ar[i] is TMenuItem then
(Ar[i] as TMenuItem).Enabled := en;
end;
begin
SetCtrlEnabled([FrB1, FrB2, FrB3, FrB4, FrB5, FrB6, ClB1, ClB3, E1, SB1, SB2, StB1],
RectTypEnabled);
SetCtrlEnabled([ClB2, C2, C3, FnB1, FnB2, FnB3, AlB1, AlB2, AlB3, AlB4, AlB5, AlB6, AlB7, AlB8, HlB1],
FontTypEnabled);
SetCtrlEnabled([ZB1, ZB2, N32, N33, GB3], ZEnabled);
SetCtrlEnabled([CutB, N11, N2], CutEnabled);
SetCtrlEnabled([CopyB, N12, N1], CopyEnabled);
SetCtrlEnabled([PstB, N13, N3], PasteEnabled);
SetCtrlEnabled([N27, N5], DelEnabled);
SetCtrlEnabled([N36, N6], EditEnabled);
if not C2.Enabled then
begin
C2.ItemIndex := -1;
C3.Text := '';
end;
StatusBar1.Repaint;
{$ifndef sbod}
PBox1.Invalidate;
{$endif}
end;
procedure TfrDesignerForm.SelectionChanged;
var
t: TfrView;
begin
{$IFDEF DebugLR}
debugLnEnter('TfrDesignerForm.SelectionChanged INIT, SelNum=%d',[SelNum]);
{$ENDIF}
Busy := True;
ColorSelector.Hide;
LinePanel.Hide;
EnableControls;
if Page is TfrPageReport then
begin
if SelNum = 1 then
begin
t := TfrView(Objects[TopSelected]);
if t.Typ <> gtBand then
with t do
begin
{$IFDEF DebugLR}
DebugLn('Not a band');
{$ENDIF}
FrB1.Down := (frbTop in Frames);
FrB2.Down := (frbLeft in Frames);
FrB3.Down := (frbBottom in Frames);
FrB4.Down := (frbRight in Frames);
E1.Text := FloatToStrF(FrameWidth, ffGeneral, 2, 2);
frSetGlyph(FillColor, ClB1, 1);
frSetGlyph(FrameColor, ClB3, 2);
if t is TfrCustomMemoView then
with t as TfrCustomMemoView do
begin
frSetGlyph(Font.Color, ClB2, 0);
if C2.ItemIndex <> C2.Items.IndexOf(Font.Name) then
C2.ItemIndex := C2.Items.IndexOf(Font.Name);
if C3.Text <> IntToStr(Font.Size) then
C3.Text := IntToStr(Font.Size);
FnB1.Down := fsBold in Font.Style;
FnB2.Down := fsItalic in Font.Style;
FnB3.Down := fsUnderline in Font.Style;
AlB4.Down := (Adjust and $4) <> 0;
AlB5.Down := (Adjust and $18) = $8;
AlB6.Down := (Adjust and $18) = 0;
AlB7.Down := (Adjust and $18) = $10;
case (Adjust and $3) of
0: BDown(AlB1);
1: BDown(AlB2);
2: BDown(AlB3);
3: BDown(AlB8);
end;
end;
end;
end
else if SelNum > 1 then
begin
{$IFDEF DebugLR}
DebugLn('Multiple selection');
{$ENDIF}
BUp(FrB1);
BUp(FrB2);
BUp(FrB3);
BUp(FrB4);
ColorLocked := True;
frSetGlyph(0, ClB1, 1);
ColorLocked := False;
E1.Text := '1';
C2.ItemIndex := -1;
C3.Text := '';
BUp(FnB1);
BUp(FnB2);
BUp(FnB3);
BDown(AlB1);
BUp(AlB4);
BUp(AlB5);
end;
end
else
begin
if ObjInsp.SelectedObject = Page then
PageView.Invalidate;
end;
Busy := False;
ShowPosition;
ShowContent;
ActiveControl := nil;
{$IFDEF DebugLR}
debugLnExit('TfrDesignerForm.SelectionChanged END, SelNum=%d',[SelNum]);
{$ENDIF}
end;
procedure TfrDesignerForm.ShowPosition;
begin
FillInspFields;
StatusBar1.Repaint;
{$ifndef sbod}
PBox1.Invalidate;
{$endif}
end;
procedure TfrDesignerForm.ShowContent;
var
t: TfrView;
s: String;
begin
s := '';
if SelNum = 1 then
begin
t := TfrView(Objects[TopSelected]);
s := t.Name;
if t is TfrBandView then
s := s + ': ' + frBandNames[TfrBandView(t).BandType]
else if t.Memo.Count > 0 then
s := s + ': ' + t.Memo[0];
end;
StatusBar1.Panels[3].Text := s;
end;
procedure TfrDesignerForm.DoClick(Sender: TObject);
var
i, j, b: Integer;
s : String;
t : TfrView;
begin
if Busy then
Exit;
AddUndoAction(acEdit);
PageView.NPEraseSelection;
GetRegion;
b:=(Sender as TControl).Tag;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected and ((t.Typ <> gtBand) or (b = 16)) then
with t do
begin
if t is TfrCustomMemoView then
with t as TfrCustomMemoView do
case b of
7: if C2.ItemIndex >= 0 then
begin
Font.Name := C2.Items[C2.ItemIndex];
LastFontName := Font.Name;
end;
8: begin
Font.Size := StrToIntDef(C3.Text, LastFontSize);
LastFontSize := Font.Size;
end;
9: begin
LastFontStyle := frGetFontStyle(Font.Style);
//SetBit(LastFontStyle, not FnB1.Down, 2);
SetBit(LastFontStyle, FnB1.Down, 2);
Font.Style := frSetFontStyle(LastFontStyle);
end;
10: begin
LastFontStyle := frGetFontStyle(Font.Style);
//SetBit(LastFontStyle, not FnB2.Down, 1);
SetBit(LastFontStyle, FnB2.Down, 1);
Font.Style := frSetFontStyle(LastFontStyle);
end;
11..13:
begin
Adjust := (Adjust and $FC) + (b-11);
LastAdjust := Adjust;
end;
14: begin
Adjust := (Adjust and $FB) + Word(AlB4.Down) * 4;
LastAdjust := Adjust;
end;
15: begin
Adjust := (Adjust and $E7) + Word(AlB5.Down) * 8 + Word(AlB7.Down) * $10;
LastAdjust := Adjust;
end;
17: begin
Font.Color := ColorSelector.Color;
LastFontColor := Font.Color;
end;
18: begin
LastFontStyle := frGetFontStyle(Font.Style);
// SetBit(LastFontStyle, not FnB3.Down, 4);
SetBit(LastFontStyle, FnB3.Down, 4);
Font.Style := frSetFontStyle(LastFontStyle);
end;
22: begin
//Alignment:=tafrJustify;
Adjust := (Adjust and $FC) + 3;
LastAdjust := Adjust;
end;
end;
case b of
1:
begin //Top frame
if (Sender=frB1) and frB1.Down then
Frames:=Frames+[frbTop]
else
Frames:=Frames-[frbTop];
DRect := Rect(t.x - 10, t.y - 10, t.x + t.dx + 10, t.y + 10)
end;
2: //Left frame
begin
if (Sender=FrB2) and frB2.Down then
Frames:=Frames+[frbLeft]
else
Frames:=Frames-[frbLeft];
DRect := Rect(t.x - 10, t.y - 10, t.x + 10, t.y + t.dy + 10)
end;
3: //Bottom Frame
begin
if (Sender=FrB3) and frB3.Down then
Frames:=Frames+[frbBottom]
else
Frames:=Frames-[frbBottom];
DRect := Rect(t.x - 10, t.y + t.dy - 10, t.x + t.dx + 10, t.y + t.dy + 10)
end;
4: //Right Frame
begin
if (Sender=FrB4) and frB4.Down then
Frames:=Frames+[frbRight]
else
Frames:=Frames-[frbRight];
DRect := Rect(t.x + t.dx - 10, t.y - 10, t.x + t.dx + 10, t.y + t.dy + 10)
end;
20:
begin
if (Sender=FrB5) then
Frames:=[frbLeft, frbTop, frbRight, frbBottom];
LastFrames:=Frames;
end;
21:
begin
if (Sender=FrB6) then
Frames:=[];
LastFrames:=[];
end;
5:
begin
FillColor:=ColorSelector.Color;
LastFillColor := FillColor;
end;
6:
begin
s := E1.Text;
for j := 1 to Length(s) do
if s[j] in ['.', ','] then
s[j] := DecimalSeparator;
FrameWidth := StrToFloat(s);
if t is TfrLineView then
LastLineWidth := FrameWidth
else
LastFrameWidth := FrameWidth;
end;
19:
begin
FrameColor := ColorSelector.Color;
LastFrameColor := FrameColor;
end;
25..30:
FrameStyle:=TfrFrameStyle(b - 25);
end;
end;
end;
PageView.NPDrawLayerObjects(ClipRgn, TopSelected);
ActiveControl := nil;
if b in [20, 21] then
SelectionChanged;
end;
procedure TfrDesignerForm.frSpeedButton1Click(Sender: TObject);
begin
LinePanel.Hide;
DoClick(Sender);
end;
procedure TfrDesignerForm.HlB1Click(Sender: TObject);
var
t: TfrCustomMemoView;
begin
t := TfrCustomMemoView(Objects[TopSelected]);
frHilightForm := TfrHilightForm.Create(nil);
with frHilightForm do
begin
FontColor := t.Highlight.FontColor;
FillColor := t.Highlight.FillColor;
CB1.Checked := (t.Highlight.FontStyle and $2) <> 0;
CB2.Checked := (t.Highlight.FontStyle and $1) <> 0;
CB3.Checked := (t.Highlight.FontStyle and $4) <> 0;
Edit1.Text := t.HighlightStr;
if ShowModal = mrOk then
begin
AddUndoAction(acEdit);
t.HighlightStr := Edit1.Text;
t.Highlight.FontColor := FontColor;
t.Highlight.FillColor := FillColor;
SetBit(t.Highlight.FontStyle, CB1.Checked, 2);
SetBit(t.Highlight.FontStyle, CB2.Checked, 1);
SetBit(t.Highlight.FontStyle, CB3.Checked, 4);
end;
end;
frHilightForm.Free;
end;
procedure TfrDesignerForm.FillInspFields;
var
t: TfrView;
begin
ObjInspSelect(nil);
if SelNum = 0 then
ObjInspSelect(Page)
else
if SelNum = 1 then
begin
t := TfrView(Objects[TopSelected]);
ObjInspSelect(t);
end else
if SelNum > 1 then
ObjInspSelect(Objects);
ObjInspRefresh;
end;
{
procedure TfrDesignerForm.OnModify(Item: Integer; var EditText: String);
var
t: TfrView;
i, k: Integer;
begin
AddUndoAction(acEdit);
if (Item = 0) and (SelNum = 1) then
begin
t := TfrView(Objects[TopSelected]);
if CurReport.FindObject(fld[0]) = nil then
t.Name := fld[0] else
EditText := t.Name;
SetPageTitles;
end
else if Item in [1..5] then
begin
EditText := frParser.Calc(fld[Item]);
if Item <> 6 then
k := UnitsToPoints(StrToFloat(EditText)) else
k := StrToInt(EditText);
for i := 0 to Objects.Count-1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
with t do
case Item of
1: if (k > 0) and (k < Page.PrnInfo.Pgw) then
x := k;
2: if (k > 0) and (k < Page.PrnInfo.Pgh) then
y := k;
3: if (k > 0) and (k < Page.PrnInfo.Pgw) then
dx := k;
4: if (k > 0) and (k < Page.PrnInfo.Pgh) then
dy := k;
5: Visible := Boolean(k);
end;
end;
end;
FillInspFields;
if Item in [1..5] then
EditText := fld[Item];
RedrawPage;
StatusBar1.Repaint;
PBox1.Invalidate;
end;
}
procedure TfrDesignerForm.StB1Click(Sender: TObject);
var
p: TPoint;
begin
if not LinePanel.Visible then
begin
LinePanel.Parent := Self;
with (Sender as TControl) do
p := Self.ScreenToClient(Parent.ClientToScreen(Point(Left, Top)));
LinePanel.SetBounds(p.X,p.Y + 26,LinePanel.Width,LinePanel.Height);
end;
LinePanel.Visible := not LinePanel.Visible;
end;
procedure TfrDesignerForm.ObjInspSelect(Obj: TObject);
{$IFDEF STDOI}
var
Selection: TPersistentSelectionList;
i: Integer;
{$ENDIF}
begin
{$IFDEF STDOI}
Selection := TPersistentSelectionList.Create;
PropHook.LookupRoot:=nil;
if Obj is TPersistent then
begin
Selection.Add(TPersistent(Obj));
PropHook.LookupRoot:=TPersistent(Obj);
end else
if Obj is TFpList then
with frDesigner.page do
for i:=0 to Objects.Count-1 do
if TfrView(Objects[i]).Selected then
begin
if PropHook.LookupRoot=nil then
PropHook.LookupRoot := TPersistent(Objects[i]);
Selection.Add(TPersistent(Objects[i]));
end;
ObjInsp.Selection := Selection;
Selection.Free;
{$ELSE}
ObjInsp.Select(Obj);
{$ENDIF}
end;
procedure TfrDesignerForm.DuplicateSelection;
var
t: TfrView;
q: TPoint;
p: TPoint;
i: Integer;
OldCount: Integer;
begin
if not DelEnabled then
exit;
OldCount := Objects.Count;
if OldCount=0 then
exit;
if FDuplicateList=nil then
begin
FDuplicateList := TFpList.Create;
for i:=0 to OldCount-1 do
if TfrView(Objects[i]).Selected then
FDuplicateList.Add(Objects[i]);
end;
if (FDuplicateList.Count=0) then
begin
ResetDuplicateCount;
exit;
end;
Inc(FDuplicateCount);
if FDuplicateCount=1 then
begin
// find reference rect in screen coords
if SelNum>1 then
begin
p := OldRect.TopLeft;
q := OldRect.BottomRight;
end else
begin
t := TfrView(Objects[TopSelected]);
p := Point(t.x, t.y);
q := point(t.x+t.dx, t.y+t.dy);
end;
p := PageView.ControlToScreen(p);
q := PageView.ControlToScreen(q);
// find duplicates delta based on current mouse cursor position
FDupDeltaX := (q.x-p.x);
FDupDeltaY := (q.y-p.y);
with Mouse.CursorPos do
begin
if x < p.x then
FDupDeltaX := -FDupDeltaX
else
if x < q.x then
FDupDeltaX := 0;
if y < p.y then
FDupDeltaY := -FDupDeltaY
else
if y < q.y then
FDupDeltaY := 0;
end;
end;
ViewsAction(FDuplicateList, @DuplicateView, 0, false, false, false);
if OldCount<>Objects.Count then
begin
SendBandsToDown;
PageView.GetMultipleSelected;
RedrawPage;
AddUndoAction(acDuplication);
end else
Dec(FDuplicateCount);
end;
procedure TfrDesignerForm.CreateNewReport;
begin
if CheckFileModified=mrCancel then
exit;
ClearUndoBuffer;
CurReport.Pages.Clear;
CurReport.Pages.Add;
CurPage := 0;
CurDocName := sUntitled;
//FileModified := False;
Modified := False;
CurReport.ReportCreateDate:=Now;
FCurDocFileType := 3;
end;
procedure TfrDesignerForm.ObjInspRefresh;
begin
{$IFDEF STDOI}
//TODO: refresh
{$ELSE}
ObjInsp.Refresh;
{$ENDIF}
end;
procedure TfrDesignerForm.ClB1Click(Sender: TObject);
var p : TPoint;
t : TfrView;
CL : TColor;
begin
with (Sender as TControl) do
p := Self.ScreenToClient(Parent.ClientToScreen(Point(Left, Top)));
if ColorSelector.Left = p.X then
ColorSelector.Visible := not ColorSelector.Visible
else
begin
with ColorSelector do SetBounds(p.X,p.Y + 26,Width,Height);
ColorSelector.Visible := True;
end;
ClrButton := Sender as TSpeedButton;
t := TfrView(Objects[TopSelected]);
CL:=clNone;
if Sender=ClB1 then
CL:=t.FillColor;
if (Sender=ClB2) and (t is TfrCustomMemoView) then
CL:=TfrCustomMemoView(t).Font.Color;
if Sender=ClB3 then
CL:=t.FrameColor;
ColorSelector.Color:=CL;
end;
procedure TfrDesignerForm.ColorSelected(Sender: TObject);
var
n: Integer;
begin
n := 0;
if ClrButton = ClB1 then
n := 1
else
if ClrButton = ClB3 then
n := 2;
{$IFDEF DebugLR}
DebugLn('ColorSelected');
{$ENDIF}
frSetGlyph(ColorSelector.Color, ClrButton, n);
DoClick(ClrButton);
end;
procedure TfrDesignerForm.PBox1Paint(Sender: TObject);
var
t: TfrView;
s: String;
nx, ny: Double;
x, y, dx, dy: Integer;
begin
with PBox1.Canvas do
begin
FillRect(Rect(0, 0, PBox1.Width, PBox1.Height));
ImageList1.Draw(PBox1.Canvas, 2, 0, 0);
ImageList1.Draw(PBox1.Canvas, 92, 0, 1);
if (SelNum = 1) or ShowSizes then
begin
t := nil;
if ShowSizes then
begin
x := OldRect.Left;
y := OldRect.Top;
dx := OldRect.Right - x;
dy := OldRect.Bottom - y;
end
else
begin
t := TfrView(Objects[TopSelected]);
x := t.x;
y := t.y;
dx := t.dx;
dy := t.dy;
end;
if FUnits = ruPixels then
s := IntToStr(x) + ';' + IntToStr(y)
else
s := FloatToStrF(PointsToUnits(x), ffFixed, 4, 2) + '; ' +
FloatToStrF(PointsToUnits(y), ffFixed, 4, 2);
TextOut(20, 1, s);
if FUnits = ruPixels then
s := IntToStr(dx) + ';' + IntToStr(dy)
else
s := FloatToStrF(PointsToUnits(dx), ffFixed, 4, 2) + '; ' +
FloatToStrF(PointsToUnits(dy), ffFixed, 4, 2);
TextOut(110, 1, s);
if not ShowSizes and (t.Typ = gtPicture) then
begin
with t as TfrPictureView do
begin
if (Picture.Graphic <> nil) and not Picture.Graphic.Empty then
begin
s := IntToStr(dx * 100 div Picture.Width) + ',' +
IntToStr(dy * 100 div Picture.Height);
TextOut(170, 1, '% ' + s);
end;
end;
end;
end
else if (SelNum > 0) and MRFlag then
begin
nx := 0;
ny := 0;
if OldRect1.Right - OldRect1.Left <> 0 then
nx := (OldRect.Right - OldRect.Left) / (OldRect1.Right - OldRect1.Left);
if OldRect1.Bottom - OldRect1.Top <> 0 then
ny := (OldRect.Bottom - OldRect.Top) / (OldRect1.Bottom - OldRect1.Top);
s := IntToStr(Round(nx * 100)) + ',' + IntToStr(Round(ny * 100));
TextOut(170, 1, '% ' + s);
end;
end;
end;
procedure TfrDesignerForm.C2DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
j: PtrInt;
begin
with C2.Canvas do
begin
Font.Name := 'default';
FillRect(Rect);
j := PtrInt(C2.Items.Objects[Index]);
{$IFDEF USE_PRINTER_FONTS}
if (j and $100 <> 0) then
ImageList2.Draw(C2.Canvas, Rect.Left, Rect.Top +1, 2)
else
{$ENDIF}
if ( j and TRUETYPE_FONTTYPE) <> 0 then
ImageList2.Draw(C2.Canvas, Rect.Left, Rect.Top + 1, 0);
TextOut(Rect.Left + 20, Rect.Top + 1, C2.Items[Index]);
end;
end;
procedure TfrDesignerForm.ShowMemoEditor;
begin
EditorForm.View := TfrView(Objects[TopSelected]);
if EditorForm.ShowEditor = mrOk then
begin
PageView.NPDrawSelection;
PageView.NPDrawLayerObjects(EditorForm.View.GetClipRgn(rtExtended), TopSelected);
end;
ActiveControl := nil;
end;
procedure TfrDesignerForm.ShowEditor;
var
t: TfrView;
i: Integer;
bt: TfrBandType;
begin
SetCaptureControl(nil);
t := TfrView(Objects[TopSelected]);
if lrrDontModify in T.Restrictions then
exit;
if t.Typ = gtMemo then
ShowMemoEditor
else
if t.Typ = gtPicture then
begin
frGEditorForm := TfrGEditorForm.Create(nil);
with frGEditorForm do
begin
Image1.Picture.Assign((t as TfrPictureView).Picture);
if ShowModal = mrOk then
begin
AddUndoAction(acEdit);
(t as TfrPictureView).Picture.Assign(Image1.Picture);
PageView.NPDrawSelection;
PageView.NPDrawLayerObjects(t.GetClipRgn(rtExtended), TopSelected);
end;
end;
frGEditorForm.Free;
end
else
if t.Typ = gtBand then
begin
PageView.NPEraseSelection;
bt := (t as TfrBandView).BandType;
if bt in [btMasterData, btDetailData, btSubDetailData] then
begin
frBandEditorForm := TfrBandEditorForm.Create(nil);
frBandEditorForm.ShowEditor(t);
frBandEditorForm.Free;
end
else if bt = btGroupHeader then
begin
frGroupEditorForm := TfrGroupEditorForm.Create(nil);
frGroupEditorForm.ShowEditor(t);
frGroupEditorForm.Free;
end
else if bt = btCrossData then
begin
frVBandEditorForm := TfrVBandEditorForm.Create(nil);
frVBandEditorForm.ShowEditor(t);
frVBandEditorForm.Free;
end
else
PageView.DFlag := False;
PageView.NPDrawLayerObjects(t.GetClipRgn(rtExtended), TopSelected);
end
else
if t.Typ = gtSubReport then
CurPage := (t as TfrSubReportView).SubPage
else
if t.Typ = gtAddIn then
begin
for i := 0 to frAddInsCount - 1 do
if frAddIns[i].ClassRef.ClassName = t.ClassName then
begin
if Assigned(frAddIns[i].EditorProc) then
begin
if frAddIns[i].EditorProc(t) then
Modified:=true;
end
else
if frAddIns[i].EditorForm <> nil then
begin
PageView.NPEraseSelection;
frAddIns[i].EditorForm.ShowEditor(t);
PageView.NPDrawLayerObjects(t.GetClipRgn(rtExtended), TopSelected);
end
else
ShowMemoEditor;
break;
end;
end;
ShowContent;
ShowPosition;
ActiveControl := nil;
end;
procedure TfrDesignerForm.ReleaseAction(ActionRec: TfrUndoRec);
var
p, p1: PfrUndoObj;
begin
p := ActionRec.Objects;
while p <> nil do
begin
if ActionRec.Action in [acDelete, acEdit] then
p^.ObjPtr.Free;
p1 := p;
p := p^.Next;
FreeMem(p1, SizeOf(TfrUndoObj));
end;
end;
procedure TfrDesignerForm.ClearBuffer(Buffer: TfrUndoBuffer; var BufferLength: Integer);
var
i: Integer;
begin
for i := 0 to BufferLength - 1 do
ReleaseAction(Buffer[i]);
BufferLength := 0;
end;
procedure TfrDesignerForm.ClearUndoBuffer;
begin
ClearBuffer(FUndoBuffer, FUndoBufferLength);
N46.Enabled := False;
UndoB.Enabled := N46.Enabled;
end;
procedure TfrDesignerForm.ClearRedoBuffer;
begin
ClearBuffer(FRedoBuffer, FRedoBufferLength);
N48.Enabled := False;
RedoB.Enabled := N48.Enabled;
end;
procedure TfrDesignerForm.Undo(Buffer: PfrUndoBuffer);
var
p, p1: PfrUndoObj;
r: PfrUndoRec1;
BufferLength: Integer;
List: TFpList;
a: TfrUndoAction;
begin
if Buffer = @FUndoBuffer then
BufferLength := FUndoBufferLength
else
BufferLength := FRedoBufferLength;
if (Buffer^[BufferLength - 1].Page <> CurPage) then Exit;
List := TFpList.Create;
a := Buffer^[BufferLength - 1].Action;
p := Buffer^[BufferLength - 1].Objects;
while p <> nil do
begin
GetMem(r, SizeOf(TfrUndoRec1));
r^.ObjPtr := p^.ObjPtr;
r^.Int := p^.Int;
List.Add(r);
case Buffer^[BufferLength - 1].Action of
acInsert:
begin
r^.Int := Page.FindObjectByID(p^.ObjID);
r^.ObjPtr := TfrView(Objects[r^.Int]);
a := acDelete;
end;
acDelete: a := acInsert;
acEdit: r^.ObjPtr := TfrView(Objects[p^.Int]);
acZOrder:
begin
r^.Int := Page.FindObjectByID(p^.ObjID);
r^.ObjPtr := TfrView(Objects[r^.Int]);
p^.ObjPtr := r^.ObjPtr;
end;
end;
p := p^.Next;
end;
if Buffer = @FUndoBuffer then
AddAction(@FRedoBuffer, a, List) else
AddAction(@FUndoBuffer, a, List);
List.Free;
p := Buffer^[BufferLength - 1].Objects;
while p <> nil do
begin
case Buffer^[BufferLength - 1].Action of
acInsert: Page.Delete(Page.FindObjectByID(p^.ObjID));
acDelete: Objects.Insert(p^.Int, p^.ObjPtr);
acEdit:
begin
TfrView(Objects[p^.Int]).Assign(p^.ObjPtr);
p^.ObjPtr.Free;
end;
acZOrder: Objects[p^.Int] := p^.ObjPtr;
end;
p1 := p;
p := p^.Next;
FreeMem(p1, SizeOf(TfrUndoObj));
end;
if Buffer = @FUndoBuffer then
Dec(FUndoBufferLength)
else
Dec(FRedoBufferLength);
ResetSelection;
PageView.Invalidate;
N46.Enabled := FUndoBufferLength > 0;
UndoB.Enabled := N46.Enabled;
N48.Enabled := FRedoBufferLength > 0;
RedoB.Enabled := N48.Enabled;
end;
procedure TfrDesignerForm.AddAction(Buffer: PfrUndoBuffer; a: TfrUndoAction; List: TFpList);
var
i: Integer;
p, p1: PfrUndoObj;
r: PfrUndoRec1;
t, t1: TfrView;
BufferLength: Integer;
begin
if Buffer = @FUndoBuffer then
BufferLength := FUndoBufferLength
else
BufferLength := FRedoBufferLength;
if BufferLength >= MaxUndoBuffer then
begin
ReleaseAction(Buffer^[0]);
for i := 0 to MaxUndoBuffer - 2 do
Buffer^[i] := Buffer^[i + 1];
BufferLength := MaxUndoBuffer - 1;
end;
Buffer^[BufferLength].Action := a;
Buffer^[BufferLength].Page := CurPage;
Buffer^[BufferLength].Objects := nil;
p := nil;
for i := 0 to List.Count - 1 do
begin
r := List[i];
t := r^.ObjPtr;
GetMem(p1, SizeOf(TfrUndoObj));
p1^.Next := nil;
if Buffer^[BufferLength].Objects = nil then
Buffer^[BufferLength].Objects := p1
else
p^.Next := p1;
p := p1;
case a of
acInsert: p^.ObjID := t.ID;
acDelete, acEdit:
begin
t1 := frCreateObject(t.Typ, t.ClassName, nil);
t1.Assign(t);
t1.ID := t.ID;
p^.ObjID := t.ID;
p^.ObjPtr := t1;
p^.Int := r^.Int;
end;
acZOrder:
begin
p^.ObjID := t.ID;
p^.Int := r^.Int;
end;
end;
FreeMem(r, SizeOf(TfrUndoRec1));
end;
if Buffer = @FUndoBuffer then
begin
FUndoBufferLength := BufferLength + 1;
N46.Enabled := True;
UndoB.Enabled := True;
end
else
begin
FRedoBufferLength := BufferLength + 1;
N48.Enabled := True;
RedoB.Enabled := True;
end;
Modified := True;
//FileModified := True;
end;
procedure TfrDesignerForm.AddUndoAction(AUndoAction: TfrUndoAction);
var
i,j: Integer;
t: TfrView;
List: TFpList;
F:boolean;
procedure AddCurrent;
var
p: PfrUndoRec1;
begin
GetMem(p, SizeOf(TfrUndoRec1));
p^.ObjPtr := t;
p^.Int := i;
List.Add(p);
end;
begin
ClearRedoBuffer;
if not Assigned(Objects) then exit;
List := TFpList.Create;
// last FDuplicateList.Count objectes were duplicated
if AUndoAction = acDuplication then
j := Objects.Count - FDuplicateList.Count
else
j := 0;
for i := j to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
F:= ((AUndoAction = acDelete) and not (lrrDontDelete in t.Restrictions))
or
((AUndoAction = acEdit) and not (lrrDontModify in t.Restrictions))
or
(not (AUndoAction in [acDelete, acEdit]));
if (not (doUndoDisable in T.DesignOptions)) and ((AUndoAction in [acDuplication, acZOrder]) or t.Selected) and F then
AddCurrent;
end;
if List.Count>0 then
begin
if AUndoAction = acDuplication then
AUndoAction := acInsert;
AddAction(@FUndoBuffer, AUndoAction, List);
end;
List.Free;
end;
procedure TfrDesignerForm.BeforeChange;
begin
AddUndoAction(acEdit);
end;
procedure TfrDesignerForm.AfterChange;
begin
PageView.NPDrawSelection;
PageView.NPDrawLayerObjects(0, TopSelected);
ObjInspRefresh;
end;
//Move selected object from front
procedure TfrDesignerForm.ZB1Click(Sender: TObject); // go up
var
i, j, n: Integer;
t: TfrView;
begin
AddUndoAction(acZOrder);
n:=Objects.Count;
i:=0;
j:=0;
while j < n do
begin
t := TfrView(Objects[i]);
if t.Selected then
begin
Objects.Delete(i);
Objects.Add(t);
end
else Inc(i);
Inc(j);
end;
SendBandsToDown;
RedrawPage;
end;
//Send selected object to back
procedure TfrDesignerForm.ZB2Click(Sender: TObject); // go down
var
t: TfrView;
i, j, n: Integer;
begin
AddUndoAction(acZOrder);
n:=Objects.Count;
j:=0;
i:=n-1;
while j < n do
begin
t := TfrView(Objects[i]);
if t.Selected then
begin
Objects.Delete(i);
Objects.Insert(0, t);
end
else Dec(i);
Inc(j);
end;
SendBandsToDown;
RedrawPage;
end;
procedure TfrDesignerForm.PgB1Click(Sender: TObject); // add page
begin
ResetSelection;
if Sender<>pgB4 then
AddPage('TfrPageReport')
else
AddPage('TfrPageDialog');
end;
procedure TfrDesignerForm.PgB2Click(Sender: TObject); // remove page
begin
if MessageDlg(sRemovePg,mtConfirmation,[mbYes,mbNo],0)=mrYes then
RemovePage(CurPage);
end;
procedure TfrDesignerForm.OB1Click(Sender: TObject);
begin
ObjRepeat := False;
end;
procedure TfrDesignerForm.OB2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ObjRepeat := ssShift in Shift;
PageView.Cursor := crDefault;
end;
procedure TfrDesignerForm.CutBClick(Sender: TObject); //cut
begin
AddUndoAction(acDelete);
CutToClipboard;
FirstSelected := nil;
EnableControls;
ShowPosition;
RedrawPage;
end;
procedure TfrDesignerForm.CopyBClick(Sender: TObject); //copy
begin
CopyToClipboard;
EnableControls;
end;
procedure TfrDesignerForm.PstBClick(Sender: TObject); //paste
var
i, minx, miny: Integer;
t, t1: TfrView;
begin
Unselect;
SelNum := 0;
minx := 32767; miny := 32767;
with ClipBd do
for i := 0 to Count-1 do
begin
t := TfrView(Items[i]);
if t.x < minx then minx := t.x;
if t.y < miny then miny := t.y;
end;
for i := 0 to ClipBd.Count - 1 do
begin
t := TfrView(ClipBd.Items[i]);
if t.Typ = gtBand then
if not (TfrBandView(t).BandType in [btMasterHeader..btSubDetailFooter,
btGroupHeader, btGroupFooter]) and
frCheckBand(TfrBandView(t).BandType) then
continue;
if PageView.Left < 0 then
t.x := t.x - minx + ((-PageView.Left) div GridSize * GridSize) else
t.x := t.x - minx;
if PageView.Top < 0 then
t.y := t.y - miny + ((-PageView.Top) div GridSize * GridSize) else
t.y := t.y - miny;
Inc(SelNum);
t1 := frCreateObject(t.Typ, t.ClassName, Page);
t1.Assign(t);
if CurReport.FindObject(t1.Name) <> nil then
t1.CreateUniqueName;
end;
SelectionChanged;
SendBandsToDown;
PageView.GetMultipleSelected;
RedrawPage;
AddUndoAction(acInsert);
end;
procedure TfrDesignerForm.UndoBClick(Sender: TObject); // undo
begin
Undo(@FUndoBuffer);
end;
procedure TfrDesignerForm.RedoBClick(Sender: TObject); // redo
begin
Undo(@FRedoBuffer);
end;
procedure TfrDesignerForm.SelAllBClick(Sender: TObject); // select all
begin
PageView.NPEraseSelection;
SelectAll;
PageView.GetMultipleSelected;
PageView.NPDrawSelection;
SelectionChanged;
end;
procedure TfrDesignerForm.ExitBClick(Sender: TObject);
begin
{$IFDEF MODALDESIGNER}
ModalResult := mrOk;
{$ELSE}
Close;
{$ENDIF}
end;
procedure TfrDesignerForm.N5Click(Sender: TObject); // popup delete command
begin
DeleteObjects;
end;
procedure TfrDesignerForm.N6Click(Sender: TObject); // popup edit command
begin
ShowEditor;
end;
procedure TfrDesignerForm.FileBtn1Click(Sender: TObject); // create new
begin
CreateNewReport;
end;
procedure TfrDesignerForm.N23Click(Sender: TObject); // create new from template
begin
frTemplForm := TfrTemplForm.Create(nil);
with frTemplForm do
if ShowModal = mrOk then
begin
if DefaultTemplate then
CreateNewReport
else
begin
ClearUndoBuffer;
if ExtractFileExt(TemplName) = '.lrt' then
CurReport.LoadTemplateXML(TemplName, nil, nil, True)
else
CurReport.LoadTemplate(TemplName, nil, nil, True);
CurDocName := sUntitled;
CurPage := 0; // do all
end;
end;
frTemplForm.Free;
end;
procedure TfrDesignerForm.N42Click(Sender: TObject); // var editor
begin
if ShowEvEditor(CurReport) then
Modified := True;
end;
procedure TfrDesignerForm.PgB3Click(Sender: TObject); // page setup
var
w, h, p: Integer;
begin
frPgoptForm := TfrPgoptForm.Create(nil);
with frPgoptForm, Page do
begin
CB1.Checked := PrintToPrevPage;
CB5.Checked := not UseMargins;
if Orientation = poPortrait then
RB1.Checked := True
else
RB2.Checked := True;
ComB1.Items := Prn.PaperNames;
ComB1.ItemIndex := Prn.GetArrayPos(pgSize);
E1.Text := ''; E2.Text := '';
if pgSize = $100 then
begin
E1.Text := IntToStr(Width div 10);
E2.Text := IntToStr(Height div 10);
end;
E3.Text := IntToStr(Margins.Left * 5 div 18);
E4.Text := IntToStr(Margins.Top * 5 div 18);
E5.Text := IntToStr(Margins.Right * 5 div 18);
E6.Text := IntToStr(Margins.Bottom * 5 div 18);
E7.Text := IntToStr(ColGap * 5 div 18);
ecolCount.Value := ColCount;
if LayoutOrder = loColumns then
RBColumns.Checked := true
else
RBRows.Checked := true;
WasOk := False;
if ShowModal = mrOk then
begin
Modified := True;
// FileModified := True;
WasOk := True;
PrintToPrevPage := CB1.Checked;
UseMargins := not CB5.Checked;
if RB1.Checked then
Orientation := poPortrait
else
Orientation := poLandscape;
if RBColumns.Checked then
LayoutOrder := loColumns
else
LayoutOrder := loRows;
p := Prn.PaperSizes[ComB1.ItemIndex];
w := 0; h := 0;
if p = $100 then
try
w := StrToInt(E1.Text) * 10;
h := StrToInt(E2.Text) * 10;
except
on exception do p := 9; // A4
end;
try
Margins.AsRect := Rect(StrToInt(E3.Text) * 18 div 5,
StrToInt(E4.Text) * 18 div 5,
StrToInt(E5.Text) * 18 div 5,
StrToInt(E6.Text) * 18 div 5);
ColGap := StrToInt(E7.Text) * 18 div 5;
except
on exception do
begin
Margins.AsRect := Rect(0, 0, 0, 0);
ColGap := 0;
end;
end;
ColCount := ecolCount.Value;
ChangePaper(p, w, h, Orientation);
CurPage := CurPage; // for repaint and other
UpdScrollbars;
end;
end;
frPgoptForm.Free;
end;
procedure TfrDesignerForm.N8Click(Sender: TObject); // report setup
begin
frDocOptForm := TfrDocOptForm.Create(nil);
with frDocOptForm do
begin
CB1.Checked := not CurReport.PrintToDefault;
CB2.Checked := CurReport.DoublePass;
edTitle.Text := CurReport.Title;
edComments.Text := CurReport.Comments.Text;
edKeyWords.Text := CurReport.KeyWords;
edSubject.Text := CurReport.Subject;
edAutor.Text := CurReport.ReportAutor;
edtMaj.Text := CurReport.ReportVersionMajor;
edtMinor.Text := CurReport.ReportVersionMinor;
edtRelease.Text := CurReport.ReportVersionRelease;
edtBuild.Text := CurReport.ReportVersionBuild;
edtRepCreateDate.Text := DateTimeToStr(CurReport.ReportCreateDate);
edtRepLastChangeDate.Text := DateTimeToStr(CurReport.ReportLastChange);
if ShowModal = mrOk then
begin
CurReport.PrintToDefault := not CB1.Checked;
CurReport.DoublePass := CB2.Checked;
CurReport.ChangePrinter(Prn.PrinterIndex, ListBox1.ItemIndex);
{$IFDEF USE_PRINTER_FONTS}
// printer may have been changed, invalidate current list of fonts
C2.Items.Clear;
{$ENDIF}
CurReport.Title:=edTitle.Text;
CurReport.Subject:=edSubject.Text;
CurReport.KeyWords:=edKeyWords.Text;
CurReport.Comments.Text:=edComments.Text;
CurReport.ReportVersionMajor:=edtMaj.Text;
CurReport.ReportVersionMinor:=edtMinor.Text;
CurReport.ReportVersionRelease:=edtRelease.Text;
CurReport.ReportVersionBuild:=edtBuild.Text;
CurReport.ReportAutor:=edAutor.Text;
Modified := True;
end;
CurPage := CurPage;
Free;
end;
end;
procedure TfrDesignerForm.N14Click(Sender: TObject); // grid menu
var
DesOptionsForm: TfrDesOptionsForm;
begin
DesOptionsForm := TfrDesOptionsForm.Create(nil);
with DesOptionsForm do
begin
CB1.Checked := ShowGrid;
CB2.Checked := GridAlign;
case GridSize of
4: RB1.Checked := True;
8: RB2.Checked := True;
18: RB3.Checked := True;
end;
if ShapeMode = smFrame then
RB4.Checked := True
else
RB5.Checked := True;
case Units of
ruPixels: RB6.Checked := True;
ruMM: RB7.Checked := True;
ruInches: RB8.Checked := True;
end;
//CB3.Checked := not GrayedButtons;
CB4.Checked := EditAfterInsert;
CB5.Checked := ShowBandTitles;
DesOptionsForm.ComboBox2.Text:=edtScriptFontName;
DesOptionsForm.SpinEdit2.Value:=edtScriptFontSize;
if ShowModal = mrOk then
begin
ShowGrid := CB1.Checked;
GridAlign := CB2.Checked;
if RB1.Checked then
GridSize := 4
else if RB2.Checked then
GridSize := 8
else
GridSize := 18;
if RB4.Checked then
ShapeMode := smFrame
else
ShapeMode := smAll;
if RB6.Checked then
Units := ruPixels
else if RB7.Checked then
Units := ruMM
else
Units := ruInches;
//GrayedButtons := not CB3.Checked;
EditAfterInsert := CB4.Checked;
ShowBandTitles := CB5.Checked;
edtScriptFontName:=DesOptionsForm.ComboBox2.Text;
edtScriptFontSize:=DesOptionsForm.SpinEdit2.Value;
RedrawPage;
SaveState;
end;
Free;
end;
end;
procedure TfrDesignerForm.GB1Click(Sender: TObject);
begin
ShowGrid := GB1.Down;
end;
procedure TfrDesignerForm.ScrollBox1DragDrop(Sender, Source: TObject; X,
Y: Integer);
var
Control :TControl;
t : TfrCustomMemoView;
dx, dy:integer;
begin
Control:=lrDesignAcceptDrag(Source);
if Assigned(lrFieldsList) and ((Control = lrFieldsList.lbFieldsList) or (Control = lrFieldsList.ValList)) then
begin
{ Objects.Add(frCreateObject(gtMemo, '', Page));
t:=TfrCustomMemoView(Objects.Last);}
t:=frCreateObject(gtMemo, '', Page) as TfrCustomMemoView;
if Assigned(t) then
begin
t.MonitorFontChanges;
t.Memo.Text:='['+lrFieldsList.SelectedField+']';
t.CreateUniqueName;
t.Canvas:=Canvas;
GetDefaultSize(dx, dy);
t.x := X;
t.y := Y;
t.dx := DX;
t.dy := DY;
{$ifdef ppaint}
PageView.NPEraseSelection;
{$endif}
Unselect;
t.FrameWidth := LastFrameWidth;
t.FrameColor := LastFrameColor;
t.FillColor := LastFillColor;
t.Selected := True;
if t.Typ <> gtBand then
t.Frames:=LastFrames;
t.Font.Name := LastFontName;
t.Font.Size := LastFontSize;
t.Font.Color := LastFontColor;
t.Font.Style := frSetFontStyle(LastFontStyle);
t.Adjust := LastAdjust;
SelNum := 1;
PageView.NPRedrawViewCheckBand(t);
SelectionChanged;
AddUndoAction(acInsert);
if Page is TfrPageReport then
OB1.Down := True
else
OB7.Down := True
end;
end;
end;
procedure TfrDesignerForm.ScrollBox1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
Control :TControl;
begin
Accept:= false;
if Page is TfrPageDialog then Exit;
Control:=lrDesignAcceptDrag(Source);
if Assigned(lrFieldsList) then
Accept:= (Control = lrFieldsList.lbFieldsList) or (Control = lrFieldsList.ValList);
end;
procedure TfrDesignerForm.tlsDBFieldsExecute(Sender: TObject);
begin
if Assigned(lrFieldsList) then
FreeThenNil(lrFieldsList)
else
lrFieldsList:=TlrFieldsList.Create(Self);
tlsDBFields.Checked:=Assigned(lrFieldsList);
end;
procedure TfrDesignerForm.GB2Click(Sender: TObject);
begin
GridAlign := GB2.Down;
end;
procedure TfrDesignerForm.GB3Click(Sender: TObject);
var
i: Integer;
t: TfrView;
begin
AddUndoAction(acEdit);
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
begin
t.x := Round(t.x / GridSize) * GridSize;
t.y := Round(t.y / GridSize) * GridSize;
t.dx := Round(t.dx / GridSize) * GridSize;
t.dy := Round(t.dy / GridSize) * GridSize;
if t.dx = 0 then t.dx := GridSize;
if t.dy = 0 then t.dy := GridSize;
end;
end;
RedrawPage;
ShowPosition;
PageView.GetMultipleSelected;
end;
procedure TfrDesignerForm.Tab1Change(Sender: TObject);
begin
if not fInBuildPage and (Tab1.TabIndex>=0) and (CurPage<>Tab1.TabIndex) then
CurPage := Tab1.TabIndex;
end;
procedure TfrDesignerForm.Popup1Popup(Sender: TObject);
var
i: Integer;
t, t1: TfrView;
fl: Boolean;
begin
DeleteMenuItems(N2.Parent);
EnableControls;
while Popup1.Items.Count > 7 do
Popup1.Items.Delete(7);
if SelNum = 1 then
begin
DefineExtraPopupSelected(Popup1);
TfrView(Objects[TopSelected]).DefinePopupMenu(Popup1);
end
else
if SelNum > 1 then
begin
t := TfrView(Objects[TopSelected]);
fl := True;
for i := 0 to Objects.Count - 1 do
begin
t1 := TfrView(Objects[i]);
if t1.Selected then
if not (((t is TfrCustomMemoView) and (t1 is TfrCustomMemoView)) or
((t.Typ <> gtAddIn) and (t.Typ = t1.Typ)) or
((t.Typ = gtAddIn) and (t.ClassName = t1.ClassName))) then
begin
fl := False;
break;
end;
end;
if fl and not (t.Typ = gtBand) then
t.DefinePopupMenu(Popup1);
end;
FillMenuItems(N2.Parent);
SetMenuItemBitmap(N2, CutB);
SetMenuItemBitmap(N1, CopyB);
SetMenuItemBitmap(N3, PstB);
SetMenuItemBitmap(N16, SelAllB);
end;
procedure TfrDesignerForm.N37Click(Sender: TObject);
begin // toolbars
Pan1.Checked := Panel1.IsVisible;
Pan2.Checked := Panel2.IsVisible;
Pan3.Checked := Panel3.IsVisible;
Pan4.Checked := Panel4.IsVisible;
Pan5.Checked := ObjInsp.Visible;
Pan6.Checked := Panel5.Visible;
Pan7.Checked := Panel6.Visible;
end;
procedure TfrDesignerForm.Pan2Click(Sender: TObject);
procedure SetShow(c: Array of TWinControl; i: Integer; b: Boolean);
begin
if c[i] is TPanel then
begin
with c[i] as TPanel do
begin
Visible:=b;
{if IsFloat then
FloatWindow.Visible := b
else
begin
if b then
AddToDock(Parent as TPanel);
Visible := b;
(Parent as TPanel).AdjustBounds;
end; }
end;
end
else TForm(c[i]).Visible:=b;
end;
begin // each toolbar
with Sender as TMenuItem do
begin
Checked := not Checked;
SetShow([Panel1, Panel2, Panel3, Panel4, Panel5, ObjInsp, Panel6], Tag, Checked);
end;
end;
procedure TfrDesignerForm.N34Click(Sender: TObject);
begin // about box
frAboutForm := TfrAboutForm.Create(nil);
frAboutForm.ShowModal;
frAboutForm.Free;
end;
procedure TfrDesignerForm.Tab1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
p: TPoint;
begin
GetCursorPos(p{%H-});
if Button = mbRight then
Popup2.PopUp(p.X,p.Y);
//**
{if Button = mbRight then
TrackPopupMenu(Popup2.Handle,
TPM_LEFTALIGN or TPM_RIGHTBUTTON, p.X, p.Y, 0, Handle, nil);
}
end;
procedure TfrDesignerForm.frDesignerFormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
ObjInsp.ShowHint := False;
end;
procedure TfrDesignerForm.frDesignerFormCloseQuery(Sender: TObject;
var CanClose: boolean);
var
Res:integer;
begin
// if FileModified and (CurReport<>nil) and
if (not PreparedReportEditor) and Modified and (CurReport<>nil) and
(not ((csDesigning in CurReport.ComponentState) and CurReport.StoreInForm)) then
begin
Res:=Application.MessageBox(PChar(sSaveChanges + ' ' + sTo + ' ' + ExtractFileName(CurDocName) + '?'),
PChar(sConfirm), mb_IconQuestion + mb_YesNoCancel);
case Res of
mrNo:
begin
CanClose := True;
// FileModified := False; // no means don't want changes
Modified := False; // no means don't want changes
ModalResult := mrCancel;
end;
mrYes:
begin
FileSave.Execute;
// FileBtn3Click(nil);
// CanClose := not FileModified;
CanClose := not Modified;
end;
else
CanClose := False;
end;
end;
end;
{----------------------------------------------------------------------------}
// state storing/retrieving
const
rsGridShow = 'GridShow';
rsGridAlign = 'GridAlign';
rsGridSize = 'GridSize';
rsUnits = 'Units';
rsButtons = 'GrayButtons';
rsEdit = 'EditAfterInsert';
rsSelection = 'Selection';
procedure TfrDesignerForm.SaveState;
var
Ini:TIniFile;
procedure DoSaveToolbars(t: Array of TPanel);
var
i: Integer;
begin
for i := Low(t) to High(t) do
begin
{ if FirstInstance or (t[i] <> Panel6) then
SaveToolbarPosition(t[i]);
t[i].IsVisible:= False;}
end;
end;
begin
Ini:=TIniFile.Create(IniFileName);
Ini.WriteString('frEditorForm', 'ScriptFontName', edtScriptFontName);
Ini.WriteInteger('frEditorForm', 'ScriptFontSize', edtScriptFontSize);
Ini.WriteBool('frEditorForm', rsGridShow, ShowGrid);
Ini.WriteBool('frEditorForm', rsGridAlign, GridAlign);
Ini.WriteInteger('frEditorForm', rsGridSize, GridSize);
Ini.WriteInteger('frEditorForm', rsUnits, Word(Units));
Ini.WriteBool('frEditorForm', rsButtons, GrayedButtons);
Ini.WriteBool('frEditorForm', rsEdit, EditAfterInsert);
Ini.WriteInteger('frEditorForm', rsSelection, Integer(ShapeMode));
DoSaveToolbars([Panel1, Panel2, Panel3, Panel4, Panel5, Panel6]);
// Save ObjInsp Position
Ini.WriteInteger('ObjInsp', 'Left', ObjInsp.Left);
Ini.WriteInteger('ObjInsp', 'Top', ObjInsp.Top);
{ if SpeedButton1.Caption = '+' then
Ini.WriteInteger('Position', 'Height', FLastHeight)
else
Ini.WriteInteger('Position', 'Height', Height);}
Ini.WriteInteger('ObjInsp', 'Width', ObjInsp.Width);
Ini.WriteBool('ObjInsp', 'Visible', ObjInsp.Visible);
Ini.Free;
// ObjInsp.Visible:=False;
end;
procedure TfrDesignerForm.RestoreState;
var
Ini:TIniFile;
{var
Ini: TRegIniFile;
Nm: String;
//** procedure DoRestoreToolbars(t: Array of TPanel);
var
i: Integer;
begin
for i := Low(t) to High(t) do
RestoreToolbarPosition(t[i]);
end;
}
begin
if FileExistsUTF8(IniFileName) then
begin
Ini:=TIniFile.Create(IniFileName);
edtScriptFontName:=Ini.ReadString('frEditorForm', 'ScriptFontName', edtScriptFontName);
edtScriptFontSize:=Ini.ReadInteger('frEditorForm', 'ScriptFontSize', edtScriptFontSize);
GridSize := Ini.ReadInteger('frEditorForm', rsGridSize, 4);
GridAlign := Ini.ReadBool('frEditorForm', rsGridAlign, True);
ShowGrid := Ini.ReadBool('frEditorForm', rsGridShow, True);
Units := TfrReportUnits(Ini.ReadInteger('frEditorForm', rsUnits, 0));
// GrayedButtons := Ini.ReadBool('frEditorForm', rsButtons, False);
EditAfterInsert := Ini.ReadBool('frEditorForm', rsEdit, True);
ShapeMode := TfrShapeMode(Ini.ReadInteger('frEditorForm', rsSelection, 1));
ObjInsp.Left:=Ini.ReadInteger('ObjInsp', 'Left', ObjInsp.Left);
ObjInsp.Top:=Ini.ReadInteger('ObjInsp', 'Top', ObjInsp.Top);
{ if SpeedButton1.Caption = '+' then
Ini.WriteInteger('Position', 'Height', FLastHeight)
else
Ini.WriteInteger('Position', 'Height', Height);}
ObjInsp.Width:=Ini.ReadInteger('ObjInsp', 'Width', ObjInsp.Width);
ObjInsp.Visible:=Ini.ReadBool('ObjInsp', 'Visible', ObjInsp.Visible);
Ini.Free;
end;
{ Ini := TRegIniFile.Create(RegRootKey);
Nm := rsForm + Name;
Ini.Free;
//** DoRestoreToolbars([Panel1, Panel2, Panel3, Panel4, Panel5, Panel6]);
if Panel6.Height < 26 then
Panel6.Height := 26;
if Panel6.Width < 26 then
Panel6.Width := 26;
if Panel6.ControlCount < 2 then
Panel6.Hide;
frDock1.AdjustBounds;
frDock2.AdjustBounds;
frDock3.AdjustBounds;
frDock4.AdjustBounds;
RestoreFormPosition(InspForm);
}
//TODO: restore ObjInsp position and size
(*
GridSize := 4;
GridAlign := True;
ShowGrid := False; //True;
Units := TfrReportUnits(0);
//GrayedButtons := True; //False;
EditAfterInsert := True;
ShapeMode := TfrShapeMode(1);
*)
if Panel6.Height < 26 then
Panel6.Height := 26;
if Panel6.Width < 26 then
Panel6.Width := 26;
if Panel6.ControlCount < 2 then
Panel6.Hide;
end;
{----------------------------------------------------------------------------}
// menu bitmaps
procedure TfrDesignerForm.SetMenuBitmaps;
var
i: Integer;
begin
MaxItemWidth := 0; MaxShortCutWidth := 0;
FillMenuItems(FileMenu);
FillMenuItems(EditMenu);
FillMenuItems(ToolMenu);
FillMenuItems(HelpMenu);
SetMenuItemBitmap(N23, FileBtn1);
// SetMenuItemBitmap(N19, FileBtn2);
// SetMenuItemBitmap(N20, FileBtn3);
// SetMenuItemBitmap(N39, FileBtn4);
SetMenuItemBitmap(N10, ExitB);
SetMenuItemBitmap(N46, UndoB);
SetMenuItemBitmap(N48, RedoB);
SetMenuItemBitmap(N11, CutB);
SetMenuItemBitmap(N12, CopyB);
SetMenuItemBitmap(N13, PstB);
SetMenuItemBitmap(N28, SelAllB);
SetMenuItemBitmap(N29, PgB1);
SetMenuItemBitmap(N30, PgB2);
SetMenuItemBitmap(N32, ZB1);
SetMenuItemBitmap(N33, ZB2);
SetMenuItemBitmap(N35, HelpBtn);
{
for i := 0 to Panel6.ControlCount-1 - 1 do
begin
if Panel6.Controls[i] is TSpeedButton then
SetMenuItemBitmap(MastMenu.Items[i], Panel6.Controls[i] as TSpeedButton);
end;
}
SetMenuItemBitmap(N41, PgB1);
SetMenuItemBitmap(N43, PgB2);
SetMenuItemBitmap(N44, PgB3);
end;
function TfrDesignerForm.FindMenuItem(AMenuItem: TMenuItem): TfrMenuItemInfo;
var
i: Integer;
begin
Result := nil;
for i := 0 to MenuItems.Count - 1 do
if TfrMenuItemInfo(MenuItems[i]).MenuItem = AMenuItem then
begin
Result := TfrMenuItemInfo(MenuItems[i]);
Exit;
end;
end;
procedure TfrDesignerForm.SetMenuItemBitmap(AMenuItem: TMenuItem; ABtn: TSpeedButton);
var
m: TfrMenuItemInfo;
begin
m := FindMenuItem(AMenuItem);
if m = nil then
begin
m := TfrMenuItemInfo.Create;
m.MenuItem := AMenuItem;
MenuItems.Add(m);
end;
m.Btn := ABtn;
//**
{ ModifyMenu(AMenuItem.Parent.Handle, AMenuItem.MenuIndex,
MF_BYPOSITION + MF_OWNERDRAW, AMenuItem.Command, nil);
}
end;
procedure TfrDesignerForm.FillMenuItems(MenuItem: TMenuItem);
var
i: Integer;
m: TMenuItem;
begin
for i := 0 to MenuItem.Count - 1 do
begin
m := MenuItem.Items[i];
SetMenuItemBitmap(m, nil);
if m.Count > 0 then FillMenuItems(m);
end;
end;
procedure TfrDesignerForm.DeleteMenuItems(MenuItem: TMenuItem);
var
i, j: Integer;
m: TMenuItem;
begin
for i := 0 to MenuItem.Count - 1 do
begin
m := MenuItem.Items[i];
for j := 0 to MenuItems.Count - 1 do
if TfrMenuItemInfo(MenuItems[j]).MenuItem = m then
begin
TfrMenuItemInfo(MenuItems[j]).Free;
MenuItems.Delete(j);
break;
end;
end;
end;
procedure TfrDesignerForm.DoDrawText(aCanvas: TCanvas; aCaption: string;
Rect: TRect; Selected, aEnabled: Boolean; Flags: Longint);
begin
with aCanvas do
begin
Brush.Style := bsClear;
if not aEnabled then
begin
if not Selected then
begin
OffsetRect(Rect, 1, 1);
Font.Color := clBtnHighlight;
DrawText(Handle, PChar(Caption), Length(Caption), Rect, Flags);
OffsetRect(Rect, -1, -1);
end;
Font.Color := clBtnShadow;
end;
DrawText(Handle, PChar(aCaption), Length(aCaption), Rect, Flags);
Brush.Style := bsSolid;
end;
end;
procedure TfrDesignerForm.DrawItem(AMenuItem: TMenuItem; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
var
GlyphRect: TRect;
Btn: TSpeedButton;
Glyph: TBitmap;
begin
MaxItemWidth := 0;
MaxShortCutWidth := 0;
with ACanvas do
begin
if Selected then
begin
Brush.Color := clHighlight;
Font.Color := clHighlightText
end
else
begin
Brush.Color := clMenu;
Font.Color := clMenuText;
end;
if AMenuItem.Caption <> '-' then
begin
FillRect(ARect);
Btn := FindMenuItem(AMenuItem).Btn;
GlyphRect := Bounds(ARect.Left + 1, ARect.Top + (ARect.Bottom - ARect.Top - 16) div 2, 16, 16);
if AMenuItem.Checked then
begin
Glyph := TBitmap.Create;
if AMenuItem.RadioItem then
begin
// todo
//** Glyph.Handle := LoadBitmap(hInstance, 'FR_RADIO');
//BrushCopy(GlyphRect, Glyph, Rect(0, 0, 16, 16), Glyph.TransparentColor);
end
else
begin
//** Glyph.Handle := LoadBitmap(hInstance, 'FR_CHECK');
Draw(GlyphRect.Left, GlyphRect.Top, Glyph);
end;
Glyph.Free;
end
else if Btn <> nil then
begin
Glyph := TBitmap.Create;
Glyph.Width := 16; Glyph.Height := 16;
// todo
//** Btn.DrawGlyph(Glyph.Canvas, 0, 0, AMenuItem.Enabled);
//BrushCopy(GlyphRect, Glyph, Rect(0, 0, 16, 16), Glyph.TransparentColor);
Glyph.Free;
end;
ARect.Left := GlyphRect.Right + 4;
end;
if AMenuItem.Caption <> '-' then
begin
OffsetRect(ARect, 0, 2);
DoDrawText(ACanvas, AMenuItem.Caption, ARect, Selected, AMenuItem.Enabled, DT_LEFT);
if AMenuItem.ShortCut <> 0 then
begin
ARect.Left := StrToInt(ItemWidths.Values[AMenuItem.Parent.Name]) + 6;
DoDrawText(ACanvas, ShortCutToText(AMenuItem.ShortCut), ARect,
Selected, AMenuItem.Enabled, DT_LEFT);
end;
end
else
begin
Inc(ARect.Top, 4);
DrawEdge(Handle, ARect, EDGE_ETCHED, BF_TOP);
end;
end;
end;
procedure TfrDesignerForm.MeasureItem(AMenuItem: TMenuItem; ACanvas: TCanvas;
var AWidth, AHeight: Integer);
var
w: Integer;
begin
w := ACanvas.TextWidth(AMenuItem.Caption) + 31;
if MaxItemWidth < w then
MaxItemWidth := w;
ItemWidths.Values[AMenuItem.Parent.Name] := IntToStr(MaxItemWidth);
if AMenuItem.ShortCut <> 0 then
begin
w := ACanvas.TextWidth(ShortCutToText(AMenuItem.ShortCut)) + 15;
if MaxShortCutWidth < w then
MaxShortCutWidth := w;
end;
if frGetWindowsVersion = '98' then
AWidth := MaxItemWidth
else
AWidth := MaxItemWidth + MaxShortCutWidth;
if AMenuItem.Caption <> '-' then
AHeight := 19 else
AHeight := 10;
end;
procedure TfrDesignerForm.WndProc(var Message: TLMessage);
//var
//MenuItem: TMenuItem;
//CCanvas: TCanvas;
function FindItem(ItemId: Integer): TMenuItem;
begin
Result := MainMenu1.FindItem(ItemID, fkCommand);
if Result = nil then
Result := Popup1.FindItem(ItemID, fkCommand);
if Result = nil then
Result := Popup2.FindItem(ItemID, fkCommand);
end;
begin
case Message.Msg of
LM_COMMAND:
if Popup1.DispatchCommand(Message.wParam) or
Popup2.DispatchCommand(Message.wParam) then Exit;
//**
{ LM_INITMENUPOPUP:
with TWMInitMenuPopup(Message) do
if Popup1.DispatchPopup(MenuPopup) or
Popup2.DispatchPopup(MenuPopup) then Exit;
}
(*
LM_DRAWITEM:
with PDrawItemStruct(Message.LParam)^ do
begin
if (CtlType = ODT_MENU) and (Message.WParam = 0) then
begin
MenuItem := FindItem(ItemId);
if MenuItem <> nil then
begin
CCanvas := TControlCanvas.Create;
with CCanvas do
begin
Handle := _hDC;
DrawItem(MenuItem, CCanvas, rcItem, ItemState{//** and ODS_SELECTED} <> 0);
Free;
end;
Exit;
end;
end;
end;
LM_MEASUREITEM:
with PMeasureItemStruct(Message.LParam)^ do
begin
if (CtlType = ODT_MENU) and (Message.WParam = 0) then
begin
MenuItem := FindItem(ItemId);
if MenuItem <> nil then
begin
MeasureItem(MenuItem, Canvas, Integer(ItemWidth), Integer(ItemHeight));
Exit;
end;
end;
end;
*)
end;
inherited WndProc(Message);
end;
{----------------------------------------------------------------------------}
// alignment palette
function GetFirstSelected: TfrView;
begin
if TfrDesignerForm(frDesigner).FirstSelected <> nil then
Result := TfrDesignerForm(frDesigner).FirstSelected
else
Result :=TfrView(Objects[TopSelected]);
end;
function GetLeftObject: Integer;
var
i: Integer;
t: TfrView;
x: Integer;
begin
t := TfrView(Objects[TopSelected]);
x := t.x;
Result := TopSelected;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
if t.x < x then
begin
x := t.x;
Result := i;
end;
end;
end;
function GetRightObject: Integer;
var
i: Integer;
t: TfrView;
x: Integer;
begin
t :=TfrView(Objects[TopSelected]);
x := t.x + t.dx;
Result := TopSelected;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
if t.x + t.dx > x then
begin
x := t.x + t.dx;
Result := i;
end;
end;
end;
function GetTopObject: Integer;
var
i: Integer;
t: TfrView;
y: Integer;
begin
t := TfrView(Objects[TopSelected]);
y := t.y;
Result := TopSelected;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
if t.y < y then
begin
y := t.y;
Result := i;
end;
end;
end;
function GetBottomObject: Integer;
var
i: Integer;
t: TfrView;
y: Integer;
begin
t := TfrView(Objects[TopSelected]);
y := t.y + t.dy;
Result := TopSelected;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
if t.y + t.dy > y then
begin
y := t.y + t.dy;
Result := i;
end;
end;
end;
procedure TfrDesignerForm.Align1Click(Sender: TObject);
var
i: Integer;
t: TfrView;
x: Integer;
begin
if SelNum < 2 then Exit;
BeforeChange;
t := GetFirstSelected;
x := t.x;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
t.x := x;
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align6Click(Sender: TObject);
var
i: Integer;
t: TfrView;
y: Integer;
begin
if SelNum < 2 then Exit;
BeforeChange;
t := GetFirstSelected;
y := t.y;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
t.y := y;
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align5Click(Sender: TObject);
var
i: Integer;
t: TfrView;
x: Integer;
begin
if SelNum < 2 then Exit;
BeforeChange;
t := GetFirstSelected;
x := t.x+t.dx;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
t.x := x - t.dx;
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align10Click(Sender: TObject);
var
i: Integer;
t: TfrView;
y: Integer;
begin
if SelNum < 2 then Exit;
BeforeChange;
t := GetFirstSelected;
y := t.y + t.dy;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
t.y := y - t.dy;
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align2Click(Sender: TObject);
var
i: Integer;
t: TfrView;
x: Integer;
begin
if SelNum < 2 then Exit;
BeforeChange;
t := GetFirstSelected;
x := t.x + t.dx div 2;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
t.x := x - t.dx div 2;
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align7Click(Sender: TObject);
var
i: Integer;
t: TfrView;
y: Integer;
begin
if SelNum < 2 then Exit;
BeforeChange;
t := GetFirstSelected;
y := t.y + t.dy div 2;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
t.y := y - t.dy div 2;
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align3Click(Sender: TObject);
var
i: Integer;
t: TfrView;
x: Integer;
begin
if SelNum = 0 then Exit;
BeforeChange;
t := TfrView(Objects[GetLeftObject]);
x := t.x;
t := TfrView(Objects[GetRightObject]);
x := x + (t.x + t.dx - x - Page.PrnInfo.Pgw) div 2;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then Dec(t.x, x);
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align8Click(Sender: TObject);
var
i: Integer;
t: TfrView;
y: Integer;
begin
if SelNum = 0 then Exit;
BeforeChange;
t := TfrView(Objects[GetTopObject]);
y := t.y;
t := TfrView(Objects[GetBottomObject]);
y := y + (t.y + t.dy - y - Page.PrnInfo.Pgh) div 2;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then Dec(t.y, y);
end;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align4Click(Sender: TObject);
var
s: TStringList;
i, dx: Integer;
t: TfrView;
begin
if SelNum < 3 then Exit;
BeforeChange;
s := TStringList.Create;
s.Sorted := True;
s.Duplicates := dupAccept;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then s.AddObject(Format('%4.4d', [t.x]), t);
end;
dx := (TfrView(s.Objects[s.Count - 1]).x - TfrView(s.Objects[0]).x) div (s.Count - 1);
for i := 1 to s.Count - 2 do
TfrView(s.Objects[i]).x := TfrView(s.Objects[i-1]).x + dx;
s.Free;
PageView.GetMultipleSelected;
RedrawPage;
end;
procedure TfrDesignerForm.Align9Click(Sender: TObject);
var
s: TStringList;
i, dy: Integer;
t: TfrView;
begin
if SelNum < 3 then Exit;
BeforeChange;
s := TStringList.Create;
s.Sorted := True;
s.Duplicates := dupAccept;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then s.AddObject(Format('%4.4d', [t.y]), t);
end;
dy := (TfrView(s.Objects[s.Count - 1]).y - TfrView(s.Objects[0]).y) div (s.Count - 1);
for i := 1 to s.Count - 2 do
TfrView(s.Objects[i]).y := TfrView(s.Objects[i - 1]).y + dy;
s.Free;
PageView.GetMultipleSelected;
RedrawPage;
end;
{----------------------------------------------------------------------------}
// miscellaneous
function Objects: TFpList;
begin
if Assigned(frDesigner) and Assigned(frDesigner.Page) then
Result := frDesigner.Page.Objects
else
Result := nil;
end;
procedure frSetGlyph(aColor: TColor; sb: TSpeedButton; n: Integer);
var
b : TBitmap;
s : TMemoryStream;
r : TRect;
t : TfrView;
i : Integer;
begin
{$IFDEF DebugLR}
DebugLn('frSetGlyph(%s,%s,%d)',[colortostring(acolor),sb.Name,n]);
DebugLn('ColorLocked=%s sb.tag=%s',[dbgs(ColorLocked),dbgs(sb.tag)]);
{$ENDIF}
B:=sb.Glyph;
b.Width := 32;
b.Height:= 16;
with b.Canvas do
begin
b.Canvas.Handle; // force handle creation
Brush.Color:=clWhite;
FillRect(ClipRect);
r := Rect(n * 32, 0, n * 32 + 32, 16);
CopyRect(Rect(0, 0, 32, 16),
TfrDesignerForm(frDesigner).Image1.Picture.Bitmap.Canvas, r);
// JRA: workaround for copyrect not using transparency
// and bitmap using transparency only on reading stream
S := TMemorystream.Create;
B.SaveToStream(S);
S.Position:=0;
B.Transparent := True;
B.LoadFromStream(S);
S.Free;
if aColor = clNone then
begin
Brush.Color:=clBtnFace;
Pen.Color :=clBtnFace;
end
else
begin
Brush.Color:=aColor;
Pen.Color:=aColor;
end;
Rectangle(Rect(0,12,15,15));
end;
i:=TopSelected;
if (i>-1) and not ColorLocked then
begin
t := TfrView(Objects[i]);
{$IFDEF DebugLR}
DebugLn('frSetGlyph: TopSelected=%s', [t.Name]);
{$ENDIF}
Case Sb.Tag of
5 : t.FillColor:=aColor; {ClB1}
17 : if (t is TfrCustomMemoView) then {ClB2}
TfrCustomMemoView(t).Font.Color:=aColor;
19 : t.FrameColor:=aColor; {ClB3}
end;
end;
end;
function TopSelected: Integer;
var
i: Integer;
begin
if Assigned(Objects) then
begin
Result := Objects.Count - 1;
for i := Objects.Count - 1 downto 0 do
if TfrView(Objects[i]).Selected then
begin
Result := i;
break;
end;
end
else
Result:=-1;
end;
function frCheckBand(b: TfrBandType): Boolean;
var
i: Integer;
t: TfrView;
begin
Result := False;
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Typ = gtBand then
if b = TfrBandView(t).BandType then
begin
Result := True;
break;
end;
end;
end;
function GetUnusedBand: TfrBandType;
var
b: TfrBandType;
begin
Result := btNone;
for b := btReportTitle to btNone do
if not frCheckBand(b) then
begin
Result := b;
break;
end;
if Result = btNone then Result := btMasterData;
end;
procedure SendBandsToDown;
var
i, j, n, k: Integer;
t: TfrView;
begin
n := Objects.Count; j := 0; i := n - 1;
k := 0;
while j < n do
begin
t := TfrView(Objects[i]);
if t.Typ = gtBand then
begin
Objects.Delete(i);
Objects.Insert(0, t);
Inc(k);
end
else Dec(i);
Inc(j);
end;
for i := 0 to n - 1 do // sends btOverlay to back
begin
t := TfrView(Objects[i]);
if (t.Typ = gtBand) and (TfrBandView(t).BandType = btOverlay) then
begin
Objects.Delete(i);
Objects.Insert(0, t);
break;
end;
end;
i := 0; j := 0;
while j < n do // sends btCrossXXX to front
begin
t := TfrView(Objects[i]);
if (t.Typ = gtBand) and
(TfrBandView(t).BandType in [btCrossHeader..btCrossFooter]) then
begin
Objects.Delete(i);
Objects.Insert(k - 1, t);
end
else Inc(i);
Inc(j);
end;
end;
procedure ClearClipBoard;
var
t: TfrView;
begin
if Assigned(ClipBd) then
with ClipBd do
while Count > 0 do
begin
t := TfrView(Items[0]);
t.Free;
Delete(0);
end;
end;
procedure GetRegion;
var
i: Integer;
t: TfrView;
R,R1: HRGN;
begin
ClipRgn := CreateRectRgn(0, 0, 0, 0);
for i := 0 to Objects.Count - 1 do
begin
t := TfrView(Objects[i]);
if t.Selected then
begin
R := t.GetClipRgn(rtExtended);
R1:=CreateRectRgn(0, 0, 0, 0);
CombineRgn(ClipRgn, R1, R, RGN_OR);
DeleteObject(R);
DeleteObject(R1);
end;
end;
FirstChange := False;
end;
procedure TfrDesignerForm.GetDefaultSize(var dx, dy: Integer);
begin
dx := 96;
if GridSize = 18 then dx := 18 * 6;
dy := 18;
if GridSize = 18 then dy := 18;
if LastFontSize in [12, 13] then dy := 20;
if LastFontSize in [14..16] then dy := 24;
end;
procedure TfrDesignerForm.SB1Click(Sender: TObject);
var
d: Double;
begin
d := StrToFloat(E1.Text);
d := d + 1;
E1.Text := FloatToStrF(d, ffGeneral, 2, 2);
DoClick(E1);
end;
procedure TfrDesignerForm.SB2Click(Sender: TObject);
var
d: Double;
begin
d := StrToFloat(E1.Text);
d := d - 1;
if d <= 0 then d := 1;
E1.Text := FloatToStrF(d, ffGeneral, 2, 2);
DoClick(E1);
end;
{type
THackBtn = class(TSpeedButton);
}
procedure TfrDesignerForm.HelpBtnClick(Sender: TObject);
begin
HelpBtn.Down := True;
Screen.Cursor := crHelp;
SetCaptureControl(Self);
//** THackBtn(HelpBtn).FMouseInControl := False;
HelpBtn.Invalidate;
end;
procedure TfrDesignerForm.FormMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
c: TControl;
t: Integer;
begin
if HelpBtn.Down and (GetCaptureControl=Self) then
SetCaptureControl(nil);
HelpBtn.Down := False;
Screen.Cursor := crDefault;
c := FindControlAtPosition(Mouse.CursorPos, true);
if (c <> nil) and (c <> HelpBtn) then
begin
t := c.Tag;
if (c.Parent = Panel4) and (t > 4) then
t := 5;
if c.Parent = Panel4 then
Inc(t, 430) else
Inc(t, 400);
//DebugLn('TODO: HelpContext for tag=%d',[t]);
//** Application.HelpCommand(HELP_CONTEXTPOPUP, t);
end;
end;
procedure TfrDesignerForm.N22Click(Sender: TObject);
begin
//** Application.HelpCommand(HELP_FINDER, 0);
end;
procedure TfrDesignerForm.OnActivateApp(Sender: TObject);
procedure SetWinZOrder(Form: TForm);
begin
SetWindowPos(Form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or
SWP_NOSIZE or SWP_NOACTIVATE);
end;
begin
// SetWinZOrder(InspForm);
{//**
if Panel1.IsFloat then SetWinZOrder(Panel1.FloatWindow);
if Panel2.IsFloat then SetWinZOrder(Panel2.FloatWindow);
if Panel3.IsFloat then SetWinZOrder(Panel3.FloatWindow);
if Panel4.IsFloat then SetWinZOrder(Panel4.FloatWindow);
if Panel5.IsFloat then SetWinZOrder(Panel5.FloatWindow);
if Panel6.IsFloat then SetWinZOrder(Panel6.FloatWindow);
}
end;
procedure TfrDesignerForm.OnDeactivateApp(Sender: TObject);
procedure SetWinZOrder(Form: TForm);
begin
SetWindowPos(Form.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or
SWP_NOSIZE or SWP_NOACTIVATE);
end;
begin
if not Visible then Exit;
// SetWinZOrder(InspForm);
{//**
if Panel1.IsFloat then SetWinZOrder(Panel1.FloatWindow);
if Panel2.IsFloat then SetWinZOrder(Panel2.FloatWindow);
if Panel3.IsFloat then SetWinZOrder(Panel3.FloatWindow);
if Panel4.IsFloat then SetWinZOrder(Panel4.FloatWindow);
if Panel5.IsFloat then SetWinZOrder(Panel5.FloatWindow);
if Panel6.IsFloat then SetWinZOrder(Panel6.FloatWindow);
}
end;
Procedure InitGlobalDesigner;
begin
if Assigned(frDesigner) then
Exit;
frDesigner := TfrDesignerForm.Create(nil);
end;
{ TfrPanelObjectInspector }
{$IFNDEF EXTOI}
procedure TfrObjectInspector.BtnClick(Sender: TObject);
begin
if Sender=fBtn then
begin
if fBtn.Caption='-' then
begin
fLastHeight:=Height;
Height:=fPanelHeader.Height + 2*BorderWidth + 3;
fBtn.Caption:='+';
end
else
begin
Height:=fLastHeight;
fBtn.Caption:='-';
end;
end
else Visible:=False;
end;
procedure TfrObjectInspector.HeaderMDown(Sender: TOBject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button=mbLeft then
begin
fDown:=True;
if (x>4) and (x<fPanelHeader.Width-4) and (y<=16) then
begin
{$IFDEF DebugLR}
debugLn('TfrObjectInspector.HeaderMDown()');
{$ENDIF}
fPanelHeader.Cursor:=crSize;
// get absolute mouse position (X,Y can not be used, because they
// are relative to what is moving)
fPt:=Mouse.CursorPos;
//DebugLn(['TfrObjectInspector.HeaderMDown ',dbgs(fPt)]);
end;
end;
end;
procedure TfrObjectInspector.HeaderMMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
NewPt: TPoint;
begin
if fDown then
begin
{$IFDEF DebugLR}
debugLn('TfrObjectInspector.HeaderMMove()');
{$ENDIF}
Case fPanelHeader.Cursor of
crSize :
begin
NewPt:=Mouse.CursorPos;
//DebugLn(['TfrObjectInspector.HeaderMDown ',dbgs(fPt),' New=',dbgs(NewPt)]);
SetBounds(Left+NewPt.X-fPt.X,Top+NewPt.Y-fPt.Y,Width,Height);
fPt:=NewPt;
end;
end;
end
end;
procedure TfrObjectInspector.HeaderMUp(Sender: TOBject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{$IFDEF DebugLR}
DebugLn('TfrObjectInspector.HeaderMUp()');
{$ENDIF}
fDown:=False;
fPanelHeader.Cursor:=crDefault;
end;
{$ENDIF}
procedure TfrObjectInspector.CMVisibleChanged(var TheMessage: TLMessage);
begin
Inherited CMVisibleChanged(TheMessage);
if Visible then
begin
DoOnResize;
BringToFront;
Select(Objects);
end;
{$IFDEF DebugLR}
debugLn('TfrObjectInspector.CMVisibleChanged: %s', [dbgs(Visible)]);
{$ENDIF}
end;
{$IFDEF EXTOI}
procedure TfrObjectInspector.DoHide;
begin
//TODO Uncheck Menue Item
end;
{$ENDIF}
constructor TfrObjectInspector.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
{$IFDEF EXTOI}
Width :=220;
Height :=300;
Top :=Screen.Height div 2;
Left :=40;
Visible :=False;
Caption := 'Object Inspector';
FormStyle := fsStayOnTop;
// create the ObjectInspector
fPropertyGrid:=TCustomPropertiesGrid.Create(aOwner);
with fPropertyGrid do
begin
Name :='PropertyGrid';
Parent:=Self;
align := alclient;
ShowHint:=false; //cause problems in windows
end;
{$ELSE}
Parent :=TWinControl(aOwner);
Width :=220;
Height :=300;
Top :=120;
Left :=40;
Borderstyle :=bsNone;
BevelInner :=bvLowered;
BevelOuter :=bvRaised;
BorderWidth :=1;
Visible :=False;
fDown :=False;
fPanelHeader:=TPanel.Create(self);
with fPanelHeader do
begin
Parent:=Self;
Color :=clSilver;
BorderStyle:=bsNone;
BevelInner:=bvNone;
BevelOuter:=bvNone;
Caption:=sObjectInspector;
AnchorSideLeft.Control := self;
AnchorSideTop.Control := self;
AnchorSideRight.Control := self;
AnchorSideRight.Side := asrBottom;
Anchors := [akTop, akLeft, akRight];
Top := 0;
Height := 18;
OnMouseDown:=@HeaderMDown;
OnMouseMove:=@HeaderMMove;
OnMouseUp :=@HeaderMUp;
end;
fBtn2:=TButton.Create(fPanelHeader);
with fBtn2 do
begin
Parent:=fPanelHeader;
AnchorSideTop.Control := fPanelHeader;
AnchorSideRight.Control := fPanelHeader;
AnchorSideRight.Side := asrBottom;
AnchorSideBottom.Control := fPanelHeader;
AnchorSideBottom.Side := asrBottom;
Anchors := [akTop, akRight, akBottom];
BorderSpacing.Around := 1;
Width := fPanelHeader.Height - 2*BorderSpacing.Around;
Caption:='x';
TabStop:=False;
OnClick:=@BtnClick;
end;
fBtn:=TButton.Create(fPanelHeader);
with fBtn do
begin
Parent:=fPanelHeader;
AnchorSideTop.Control := fPanelHeader;
AnchorSideRight.Control := fBtn2;
AnchorSideBottom.Control := fPanelHeader;
AnchorSideBottom.Side := asrBottom;
Anchors := [akTop, akRight, akBottom];
BorderSpacing.Around := 1;
Width := fPanelHeader.Height - 2*BorderSpacing.Around;
Caption:='-';
TabStop:=False;
OnClick:=@BtnClick;
end;
fcboxObjList := TComboBox.Create(Self);
with fcboxObjList do
begin
Parent:=Self;
AnchorSideLeft.Control := Self;
AnchorSideTop.Control := fPanelHeader;
AnchorSideTop.Side := asrBottom;
AnchorSideRight.Control := self;
AnchorSideRight.Side := asrBottom;
Anchors := [akTop, akLeft, akRight];
ShowHint := false; //cause problems in windows
Onchange := @cboxObjListOnChanged;
end;
fcboxObjList.Sorted:=true;
// create the ObjectInspector
fPropertyGrid:=TCustomPropertiesGrid.Create(aOwner);
with fPropertyGrid do
begin
Name :='PropertyGrid';
Parent:=Self;
AnchorSideLeft.Control := Self;
AnchorSideTop.Control := fcboxObjList;
AnchorSideTop.Side := asrBottom;
AnchorSideRight.Control := Self;
AnchorSideRight.Side := asrBottom;
AnchorSideBottom.Control := Self;
AnchorSideBottom.Side := asrBottom;
Anchors := [akTop, akLeft, akRight, akBottom];
ShowHint:=false; //cause problems in windows
fPropertyGrid.SaveOnChangeTIObject:=false;
DefaultItemHeight := fcboxObjList.Height-3;
end;
{$ENDIF}
end;
destructor TfrObjectInspector.Destroy;
begin
//fPropertyGrid.Free; // it's owned by OI form/Panel
inherited Destroy;
end;
procedure TfrObjectInspector.Select(Obj: TObject);
var
i : Integer;
NewSel : TPersistentSelectionList;
begin
if (Objects.Count <> fcboxObjList.Items.Count) or (Assigned(Obj) and (fcboxObjList.Items.IndexOfObject(Obj) < 0)) then
begin
fcboxObjList.Clear;
fcboxObjList.AddItem(TfrObject(frDesigner.Page).Name, TObject(frDesigner.Page));
for i:=0 to Objects.Count-1 do
fcboxObjList.AddItem(TfrView(Objects[i]).Name, TObject(Objects[i]));
end;
FSelectedObject:=nil;
if (Obj=nil) or (Obj is TPersistent) then
begin
FSelectedObject:=Obj;
if Obj=nil then
fPropertyGrid.Selection := nil
else
begin
fcboxObjList.ItemIndex := fcboxObjList.Items.IndexOfObject(Obj);
NewSel := TPersistentSelectionList.Create;
try
NewSel.Add(TfrView(Obj));
fPropertyGrid.Selection := NewSel;
finally
NewSel.Free;
end;
end;
end
else
if Obj is TFpList then
with TFpList(Obj) do
begin
NewSel:=TPersistentSelectionList.Create;
try
for i:=0 to Count-1 do
if TfrView(Items[i]).Selected then
NewSel.Add(TfrView(Items[i]));
fPropertyGrid.Selection:=NewSel;
finally
NewSel.Free;
end;
end;
end;
procedure TfrObjectInspector.cboxObjListOnChanged(Sender: TObject);
var
i: Integer;
vObj: TObject;
begin
if fcboxObjList.ItemIndex >= 0 then
begin
TfrDesignerForm(frDesigner).SelNum := 0;
for i := 0 to Objects.Count - 1 do
TfrView(Objects[i]).Selected := False;
vObj := fcboxObjList.Items.Objects[fcboxObjList.ItemIndex];
if vObj is TfrView then
begin
TfrView(vObj).Selected:=True;
TfrDesignerForm(frDesigner).SelNum := 1;
frDesigner.Invalidate;
end;
Select(vObj);
end;
end;
procedure TfrObjectInspector.SetModifiedEvent(AEvent: TNotifyEvent);
begin
fPropertyGrid.OnModified:=AEvent;
end;
procedure TfrObjectInspector.Refresh;
begin
if not visible then
exit;
fPropertyGrid.RefreshPropertyValues;
end;
type
{ TfrCustomMemoViewDetailReportProperty }
TfrCustomMemoViewDetailReportProperty = class(TStringProperty)
private
FSaveRep:TfrReport;
FEditView:TfrCustomMemoView;
FDetailRrep: TlrDetailReport;
procedure DoSaveReportEvent(Report: TfrReport; var ReportName: String;
SaveAs: Boolean; var Saved: Boolean);
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
procedure GetValues(Proc: TGetStrProc); override;
end;
TfrViewDataFieldProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;
{ TfrPictureViewDataFieldProperty }
function TfrViewDataFieldProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog{, paValueList, paSortList}];
end;
type
TfrHackView = class(TfrView);
procedure TfrViewDataFieldProperty.Edit;
begin
if (GetComponent(0) is TfrView) and Assigned(CurReport) then
begin
frFieldsForm := TfrFieldsForm.Create(Application);
try
if frFieldsForm.ShowModal = mrOk then
begin
TfrHackView(GetComponent(0)).DataField:=frFieldsForm.DBField;
frDesigner.Modified:=true;
end;
finally
frFieldsForm.Free;
end;
end;
end;
procedure TfrCustomMemoViewDetailReportProperty.DoSaveReportEvent(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if Assigned(FDetailRrep) then
begin
FDetailRrep.ReportBody.Size:=0;
CurReport.SaveToXMLStream(FDetailRrep.ReportBody);
FDetailRrep.ReportDescription:=CurReport.Comments.Text;
Saved:=true;
end
else
Saved:=false;
end;
function TfrCustomMemoViewDetailReportProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog, paValueList, paSortList];
end;
procedure TfrCustomMemoViewDetailReportProperty.Edit;
var
FSaveDesigner:TfrReportDesigner;
FSaveView:TfrView;
FSaveBand: TfrBand; // currently proceeded band
FSavePage: TfrPage; // currently proceeded page
FSaveGetPValue:TGetPValueEvent;
FSaveFunEvent:TFunctionEvent;
FSaveReportEvent: TSaveReportEvent;
///***DocMode: (dmDesigning, dmPrinting); // current mode
begin
if (GetComponent(0) is TfrCustomMemoView) and Assigned(CurReport) then
begin
FEditView:=GetComponent(0) as TfrCustomMemoView;
if FEditView.DetailReport = '' then
FEditView.DetailReport:=FEditView.Name + '_DetailReport';
FDetailRrep:=CurReport.DetailReports.Add(FEditView.DetailReport);
if not Assigned(FDetailRrep) then exit;
FSaveGetPValue:=frParser.OnGetValue;
FSaveFunEvent:=frParser.OnFunction;
FSaveDesigner:=frDesigner;
FSaveRep:=CurReport;
FSaveView:=CurView;
FSaveBand:=CurBand;
FSavePage:=CurPage;
// DocMode: (dmDesigning, dmPrinting); // current mode
frDesigner:=nil;
CurReport:=TfrReport.Create(nil);
CurReport.OnBeginBand:=FSaveRep.OnBeginBand;
CurReport.OnBeginColumn:=FSaveRep.OnBeginColumn;
CurReport.OnBeginDoc:=FSaveRep.OnBeginDoc;
CurReport.OnBeginPage:=FSaveRep.OnBeginPage;
CurReport.OnDBImageRead:=FSaveRep.OnDBImageRead;
CurReport.OnEndBand:=FSaveRep.OnEndBand;
CurReport.OnEndDoc:=FSaveRep.OnEndDoc;
CurReport.OnEndPage:=FSaveRep.OnEndPage;
CurReport.OnEnterRect:=FSaveRep.OnEnterRect;
CurReport.OnExportFilterSetup:=FSaveRep.OnExportFilterSetup;
CurReport.OnGetValue:=FSaveRep.OnGetValue;
CurReport.OnManualBuild:=FSaveRep.OnManualBuild;
CurReport.OnMouseOverObject:=FSaveRep.OnMouseOverObject;
CurReport.OnObjectClick:=FSaveRep.OnObjectClick;
CurReport.OnPrintColumn:=FSaveRep.OnPrintColumn;
CurReport.OnProgress:=FSaveRep.OnProgress;
CurReport.OnUserFunction:=FSaveRep.OnUserFunction;
FSaveReportEvent:=frDesignerComp.OnSaveReport;
frDesignerComp.OnSaveReport:=@DoSaveReportEvent;
//FDetailReport:=TStringStream.Create(Trim(FEditView.DetailReport.Text));
try
FDetailRrep.ReportBody.Position:=0;
if FDetailRrep.ReportBody.Size > 0 then
CurReport.LoadFromXMLStream(FDetailRrep.ReportBody);
if CurReport.DesignReport = mrOk then
begin
FDetailRrep.ReportBody.Size:=0;
CurReport.SaveToXMLStream(FDetailRrep.ReportBody);
FDetailRrep.ReportDescription:=CurReport.Comments.Text;
end;
if Assigned(frDesigner) then
FreeAndNil(frDesigner);
finally
frDesigner := FSaveDesigner;
CurReport := FSaveRep;
CurView := FSaveView;
CurBand := FSaveBand;
CurPage := FSavePage;
frParser.OnGetValue:=FSaveGetPValue;
frParser.OnFunction:=FSaveFunEvent;
frDesignerComp.OnSaveReport:=FSaveReportEvent;
frDesigner.Modified:=true;
end;
end;
end;
procedure TfrCustomMemoViewDetailReportProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Values: TStringList;
begin
if Assigned(CurReport) then
begin
for i:=0 to CurReport.DetailReports.Count-1 do
Proc(CurReport.DetailReports.GetItem(i).ReportName);
end;
end;
type
{ TlrInternalTools }
TlrInternalTools = class
private
lrBMPInsFields : TBitmap;
procedure InsFieldsClick(Sender: TObject);
procedure InsertFieldsFormCloseQuery(Sender: TObject; var {%H-}CanClose: boolean);
procedure InsertDbFields;
public
constructor Create;
destructor Destroy; override;
end;
var
FlrInternalTools:TlrInternalTools = nil;
{ TlrInternalTools }
procedure TlrInternalTools.InsFieldsClick(Sender: TObject);
begin
frInsertFieldsForm := TfrInsertFieldsForm.Create(nil);
frInsertFieldsForm.OnCloseQuery := @InsertFieldsFormCloseQuery;
Try
frInsertFieldsForm.ShowModal;
finally
frInsertFieldsForm.Free;
frInsertFieldsForm:=nil;
end;
end;
procedure TlrInternalTools.InsertFieldsFormCloseQuery(Sender: TObject;
var CanClose: boolean);
begin
if (Sender=frInsertFieldsForm) and (frInsertFieldsForm.ModalResult=mrOk) then
InsertDbFields;
end;
procedure TlrInternalTools.InsertDbFields;
var
i, x, y, dx, dy, pdx, adx, tdx, tdy: Integer;
HeaderL, DataL: TFpList;
t, t1: TfrView;
b: TfrBandView;
f: TfrTField;
f1: TFieldDef;
fSize: Integer;
fName: String;
function FindDataset(DataSet: TfrTDataSet): String;
var
i,j: Integer;
function EnumComponents(f: TComponent): String;
var
i: Integer;
c: TComponent;
d: TfrDBDataSet;
begin
Result := '';
for i := 0 to f.ComponentCount - 1 do
begin
c := f.Components[i];
if c is TfrDBDataSet then
begin
d := c as TfrDBDataSet;
if d.GetDataSet = DataSet then
begin
if d.Owner = CurReport.Owner then
Result := d.Name else
Result := d.Owner.Name + '.' + d.Name;
break;
end;
end;
end;
end;
begin
Result := '';
for i := 0 to Screen.FormCount - 1 do
begin
Result := EnumComponents(Screen.Forms[i]);
if Result <> '' then Exit;
end;
with Screen do
begin
for i := 0 to CustomFormCount - 1 do
with CustomForms[i] do
if (ClassName = 'TDataModuleForm') then
for j := 0 to ComponentCount - 1 do
begin
if (Components[j] is TDataModule) then
Result:=EnumComponents(Components[j]);
if Result <> '' then Exit;
end;
end;
end;
begin
if frInsertFieldsForm=nil then
exit;
with frInsertFieldsForm do
begin
if (DataSet=nil) or (FieldsL.Items.Count = 0) or (FieldsL.SelCount = 0) then
exit;
HeaderL := TFpList.Create;
DataL := TFpList.Create;
try
x := frDesigner.Page.LeftMargin;
y := frDesigner.Page.TopMargin;
TfrDesignerForm(frDesigner).Unselect;
TfrDesignerForm(frDesigner).SelNum := 0;
for i := 0 to FieldsL.Items.Count - 1 do
if FieldsL.Selected[i] then
begin
f := TfrTField(DataSet.FindField(FieldsL.Items[i]));
fSize := 0;
if f <> nil then
begin
fSize := f.DisplayWidth;
fName := f.DisplayName;
end
else
begin
f1 := DataSet.FieldDefs[i];
fSize := f1.Size;
fName := f1.Name;
end;
if (fSize = 0) or (fSize > 255) then
fSize := 6;
t := frCreateObject(gtMemo, '', frDesigner.Page);
t.CreateUniqueName;
t.x := x;
t.y := y;
TfrDesignerForm(frDesigner).GetDefaultSize(t.dx, t.dy);
with t as TfrCustomMemoView do
begin
Font.Name := LastFontName;
Font.Size := LastFontSize;
if HeaderCB.Checked then
Font.Style := [fsBold];
MonitorFontChanges;
end;
TfrDesignerForm(frDesigner).PageView.Canvas.Font.Assign(TfrCustomMemoView(t).Font);
t.Selected := True;
Inc(TfrDesignerForm(frDesigner).SelNum);
if HeaderCB.Checked then
begin
t.Memo.Add(fName);
t.dx := TfrDesignerForm(frDesigner).PageView.Canvas.TextWidth(fName + ' ') div TfrDesignerForm(frDesigner).GridSize * TfrDesignerForm(frDesigner).GridSize;
end
else
begin
t.Memo.Add('[' + DatasetCB.Items[DatasetCB.ItemIndex] +
'."' + FieldsL.Items[i] + '"]');
t.dx := (fSize * TfrDesignerForm(frDesigner).PageView.Canvas.TextWidth('=')) div TfrDesignerForm(frDesigner).GridSize * TfrDesignerForm(frDesigner).GridSize;
end;
dx := t.dx;
// TfrDesignerForm(frDesigner).Page.Objects.Add(t);
if HeaderCB.Checked then
HeaderL.Add(t) else
DataL.Add(t);
if HeaderCB.Checked then
begin
t := frCreateObject(gtMemo, '', TfrDesignerForm(frDesigner).Page);
t.CreateUniqueName;
t.x := x;
t.y := y;
TfrDesignerForm(frDesigner).GetDefaultSize(t.dx, t.dy);
if HorzRB.Checked then
Inc(t.y, 72) else
Inc(t.x, dx + TfrDesignerForm(frDesigner).GridSize * 2);
with t as TfrCustomMemoView do
begin
Font.Name := LastFontName;
Font.Size := LastFontSize;
MonitorFontChanges;
end;
t.Selected := True;
Inc(TfrDesignerForm(frDesigner).SelNum);
t.Memo.Add('[' + DatasetCB.Items[DatasetCB.ItemIndex] +
'."' + FieldsL.Items[i] + '"]');
t.dx := (fSize * TfrDesignerForm(frDesigner).PageView.Canvas.TextWidth('=')) div TfrDesignerForm(frDesigner).GridSize * TfrDesignerForm(frDesigner).GridSize;
// TfrDesignerForm(frDesigner).Page.Objects.Add(t);
DataL.Add(t);
end;
if HorzRB.Checked then
Inc(x, t.dx + TfrDesignerForm(frDesigner).GridSize)
else
Inc(y, t.dy + TfrDesignerForm(frDesigner).GridSize);
if t is TfrControl then
TfrControl(T).UpdateControlPosition;
end;
if HorzRB.Checked then
begin
t := TfrView(DataL[DataL.Count - 1]);
adx := t.x + t.dx;
pdx := TfrDesignerForm(frDesigner).Page.RightMargin - TfrDesignerForm(frDesigner).Page.LeftMargin;
x := TfrDesignerForm(frDesigner).Page.LeftMargin;
if adx > pdx then
begin
for i := 0 to DataL.Count - 1 do
begin
t := TfrView(DataL[i]);
t.x := Round((t.x - x) / (adx / pdx)) + x;
t.dx := Round(t.dx / (adx / pdx));
end;
if HeaderCB.Checked then
for i := 0 to DataL.Count - 1 do
begin
t := TfrView(HeaderL[i]);
t1 := TfrView(DataL[i]);
t.x := Round((t.x - x) / (adx / pdx)) + x;
if t.dx > t1.dx then
t.dx := t1.dx;
end;
end;
end;
if BandCB.Checked then
begin
if HeaderCB.Checked then
t := TfrView(HeaderL[DataL.Count - 1])
else
t := TfrView(DataL[DataL.Count - 1]);
dy := t.y + t.dy - TfrDesignerForm(frDesigner).Page.TopMargin;
b := frCreateObject(gtBand, '', TfrDesignerForm(frDesigner).Page) as TfrBandView;
b.CreateUniqueName;
b.y := TfrDesignerForm(frDesigner).Page.TopMargin;
b.dy := dy;
b.Selected := True;
Inc(TfrDesignerForm(frDesigner).SelNum);
if not HeaderCB.Checked or not HorzRB.Checked then
begin
// TfrDesignerForm(frDesigner).Page.Objects.Add(b);
b.BandType := btMasterData;
b.DataSet := FindDataset(DataSet);
end
else
begin
if frCheckBand(btPageHeader) then
begin
Dec(TfrDesignerForm(frDesigner).SelNum);
b.Free;
end
else
begin
b.BandType := btPageHeader;
// TfrDesignerForm(frDesigner).Page.Objects.Add(b);
end;
b := frCreateObject(gtBand, '', TfrDesignerForm(frDesigner).Page) as TfrBandView;
b.BandType := btMasterData;
b.DataSet := FindDataset(DataSet);
b.CreateUniqueName;
b.y := TfrDesignerForm(frDesigner).Page.TopMargin + 72;
b.dy := dy;
b.Selected := True;
Inc(TfrDesignerForm(frDesigner).SelNum);
// TfrDesignerForm(frDesigner).Page.Objects.Add(b);
end;
end;
TfrDesignerForm(frDesigner).SelectionChanged;
SendBandsToDown;
TfrDesignerForm(frDesigner).PageView.GetMultipleSelected;
TfrDesignerForm(frDesigner).RedrawPage;
TfrDesignerForm(frDesigner).AddUndoAction(acInsert);
finally
HeaderL.Free;
DataL.Free;
end;
end;
end;
constructor TlrInternalTools.Create;
begin
inherited Create;
lrBMPInsFields := TBitmap.Create;
lrBMPInsFields.LoadFromResourceName(HInstance, 'lrd_ins_fields');
frRegisterTool(sInsertFields, lrBMPInsFields, @InsFieldsClick);
end;
destructor TlrInternalTools.Destroy;
begin
lrBMPInsFields.Free;
inherited destroy;
end;
initialization
frDesigner:=nil;
ProcedureInitDesigner:=@InitGlobalDesigner;
ClipBd := TFpList.Create;
GridBitmap := TBitmap.Create;
with GridBitmap do
begin
Width := 8; Height := 8;
end;
LastFrames:=[];
LastFrameWidth := 1;
LastLineWidth := 2;
LastFillColor := clNone;
LastFrameColor := clBlack;
LastFontColor := clBlack;
LastFontStyle := 0;
LastAdjust := 0;
//** RegRootKey := 'Software\FastReport\' + Application.Title;
RegisterPropertyEditor(TypeInfo(String), TfrCustomMemoView, 'DetailReport', TfrCustomMemoViewDetailReportProperty);
RegisterPropertyEditor(TypeInfo(String), TfrView, 'DataField', TfrViewDataFieldProperty);
FlrInternalTools:=TlrInternalTools.Create;
finalization
If Assigned(frDesigner) then
begin
{$IFNDEF MODALDESIGNER}
if frDesigner.Visible then
frDesigner.Hide;
{$ENDIF}
frDesigner.Free;
end;
ClearClipBoard;
ClipBd.Free;
GridBitmap.Free;
FreeAndNil(FlrInternalTools);
end.