# mkWidgets 1.3 Manual, Part 1 of 2

###### [訳註：源文が公式であり和訳は目安に過ぎない]
この算譜とその説明文を､どの様な目的にも､無料で､使用する事と､複写する事と､修正する事と､配布する事の許諾をここに認める｡著者は､どの様な目的に関しても､この算譜の適切性について､表明しない｡これは"あるがまま"で､明示的及び暗示的保障なしに提供される｡ この算譜の使用によって､その様な使用によって生じる損失に関する､どの様な要求や債務からも､著者が､免責され､且つ､保護される事に､使用者は同意する事になる｡
Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted. The author makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. By use of this software the user agrees to indemnify and hold harmless the author from any claims or liability for loss arising out of such use.

## 目次 CONTENTS

mkWidgets 1.3 -高次部品を記述する方法､及び､それらの蒐集｡第1部: 高次部品の構築方法(第2部) mkWidgets 1.3 - A method for writing metawidgets, and a collection of these. Part 1: How to build metawidgets (Part 2)

緒論 Introduction
高次部品命令 The Metawidget Command
特別命令 Special Commands
道具命令 Tool Commands
註意 Notes
用例 Examples
搭載法 Installation
変更履歴 Changes
Author

## 緒論 INTRODUCTION

metawidgetは幾つかの標準的部品で構成され､(殆ど)標準的部品の如く振舞う｡ metawidget内部とその全ての機能には､標準部品の個数に関する制限が無いので､metawidgetsは単純なコンボボックスから複雑な樹木制御として迄更にはもっと複雑な何かになり得る｡詳細はこの説明書の第二部を参照されたい｡ A metawidget is composed of several standard widgets and behaves like a standard widget itself (well, almost). Since there is no limit in regards to the number of standard widgets inside a metawidget and its overall functionality, metawidgets can be anything from as simple as a combobox to as complex as a treecontrol and more. See Part 2 of this manual for details.

mkWidgets 1.3は全体がTcl/Tkで記述され､他の何の拡張も要しない(Generic と mkClassesを要した､1.0版とは異なる)｡これは､二つのことを提供する: mkWidgets 1.3 is written entirely in Tcl/Tk and does not require any other extensions (unlike version 1.0, where mkGeneric and mkClasses was required). It provides two things:

- Metawidget梱包の提供により高次部品を非常に容易に記述する方法｡何か級と対照に似た何かを実装する為に名前空間を使う｡ A fairly easy method to write metawidgets, provided by the package Metawidget. It uses namespaces to implement something similar to classes and objects.
- 高次部品の集合､その内の幾つかは美しく活発である｡この集合は､"mkWidgets"梱包により積み込まれる､それら自身Metawidget梱包を要する｡ A collection of metawidgets, some of them being pretty snappy. This collection is loaded with the package "mkWidgets" which itself requests the Metawidget package.

Tk内の通常部品の主な性質は: The main characteristics of a regular widget in Tk are:

- 部品の級の実現物である, 譬えば｡ "釦".
- "部品命令"と呼ばれる手段があり得る｡
- "支持項目"と呼ばれる特性を有す､それは"構成設定"手段により制御される｡
- 樹枝状の階層構造になる｡即ち､それは一つの親と多数の子供を有す｡
- "destroy"命令により子供と一緒に破壊される
- 行事束縛を付けることができる｡
- pack命令と, place命令と grid命令の対象である｡
- It is an instance of a widget class, e.g. "Button".
- It can have methods, called "widget commands".
- It has properties, called "options" which are controlled by the method "configure".
- It is organized in a tree-shaped hierarchy, i.e. it has one parent and may have children.
- It is destroyed by the "destroy" command, including all children.
- It can have event bindings attached to it.
- It can be packed, placed and gridded.

Metawidget梱包は､通常Tk部品と殆ど同じ方法で振舞う高次部品の定義を許容する｡ 高次部品の属性は: The Metawidget package allows for the definition of metawidgets that behave almost the same way as regular Tk widgets. A metawidgets attributes are:

- "metawidget"命令により定義された級の実現物である
- "metawidget command"経由で定義された命令が可能
- "metawidget option"経由で定義された指示項目が可能
- 他の全ての部品の如く同じ階層構造内に定義される
- 他の全ての部品に似て"destroy"によって破壊される
- 他の全ての部品の如く行事束縛を有すことができる｡幾つかの制限を適用する
- pack命令と, place命令と grid命令の対象である｡子供に幾つかの制限が適用される｡
- It is an instance of a class defined with the command "metawidget"
- It can have commands, which are defined via "metawidget command"
- It has options, which are defined via "metawidget option"
- It is defined in the same hierarchy tree like all other widgets
- It is destroyed with "destroy" like all other widgets
- It can have event bindings like all other widgets. Some restrictions apply.
- It can be packed, placed and gridded. Some restrictions apply to children.

[訳註:冗長な箔付け文] 　 Metawidget梱包は基本的には､符号命令生成器である｡名前空間の取り扱いとTcl符号命令生成に注意しながら､かなり抽象的な言い方で､且つ新しい部品命令と指示項目を定義する簡易な方法で､高次部品を作り上げられる｡ The Metawidget package is basically a code generator. One can build metawidgets in a rather abstract and simple way by defining new widget commands and options, while the package takes care of namespace handling and Tcl code generation.

