using FastReport.Preview;
using FastReport.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace FastReport.Export
{
partial class ExportBase
{
private bool tabsIsExists = false;
public bool TabsIsExists
{
get { return tabsIsExists; }
set { tabsIsExists = value; }
}
#region Public Methods
///
/// Exports the report to a file.
///
/// Report to export.
/// Pages of open tabs.
/// true if report was succesfully exported.
///
/// This method displays an export options dialog, then prompts a file name using standard "Open file"
/// dialog. If both dialogs were closed by OK button, exports the report and returns true.
///
public bool Export(Report report, List pages = null)
{
SetReport(report);
if (AllowSaveSettings)
RestoreSettings();
tabsIsExists = pages != null && pages.Count > 1;
if (ShowDialog())
{
if (AllowSaveSettings)
SaveSettings();
int indexReportInTabs = tabsIsExists ? pages.IndexOf(report.PreparedPages) : -1;
int reportCountPage = report.PreparedPages.Count;
int countSourcePage = 0;
while (true)
{
using (SaveFileDialog dialog = new SaveFileDialog())
{
dialog.Filter = FileFilter;
string defaultExt = dialog.Filter.Split('|')[1];
dialog.DefaultExt = Path.GetExtension(defaultExt);
dialog.FileName = GetFileName(report) + "." + dialog.DefaultExt;
countSourcePage = 0;
if (!string.IsNullOrEmpty(SaveInitialDirectory))
dialog.InitialDirectory = SaveInitialDirectory;
if (dialog.ShowDialog() == DialogResult.OK)
{
Config.DoEvent();
try
{
if (exportTabs && pages != null && pages.Count > 1)
{
for (int i = 0; i < pages.Count; i++)
{
if (i != indexReportInTabs)
{
int count = report.PreparedPages.Count;
for (int j = 0; j < pages[i].Count; j++)
{
report.PreparedPages.AddPage(new ReportPage());
int pageIndex = report.PreparedPages.Count - 1;
if (i < indexReportInTabs)
{
for (int k = pageIndex; k >= report.PreparedPages.Count - reportCountPage; k--)
{
report.PreparedPages.ModifyPage(k, report.PreparedPages.GetPage(k - 1));
}
pageIndex -= reportCountPage;
}
ReportPage sourcePage = pages[i].GetPage(j);
countSourcePage++;
report.PreparedPages.AddSourcePage(sourcePage);
report.PreparedPages.ModifyPage(pageIndex, sourcePage);
}
}
}
}
Export(report, dialog.FileName);
return true;
}
catch (IOException ex)
{
if (MessageBox.Show(ex.Message + "\r\n\r\n" + Res.Get("Messages,SaveToAnotherFile"),
Res.Get("Messages,Error"),
MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.No)
return false;
}
finally
{
if (exportTabs && pages != null && pages.Count > 1)
{
for (int i = pages.Count - 1; i >= 0; i--)
{
if (i != indexReportInTabs)
{
for (int j = 0; j < pages[i].Count; j++)
{
int pageIndex = report.PreparedPages.Count - 1;
if (i < indexReportInTabs)
{
pageIndex -= reportCountPage;
}
report.PreparedPages.RemovePage(pageIndex);
}
}
}
for(int i = 0;i < countSourcePage; i++)
{
report.PreparedPages.SourcePages.RemoveLast();
}
}
}
}
else
{
return false;
}
}
}
}
return false;
}
///
/// Displays a dialog with export options.
///
/// true if dialog was closed with OK button.
public virtual bool ShowDialog()
{
return true;
}
#endregion Public Methods
#region Private Methods
private void ShowPerformance(int exportTickCount)
{
if (Report.Preview != null && Config.ReportSettings.ShowPerformance)
Report.Preview.ShowPerformance(String.Format(Res.Get("Export,Misc,Performance"), exportTickCount));
}
///
/// Gets a report page with OverlayBand if it is a Demo or Academic.
///
/// The prepared report page
/// The prepared report page with OverlayBand.
protected ReportPage GetOverlayPage(ReportPage page)
{
if (page != null)
{
#if Demo
OverlayBand band = new OverlayBand();
band.Parent = page;
band.Bounds = new RectangleF(0, -page.TopMargin * Units.Millimeters, 200, 20);
TextObject text = new TextObject();
text.Parent = band;
text.Bounds = new RectangleF(0, 0, Units.Millimeters * 50, 20);
text.Text = typeof(Double).Name[0].ToString() + typeof(Exception).Name[0].ToString() +
typeof(Math).Name[0].ToString() + typeof(Object).Name[0].ToString() + " " +
typeof(ValueType).Name[0].ToString() + typeof(Exception).Name[0].ToString() +
typeof(Rectangle).Name[0].ToString() + typeof(ShapeKind).Name[0].ToString() +
typeof(ICloneable).Name[0].ToString() + typeof(Object).Name[0].ToString() +
typeof(NonSerializedAttribute).Name[0].ToString();
#endif
#if Academic
OverlayBand band = new OverlayBand();
band.Parent = page;
band.Bounds = new RectangleF(0, -page.TopMargin * Units.Millimeters, 200, 20);
TextObject text = new TextObject();
text.Parent = band;
text.Bounds = new RectangleF(0, 0, Units.Millimeters * 50, 20);
text.Text = typeof(Array).Name[0].ToString() + typeof(Char).Name[0].ToString() +
typeof(Array).Name[0].ToString() + typeof(DateTime).Name[0].ToString() +
typeof(Enum).Name[0].ToString() + typeof(Math).Name[0].ToString() +
typeof(IComparable).Name[0].ToString() + typeof(Char).Name[0].ToString() +
" " +
typeof(LineObject).Name[0].ToString() + typeof(IComparable).Name[0].ToString() +
typeof(Char).Name[0].ToString() + typeof(Enum).Name[0].ToString() +
typeof(Nullable).Name[0].ToString() + typeof(ShapeObject).Name[0].ToString() +
typeof(Enum).Name[0].ToString();
#endif
}
return page;
}
private int GetPagesCount(List pages)
{
#if Demo
return 5;
#else
return pages.Count;
#endif
}
#endregion Private Methods
#if Demo || Academic
internal const bool HAVE_TO_WORK_WITH_OVERLAY = true;
#else
internal const bool HAVE_TO_WORK_WITH_OVERLAY = false;
#endif
}
}