using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using ICSharpCode.Core;
using Mesnac.Action.Base;
using Mesnac.Basic;
using Mesnac.Codd.Session;
using Mesnac.Controls.Base;
namespace Mesnac.Action.Default.Purview
{
///
/// 窗体、控件权限信息加载类
/// 创建人:郑立兵
/// 创建时间:2013-7-25
/// 说明:从工程文件中加载窗体、控件权限信息至数据表中
///
public class LoadPurview : DatabaseAction , IAction
{
private string caption = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_Caption")); //提示
private string _projectPath = Path.Combine( Application.StartupPath , "Data" , "MCProject" , "nodeForm" ); //组态工程路径
List listPurview = null;
public void Run(RuntimeParameter runtime)
{
base.RunIni(runtime);//必须调用
string msg1 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_Default_Purview_LoadPurview_msg1")); //您确定重新加载所有权限?
string msg2 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_Default_Purview_LoadPurview_msg2")); //重要警告
if (MessageBox.Show(msg1, msg2, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
{
return;
}
ICSharpCode.Core.LoggingService.Debug("通用方法——将权限窗体加载至数据库");
DbHelper dbHelper = NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Local);
if (dbHelper == null)
{
return;
}
dbHelper.ClearParameter();
dbHelper.CommandType = CommandType.Text;
dbHelper.CommandText = "UPDATE BasForm SET DeleteFlag='1';UPDATE BasFormFunction SET DeleteFlag='1';";
dbHelper.ExecuteNonQuery();
listPurview = new List();
#region 命令
Dictionary> dic = XmlHandler.GetProjectCommands(Path.Combine(Application.StartupPath, "Data", "MCProject"));
foreach (string actionname in dic.Keys)
{
listPurview.Add(new FormPurview(string.Empty, actionname, actionname, "Command"));
}
#endregion
#region 画面
if (Directory.Exists(_projectPath))
{
DirectoryInfo dicInfo = new DirectoryInfo(_projectPath);
FileInfo[] files = dicInfo.GetFiles("*.xml", SearchOption.AllDirectories);
if (files.Length > 0)
{
string cleandown;
StreamReader sr;
XmlDocument doc;
foreach (FileInfo file in files)
{
try
{
sr = new StreamReader(file.FullName);
cleandown = sr.ReadToEnd();
sr.Close();
cleandown = "" + cleandown + "";
doc = new XmlDocument();
doc.LoadXml(cleandown);
loadPurview(doc);
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
}
}
}
#endregion
freshPurview(dbHelper);
string msg3 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_Default_Purview_LoadPurview_msg3")); //信息加载完成!
ShowMsg(msg3);
}
private void loadPurview( XmlDocument doc )
{
if ( doc == null )
return;
XmlNode nForm = doc.DocumentElement.FirstChild;//窗体组态保存xml时,规定第一个元素是Form
if ( nForm != null )
{
FormPurview formPurview = new FormPurview( nForm );
if ( !string.IsNullOrEmpty( formPurview.PurviewName ) && !string.IsNullOrEmpty( formPurview.PurviewText ) && !string.IsNullOrEmpty( formPurview.PurviewType ) )
listPurview.Add( formPurview );
}
}
private void freshPurview( DbHelper helper )
{
if ( listPurview == null )
return;
StringBuilder sb;
helper.CommandType = CommandType.Text;
foreach ( FormPurview pur in listPurview )
{
sb = new StringBuilder();
sb.AppendLine( "IF EXISTS(SELECT * FROM BasForm WHERE FormName=@FormName)" );
sb.AppendLine( "UPDATE BasForm SET FormText=@FormText, FormType=@FormType, DeleteFlag='0' OUTPUT inserted.GUID WHERE FormName=@FormName;" );
sb.AppendLine( "ELSE" );
sb.AppendLine( "INSERT INTO BasForm(GUID,FormName,FormText,FormType,DeleteFlag) OUTPUT inserted.GUID" );
sb.Append( "VALUES(NEWID(),@FormName,@FormText,@FormType,'0');" );
helper.ClearParameter();
helper.AddParameter( "@FormName" , pur.PurviewName );
helper.AddParameter( "@FormText" , pur.PurviewText );
helper.AddParameter( "@FormType" , pur.PurviewType );
helper.CommandText = sb.ToString();
string formGUID = helper.ToScalar() as string;
if ( String.IsNullOrEmpty(formGUID) || pur.FunctionList == null || pur.FunctionList.Count < 1 )
continue;
foreach ( FunctionPurview func in pur.FunctionList )
{
freshFunction( func , helper , formGUID );
}
}
}
private void freshFunction( FunctionPurview func , DbHelper helper , string formGUID )
{
StringBuilder sb = new StringBuilder();
sb.AppendLine( "IF EXISTS(SELECT * FROM BasFormFunction WHERE FormGUID=@FormGUID AND FunctionName=@FunctionName)" );
sb.AppendLine( "UPDATE BasFormFunction SET FunctionText=@FunctionText, FunctionType=@FunctionType, DeleteFlag='0' WHERE FormGUID=@FormGUID AND FunctionName=@FunctionName;" );
sb.AppendLine( "ELSE" );
sb.AppendLine( "INSERT INTO BasFormFunction(GUID,FormGUID,FunctionName,FunctionText,FunctionType,DeleteFlag)" );
sb.Append( "VALUES(NEWID(),@FormGUID,@FunctionName,@FunctionText,@FunctionType,'0');" );
helper.ClearParameter();
helper.AddParameter( "@FormGUID" , formGUID );
helper.AddParameter( "@FunctionName" , func.PurviewName );
helper.AddParameter( "@FunctionText" , func.PurviewText );
helper.AddParameter( "@FunctionType" , func.PurviewType );
helper.CommandText = sb.ToString();
helper.ExecuteNonQuery();
}
}
///
/// 窗体权限类
///
class FormPurview : APurview
{
private List listFunction = null;
public FormPurview( XmlNode node )
{
if ( node != null )
{
XmlAttribute att = node.OwnerDocument.DocumentElement.Attributes[ "FILE_NAME" ];//;node.Attributes[ "name" ];
if ( att != null )
PurviewName = att.Value;
XmlNode n = node.SelectSingleNode( "Property[@name=\"Text\"]" );
if ( n != null )
PurviewText = n.InnerText;
att = node.Attributes[ "type" ];
if ( att != null )
PurviewType = att.Value.Split( ',' )[ 0 ];
FunctionPurview func;
listFunction = new List();
XmlNodeList cnList = node.SelectNodes( "//Property[@name=\"MCPurview\"]" );
foreach ( XmlNode cn in cnList )
{
if ( cn.ParentNode.Attributes[ "name" ].Value == PurviewName )
continue;
if ( cn.InnerText.ToLower() != "true" )
continue;
func = new FunctionPurview( cn.ParentNode );
if ( !string.IsNullOrEmpty( func.PurviewName ) && !string.IsNullOrEmpty( func.PurviewText ) && !string.IsNullOrEmpty( func.PurviewType ) )
listFunction.Add( func );
}
}
}
public FormPurview( string objId , string formName , string formText , string formType )
: base( objId , formName , formText , formType )
{
listFunction = new List();
}
public List FunctionList
{
get
{
return listFunction;
}
}
public override DataTable GetPurviews( DbHelper dbhelper )
{
if ( dbhelper == null )
return null;
dbhelper.ClearParameter();
dbhelper.CommandType = CommandType.Text;
dbhelper.CommandText = "SELECT GUID,FormName,FormText,FormType FROM BasForm WHERE DeleteFlag='0'";
return dbhelper.ToDataTable();
}
}
///
/// 控件权限类
///
class FunctionPurview : APurview
{
public FunctionPurview( XmlNode node )
{
if ( node != null )
{
string tabValuePrefix = String.Empty;
string tabTextPrefix = String.Empty;
if (this.IsOwnerTabControl(node))
{
XmlNode tabControlNode = this.GetTabControlOwner(node);
int tagPages = this.GetTabControlPages(tabControlNode);
if (tagPages > 1)
{
XmlNode tabPageNode = this.GetTabPageOwner(node);
if (tabPageNode != null)
{
XmlAttribute attPage = tabPageNode.Attributes["name"];
if (attPage != null)
{
tabValuePrefix = attPage.Value;
}
XmlNode nPage = tabPageNode.SelectSingleNode("Property[@name=\"Text\"]");
if (nPage != null)
{
tabTextPrefix = nPage.InnerText;
}
}
}
}
XmlAttribute att = node.Attributes[ "name" ];
if ( att != null )
{
if (String.IsNullOrEmpty(tabValuePrefix))
{
PurviewName = att.Value;
}
else
{
PurviewName = String.Format("[{0}]{1}", tabValuePrefix, att.Value);
}
}
XmlNode n = node.SelectSingleNode( "Property[@name=\"Text\"]" );
if ( n != null )
{
if (String.IsNullOrEmpty(tabTextPrefix))
{
PurviewText = n.InnerText;
}
else
{
PurviewText = String.Format("[{0}]{1}", tabTextPrefix, n.InnerText);
}
}
att = node.Attributes[ "type" ];
if ( att != null )
PurviewType = att.Value.Split( ',' )[ 0 ];
}
}
public FunctionPurview( string objId , string functionName , string functionText , string functionType )//string formId ,
: base( objId , functionName , functionText , functionType )
{
}
public override DataTable GetPurviews( DbHelper dbhelper )
{
if ( dbhelper == null )
return null;
dbhelper.ClearParameter();
dbhelper.CommandType = CommandType.Text;
dbhelper.CommandText = "SELECT GUID,FormGUID,FunctionName,FunctionText,FunctionType FROM BasFormFunction WHERE DeleteFlag='0'";
return dbhelper.ToDataTable();
}
///
/// 判断节点是否属于选项卡控件
///
///
///
private bool IsOwnerTabControl(XmlNode node)
{
if (node != null && node.Attributes != null)
{
XmlAttribute att = node.Attributes["type"];
if (att != null && att.Value != null && att.Value.StartsWith("System.Windows.Forms.TabControl"))
{
return true;
}
else
{
return IsOwnerTabControl(node.ParentNode);
}
}
else
{
return false;
}
}
///
/// 获取父级选项卡节点
///
///
///
private XmlNode GetTabControlOwner(XmlNode node)
{
if (node != null && node.Attributes != null)
{
XmlAttribute att = node.Attributes["type"];
if (att != null && att.Value != null && att.Value.StartsWith("System.Windows.Forms.TabControl"))
{
return node;
}
else
{
return GetTabControlOwner(node.ParentNode);
}
}
else
{
return null;
}
}
///
/// 获取选项卡的数量
///
///
///
private int GetTabControlPages(XmlNode node)
{
if (node != null)
{
int count = 0;
XmlNodeList nodeList = node.SelectNodes("Object");
foreach(XmlNode xn in nodeList)
{
if (xn.Attributes != null)
{
XmlAttribute att = xn.Attributes["type"];
if (att != null && att.Value.StartsWith("System.Windows.Forms.TabPage"))
{
count++;
}
}
}
return count;
}
else
{
return 0;
}
}
///
/// 获取所属选项卡页
///
///
///
private XmlNode GetTabPageOwner(XmlNode node)
{
if (node != null)
{
if (node.Attributes != null)
{
XmlAttribute att = node.Attributes["type"];
if (att != null && att.Value.StartsWith("System.Windows.Forms.TabPage"))
{
return node;
}
else
{
return GetTabPageOwner(node.ParentNode);
}
}
else
{
return null;
}
}
else
{
return null;
}
}
}
interface IPurview
{
DataTable GetPurviews( DbHelper dbhelper );
}
abstract class APurview : IPurview
{
protected APurview()
{
}
public APurview( string GUID , string purviewName , string purviewText , string purviewType )
{
this.GUID = GUID;
this.PurviewName = purviewName;
this.PurviewText = purviewText;
this.PurviewType = purviewType;
}
public string GUID
{
get;
set;
}
public string PurviewName
{
get;
set;
}
public string PurviewText
{
get;
set;
}
public string PurviewType
{
get;
set;
}
#region IPurview 成员
public abstract DataTable GetPurviews( DbHelper dbhelper );
#endregion
}
}