[訳註:冗長な箔付け文] 　 この版の新しい具合の良い特性は､metawidget export命令である｡ それは､特定の高次部品の為に､Metawidget梱包により､標準的Tcl符号命令を返す｡ この符号命令の応用譜への単純な集積により､mkWidgetsへの依存が除去でき得る｡ A nice new feature in this version is the metawidget export command. It returns the standard Tcl code that is generated by the Metawidget package for a particular metawidget. By simply integrating this code into an application, the dependency to mkWidgets can be eliminated.

## 高次部品命令 THE METAWIDGET COMMAND

Metawidgetは"metawidget"命令と､その副命令の"create"と,"proc"と, "option" と "command"により定義される｡それは､"delete"により削除され､情報は"info" か "names"で取り出せる｡ 　 A Metawidget is defined with the "metawidget" command and its subcommands "create", "proc", "option" and "command". It can be deleted with "delete", and information can be retrieved with "info" or "names".

### metawidget create ClassName InitProc ExitProc ?-type WidgetType? ?-default WidgetName? ?-command CommandName? ?args?

この命令はClassNameの名称を伴う新しい高次部品の級を生成する｡既存の命名規則に従い､ClassNameは大文字で始まる必要がある｡InitProcは､高次部品のそれぞれの実現値が評価される記述譜を指定する｡それは､高次部品を作り上げて指示項目とその他の情報を初期化する様な､どの様な高次部品をも生成する符号命令を含む｡現在の高次部品は､自動変数$thisの手段により参照される｡ExitProcは､高次部品が破壊されるときに評価される｡InitProcと同様に､高次部品の名前も変数$thisに保存される｡ExitProcは､通常､開いた通信路の如くどの様な原資も解放する｡ This command creates a new metawidget class with the name ClassName. According to existing naming conventions, ClassName must start with an uppercase letter. InitProc specifies a script that is evaluated on each instantiation of a metawidget. It usually contains code to create any internal widgets that make up the metawidget, and to initialize options and other state information. The current metawidget is referenced by means of the automatic variable $this. ExitProc is evaluated when a metawidget is destroyed. As with InitProc, the metawidget's name is stored in the variable $this. The ExitProc usually releases any resources such as open channels.

それぞれの高次部品は､他の全ての部品を含む部品を有する｡この部品は自動的に生成され､初期設定では不可視の枠である｡ -type 指示項目により､異なる部品型も指定できる､譬えば最高水準部品｡ Each metawidget has a widget that encloses all other widgets. This widget is automatically created and is an invisible frame by default. By means of the -type option, a different widget type can be specified, for instants a toplevel widget.

-default 指示項目は､ 標準的な高次部品命令を構成設定する為の呼び出しを指定し､もし､それらが"metawidget option"によって明示的に定義されてない場合にcgetがそれを出力先変更する｡ 又､"metawidget command"により明示的に定義されない場合､全ての命令は初期設定の部品に再指示される｡ WidgetNameは､それを取り囲む部品への相対的な内部部品の内の一つの名称でなければならない｡ もし､初期設定の部品がどれも指定されない場合､取り囲む部品が採られる｡ The -default option specifies where calls to the standard metawidget commands configure and cget shall be redirected to, if they are not explicitely defined with "metawidget option". Also, all commands not explicitely defined with "metawidget command" will be redirected to the default widget. WidgetName must be the name of one of the internal widgets, relative to its enclosing widget. If no default widget is specified, the enclosing widget is taken.

-command 指示項目は､新しい部品命令の名前は何かを指定する｡初期設定では､高次部品の級名と同じで､全部小文字になっている｡ The -command option specifies what the name of the new widget command shall be. By default, it is the same as the metawidget's ClassName, but all in lowercase letters.

更に､任意の個数の 指示項目-値 対が指定され得る｡それらは､直接に取り囲む部品に適用され､従って､枠や､何であれ -type 指示項目により指定される部品型への指示値が許容されねばならない｡ In addition, an arbitrary number of option-value pairs may be specified. They will directly be applied to the enclosing widget and hence must be allowed option values for a frame or whatever widget type has been specified by means of the -type option.

### metawidget proc ClassName ProcName Args Body

この命令は､高次部品に関連する手続き函数を定義する｡それは､通常の手続き関数の様に定義される､即ち､名称と引数のリストと本体を有す｡ "metawidget create"命令からのInitProcとExitProcの如く､自動変数$thisは現在の高次部品を表す｡高次部品手続き函数は全く同じの部品即値の他の高次手続き函数内部からのみ呼出せる｡それは､高次部品の指示項目 及び/又は 命令に関連する実装符号命令に使われる｡ This command defines a procedure that is associated with a metawidget. It is defined just like a regular procedure, i.e. it has a name, a list of arguments, and a body. As with the InitProc and the ExitProc from the "metawidget create" command, the automatic variable $this represents the current metawidget. Metawidget procedures can be called only from within another metawidget procedure of the very same widget instance. They are used to implement code that is associated to metawidget options and/or commands.

