この章の目次にもどる
前頁:3.4 パネルマネージャにもどる
次頁:3.6 データマネージャにすすむ

3.5 トレーマネージャ

3.5.1 トレーマネージャの機能

3.5.1.1 概要

トレーマネージャは外殻の1つとして位置付けられ、 基本的なデータ移動 / 複写の操作である「切り取る」、「写し取る」、 「貼り込む」および「取り込む」で使用されるトレーの管理を行ない、 トレー内のデータを操作する機能を提供するものである。

また、ドラッグによるデータ移動 / 複写等のために一時的に使用される 「一時トレー」の管理も行ない、その操作機能を提供している。

トレーマネージャは単にトレーに格納されるデータ領域の管理を行ない、 その内容に関しては一切関知しない。

アプリケーションは、常にユーザからの明示的な操作によってのみトレーの操作を行なわなくてはいけない。 すなわち、ユーザの操作とは無関係にアプリケーション間のデータ交換等にトレーを使用してはいけない。

3.5.1.2 トレー

トレーは、各ユーザ毎に1つ存在する特殊な「データ格納容器」であり、 「切り取る」または「写し取る」の操作のディスティネーションとしてデータが格納され、 「貼り込む」または「取り込む」の操作のソースとしてデータが取り出される容器である。

「切り取る/取り込む」の操作ではソースデータは失われ(即ち、移動)、 「写し取る/貼り込む」の操作では、ソースデータは保存される(即ち、複写)。

トレーはスタック構造を持ち、 基本的に最後に格納したデータが最初に取り出されるが、 その順番を変更したり任意の位置のデータを取り出すことも可能である。 データは、先頭(最後に格納されたデータ)を"1"とした連続番号であるデータ位置により識別される。

トレーに格納されたデータは、「データの削除」操作を行なうか、 またはトレーの最大容量をオーバーして溢れた場合に自動的に消滅する。 トレーの最大容量は、インプリメントに依存するが、 原則的には最後に格納されたデータから遡って、 少なくとも 5 個のデータは保証されるものとする ( 通常は 10 個程度 ) 。

なお、トレーに格納されるデータの大きさは基本的に任意であるが、 小さいサイズのデータを効率的に取り扱うことを前提としている。

トレー
図 102 : トレー

一時トレーは、ドラッグによる移動/複写等の一時的なデータの交換に使用される特殊な格納容器であり、 1つのデータの格納/取り出しのみを行なう。従って、新たなデータを格納すると以前のデータは消滅する。

一時トレーは各ユーザ毎ではなくシステムに1つのみ用意されており、 常にオープンされて使用できる状態となっている。 システムの立上げ時には、一時トレーは空の状態になっている。

3.5.1.3 トレーの格納データ

アプリケーションは、トレーを利用したデータ互換を実現するために、 以下に述べる形式でトレーにデータを格納する必要がある。

なお、トレーマネージャではレコードの内容、 レコードタイプの正当性等に関しては一切関知しない。

トレーおよび一時トレーに格納される1つのデータ単位は、TAD データ構成の形式であり、TAD で規定されているセグメントの列となる。 TAD データ構成をトレーおよび一時トレーに格納する場合は、 原則的に 1 つの TAD セグメントを 1 つのトレーレコードとしたトレーレコードの列として格納する。 ただし、連続した図形描画セグメント、 および連続した文字コードと文章付箋セグメントは、 それぞれ1つのトレーレコードとすることができる。 また、1 つの TAD セグメントを複数の連続したトレーレコードとして格納することもできる。

1 つのトレーレコードは、以下の構造体により定義される。

    typedef struct {
        W   id;     /* レコードタイプ( > 0 ) */
        W   len;    /* データのバイト長 */
        B   *dt;    /* データ本体へのポインタ */
    } TRAYREC;

レコードタイプは、TAD で定義されているセグメントIDそのものであり、 セグメントに対応した 0x80〜0xFD の値となる(内容に関しては、 「第3章 TAD詳細仕様書」 を参照のこと)。

ただし、レコードタイプとしては、TAD のセグメントIDに加えて以下に示すものが追加される。

