Files
2024-06-26 10:30:00 +09:00

584 lines
19 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Data.SqlClient;
using System.Net;
using System.Security.Policy;
using System.Data.Common;
using DataBaseConnection.Control;
using DevExpress.XtraBars;
using SystemX.Product.ALIS.UI.View;
using SystemX.Net.Platform.Common.Util;
using SystemX.Product.ALIS.UI.Subs;
using SystemX.Product.ALIS.Interface;
using SystemX.Product.ALIS.UI.View.Base;
using static SystemX.Product.ALIS.UI.View.ViewCfg;
using static SystemX.Net.Platform.Common.Util.LogMessage;
using static SystemX.Product.ALIS.UI.Commons;
using SystemX.Common;
namespace SystemX.Product.ALIS.UI
{
public partial class FrmMain : DevExpress.XtraBars.Ribbon.RibbonForm, IChildController, IDataController
{
public class UserInfo
{
public string UserID;
public string Name;
public string Dept;
public string Email;
public string Comment;
public string Password;
public UserInfo()
{
UserID = "";
Name = "";
Dept = "";
Email = "";
Comment = "";
Password = "";
}
public void Clear()
{
UserID = "";
Name = "";
Dept = "";
Email = "";
Comment = "";
Password = "";
}
}
private List<FrmChild> DocFrames { get; set; }
/*DbConnection conn { get; set; }
DbCommand SQLCmd { get; set; }*/
private SqlConnection SQLConnection { get; set; }
private SqlCommand SQLCmd { get; set; }
BackgroundWorker worker = new BackgroundWorker();
WaitProgressForm loadForm = null;
Stopwatch stLoadFormWait = new Stopwatch();
private string strUserInputConnectInfo;
private async void ReadingCompleted(object args)
{
loadForm.BringToFront();
loadForm.Focus();
if (stLoadFormWait.ElapsedMilliseconds <= 1000)
{
int iremainTime = 1000 - (int)stLoadFormWait.ElapsedMilliseconds;
await Task.Delay(iremainTime);
}
if (loadForm != null)
{
loadForm.Close();
loadForm = null;
}
if (SQLConnection == null)
{
bDatabaseConnState = false;
MessageBox.Show("DB connection failed. Check the DB status or check the connection address.", "[SystemX.Product.ALIS.UI]", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (bDatabaseConnState == false)
{
//this.Close();
SetDBConn();
}
else
{
ConnectInfoINICtrl CCtrl = new ConnectInfoINICtrl();
CCtrl.SetLastestConnectInfo(strUserInputConnectInfo);
barStaticItemConn.Visibility = BarItemVisibility.Always;
barStaticItemConn.ShowImageInToolbar = true;
string strAddress = (strConnIPAddress == string.Empty ? "LocalHost" : strConnIPAddress);
strAddress += " , " + nConnPort.ToString();
barStaticItemConn.Caption += " [" + strAddress + "] [" + strConnCN /*DatabaseConnControl.CatalogName*/ + "] [" + strConnUID + "]";
barButtonItemConnect.Enabled = false;
barButtonItemLogout.Enabled = true;
}
}
private void CheckSqlOption(SqlConnection SqlConn)
{
//옵션 확인 및 ON
//DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;
string strGetQuery1 = "DECLARE @ARITHABORT VARCHAR(3) = 'OFF'; IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON'; SELECT @ARITHABORT AS ARITHABORT;";
string strGetQuery2 = "DECLARE @ARITHIGNORE VARCHAR(3) = 'OFF'; IF ( (128 & @@OPTIONS) = 128 ) SET @ARITHIGNORE = 'ON'; SELECT @ARITHIGNORE AS ARITHIGNORE;";
/*
SET ARITHIGNORE ON
- 쿼리 실행 중 오버플로 또는 0으로 나누기 오류에서 오류 메시지를 반환할지 여부를 제어
  오류 메시지가 반환될지 여부만 제어하며 이 설정에 상관 없이 오버플로 또는 0으로 나누기 오류를
  발생시킨 계산에 NULL을 반환한다. 없는 값 처리를 해야하므고 오류를 발생시킨 것에서 null 반환을 받아야 한다!
SET ARITHABORT ON이면 오버플로 또는 0으로 나누기 오류 발생 시 쿼리나 일괄 처리가 종료
  트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백시킨다. 그러나 이 설정이 INSERT, UPDATE, DELETE 문 실행 중에
  발생한 오류에는 영향을 주지 않는다.
*/
DataTable dtResult1 = new DataTable();
DataTable dtResult2 = new DataTable();
using (SqlCommand SqlCommand = new SqlCommand(strGetQuery1, SqlConn))
{
SqlCommand.CommandTimeout = 300;
DbDataReader dtReader = SqlCommand.ExecuteReader();
dtResult1.Load(dtReader);
dtReader.Close();
}
//
using (SqlCommand SqlCommand = new SqlCommand(strGetQuery2, SqlConn))
{
SqlCommand.CommandTimeout = 300;
DbDataReader dtReader = SqlCommand.ExecuteReader();
dtResult2.Load(dtReader);
dtReader.Close();
}
//
if (XCommons.isHasRow(dtResult1))
{
bool bOptionState = dtResult1.Rows[0]["ARITHABORT"].ToString() == "ON" ? true : false;
if (bOptionState == false)
SetSqlOption(SqlConn, "SET ARITHABORT ON");
}
if (XCommons.isHasRow(dtResult2))
{
bool bOptionState = dtResult2.Rows[0]["ARITHIGNORE"].ToString() == "ON" ? true : false;
if (bOptionState == false)
SetSqlOption(SqlConn, "SET ARITHIGNORE ON");
}
}
private void SetSqlOption(SqlConnection SqlConn, string strQuery)
{
using (SqlCommand SqlCommand = new SqlCommand(strQuery, SqlConn))
{
SqlCommand.CommandTimeout = 300;
int nRows = SqlCommand.ExecuteNonQuery();
}
}
private void PerformDatabaseConnect()
{
SQLConnection = null;
try
{
try
{
//TODO : Conn Database
if (strConnIPAddress == string.Empty)
SQLConnection = DatabaseConnControl.ConnectDB(strConnCN);
else
SQLConnection = DatabaseConnControl.ConnectDB(strConnIPAddress,
strConnCN,
strConnUID,
strConnPW,
nConnPort);
SQLCmd = new SqlCommand();
SQLCmd.Connection = DatabaseConnControl.conn;
CheckSqlOption(SQLConnection);
bDatabaseConnState = true;
}
catch (Exception ex)
{
bDatabaseConnState = false;
MessageOutput.ConsoleWrite($"DB Connection Error: {ex.Message}", ConsoleColor.Red, LogMessage.LogMessageLevel.FATAL);
}
}
finally
{
if (SQLConnection == null)
{
bDatabaseConnState = false;
MessageBox.Show("DB connection failed. Check DB status. Automatically close the program.", "[SystemX.Product.ALIS.UI]", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
public UserInfo CurrentUser;
public LoginAccessLevel ACCESS_LEVEL { internal set; get; }
private string strTitleLabel;
private Stopwatch stCheckLoginTime;
private string strConnIPAddress;
private int nConnPort;
private string strConnCN;
private string strConnUID;
private string strConnPW;
eAppFunctionType eCurrentSelectFuncType;
public string GetServerConnectIP()
{
return strConnIPAddress;
}
public int GetServerConnectPort()
{
return nConnPort;
}
private bool bDatabaseConnState;
public FrmMain()
{
InitializeComponent();
ConsoleUtil.ConsoleHide();
CurrentUser = new UserInfo();
ACCESS_LEVEL = LoginAccessLevel.None;
strTitleLabel = this.Text;
SetOnOperationMarker(false);
stCheckLoginTime = new Stopwatch();
stCheckLoginTime.Start();
worker.DoWork += (sender, args) => PerformDatabaseConnect();
worker.RunWorkerCompleted += (sender, args) => ReadingCompleted(bDatabaseConnState);
stLoadFormWait.Start();
ribbon.SelectedPage = ribbonPageMain;
this.KeyPreview = true;
eCurrentSelectFuncType = eAppFunctionType.None;
}
protected override void WndProc(ref Message message)
{
if (LoginCheck(LoginAccessLevel.Basic))
stCheckLoginTime.Restart();
base.WndProc(ref message);
}
private bool CheckDatabaseConnState()
{
if (bDatabaseConnState == false)
MessageBox.Show("No database connected. Connect first.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return bDatabaseConnState;
}
void RefreshView(eAppFunctionType funcType)
{
if (CheckDatabaseConnState() == false)
return;
try
{
FrmChild frmFound = DocFrames.Find(x => x.DocType == funcType);
if (frmFound == null)
return;
else
{
frmFound.RefreshView();
}
}
catch (Exception ex)
{
LogMessage.MessageOutput.ConsoleWrite($"Error On Open View. Error Message: {ex.Message}");
}
return;
}
UserControl OpenViewModel(eAppFunctionType funcType, LoginAccessLevel CreateAccessLevel, eSelectType eSelType = eSelectType.None, bool bLoginState = false)
{
if (CheckDatabaseConnState() == false)
return null;
if (DocFrames == null)
DocFrames = new List<FrmChild>();
try
{
FrmChild frmFound = DocFrames.Find(x => x.DocType == funcType);
if (frmFound == null)
{
frmFound = new FrmChild(this, funcType, eSelType, funcType.ToString(), CreateAccessLevel, bLoginState);
frmFound.Text = funcType.ToString();
DocFrames.Add(frmFound);
frmFound.Show();
}
else
{
frmFound.Select();
}
return frmFound.WindowControl as UcBaseView;
}
catch (Exception ex)
{
LogMessage.MessageOutput.ConsoleWrite($"Error On Open View. Error Message: {ex.Message}");
return null;
}
}
private void SetDBConn()
{
strConnIPAddress = string.Empty;
strConnCN = DatabaseConnControl.CatalogName;
strConnUID = DatabaseConnControl.CatalogConnUID;
strConnPW = DatabaseConnControl.CatalogConnPW;
nConnPort = DatabaseConnControl.CatalogConnPort;
this.BringToFront();
this.Focus();
ConnectForm connFrm = new ConnectForm(null);
DialogResult dr = connFrm.ShowDialog();
if (dr == DialogResult.OK || dr == DialogResult.Ignore)
{
strUserInputConnectInfo = connFrm.strInputText;
strConnIPAddress = connFrm.strGetConnIPAddress;
nConnPort = connFrm.nGetConnPort;
strConnCN = connFrm.strGetConnCN;
strConnUID = connFrm.strGetConnUID;
strConnPW = connFrm.strGetConnPW;
loadForm = new WaitProgressForm();
loadForm.setDescription("Connecting ...");
loadForm.Location = new Point(this.Width / 2, this.Height / 2);
//loadForm.ShowOnTopMode = DevExpress.XtraWaitForm.ShowFormOnTopMode.AboveAll;
stLoadFormWait.Restart();
worker.RunWorkerAsync(null);
loadForm.ShowDialog();
}
else
this.Close();
}
private void FrmMain_Load(object sender, EventArgs e)
{
SetDBConn();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
switch (msg.Msg)
{
case 0x100:
case 0x104:
switch (keyData)
{
case Keys.Control | Keys.I:
MessageBox.Show("Ctrl + I pressed");
break;
}
break;
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void LoginProc()
{
//SetOnOperationMarker(false);
if (CheckDatabaseConnState() == false)
return;
LoginForm loginForm = new LoginForm(this);
using (GetOnOperationUserLoginMarker())
{
DialogResult dr = loginForm.ShowDialog();
switch (dr)
{
case DialogResult.OK:
{
LoginInfoINICtrl LCtrl = new LoginInfoINICtrl();
LCtrl.SetLastestLoginInfo(loginForm.UserID);
CurrentUser.UserID = loginForm.UserID;
CurrentUser.Name = loginForm.UserName;
CurrentUser.Dept = loginForm.UserDept;
CurrentUser.Email = loginForm.UserEmail;
CurrentUser.Comment = loginForm.UserComment;
CurrentUser.Password = loginForm.UserPassword;
if (CurrentUser.UserID.CompareTo("Admin") == 0)
ACCESS_LEVEL = LoginAccessLevel.Admin;
else
ACCESS_LEVEL = LoginAccessLevel.Basic;
SetOnOperationMarker(true);
ribbon.SelectedPage = ribbonPageManagement;
}
break;
case DialogResult.Cancel:
{
SetOnOperationMarker(false);
}
break;
}
}
}
private void barButtonItem_Login_ItemClick(object sender, ItemClickEventArgs e)
{
LoginProc();
}
private void barButtonItemUserLogout_ItemClick(object sender, ItemClickEventArgs e)
{
SetOnOperationMarker(false);
}
private void timerSystem_Tick(object sender, EventArgs e)
{
if (LoginCheck(LoginAccessLevel.Basic))
{
if (Commons.DEBUG_MODE == false)
{
DispLoginTimeText();
/* Login Timeout Disabled
if (stCheckLoginTime.ElapsedMilliseconds >= 600000)
SetOnOperationMarker(false);
*/
}
}
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (SQLConnection != null) // && bDatabaseConnState)
{
if (MessageBox.Show("You want to program exit?", "[SystemX.Product.ALIS.UI]", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
e.Cancel = true;
else
{
DatabaseConnControl.DisconnectDB();
e.Cancel = false;
}
}
}
private void barButtonItemConsole_ItemClick(object sender, ItemClickEventArgs e)
{
ConsoleUtil.ConsoleVisibleControl();
}
private void barButtonItemConnect_ItemClick(object sender, ItemClickEventArgs e)
{
using (GetOnOperationDBConnMarker(true))
{
if (bDatabaseConnState)
{
;//
}
SetDBConn();
}
}
private void barButtonItemLogout_ItemClick(object sender, ItemClickEventArgs e)
{
using (GetOnOperationDBConnMarker(false))
{
SetOnOperationMarker(false);
CloseAllChildForm();
DatabaseConnControl.DisconnectDB();
bDatabaseConnState = false;
}
}
private void FrmMain_KeyDown(object sender, KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.F1: LoginProc(); break;
case Keys.F2: OpenViewModel(eAppFunctionType.M_TestListFile, LoginAccessLevel.Basic, eSelectType.TestListFile, LoginCheck(LoginAccessLevel.Basic)); break;
case Keys.F3: OpenViewModel(eAppFunctionType.M_TestListVariant, LoginAccessLevel.Basic, eSelectType.TestListVariant, LoginCheck(LoginAccessLevel.Basic)); break;
case Keys.F4: OpenViewModel(eAppFunctionType.M_TestListRelease, LoginAccessLevel.Basic, eSelectType.TestListRelease, LoginCheck(LoginAccessLevel.Basic)); break;
case Keys.F5: RefreshView(eCurrentSelectFuncType); break;
case Keys.F6: OpenViewModel(eAppFunctionType.M_HostList, LoginAccessLevel.Basic, eSelectType.HostList, LoginCheck(LoginAccessLevel.Basic)); break;
case Keys.F7: OpenViewModel(eAppFunctionType.M_GroupList, LoginAccessLevel.Basic, eSelectType.GroupList, LoginCheck(LoginAccessLevel.Basic)); break;
case Keys.F8: OpenViewModel(eAppFunctionType.M_TestCodeList, LoginAccessLevel.Basic, eSelectType.TestCodeList, LoginCheck(LoginAccessLevel.Basic)); break;
case Keys.F9: OpenViewModel(eAppFunctionType.M_UserList, LoginAccessLevel.Admin, eSelectType.UserList, LoginCheck(LoginAccessLevel.Admin)); break;
}
}
}
}