### metawidget command ClassName CommandName ProcName

これは､高次部品命令を定義し､そして､高次部品手続き関数と関連付ける｡ 高次部品命令は通常の部品命令と同一であり､又､".mybutton invoke"の如く､部品名の直後に指定される｡ 高次命令が呼ばれた時､その関連手続き函数が実行され､其処では､命令の後ろに指定され得る全ての引数を渡してる｡註意すべきは､縦え高次部品命令が指定されない場合も､猶初期設定部品の為に存在する高次部品はすべての命令を受け容れる｡ This defines a metawidget command and associates it with a metawidget procedure. Metawidget commands are identical to regular widget commands and are specified right after the widget name, like in ".mybutton invoke". When a metawidget's command is called, its associated procedure is executed, hereby passing all arguments that might have been specified after the command. Note that even if no metawidget commands are defined, a metawidget will still accept all commands that exist for its default widget.

### metawidget option ClassName OptionName ?SetProc? ?GetProc?

これは､高次部品の指示項目を定める｡ 高次部品の指示項目は､特別の処理を要求するものである､即ち､それらは多くの場合､その内部部品のどの実際の指示項目とも異なる｡ 高次部品命令と同じく､ その様な高次部品の定義された指示項目を持たない高次部品は､高次部品の初期設定部品に適用される全ての指示項目を猶受け入れることになる｡ This defines a metawidget option. Metawidget options are those that require special processing, i.e. they are in most cases not a real option of any of its internal widgets. As with metawidget commands, a metawidget that has no such metawidget options defined will still accept all options that apply to the metawidget's default widget.

高次部品の指示項目を定義する三つの方法がある: 部品-変数(下を参照)による方法､ 高次部品の手続き函数による方法､それら両者の組合せ方法: There are three ways to define metawidget options: By means of a widget-variable (see below), by means of a metawidget procedure or with a combination of both:

幾つかの指示項目は即時の処理を要しない｡それは後の参照のための変数内の値をっ保存することで十分である｡用例は通常の釦の-command指示項目である: この指示項目が設定された時､何も起こらない｡その様な種類の高次部品の指示項目は､SetProc や GetProc指示無しに生成される｡ 高次部品は､単純に指示項目と同じ名前を有する部品-変数内の値を保存する｡ Some options do not require immediate processing. It is rather sufficient to store their value in a variable for later reference. An example is the -command option of a regular button: When this option is set, nothing happens. A metawidget option of that kind is created without specifying SetProc and GetProc. The metawidget will simply store the value in a widget-variable that has the same name as the option.

多くの場合､指示項目が設定される時に､実行されるべき符号命令を要する｡譬えば､-background 指示項目の値が変化したときに､釦の背景色の実際に変更するsome符号命令が､必要である｡ その､符号命令の部分が実際に変数内に新しい値を保存すると､その指示項目の現在の値は常にそこに見ることができる｡ これはSetProcが高次部品の手続き函数である様な､高次部品の指示項目の生成と等価である｡ いつも､この指示項目が設定されるとき､SetProcは､その唯一の引数として新しい指示項目値を伴って呼出される｡ もし､cget命令によって指示項目の値が取出される場合､実際の値がその部品-変数から採られる｡ 従って､SetProc mustは､この部品-変数に指示項目の新しい値を設定する｡ Many times, when an option is set, it requires code to be executed. For instants, there must be some code that actually changes a button's background color, when its value for the -background option is changed. If that piece of code eventually stores the new color in a variable, then the option's current value can always be looked up there. This is equivalent to creating a metawidget option where SetProc is a metawidget procedure. Every time this option is set, SetProc is called with the new option value as its only argument. If the option's value is retrieved by means of the cget command, the actual value is taken from its widget-variable. Therefore SetProc must set this widget-variable to the option's new value.

もし､更に､GetProcが指定される場合､それは､毎回指示項目の値がcget命令を伴って要求されて呼出される｡ GetProc mustは､ どの様な方法であれ､それが取出される時､及び､引数なしに呼出される時に､指示項目の値を返す｡ If, in addition, a GetProc is specified, then it is called every time the option's value is requested with the cget command. GetProc must return the option's value, in whatever way it is retrieved, and is called without arguments.

### metawidget delete ClassName

delete副命令は高次部品の級を消去する｡これは､その級の即値が､猶存在するときは､呼出されるべきではない｡ The delete subcommand deletes a metawidget class. This should not be called if instances of that class still exist.

### metawidget names

単純に現在定義された全ての高次部品を返す｡ This simply returns all currently defined metawidgets.

### metawidget info ClassName procs | commands | options

これは､手続き函数と､命令と､指定された級のための指示項目とを返す｡ それは､常に､それぞれの要素が手続き函数か命令か指示項目の定義の間に使われる引数の子リストになっているリストを返す｡ This returns the procedures, commands and options defined for the specified class. It always returns a list where each element is a sublist of the arguments that were used during the definition of the procs, commands or options.

### metawidget export ClassName

