본문 바로가기
프로그래밍/설계공부

제 8 장. 메뉴 확장하기

by 건우아빠유리남편 2009. 7. 23.
반응형

제 8 장. 메뉴 확장하기

메뉴 확장의 기본 개념

사용자가 정의한 Add-In의 기능을 호출하는 방법을 제공하기 위하여 StarUML메뉴 시스템을 확장할 수 있는데, 이를 위해서 각 Add-In 개발자는 메뉴 확장 파일을 제공해야 한다. 이와 관련된 절차는 크게 다음과 같다.

  1. 메뉴 확장 파일 작성
  2. 메뉴 확장 파일 등록

Add-In 메뉴 확장 파일(*.mnu)은 XML 형식의 텍스트 파일로, StarUML에 플러그인(plug-in)되는 각 Add-In은 반드시 하나의 메뉴 확장 파일을 제공해야 한다. StarUML은 이 메뉴 파일이 정의하는 내용을 바탕으로 어플리케이션의 메인 메뉴(main menu)와 팝업 메뉴(popup menu)를 확장하여 새로운 메뉴 항목들을 추가하고, 각 메뉴 항목이 클릭되었을 때 정의된 동작을 수행하거나 관련 있는 Add-In 개체로 메세지를 전파한다. StarUML Add-In 메뉴 확장 파일에는 다음과 같은 사항들이 정의될 수 있다.

  • 추가될 새로운 메뉴 항목들
  • 메인 메뉴 항목과 팝업 메뉴 항목의 구분
  • 새로운 메뉴 항목이 추가될 StarUML 기본 메뉴 항목
  • 메뉴 항목의 표현되는 이름과 핫-키
  • 메뉴 항목이 활성화되거나 비활성화되는 시점
  • 메뉴 항목이 선택되었을 때 실행되는 스크립트 파일
  • 메뉴 항목이 선택되었을 때 Add-In 개체로 전달되는 메뉴 항목의 ID
  • 메뉴 항목의 상위 그룹 메뉴 상의 위치
  • 각 메뉴 항목에 대한 아이콘 파일

메뉴 확장 파일은 XML 형식으로 기술되며 'Well-formed document' 여야 하고 또한 유효(valid)해야 한다. 이 장에서는 메뉴 확장 파일이 유효하기 위해 준수해야 하는 XML DTD(Document Type Definition)와 메뉴 확장 파일의 구조를 설명하며, 또한 관련된 예제를 제공한다.

노트: Add-In 메뉴 확장 파일은 반드시 *.mnu 확장자를 가져야 하며, StarUML™ 모듈 디렉토리(<install-dir>\modules) 하부 디렉토리에 존재해야 한다.

메뉴 확장 파일 작성하기

메뉴 확장 파일의 DTD

StarUML Add-In 메뉴 확장 파일은 정의된 DTD를 준수하는 유효한 XML 문서여야 한다. 다음은 메뉴 확장 파일을 위해 정의된 DTD 전체이다.