仮身レコード (TR_VOBJ (=0x1)):
仮身を示すレコードであり、リンクレコード、および仮身セグメ ントが続いた以下の形式を持つ。トレーではTADで定義されている仮身 セグメント単体では使用せずに、この仮身レコードを使用する。(詳細 に関しては「3.8 実身/仮身マネージャ」を参照のこと。)
        typedef struct {
            VLINK   vlnk;   -- リンクレコード
            VOBJSEG vseg;   -- 仮身セグメント
        } TR_VOBJREC;
文章レコード (TR_TEXT (=0x2)):
連続した文字コードと文章付箋セグメントの列から構成されるレコード
図形レコード (TR_FIG (=0x3)):
連続した図形描画セグメントの列から構成されるレコード

さらに 1 つの TAD セグメントを連続した複数のトレーレコードに分割した場合は、 以下の接続フラグがレコードタイプにセットされる。

接続フラグ (TR_CONT (=0x4000)):
分割したトレーレコードの最後のレコード以外のすべてのレコードのレコードタイプに接続フラグがセットされる。
例: 1つの画像セグメントを複数のトレーレコードに分割した場合のレコードタイプは、以下のようになる。
      先頭のレコード         : TS_IMAGE+TR_CONT (=0x40E5)
      2番目のレコード        : TS_IMAGE+TR_CONT (=0x40E5)
          :  :
      (最後 - 1)番目のレコード: TS_IMAGE+TR_CONT (=0x40E5)
      最後のレコード         : TS_IMAGE (=0xE5)
     

データ本体は、TAD のセグメントから、先頭のセグメントID、 およびバイト長を除いたデータ本体部分となる。 ただし、文章レコード(TR_TEXT)と図形レコード (TR_FIG)の場合は、先頭のセグメントID、 およびバイト長を含んだ完全なTADセグメントの列となる。

TADデータ構成は、「文章データ」と「図形データ」のいずれかであるため、 トレーレコードの先頭には、「管理情報セグメント」に続いて「文章開始セグメント」か「図形開始セグメント」のいずれかがくることになり、 最後のレコードは「文章終了セグメント」か「図形終了セグメント」となる。 通常は最後の「文章 / 図形終了セグメント」は省略される。 また、最初の「管理情報セグメント」も省略可能である。

トレーレコードの構造
図 103 : トレーレコードの構造

トレーおよび一時トレーにデータを格納する場合は、 TRAYREC の配列の先頭アドレスと、 トレーレコードの数(配列の要素数)を指定する。

トレー/一時トレーに格納するデータ指定
図 104 : トレー/一時トレーに格納するデータ指定

トレーおよび一時トレーからデータを取り出す場合は、 以下に示す 3 種類の方法を取ることができる。

(1) 全体取り出し
格納されているデータ全体の取り出しであり、 取り出し用バッファの先頭に TRAYREC の配列が入り、 その直後にレコードデータ本体が入る形式となる。
(2) ヘッダ取り出し
取り出し用バッファには、TRAYREC の配列のみが入り、 対応するレコードデータ本体は取り出されない。 この場合、TRAYREC 内のデータ本体へのポインタ (dt)は意味を持たない。
(3) 指定レコードデータ取り出し
取り出し用バッファには、 指定したレコードのレコードデータ本体のみが取り出される。 レコードの指定は先頭のレコードは"1"とした TRAYREC 配列のインデックス番号で行なう。 この場合、指定したレコードのレコードタイプも得られる。
トレー/一時トレーから取り出すデータ形式((1)全体取り出し)
図 105 : トレー/一時トレーから取り出すデータ形式((1)全体取り出し)
トレー/一時トレーから取り出すデータ形式((2)ヘッダ取り出し)
図 106 : トレー/一時トレーから取り出すデータ形式((2)ヘッダ取り出し)
トレー/一時トレーから取り出すデータ形式((3)指定レコードデータ取り出し)
図 107 : トレー/一時トレーから取り出すデータ形式((3)指定レコードデータ取り出し)

また、 トレーに格納したデータには最大 12 文字 ( TCODE ) の任意の名称を格納時に設定することが可能である。 この名称はデータの内容を説明するためにアプリケーションプログラムが設定する。 なお、一時トレーに格納するデータに対しては、名称をつけることはできない。

