4) ProjectInfoControl

이번에는 평가 프로젝트의 기본 정보를 표시하는 사용자 정의 컨트롤을 만듭시다. 프로젝트에 ProjectInfoControl 이름의 사용자 정의 컨트롤을 추가하고 자식 컨트롤을 배치하세요. 자식 컨트롤로 프로젝트 제목, 전체 UI 개수, 이름이 없는 UI 요소 개수를 표시할 Label 컨트롤을 배치합니다. 평가 프로젝트를 저장하거나 끝내기, 저장하고 끝내기를 수행할 수 있는 버튼 컨트롤을 배치합니다. 그리고 컨트롤 종류 별 UI 요소 개수와 Access 키 목록과 Accelerator 키 목록을 항목으로 표시할 ListView 컨트롤을 배치합니다.

[그림 10.12] ProjectInfoControl 자식 컨트롤 배치
[그림 10.12] ProjectInfoControl 자식 컨트롤 배치
번호컨트롤 형식컨트롤 이름특이 사항
1Labellb_title 
2Labellb_ui_cnt 
3Labellb_noname_cnt 
4ListViewlv_controlView 속성을 Details로 설정
5Buttonbtn_saveVisible 속성을 False로 설정
6Buttonbtn_end 
7Buttonbtn_save_end 
8ListViewlv_accesskeyView 속성을 Details로 설정
9ListViewlv_acceleratorkeyView 속성을 Details로 설정

[표 10.4] ProcessInfoControl의 자식 컨트롤

접근성 평가 프로젝트 개체를 위한 멤버 필드를 선언합니다.

AccEvalProject aeproject;

생성자는 접근성 평가 프로젝트 개체를 입력 인자로 받게 수정하고 입력 인자로 받은 개체로 멤버 필드에 대입합니다.

public ProjectInfoControl(AccEvalProject aeproject)
{
    InitializeComponent();
    this.aeproject = aeproject;
}

컨트롤의 Load 이벤트 핸들러를 등록하세요.

private void ProjectInfoControl_Load(object sender, EventArgs e)
{

평가 제목을 화면에 표시합니다.

    lb_title.Text = aeproject.Title;

전체 UI 개수와 이름 없는 UI 개수도 화면에 표시합니다.

    lb_ui_cnt.Text = aeproject.UICount.ToString();
    lb_noname_cnt.Text = aeproject.NonameCount.ToString();

세 개의 리스트 뷰의 항목을 추가합니다. 각 리스트 뷰의 항목을 추가하는 메서드는 별도로 만들어서 사용합시다.

    ParsingControlPattern();
    ParsingAccessKey();
    ParsingAcceleratorKey();
}
private void ParsingControlPattern()
{

리스트 뷰의 아이템 항목을 모두 지웁니다.

    lv_control.Items.Clear();

컨트롤 패턴 열거형을 이용하여 각각의 컨트롤 유형별로 개수를 파악합니다.

    for (ENUM_CONTROL ctrl = 0; ctrl < ENUM_CONTROL.MAX_CONTROL; ctrl++)
    {

파악한 컨트롤 개수와 컨트롤 패턴 이름으로 ListViewItem 개체를 만들어 항목에 추가합니다.

        int count = aeproject.GetControlPatternCount(ctrl);
        string[] name_count = new string[2];
        name_count[0] = ctrl.ToString();
        name_count[1] = count.ToString();
        lv_control.Items.Add(new ListViewItem(name_count));
    }
}
private void ParsingAccessKey()
{

리스트 뷰의 모든 항목을 지웁니다.

    lv_accesskey.Items.Clear();

평가 프로젝트 개체에게 Access 키 목록을 요청합니다.

    List<string[]> item_list = aeproject.GetAccessKeyItemList();

Access 키 목록을 리스트 뷰 항목에 추가합니다.

    foreach (string[] item in item_list)
    {
        lv_accesskey.Items.Add(new ListViewItem(item));
    }
}
private void ParsingAcceleratorKey()
{

리스트 뷰의 모든 항목을 지웁니다.

    lv_acceleratorkey.Items.Clear();

평가 프로젝트 개체에게 Accelerator 키 목록을 요청합니다.

    List<string[]> item_list = aeproject.GetAcceleratorKeyItemList();

Accelerator 키 목록을 리스트 뷰 항목에 추가합니다.

    foreach (string[] item in item_list)
    {
        lv_acceleratorkey.Items.Add(new ListViewItem(item));
    }
}

