using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using DataDynamics.ActiveReports.Export.Xls;
using DataDynamics.ActiveReports.Export.Pdf;
using System.Threading;

namespace IControls_FireManager
{
    //
    // 엑티브레포트 뷰어를 제공합니다. 실제로 데이타는 각 폼에 따라 다르므로 뷰어는 UI 만 신경쓰면 됩니다
    // XLS,PDF 버튼은 동적으로 생성합니다.
    //

    public partial class Form_ActiveReport_Viewer : Form
    {
        // 레포트 정보를 생성시 진행팝업창
        public Form Popup_ReportCreate_Progress = new Form();

        // 생성자
        public void Initialize()
        {
            // 컴포넌트 초기화
            InitializeComponent();

            // 툴바에 메뉴 추가
            this.viewer_Report.Toolbar.ToolStrip.Items.Add(new ToolStripSeparator());
            this.viewer_Report.Toolbar.ToolStrip.Items.Add("엑셀 내보내기");
            this.viewer_Report.Toolbar.ToolStrip.Items.Add(new ToolStripSeparator());
            this.viewer_Report.Toolbar.ToolStrip.Items.Add("PDF 내보내기");

            ///
            /// 이벤트
            /// 

            // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
            this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);

            // 윈도우 스타일 변경 이벤트 핸들러 등록
            _Event.WindowStyleSet_SendMessage_Event += new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event);

            // 툴바에 등록
            this.viewer_Report.Toolbar.ToolStrip.Items[25].Click += new EventHandler(Form_ActiveReportViewer_XLS_Export_Click);
            this.viewer_Report.Toolbar.ToolStrip.Items[27].Click += new EventHandler(Form_ActiveReportViewer_PDF_Export_Click);

            ///
            /// 스타일 변경
            /// 

            UI_Style_Initialize();