Metawidgetによって生成された通りに符号命令が返される｡ それは､梱包そのものに依存しない標準tclである｡ その結果､符号命令を標準的応用譜に単に渡す事により､ その定義もMetawidget梱包の源譜無しに､高次部品が使用できる｡ The code as generated by the Metawidget package is returned. It is standard Tcl with no dependencies to the package itself. Consequently, by simply pasting the code into a standard application, metawidgets can be used without their definition and without having to source the Metawidget package.

## 特別命令 SPECIAL COMMANDS

高次部品即値は基本的には対象志向算譜の世界内の対象に似ている｡ それは､構成子(InitProc)と､削除子(ExitProc)と､手段(命令)と､特性(指示項目)を有す｡ その結果､それは､何か個人変数と､部品-変数とここで呼ばれるものと､又､級-静的変数と､級-変数､に似ている｡ A metawidget instance is basically like an object in the object oriented programming world: It has a constructor (InitProc), a destructor (ExitProc), methods (the commands), and properties (the options). Consequently, it has something like private variables, here called widget-variables, and also class-static variables, called class-variables.

部品-変数は高次部品の即値instanceに固有である｡ 部品-変数は どの高次部品手続き函数内で設定と取出しができ､且つ､相互の呼出し内で状態を保持する｡ それらは､本当に大域的でも局所的でもないし､又､それぞれの即値の中に異なる値を有し得る｡ 部品-変数は"my"命令の組により制御される｡ A widget-variable is specific to an instance of a metawidget. Widget-variables can be set and retrieved in any metawidget procedure and remain state in-between calls. They are neither really global nor local, and can have a different value in each instance. Widget-variables are controlled by a set of "my" commands.

級-変数は､高次部品の級に固有である｡ 部品-変数の如く､級-変数は､どの高次部品手続き函数内でも設定取出しでき､且つ､相互呼出内で状態が保持できる｡ それらは､ 級の全ての即値について､正確に一度存在し､ 従って対象間でのデータ交換と､情報保存に適し､ 級の全ての即値に於て理想的である｡ 部品-変数は"our"命令の組により制御される｡ A class-variable is specific to a metawidget's class. As with widget-variables class-variables can be set and retrieved in any metawidget procedure and remain state in-between calls. They exist exactly once for all instances of a class and are therefore suited to exchange data between objects and to store information that is identical for all instances of a class. Widget-variables are controlled by a set of "our" commands.

### my WidgetVar ?NewValue?

部品-変数を設定又は取出しする｡ 標準的"set"命令に似て､ この変数の値を取り出し､又は新値を設定する為に変数の名前を伴って呼出すことができる｡ Sets or retrieves a widget-variable. Similar to the standard "set" command, it can be called with the name of a variable to retrieve the value of this variable or to set it to a new value.

### unmy WidgetVar ?WidgetVar ...?

部品-変数を取消す｡命令の名前に品が無いが､"unset"標準命令と良く等価である｡ Unsets widget-variables. Although the command's name seems nonsense, it is a nice equivalent to the standard command "unset".

### myarray option WidgetArray ?args?

スカラーの部品-変数だけでなく配列も定義できる｡ この命令は､ それが部品-配列に適用することを除いて､ 標準的"array"命令によく似ている｡ Not only scalar widget-variables can be defined, but also arrays. This command is just like the standard "array" command, except that it applies to widget-arrays.

### myinfo class, myinfo vars, myinfo exists WidgetVar

高次部品の級の名前や､現在定義されている部品-変数や､指定されたWidgetVarが存在する場合には､旗印を返す｡ Either returns the metawidget's class name, or all currently defined widget-variables, or a flag if the specified WidgetVar exists.

### our ClassVar ?NewValue?

級-変数を設定又は取出す｡ 標準"set"命令に似て､ 変数の名前を呼出す事により､ 変数の値を取り出すことや､新しい値を設定する事､ができる｡ Sets or retrieves a class-variable. Similar to the standard "set" command, it can be called with the name of a variable to retrieve the value of this variable or to set it to a new value.

### unour ClassVar ?ClassVar ...?

級-変数を削除する｡ 命令の名前に品が無いが､"unset"標準命令と良く等価である｡ Unsets class-variables. Although the command's name seems nonsense, it is a nice equivalent to the standard command "unset".

### ourarray option ClassArray ?args?

スカラーの 級-変数だけでなく配列も定義できる｡ この命令は､ それが 級-配列 に適用することを除いて､ 標準的"array"命令によく似ている｡ Not only scalar class-variables can be defined, but also arrays. This command is just like the standard "array" command, except that it applies to class-arrays.

### ourinfo vars, ourinfo exists ClassVar

全ての現在定義されている級変数や､ 指定されたClassVarが存在する場合には､旗印を返す｡ Either returns all currently defined class-variables, or a flag if the specified ClassVar exists.

## 道具命令 TOOL COMMANDS

幾つかの道具命令は又､全ての高次部品級内に移転される｡ それは､全て"mkw."で始まるか､実際にはそれは無用である､ 但し､幾つかを簡単化している(それらは､単なるmkGeneric梱包からの､私の嗜みのtcl限定ぼったくり である)｡ Some tool commands are also imported into every metawidget class. They all start with "mkw." and are not really necessary, but make some things easier (they are merely Tcl-only rip-offs of my favorites from the mkGeneric package).