<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT NAME (#PCDATA)>
<!ELEMENT VERSION (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ELEMENT COMPANY (#PCDATA)>
<!ELEMENT COPYRIGHT (#PCDATA)>

<!ELEMENT MAINITEM (MAINITEM)*>
<!ATTLIST MAINITEM
          base (FILE|EDIT|FORMAT|MODEL|VIEW|TOOLS|HELP|UNITS|IMPORT|EXPORT|NEW_TOP) #IMPLIED
          caption CDATA #REQUIRED
          index CDATA #IMPLIED
          beginGroup CDATA #IMPLIED
          script CDATA #IMPLIED
          actionId CDATA #IMPLIED
          availableWhen (ALWAYS|PROJECT_OPENED|MODEL_SELECTED|VIEW_SELECTED|UNIT_SELECTED|DIAGRAM_ACTIVATED) “PROJECT_OPENED”
          iconFile CDATA #IMPLIED>

<!ELEMENT POPUPITEM (POPUPITEM)*>
<!ATTLIST POPUPITEM
          location (EXPLORER|DIAGRAM|BOTH) “BOTH”
          caption CDATA #REQUIRED
          index CDATA #IMPLIED
          beginGroup CDATA #IMPLIED
          script CDATA #IMPLIED
          actionId CDATA #IMPLIED
          availableWhen (ALWAYS|PROJECT_OPENED|MODEL_SELECTED|VIEW_SELECTED|UNIT_SELECTED|DIAGRAM_ACTIVATED) “PROJECT_OPENED”
          iconFile CDATA #IMPLIED>

<!ELEMENT MAIMENU (MAINITEM)*>
<!ELEMENT POPUPMENU (POPUPITEM)*>

<!ELEMENT HEADER (NAME?, VERSION?, DESCRIPTION?, COMPANY?, COPYRIGHT?)>
<!ELEMENT BODY (MAINMENU?, POPUPMENU?)>

<!ELEMENT ADDINMENU (HEADER?, BODY)>
<!ATTLIST ADDINMENU addInID CDATA #REQUIRED>

주의: 모든 XML 요소(Element)의 이름은 대문자로만 기술해야 하며, 속성(Attribute)의 이름은 모두 소문자로 시작한다. 그리고 미리 정의된 심벌(Symbol) 값은 대문자와 '_'(underscore)로 구성된다. 메뉴 파일 전체에 걸쳐 이와 같은 대소문자 규칙을 지켜야 하며 미리 정의된 심벌 값들을 정확하게 사용해야 한다.

메뉴 확장 파일의 개략적 구조

메뉴 확장 파일은 XML 문서의 규칙을 따르며, 사용자 정의 메뉴 항목들은 'ADDINMENU' 요소 내에 기술된다.

<?xml version="1.0" encoding="..."?>

<ADDINMENU addInID="...">
  <HEADER>...</HEADER>
  <BODY>...</BODY>
</ADDINMENU>
  • encoding 속성: XML 문서의 인코딩 속성 값을 지정한다 (e.g. UTF-8, EUC-KR). 이 속성의 값에 대해서는 XML 관련 자료를 참조하기 바란다.
  • addInID 속성: 각 Add-In의 고유한 명칭을 기술한다. 이것은 다른 Add-In과 구분될 수 있는 유일한 것이어야 하며 회사명이나 제품명과 연결하여 사용할 것을 권장한다. (e.g. StarUML.StandardAddIn)
  • HEADER 요소: Add-In에 대한 기본 정보를 기술한다. Header Contents 섹션 참조.
  • BODY 요소: 실제 메뉴 항목들에 대한 기술 부분이다. Body Contents 섹션 참조.

Header Contents

메뉴 확장 파일의 Header 요소에서는 Add-In과 메뉴 파일에 대한 정보를 기술한다. Header 요소에 기술되는 내용은 실제 메뉴 항목의 구성에 영향을 미치지 않으며 생략이 가능하지만, 자기 설명적인 메뉴 확장 파일을 제공하기 위해 포함시킬 것이 권장된다.

<HEADER>
  <NAME>...</NAME>
  <VERSION>...</VERSION>
  <DESCRIPTION>...</DESCRIPTION>
  <COMPANY>...</COMPANY>
  <COPYRIGHT>...</COPYRIGHT>
</HEADER>
  • NAME 요소: Add-In의 설명적인 이름을 기술한다. (문자열 값)
  • VERSION 요소: 버전 정보를 기술한다. (문자열 값)
  • DESCRIPTION 요소: Add-In에 대한 짧은 설명을 기술한다. (문자열 값)
  • COMPANY 요소: Add-In을 개발한 회사/개인의 정보를 기술한다. (문자열 값)
  • COPYRIGHT 요소: 저작권에 대한 공지를 기술한다. (문자열 값)

BODY CONTENTS

메뉴 확장 파일의 바디 요소에는 실제로 추가될 메뉴 항목(menu item)들이 기술된다. 따라서 주의 깊게 기술되어야 하는 부분이다.

<BODY>
  <MAINMENU>
    <MAINITEM>...</MAINITEM>
    <MAINITEM>...</MAINITEM>
  </MAINMENU>

  <POPUPMENU>
    <POPUPITEM>...</POPUPITEM>
    <POPUPITEM>...</POPUPITEM>
  </POPUPMENU>
</BODY>

Body 요소는 크게 메인 메뉴에 대한 정의와 팝업 메뉴에 대한 정의 부분으로 구성된다.

  • MAINMENU 요소: 메인 메뉴에 추가될 메뉴 항목들이 아래에 기술된다.
  • POPUPMENU 요소: 팝업 메뉴에 추가될 메뉴 항목들이 아래에 기술된다.
  • MAINITEM 요소: 실제 메뉴 항목에 대한 정보를 기술한다. (메인 메뉴)
  • POPUPITEM 요소: 실제 메뉴 항목에 대한 정보를 기술한다. (팝업 메뉴)

메인 메뉴의 항목과 팝업 메뉴의 항목을 구분하여 기술하는데, 각 Add-In이 제공하는 기능에 따라 메뉴 항목을 메인 메뉴에만 추가하거나 팝업 메뉴에만 추가할 수 있다. MAINMENU 요소와 POPUPMENU 요소는 각각 생략될 수 있지만 두 요소 중에서 최소한 하나의 요소는 존재해야 한다. 동일한 기능을 수행하는 메뉴 항목이 메인 메뉴와 팝업 메뉴 두 곳에 모두 추가되어야 하는 경우에는, MAINMENU 와 POPUPMENU에 모두 기술한다. 이 경우 두 항목의 script 속성이나 actionId 속성을 동일하게 지정하면 된다. 예외적으로, StarUML의 기본 메뉴 항목 중에서 [Format], [Unit] 항목과 같이 메인 메뉴와 팝업 메뉴에서 공유되는 기본 메뉴 항목의 하위 메뉴 항목을 추가하는 경우에는 MAINMENU 에만 기술하도록 한다.

MAINMENU

MAINMENU  요소는 여러 개의 MAINITEM  요소를 포함할 수 있다. 각각의 MAINITEM 요소는 실제로 하나의 메인 메뉴 항목이 된다. 하위 메뉴 항목을 가지는 그룹 메뉴 항목을 정의하는 경우 MAINITEM 요소는 다시 여러 개의 MAINITEM 요소를 포함할 수 있다.

<MAINITEM base=”...” caption=”...” index=”...” beginGroup=”...” script=”...” actionId=”...” availableWhen=”...” iconFile=”...”>
  <MAINITEM>...</MAINITEM>
  <MAINITEM>...</MAINITEM>
</MAINITEM>
속성 설명 값의 범위 생략 여부
base StarUML 기본 메뉴 항목 중에서 이 메뉴 항목이 추가될 상위 메뉴 항목을 지정한다.
이 속성은 다른 MAINITEM 요소의 하위 MAINITEM 요소인 경우에는 의미가 없다.
FILE, EDIT, FORMAT, MODEL, VIEW, TOOLS, HELP, UNITS, IMPORT, EXPORT, NEW_TOP 중의 하나여야 한다. * 이 값이 생략되면 [Tools] 메뉴의 하위 메뉴 항목으로 추가된다.
caption 메뉴 항목의 표현되는 이름을 기술한다.
이 값은 핫-키(Hot key or Shortcut)를 포함할 수 있다. 핫-키를 정의하는 방법은 이 속성의 값 다음에 '&' 와 함께 핫-키로 지정할 문자를 기록하는 것이다. 단, StarUML 프로그램은 정의된 핫-키가 다른 메뉴 항목과 중복되는지 여부를 검사하지 않는다.
문자열 값 이 값은 생략될 수 없다.
index 상위 메뉴의 하위 메뉴 항목들에 대한 이 메뉴 항목의 순서를 지정한다. 예를 들어 이 값이 '0' 이면 base 메뉴 항목의 첫 번째 하위 메뉴 항목이 된다. 이 속성의 값이 다른 메뉴 항목의 값과 충돌되는 경우 정확하게 표현되지 않을 가능성이 있다. 0 이상의 정수 값 일반적으로 생략되며, 이 값이 생략되면 Add-In이 등록된 순서대로 추가된다.
beginGroup 이 메뉴 항목의 앞에 구분자(separator)를 먼저 추가할 지를 지정한다. TRUE, FALSE 중의 하나여야 한다. 생략되면 FALSE
script 이 메뉴 항목이 선택되었을 때 스크립트를 실행하게 하려면 이 속성의 값에 해당 스크립트 파일의 경로와 이름을 지정한다. 이 때 경로는 Add-In 프로그램이 위치하는 폴더에 대한 상대 경로 값이다. 이 속성의 값으로 웹 사이트의 URL을 지정할 수도 있다. 문자열 값 생략 가능
actionId 이 메뉴 항목이 선택된 경우 COM 개체에서 이것을 처리하려는 경우 이 속성의 값으로 '0' 보다 큰 정수를 지정한다. Add-In이 하나 이상의 메뉴 항목을 추가하는 경우, 각 메뉴 항목의 actionId 값을 다르게 지정하여 이들을 구분할 수 있다. 0 보다 큰 정수 값 생략 가능
availableWhen 메뉴 항목이 활성화(Enabled)되는 경우를 지정한다. ALWAYS, PROJECT_OPENED, MODEL_SELECTED, VIEW_SELECTED, UNIT_SELECTED, DIAGRAM_ACTIVATED 중의 하나여야 한다. ** 생략되면 PROJECT_OPENED가 지정된다.
iconFile 이 메뉴 항목에 대한 아이콘 파일이 있는 경우 아이콘 파일에 대한 경로와 파일 이름을 지정한다. 이 때 경로는 Add-In  프로그램이 위치하는 폴더에 대한 상대 경로 값이다. 문자열 값 생략 가능

노트: 메뉴 항목이 하위 메뉴 항목들을 구룹화(grouping)하는 경우가 아닌 경우에는 script, actionId 속성 중에서 최소한 하나의 값이 지정되어야 한다.

*  base 속성 값의 범위

  • FILE:  [File] 메뉴의 하위 메뉴 항목으로 추가된다.
  • EDIT:  [Edit] 메뉴의 하위 메뉴 항목으로 추가된다.
  • FORMAT:  [Format] 메뉴의 하위 메뉴 항목으로 추가된다.
  • MODEL:  [Model] 메뉴의 하위 메뉴 항목으로 추가된다.
  • VIEW:  [View] 메뉴의 하위 메뉴 항목으로 추가된다.
  • TOOLS:  [Tools] 메뉴의 하위 메뉴 항목으로 추가된다. (default)
  • HELP:  [Help] 메뉴의 하위 메뉴 항목으로 추가된다.
  • UNITS:  [File]->[Unit] 메뉴의 하위 메뉴 항목으로 추가된다.
  • IMPORT:  [File]->[Import] 메뉴의 하위 메뉴 항목으로 추가된다.
  • EXPORT:  [File]->[Export] 메뉴의 하위 메뉴 항목으로 추가된다.
  • NEW_TOP:  새로운 최상위 메인 메뉴 항목을 생성하는 경우에는 이 값을 사용한다.

**  availableWhen 속성 값의 범위

  • ALWAYS: StarUML 어플리케이션이 실행되는 동안 항상 활성화된다.
  • PROJECT_OPENED: 프로젝트 요소가 있는 경우에 항상 활성화된다. (default)
  • MODEL_SELECTED: 모델 요소가 선택된 경우에만 활성화된다.
  • VIEW_SELECTED: 뷰 요소가 선택된 경우에만 활성화된다.
  • UNIT_SELECTED: 유닛으로 분리된 요소가 선택되었을 때만 활성화된다.
  • DIAGRAM_ACTIVATED: 열려있는 다이어그램이 있으면 활성화된다.
  • ALWAYS: Enabled as long as the StarUML™ application is running.
  • PROJECT_OPENED: Enabled when a project element is present. (default)
  • MODEL_SELECTED: Enabled when a model element is selected.
  • VIEW_SELECTED: Enabled when a view element is selected.
  • UNIT_SELECTED: Enabled when a unit element is selected.
  • DIAGRAM_ACTIVATED: Enabled when a diagram is opened.

POPUPMENU

POPUPMENU 요소는 여러 개의 POPUPITEM 요소를 포함할 수 있다. 각각의 POPUPITEM 요소는 실제로 하나의 팝업 메뉴 항목이 된다. 하위 메뉴 항목을 가지는 메뉴 항목을 정의하는 경우 POPUPITEM 요소는 다시 여러 개의 POPUPITEM 요소를 포함할 수 있다.

<POPUPITEM location=”...” caption=”...” index=”...” beginGroup=”...” script=”...” actionId=”...” availableWhen=”...” iconFile=”...”>
  <POPUPITEM>...</POPUPITEM>
  <POPUPITEM>...</POPUPITEM>
</POPUPITEM>
속성 설명 값의 범위 생략 여부
location 팝업 메뉴 항목이 추가될 팝업 메뉴 시스템을 지정한다.
이 속성은 다른 POPUPITEM 요소의 하위 POPUPITEM 요소인 경우에는 의미가 없다.
EXPLORER, DIAGRAM, BOTH 중의 하나여야 한다. * 이 값이 생략되면 BOTH로 지정된다.
caption 메뉴 항목의 표현되는 이름을 기술한다.
이 값은 핫-키(Hot key or Shortcut)를 포함할 수 있다. 핫-키를 정의하는 방법은 이 속성의 값 다음에 "&" 와 함께 핫-키로 지정할 문자를 기록하는 것이다. 단, StarUML 프로그램은 정의된 핫-키가 다른 메뉴 항목과 중복되는지 여부를 검사하지 않는다.
문자열 값 이 값은 생략될 수 없다.
index 상위 메뉴의 하위 메뉴 항목들에 대한 이 메뉴 항목의 순서를 지정한다. 예를 들어 이 값이 '0' 이면 base 메뉴 항목의 첫 번 째 하위 메뉴 항목이 된다. 이 속성의 값이 다른 메뉴 항목의 값과 충돌되는 경우 정확하게 표현되지 않을 가능성이 있다. 0 이상의 정수 값 일반적으로 생략되며, 이 값이 생략되면 Add-In이 등록된 순서대로 추가된다.
beginGroup 이 메뉴 항목의 앞에 구분자(separator)를 먼저 추가할 지를 지정한다. TRUE, FALSE 중의 하나여야 한다. 생략되면 FALSE
script 이 메뉴 항목이 선택되었을 때 스크립트를 실행하게 하려면 이 속성의 값에 해당 스크립트 파일의 경로와 이름을 지정한다. 이 때 경로는 Add-In 프로그램이 위치하는 폴더에 대한 상대 경로 값이다. 이 속성의 값으로 웹 사이트의 URL을 지정할 수도 있다. 문자열 값 생략 가능
actionId 이 메뉴 항목이 선택된 경우 COM 개체에서 이것을 처리하려는 경우 이 속성의 값으로 '0' 보다 큰 정수를 지정한다. Add-In이 하나 이상의 메뉴 항목을 추가하는 경우, 각 메뉴 항목의 actionId 값을 다르게 지정하여 이들을 구분할 수 있다. 0 보다 큰 정수 값 생략 가능
availableWhen 메뉴 항목이 활성화되는 경우를 지정한다. ALWAYS, PROJECT_OPENED, MODEL_SELECTED, VIEW_SELECTED, UNIT_SELECTED, DIAGRAM_ACTIVATED 중의 하나여야 한다. ** 생략되면 PROJECT_OPENED가 지정된다.
iconFile 이 메뉴 항목에 대한 아이콘 파일이 있는 경우 아이콘 파일에 대한 경로와 파일 이름을 지정한다. 이 때 경로는 Add-In  프로그램이 위치하는 폴더에 대한 상대 경로 값이다. 문자열 값 생략 가능

노트: 메뉴 항목이 하위 메뉴 항목들을 구룹화(grouping)하는 경우가 아닌 경우에는 script, actionId 속성 중에서 최소한 하나의 값이 지정되어야 한다.

*  location 속성 값의 범위

  • EXPLORER: 브라우저 창의 모델 탐색기 팝업 메뉴로 추가된다.
  • DIAGRAM: 다이어그램의 팝업 메뉴로 추가된다.
  • BOTH : 모델 탐색기 팝업 메뉴와 다이어그램 팝업 메뉴 모두에 추가된다. (default)

**  availableWhen 속성 값의 범위 - MAINMENU 요소의 경우와 동일하다.

메뉴 확장 파일의 예제

다음의 예는 StarUML 프로그램을 설치했을 때 함께 설치되는 StarUML 기본 확장팩의 메뉴 파일의 전체 내용이다.

<?xml version="1.0" encoding="UTF-8"?>

<ADDINMENU addInID="StarUML.StandardAddIn">
    <HEADER>
        <NAME>Default module of StarUML</NAME>
        <VERSION>1.0.0</VERSION>
        <DESCRIPTION>Default extension pack of Agora Plastic to convert diagram</DESCRIPTION>
        <COMPANY>Plastic Software, Inc.</COMPANY>
        <COPYRIGHT>Copyright (C) 2005 Plastic Software, Inc. All rights reserved.</COPYRIGHT>
    </HEADER>
    <BODY>
        <MAINMENU>
            <MAINITEM base="MODEL" caption="Convert Diagram" beginGroup="TRUE" availableWhen="MODEL_SELECTED">
            <MAINITEM caption="Convert Sequence(Role) to Collaboration(Role)" script="ConvSeq2Col.vbs"/>
            <MAINITEM caption="Convert Collaboration(Role) to Sequence(Role)" script="ConvCol2Seq.vbs"/>
        </MAINMENU>
    </BODY>
</ADDINMENU>

메뉴 확장 파일 등록하기

작성된 메뉴 확장 파일을 프로그램에서 인식하려면 메뉴 확장 파일을 StarUML™ 모듈 디렉토리(<install-dir>\modules) 하부 디렉토리로 옮겨야 한다. StarUML™은 프로그램 초기화 시에 모듈 디렉토리 하부를 검색하여 모든 메뉴 확장 파일들을 읽어 들인 후 프로그램에 자동 등록한다. 만약 메뉴 확장 파일이 문법에 맞지 않게 잘 못 작성되어 있거나, 확장자가 .mnu가 아닌 경우에는 메뉴 확장 파일을 정상적으로 읽어 들이지 않고 무시하게 될 것이다.
메뉴 확장 파일은 가급적이면 모듈 디렉토리 하부에 메뉴 확장 파일이 명시하고 있는 모듈을 담기 위한 디렉토리를 만들고 거기에 저장하기를 권장한다.

노트: 메뉴 확장을 더 이상 사용하지 않으려면 StarUML™ 모듈 디렉토리(<install-dir>\modules) 하부에서 삭제하면 된다.


반응형

댓글