using System;
using System.Data;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Text;
using CMS.CMSHelper;
using CMS.DataEngine;
using CMS.EventLog;
using CMS.FormEngine;
using CMS.GlobalHelper;
using CMS.Reporting;
using CMS.SettingsProvider;
using CMS.WebAnalytics;
using CMS.IO;
using CMS.EmailEngine;
public partial class CMSModules_Reporting_Controls_ReportTable : AbstractReportControl
{
#region "Variables"
private string mReportTableName = String.Empty;
private GridView mGridTable = null;
private ReportTableInfo mTableInfo = null;
private string mParameter = string.Empty;
private int mPageSize = 0;
private bool? mEnablePaging = null;
private ReportInfo ri = null;
///
/// Indicates whether exception was thrown during data loading
///
private bool errorOccurred = false;
#endregion
#region "Properties"
///
/// Gets the GridView object.
///
protected GridView GridViewObject
{
get
{
if (mGridTable == null)
{
mGridTable = new GridView();
}
return mGridTable;
}
}
///
/// Report table connection string
///
public override string ConnectionString
{
get
{
String tableConn = (TableInfo == null) ? String.Empty : TableInfo.TableConnectionString;
if (String.IsNullOrEmpty(tableConn))
{
return (ri == null) ? String.Empty : ri.ReportConnectionString; ;
}
return tableConn;
}
}
///
/// Table name - prevent using viewstate (problems with displayreportcontrol and postback).
///
public override string Parameter
{
get
{
return mParameter;
}
set
{
mParameter = value;
}
}
///
/// Table name.
///
private string ReportTableName
{
get
{
return mReportTableName;
}
set
{
mReportTableName = value;
}
}
///
/// Direct table info used by preview.
///
public ReportTableInfo TableInfo
{
get
{
if (mTableInfo == null)
{
mTableInfo = ReportTableInfoProvider.GetReportTableInfo(Parameter);
}
return mTableInfo;
}
set
{
mTableInfo = value;
}
}
///
/// Page size for paged tables
///
public int PageSize
{
get
{
return mPageSize;
}
set
{
mPageSize = value;
}
}
///
/// Enables/disables paging (if null report settings is used)
///
public bool? EnablePaging
{
get
{
return mEnablePaging;
}
set
{
mEnablePaging = value;
}
}
#endregion
#region "Methods"
///
/// Ensires teble info object.
///
private void EnsureTableInfo()
{
ReportTableInfo rti = TableInfo;
if (rti != null)
{
QueryIsStoredProcedure = rti.TableQueryIsStoredProcedure;
// Resolve dynamic data macros
if (DynamicMacros != null)
{
for (int i = 0; i <= DynamicMacros.GetUpperBound(0); i++)
{
ContextResolver.AddDynamicParameter(DynamicMacros[i, 0], DynamicMacros[i, 1]);
}
}
QueryText = ResolveMacros(rti.TableQuery);
TableInfo = rti;
}
}
///
/// Adds GridView to the controls collectio.
///
private void LoadTableInfo()
{
EnsureTableInfo();
if (TableInfo != null)
{
QueryIsStoredProcedure = TableInfo.TableQueryIsStoredProcedure;
QueryText = ResolveMacros(TableInfo.TableQuery);
// Enable paging has higher priority - if not set use report settings
GridViewObject.AllowPaging = (!EmailMode && (EnablePaging.HasValue ? EnablePaging.Value : ValidationHelper.GetBoolean(TableInfo.TableSettings["enablepaging"], false)));
if (GridViewObject.AllowPaging)
{
// Webpart - higher priority
GridViewObject.PageSize = (PageSize > 0) ? PageSize : ValidationHelper.GetInteger(TableInfo.TableSettings["pagesize"], 10);
GridViewObject.PagerSettings.Mode = (PagerButtons)ValidationHelper.GetInteger(TableInfo.TableSettings["pagemode"], (int)PagerButtons.Numeric);
GridViewObject.PageIndexChanging += new GridViewPageEventHandler(GridViewObject_PageIndexChanging);
}
GridViewObject.AllowSorting = false;
// Get SkinID from reportTable custom data
string skinId = ValidationHelper.GetString(TableInfo.TableSettings["skinid"], "");
if (skinId != String.Empty)
{
if (String.IsNullOrEmpty((GridViewObject.SkinID)))
{
GridViewObject.SkinID = skinId;
}
}
GridViewObject.ID = "reportGrid";
// Add grid view control to the page
plcGrid.Controls.Clear();
plcGrid.Controls.Add(GridViewObject);
if ((RenderCssClasses) && (String.IsNullOrEmpty(GridViewObject.SkinID)))
{
//Clear the css styles to eliminate control state
GridViewObject.HeaderStyle.CssClass = "";
GridViewObject.CssClass = "";
GridViewObject.RowStyle.CssClass = "";
GridViewObject.AlternatingRowStyle.CssClass = "";
}
}
}
///
/// Created grid view based on parameter from report table.
///
protected override void CreateChildControls()
{
base.CreateChildControls();
imgInfo.ImageUrl = GetImageUrl("/Objects/Reporting_ReportTable/object.png");
ItemType = ReportItemType.Table;
// Set table name from inline parameter
ReportTableName = Parameter;
LoadTableInfo();
}
///
/// Returns true if graph belongs to report.
///
/// Report to validate
public override bool IsValid(ReportInfo report)
{
ReportTableInfo rti = TableInfo;
if ((report != null) && (rti != null) && (report.ReportID == rti.TableReportID))
{
return true;
}
return false;
}
///
/// Reload data.
///
public override void ReloadData(bool forceLoad)
{
if ((GraphImageWidth != 0) && (ComputedWidth == 0))
{
// Graph width is computed no need to create graph
return;
}
Visible = true;
errorOccurred = false;
try
{
ReportTableName = Parameter;
EnsureTableInfo();
EnsureChildControls();
//Test security
if (TableInfo != null)
{
ri = ReportInfoProvider.GetReportInfo(TableInfo.TableReportID);
if (ri != null)
{
if (!(CheckReportAccess(ri) && CheckEmailModeSubscription(ri, ValidationHelper.GetBoolean(TableInfo.TableSettings["SubscriptionEnabled"], true))))
{
Visible = false;
return;
}
//Set default parametrs directly if not set
if (ReportParameters == null)
{
FormInfo fi = new FormInfo(ri.ReportParameters);
// Get datarow with required columns
ReportParameters = fi.GetDataRow(false);
fi.LoadDefaultValues(ReportParameters, true);
}
ApplyTimeParameters();
}
}
// Only use base parameters in case of stored procedure
if (QueryIsStoredProcedure)
{
AllParameters = SpecialFunctions.ConvertDataRowToParams(ReportParameters, null);
}
// Load data
DataSet ds = LoadData();
// If no data load, set empty dataset
if (DataHelper.DataSourceIsEmpty(ds))
{
if (EmailMode && SendOnlyNonEmptyDataSource)
{
Visible = false;
return;
}
string noRecordText = ValidationHelper.GetString(TableInfo.TableSettings["QueryNoRecordText"], String.Empty);
if (noRecordText != String.Empty)
{
GridViewObject.Visible = false;
lblInfo.Text = CMSContext.ResolveMacros(noRecordText);
plcInfo.Visible = true;
EnableExport = false;
return;
}
if (!EmailMode)
{
Visible = false;
}
}
else
{
GridViewObject.Visible = true;
// Resolve macros in column names
int i = 0;
foreach (DataColumn dc in ds.Tables[0].Columns)
{
if (dc.ColumnName == "Column" + ((int)(i + 1)).ToString())
{
dc.ColumnName = ResolveMacros(ds.Tables[0].Rows[0][i].ToString());
}
else
{
dc.ColumnName = ResolveMacros(dc.ColumnName);
}
i++;
}
// Resolve macros in dataset
foreach (DataRow dr in ds.Tables[0].Rows)
{
foreach (DataColumn dc in ds.Tables[0].Columns)
{
if (dc.DataType.FullName.ToLowerCSafe() == "system.string")
{
dr[dc.ColumnName] = ResolveMacros(ValidationHelper.GetString(dr[dc.ColumnName], ""));
}
}
}
if (EmailMode)
{
// For some email formats, export data in csv format
EmailFormatEnum format = EmailHelper.GetEmailFormat(ReportSubscriptionSiteID);
if ((format == EmailFormatEnum.Both) || (format == EmailFormatEnum.PlainText))
{
using (MemoryStream ms = MemoryStream.New())
{
DataExportHelper deh = new DataExportHelper(ds);
byte[] data = deh.ExportToCSV(ds, 0, ms, true);
ReportSubscriptionSender.AddToRequest(ri.ReportName, "t" + TableInfo.TableName, data);
}
}
// For plain text email show table only as attachment
if (format == EmailFormatEnum.PlainText)
{
menuCont.Visible = false;
ltlEmail.Visible = true;
ltlEmail.Text = String.Format(GetString("reportsubscription.attachment"), TableInfo.TableName);
return;
}
GenerateTableForEmail(ds);
menuCont.Visible = false;
return;
}
}
ApplyStyles();
// Databind to gridview control
GridViewObject.DataSource = ds;
EnsurePageIndex();
GridViewObject.DataBind();
if ((TableFirstColumnWidth != Unit.Empty) && (GridViewObject.Rows.Count > 0))
{
GridViewObject.Rows[0].Cells[0].Width = TableFirstColumnWidth;
}
}
catch (Exception ex)
{
// Display error message, if data load fail
lblError.Visible = true;
lblError.Text = "[ReportTable.ascx] Error loading the data: " + ex.Message;
EventLogProvider ev = new EventLogProvider();
ev.LogEvent("Report table", "E", ex);
errorOccurred = true;
}
}
///
/// Ensures the current page index with dependenco on request data du to different contol's life cycle.
///
private void EnsurePageIndex()
{
if ((GridViewObject != null) && (GridViewObject.AllowPaging))
{
// Get current postback target
string eventTarget = Request.Params["__EVENTTARGET"];
// Handle paging manually because of lifecycle of the control
if (CMSString.Compare(eventTarget, GridViewObject.UniqueID, true) == 0)
{
// Get the current page value
string eventArg = ValidationHelper.GetString(Request.Params["__EVENTARGUMENT"], String.Empty);
string[] args = eventArg.Split('$');
if ((args.Length == 2) && (CMSString.Compare(args[0], "page", true) == 0))
{
string pageValue = args[1];
int pageIndex = 0;
// Switch by page value 0,1.... first,last
switch (pageValue.ToLowerCSafe())
{
// Last item
case "last":
// Check whether page count is available
if (GridViewObject.PageCount > 0)
{
pageIndex = GridViewObject.PageCount - 1;
}
// if page count is not defined, try compute page count
else
{
DataSet ds = GridViewObject.DataSource as DataSet;
if (!DataHelper.DataSourceIsEmpty(ds))
{
pageIndex = ds.Tables[0].Rows.Count / GridViewObject.PageSize;
}
}
break;
case "next":
pageIndex = GridViewObject.PageIndex + 1;
break;
case "prev":
pageIndex = GridViewObject.PageIndex - 1;
break;
// Page number
default:
pageIndex = ValidationHelper.GetInteger(pageValue, 1) - 1;
break;
}
GridViewObject.PageIndex = pageIndex;
}
}
}
}
protected override void OnPreRender(EventArgs e)
{
if (ri != null)
{
if (TableInfo != null)
{
EnableSubscription = (EnableSubscription && ValidationHelper.GetBoolean(TableInfo.TableSettings["SubscriptionEnabled"], true) && ri.ReportEnableSubscription);
EnableExport = (EnableExport && ValidationHelper.GetBoolean(TableInfo.TableSettings["ExportEnabled"], false));
// Register context menu for export - if allowed
RegisterSubscriptionScript(TableInfo.TableReportID, "tableid", TableInfo.TableID, menuCont);
}
// Export data
if (!errorOccurred)
{
ProcessExport(ValidationHelper.GetCodeName(ri.ReportDisplayName));
}
}
base.OnPreRender(e);
}
///
/// Sets default grid styles and apply skinID (if any).
///
private void ApplyStyles()
{
// Style frid view
if (GridViewObject != null)
{
GridViewObject.CellPadding = 3;
GridViewObject.GridLines = GridLines.Horizontal;
GridViewObject.HeaderStyle.HorizontalAlign = HorizontalAlign.Left;
if (RenderCssClasses && (String.IsNullOrEmpty(GridViewObject.SkinID) || EmailMode))
{
GridViewObject.HeaderStyle.CssClass = "UniGridHead";
GridViewObject.HeaderStyle.Wrap = false;
GridViewObject.CssClass = "UniGridGrid";
GridViewObject.RowStyle.CssClass = "EvenRow";
GridViewObject.AlternatingRowStyle.CssClass = "OddRow";
GridViewObject.FooterStyle.CssClass = "UniGridHead";
GridViewObject.PagerStyle.CssClass = "PagerRow";
}
}
}
///
/// Generates table for email
///
/// Dataset with table data
private void GenerateTableForEmail(DataSet ds)
{
if (DataHelper.DataSourceIsEmpty(ds))
{
return;
}
ltlEmail.Visible = true;
StringBuilder sb = new StringBuilder();
// Generate header
sb.Append(@"
");
DataTable dt = ds.Tables[0];
foreach (DataColumn dc in dt.Columns)
{
sb.Append("| " + dc.ColumnName + " | ");
}
sb.Append("
");
int rowNumber = 1;
// Generate rows
foreach (DataRow dr in dt.Rows)
{
rowNumber++;
String cssClass = (rowNumber % 2 == 0) ? "EvenRow" : "OddRow";
sb.Append("");
for (int i = 0; i < dt.Columns.Count; i++)
{
sb.Append("| " + dr[i] + " | ");
}
sb.Append("
");
}
sb.Append("
");
ltlEmail.Text = sb.ToString();
}
///
/// Handles paging on live site.
///
protected void GridViewObject_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
}
#endregion
}