### mkw.lassign List ?VarName ...?

List内の全ての要素を与えられたVarNamesに左から右の順に代入する｡ 即ち､List内の最初の値がVarNameの最初に代入され､第二要素がVarNameの第二に､以下続く｡ もし､List内の要素よりVarNamesが多い場合､残りのVarNamesは変更なしに残される｡ Assigns all elements in List to the given VarNames from left to right. I.e. the first element in List is assigned to the first VarName, the second element to the second VarName and so on. If there are more VarNames than elements in List, the remaining VarNames are left unchanged.

### mkw.lextend List ?Value ...?

もし､Valueが未だListの要素でない場合､Valueはリストに追加され､拡張されたリストが返される｡ それ以外は､本命令は単純にListを返す｡ If Value is not yet an element of List, Value is appended to the list and the extended list is returned. Otherwise, the command simply returns List.

### mkw.lshrink List ?Value ...?

もし､ValueがListの要素なら､Valueはりすとから除去され､減少されたリストが返される｡ それ以外の場合､本命令は単純にListを返す｡ If Value is an element of List, Value is deleted from the list and the reduced list is returned. Otherwise, the command simply returns List.

### mkw.lchange List OldValue NewValue

もし､OldValueがListの要素なら､NewValueによって置換えられ､且つ､修正されたリストが返される｡それ以外は､本命令は単純にListを返す｡ If OldValue is an element of List, OldValue is replaced by NewValue and the modified list is returned. Otherwise, the command simply returns List.

### mkw.decode Expr List ?DefaultValue?

Listは偶数個の要素から構成されねばならない｡List内の､それぞれの奇数-番号の要素は､Exprに対して比較される｡もし､合致すると､ List内の合致要素の右の要素が返される｡ 合致がなく､且つ､DefaultValueが指定されると､それが返される｡ それ以外は､本命令は何も返さない｡(これは"string map"に似ている､但しTcl 8.0からは利用できない｡) List must consist of an even number of elements. Each odd-numbered element in List is compared against Expr. If it matches, the element on the right of the matching element in List is returned. If there is no match and a DefaultValue is specified, it is returned. Otherwise the command returns nothing. (This is similar to "string map", which is not available in Tcl 8.0).

### mkw.complete Expr List

Exprは､合致を見出す為に､ List内の要素と比較される｡ もし､Exprが要素の一つと同一であるか､又は､もし､それらの一つの正確な唯一の短縮であると､ 合致が生じる｡ その場合､合致している要素が返される､それ以外は不都合が生成される｡ Expr is compared against each of the elements in List to find a match. A match occurs if Expr is identical to one of the elements, or if it is a unique abbreviation for exactly one of them. In this case the matching element is returned, otherwise an error is created.

### mkw.options List ?OptionSpec ...?

これは単純な業務譜の処理である､ 指示項目optionsは(lsort -dictionaryの如く)引数無しか､(fconfigure ... -blocking 1 の如く)引数一つが可能である｡ Listは､零- か １-引数指示項目の任意個数の組合せ､ 譬えば'-dictionary -command mySort -index 1 -decreasing' からなると期待される｡ 許容される指示項目は､任意個数の指示項目指定を指定される｡ 引数なしの指示項目に関して､OptionSpecは単純に指示項目の名前である､譬えば -dictionary｡ 値を伴う指示項目に関して､OptionSpecは二つか三つの要素から構成される: 最初のものは指示項目の名前､二番目は､許容された値のリストか､任意の値の為の星印 * である｡ 第三要素は任意であり､且つ､指示項目がList内に見付からなければ初期設定の値である｡ This is a simple option processing routine. options can have no arguments (like with lsort -dictionary) or one argument (like fconfigure ... -blocking 1). List is expected to consist of any combination of zero- or one-argument options, e.g. '-dictionary -command mySort -index 1 -decreasing'. Allowed options are specified with an arbitrary number of option specifications. For options with no argument, the OptionSpec is simply the name of the option, e.g. -dictionary. For options with a value, an OptionSpec consists of two or three elements: The first is the option name, the second either a list of allowed values or an asterisk * for any value. The third element is optional and specifies a default value if the option is not found in List.

見付かったそれぞれの指示項目について､ 指示項目として､同じ名前の変数は手続き函数の文脈呼出し内に設定される｡ この変数の値は､引数無しの指示項目については1､であるか､指示項目の値である｡ 指示項目の名前は OptionSpec内に許容される値のリストに対応する指示項目値と同じに､短縮され得る｡ 本命令は､不都合伝言分をかえす､ もし､道の指示項目が見付かるか､もしOptionSpecsの一つが単純な *の場合､ 解決できないList内の全ての要素を返す｡ For each option found, a variable with the same name as the option is set in the calling procedure's context. This variable's value is either a 1 for options without argument, or the option's value. Option names can be abbreviated, as well as option values that map to a list of allowed values in the OptionSpec. The command will return an error message, if an unknown option was found, or, if one of the OptionSpecs is a plain *, return all elements in List that could not be resolved.

## 註意事項 NOTES

### 束縛 Bindings