            // 프로그램 실행중 한번만 실행하도록 만듬
            _Data.ActiveReportViewer_Enable = true;
        }

        // 레포트 (데이타베이스 쿼리 결과를 곧바로 받아서 전체 작업개수를 파악하지 않으며 가변 혹은 고정으로 출력되는 레포트)
        public Form_ActiveReport_Viewer(
            // 레포트 타입
            ACTIVE_REPORT_DATA DATA_TYPE,
            // 쿼리 결과 데이타. 즉 실제로 레포트에 출력할 데이타를 전달받음  
            object ResultData,
            // 컬럼 텍스트명 및 길이 추출정보필드
            // 가변레포트 : _Report_Column_Info 타입의 클래스의 리스트 정보
            // 고정레포트 : 해당레포트포맷을 참조해서 인덱서로 구성된 클래스의 리스트 정보
            ArrayList Column_Info,
            // 제목
            string Title,
            // 개요
            string Summary,
            // 컬럼 높이 (가변레포트에서만 사용)
            float ColumnHeight,
            // 폰트 사이즈 (가변레포트에서만 사용)
            int FontSize)
        {
            Initialize();

            // 총 개수
            int All_ProcessCount = _ActiveReport.Get_All_ProcessCount(ResultData);

            // 결과가 없다면 실행안함
            if (ResultData == null || All_ProcessCount == 0) return;

            // 기존의 팝업창 종료
            if (Popup_ReportCreate_Progress != null) _Crossthread.Form_Close(Popup_ReportCreate_Progress);

            // 레포트 생성중입니다. 프로그레스 팝업창
            Popup_ReportCreate_Progress = _Popup.Create(Popup_Type.Progress, Popup_Style.Normal, _Text.OK, 250, 200, _Text.ReportCreateProgress, All_ProcessCount);

            // 기존 스레드 종료
            _Thread.Abort("ACTIVE_REPORT_DATA");

            // 레포트 타입에 따라 폼이 결정된다
            object Report = null;
            switch (DATA_TYPE)
            {
                //
                // 가변레포트
                //
                case ACTIVE_REPORT_DATA.VARIABLE_HEIGHT:
                    Report = new ActiveReport_Variable_Height(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    break;
                case ACTIVE_REPORT_DATA.VARIABLE_WIDTH:
                    Report = new ActiveReport_Variable_Width(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    break;

                //
                // 고정레포트
                // 
                case ACTIVE_REPORT_DATA.OPER_GROUP:
                    Report = new ActiveReport_OperGroup(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    break;
                case ACTIVE_REPORT_DATA.OPER_SET:
                    Report = new ActiveReport_OperSet(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    break;
                case ACTIVE_REPORT_DATA.PAGE:
                    Report = new ActiveReport_Page(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    break;
                
            }

            // 레포트 문서에다 실제 데이타를 출력하는 스레드 실행
            if (Report != null)
            {
                this.viewer_Report.Document = ((DataDynamics.ActiveReports.ActiveReport)Report).Document;
                _Thread.Create("ACTIVE_REPORT_DATA", ActiveReport_DataBinding, Report);
            }
        }

        //
        // 레포트 생성 스레드
        //

        public void ActiveReport_DataBinding(object ActiveReport_Documnet)
        {
            try
            {
                // Active Report Document Fetch 
                ((DataDynamics.ActiveReports.ActiveReport)ActiveReport_Documnet).Run();
            }
            catch (Exception e)
            {
                _Thread.Abort("ACTIVE_REPORT_DATA");
                _Event.DebugView_SendMessage_Write(e.ToString());
            }
        }

        // set  active report class : 혹시 외부에서 접근가능할 루틴이 필요하다면 사용
        public DataDynamics.ActiveReports.Document.Document Document
        {
            set
            {
                this.viewer_Report.Document = value;
            }
        }

        // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
        public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 기존 스레드 종료
            _Thread.Abort("ACTIVE_REPORT_DATA");

            // 프로그레스바 진행중에는 닫아 버리면 종료
            if (Popup_ReportCreate_Progress != null)
            {
                _Popup.ProcessPopup_Enable = false;
                _Popup.ProcessPopup_Processbar_AllCnt = 0;
                _Popup.ProcessPopup_Processbar_Cnt = 0;
                Popup_ReportCreate_Progress.Close();
            }

            // 툴바 클릭 이벤트 핸들러 해제
            if (this.viewer_Report.Toolbar.ToolStrip.Items["엑셀 내보내기"] != null)
                this.viewer_Report.Toolbar.ToolStrip.Items["엑셀 내보내기"].Click -= new EventHandler(Form_ActiveReportViewer_XLS_Export_Click);
            if (this.viewer_Report.Toolbar.ToolStrip.Items["PDF 내보내기"] != null)
                this.viewer_Report.Toolbar.ToolStrip.Items["PDF 내보내기"].Click -= new EventHandler(Form_ActiveReportViewer_PDF_Export_Click);

            // 윈도우 스타일 변경 이벤트 핸들러 해제
            _Event.WindowStyleSet_SendMessage_Event -= new _Event.WindowStyleSet_SendMessage_Handler(_Event_WindowStyleSet_SendMessage_Event);

            // 프로그램 실행중 한번만 실행하도록 만듬
            _Data.ActiveReportViewer_Enable = false;
        }

        // 윈도우 스타일 변경 이벤트
        public void _Event_WindowStyleSet_SendMessage_Event()
        {
            UI_Style_Initialize();
        }

        // 스타일 초기화 함수
        private void UI_Style_Initialize()
        {

        }

        //
        // 파일 내보내기
        //

        // XLS 파일로 내보내기
        public void Form_ActiveReportViewer_XLS_Export_Click(object sender, EventArgs e)
        {
            // 다이얼로그 생성
            SaveFileDialog SaveFileDialog_XLS = new SaveFileDialog();
            // 확장자 넣기
            SaveFileDialog_XLS.Filter = "(*.xls)|*.xls";
            // 파일 세이브 다이얼로그
            if (SaveFileDialog_XLS.ShowDialog() == DialogResult.OK)
            {
                if (SaveFileDialog_XLS.FileName.Substring(SaveFileDialog_XLS.FileName.Length - 3, 3).ToUpper() == "XLS")
                {
                    XlsExport DocumentXlsExport = new DataDynamics.ActiveReports.Export.Xls.XlsExport();
                    DocumentXlsExport.Export(this.viewer_Report.Document, SaveFileDialog_XLS.FileName);
                }
            }
        }

        // PDF 파일로 내보내기
        public void Form_ActiveReportViewer_PDF_Export_Click(object sender, EventArgs e)
        {
            // 다이얼로그 생성
            SaveFileDialog SaveFileDialog_PDF = new SaveFileDialog();
            // 확장자 넣기
            SaveFileDialog_PDF.Filter = "(*.pdf)|*.pdf";
            // 파일 세이브 다이얼로그
            if (SaveFileDialog_PDF.ShowDialog() == DialogResult.OK)
            {
                if (SaveFileDialog_PDF.FileName.Substring(SaveFileDialog_PDF.FileName.Length - 3, 3).ToUpper() == "PDF")
                {
                    PdfExport DocumentPdfExport = new DataDynamics.ActiveReports.Export.Pdf.PdfExport();
                    DocumentPdfExport.Export(this.viewer_Report.Document, SaveFileDialog_PDF.FileName);
                }
            }
        }
    }
    /*
    public partial class Form_ActiveReport_Viewer : Form
    {
        // 레포트 정보를 생성시 진행팝업창
        public Form Popup_ReportCreate_Progress = new Form();        
        public int Popup_ReportCreate_Progress_Count_End = 0; // 최종카운트

        // 레포트 문서 (엑티브 레포트 실제 클래스)
        ActiveReport_OperGroup OperGroup = null;
        ActiveReport_OperSet OperSet = null;

        // 수신기 아이디
        public string TEMP_RECEIVER_ID = null;

        // 스레드 종료를 알리는 이벤트
        public delegate void ThreadEnd_SendMessage_Handler(int AllWorkCount, ACTIVE_REPORT_DATA DATA_TYPE);
        public event ThreadEnd_SendMessage_Handler ThreadEnd_SendMessage_Event;
        public void ThreadEnd_SendMessage_Write(int AllWorkCount, ACTIVE_REPORT_DATA DATA_TYPE)
        {
            if (ThreadEnd_SendMessage_Event != null)
            { ThreadEnd_SendMessage_Event(AllWorkCount, DATA_TYPE); }
        }

        // 생성자 공통부
        public void Initialize()
        {
            // 컴포넌트 초기화
            InitializeComponent();

            // 툴바에 메뉴 추가
            this.viewer_Report.Toolbar.ToolStrip.Items.Add(new ToolStripSeparator());
            this.viewer_Report.Toolbar.ToolStrip.Items.Add("엑셀 내보내기");
            this.viewer_Report.Toolbar.ToolStrip.Items.Add(new ToolStripSeparator());
            this.viewer_Report.Toolbar.ToolStrip.Items.Add("PDF 내보내기");

            ///
            /// 이벤트
            /// 

            // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
            this.FormClosing += new FormClosingEventHandler(CreateForm_FormClosing);

            // 툴바에 등록
            this.viewer_Report.Toolbar.ToolStrip.Items[25].Click += new EventHandler(Form_ActiveReportViewer_XLS_Export_Click);
            this.viewer_Report.Toolbar.ToolStrip.Items[27].Click += new EventHandler(Form_ActiveReportViewer_PDF_Export_Click);

            ///
            /// 스타일 변경
            /// 

            // 프로그램 실행중 한번만 실행하도록 만듬
            _Data.ActiveReportViewer_Enable = true;
        }

        //
        // 생성자 (기존 타입 과 신규 추가한 가변 레포트용 생성자가 존재한다)
        //

        public Form_ActiveReport_Viewer(
            string RECEIVER_ID, 
            ACTIVE_REPORT_DATA DATA_TYPE)
        {
            // 컴포넌트 초기화
            InitializeComponent();

            // 레포트 데이타 처리의 총개수를 알아내는 스레드 종료하는 이벤트 핸들러 등록
            this.ThreadEnd_SendMessage_Event += new ThreadEnd_SendMessage_Handler(Form_ActiveReportViewer_ThreadEnd_SendMessage_Event);

            // 수신기 아이디 저장
            TEMP_RECEIVER_ID = RECEIVER_ID;

            // 레포트 타입 지정
            Create_ActiveReportData(DATA_TYPE);

            // 툴바에 메뉴 추가
            this.viewer_Report.Toolbar.ToolStrip.Items.Add(new ToolStripSeparator());
            this.viewer_Report.Toolbar.ToolStrip.Items.Add("엑셀 내보내기");
            this.viewer_Report.Toolbar.ToolStrip.Items.Add(new ToolStripSeparator());
            this.viewer_Report.Toolbar.ToolStrip.Items.Add("PDF 내보내기");

            // 툴바에 등록
            this.viewer_Report.Toolbar.ToolStrip.Items[25].Click += new EventHandler(Form_ActiveReportViewer_XLS_Export_Click);
            this.viewer_Report.Toolbar.ToolStrip.Items[27].Click += new EventHandler(Form_ActiveReportViewer_PDF_Export_Click);
        }

        public Form_ActiveReport_Viewer(
            ACTIVE_REPORT_DATA DATA_TYPE,
            object ResultData,          // 쿼리 결과 데이타. 즉 실제로 레포트에 출력할 데이타를 전달받음            
            ArrayList Column_Info,      // 컬럼 텍스트명 및 길이 추출정보필드 , _Report_Column_Info 타입의 클래스의 리스트 정보
            string Title,               // 제목
            string Summary,             // 개요
            float ColumnHeight,         // 컬럼 높이 
            int FontSize)
        {
            Initialize();

            // 총 개수
            int All_ProcessCount = _ActiveReport.Get_All_ProcessCount(ResultData);

            // 결과가 없다면 실행안함
            if (ResultData == null || All_ProcessCount == 0) return;

            // 기존의 팝업창 종료
            if (Popup_ReportCreate_Progress != null) _Crossthread.Form_Close(Popup_ReportCreate_Progress);

            // 레포트 생성중입니다. 프로그레스 팝업창
            Popup_ReportCreate_Progress = _Popup.Create(Popup_Type.Progress, Popup_Style.Normal, _Text.OK, 250, 200, _Text.ReportCreateProgress, All_ProcessCount);

            // 기존 스레드 종료
            _Thread.Abort("ACTIVE_REPORT_DATA");

            // 레포트 타입에 구분되어 실행
            switch (DATA_TYPE)
            {
                case ACTIVE_REPORT_DATA.VARIABLE_HEIGHT:
                    ActiveReport_Variable_Height Report_ActiveReport_Variable_Height =
                        new ActiveReport_Variable_Height(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    this.viewer_Report.Document = Report_ActiveReport_Variable_Height.Document;
                    _Thread.Create("ACTIVE_REPORT_DATA", ActiveReport_DataBinding, Report_ActiveReport_Variable_Height);
                    break;
                case ACTIVE_REPORT_DATA.VARIABLE_WIDTH:
                    ActiveReport_Variable_Width Report_ActiveReport_Variable_Width =
                        new ActiveReport_Variable_Width(Popup_ReportCreate_Progress, ResultData, Column_Info, Title, Summary, ColumnHeight, FontSize);
                    this.viewer_Report.Document = Report_ActiveReport_Variable_Width.Document;
                    _Thread.Create("ACTIVE_REPORT_DATA", ActiveReport_DataBinding, Report_ActiveReport_Variable_Width);
                    break;                
            }
        }

        // set  active report class : 혹시 외부에서 접근가능할 루틴이 필요하다면 사용
        public DataDynamics.ActiveReports.Document.Document Document
        { 
            set
            {
                this.viewer_Report.Document = value;
            }
        }

        // 폼닫기 이벤트를 등록 (이벤트 핸들러 해제용)
        public void CreateForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            // 프로그레스바 진행중에는 닫아 버리면 종료
            if (Popup_ReportCreate_Progress != null) 
            { 
                _Popup.ProcessPopup_Enable = false;
                _Popup.ProcessPopup_Processbar_AllCnt = 0;
                _Popup.ProcessPopup_Processbar_Cnt = 0;
                Popup_ReportCreate_Progress.Close(); 
            }

            // 툴바 클릭 이벤트 핸들러 해제
            if(this.viewer_Report.Toolbar.ToolStrip.Items["엑셀 내보내기"] != null)
                this.viewer_Report.Toolbar.ToolStrip.Items["엑셀 내보내기"].Click -= new EventHandler(Form_ActiveReportViewer_XLS_Export_Click);
            if (this.viewer_Report.Toolbar.ToolStrip.Items["PDF 내보내기"] != null)
                this.viewer_Report.Toolbar.ToolStrip.Items["PDF 내보내기"].Click -= new EventHandler(Form_ActiveReportViewer_PDF_Export_Click);
         
            // 레포트 데이타 처리의 총개수를 알아내는 스레드 종료하는 이벤트 핸들러 해제
            this.ThreadEnd_SendMessage_Event -= new ThreadEnd_SendMessage_Handler(Form_ActiveReportViewer_ThreadEnd_SendMessage_Event);

            // 프로그램 실행중 한번만 실행하도록 만듬
            _Data.ActiveReportViewer_Enable = false;
        }
       
        // 데이타 타입에 따라 레포트 문서 타입이 결정됩니다.
        public void Create_ActiveReportData(ACTIVE_REPORT_DATA DATA_TYPE)
        {
            // 레포트 준비중이라는 팝업창을 생성
            if (Popup_ReportCreate_Progress != null) _Crossthread.Form_Close(Popup_ReportCreate_Progress);
            Popup_ReportCreate_Progress = _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.ReportReady, 0);

            // 데이타 처리 개수를 알아내기 위해 스레드로 돌린다
            switch (DATA_TYPE)
            { 
                // 연동 그룹
                case ACTIVE_REPORT_DATA.OPER_GROUP:
                    {
                        Thread WorkingThread_Popup = new Thread(new ThreadStart(Ready_For_AllCnt_OPER_GROUP));
                        WorkingThread_Popup.Start();  
                    }
                    break;
                // 연동 설정
                case ACTIVE_REPORT_DATA.OPER_SET:
                    {
                        Thread WorkingThread_Popup = new Thread(new ThreadStart(Ready_For_AllCnt_OPER_SET));
                        WorkingThread_Popup.Start();   
                    }
                    break;
            }
        }

        //
        // 전체 작업개수를 알아내기 위한 스레드
        //

        // 연동 그룹
        public void Ready_For_AllCnt_OPER_GROUP()
        {
            // 작업량 예상
            Popup_ReportCreate_Progress_Count_End = 0;
            DataRowCollection DB_TABLE_GROUP_ForPopup = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", "GROUP_ID", TEMP_RECEIVER_ID));
            if (DB_TABLE_GROUP_ForPopup != null && DB_TABLE_GROUP_ForPopup.Count != 0)
            {
                foreach (DataRow GROUP in DB_TABLE_GROUP_ForPopup)
                {
                    // 그룹
                    DataRowCollection DB_TABLE_DETAIL_ForPopup = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Gruop_DeviceTable(GROUP[1].ToString(), TEMP_RECEIVER_ID));
                    if (DB_TABLE_DETAIL_ForPopup != null && DB_TABLE_DETAIL_ForPopup.Count != 0)
                        Popup_ReportCreate_Progress_Count_End = Popup_ReportCreate_Progress_Count_End + DB_TABLE_DETAIL_ForPopup.Count;

                    // 디바이스가 하나도 없다면
                    if (DB_TABLE_DETAIL_ForPopup.Count == 0)
                        Popup_ReportCreate_Progress_Count_End = Popup_ReportCreate_Progress_Count_End + 1;
                }
            }

            // 이벤트 발생
            ThreadEnd_SendMessage_Write(Popup_ReportCreate_Progress_Count_End, ACTIVE_REPORT_DATA.OPER_GROUP);
        }

        // 연동 설정
        public void Ready_For_AllCnt_OPER_SET()
        {
            // 작업량 예상
            Popup_ReportCreate_Progress_Count_End = 0;

            DataRowCollection DB_TABLE_MAP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_MAP", "MAP_ID", TEMP_RECEIVER_ID));

            if (DB_TABLE_MAP != null && DB_TABLE_MAP.Count != 0)
            {
                foreach (DataRow MAP in DB_TABLE_MAP)
                {
                    // 입력 (디바이스)
                    DataRowCollection DB_TABLE_MAP_IN = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "I", TEMP_RECEIVER_ID));
                    if (DB_TABLE_MAP_IN != null && DB_TABLE_MAP_IN.Count != 0)
                    {
                        Popup_ReportCreate_Progress_Count_End = Popup_ReportCreate_Progress_Count_End + DB_TABLE_MAP_IN.Count;                        
                    }
                    // 출력 (디바이스)
                    DataRowCollection DB_TB_MAP_OUT = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "O", "D", TEMP_RECEIVER_ID));
                    if (DB_TB_MAP_OUT != null && DB_TB_MAP_OUT.Count != 0)
                    {
                        Popup_ReportCreate_Progress_Count_End = Popup_ReportCreate_Progress_Count_End + DB_TB_MAP_OUT.Count;
                    }
                    // 출력 (그룹)
                    DataRowCollection DB_MAP_OUT_GROUP = _Db.ExecuteRead_SqlDataAdapter(_Sql.Search_Map_ProcessTable(MAP[1].ToString(), "O", "G", TEMP_RECEIVER_ID));
                    if (DB_MAP_OUT_GROUP != null && DB_MAP_OUT_GROUP.Count != 0)
                        foreach (DataRow DETAIL in DB_MAP_OUT_GROUP)
                        {
                            DataRowCollection DB_TABLE_TB_DEVICE_TYPE = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_GROUP", "GROUP_ID", DETAIL[5].ToString(), TEMP_RECEIVER_ID));
                            if (DB_TABLE_TB_DEVICE_TYPE != null && DB_TABLE_TB_DEVICE_TYPE.Count != 0)
                            {
                                Popup_ReportCreate_Progress_Count_End = Popup_ReportCreate_Progress_Count_End + DB_TABLE_TB_DEVICE_TYPE.Count;
                            }
                        }

                    // 입력 출력이 없는 경우
                    if (DB_TABLE_MAP_IN.Count == 0 && DB_TB_MAP_OUT.Count == 0 && DB_MAP_OUT_GROUP.Count == 0)
                        Popup_ReportCreate_Progress_Count_End = Popup_ReportCreate_Progress_Count_End + 1;
                }
            }

            // 이벤트 발생
            ThreadEnd_SendMessage_Write(Popup_ReportCreate_Progress_Count_End, ACTIVE_REPORT_DATA.OPER_SET);
        }

        // 스레드가 종료되면 호출되는 함수
        delegate void CallBack_Form_SetObject(int AllWorkCount, ACTIVE_REPORT_DATA DATA_TYPE);
        public void Form_ActiveReportViewer_ThreadEnd_SendMessage_Event(int AllWorkCount, ACTIVE_REPORT_DATA DATA_TYPE)
        {
            if (this.InvokeRequired)
            {
                CallBack_Form_SetObject d = new CallBack_Form_SetObject(Form_ActiveReportViewer_ThreadEnd_SendMessage_Event);
                this.Invoke(d, new object[] { AllWorkCount, DATA_TYPE });
            }
            else
            {
                // 기존의 팝업창을 종료하고 프로그레스바 팝업창으로 재생성
                //

                if (Popup_ReportCreate_Progress != null) _Crossthread.Form_Close(Popup_ReportCreate_Progress);

                 // 작업 데이타가 없다면 경고 문구 출력후 종료
                if (AllWorkCount == 0)
                {
                    Popup_ReportCreate_Progress = _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.NotReportCreateData, 0);                    
                }
                else
                {
                    Popup_ReportCreate_Progress = _Popup.Create(Popup_Type.Progress, Popup_Style.Normal, _Text.OK, 250, 200, _Text.ReportCreateProgress, AllWorkCount);                    

                    switch (DATA_TYPE)
                    {
                        case ACTIVE_REPORT_DATA.OPER_GROUP:
                            {
                                // 레포트 문서 지정   
                                OperGroup = new ActiveReport_OperGroup(TEMP_RECEIVER_ID, Popup_ReportCreate_Progress);
                                this.viewer_Report.Document = OperGroup.Document;

                                // 실제 레포트 작업 스레드 생성                            
                                Thread WorkingThread = new Thread(new ThreadStart(ActiveReport_DataBinding_OperGroup));
                                WorkingThread.Start();
                            }
                            break;
                        case ACTIVE_REPORT_DATA.OPER_SET:
                            {
                                // 레포트 문서 지정  
                                OperSet = new ActiveReport_OperSet(TEMP_RECEIVER_ID, Popup_ReportCreate_Progress);
                                this.viewer_Report.Document = OperSet.Document;

                                // 실제 레포트 작업스레드 생성
                                Thread WorkingThread = new Thread(new ThreadStart(ActiveReport_DataBinding_OperSet));
                                WorkingThread.Start();
                            }
                            break;
                    }
                }
            }
        }

        //
        // 레포트 생성 스레드
        //

        public void ActiveReport_DataBinding_OperGroup()
        {
            try
            {
                OperGroup.Run();
            }
            catch (Exception e)
            {
                _Event.DebugView_SendMessage_Write(e.ToString());
            }
        }
        public void ActiveReport_DataBinding_OperSet()
        {
            try
            {
                OperSet.Run();
            }
            catch (Exception e)
            {
                _Event.DebugView_SendMessage_Write(e.ToString());
            }
        }
        
        public void ActiveReport_DataBinding(object ActiveReport_Documnet)
        {
            try
            {
                // Reflection 을 이용해서 타입을 추출
                Type ptype = ActiveReport_Documnet.GetType();

                // 레포트 실행 (타입별 실행되는 레포트 문서가 틀리다)   
                if (ptype == typeof(ActiveReport_Variable_Width))
                    ((ActiveReport_Variable_Width)ActiveReport_Documnet).Run();
                else if (ptype == typeof(ActiveReport_Variable_Height))
                    ((ActiveReport_Variable_Height)ActiveReport_Documnet).Run();
            }
            catch (Exception e)
            {
                _Event.DebugView_SendMessage_Write(e.ToString());
            }
        }

        //
        // 파일 내보내기
        //

        // XLS 파일로 내보내기
        public void Form_ActiveReportViewer_XLS_Export_Click(object sender, EventArgs e)
        {
            // 다이얼로그 생성
            SaveFileDialog SaveFileDialog_XLS = new SaveFileDialog();
            // 확장자 넣기
            SaveFileDialog_XLS.Filter = "(*.xls)|*.xls";
            // 파일 세이브 다이얼로그
            if (SaveFileDialog_XLS.ShowDialog() == DialogResult.OK)
            {
                if (SaveFileDialog_XLS.FileName.Substring(SaveFileDialog_XLS.FileName.Length - 3, 3).ToUpper() == "XLS")
                {
                    XlsExport DocumentXlsExport = new DataDynamics.ActiveReports.Export.Xls.XlsExport();
                    DocumentXlsExport.Export(this.viewer_Report.Document, SaveFileDialog_XLS.FileName);
                }
            }   
        }

        // PDF 파일로 내보내기
        public void Form_ActiveReportViewer_PDF_Export_Click(object sender, EventArgs e)
        {
            // 다이얼로그 생성
            SaveFileDialog SaveFileDialog_PDF = new SaveFileDialog();
            // 확장자 넣기
            SaveFileDialog_PDF.Filter = "(*.pdf)|*.pdf";
            // 파일 세이브 다이얼로그
            if (SaveFileDialog_PDF.ShowDialog() == DialogResult.OK)
            {
                if (SaveFileDialog_PDF.FileName.Substring(SaveFileDialog_PDF.FileName.Length - 3, 3).ToUpper() == "PDF")
                {
                    PdfExport DocumentPdfExport = new DataDynamics.ActiveReports.Export.Pdf.PdfExport();
                    DocumentPdfExport.Export(this.viewer_Report.Document, SaveFileDialog_PDF.FileName);
                }
            }
        }
    }
    */
}