저장하기 버튼 클릭 이벤트 핸들러를 등록합니다. 저장하는 기능은 저장하고 끝내기 버튼을 클릭했을 때도 수행해야 하므로 Save 메서드를 만들어서 이를 호출합니다.

private void btn_save_Click(object sender, EventArgs e)
{
    Save();
}
private bool Save()
{

저장할 폴더를 선택하기 위해 폴더 브라우저 대화상자를 생성하여 띄웁니다.

    FolderBrowserDialog fbdlg = new FolderBrowserDialog();
    fbdlg.Description = "저장할 폴더를 선택하세요.";
    if (fbdlg.ShowDialog() == DialogResult.OK)
    {

평가 프로젝트 개체의 Save 메서드에 선택한 폴더를 입력 인자로 전달합니다.

        aeproject.Save(fbdlg.SelectedPath);
        return true;
    }
    return false;
}

끝내기 버튼 클릭 이벤트 핸들러를 등록하고 EndProject 메서드를 만들어서 이를 호출합니다.

private void btn_end_Click(object sender, EventArgs e)
{
   EndProject();
}
private void EndProject()
{

평가 프로젝트 개체의 End 메서드를 호출합니다.

    aeproject.End();

그리고 컨트롤의 Dispose 메서드를 호출하여 자원을 반납합니다.

    this.Dispose();
}

저장하고 끝내기 버튼의 클릭 이벤트 핸들러를 등록합니다.

private void btn_save_end_Click(object sender, EventArgs e)
{

Save 메서드를 호출하고 성공하면 프로젝트를 종료합니다.

    if (Save())
    {
        EndProject();
    }
}
using System;
using System.Windows.Forms;
using System.Collections.Generic;
namespace 접근성_평가_도우미
{
    public partial class ProjectInfoControl : UserControl
    {
        AccEvalProject aeproject;
        public ProjectInfoControl(AccEvalProject aeproject)
        {
            InitializeComponent();
            this.aeproject = aeproject;
        }
        private void ProjectInfoControl_Load(object sender, EventArgs e)
        {
            lb_title.Text = aeproject.Title;            
            lb_ui_cnt.Text = aeproject.UICount.ToString();
            lb_noname_cnt.Text = aeproject.NonameCount.ToString();
            ParsingControlPattern();
            ParsingAccessKey();
            ParsingAcceleratorKey();
        }
        private void ParsingControlPattern()
        {
            lv_control.Items.Clear();
            for (ENUM_CONTROL ctrl = 0; ctrl < ENUM_CONTROL.MAX_CONTROL; ctrl++)
            {
                int count = aeproject.GetControlPatternCount(ctrl);
                string[] name_count = new string[2];
                name_count[0] = ctrl.ToString();
                name_count[1] = count.ToString();
                lv_control.Items.Add(new ListViewItem(name_count));
            }
        }
        private void ParsingAccessKey()
        {
            lv_accesskey.Items.Clear();
            List<string[]> item_list = aeproject.GetAccessKeyItemList();            
            foreach (string[] item in item_list)
            {
                lv_accesskey.Items.Add(new ListViewItem(item));
            }
        }
        private void ParsingAcceleratorKey()
        {
            lv_acceleratorkey.Items.Clear();
            List<string[]> item_list = aeproject.GetAcceleratorKeyItemList();
            
            foreach (string[] item in item_list)
            {
                lv_acceleratorkey.Items.Add(new ListViewItem(item));
            }
        }
        private void btn_save_Click(object sender, EventArgs e)
        {
            Save();
        }
        private bool Save()
        {
            FolderBrowserDialog fbdlg = new FolderBrowserDialog();
            fbdlg.Description = "저장할 폴더를 선택하세요.";
            if (fbdlg.ShowDialog() == DialogResult.OK)
            {
                aeproject.Save(fbdlg.SelectedPath);
                return true; 
            }
            return false;
        }
        private void btn_end_Click(object sender, EventArgs e)
        {
            EndProject();
        }
        private void EndProject()
        {
            aeproject.End();
            this.Dispose();
        }
        private void btn_save_end_Click(object sender, EventArgs e)
        {
            if (Save())
            {
                EndProject();
            }
        }
    }
}

[소스 10.12] ProjectInfoControl.cs