3.5.1.4 トレーの操作

トレーは、ユーザ毎に1つ用意される。 通常はユーザの初期プロセスによりオープンされ、 そのユーザのプロセスはそのトレーを常に対象とする。 トレーはユーザの使用が終了した時点でクローズされ、その内容は消える。

トレーはスタック構造を持ち、 スタックの先頭にデータが格納され、 スタックの先頭からデータが取り出されるが、 取り出す場合は任意の位置のデータを取り出すことも可能である。

トレー内のデータには、「選択状態」が定義され、トレー内のどのデータが選択され処理の対象となっているかを示す。トレーは空でない限り、必ず「選択状態」のデータが1つ存在する。

トレーに対する基本操作として以下のものが用意されている。

一時トレーはスタック構造を持たず、ただ1つのデータのみ格納可能である。 従って一時トレーに対する操作は「格納」と「取り出し」のみとなる。

3.5.2 データ/定数の定義

□ トレーレコード

#define TR_VOBJ 0x1     /* 仮身レコード */
#define TR_TEXT 0x2     /* 文章レコード */
#define TR_FIG  0x3     /* 図形レコード */
#define TR_CONT 0x4000  /* 接続フラグ */
仮身レコード (TR_VOBJ (=0x1)):
仮身を示すレコードであり、リンクレコード、および仮身セグメントが続いた TR_VOBJRECの形式を持つ。トレーではTADで定義されている仮身セグメント単体では使用せずに、この仮身レコードを使用する。
文章レコード (TR_TEXT (=0x2)):
連続した文字コードと文章付箋セグメントの列から構成されるレコード
図形レコード (TR_FIG (=0x3)):
連続した図形描画セグメントの列から構成されるレコード
接続フラグ (TR_CONT (=0x4000)):
分割したトレーレコードの最後のレコード以外のすべてのレコードのレコードタイプに接続フラグがセットされる。

他のレコードタイプ(TS_xxx)は、TADセグメントとして定義される。

□ トレーレコードタイプ

typedef struct {
    W   id;     /* レコードタイプ( > 0 ) */
    W   len;    /* データのバイト長 */
    B   *dt;    /* データ本体へのポインタ */
} TRAYREC;

□ 仮身レコードタイプ

typedef struct {
    TC  fs_name[20];/* ファイルシステム名 */
    UH  f_id;       /* ファイルID */
    UH  attr;       /* 仮身タイプ/属性 */
    UH  rel;        /* 続柄インデックス */
    UH  appl[3];    /* アプリケーションID */
} VLINK;
typedef struct {
    VLINK   vlnk;       /* リンクレコード */
    VOBJSEG vseg;       /* 仮身セグメント */
} TR_VOBJREC;

データ本体は、TAD のセグメントから、先頭のセグメントID,およびバイト長を除いたデータ本体部分となる。 ただし、文章レコード(TR_TEXT)と図形レコード(TR_FIG)の場合は、先頭のセグメントID, およびバイト長を含んだ完全なTADセグメントの列となる。

TAD データ構成は、「文章データ」と「図形データ」のいずれかであるため、 トレーレコードの先頭には、「管理情報セグメント」に続いて「文章開始セグメント」か 「図形開始セグメント」のいずれかがくることになり、 最後のレコードは「文章終了セグメント」か「図形終了セグメント」となる。 通常は最後の「文章/図形終了セグメント」は省略される。 また、最初の「管理情報セグメント」も省略可能である。

    《文章データのレコード構造》    《図形データのレコード構造》

    {管理情報セグメント}            {管理情報セグメント}

    文章開始セグメント              図形開始セグメント

    <文章要素の                     <図形要素の
            セグメント列>                   セグメント列>
          :  :                            :  :
          :  :                            :  :
    {文章終了セグメント}            {図形終了セグメント}

                { }は省略可能を意味する。

トレーおよび一時トレーにデータを格納する場合は、 TRAYREC の配列の先頭アドレスと、 トレーレコードの数(配列の要素数)を指定する。