高次部品の束縛帯は修正され､ 取り囲む部品の部品型は､ 高次部品の級名により置換えられる｡ 行事<Destroy> の為の初期設定級束縛は､再定義され､そして､今や､高次部品のExitProcを呼出す｡ それに伴い､高次部品へのどの様な束縛も､その取り囲み部品に適用する｡ The bindtags of a metawidget are modified, so that the widget type of the enclosing widget is replaced by the class name of the metawidget. The default class binding for the event <Destroy> is redefined and now calls the metawidget's ExitProc. Besides that, any binding to a metawidget will apply to its enclosing widget.

もし､高次部品手続き函数が束縛記述譜内部から呼出される必要がある場合､ この手続き函数は､高次部品命令経由で"移送"されなければならない｡ 束縛記述譜は､ 大域名前空間内部から評価され､且つ､従って､どの様な､高次部品の手続き函数のどれかも判らない｡ If a metawidget procedure needs to be called from within a binding script, then this procedure has to be "exported" via a metawidget command. Binding scripts are evaluated from within the global namespace and therefore don't know any of the metawidget's procedures.

### 幾何学的管理 Geometry Management

多くの高次部品は"最終物"である｡即ち､(高次部品を構築する)内部部品以外は子供の部品は所有しない｡ 譬えば､コンボ箱は その内部に梱包された他の部品を持とうとしない｡ しかしながら､譬えば下記用例のTextframeの様に､幾つかの高次部品は､その内部に他の部品を伴うのみで意味を成す｡ その種の､他の高次部品は､Documentと, Paneと､ Tabcontrolである｡ Many metawidgets are "final". That is, they wont have child widgets other than their internal widgets (those that constitute the metawidget). A combobox, for instants, would not like to have other widgets packed inside it. However, some metawidgets like the Textframe example below, make only sense with other widgets inside them. Other metawidgets of that kind are Document, Pane and Tabcontrol.

