diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/DesignerBinding/InternalReportLoader.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/DesignerBinding/InternalReportLoader.cs index 2365538f22..1d1f42f294 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/DesignerBinding/InternalReportLoader.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/DesignerBinding/InternalReportLoader.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.Reports.Addin { Application.UseWaitCursor = true; - Application.DoEvents(); +// Application.DoEvents(); try { IComponent cc = this.host.CreateComponent(typeof(ICSharpCode.Reports.Addin.Designer.RootReportModel),"RootReportModel"); ICSharpCode.Reports.Addin.Designer.RootReportModel rootControl = cc as ICSharpCode.Reports.Addin.Designer.RootReportModel; diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportDesignerView.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportDesignerView.cs index aee3f5b73a..35f8199d21 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportDesignerView.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportDesignerView.cs @@ -165,10 +165,7 @@ namespace ICSharpCode.Reports.Addin void DesignerLoading(object sender, EventArgs e) { LoggingService.Debug("Forms designer: DesignerLoader loading..."); -// this.reloadPending = false; this.unloading = false; -// this.UserContent = this.pleaseWaitLabel; - Application.DoEvents(); } @@ -176,12 +173,10 @@ namespace ICSharpCode.Reports.Addin { // This method is called when the designer has loaded. LoggingService.Debug("Report designer: DesignerLoader loaded, HasSucceeded=" + e.HasSucceeded.ToString()); -// this.reloadPending = false; this.unloading = false; if (e.HasSucceeded) { -// CreatePanel(); SetupDesignSurface(); this.IsFormsDesignerVisible = true; generator.MergeFormChanges(null); @@ -250,6 +245,7 @@ namespace ICSharpCode.Reports.Addin } #endregion + private void MergeFormChanges() { System.Diagnostics.Trace.WriteLine("View:MergeFormChanges()"); @@ -305,7 +301,6 @@ namespace ICSharpCode.Reports.Addin #endregion - #region SelectionService private void SelectionChangedHandler(object sender, EventArgs args) @@ -383,67 +378,6 @@ namespace ICSharpCode.Reports.Addin - #region unload Designer - /* - void UnloadDesigner() - { - LoggingService.Debug("FormsDesigner unloading, setting ActiveDesignSurface to null"); - designSurfaceManager.ActiveDesignSurface = null; - - bool savedIsDirty = (this.DesignerCodeFile == null) ? false : this.DesignerCodeFile.IsDirty; - this.UserContent = this.pleaseWaitLabel; - Application.DoEvents(); - if (this.DesignerCodeFile != null) { - this.DesignerCodeFile.IsDirty = savedIsDirty; - } - - // We cannot dispose the design surface now because of SD2-451: - // When the switch to the source view was triggered by a double-click on an event - // in the PropertyPad, "InvalidOperationException: The container cannot be disposed - // at design time" is thrown. - // This is solved by calling dispose after the double-click event has been processed. - if (designSurface != null) { - designSurface.Loading -= this.DesignerLoading; - designSurface.Loaded -= this.DesignerLoaded; - designSurface.Flushed -= this.DesignerFlushed; - designSurface.Unloading -= this.DesingerUnloading; - - IComponentChangeService componentChangeService = designSurface.GetService(typeof(IComponentChangeService)) as IComponentChangeService; - if (componentChangeService != null) { - componentChangeService.ComponentChanged -= ComponentChanged; - componentChangeService.ComponentAdded -= ComponentListChanged; - componentChangeService.ComponentRemoved -= ComponentListChanged; - componentChangeService.ComponentRename -= ComponentListChanged; - } - if (this.Host != null) { - this.Host.TransactionClosed -= TransactionClose; - } - - ISelectionService selectionService = designSurface.GetService(typeof(ISelectionService)) as ISelectionService; - if (selectionService != null) { - selectionService.SelectionChanged -= SelectionChangedHandler; - } - - if (disposing) { - designSurface.Dispose(); - } else { - WorkbenchSingleton.SafeThreadAsyncCall(designSurface.Dispose); - } - designSurface = null; - } - - this.typeResolutionService = null; - this.loader = null; - - foreach (KeyValuePair entry in this.addedTypeDescriptionProviders) { - TypeDescriptor.RemoveProvider(entry.Value, entry.Key); - } - this.addedTypeDescriptionProviders.Clear(); - } - */ - #endregion - - #region HasPropertyContainer implementation private void UpdatePropertyPad() @@ -482,6 +416,7 @@ namespace ICSharpCode.Reports.Addin #endregion + #region IUnDohandler #endregion diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs index 2c49e1d109..70bec05113 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportExplorer/ExplorerTree.cs @@ -337,7 +337,6 @@ namespace ICSharpCode.Reports.Addin } - public void BuildTree () { this.BeginUpdate(); @@ -345,10 +344,12 @@ namespace ICSharpCode.Reports.Addin SetSortColumns(); SetGroupColumns(); SetParameters(); +// SetFunctions(); this.ExpandAll(); this.EndUpdate(); } + #endregion #region Build Basic Tree diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseGroupedRow.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseGroupedRow.cs index 6637441651..105c396c2a 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseGroupedRow.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseGroupedRow.cs @@ -22,7 +22,8 @@ namespace ICSharpCode.Reports.Addin TypeDescriptor.AddProvider(new GroupedRowTypeProvider(), typeof(BaseGroupedRow)); } - + [Category("Behavior")] + public bool PageBreakOnGroupChange {get;set;} } @@ -78,16 +79,17 @@ namespace ICSharpCode.Reports.Addin prop = props.Find("Controls",true); allProperties.Add(prop); - /* - prop = props.Find("Padding",true); - allProperties.Add(prop); - */ + prop = props.Find("AlternateBackColor",true); allProperties.Add(prop); prop = props.Find("ChangeBackColorEveryNRow",true); allProperties.Add(prop); + prop = props.Find("PageBreakOnGroupChange",true); + allProperties.Add(prop); + + return new PropertyDescriptorCollection(allProperties.ToArray()); } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseTextItem.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseTextItem.cs index ee40c6ad05..afa02f691d 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseTextItem.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportItems/BaseTextItem.cs @@ -85,10 +85,8 @@ namespace ICSharpCode.Reports.Addin [Browsable(true), Category("Appearance"), Description("String to format Number's Date's etc")] - [DefaultValue("entry1")] - -[TypeConverter(typeof(FormatStringConverter))] + [TypeConverter(typeof(FormatStringConverter))] public string FormatString { get { return formatString; } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs index f13c8ebe71..181e4e4f06 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/AbstractLayout.cs @@ -15,8 +15,6 @@ namespace ICSharpCode.Reports.Addin.ReportWizard public class AbstractLayout { - ISimpleContainer parentItem; - public AbstractLayout(ReportModel reportModel) { if (reportModel == null) { @@ -35,11 +33,7 @@ namespace ICSharpCode.Reports.Addin.ReportWizard this.ReportModel.ReportHeader.Items.Add(textItem); } - public virtual void SetParent (ISimpleContainer parentItem) - { - this.parentItem = parentItem; - } - + public virtual void CreatePageHeader () { } @@ -83,8 +77,8 @@ namespace ICSharpCode.Reports.Addin.ReportWizard item.Location = p; } - - protected static void AdjustContainer (ICSharpCode.Reports.Core.BaseReportItem parent, + + protected static void AdjustContainer (ISimpleContainer parent, ICSharpCode.Reports.Core.BaseReportItem item) { item.Size = new Size (parent.Size.Width - GlobalValues.ControlMargins.Left - GlobalValues.ControlMargins.Right, @@ -92,25 +86,26 @@ namespace ICSharpCode.Reports.Addin.ReportWizard item.Location = new Point(GlobalValues.ControlMargins.Left, GlobalValues.ControlMargins.Top); - item.Parent = parent; + item.Parent = parent as BaseReportItem; } #region HeaderColumns - protected static ICSharpCode.Reports.Core.BaseRowItem CreateRowWithTextColumns(BaseReportItem parent,ReportItemCollection items) + protected static ICSharpCode.Reports.Core.BaseRowItem CreateRowWithTextColumns(ISimpleContainer parent,ReportItemCollection items) { ReportItemCollection colDetail = AbstractLayout.HeaderColumnsFromReportItems(items); ICSharpCode.Reports.Core.BaseRowItem row = new ICSharpCode.Reports.Core.BaseRowItem(); AdjustContainer(parent,row); - - int defY = parent.Location.Y + GlobalValues.ControlMargins.Top; - int defX = row.Size.Width / colDetail.Count; + + int defY = GlobalValues.ControlMargins.Top; + int ctrlWidth = CalculateControlWidth(row,colDetail); int startX = parent.Location.X + GlobalValues.ControlMargins.Left; + foreach (ICSharpCode.Reports.Core.BaseTextItem ir in colDetail) { Point np = new Point(startX,defY); - startX += defX; + startX += ctrlWidth; ir.Location = np; ir.Parent = row; row.Items.Add(ir); @@ -119,6 +114,7 @@ namespace ICSharpCode.Reports.Addin.ReportWizard } + private static ReportItemCollection HeaderColumnsFromReportItems(ReportItemCollection reportItemCollection) { if (reportItemCollection == null) { @@ -139,43 +135,56 @@ namespace ICSharpCode.Reports.Addin.ReportWizard #endregion - protected static void AddItemsToSection (ICSharpCode.Reports.Core.BaseSection section,ReportItemCollection items) + + protected ReportItemCollection AddItemsToContainer (ReportItemCollection items) { - int defY = section.Location.Y + GlobalValues.ControlMargins.Top; - int defX = section.Size.Width / items.Count; - int startX = section.Location.X + GlobalValues.ControlMargins.Left; + int locationX = GlobalValues.ControlMargins.Left; + + var minCtrlWidth = CalculateControlWidth(ParentItem,items); + + var col = new ReportItemCollection(); foreach (var ir in items) { - Point np = new Point(startX,defY); - startX += defX; - ir.Location = np; - section.Items.Add(ir); + ir.Location = new Point(locationX,GlobalValues.ControlMargins.Top); + col.Add(ir); + locationX += minCtrlWidth; } + return col; + } + + + protected static int CalculateControlWidth(ISimpleContainer row, ReportItemCollection colDetail) + { + return row.Size.Width / colDetail.Count; } - protected void AddItemsToContainer (ICSharpCode.Reports.Core.BaseSection section,ReportItemCollection items) + #region Grouping + + protected ICSharpCode.Reports.Core.BaseGroupedRow CreateGroupHeader(Point headerLocation) { - section.Items.Add(this.parentItem as BaseReportItem); - int locationY = 10; - int locationX = this.parentItem.Location.X + GlobalValues.ControlMargins.Left; - int minCtrlWidth = this.parentItem.Size.Width / items.Count; + ICSharpCode.Reports.Core.BaseDataItem dataItem = new ICSharpCode.Reports.Core.BaseDataItem(); + dataItem.ColumnName = ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; - foreach (var ir in items) { - ir.Location = new Point(locationX,locationY); - this.parentItem.Items.Add(ir); - locationX += minCtrlWidth; - } + dataItem.DataType = ReportModel.ReportSettings.GroupColumnsCollection[0].DataTypeName; + dataItem.Location = new Point (GlobalValues.ControlMargins.Left,GlobalValues.ControlMargins.Top); + dataItem.Size = new Size (150,20); + dataItem.Text = ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; + + ICSharpCode.Reports.Core.BaseGroupedRow groupHeader = new ICSharpCode.Reports.Core.BaseGroupedRow(); + groupHeader.Location = headerLocation; + groupHeader.Size = new Size (300,dataItem.Size.Height + GlobalValues.ControlMargins.Top + GlobalValues.ControlMargins.Bottom); + groupHeader.Items.Add(dataItem); + return groupHeader; } + #endregion protected ReportModel ReportModel {get; private set;} - protected ISimpleContainer ParentItem { - get { return parentItem; } - } + protected ISimpleContainer ParentItem {get;set;} } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs index 5c6e2441ee..f70730169f 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/ListLayout.cs @@ -23,7 +23,7 @@ namespace ICSharpCode.Reports.Addin.ReportWizard this.reportItems = reportItemCollection; ICSharpCode.Reports.Core.BaseRowItem row = new ICSharpCode.Reports.Core.BaseRowItem(); AdjustContainer(base.ReportModel.DetailSection,row); - base.SetParent(row); + base.ParentItem = row; } @@ -35,6 +35,7 @@ namespace ICSharpCode.Reports.Addin.ReportWizard base.CreatePageHeader(); ICSharpCode.Reports.Core.BaseRowItem row = CreateRowWithTextColumns(base.ReportModel.PageHeader, this.reportItems); + AdjustContainer(ParentItem,row); base.ReportModel.PageHeader.Items.Add(row); } @@ -44,39 +45,23 @@ namespace ICSharpCode.Reports.Addin.ReportWizard if (section == null) { throw new ArgumentNullException("section"); } - - if (base.ReportModel.ReportSettings.GroupColumnsCollection.Count > 0) { - InsertGroupHeader(); - ParentItem.Location = new Point(ParentItem.Location.X,50); - ParentItem.Size = new Size(ParentItem.Size.Width,40); - section.Size = new Size(section.Size.Width,100); - } - if (base.ParentItem != null) { - base.AddItemsToContainer(base.ReportModel.DetailSection,this.reportItems); + if (base.ReportModel.ReportSettings.GroupColumnsCollection.Count > 0) + { + + var groupheader = base.CreateGroupHeader(new Point (GlobalValues.ControlMargins.Left,GlobalValues.ControlMargins.Top)); + + base.ReportModel.DetailSection.Items.Add(groupheader); + + ParentItem.Location = new Point(ParentItem.Location.X,50); ParentItem.Size = new Size(ParentItem.Size.Width,40); + section.Size = new Size(section.Size.Width,90); } - else{ - AddItemsToSection (base.ReportModel.DetailSection,this.reportItems); - } - - } - - - private void InsertGroupHeader() - { - ICSharpCode.Reports.Core.BaseDataItem dataItem = new ICSharpCode.Reports.Core.BaseDataItem(); - dataItem.ColumnName = base.ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; - dataItem.DataType = base.ReportModel.ReportSettings.GroupColumnsCollection[0].DataTypeName; - dataItem.Location = new Point (10,5); - dataItem.Size = new Size (150,20); - dataItem.Text = base.ReportModel.ReportSettings.GroupColumnsCollection[0].ColumnName; - ICSharpCode.Reports.Core.BaseGroupedRow groupHeader = new ICSharpCode.Reports.Core.BaseGroupedRow(); - groupHeader.Location = new Point(5,10); - groupHeader.Size = new Size (300,30); - groupHeader.Items.Add(dataItem); - base.ReportModel.DetailSection.Items.Add(groupHeader); + var items = base.AddItemsToContainer(this.reportItems); + ParentItem.Items.AddRange(items); + ParentItem.Size = new Size(ParentItem.Size.Width,items[0].Size.Height + GlobalValues.ControlMargins.Top + GlobalValues.ControlMargins.Bottom); + section.Items.Add(ParentItem as BaseReportItem); } #endregion diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs index e0c5a570b9..d703c69ca9 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportLayout/TableLayout.cs @@ -4,6 +4,7 @@ using System; using System.Drawing; using ICSharpCode.Reports.Core; +using ICSharpCode.Reports.Core.Interfaces; namespace ICSharpCode.Reports.Addin.ReportWizard { @@ -22,7 +23,6 @@ namespace ICSharpCode.Reports.Addin.ReportWizard } - public override void CreatePageHeader() { base.CreatePageHeader(); @@ -40,39 +40,61 @@ namespace ICSharpCode.Reports.Addin.ReportWizard ICSharpCode.Reports.Core.BaseTableItem table = new ICSharpCode.Reports.Core.BaseTableItem(); table.Name = "Table1"; - AdjustContainer(base.ReportModel.DetailSection,table); + base.ReportModel.DetailSection.Items.Add(table); - ICSharpCode.Reports.Core.BaseRowItem r1 = CreateRowWithTextColumns(table, - this.reportItems); + base.ParentItem = table; + ICSharpCode.Reports.Core.BaseRowItem headerRow = CreateRowWithTextColumns(ParentItem, this.reportItems); + ParentItem.Items.Add (headerRow); - ICSharpCode.Reports.Core.BaseRowItem r2 = new ICSharpCode.Reports.Core.BaseRowItem(); + Point insertLocation = new Point (margin.Left,headerRow.Location.Y + headerRow.Size.Height + margin.Bottom + margin.Top); - AdjustContainer (table,r2); - - r2.Location = new Point (margin.Left, - r1.Location.Y + r1.Size.Height + margin.Bottom + margin.Top); + + if (base.ReportModel.ReportSettings.GroupColumnsCollection.Count > 0) { + var groupHeader = base.CreateGroupHeader(insertLocation); + ParentItem.Items.Add(groupHeader); + insertLocation = new Point(margin.Left,insertLocation.Y + groupHeader.Size.Height + margin.Bottom + margin.Top); + } + + //Insert details allways + + ICSharpCode.Reports.Core.BaseRowItem detailRow = new ICSharpCode.Reports.Core.BaseRowItem(); + AdjustContainer (ParentItem,detailRow); + + detailRow.Location = insertLocation; + detailRow.Size = new Size(detailRow.Size.Width,30); - int defX = r2.Size.Width / this.reportItems.Count; + int defX = AbstractLayout.CalculateControlWidth(detailRow,reportItems); - int startX = r2.Location.X + margin.Left; + int startX = margin.Left; foreach (ICSharpCode.Reports.Core.BaseReportItem ir in this.reportItems) { Point np = new Point(startX,margin.Top); startX += defX; ir.Location = np; - ir.Parent = r2; - r2.Items.Add(ir); + ir.Parent = detailRow; + detailRow.Items.Add(ir); } - table.Size = new Size (table.Size.Width, - margin.Top + r1.Size.Height + margin.Bottom + r2.Size.Height + margin.Bottom); - section.Size = new Size (section.Size.Width,table.Size.Height + margin.Top + margin.Bottom); - table.Items.Add (r1); - table.Items.Add (r2); - base.ReportModel.DetailSection.Items.Add(table); + ParentItem.Items.Add (detailRow); + ParentItem.Size = CalculateContainerSize(ParentItem); + section.Size = new Size (section.Size.Width,ParentItem.Size.Height + margin.Top + margin.Bottom); + } + + + private Size CalculateContainerSize(ISimpleContainer container) + { + int h = GlobalValues.ControlMargins.Top; + + foreach (ICSharpCode.Reports.Core.BaseReportItem item in container.Items) + { + h = h + item.Size.Height + GlobalValues.ControlMargins.Bottom; + } + h = h + 3*GlobalValues.ControlMargins.Bottom; + + return new Size (container.Size.Width,h); } } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/ICSharpCode.Reports.Addin.Test.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/ICSharpCode.Reports.Addin.Test.csproj index 77276b77a0..4934da2604 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/ICSharpCode.Reports.Addin.Test.csproj +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/ICSharpCode.Reports.Addin.Test.csproj @@ -70,6 +70,7 @@ + diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenerateListWithGroupFixture.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenerateListWithGroupFixture.cs index a4d6bf8c98..2dfae7317d 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenerateListWithGroupFixture.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenerateListWithGroupFixture.cs @@ -99,7 +99,7 @@ namespace ICSharpCode.Reports.Addin.Test.Wizard.Generators { // TODO: Add tear down code. } - + /* private static ReportModel CreateModel (string reportName) { @@ -120,6 +120,7 @@ namespace ICSharpCode.Reports.Addin.Test.Wizard.Generators customizer.Set("Generator", structure); customizer.Set("ReportLayout",GlobalEnums.ReportLayout.ListLayout); + IReportGenerator generator = new GeneratePushDataReport(m,customizer); generator.GenerateReport(); @@ -136,7 +137,7 @@ namespace ICSharpCode.Reports.Addin.Test.Wizard.Generators return model; } - + */ private static ReportStructure CreateReportStructure (string reportName) { ReportStructure structure = new ReportStructure(); diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenertaeTableWithgroupFixture.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenertaeTableWithgroupFixture.cs new file mode 100644 index 0000000000..e8f1029aa9 --- /dev/null +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Test/Wizard/Generators/GenertaeTableWithgroupFixture.cs @@ -0,0 +1,127 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 03.10.2010 + * Time: 17:26 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using ICSharpCode.Reports.Addin.ReportWizard; +using ICSharpCode.Reports.Core; +using NUnit.Framework; + +namespace ICSharpCode.Reports.Addin.Test.Wizard.Generators +{ + [TestFixture] + public class GenertaeTableWithGroupFixture + { + + private const string reportName = "TableBasedReport"; + private ReportModel reportModel; + + + [Test] + public void PageDetail_First_Item_Should_Table() + { + ICSharpCode.Reports.Core.BaseSection s = this.reportModel.DetailSection; + var item = s.Items[0]; + Assert.That(item,Is.InstanceOf(typeof(ICSharpCode.Reports.Core.BaseTableItem))); + } + + + [Test] + public void Table_Should_Contain_Three_Rows() + { + ICSharpCode.Reports.Core.BaseSection s = this.reportModel.DetailSection; + ICSharpCode.Reports.Core.BaseTableItem table = s.Items[0] as ICSharpCode.Reports.Core.BaseTableItem; + Assert.That(table.Items.Count,Is.GreaterThanOrEqualTo(3)); + } + + + [Test] + public void Table_FirstItem_Should_Row () + { + ICSharpCode.Reports.Core.BaseSection s = this.reportModel.DetailSection; + ICSharpCode.Reports.Core.BaseTableItem table = s.Items[0] as ICSharpCode.Reports.Core.BaseTableItem; + var row = table.Items[0]; + Assert.That(row,Is.InstanceOf(typeof(ICSharpCode.Reports.Core.BaseRowItem))); + } + + + [Test] + public void Table_SecondItem_Should_GroupRow () + { + ICSharpCode.Reports.Core.BaseSection s = this.reportModel.DetailSection; + ICSharpCode.Reports.Core.BaseTableItem table = s.Items[0] as ICSharpCode.Reports.Core.BaseTableItem; + var row = table.Items[1]; + Assert.That(row,Is.InstanceOf(typeof(ICSharpCode.Reports.Core.BaseGroupedRow))); + } + + #region setup / TearDown + + [TestFixtureSetUp] + public void Init() + { + this.reportModel = CreateModel(reportName); + } + + [TestFixtureTearDown] + public void Dispose() + { + // TODO: Add tear down code. + } + + private static ReportModel CreateModel (string reportName) + { + + ReportStructure structure = CreateReportStructure(reportName); + + AvailableFieldsCollection abstractColumns = new AvailableFieldsCollection(); + AbstractColumn a1 = new AbstractColumn("Field1",typeof(System.String)); + structure.AvailableFieldsCollection.Add(a1); + + ICSharpCode.Reports.Core.BaseDataItem bri = new ICSharpCode.Reports.Core.BaseDataItem(); + bri.Name ="Field1"; + structure.ReportItemCollection.Add(bri); + + structure.Grouping = "group"; + + ReportModel m = structure.CreateAndFillReportModel(); + + ICSharpCode.Core.Properties customizer = new ICSharpCode.Core.Properties(); + + customizer.Set("Generator", structure); + customizer.Set("ReportLayout",GlobalEnums.ReportLayout.TableLayout); + + IReportGenerator generator = new GeneratePushDataReport(m,customizer); + + generator.GenerateReport(); + + ReportLoader rl = new ReportLoader(); + object root = rl.Load(generator.XmlReport.DocumentElement); + ReportModel model = root as ReportModel; + if (model != null) { + model.ReportSettings.FileName = GlobalValues.PlainFileName; + FilePathConverter.AdjustReportName(model); + } else { + throw new InvalidReportModelException(); + } + return model; + } + + + private static ReportStructure CreateReportStructure (string reportName) + { + ReportStructure structure = new ReportStructure(); + structure.ReportName = reportName; + structure.DataModel = GlobalEnums.PushPullModel.PushData; + structure.ReportType = GlobalEnums.ReportType.DataReport; + return structure; + } + + #endregion + + } +} diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj index d0e2e7fb90..ce082baaa2 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj @@ -138,12 +138,12 @@ + - @@ -272,7 +272,9 @@ + + Component diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/Layouter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/Layouter.cs index 85e01eb9e0..9e38e5336c 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/Layouter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/Layouter.cs @@ -39,17 +39,12 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing System.Collections.Generic.IEnumerable canGrowShrinkCollection = from bt in container.Items where bt.CanGrow == true select bt; if (canGrowShrinkCollection.Count() > 0 ) { - - int bottomPadding = container.Size.Height - (container.Items[0].Location.Y + container.Items[0].Size.Height); - Rectangle surroundingRec = FindSurroundingRectangle(graphics,canGrowShrinkCollection); - desiredContainerRectangle = new Rectangle(container.Location.X, container.Location.Y, container.Size.Width, - surroundingRec.Size.Height + bottomPadding ); + surroundingRec.Size.Height + GlobalValues.ControlMargins.Top + GlobalValues.ControlMargins.Bottom); } - return desiredContainerRectangle; } @@ -63,6 +58,7 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing throw new ArgumentNullException("section"); } + Console.WriteLine("layouter for {0}",section.Name); IEnumerable canGrowShrinkCollection = from bt in section.Items where bt.CanGrow == true select bt; @@ -73,17 +69,13 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing if (canGrowShrinkCollection.Count() > 0) { - //Console.WriteLine ("xx layout section"); - - int bottomPadding = section.Size.Height - (section.Items[0].Size.Height + section.Items[0].Location.Y); - Rectangle surroundingRec = FindSurroundingRectangle(graphics,canGrowShrinkCollection); if (surroundingRec.Height > desiredSectionRectangle .Height) { desiredSectionRectangle = new Rectangle(section.Location.X, section .Location.Y, section .Size.Width, - surroundingRec.Size.Height + bottomPadding); + surroundingRec.Size.Height + GlobalValues.ControlMargins.Top + GlobalValues.ControlMargins.Bottom ); } } return desiredSectionRectangle; diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/PrintHelper.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/PrintHelper.cs index 2c472cb13d..6f44c4da66 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/PrintHelper.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/PrintHelper.cs @@ -25,7 +25,7 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing { Rectangle textRect = layouter.Layout(graphics,row); if (textRect.Height > row.Size.Height) { - row.Size = new Size(row.Size.Width,textRect.Height); + row.Size = new Size(row.Size.Width,textRect.Height + 5); } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardPrinter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardPrinter.cs index cb4df1f483..8eec0e3799 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardPrinter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardPrinter.cs @@ -265,8 +265,8 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing textItem.Text = evaluator.Evaluate(textItem.Text); } } - } catch (Exception e) { - throw e; + } catch (Exception) { + throw ; } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseGroupedRow.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseGroupedRow.cs index 134ef94a11..7648682bdb 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseGroupedRow.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseGroupedRow.cs @@ -12,7 +12,8 @@ namespace ICSharpCode.Reports.Core { public BaseGroupedRow():base() { - Console.WriteLine("Constr baseGroupedrow"); } + + public bool PageBreakOnGroupChange {get;set;} } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseSection.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseSection.cs index ee3cbeeda9..4b54567b96 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseSection.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/BaseSection.cs @@ -16,7 +16,8 @@ using ICSharpCode.Reports.Core.Interfaces; namespace ICSharpCode.Reports.Core { - public class BaseSection : BaseReportItem { + public class BaseSection : BaseReportItem,ISimpleContainer + { private bool pageBreakAfter; private ReportItemCollection items; diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/Graphics/BaseImageItem.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/Graphics/BaseImageItem.cs index a79f42b2c4..b51eaa3850 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/Graphics/BaseImageItem.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseItems/Graphics/BaseImageItem.cs @@ -171,13 +171,9 @@ namespace ICSharpCode.Reports.Core { } - public string DBValue { - get{throw new NotImplementedException();} - set{throw new NotImplementedException();} - } - - + public string DBValue {get;set;} + public virtual string ImageFileName { get { diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs index 768dadb030..53250ed5c9 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataManager.cs @@ -64,7 +64,6 @@ namespace ICSharpCode.Reports.Core { } } - #endregion diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs index fc0e275d2d..5f80861061 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/DataNavigator.cs @@ -43,9 +43,10 @@ namespace ICSharpCode.Reports.Core } - public bool HasMoreData { + public bool HasMoreData + { get { - if (this.CurrentRow < this.Count -1 ){ + if (this.CurrentRow < store.IndexList.Count -1 ){ return true; } else { return false; @@ -64,6 +65,7 @@ namespace ICSharpCode.Reports.Core public bool IsSorted {get {return this.store.IsSorted;}} + public bool IsGrouped {get {return this.store.IsGrouped;}} @@ -106,33 +108,6 @@ namespace ICSharpCode.Reports.Core } } - - /* - public int ChildListCount - { - get { - return BuildChildList().Count; - } - } - */ - - - // at the moment only tables are working - /* - public void FillChild (ReportItemCollection collection) - { - TableStrategy tableStrategy = store as TableStrategy; - foreach (var item in collection) { - IDataItem dataItem = item as IDataItem; - if (dataItem != null) { - CurrentItemsCollection currentItemsCollection = tableStrategy.FillDataRow(ce.Current.ListIndex); - CurrentItem s = currentItemsCollection.FirstOrDefault(x => x.ColumnName == dataItem.ColumnName); - dataItem.DBValue = s.Value.ToString(); - } - - } - } - */ private IndexList BuildChildList() { @@ -147,6 +122,7 @@ namespace ICSharpCode.Reports.Core #endregion + #region Try make recursive with ChildNavigavtor public IDataNavigator GetChildNavigator() diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs index 176055672c..dca0166900 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs @@ -99,10 +99,10 @@ namespace ICSharpCode.Reports.Core public override void Group () { base.Group(); - IndexList gl = new IndexList("group"); - gl = this.BuildSortIndex (ReportSettings.GroupColumnsCollection); - ShowIndexList(gl); - BuildGroup(gl); + IndexList sortedIndexList = new IndexList("group"); + sortedIndexList = this.BuildSortIndex (ReportSettings.GroupColumnsCollection); + ShowIndexList(sortedIndexList); + BuildGroup(sortedIndexList); } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/BasePager.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/BasePager.cs index 1304a07bcb..8810143d3a 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/BasePager.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/BasePager.cs @@ -15,11 +15,8 @@ namespace ICSharpCode.Reports.Core.Exporter /// public class BasePager:IReportCreator { - private ExporterPage singlePage; private PagesCollection pages; - private IReportModel reportModel; private Graphics graphics; - private bool pageFull; private readonly object pageLock = new object(); private ILayouter layouter; @@ -36,9 +33,9 @@ namespace ICSharpCode.Reports.Core.Exporter if (layouter == null) { throw new ArgumentNullException ("layouter"); } - this.reportModel = reportModel; + this.ReportModel = reportModel; this.layouter = layouter; - this.graphics = CreateGraphicObject.FromSize(this.reportModel.ReportSettings.PageSize); + this.graphics = CreateGraphicObject.FromSize(this.ReportModel.ReportSettings.PageSize); } #endregion @@ -60,13 +57,13 @@ namespace ICSharpCode.Reports.Core.Exporter protected ExporterPage InitNewPage () { bool firstPage; - this.ReportModel.ReportSettings.LeftMargin = this.reportModel.ReportSettings.LeftMargin; + this.ReportModel.ReportSettings.LeftMargin = this.ReportModel.ReportSettings.LeftMargin; if (this.Pages.Count == 0) { firstPage = true; } else { firstPage = false; } - SectionBounds sectionBounds = new SectionBounds (this.reportModel.ReportSettings,firstPage); + SectionBounds sectionBounds = new SectionBounds (this.ReportModel.ReportSettings,firstPage); ExporterPage sp = ExporterPage.CreateInstance(sectionBounds,this.pages.Count + 1); return sp; } @@ -74,10 +71,9 @@ namespace ICSharpCode.Reports.Core.Exporter protected virtual void BuildNewPage () { - this.singlePage = this.InitNewPage(); - PrintHelper.InitPage(this.singlePage,this.reportModel.ReportSettings); - this.singlePage.CalculatePageBounds(this.ReportModel); - this.pageFull = false; + this.SinglePage = this.InitNewPage(); + PrintHelper.InitPage(this.SinglePage,this.ReportModel.ReportSettings); + this.SinglePage.CalculatePageBounds(this.ReportModel); } #endregion @@ -94,10 +90,6 @@ namespace ICSharpCode.Reports.Core.Exporter ExporterCollection list = new ExporterCollection(); -// if (section.DrawBorder == true) { -// section.Items.Insert(0,CreateDebugItem(section)); -// } - if (section.Items.Count > 0) { Point offset = new Point(section.Location.X,section.SectionOffset); @@ -123,7 +115,7 @@ namespace ICSharpCode.Reports.Core.Exporter Rectangle sectionRectangle = new Rectangle(0,0,section.Size.Width,section.Size.Height); if (!sectionRectangle.Contains(desiredRectangle)) { - section.Size = new Size(section.Size.Width,desiredRectangle.Size.Height); + section.Size = new Size(section.Size.Width,desiredRectangle.Size.Height + GlobalValues.ControlMargins.Top + GlobalValues.ControlMargins.Bottom); } list = StandardPrinter.ConvertPlainCollection(section.Items,offset); @@ -183,32 +175,27 @@ namespace ICSharpCode.Reports.Core.Exporter #endregion - protected void FinishRendering (IDataNavigator navigator) + #region After Converting, final step's + + protected void FinishRendering (IDataNavigator dataNavigator) { if (this.Pages.Count == 0) { return; } - // set values known only end of reportcreation - foreach (ExporterPage p in this.pages) - { - p.TotalPages = this.Pages.Count; - } - - this.singlePage.IDataNavigator = navigator; - IExpressionEvaluatorFacade evaluatorFacade = new ExpressionEvaluatorFacade(this.singlePage); + IExpressionEvaluatorFacade evaluatorFacade = new ExpressionEvaluatorFacade(this.SinglePage); foreach (ExporterPage p in this.pages) { - this.singlePage = p; -// evaluatorFacade.SinglePage = this.singlePage; -// evaluatorFacade.SinglePage.IDataNavigator = navigator; + p.TotalPages = this.Pages.Count; + p.IDataNavigator = dataNavigator; + evaluatorFacade.SinglePage = p; EvaluateRecursive(evaluatorFacade,p.Items); } } - private void EvaluateRecursive (IExpressionEvaluatorFacade evaluatorFassade,ExporterCollection items) + private static void EvaluateRecursive (IExpressionEvaluatorFacade evaluatorFassade,ExporterCollection items) { foreach (BaseExportColumn be in items) { @@ -222,6 +209,10 @@ namespace ICSharpCode.Reports.Core.Exporter ExportText et = be as ExportText; if (et != null) { try{ + if (et.Text.StartsWith("=Globals!Page")) { + Console.WriteLine ("wxpression : {0}",evaluatorFassade.Evaluate(et.Text)); + } + et.Text = evaluatorFassade.Evaluate(et.Text); } catch (UnknownFunctionException ufe) @@ -232,11 +223,12 @@ namespace ICSharpCode.Reports.Core.Exporter { } - } } } + #endregion + #region Event's @@ -272,19 +264,9 @@ namespace ICSharpCode.Reports.Core.Exporter get { return layouter; } } - public IReportModel ReportModel - { - get { return reportModel; } - set { reportModel = value; } - } - - - protected ExporterPage SinglePage - { - get { return singlePage; } - set { singlePage = value; } - } - + public IReportModel ReportModel {get;set;} + + protected ExporterPage SinglePage {get;set;} public PagesCollection Pages { @@ -301,16 +283,16 @@ namespace ICSharpCode.Reports.Core.Exporter protected SectionBounds SectionBounds { - get { return singlePage.SectionBounds; } + get { return SinglePage.SectionBounds; } } - protected bool PageFull - { - get { return pageFull; } - set { pageFull = value; } - } - +// protected bool PageFull +// { +// get { return pageFull; } +// set { pageFull = value; } +// } +// #endregion } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs index c6e2b0642d..ffa43e9767 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/BaseConverter.cs @@ -2,7 +2,10 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.ObjectModel; using System.Drawing; +using System.Linq; + using ICSharpCode.Reports.Core.BaseClasses; using ICSharpCode.Reports.Core.BaseClasses.Printing; using ICSharpCode.Reports.Core.Events; @@ -53,7 +56,6 @@ namespace ICSharpCode.Reports.Core.Exporter } - #region PageBreak protected void BuildNewPage(ExporterCollection myList,BaseSection section) @@ -69,6 +71,7 @@ namespace ICSharpCode.Reports.Core.Exporter EventHelper.Raise(PageFull,this,new NewPageEventArgs(items)); } + #endregion @@ -105,6 +108,41 @@ namespace ICSharpCode.Reports.Core.Exporter } + #region Grouping + + protected Point ConvertGroupChilds(ExporterCollection mylist, BaseSection section, ISimpleContainer simpleContainer, int defaultLeftPos, Point currentPosition) + { + PrepareContainerForConverting(section,simpleContainer); + Point curPos = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); + AfterConverting (section,mylist); + return curPos; + } + + + protected bool PageBreakAfterGroupChange(ISimpleContainer container) + { + var groupedRows = BaseConverter.FindGroups(container); + if (groupedRows.Count > 0) { + var groupedRow = groupedRows[0]; + return groupedRow.PageBreakOnGroupChange; + } + return false; + } + + + protected static Collection FindGroups (ISimpleContainer container) + { + return new Collection(container.Items.OfType().ToList()); + } + + + protected virtual Point ForcePageBreak(ExporterCollection exporterCollection, BaseSection section) + { + BuildNewPage(exporterCollection,section); + return Point.Empty; + } + + #endregion #region IBaseConverter @@ -114,16 +152,19 @@ namespace ICSharpCode.Reports.Core.Exporter return new ExporterCollection();; } + public Point CurrentPosition {get;set;} + #endregion public Rectangle ParentRectangle { get { return parentRectangle; } } - public ExporterPage SinglePage { + public ISinglePage SinglePage { get { return singlePage; } } + public SectionBounds SectionBounds { get { return sectionBounds; } } @@ -138,9 +179,10 @@ namespace ICSharpCode.Reports.Core.Exporter } public Graphics Graphics {get;set;} - #endregion - protected void SaveSize(Size size) + + + protected void SaveSectionSize(Size size) { this.saveSize = size; } @@ -158,13 +200,6 @@ namespace ICSharpCode.Reports.Core.Exporter } - protected void FillRow (ISimpleContainer row) - { - DataNavigator.Fill(row.Items); - } - - - protected void PrepareContainerForConverting(BaseSection section,ISimpleContainer simpleContainer) { if (section != null) { @@ -174,17 +209,39 @@ namespace ICSharpCode.Reports.Core.Exporter } - private void LayoutRow (ISimpleContainer row) + protected void AfterConverting (BaseSection section,ExporterCollection convertedList) { - PrintHelper.SetLayoutForRow(Graphics,Layouter,row); + StandardPrinter.EvaluateRow(Evaluator,convertedList); } - + + protected Point ConvertStandardRow(ExporterCollection mylist, BaseSection section, ISimpleContainer simpleContainer, int defaultLeftPos, Point currentPosition) + { + FillRow(simpleContainer); + PrepareContainerForConverting(section,simpleContainer); + Point curPos = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); + AfterConverting (section,mylist); + return curPos; + } + + protected static Point BaseConvert(ExporterCollection myList,ISimpleContainer container,int leftPos,Point curPos) { ExporterCollection ml = BaseConverter.ConvertItems (container, curPos); myList.AddRange(ml); return new Point (leftPos,curPos.Y + container.Size.Height + (3 *GlobalValues.GapBetweenContainer)); } + + + private void FillRow (ISimpleContainer row) + { + DataNavigator.Fill(row.Items); + } + + + private void LayoutRow (ISimpleContainer row) + { + PrintHelper.SetLayoutForRow(Graphics,Layouter,row); + } } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/ConverterFactory.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/ConverterFactory.cs index 1cbe65190b..4873a32c13 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/ConverterFactory.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/ConverterFactory.cs @@ -21,7 +21,7 @@ namespace ICSharpCode.Reports.Core.Exporter Type t = itemToConvert.GetType(); if (t.Equals(typeof(BaseTableItem))) { - return new TableConverter(dataNavigator,singlePage,layouter); + return new GroupedTableConverter(dataNavigator,singlePage,layouter); } if (t.Equals(typeof(BaseRowItem))) { diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs index 94e9ead8c6..3fc01122cd 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedRowConverter.cs @@ -2,11 +2,7 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Drawing; -using System.Linq; - using ICSharpCode.Reports.Core.BaseClasses.Printing; using ICSharpCode.Reports.Core.Interfaces; @@ -23,10 +19,11 @@ namespace ICSharpCode.Reports.Core.Exporter private BaseReportItem parent; public GroupedRowConverter(IDataNavigator dataNavigator, - ExporterPage singlePage, ILayouter layouter):base(dataNavigator,singlePage,layouter) - { + ExporterPage singlePage, ILayouter layouter):base(dataNavigator,singlePage,layouter) + { } + public override ExporterCollection Convert(BaseReportItem parent, BaseReportItem item) { if (parent == null) { @@ -46,7 +43,7 @@ namespace ICSharpCode.Reports.Core.Exporter ExporterCollection myList = new ExporterCollection(); BaseConverter.BaseConvert (myList,simpleContainer,parent.Location.X, - new Point(base.SectionBounds.DetailStart.X,base.SectionBounds.DetailStart.Y)); + new Point(base.SectionBounds.DetailStart.X,base.SectionBounds.DetailStart.Y)); return myList; } else { @@ -58,68 +55,117 @@ namespace ICSharpCode.Reports.Core.Exporter private ExporterCollection ConvertDataRow (ISimpleContainer simpleContainer) { ExporterCollection exporterCollection = new ExporterCollection(); - Point currentPosition = new Point(base.SectionBounds.DetailStart.X,base.SectionBounds.DetailStart.Y); + base.CurrentPosition = new Point(base.SectionBounds.DetailStart.X,base.SectionBounds.DetailStart.Y); BaseSection section = parent as BaseSection; int defaultLeftPos = parent.Location.X; + + Size groupSize = Size.Empty; + Size childSize = Size.Empty; + + Console.WriteLine("-------------------START"); + Console.WriteLine ("section {0}",section.Size); + + Console.WriteLine(); + + + if (section.Items.IsGrouped) + { + groupSize = section.Items[0].Size; + childSize = section.Items[1].Size; + Console.WriteLine ("group {0}",section.Items[0].Size); + Console.WriteLine ("detail {0}",section.Items[1].Size); + } + Rectangle pageBreakRect = Rectangle.Empty; do { - + base.SaveSectionSize(section.Size); PrintHelper.AdjustSectionLocation (section); section.Size = this.SectionBounds.DetailSectionRectangle.Size; - base.SaveSize(section.Items[0].Size); // did we have GroupedItems at all - if (section.Items.IsGrouped) { - + if (section.Items.IsGrouped) + { // GetType child navigator IDataNavigator childNavigator = base.DataNavigator.GetChildNavigator(); base.Evaluator.SinglePage.IDataNavigator = childNavigator; - // Convert Grouping Header - currentPosition = ConvertGroupHeader(exporterCollection,section,simpleContainer,defaultLeftPos,currentPosition); + base.CurrentPosition = ConvertGroupHeader(exporterCollection,section,defaultLeftPos,base.CurrentPosition); + + section.Size = base.RestoreSize; + section.Items[0].Size = groupSize; + section.Items[1].Size = childSize; childNavigator.Reset(); childNavigator.MoveNext(); + Console.WriteLine("-------------------after group"); + + Console.WriteLine ("section {0}",section.Size); + Console.WriteLine ("group {0}",section.Items[0].Size); + Console.WriteLine ("detail {0}",section.Items[1].Size); + Console.WriteLine(); + //Convert children - if (childNavigator != null) { + if (childNavigator != null) { StandardPrinter.AdjustBackColor(simpleContainer,GlobalValues.DefaultBackColor); - - do { - childNavigator.Fill(simpleContainer.Items); + do + { + Console.WriteLine("-----------------childs"); + Console.WriteLine ("section {0}",section.Size); + Console.WriteLine ("group {0}",section.Items[0].Size); + Console.WriteLine ("detail {0}",section.Items[1].Size); + Console.WriteLine(); + section.Size = base.RestoreSize; + section.Items[0].Size = groupSize; + section.Items[1].Size = childSize; - currentPosition = ConvertGroupChilds (exporterCollection,section, - simpleContainer,defaultLeftPos,currentPosition); - pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)section.Items[1],currentPosition); + childNavigator.Fill(simpleContainer.Items); + + base.CurrentPosition = ConvertGroupChilds (exporterCollection,section, + simpleContainer,defaultLeftPos,base.CurrentPosition); + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)section.Items[1],base.CurrentPosition); +// section.Items[1].Size = base.RestoreSize; if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds )) { - base.BuildNewPage(exporterCollection,section); - currentPosition = CalculateStartPosition (); + base.CurrentPosition = ForcePageBreak (exporterCollection,section); } } - while ( childNavigator.MoveNext()); + + if (PageBreakAfterGroupChange(section) ) { + + if ( base.DataNavigator.HasMoreData) + { + base.CurrentPosition = ForcePageBreak (exporterCollection,section); + } + } + base.Evaluator.SinglePage.IDataNavigator = base.DataNavigator; } } else { // No Grouping at all - currentPosition = ConvertStandardRow (exporterCollection,section,simpleContainer,defaultLeftPos,currentPosition); + Size dd = section.Items[0].Size; + Console.WriteLine("---------NoGrouping"); + Console.WriteLine ("section {0}",section.Size); + Console.WriteLine ("row {0}",dd); + base.CurrentPosition = ConvertStandardRow (exporterCollection,section,simpleContainer,defaultLeftPos,base.CurrentPosition); + section.Size = base.RestoreSize; + section.Items[0].Size = dd; } - pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)section.Items[0],currentPosition); + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)section.Items[0],base.CurrentPosition); + if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds)) { - base.BuildNewPage(exporterCollection,section); - currentPosition = CalculateStartPosition(); + base.CurrentPosition = ForcePageBreak (exporterCollection,section); } ShouldDrawBorder (section,exporterCollection); - } while (base.DataNavigator.MoveNext()); @@ -127,22 +173,30 @@ namespace ICSharpCode.Reports.Core.Exporter section.Location.Y + section.Size.Height, SectionBounds.ReportFooterRectangle.Width, SectionBounds.ReportFooterRectangle.Height); + return exporterCollection; } + protected override Point ForcePageBreak(ExporterCollection exporterCollection, BaseSection section) + { + base.ForcePageBreak(exporterCollection,section); + return CalculateStartPosition(); + } + + private Point CalculateStartPosition() { return new Point(base.SectionBounds.PageHeaderRectangle.X,base.SectionBounds.PageHeaderRectangle.Y); } - private Point ConvertGroupHeader(ExporterCollection mylist,BaseSection section,ISimpleContainer simpleContainer,int leftPos,Point offset) + private Point ConvertGroupHeader(ExporterCollection exportList,BaseSection section,int leftPos,Point offset) { - Point retVal = Point.Empty; + var retVal = Point.Empty; ReportItemCollection groupCollection = null; - var grh = new Collection(section.Items.OfType().ToList()); - if (grh.Count == 0) { + var groupedRows = BaseConverter.FindGroups(section); + if (groupedRows.Count == 0) { groupCollection = section.Items.ExtractGroupedColumns(); base.DataNavigator.Fill(groupCollection); base.FireSectionRendering(section); @@ -150,45 +204,16 @@ namespace ICSharpCode.Reports.Core.Exporter StandardPrinter.EvaluateRow(base.Evaluator,list); - mylist.AddRange(list); + exportList.AddRange(list); AfterConverting (section,list); retVal = new Point (leftPos,offset.Y + groupCollection[0].Size.Height + 20 + (3 *GlobalValues.GapBetweenContainer)); } else { - retVal = ConvertStandardRow(mylist,section,grh[0],leftPos,offset); + retVal = ConvertStandardRow(exportList,section,groupedRows[0],leftPos,offset); } return retVal; } - private Point ConvertGroupChilds(ExporterCollection mylist, BaseSection section, ISimpleContainer simpleContainer, int defaultLeftPos, Point currentPosition) - { - PrepareContainerForConverting(section,simpleContainer); - Point curPos = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); - AfterConverting (section,mylist); - return curPos; - } - - - private Point ConvertStandardRow(ExporterCollection mylist, BaseSection section, ISimpleContainer simpleContainer, int defaultLeftPos, Point currentPosition) - { - base.FillRow(simpleContainer); - PrepareContainerForConverting(section,simpleContainer); - Point curPos = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); - StandardPrinter.EvaluateRow(base.Evaluator,mylist); - AfterConverting (section,mylist); - return curPos; - } - - - private void AfterConverting (BaseSection section,ExporterCollection mylist) - { - StandardPrinter.EvaluateRow(base.Evaluator,mylist); - - section.Items[0].Size = base.RestoreSize; - section.SectionOffset += section.Size.Height + 3 * GlobalValues.GapBetweenContainer; - } - - private static void ShouldDrawBorder (BaseSection section,ExporterCollection list) { if (section.DrawBorder == true) { diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedTableConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedTableConverter.cs new file mode 100644 index 0000000000..903c9795e6 --- /dev/null +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/GroupedTableConverter.cs @@ -0,0 +1,203 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Collections.ObjectModel; +using System.Drawing; +using System.Linq; + +using ICSharpCode.Reports.Core.BaseClasses.Printing; +using ICSharpCode.Reports.Core.Interfaces; + +namespace ICSharpCode.Reports.Core.Exporter +{ + /// + /// Description of TableConverter. + /// + public class GroupedTableConverter:BaseConverter + { + + private ITableContainer table; + + public GroupedTableConverter(IDataNavigator dataNavigator, + ExporterPage singlePage, ILayouter layouter ):base(dataNavigator,singlePage,layouter) + + { + } + + + public override ExporterCollection Convert (BaseReportItem parent,BaseReportItem item) + { + if (parent == null) { + throw new ArgumentNullException("parent"); + } + if (item == null) { + throw new ArgumentNullException("item"); + } + + ExporterCollection mylist = base.Convert(parent,item); + this.table = (BaseTableItem)item ; + this.table.Parent = parent; + this.table.DataNavigator = base.DataNavigator; + return ConvertInternal(mylist); + } + + + + private ExporterCollection ConvertInternal(ExporterCollection exporterCollection) + { + + BaseSection section = table.Parent as BaseSection; + + base.CurrentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.table.Parent,this.table).Location.X, + base.SectionBounds.DetailStart.Y); + int defaultLeftPos = base.CurrentPosition.X; + + Point dataAreaStart = new Point(table.Items[0].Location.X,table.Items[0].Location.Y + base.CurrentPosition.Y); + + ISimpleContainer headerRow = null; + Rectangle pageBreakRect = Rectangle.Empty; + this.table.Items.SortByLocation(); + + // Header + + var simpleContainer = table.Items[0] as ISimpleContainer; + + if (simpleContainer.Items.Count > 0) + { + simpleContainer.Location = new Point (simpleContainer.Location.X,simpleContainer.Location.Y); + simpleContainer.Parent = (BaseReportItem)this.table; + + base.SaveSectionSize( new Size (simpleContainer.Size.Width,simpleContainer.Size.Height)); + + if (PrintHelper.IsTextOnlyRow(simpleContainer) ) { + headerRow = simpleContainer; + base.CurrentPosition = BaseConverter.BaseConvert(exporterCollection,headerRow,defaultLeftPos,base.CurrentPosition); + } + + BaseGroupedRow row = table.Items[1] as BaseGroupedRow; + + if (row != null) { + + //grouped + do { + + // GetType child navigator + IDataNavigator childNavigator = base.DataNavigator.GetChildNavigator(); + + base.Evaluator.SinglePage.IDataNavigator = childNavigator; + // Convert Grouping Header + + base.CurrentPosition = ConvertGroupHeader(exporterCollection,section,defaultLeftPos,base.CurrentPosition); + + childNavigator.Reset(); + childNavigator.MoveNext(); + + //Convert children + if (childNavigator != null) { + do + { + StandardPrinter.AdjustBackColor(simpleContainer,GlobalValues.DefaultBackColor); + simpleContainer = table.Items[2] as ISimpleContainer; + + childNavigator.Fill(simpleContainer.Items); + + base.CurrentPosition = ConvertGroupChilds (exporterCollection, + section, + simpleContainer,defaultLeftPos,base.CurrentPosition); + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)simpleContainer,base.CurrentPosition); + + if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds)) + { + base.CurrentPosition = base.ForcePageBreak(exporterCollection,section); + base.CurrentPosition = ConvertStandardRow (exporterCollection,section,headerRow,defaultLeftPos,base.CurrentPosition); + } + } + while ( childNavigator.MoveNext()); + + if (PageBreakAfterGroupChange(table) ) + { + if ( base.DataNavigator.HasMoreData) + { + base.CurrentPosition = base.ForcePageBreak(exporterCollection,section); + base.CurrentPosition = ConvertStandardRow (exporterCollection,section,headerRow,defaultLeftPos,base.CurrentPosition); + } + + } + + base.Evaluator.SinglePage.IDataNavigator = base.DataNavigator; + } + } + while (base.DataNavigator.MoveNext()); + } + + else + { + // No Grouping at all + + base.SaveSectionSize(simpleContainer.Size); + simpleContainer = table.Items[1] as ISimpleContainer; + + do { + + PrintHelper.AdjustSectionLocation(section); + + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)simpleContainer,base.CurrentPosition); + + if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds)) + { + base.CurrentPosition = base.ForcePageBreak(exporterCollection,section); + base.CurrentPosition = ConvertStandardRow (exporterCollection,section,headerRow,defaultLeftPos,base.CurrentPosition); + } + + base.CurrentPosition = ConvertStandardRow (exporterCollection,section,simpleContainer,defaultLeftPos,base.CurrentPosition); + + simpleContainer.Size = base.RestoreSize; + } + while (base.DataNavigator.MoveNext()); + + base.DataNavigator.Reset(); + base.DataNavigator.MoveNext(); + SectionBounds.ReportFooterRectangle = new Rectangle(SectionBounds.ReportFooterRectangle.Left, + base.CurrentPosition.Y, + SectionBounds.ReportFooterRectangle.Width, + SectionBounds.ReportFooterRectangle.Height); + } + } + return exporterCollection; + } + + protected override Point ForcePageBreak(ExporterCollection exporterCollection, BaseSection section) + { + base.ForcePageBreak(exporterCollection, section); + return base.SectionBounds.ReportHeaderRectangle.Location; + } + //Copy from GroupedRow + + private Point ConvertGroupHeader(ExporterCollection exportList,BaseSection section,int leftPos,Point offset) + { + var retVal = Point.Empty; + ReportItemCollection groupCollection = null; + + var groupedRow = new Collection(table.Items.OfType().ToList()); + + if (groupedRow.Count == 0) { + groupCollection = section.Items.ExtractGroupedColumns(); + base.DataNavigator.Fill(groupCollection); + base.FireSectionRendering(section); + ExporterCollection list = StandardPrinter.ConvertPlainCollection(groupCollection,offset); + + StandardPrinter.EvaluateRow(base.Evaluator,list); + + exportList.AddRange(list); + AfterConverting (section,list); + retVal = new Point (leftPos,offset.Y + groupCollection[0].Size.Height + 20 + (3 *GlobalValues.GapBetweenContainer)); + } else { + retVal = ConvertStandardRow(exportList,section,groupedRow[0],leftPos,offset); + } + return retVal; + } + + } +} + diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs deleted file mode 100644 index 258ebf6966..0000000000 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/Converters/TableConverter.cs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using System; -using System.Drawing; -using ICSharpCode.Reports.Core.BaseClasses.Printing; -using ICSharpCode.Reports.Core.Interfaces; - -namespace ICSharpCode.Reports.Core.Exporter -{ - /// - /// Description of TableConverter. - /// - public class TableConverter:BaseConverter - { - - private ITableContainer baseTable; - - public TableConverter(IDataNavigator dataNavigator, - ExporterPage singlePage, - - ILayouter layouter ):base(dataNavigator,singlePage,layouter) - { - } - - - public override ExporterCollection Convert (BaseReportItem parent,BaseReportItem item) - { - if (parent == null) { - throw new ArgumentNullException("parent"); - } - if (item == null) { - throw new ArgumentNullException("item"); - } - - ExporterCollection mylist = base.Convert(parent,item); - this.baseTable = (BaseTableItem)item ; - this.baseTable.Parent = parent; - this.baseTable.DataNavigator = base.DataNavigator; - return ConvertInternal(mylist); - } - - - private ExporterCollection ConvertInternal(ExporterCollection mylist) - { - - Point currentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.baseTable.Parent,this.baseTable).Location.X, - base.SectionBounds.DetailStart.Y); - - int defaultLeftPos = currentPosition.X; - - Point dataAreaStart = new Point(baseTable.Items[0].Location.X,baseTable.Items[0].Location.Y + currentPosition.Y); - - ISimpleContainer headerContainer = null; - - - - this.baseTable.Items.SortByLocation(); - - foreach (ISimpleContainer simpleContainer in this.baseTable.Items) - { - if (simpleContainer.Items.Count > 0) { - simpleContainer.Location = new Point (simpleContainer.Location.X,simpleContainer.Location.Y); - simpleContainer.Parent = (BaseReportItem)this.baseTable; - base.SaveSize( new Size (simpleContainer.Size.Width,simpleContainer.Size.Height)); - // Header/FooterRow - - if (PrintHelper.IsTextOnlyRow(simpleContainer) ) { - headerContainer = simpleContainer; - currentPosition = BaseConverter.BaseConvert(mylist,headerContainer,defaultLeftPos,currentPosition); - } - - else - { - // DataRegion - base.SaveSize(simpleContainer.Size); - do { - // - BaseSection section = this.baseTable.Parent as BaseSection; - PrintHelper.AdjustSectionLocation(section); - - base.FillRow(simpleContainer); - - StandardPrinter.EvaluateRow(base.Evaluator,mylist); - - base.PrepareContainerForConverting(null,simpleContainer); - - Rectangle pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)simpleContainer,currentPosition); - - if (PrintHelper.IsPageFull(pageBreakRect,base.SectionBounds)) - { - base.BuildNewPage(mylist,section); - - currentPosition = BaseConverter.BaseConvert(mylist,headerContainer, - defaultLeftPos, - base.SectionBounds.ReportHeaderRectangle.Location); - - } - - currentPosition = BaseConverter.BaseConvert(mylist,simpleContainer,defaultLeftPos,currentPosition); - - simpleContainer.Size = base.RestoreSize; - } - while (base.DataNavigator.MoveNext()); - //Allway's reset the DataNavigator - base.DataNavigator.Reset(); - base.DataNavigator.MoveNext(); - SectionBounds.ReportFooterRectangle = new Rectangle(SectionBounds.ReportFooterRectangle.Left, - currentPosition.Y, - SectionBounds.ReportFooterRectangle.Width, - SectionBounds.ReportFooterRectangle.Height); - } - } - } - return mylist; - } - } - } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/DataPageBuilder.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/DataPageBuilder.cs index 4bbd62ce98..9ec1e833ba 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/DataPageBuilder.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Exporter/DataPageBuilder.cs @@ -16,7 +16,7 @@ namespace ICSharpCode.Reports.Core.Exporter readonly object addLock = new object(); - internal delegate ExporterCollection ConverterDelegate (BaseSection s); + //internal delegate ExporterCollection ConverterDelegate (BaseSection s); #region Constructor @@ -50,7 +50,6 @@ namespace ICSharpCode.Reports.Core.Exporter protected override void BuildNewPage () { base.BuildNewPage(); - this.BuildReportHeader(); this.BuildPageHeader(); } @@ -103,8 +102,9 @@ namespace ICSharpCode.Reports.Core.Exporter base.SinglePage.Items.AddRange(convertedList); } - - protected void BuildDetail (BaseSection section,IDataNavigator dataNavigator) + + + protected Point BuildDetail (BaseSection section,IDataNavigator dataNavigator) { ExporterCollection convertedList = new ExporterCollection(); @@ -124,8 +124,10 @@ namespace ICSharpCode.Reports.Core.Exporter convertedList = baseConverter.Convert(section,item); base.SinglePage.Items.AddRange(convertedList); + return baseConverter.CurrentPosition; } } + return Point.Empty; } @@ -145,10 +147,15 @@ namespace ICSharpCode.Reports.Core.Exporter BaseSection section = base.ReportModel.DetailSection; section.SectionOffset = base.SinglePage.SectionBounds.DetailStart.Y; - this.BuildDetail (section,dataNavigator); + var p = this.BuildDetail (section,dataNavigator); + + var r = new Rectangle (SectionBounds.ReportFooterRectangle.Left,p.Y, + SectionBounds.ReportFooterRectangle.Size.Width, + SectionBounds.ReportFooterRectangle.Size.Height); + this.BuildReportFooter(r); - this.BuildReportFooter(SectionBounds.ReportFooterRectangle); this.BuildPageFooter(); + //this is the last Page this.AddPage(base.SinglePage); base.FinishRendering(this.dataNavigator); diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs index 3373aaaa18..fe3ee2d674 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/AggregateFunctions/AggregateFunction.cs @@ -126,7 +126,7 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.AggregateFunctions } } else { string str = String.Format ("<{0}> not found in AggregateFunction",data.ToString()); - throw new FieldNotFoundException(str); +// throw new FieldNotFoundException(str); } } return list; diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs index 07ffdb05eb..a94626164d 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs @@ -40,8 +40,7 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.ReportingService if (item != null) { retval = item.Value.ToString(); } else { - retval= String.Format(System.Globalization.CultureInfo.InvariantCulture, - "!! Can't find <{0}> !! ",variable.VariableName); + retval = GlobalValues.UnkownFunctionMessage(variable.VariableName); } return retval; } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalValues.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalValues.cs index 4544bdb3e5..84dd7863f6 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalValues.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalValues.cs @@ -95,12 +95,7 @@ namespace ICSharpCode.Reports.Core { /// /// The value on witch the Control is drawing bigger than the text inside /// - /* - public static int EnlargeControl - { - get {return enlargeControl;} - } - */ + public static Margins ControlMargins { diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs index ce9eef915d..f0b83acd81 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IItemConverter.cs @@ -6,22 +6,35 @@ using System.Drawing; using ICSharpCode.Reports.Core.BaseClasses; using ICSharpCode.Reports.Core.Events; using ICSharpCode.Reports.Core.Exporter; +using ICSharpCode.Reports.Expressions.ReportingLanguage; namespace ICSharpCode.Reports.Core.Interfaces { /// /// Description of IItemConverter. /// - public interface IBaseConverter - { - ExporterCollection Convert (BaseReportItem parent,BaseReportItem item); + /// + public interface IRenderer + { event EventHandler PageFull; event EventHandler SectionRendering; SectionBounds SectionBounds {get;} IDataNavigator DataNavigator {get;} Rectangle ParentRectangle {get;} - ExporterPage SinglePage {get;} + ISinglePage SinglePage {get;} ILayouter Layouter {get;} Graphics Graphics {get;set;} } + + public interface IBaseRenderer + { + void Render(ISimpleContainer container,ReportPageEventArgs rpea,IExpressionEvaluatorFacade evaluator); + } + + + public interface IBaseConverter:IRenderer + { + ExporterCollection Convert (BaseReportItem parent,BaseReportItem item); + Point CurrentPosition {get;set;} + } } diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs index 2e7c466ce8..9b29439419 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/AbstractDataRenderer.cs @@ -86,9 +86,7 @@ namespace ICSharpCode.Reports.Core Rectangle r = StandardPrinter.RenderContainer(row,Evaluator,currentPosition,rpea); - currentPosition =PrintHelper.ConvertRectangleToCurentPosition (r); - -// currentPosition = new Point(parent.Location.X + row.Location.X,currentPosition.Y); + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); tableContainer.Location = saveLocation; Console.WriteLine("----"); diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs index 4110d2b498..fc3cf14635 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderDataReport.cs @@ -155,12 +155,19 @@ namespace ICSharpCode.Reports.Core { rpea.PrintPageEventArgs.HasMorePages = false; return; } - + ITableContainer tableContainer = base.CurrentSection.Items[0] as ITableContainer; + IBaseRenderer r = PrintRendererFactory.CreateRenderer(base.CurrentSection.Items[0],nav,base.SinglePage,base.Layout,CurrentSection); + if ( r != null) { +// r.Render(tableContainer,rpea,Evaluator); + } + + // branch to render table's etc if (tableContainer != null) { + tableContainer.DataNavigator = nav; tableContainer.Parent = base.CurrentSection; if (rpea.SinglePage.PageNumber == 1) { @@ -175,7 +182,8 @@ namespace ICSharpCode.Reports.Core { this.ReportDocument.DetailsDone = true; } - else { + else + { // first element if (base.SinglePage.PageNumber ==1) { @@ -212,13 +220,6 @@ namespace ICSharpCode.Reports.Core { } } - - -// if (this.dataNavigator.CurrentRow % 2 == 0) { -// PrintHelper.DebugRectangle(rpea.PrintPageEventArgs.Graphics,r); -// } - - base.CurrentSection.SectionOffset = currentPosition.Y; rpea.LocationAfterDraw = new Point (rpea.LocationAfterDraw.X, diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs new file mode 100644 index 0000000000..69f0e25611 --- /dev/null +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RenderTable.cs @@ -0,0 +1,230 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 10.10.2010 + * Time: 17:37 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Drawing; +using ICSharpCode.Reports.Core.BaseClasses.Printing; +using ICSharpCode.Reports.Core.Interfaces; +using ICSharpCode.Reports.Expressions.ReportingLanguage; + +namespace ICSharpCode.Reports.Core +{ + /// + /// Description of RenderTable. + /// + public class RenderTable:IBaseRenderer + { + + IDataNavigator dataNavigator; + Rectangle parentRectangle; + ISinglePage singlePage; + ILayouter layouter; + ReportPageEventArgs reportPageEventArgs; + BaseSection currentSection; + + public RenderTable(IDataNavigator datanavigator,Rectangle parentRectangle,ISinglePage singlePage,ILayouter layouter,BaseSection section) + { + this.dataNavigator = datanavigator; + + this.parentRectangle = parentRectangle; + this.singlePage = singlePage; + this.layouter = layouter; + this.currentSection = section; + + } + + + public event EventHandler PageFull; + + public event EventHandler SectionRendering; + + + public void Render (ISimpleContainer table,ReportPageEventArgs rpea,IExpressionEvaluatorFacade evaluator) + { + if (this.dataNavigator.CurrentRow < 0 ) { + this.dataNavigator.MoveNext(); + } + this.reportPageEventArgs = rpea; + Point saveLocation = table.Location; + Rectangle pageBreakRect = Rectangle.Empty; + + Point currentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.currentSection,table).Location.X, + this.currentSection.Location.Y); + table.Items.SortByLocation(); + + Size rs = Size.Empty; + + + ISimpleContainer headerRow = null; + + var simpleContainer = table.Items[0] as ISimpleContainer; + +// foreach (BaseRowItem row in table.Items) +// { + rs = simpleContainer.Size; + PrintHelper.AdjustParent(table as BaseReportItem,table.Items); + +// if (PrintHelper.IsTextOnlyRow(simpleContainer) ) +// { + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,simpleContainer); + + var r = StandardPrinter.RenderContainer(simpleContainer,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + table.Location = saveLocation; +// } +// else { + //--------------- + simpleContainer = table.Items[1] as ISimpleContainer; + + int adjust = simpleContainer.Location.Y - saveLocation.Y; + simpleContainer.Location = new Point(simpleContainer.Location.X,simpleContainer.Location.Y - adjust - 3 * GlobalValues.GapBetweenContainer); + rs = simpleContainer.Size; + + do { + + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)table,currentPosition); + + if (PrintHelper.IsPageFull(pageBreakRect,this.SectionBounds)) { + Console.WriteLine("PageBreak - PageFull"); + table.Location = saveLocation; + AbstractRenderer.PageBreak(ReportPageEventArgs); + return; + } + + this.dataNavigator.Fill(simpleContainer.Items); + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,simpleContainer); + + r = StandardPrinter.RenderContainer(simpleContainer,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + simpleContainer.Size = rs; + } + while (this.dataNavigator.MoveNext()); + //----- +// } + } + + + + + public void old_Render (ISimpleContainer table,ReportPageEventArgs rpea,IExpressionEvaluatorFacade evaluator) + { + if (this.dataNavigator.CurrentRow < 0 ) { + this.dataNavigator.MoveNext(); + } + this.reportPageEventArgs = rpea; + Point saveLocation = table.Location; + Rectangle pageBreakRect = Rectangle.Empty; + + Point currentPosition = new Point(PrintHelper.DrawingAreaRelativeToParent(this.currentSection,table).Location.X, + this.currentSection.Location.Y); + table.Items.SortByLocation(); + + Size rs = Size.Empty; + + + + + foreach (BaseRowItem row in table.Items) + { + rs = row.Size; + PrintHelper.AdjustParent(table as BaseReportItem,table.Items); + + if (PrintHelper.IsTextOnlyRow(row) ) + { + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,row); + + Rectangle r = StandardPrinter.RenderContainer(row,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + table.Location = saveLocation; + } + else { + int adjust = row.Location.Y - saveLocation.Y; + row.Location = new Point(row.Location.X,row.Location.Y - adjust - 3 * GlobalValues.GapBetweenContainer); + rs = row.Size; + + do { + + pageBreakRect = PrintHelper.CalculatePageBreakRectangle((BaseReportItem)table,currentPosition); + + if (PrintHelper.IsPageFull(parentRectangle,this.SectionBounds)) { + Console.WriteLine("PageBreak - PageFull"); + table.Location = saveLocation; + AbstractRenderer.PageBreak(ReportPageEventArgs); + return; + } + + this.dataNavigator.Fill(row.Items); + + PrintHelper.SetLayoutForRow(ReportPageEventArgs.PrintPageEventArgs.Graphics,Layouter,row); + + Rectangle r = StandardPrinter.RenderContainer(row,evaluator,currentPosition,ReportPageEventArgs); + + currentPosition = PrintHelper.ConvertRectangleToCurentPosition (r); + + row.Size = rs; + } + while (this.dataNavigator.MoveNext()); + + } + + row.Size = rs; + } +// base.NotifyAfterPrint (rpea.LocationAfterDraw); + } + + + + public ICSharpCode.Reports.Core.BaseClasses.SectionBounds SectionBounds { + get { + return this.singlePage.SectionBounds; + } + } + + public IDataNavigator DataNavigator { + get { + return this.dataNavigator; + } + } + + public System.Drawing.Rectangle ParentRectangle { + get { + return this.parentRectangle; + } + } + + public ISinglePage SinglePage { + get { + return this.singlePage; + } + } + + public ILayouter Layouter { + get { + return this.layouter; + } + } + + public System.Drawing.Graphics Graphics {get;set;} + + + public ReportPageEventArgs ReportPageEventArgs { + get { return reportPageEventArgs; } + set { reportPageEventArgs = value; } + } + + } +} diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs new file mode 100644 index 0000000000..44668b4d5e --- /dev/null +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Printing/RendererFactory.cs @@ -0,0 +1,38 @@ +/* + * Created by SharpDevelop. + * User: Peter Forstmeier + * Date: 10.10.2010 + * Time: 17:28 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ +using System; +using System.Drawing; +using ICSharpCode.Reports.Core.Interfaces; + +namespace ICSharpCode.Reports.Core +{ + /// + /// Description of RendererFactory. + /// + public class PrintRendererFactory + { + + public static IBaseRenderer CreateRenderer (BaseReportItem itemToConvert,IDataNavigator dataNavigator, + ISinglePage singlePage,ILayouter layouter,BaseSection section) + { + + Type t = itemToConvert.GetType(); + if (t.Equals(typeof(BaseTableItem))) { + Console.WriteLine("render Table"); + return new RenderTable(dataNavigator,Rectangle.Empty,singlePage,layouter,section); + } + + if (t.Equals(typeof(BaseRowItem))) { +// return new GroupedRowConverter (dataNavigator,singlePage,layouter); + Console.WriteLine("render Row"); + } + return null; + } + } +} diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/IntegrationTests/AggregateFunctionsFixture.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/IntegrationTests/AggregateFunctionsFixture.cs index 4615213db2..b98875c072 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/IntegrationTests/AggregateFunctionsFixture.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/IntegrationTests/AggregateFunctionsFixture.cs @@ -137,6 +137,16 @@ namespace ICSharpCode.Reports.Core.Test.ReportingLanguage.IntegrationTests #endregion + + #region test + private void settest () + { + + } + + #endregion + + [TestFixtureSetUp] public void Init() { diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/TestHelper.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/TestHelper.cs index 8f801a6002..ab0d1a48ba 100644 --- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/TestHelper.cs +++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/TestHelper.cs @@ -21,11 +21,7 @@ namespace ICSharpCode.Reports.Core.Test.ReportingLanguage p.ReportName = "SharpTestReport.srd"; p.ReportFileName =@"c:\testreports\SharpTestReport.srd"; p.ExecutionTime = new DateTime(2009,12,24,23,59,59); - return p; } - - - } }