トレーおよび一時トレーからデータを取り出す場合は、 以下に示す 3 種類の方法を取ることができる。

(1) 全体取り出し
格納されているデータ全体の取り出しであり、取り出し用バッファの先頭に TRAYRECの配列が入り、 その直後にレコードデータ本体が入る形式となる。
(2) ヘッダ取り出し
取り出し用バッファには、TRAYREC の配列のみが入り、 対応するレコードデータ本体は取り出されない。 この場合、TRAYREC 内のデータ本体へのポインタ( dt )は意味を持たない。
(3) 指定レコードデータ取り出し
取り出し用バッファには、指定したレコードのレコードデータ本体のみが取り出される。 レコードの指定は先頭のレコードは"1"とした TRAYREC 配列のインデックス番号で行なう。 この場合、指定したレコードのレコードタイプも得られる。

また、 トレーに格納したデータには最大12文字(TC)の任意の名称を格納時に設定することが可能である。 この名称はデータの内容を説明するためにアプリケーションプログラムが設定する。 なお、一時トレーに格納するデータに対しては、名称をつけることはできない。

トレーは、ユーザ毎に1つ用意される。通常はユーザの初期プロセスによりオープンされ、そのユーザーのプロセスはそのトレーを常に対象とする。トレーはユーザの使用が終了した時点でクローズされ、その内容は消える。

トレーはスタック構造を持ち、スタックの先頭にデータが格納され、スタックの先頭からデータが取り出されるが、取り出す場合は任意の位置のデータを取り出すことも可能である。

トレー内のデータには、「選択状態」が定義され、トレー内のどのデータが選択され処理の対象となっているかを示す。トレーは空でない限り、必ず「選択状態」のデータが1つ存在する。

トレーに対する基本操作として以下のものが用意されている。

一時トレーはスタック構造を持たず、ただ1つのデータのみ格納可能である。従って一時トレーに対する操作は「格納」と「取り出し」のみとなる。

3.5.3 トレーマネージャの関数

topn_tra
 
トレーのオープン

【形式】

ERR topn_tra(void)

【パラメータ】

なし

【リターン値】

≧0    正常
<0    エラー(エラーコード)

【解説】

自プロセスのユーザに対するトレーをオープンし、 以後のトレーに関する操作を可能とする。この時、トレーは空の状態になっている。

既にトレーがオープンされている場合は何もしない。

この関数は、通常ユーザの初期プロセスによりそのユーザのセッションが開始する際にコールされ、 一般のアプリケーションでは使用しない。

【エラーコード】

EX_NOSPC    : システムのメモリ領域が不足した。
tcls_tra
 
トレーのクローズ

【形式】

ERR tcls_tra(void)

【パラメータ】

なし

【リターン値】

≧0    正常
<0    エラー(エラーコード)

【解説】

自プロセスのユーザに対するトレーをクローズしその内容を消す。

この関数は、通常ユーザの初期プロセスによりそのユーザのセッションが終了する際にコールされ、 一般のアプリケーションでは使用しない。

【エラーコード】

EX_TRAY     : トレーはオープンされていない。
tpsh_dat
 
トレーへのデータ格納

【形式】

W   tpsh_dat(TRAYREC *data, W nrec, TC *name)

【パラメータ】

TRAYREC *data   トレーに格納するデータ
W       nrec    レコード数
TC      *name   データに付ける名前

【リターン値】

≧0    正常(関数値は格納したレコード数)
<0    エラー(エラーコード)

【解説】

トレーの先頭に data で指定した nrec 個のデータレコードを格納し、 そのデータを「選択状態」とする。関数値として格納したレコード数が戻る。

name はデータに対して付ける任意の名称であり、 先頭の12文字(TC)までが有効となる。名称を付けない場合は、name = NULL とする。

データの格納により、トレーに溢れが生じた場合は、最後のデータは自動的に消滅する。

【エラーコード】

EX_ADR      : アドレス(data,name)のアクセスは許されていない。
EX_NOSPC    : システムのメモリ領域が不足した(データのサイズが大きすぎる)。
EX_PAR      : パラメータが不正である(nrec≦0、トレーレコードの内容が不正)。
EX_TRAY     : トレーはオープンされていない。
tpop_dat
 
