123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- using FastReport.Design.StandardDesigner;
- using FastReport.Utils;
- using System;
- using System.ComponentModel;
- using System.Windows;
- using System.Windows.Controls;
- namespace FastReport.Design
- {
- /// <summary>
- /// Represents the standard report designer.
- /// </summary>
- public partial class WpfDesignerControl : UserControl
- {
- #region Properties
- /// <summary>
- /// Gets inner designer control.
- /// </summary>
- public DesignerControl InnerDesigner { get; }
- /// <summary>
- /// Gets or sets the edited report.
- /// </summary>
- /// <remarks>
- /// To initialize the designer, you need to pass a Report instance to this property.
- /// This will create the designer's surface associated with the report.
- /// </remarks>
- public Report Report
- {
- get => InnerDesigner.Report;
- set => InnerDesigner.Report = value;
- }
- /// <summary>
- /// Gets or sets the visual style.
- /// </summary>
- public UIStyle UIStyle
- {
- get => InnerDesigner.UIStyle;
- set => InnerDesigner.UIStyle = value;
- }
- /// <summary>
- /// Gets or sets a value indicating whether the main menu should be displayed or not.
- /// </summary>
- public bool ShowMainMenu
- {
- get => InnerDesigner.ShowMainMenu;
- set => InnerDesigner.ShowMainMenu = value;
- }
- /// <summary>
- /// Gets or sets a value indicating whether the status bar should be displayed or not.
- /// </summary>
- public bool ShowStatusBar
- {
- get => InnerDesigner.ShowStatusBar;
- set => InnerDesigner.ShowStatusBar = value;
- }
- /// <summary>
- /// Gets or sets the zoom factor.
- /// </summary>
- public float Zoom
- {
- get => InnerDesigner.Zoom;
- set => InnerDesigner.Zoom = value;
- }
- /// <summary>
- /// Gets or sets the layout state of the designer.
- /// </summary>
- /// <remarks>
- /// You may use this property to save and restore the designer's layout in your code. However, consider using the
- /// <see cref="SaveConfig()"/> and <see cref="RestoreConfig()"/> methods that use FastReport configuration file.
- /// </remarks>
- public string LayoutState
- {
- get => InnerDesigner.LayoutState;
- set => InnerDesigner.LayoutState = value;
- }
- /// <summary>
- /// Gets or sets a value that determines whether the control should handle the window's Closing event.
- /// </summary>
- public bool HandleWindowEvents { get; set; } = true;
- /// <summary>
- /// Occurs when the designer's UI state is changed.
- /// </summary>
- /// <remarks>
- /// Use this event to update state of your own controls bound to the designer's commands.
- /// </remarks>
- public event EventHandler UIStateChanged
- {
- add => InnerDesigner.UIStateChanged += value;
- remove => InnerDesigner.UIStateChanged -= value;
- }
- #endregion
- #region Commands
- public DesignerCommand cmdNew { get; }
- public DesignerCommand cmdNewPage { get; }
- public DesignerCommand cmdNewDialog { get; }
- public OpenCommand cmdOpen { get; }
- public DesignerCommand cmdOpenPage { get; }
- public DesignerCommand cmdOpenViaCloud { get; }
- public DesignerCommand cmdSave { get; }
- public DesignerCommand cmdSaveToCloud { get; }
- public DesignerCommand cmdSaveAs { get; }
- public DesignerCommand cmdSaveWithRandomData { get; }
- public DesignerCommand cmdSaveAll { get; }
- public DesignerCommand cmdClose { get; }
- public DesignerCommand cmdCloseAll { get; }
- public DesignerCommand cmdPreview { get; }
- public DesignerCommand cmdPreviewCloud { get; }
- public DesignerCommand cmdPrinterSetup { get; }
- public DesignerCommand cmdPageSetup { get; }
- public DesignerCommand cmdAddData { get; }
- public DesignerCommand cmdSortDataSources { get; }
- public DesignerCommand cmdChooseData { get; }
- public DesignerCommand cmdUndo { get; }
- public DesignerCommand cmdRedo { get; }
- public DesignerCommand cmdCut { get; }
- public DesignerCommand cmdCopy { get; }
- public DesignerCommand cmdPaste { get; }
- public DesignerCommand cmdFormatPainter { get; }
- public DesignerCommand cmdDelete { get; }
- public DesignerCommand cmdCopyPage { get; }
- public DesignerCommand cmdDeletePage { get; }
- public DesignerCommand cmdSelectAll { get; }
- public DesignerCommand cmdGroup { get; }
- public DesignerCommand cmdUngroup { get; }
- public DesignerCommand cmdEdit { get; }
- public DesignerCommand cmdFind { get; }
- public DesignerCommand cmdReplace { get; }
- public DesignerCommand cmdBringToFront { get; }
- public DesignerCommand cmdSendToBack { get; }
- public DesignerCommand cmdInsert { get; }
- public DesignerCommand cmdInsertBand { get; }
- public RecentFilesCommand cmdRecentFiles { get; }
- public DesignerCommand cmdSelectLanguage { get; }
- public DesignerCommand cmdViewStartPage { get; }
- public DesignerCommand cmdReportSettings { get; }
- public DesignerCommand cmdOptions { get; }
- public DesignerCommand cmdReportStyles { get; }
- public DesignerCommand cmdReportValidation { get; }
- public DesignerCommand cmdHelpContents { get; }
- public DesignerCommand cmdAccount { get; }
- public DesignerCommand cmdAbout { get; }
- public DesignerCommand cmdPolySelectMove { get; }
- public DesignerCommand cmdPolySelectPointer { get; }
- public DesignerCommand cmdPolySelectAddPoint { get; }
- public DesignerCommand cmdPolySelectBezier { get; }
- public DesignerCommand cmdPolySelectRemovePoint { get; }
- #endregion
- #region Methods
- /// <summary>
- /// Saves config to a FastReport configuration file.
- /// </summary>
- public void SaveConfig() => InnerDesigner.SaveConfig();
- /// <summary>
- /// Restores config from a FastReport configuration file.
- /// </summary>
- /// <remarks>
- /// Call this method to restore the designer's layout. You need to do this after the
- /// designer's control is placed on a form.
- /// </remarks>
- public void RestoreConfig() => InnerDesigner.RestoreConfig();
- /// <summary>
- /// AutoSave system initialization.
- /// </summary>
- public void StartAutoSave() => InnerDesigner.StartAutoSave();
- /// <summary>
- /// Stops the AutoSave system.
- /// </summary>
- public void StopAutoSave() => InnerDesigner.StopAutoSave();
- /// <summary>
- /// Checks if parent window can be closed.
- /// </summary>
- /// <param name="e">The cancel event args.</param>
- /// <remarks>
- /// Use this method in the window's Closing event handler if you set <see cref="HandleWindowEvents"/> to false.
- /// This method checks if the embedded preview is running and cancels it. Also if there is unsaved changes, the user will be asked to save changes.
- /// </remarks>
- public void ParentWindowClosing(CancelEventArgs e)
- {
- if (e.Cancel)
- return;
- var args = new System.Windows.Forms.FormClosingEventArgs(System.Windows.Forms.CloseReason.UserClosing, false);
- InnerDesigner.ParentFormClosing(args);
- e.Cancel = args.Cancel;
- }
- #endregion
- private DesignerCommand CreateCmd(FastReport.Design.DesignerCommand innerCommand) => new DesignerCommand(this, innerCommand);
- /// <summary>
- /// Initializes a new instance of the <see cref="WpfDesignerControl"/> class.
- /// </summary>
- public WpfDesignerControl()
- {
- InnerDesigner = new DesignerControl();
- var control = InnerDesigner.control;
- control.Width = double.NaN;
- control.Height = double.NaN;
- control.HorizontalAlignment = HorizontalAlignment.Stretch;
- control.VerticalAlignment = VerticalAlignment.Stretch;
- Content = control;
- UseLayoutRounding = true;
- Loaded += (s, e) =>
- {
- var window = Window.GetWindow(this);
- if (window == null)
- return;
- System.Windows.Forms.DpiRescaler.Install(window, InnerDesigner, this, (s, e) => InnerDesigner.UpdateDpiDependencies(null));
- // update toolbar area
- InnerDesigner.UpdateUIStyle();
- // WPF bug: designer workspace is not initialized if the dialog form is the first page in a report (reason: visible designer form is needed)
- InnerDesigner.UpdateFirstDialogPage();
- // handle parent window events
- if (HandleWindowEvents)
- {
- RestoreConfig();
- StartAutoSave();
- window.Closing += (s, e) =>
- {
- ParentWindowClosing(e);
- if (!e.Cancel)
- {
- SaveConfig();
- StopAutoSave();
- }
- };
- }
- };
- cmdNew = CreateCmd(InnerDesigner.cmdNew);
- cmdNewPage = CreateCmd(InnerDesigner.cmdNewPage);
- cmdNewDialog = CreateCmd(InnerDesigner.cmdNewDialog);
- cmdOpen = new OpenCommand(this, InnerDesigner.cmdOpen);
- cmdOpenPage = CreateCmd(InnerDesigner.cmdOpenPage);
- cmdOpenViaCloud = CreateCmd(InnerDesigner.cmdOpenViaCloud);
- cmdSave = CreateCmd(InnerDesigner.cmdSave);
- cmdSaveToCloud = CreateCmd(InnerDesigner.cmdSaveToCloudCommand);
- cmdSaveAs = CreateCmd(InnerDesigner.cmdSaveAs);
- cmdSaveWithRandomData = CreateCmd(InnerDesigner.cmdSaveWithRandomData);
- cmdSaveAll = CreateCmd(InnerDesigner.cmdSaveAll);
- cmdClose = CreateCmd(InnerDesigner.cmdClose);
- cmdCloseAll = CreateCmd(InnerDesigner.cmdCloseAll);
- cmdPreview = CreateCmd(InnerDesigner.cmdPreview);
- cmdPreviewCloud = CreateCmd(InnerDesigner.cmdPreviewCloud);
- cmdPrinterSetup = CreateCmd(InnerDesigner.cmdPrinterSetup);
- cmdPageSetup = CreateCmd(InnerDesigner.cmdPageSetup);
- cmdAddData = CreateCmd(InnerDesigner.cmdAddData);
- cmdSortDataSources = CreateCmd(InnerDesigner.cmdSortDataSources);
- cmdChooseData = CreateCmd(InnerDesigner.cmdChooseData);
- cmdUndo = CreateCmd(InnerDesigner.cmdUndo);
- cmdRedo = CreateCmd(InnerDesigner.cmdRedo);
- cmdCut = CreateCmd(InnerDesigner.cmdCut);
- cmdCopy = CreateCmd(InnerDesigner.cmdCopy);
- cmdPaste = CreateCmd(InnerDesigner.cmdPaste);
- cmdFormatPainter = CreateCmd(InnerDesigner.cmdFormatPainter);
- cmdDelete = CreateCmd(InnerDesigner.cmdDelete);
- cmdCopyPage = CreateCmd(InnerDesigner.cmdCopyPage);
- cmdDeletePage = CreateCmd(InnerDesigner.cmdDeletePage);
- cmdSelectAll = CreateCmd(InnerDesigner.cmdSelectAll);
- cmdGroup = CreateCmd(InnerDesigner.cmdGroup);
- cmdUngroup = CreateCmd(InnerDesigner.cmdUngroup);
- cmdEdit = CreateCmd(InnerDesigner.cmdEdit);
- cmdFind = CreateCmd(InnerDesigner.cmdFind);
- cmdReplace = CreateCmd(InnerDesigner.cmdReplace);
- cmdBringToFront = CreateCmd(InnerDesigner.cmdBringToFront);
- cmdSendToBack = CreateCmd(InnerDesigner.cmdSendToBack);
- cmdInsert = CreateCmd(InnerDesigner.cmdInsert);
- cmdInsertBand = CreateCmd(InnerDesigner.cmdInsertBand);
- cmdRecentFiles = new RecentFilesCommand(this, InnerDesigner.cmdRecentFiles);
- cmdSelectLanguage = CreateCmd(InnerDesigner.cmdSelectLanguage);
- cmdViewStartPage = CreateCmd(InnerDesigner.cmdViewStartPage);
- cmdReportSettings = CreateCmd(InnerDesigner.cmdReportSettings);
- cmdOptions = CreateCmd(InnerDesigner.cmdOptions);
- cmdReportStyles = CreateCmd(InnerDesigner.cmdReportStyles);
- cmdReportValidation = CreateCmd(InnerDesigner.cmdReportValidation);
- cmdHelpContents = CreateCmd(InnerDesigner.cmdHelpContents);
- cmdAccount = CreateCmd(InnerDesigner.cmdAccount);
- cmdAbout = CreateCmd(InnerDesigner.cmdAbout);
- cmdPolySelectMove = CreateCmd(InnerDesigner.CmdPolySelectMove);
- cmdPolySelectPointer = CreateCmd(InnerDesigner.CmdPolySelectPointer);
- cmdPolySelectAddPoint = CreateCmd(InnerDesigner.CmdPolySelectAddPoint);
- cmdPolySelectBezier = CreateCmd(InnerDesigner.CmdPolySelectBezier);
- cmdPolySelectRemovePoint = CreateCmd(InnerDesigner.CmdPolySelectRemovePoint);
- }
- }
- }
|