これは障害になり得る､もし､これら部品が高次部品の真の子供である場合､ a) 高次部品が既に幾つかの子供を有している(又は､それらは､高次部品にはならない……) b) 高次部品の自身の子供と共にplace命令設置されるか､grid命令設置されるか､pack命令設置されるか､の場所が制御できない｡ This can be a problem, if these widgets are true children of the metawidget, for a) the metawidget has already some children (or it wouldn't be a metawidget...), and b) there is no control of where the new children will be placed, gridded or packed together with the metawidget's own children.

一つの解は､ 高次部品の特定の子供を単純に記述すること 其処では､他の子供は適正に置かれる｡ 譬えば､Document高次部品の場合では､これは$this.workになる｡ これは､記述の分野であり､他の部品はその中に入れられる｡このような部品は$this.workの理論的子供であったりなかったりである｡ One solution is to simply document the particular child of the metawidget where other children may be legally placed into. E.g. in the case of the Document metawidget, this would be $this.work. This is a document's work area, and other widgets should be put inside it. These widgets may or may not be logical children of $this.work.

他の解は､高次部品命令のpackと, placeと､ gridと を定義する事である｡ これらはこの三つの本来の命令に関する通常の引数を受入れる､ 但し､ 稼働領域に部品を再配置する並び揃えにより､その部品は､右側の位置に現れる｡ 明らかに､それは､通常の方法のpack, place and gridより､塩梅が好ましくない｡ しかし､本当には新しくない： canvas と textの如く複合部品は他の対象物をその使用により内部に置く 譬えばcanvas create ... や .text window ... 　 Another solution is to define the metawidget commands pack, place and grid. They would accept the usual arguments for these three native commands, but would also ensure that widgets appear in the right spot, by sort of redirecting the widgets into the work area. Obviously, that is not so nice as using pack, place and grid in the usual way. However, it's not really new either: Complex widgets like canvas and text also place other objects inside them by using e.g. .canvas create ... or .text window ...

### Option Database

option databaseはこの版では対応してない("Tcl と Tk Toolkit":"貴兄は可能な限り小さく使っていると推定する"から引用)｡ The option database is not supported in this version (quote from "Tcl and the Tk Toolkit": "I suggest that you use it as little as possible").

### Configure Command

構成設定命令を伴い高次部品を呼出すが､追加の引数なしの場合は､初期設定の部品の指示項目リストを返す､ 但し､高次部品指示項目は除く｡ Calling a metawidget with the configure command but without additional arguments will only return the options list of the default widget but not the metawidget options.

### Command and Option Abbreviation

命令と指示項目は短縮し得るが､ それらが解釈される方法は完全には明快でない｡ 上で記述した様に､"高次部品 命令"(又は"高次部品 指示項目")で指定されてない命令(又は指示項目)は､ 初期設定の部品に適用される｡ 短縮命令(又は指示項目)は､最初に高次命令(又は､高次指示項目)内部で 次に､初期設定命令(又は､初期設定指示項目)内部で 解析される｡ 従って､高次部品指示項目"-compute"が存在し､且つ､初期設定部品が釦の場合､ 文字列 "-com"は "-compute" と "-command"の両方に適用する｡ しかし乍ら､不都合が生じる代わりに､"-compute"が呼出される事になる｡ Commands and options can be abbreviated, but the way they are being resolved is not quite clean. As described above, a command (or option) that is not specified with "metawidget command" (or "metawidget option") will be applied to the default widget. An abbreviated command (or option) would first be resolved within the metawidget commands (or metawidget options), and then within the default widget commands (or options). So, if there's a metawidget option "-compute" and the default widget is a button, then the string "-com" would apply to both "-compute" and "-command". However, instead of raising an error, "-compute" will be called.

### 旧版との互換性 Backward Compatibility

現在の1.3版は少しの非互換性を導入したが､それは高次部品が生の部品に更に良く似て振舞う為に必要であった｡ metawidget命令内の-type 指示項目は､ 今､値frame と toplevelのみを受入れる｡ 他の部品型は許容されない｡ この事の利益は､即ち､winfo class metawidget呼出しは､今､その高次部品の正しい級名称を返す｡ ( それは､ -class指示項目が frame と toplevel窓型についてのみ利用できる事によって到達されている )｡ The current version 1.3 introduces a minor incompatibility that was necessary to make metawidgets behave a bit more like native widgets: The -type option of the metawidget command now only accepts the values frame and toplevel. Other widget types are not allowed anymore. The benefit of this is that a call to winfo class metawidget now returns the correct class name of that metawidget (which is achieved with the -class option only available for frame and toplevel window types).

高次部品の文書: もし､部品を記述高次部品の内部にpack, place or grid し､且つ､この部品 が記述された高次部品の理論的子供であると､それは､束縛を得る事になり､ それは､何時であれこの部品に入力する鼠遊走子を初期化する事になる｡ もし､部品が記述された高次部品の子供でない場合､束縛は適用されない､理由は､ それは､正しい鼠遊走子の振舞が要求されないから｡ 新しい束縛記述は､ 他の 貴兄が定義したかもしれない 束縛記述を上書きする｡ 逆に､貴兄は､この束縛記述を上書きしない様に､気を付けるべきである｡ Document metawidget: If you pack, place or grid a widget inside a document metawidget, and this widget is a logical child of the document metawidget, then it will get an binding which will reset the mouse cursor whenever it enters this widget. If the widget is not a child of the document metawidget, then the binding will not be applied because it is not required for a correct mouse cursor behavior. The new bind script would overwrite other bind scripts that you might have defined. Conversively, you'd have to be careful not to overwrite this bind script.

## 用例 EXAMPLES

この梱包に付随して来る高次部品の集合は､用例の良き原資である｡ それぞれのファイルは手続き函数"test"を含み､ それは､関連する高次部品の即値を生成する｡ The collection of metawidgets that comes with this package provides a good source of examples. Each file contains a procedure "test" that creates an instance of the related metawidget.

それにも拘わらず､Textframeと呼ばれる高次部品の詳細はここにある｡ 内部の上の部分に表題文書が組込まれた装飾枠 以外の何でもない｡ Nevertheless, here is closer look on a metawidget called Textframe. It is nothing more but a decorative frame with a title text embedded in the upper part.

そこで､最初の取組みの中で､ それは､枠部品と名札部品で構成される｡ 但し､名札は装飾枠の両方の外側に張り付き､ この枠は対象を囲み得ない｡ 又､ それが内部に文書枠を置く事になる､全ての外部部品は､ 名札部品と､恐らく重複するか､ そうでなければ､干渉する｡ 従って､二つの追加的な､ 不可視の枠が定義されねばならない｡ 一つは､囲み部品であり､ もう一つは､その内部の全ての外部部品をpackし, placeし､ gridする為に使われる｡ この二つの枠の間は､装飾的､可視枠と名札である｡ So, in the first approach, it would consist of a frame widget and a label widget. But since the label sticks out of the decorative frame in both directions, this frame cannot be the enclosing object. Also, all external widgets that shall be put inside the textframe, would probably overlap or otherwise interfere with the label widget. Therefore, two additional, invisible frames must be defined: One is the enclosing widget, the other one is used for packing, placing or gridding all external widgets inside it. In between these two frames is the decorative, visible frame and the label.

      +-----------------+
      | %% LABEL %%%%%% |--- 囲み枠 enclosing frame
      | % +---------+ % |
      | % | ....... | %----- 装飾枠 decorative frame
      | % | ....... | % |
      | % | ....... |------- 内部枠 inner frame
      | % +---------+ % |
      | %%%%%%%%%%%%%%% |
      +-----------------+

      package require Metawidget

      # 高次部品 textframe
      # は表題文書を伴う枠を生成する｡他の部品は文書枠内に包籠める｡
      # textframe は通常枠部品の様に､構成設定できる｡
      # 追加の指示項目は表題文書には -text 表題字母には -font である｡
      #
      # metawidget textframe
      # creates a frame with a title text. other widgets can be packed inside
      # the textframe. The textframe can be configured like a regular frame
      # widget. Extra options are -text for the title text and -font
      # for the title font.

      metawidget create Textframe {
        # 全ての内部部品を生成する  create all internal widgets
        frame $this._frm_ -border 2 -relief groove  ;# 装飾枠 decorative frame
        frame $this._inn_ -border 0                 ;# 内部枠 inner frame
        label $this._txt_ -border 0 -padx 0 -pady 0 ;# 名札 label

        # 全ての内部部品を設置する｡
        # 一つ丈はここに､他の二つは -font 要因の中に梱包される｡
        # position all internal widgets.
        # only one here, the other two are packed in the -font member.
        place $this._txt_ -in $this._frm_ -x 12 -y 0 -anchor w

        # 高次部品の全指示項目がある｡
        # preset all metawidget options.
        -text {}
        -font [$this._txt_ cget -font]
      } {} -default _frm_

      # option -text
      # 初期設定の部品は装飾枠なので､label部品の全ての指示項目
      # はそれに明示的に､再方向指示されねばならない｡
      # since the default widget is the decorative frame, all options for
      # the label widget must be explicitely redirected to it.

      metawidget proc Textframe -text { sText } {
        $this._txt_ configure -text $sText
        my -text $sText
      }

      # option -font
      # 之は更に複雑である｡字母は丁度設定されず､それだけだ｡
      # 装飾枠は名札と垂直に真ん中で交差する要がある｡
      # 名札の新しい高さは装飾枠と内部枠の詰込みを定め､字母が変更される
      # 毎に､再詰込みされる｡
      # this is more complex. the font cannot just be set and that's it.
      # the decorative frame needs to cross the label vertically centered.
      # the new height of the label determines the padding of the decorative
      # and the inner frames, requiring them to be repacked each time the
      # font is changed.

      metawidget proc Textframe -font { sFont } {
        $this._txt_ configure -font $sFont
        my -font $sFont

        update

        set iPad [expr [winfo height $this._txt_] / 2 + 1]
        pack $this._frm_ -fill both -expand 1 -padx $iPad -pady $iPad
        pack $this._inn_ -in $this._frm_ -fill both -expand 1 -padx $iPad -pady $iPad
      }

      # command pack
      # 他の部品を文書枠内にpackする命令｡gridとplaceは同様な方法で可能｡
      # 指示項目 -in $this._inn_ は内部枠内を全て終了させるので注意を要す｡
      #
      # command for packing other widgets inside the text frame. for grid and
      # place this can be implemented in a similar way. the option -in
      # $this._inn_ takes care that everything ends up in the inner frame.

      metawidget proc Textframe pack_ { sWidget args } {
        eval pack $sWidget -in $this._inn_ $args
      }

      # 高次部品の指示項目とそれに関連する手続き函数の命令を定義する
      # define metawidget options and commands with their associated procs

      metawidget option  Textframe -text -text
      metawidget option  Textframe -font -font
      metawidget command Textframe pack  pack_

      # 試験する  test it

      textframe .t -text { Title }
      button .b -text Destroy -command { destroy .t }

      pack .t -fill both -expand 1
      pack .b -fill x -side bottom

      array set aFont {0 {Helv 9} 1 {Courier 15 bold}}
      array set aFrame {0 groove 1 solid}

      checkbutton .c1 -text {Other Font} -variable iC1 -command { .t config -font $aFont($iC1) }
      checkbutton .c2 -text {Other Frame} -variable iC2 -command { .t config -relief $aFrame($iC2) }

      .t pack .c1 -side top -anchor w
      .t pack .c2 -side top -anchor w

## 搭載 INSTALLATION

mkWidgetsは純Tcl/Tk (第8版)で記述され､他のどの様な梱包にも依存しない｡ mkWidgets is written in pure Tcl/Tk (version 8) and does not contain any other package dependencies.

搭載する為には､ディレクター"mkWidgets1.3"を､ 大域tcl変数"auto_path"に含まれるディレクトリーの内の一つ 内に置く｡ 標準的tcl/tk搭載の為には､ これは通常は､ "c:/program files/tcl/lib" (Windows) と "/usr/local/lib" (Unix) である｡ To install, place the directory "mkWidgets1.3" in one of the directories contained in the global Tcl variable "auto_path". For a standard Tcl/Tk installation, this is commonly "c:/program files/tcl/lib" (Windows) and "/usr/local/lib" (Unix).

## 変更履歴 CHANGES

Changes from 1.0 to 1.2

- Eliminated dependency to mkGeneric and mkClasses
- Added the metawidget export feature
- Significantly extented the metawidgets collection
- Fixed some bugs

Changes from 1.2 to 1.3

- Fixed various bugs. Thanks much to all who contributed!
- Added the names member to the Toolbar metawidget
- Added an always visible position indicator when a Pane is being dragged
- Made the Combobox metawidget behave better
- Document windows cannot be moved outside their parent anymore
- A Document window now remembers its former position when deiconified
- The mouse cursor changes to arrows over the border of a Document window
- Improved the Arrange class function of the Document metawidget
- Added column exists to Listcontrol and Gridcontrol metawidgets
- Names for tags, icons, columns, nodes are now list-protected and may contain white spaces
- winfo class metawidget now returns the correct class, but...
- Had to restrict the allowed values for the -type option of the metawidget command to frame and toplevel

## AUTHOR

Michael Kraus
mailto:michael@kraus5.de
http://mkextensions.sourceforge.net