トレーからのデータ取り出し

【形式】

W   tpop_dat(TRAYREC *data, W size, W *a_size, W rec, TC *name)

【パラメータ】

TRAYREC *data   トレーから取り出すデータ格納場所
W       size    data のバイト数
W       a_size  全体のバイト数
W       rec     取り出し方法
        < 0 :  全体取り出し
        = 0 :  ヘッダ取り出し
        > 0 :  指定レコードデータ取り出し(rec で指定したレコード)
TC      *name   データ名称の格納場所

【リターン値】

≧0    正常(関数値はデータのレコード数 / レコードタイプ)
<0    エラー(エラーコード)

【解説】

トレー内の選択されているデータを、 rec の指定に従って取り出し、data で指定した size バイトの領域に格納する。

格納すべきデータのサイズより size が小さい場合は、size 分だけ格納され、 EX_PAR のエラーとなる。data = NULL の場合は、 size の値は無視され、データは一切格納されない。 いずれの場合も *a_size には格納すべきデータの全体のバイトサイズが戻される。 このため例えば、rec < 0, data = NULL とすることにより、 格納されているデータ全体のサイズを知ることができる。

なお、データを取り出した後もトレー内のデータは削除されずに残っており、 選択状態のままとなる。name はデータに付けられた名称を格納する領域へのポインタであり、12 + 1文字(TC)の領域である必要がある ( 格納された名称の最後には TNULL が付けられる ) 。name = NULL の場合は、名称は格納されない。

関数値として、全体取り出し / ヘッダ取り出し ( rec ≦ 0 ) の 時は、データの総レコード数が戻り、指定レコード取り出し ( rec > 0 ) の時は、取り出したレコードのレコードタイプが戻る。存在しないレコード番号を指定した場合は、EX_PAR のエラーとなり、*a_size には "0" が戻される。

トレーが空の場合は、取り出し方法に無関係に、 *a_size には "0" が戻され、 関数値は "0" となる。

【エラーコード】

EX_ADR      : アドレス(data,a_size,name)のアクセスは許されていない。
EX_PAR      : パラメータが不正である
              (size≦0、領域のサイズが不足、recの値が不正)。
EX_TRAY     : トレーはオープンされていない。
tdel_dat
 
トレーデータの削除

【形式】

W   tdel_dat(void)

【パラメータ】

なし

【リターン値】

≧0   正常(関数値は「選択状態」のデータ位置)
<0   エラー(エラーコード)

【解説】

トレー内の「選択状態」のデータを削除する。 削除後は削除した直後のデータが「選択状態」となる。 直後のデータが存在しない場合(即ち最後のデータの場合)は、 直前のデータ(即ち新規に最後となったデータ)が「選択状態」になる。

関数値としては、削除後に「選択状態」となったデータ位置 ( > 0 ) が戻るが、 トレーが空の場合は何も行なわれず、関数値は "0" が戻る。

【エラーコード】

EX_TRAY     : トレーはオープンされていない。
tsel_dat
 
トレーデータの選択

【形式】

W   tsel_dat(W pos)

【パラメータ】

W   pos データ位置

【リターン値】

≧0    正常(関数値は「選択状態」のデータ位置)
<0    エラー(エラーコード)

【解説】

トレー内の、pos で指定した位置のデータを「選択状態」とする。 今まで「選択状態」であったデータは「非選択状態」となり、 関数値として新たな「選択状態」のデータ位置 ( > 0 ) が戻る。

pos は、先頭のデータを "1" とした連続番号であり、 pos が存在するデータ数より大きい場合は、 最後のデータが「選択状態」となる。また pos ≦ 0 の場合は、 「選択状態」を変えずに現在の「選択状態」のデータ位置を関数値として戻す。

トレーが空の場合は何も行なわれず、関数値は "0" が戻る。

【エラーコード】

EX_TRAY     : トレーはオープンされていない。
tmov_dat
 
トレーデータの位置変更

【形式】

W   tmov_dat(W pos)

【パラメータ】

W   pos データ位置

【リターン値】

≧0    正常(関数値は「選択状態」のデータ位置)
<0    エラー(エラーコード)

