/*
* Created by SharpDevelop.
* User: Forstmeier Peter
* Date: 10.01.2005
* Time: 10:04
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
// one line to give the program's name and an idea of what it does.
// Copyright (C) 2005 peter.forstmeier@t-online.de
using System;
using System.IO;
//using System.ComponentModel;
using System.Globalization;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Data;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Gui;
using SharpReport;
using SharpReportCore;
using SharpReport.Designer;
namespace SharpReportAddin{
///
/// Description of the view content
///
public class SharpReportView : AbstractViewContent,IPrintable,IDisposable
{
private SharpReportManager reportManager;
private BaseDesignerControl designerControl;
private TabControl tabControl;
private TabPage designerPage;
private TabPage previewPage;
// SideBar
private AxSideTab sideTabItem = null;
private AxSideTab sideTabFunctions = null;
private Panel panel;
private bool disposed;
#region privates
void InitView() {
try {
reportManager = new SharpReportManager();
panel = new Panel();
panel.AutoScroll = true;
CreateTabControl();
SharpReportView.BuildToolBarItems();
if (PropertyPad.Grid != null) {
PropertyPad.Grid.SelectedObject = designerControl.ReportModel.ReportSettings;
PropertyPad.Grid.Refresh();
}
//Activate the FieldsExplorer - Pad
PadDescriptor pad = WorkbenchSingleton.Workbench.GetPad(typeof(FieldsExplorer));
if (pad != null) {
pad.CreatePad();
}
} catch (Exception) {
throw;
}
}
// when the model is build, grap these events, otherwise we get permanent
// changes of IsDirty
private void SetOnPropertyChangedEvents () {
try {
ReportModel model = designerControl.ReportModel;
model.ReportSettings.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
model.ReportHeader.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
model.PageHeader.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
model.DetailSection.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
model.PageFooter.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
model.ReportFooter.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
//watch for FileName change from Reportsettings as well
model.ReportSettings.FileNameChanged += new EventHandler(OnModelFileNameChanged);
} catch (Exception) {
throw;
}
}
#endregion
#region SideBar Handling
private static bool SharpReportIsRunning () {
// Did we already exist
foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) {
SharpReportView view = content as SharpReportView;
if (view != null) {
return true;
}
}
return false;
}
private static SharpDevelopSideBar GetSideBar () {
SideBarView v = (SideBarView)WorkbenchSingleton.Workbench.GetPad (typeof(SideBarView)).PadContent;
SharpDevelopSideBar sb =(SharpDevelopSideBar) v.Control;
return sb;
}
private static void BuildToolBarItems() {
SharpDevelopSideBar sideBar = SharpReportView.GetSideBar();
if (!SharpReportView.SharpReportIsRunning()) {
SharpReport.BuildSideTab buildSideTab = new SharpReport.BuildSideTab (sideBar);
buildSideTab.CreateSidetabs();
sideBar.Refresh();
}
}
void RemoveSideBarItem() {
if (!SharpReportView.SharpReportIsRunning()) {
if (sideTabItem != null) {
SharpDevelopSideBar sideBar = SharpReportView.GetSideBar();
sideBar.Tabs.Remove (sideTabItem);
}
if (this.sideTabFunctions != null) {
SharpDevelopSideBar sideBar = GetSideBar();
sideBar.Tabs.Remove(this.sideTabFunctions);
}
SideBarView v = (SideBarView)WorkbenchSingleton.Workbench.GetPad (typeof(SideBarView)).PadContent;
SharpDevelopSideBar sb =(SharpDevelopSideBar) v.Control;
AxSideTab s;
for (int i = SideBarView.sideBar.Tabs.Count -1; i > 0;i -- ) {
s = SideBarView.sideBar.Tabs[i];
if (s.Name.IndexOf("Report") > 0) {
SideBarView.sideBar.Tabs.Remove(s);
}
}
sb.Refresh();
}
}
#endregion
#region Control
void CreateTabControl() {
tabControl = new TabControl();
tabControl.SelectedIndexChanged += new EventHandler (OnTabPageChanged);
designerPage = new TabPage();
designerControl = CreateDesignerControl();
designerPage.Controls.Add (designerControl);
//create only the TabPage, no Controls are added
previewPage = new TabPage ();
tabControl.TabPages.Add (designerPage);
tabControl.TabPages.Add (previewPage);
tabControl.Alignment = TabAlignment.Bottom;
panel.Dock = DockStyle.Fill;
panel.AutoScroll = true;
tabControl.Dock = DockStyle.Fill;
panel.Controls.Add (tabControl);
SetHeadLines();
}
//We set all captions in one method, so we can react much easier on changing of lanuages
void SetHeadLines(){
designerPage.Text = ResourceService.GetString("SharpReport.Design");
previewPage.Text = ResourceService.GetString("SharpReport.Preview");
this.OnTabPageChanged (this,EventArgs.Empty);
this.designerControl.Localise();
}
private BaseDesignerControl CreateDesignerControl() {
BaseDesignerControl ctrl = reportManager.BaseDesignControl;
ctrl.SuspendLayout();
ctrl.ReportControl.Width = ctrl.ReportModel.ReportSettings.PageSettings.Bounds.Width;
ctrl.ReportControl.AutoScroll = true;
ctrl.Dock = DockStyle.Fill;
ctrl.ResumeLayout();
ctrl.ReportControl.ObjectSelected +=new EventHandler (OnObjectSelected);
ctrl.ReportControl.DesignViewChanged += new ItemDragDropEventHandler (OnItemDragDrop);
ctrl.DesignerDirty += new System.ComponentModel.PropertyChangedEventHandler (OnPropertyChanged);
return ctrl;
}
#endregion
#region Preview handling
private static DataSet DataSetFromFile () {
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
using (OpenFileDialog openFileDialog = new OpenFileDialog()){
openFileDialog.Filter = GlobalValues.XsdFileFilter;
openFileDialog.DefaultExt = GlobalValues.XsdExtension;
openFileDialog.AddExtension = true;
if(openFileDialog.ShowDialog() == DialogResult.OK){
if (openFileDialog.FileName.Length > 0) {
ds.ReadXml (openFileDialog.FileName);
}
}
}
return ds;
}
private void RunPreview(bool standAlone) {
base.OnSaving(EventArgs.Empty);
try {
switch (designerControl.ReportModel.DataModel) {
case GlobalEnums.enmPushPullModel.FormSheet : {
PreviewStandartReport(standAlone);
break;
}
case GlobalEnums.enmPushPullModel.PullData:{
PreviewStandartReport(standAlone);
break;
}
case GlobalEnums.enmPushPullModel.PushData:{
PreviewPushReport (standAlone);
break;
}
default:
throw new SharpReportException("Wrong ReportType");
}
} catch (Exception e) {
MessageService.ShowError(e);
}
}
private void PreviewPushReport (bool standAlone){
try {
DataSet ds = SharpReportView.DataSetFromFile ();
reportManager.ReportPreviewPushData(designerControl.ReportModel,
ds,
standAlone);
}catch (Exception e){
MessageService.ShowError (e,e.Message);
}
}
private void PreviewStandartReport(bool standAlone){
reportManager.NoData -= new EventHandler (OnNoDataForReport);
reportManager.NoData += new EventHandler (OnNoDataForReport);
reportManager.ParametersRequest -= new EventHandler (OnParametersRequest);
reportManager.ParametersRequest += new EventHandler(OnParametersRequest);
reportManager.ReportPreview (designerControl.ReportModel, standAlone);
}
#endregion
#region Events
void OnNoDataForReport (object sender,SharpReportEventArgs e) {
DialogResult result = MessageBox.Show("This Report contains no Data. Show it as FormSheet",
"SharpReport",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button1);
switch(result) {
case DialogResult.OK:
e.Cancel = false;
break;
case DialogResult.Cancel:
e.Cancel = true;
break;
}
}
///This Event is called if the Report need's Parameters to run a Query,
/// you can take this as an example how to react to an request for Parameters
/// The other posibillity is, to fill/change the ParametersCollection by Code or
/// just write an small Dialog to enter the Parameter values
///
private void OnParametersRequest (object sender,SharpReportParametersEventArgs e) {
AbstractParametersCollection collection = e.SqlParametersCollection;
if (collection != null && collection.Count > 0) {
using (ParameterInput parameterInput = new ParameterInput (e.ReportName,collection)){
DialogResult result = parameterInput.ShowDialog();
}
}
}
void SetTabTitel (string name) {
base.TitleName = String.Format(CultureInfo.CurrentCulture,
"{0} [{1}]",name,this.tabControl.SelectedTab.Text);
}
private void OnTabPageChanged (object sender, EventArgs e) {
string name;
if (String.IsNullOrEmpty(base.FileName)) {
base.UntitledName = GlobalValues.SharpReportPlainFileName;
base.TitleName = GlobalValues.SharpReportPlainFileName;
base.FileName = GlobalValues.SharpReportPlainFileName;
name = base.TitleName;
} else {
name = Path.GetFileName (base.FileName);
}
SetTabTitel (name);
switch (tabControl.SelectedIndex) {
case 0 :
break;
case 1:
//Create the preview Control only when needed
if (tabControl.SelectedTab.Controls.Count == 0 ){
tabControl.SelectedTab.Controls.Add(reportManager.PreviewControl);
}
RunPreview(true);
this.previewPage.Visible = true;
break;
default:
break;
}
}
//Something was dropped on the designer
private void OnItemDragDrop (object sender,ItemDragDropEventArgs e) {
base.IsDirty = true;
}
private void OnPropertyChanged (object sender,
System.ComponentModel.PropertyChangedEventArgs e) {
base.IsDirty = true;
OnObjectSelected (this,EventArgs.Empty);
}
private void OnModelFileNameChanged (object sender,EventArgs e) {
base.FileName = designerControl.ReportModel.ReportSettings.FileName;
if (designerControl.ReportModel.ReportSettings.InitDone) {
base.IsDirty = true;
this.OnFileNameChanged(e);
this.SetTabTitel(Path.GetFileName (base.FileName));
}
}
private void OnObjectSelected (object sender,EventArgs e) {
if (designerControl.ReportControl.SelectedObject != null) {
BaseReportObject newobj = designerControl.ReportControl.SelectedObject;
newobj.ResumeLayout();
if (PropertyPad.Grid != null) {
PropertyPad.Grid.SelectedObject = designerControl.ReportControl.SelectedObject;
}
}
}
#endregion
#region Calls from outside commands
///
/// Set PropertyGrid to ReportSettings
///
public void ShowReportSettings () {
if (PropertyPad.Grid != null) {
PropertyPad.Grid.SelectedObject = designerControl.ReportControl.ReportSettings;
PropertyPad.Grid.Refresh();
}
}
///
/// Show's Report in PreviewControl
///
public void OnPreviewClick () {
reportManager.NoData -= new EventHandler (OnNoDataForReport);
reportManager.NoData += new EventHandler (OnNoDataForReport);
reportManager.ParametersRequest -= new EventHandler (OnParametersRequest);
reportManager.ParametersRequest += new EventHandler(OnParametersRequest);
base.OnSaving(EventArgs.Empty);
this.RunPreview(false);
}
public void RemoveSelectedItem () {
this.designerControl.RemoveSelectedItem ();
}
///
/// This Method is called after something has changed like Load a new report
/// Change Sorting or Grouping etc. to update the View and set the DirtyFlag
///
/// If true, set the DirtyFlag and Fire the PropertyChanged Event
public void UpdateView(bool setViewDirty) {
this.tabControl.SelectedIndex = 0;
this.OnTabPageChanged(this,EventArgs.Empty);
SetOnPropertyChangedEvents();
if (setViewDirty) {
this.OnPropertyChanged (this,new System.ComponentModel.PropertyChangedEventArgs("Fired from UpdateView"));
}
}
#endregion
#region Propertys
///
/// Returns the complete Designer
///
public BaseDesignerControl DesignerControl {
get {
return designerControl;
}
}
///
/// returns a ReportManager
///
public SharpReportManager ReportManager {
get {
return reportManager;
}
}
public bool Disposed {
get {
return disposed;
}
}
#endregion
#region AbstractViewContent requirements
///
/// The representing the view
///
public override Control Control {
get {
return panel;
}
}
public override void RedrawContent() {
// this.WorkbenchWindow.WindowDeselected += new EventHandler(OnDeselected);
SetHeadLines();
}
///
/// Save's the Report
///
///
public override void Save(string fileName) {
try {
designerControl.ReportModel.ReportSettings.FileName = fileName;
if (FileUtility.IsValidFileName(fileName)) {
OnSaving(EventArgs.Empty);
reportManager.SaveToFile (fileName);
base.IsDirty = false;
OnSaved(new SaveEventArgs(true));
} else {
MessageService.ShowError ("<" + fileName + "> invalid Filename");
base.IsDirty = true;
}
} catch (Exception e) {
MessageService.ShowError(e,"SharpReportView:Save");
throw;
}
}
public override void Save() {
this.Save (designerControl.ReportModel.ReportSettings.FileName);
}
///
/// Creates a new SharpReportView object
///
public SharpReportView():base() {
if (GlobalValues.IsValidPrinter()) {
InitView();
this.UpdateView(false);
} else {
MessageService.ShowError(ResourceService.GetString("Sharpreport.Error.NoPrinter"));
}
}
///
/// Loads a new file into View
///
/// A valid Filename
public override void Load(string fileName){
try {
designerControl.ReportControl.ObjectSelected -= new EventHandler (OnObjectSelected);
reportManager.LoadFromFile (fileName);
base.FileName = fileName;
designerControl.ReportModel.ReportSettings.FileName = fileName;
designerControl.ReportControl.ObjectSelected += new EventHandler (OnObjectSelected);
if (PropertyPad.Grid != null) {
PropertyPad.Grid.SelectedObject = designerControl.ReportModel.ReportSettings;
PropertyPad.Grid.Refresh();
}
this.designerControl.ReportModel.ReportSettings.AvailableFieldsCollection = reportManager.AvailableFieldsCollection;
this.designerControl.RegisterEvents();
} catch (Exception e) {
MessageService.ShowError(e,"SharpReportView:Load");
throw ;
}
}
#endregion
#region ICSharpCode.SharpDevelop.Gui.IPrintable interface implementation
public System.Drawing.Printing.PrintDocument PrintDocument {
get {
AbstractRenderer renderer;
if (this.designerControl.ReportModel.DataModel == GlobalEnums.enmPushPullModel.PushData) {
renderer = reportManager.GetRendererForPushDataReports(this.designerControl.ReportModel,
SharpReportView.DataSetFromFile());
} else {
renderer = reportManager.GetRendererForStandartReports(this.designerControl.ReportModel);
}
return renderer.ReportDocument;
}
}
#endregion
#region IDisposable
public override void Dispose(){
if (PropertyPad.Grid != null) {
PropertyPad.Grid.SelectedObject = null;
}
this.disposed = true;
RemoveSideBarItem();
this.Dispose(true);
GC.SuppressFinalize(this);
}
~SharpReportView(){
Dispose(false);
}
protected void Dispose(bool disposing){
if (disposing) {
// Free other state (managed objects).
if (this.reportManager != null) {
this.reportManager.Dispose();
}
if (this.designerControl != null) {
this.designerControl.Dispose();
}
if (this.panel != null) {
this.panel.Dispose();
}
}
// Release unmanaged resources.
// Set large fields to null.
// Call Dispose on your base class.
base.Dispose();
}
#endregion
}
}