프로그래밍 기술/소프트웨어 접근성, UI 자동화

9. 접근성 평가 도구 만들기 - 12. EvalManager 클래스 구현

언제나휴일 2016. 10. 27. 16:30
반응형

9.2.9 EvalManager 클래스

 

 접근성 평가 도우미는 사용자와 상호작용하는 폼과 평가에 필요한 개체를 관리하는 부분의 관계를 느슨하게 작성합니다. EvalManager 클래스는 폼의 명령을 받아 필요한 작업을 수행하거나 폼의 필요한 정보를 제공하는 역할을 하는 클래스입니다.

 

 EvalManager 개체는 접근성 평가 도우미에 하나만 있으면 되므로 단일체 패턴을 적용합시다.

class EvalManager

{

    static EvalManager singleton;

    public static EvalManager Manager

    {

       get

       {

            return singleton;

        }

    }

    static EvalManager()

    {

        singleton = new EvalManager();

    }

    EvalManager()

    {

    }

}

 

 EvalManager 클래스에는 프로젝트를 생성하였을 이를 통보받기를 원하는 곳에서 이벤트 핸들러를 설정할 있게 합니다. 그리고 접근성 평가 프로젝트를 변경 이벤트 핸들러도 설정할 있게 합니다.

public event MakeProjectEventHandler MakedProject = null;

public event MakeProjectEventHandler ChangedProject = null;

 

 

 

 

 테이블의 구조를 저장해 놓을 폴더와 테이블 이름을 상수 멤버로 선언합니다. 그리고 현재 평가 프로젝트 개체와 프로젝트 명과 프로젝트 개체를 쌍으로 하는 사전 및 프로젝트 테이블을 보관할 DataSet  개체를 멤버로 선언합니다.

const string cfg_dir = "./Configure/";

public const string CFGPropertyTableName = "UI 속성";

AccEvalProject currentpro = null;

Dictionary<stringAccEvalProject> project_dic = 

           new Dictionary<stringAccEvalProject>();

DataSet project_ds = new DataSet();

 

 프로젝트 DataSet 개체를 참조하는 속성과 현재 프로젝트 테이블을 참조하는 속성, 프로젝트 개수, 현재 프로젝트와 프로젝트 명을 참조하는 속성을 제공합니다.

public DataSet ProjectDataSet

{

    get{    return project_ds;    }

}

public DataTable ProjectTable

{

    get{    return currentpro.Table;    }

}

public int ProjectCount

{

    get{   return ProjectDataSet.Tables.Count;    }

}

public AccEvalProject CurrentProject

{

    get{   return currentpro;    }

}

public string ProjectTitle

{

    get{    return currentpro.Title;    }

}

 

 

 

 

 현재 프로젝트를 설정하는 메서드를 제공합니다. 입력인자로 프로젝트 제목을 받아 프로젝트를 확인하여 프로젝트 선택이 바뀐 것을 이벤트 핸들러로 통보합니다.

public void SetCurrentProject(string title)

{

    try

    {

        currentpro = project_dic[title];

        if (ChangedProject != null)

        {

            ChangedProject(thisnew MakeProjectEventArgs(currentpro));

        }

    }

    catch { }

}

 

 프로젝트를 생성하는 메서드에서는 프로젝트 명과 평가할 프로세스, 요소를 발견했을 전달할 대리자와 래핑한 자동화 요소를 인자로 받습니다. 그런데 평가 프로젝트를 만드는 과정은 서브 자동화 요소를 검색하는 과정 등이 필요하여 비동기적으로 호출할 있는 메서드를 제공할게요. 비동기로 제공하기 위해 대리자를 선언하고 이를 이용하여 프로젝트를 생성하는 메서드를 호출하게 합시다.

delegate void MakeProjectDele(string title, EHProcess ehprocess,

         AddFindElementDele find_dele, EHAutoElem eae);

public void MakeProjectAsync(string title, EHProcess ehprocess,

         AsyncCallback EndProcess, AddFindElementDele find_dele, EHAutoElem eae)

{

    MakeProjectDele dele = new MakeProjectDele(MakeProject);

    dele.BeginInvoke(title,  ehprocess,find_dele,eae, EndProcess, null);

}

 

 

 

 프로젝트를 생성하는 메서드에서는 테이블을 생성하고 평가 프로젝트를 생성합니다. 그리고 평가 프로젝트를 마쳤을 때의 이벤트 핸들러를 등록하고 초기 작업을 진행합니다. 외에 프로젝트 사전에 등록하는 것과 프로젝트 생성하였음을 이벤트 핸들러로 통보합니다. 평가 프로젝트를 끝났음을 통보받은 이벤트 핸들러에서는 사전과 DataSet에서 제거하고 프로젝트 변경 이벤트 핸들러를 이용하여 이를 통보합니다.

 

public void MakeProject(string title, EHProcess ehprocess, 

                    AddFindElementDele find_dele, EHAutoElem eae)

{

    DataTable dt = new DataTable();

    dt.ReadXmlSchema(cfg_dir + CFGPropertyTableName + ".xsd");

    dt.TableName = title;

    ProjectDataSet.Tables.Add(dt);

    currentpro = new AccEvalProject(title,  dt, ehprocess);

    currentpro.EndEvalProject += new EventHandler(currentpro_EndEvalProject);

    currentpro.InitProcessMode(find_dele);

    project_dic[title] = currentpro;

    if (MakedProject != null)

    {

        MakedProject(thisnew MakeProjectEventArgs(currentpro));

    }

}

void currentpro_EndEvalProject(object sender, EventArgs e)

{

    AccEvalProject aep = sender as AccEvalProject;

    if (aep != null)

    {

        project_dic.Remove(aep.Title);

        ProjectDataSet.Tables.Remove(aep.Title);

        currentpro = null;

        if (ChangedProject != null)

        {

            ChangedProject(thisnew MakeProjectEventArgs(null));

        }

    }

}

 

반응형