【解説】

トレー内の「選択状態」のデータを pos で指定したデータ位置に移動する。 移動したデータは「選択状態」のままとなる。

pos ≦ 1 の場合は先頭に移動し、 pos が現在のデータ数より大きい場合は、 最後に移動する。

関数値として移動後のデータのデータ位置 ( > 0 ) が戻り、 トレーが空の場合は何も行なわれず、 関数値は "0" が戻る。

【エラーコード】

  EX_TRAY     : トレーはオープンされていない。
tget_sts
 
トレーの状態取り出し

【形式】

W   tget_sts(UW *size, UW *rsize)

【パラメータ】

UW  *size   トレーの総バイト数
UW  *rsize  使用できる残りのバイト数

【リターン値】

≧0    正常(関数値は存在するデータ数)
<0    エラー(エラーコード)

【解説】

トレー内にあるデータの総数を関数値として戻し、 その総バイト数を、size に設定する。 また使用できる残りのバイト数を rsize に設定する (特に制限がない場合でも適当な大きな数が戻されるものとする)。

size, rsize がそれぞれ NULL の場合は設定されない。

【エラーコード】

EX_ADR      : アドレス(size,rsize)のアクセスは許されていない。
EX_TRAY     : トレーはオープンされていない。
tset_dat
 
一時トレーへのデータ格納

【形式】

W   tset_dat(TRAYREC *data, W nrec)

【パラメータ】

TRAYREC *data   データ
W       nrec    レコード数

【リターン値】

≧0    正常(関数値は格納したレコード数)
<0    エラー(エラーコード)

【解説】

一時トレーに data で指定した nrec 個のレコードを格納する。 以前に格納されていたデータは捨てられる。

nrec = 0 の場合は、 一時トレーを空の状態とする。 この場合、data はアクセスされないため、 その値は何でもよい。

【エラーコード】

EX_ADR      : アドレス(data)のアクセスは許されていない。
EX_NOSPC    : システムのメモリ領域が不足した(サイズが大きすぎる)。
EX_PAR      : パラメータが不正である
              (nrec < 0、トレーレコードの内容が不正)。
tget_dat
 
一時トレーからのデータ取り出し

【形式】

W   tget_dat(TRAYREC *data, W size, W *a_size, W rec)

【パラメータ】

TRAYREC *data   データ格納場所
W   size    data のバイト数
W   *a_size データの全体のバイト数
W   rec 取り出し方法
        < 0 :  全体取り出し
        = 0 :  ヘッダ取り出し
        > 0 :  指定レコードデータ取り出し(rec で指定したレコード)

【リターン値】

≧0    正常(関数値はデータのレコード数/レコードタイプ)
<0    エラー(エラーコード)

【解説】

一時トレー内に格納されているデータを、 rec の指定に従って取り出し、 data で指定した size バイトの領域に格納する。

格納すべきデータのサイズより size が小さい場合は、 size 分だけ格納され、EX_PAR のエラーとなる。data = NULL の場合は、 size の値は無視され、 データは一切格納されない。 いずれの場合も *a_size には格納すべきデータの全体のバイトサイズが戻される。 このため例えば、rec < 0, data = NULL とすることにより、格納されているデータ全体のサイズを知ることができる。

なお、データを取り出した後も一時トレー内のデータは削除されずに残っている。

関数値として、全体取り出し/ヘッダ取り出し ( rec ≦ 0 )の時は、 データの総レコード数が戻り、指定レコード取り出し( rec > 0 ) の時は、取り出したレコードのレコードタイプが戻る。 存在しないレコード番号を指定した場合は、 EX_PAR のエラーとなり、*a_size には "0" が戻される。 一時トレーが空の場合は、取り出し方法に無関係に、 *a_size には "0" が戻され、 関数値は "0" となる。

【エラーコード】

EX_ADR      : アドレス(data,a_size)のアクセスは許されていない。
EX_PAR      : パラメータが不正である
              (size≦0、領域のサイズが不足、recの値が不正)。

この章の目次にもどる
前頁:3.4 パネルマネージャにもどる
次頁:3.6 データマネージャにすすむ