Java Drawing DrawTop

Language

JP  US  UK

 

図形データ管理

 H. Jyounishi, Tokyo Japan
 

Frame (Index), No frame                 version:0.3(latest)  

要旨:画面に表示している図形データをArrayListで管理する。
ContainerManager:1画面(1ページ)分の図形データを格納するContainerListを管理する。ページの管理はPageManagerで行う。
このページで説明するクラス: ContainerManager

1.機能概要


図1.1 サンプル図形
Round_Rectangle(No-0), Rectangle(No-4)などグレイの小文字は 図形コンテナの図形名称(shapeId)を表す。


図1.2 部品 - グループ図形


図1.3 ContainerListの構成
∙ グループ図形: Group(No-0), Group(No-1)などはグループ図形で、その他は単一図形(Single shape)である。
∙ グループ図形の子要素: グループ図形要素childrenList(ArrayList)に格納する。
図1.3ではchildrenListから子要素へのリンクを矢印で表している。

項目
説明
ContainerManagerの使われ方 通常は画面上の図形データを管理するために使うので、ContainerManagerオブジェクトは1個だけ作る。 但しpage layoutコマンドで全ページの一覧を表示する場合や、部品ライブラリ登録で部品データを管理する場合は、 別のContainerManagerオブジェクトを一時的に作成する。
図形要素のIdにつける
シリアル番号を作成
このシリアル番号は作成のたびに+1更新する。図形が削除されると空番号ができるが当面気にしない。 図形オブジェクトの識別子に使う。
図形の管理法、グループ図形の扱い
単一図形とグループ図形はともに ShapeContainerで表し、 ContainerList (ArrayList)に格納して管理する。
・単一図形の場合: 単一図形のShapeContainerオブジェクトを ContainerListに登録する。
・グループ図形の場合:

グループ図形をさらにグループ化することもあるから、図1.3のような階層構造を持つ。
グループ図形の場合、 ShapeContainerの図形要素はGroupElementである。 GroupElementには子要素(ShapeContainer)のリスト(childrenList)を持たせる。逆に子要素には親クループへのリンクを持たせる。

・グループ化、グループ解除(group, unGroup)

これらのコマンドを処理するメソッドをこのクラスに用意する。

描画の順序
ContainerList(ArrayList)の先頭に登録されている図形から順に描画する。 したがってContainerList後ろに登録されている図形が画面の手前に描画される。
描画のレイヤーを変えるコマンドは、単純にArrayListでの順番を変更するだけである。
ContainerListのindex ArrayListのindexのこと。上記の描画の順序に関係する。
図形削除のundo操作などでは、削除した図形をContainerListの元の位置に戻したい。
このため削除するShapeContainerにsetContainerListIndexメソッド でContainerListのindexを設定しておく。undo操作ではこのindexを参照し、削除したShapeContainerをindex位置に書き込む。
テキスト入力・編集可能(アクティブ)なTextBox
テキスト入力・編集可能なTextBoxが複数存在することは許されない。 テキスト入力・編集可能なTextBoxを検索するメソッド (getEditableTextBox)を用意し、 常に1個以下であることを保障する。
ファイル入出力
ContainerManagerで管理する図形データを格納したContainerListへのファイル入出力を行うメソッドを用意する。
Undoサポート機能
ShapeContainerの新規作成/削除/変更、 TextBoxPaintStyleの変更に対するUndo設定は、 ContainerManagerのUndoサポート機能を使って行う。
(1)Undo設定開始宣言

このクラスのundoSetupStartメソッドを呼んで、 Undo設定開始を宣言する。これ以降、getContainer系統のメソッド (ShapeContainer読出しメソッド)が呼ばれると、 BackupContainerListに変更前のShapeContainerのクローンをセーブする。

(2)新規作成、削除図形に対するUndo設定

このクラスのaddContainer, deleteContainerが呼ばれると undoSetupOfAddOrDeleteメソッドを呼んで、 UndoableDrawEditのサブクラスである CreateContainerオブジェクトまたは DeleteContainerオブジェクトを UndoDrawManagerに登録する。

(3)変更図形に対するUndo設定

ShapeContainer.setChangeCodeメソッドで 変更コード(UndoConstantsのADD, DELETE以外)を設定する。 この変更コードが設定されるとundoSetupEndメソッドで 変更に対応したundoデータが設定される。
: 1つのコマンド 処理で図形が何度も変更される場合、undoSetupStart - setChangeCode - undoSetupEnd の組を何度呼び出してもよい。呼び出した回数だけundoが記録される。

(4)Undo設定終了宣言

このクラスのundoSetupEndメソッドを呼んで、 Undo設定終了を宣言する。
この時に、ContainerList内のShapeContainerが変更されていれば、 BackupContainerListから変更前ShapeContainerを取り出し、 変更を表すUndoableDrawEditオブジェクトをUndoDrawManagerに登録する。


: undoSetupStart、undoSetupEndメソッドの呼び出し
(a)undoSetupStartメソッド

何回呼んでもよい。最後に呼んだundoSetupStartメソッドが有効になる。 undoSetupEndメソッドも同様で、最初に呼んだundoSetupEndメソッドが有効になる。

(b)undoデータの設定

undoSetupStart - undoSetupEndの間に、 ContainerManager内のShapeContainerオブジェクトに何の変更も無ければ、undoデータは設定されない。

>コマンドに対するUndo設定一覧


2. ContainerManagerクラス 戻る=>page top
public class ContainerManager

フィールド
説明
ContainerList ArrayList ContainerList
ShapeContainerを格納するアレイリスト。
workVector Vector workVector=new Vector()
作業用Vector。
undoSetup private boolean undoSetup
undoSetupStart()が呼ばれるとtrueが設定され、undoSetupEnd()の最後にfalseに戻す。
Undo設定中であることを示す。
undoEdit private boolean undoEdit
UndoableDrawEditオブジェクトをUndoDrawManagerに登録したことを示す。
undoEdit=trueの場合、undoSetupEnd()でUndoableDrawEdit.Delimiterオブジェクト(操作の区切りを表す)を登録する。
BackupContainerList private ArrayList BackupContainerList
変更前のShapeContainerを格納するリスト。undoSetupStart()が呼ばれた後、getContainer系統のメソッドはShapeContainerのクローンをこのリストに登録する。またコマンド処理からこのクラスのbackupメソッドを呼んで直接登録することもできる。

メソッド
説明
getUniqueSerialNumber public int getUniqueSerialNumber()
図形要素につけるシリアル番号を返す。シリアル番号はつぎのgetMaxSerialNumberメソッドの戻り値に1を加えた値を返す。
getMaxSerialNumber public int getMaxSerialNumber()
ContainerListに登録されている全ての図形のshapeIdからシリアル番号部分を取り出しそのmax値を返す。シリアル番号はShapeContainer.getSerialNumberメソッドで取り出す。
: shapeIdは図形要素のキーワードとシリアルナンバで作る識別子で”Rectangle (No-1)”など。
getContainerList public ArrayList getContainerList()
ContainerListを返す。通常はこのメソッドは使われない。
setContainerList public void setContainerList(ArrayList containerList)
主にページの切り替えを行うためPageManagerから呼ばれ、引数で指定するcontainerListをセットする。
containerList内の図形を調べ、シリアル番号の最大値を求めて、フィールド変数SerialNumberに設定する。
size public int size()
ContainerListのサイズを返す。
clear public void clear()
ContainerListを空にする。
setContainerIndex private void setContainerIndex(ShapeContainer container)
containerにcontainerIndexを設定する。ContainerList登録時、削除時には必ずこのメソッドを呼ぶ。
getContainerIndex private int getContainerIndex(ShapeContainer container)
containerのContainerListでの位置(index)を返す。
addContainer public void addContainer(ShapeContainer container)
ShapeContainerをContainerListに追加。すでにcontainerがContainerListにあれば削除して新たに登録する。setContainerIndexを呼ぶ。
フィールド変数undoSetupがtrueならば、このクラスのundoSetupOfAddOrDeleteを呼ぶ。
addContainer public void addContainer(int index, ShapeContainer container)
ContainerListのindexを指定してShapeContainerをContainerListに追加。
すでにcontainerがContainerListにあれば削除して、新たに登録する。setContainerIndexを呼ぶ。
フィールド変数undoSetupがtrueならば、このクラスのundoSetupOfAddOrDeleteを呼ぶ。
deleteContainer public void deleteContainer(ShapeContainer container)
ShapeContainerをContainerListから削除する。
削除前に setContainerIndex メソッドを呼ぶ。
フィールド変数undoSetupがtrueならば、このクラスのundoSetupOfAddOrDeleteを呼ぶ。
deleteContainer public void deleteContainer(int index)
順番indexを指定してContainerListからShapeContainerを削除する。
削除前に setContainerIndex メソッドを呼ぶ。
フィールド変数undoSetupがtrueならば、このクラスのundoSetupOfAddOrDeleteを呼ぶ。
deleteContainer public void deleteContainer(String shapeId)
引数:
shapeId - ShapeContainerオブジェクトの shapeId.
Processing:
shapeIdで指定したShapeContainer オブジェクトを ContainerListから削除する。 削除前に setContainerIndex メソッドを呼ぶ。
フィールド変数undoSetupがtrueならば、 このクラスのundoSetupOfAddOrDeleteを呼ぶ。
getContainer public ShapeContainer getContainer(int index)
indexで指定されるcontainerを返す。
setContainerIndexを呼ぶ。
getContainer public ShapeContainer getContainer(String shapeId)
指定されたshapeIdを持つcontainerを返す。containerがContainerListに登録されているオブジェクト (ShapeContainer)の子オブジェクトでも返す。setContainerIndexを呼ぶ。
getContainers public ShapeContainer[] getContainers()
全てのShapeContainerを配列形式で返す。
getSelectedContainers public ShapeContainer[] getSelectedContainers()
全ての選択されているShapeContainerを配列形式で返す。
getAllShapeContainers public Vector getAllShapeContainers()
すべてのShapeContainersをVectorの格納して返す。
例えば上記図1.1, 1.2, 1.3ではRound_Rectangle(No-0), Group(No-1), Group(No-2), Rectangle(No-3), Rectangle(No-4), Group(No-5), Rectangle(No-6), Rectangle(No-7), Line(No-8), Line(No-9), Rectangle(No-10), Rectangle(No-11), Line(No-12), Line(No-13)がこの順番で返される。
この順番は図形のz方向深さ(操作説明書 )と関連しており、 Round_Rectangle(No-0)が最も後ろに、Line(No-13)が最も手前にある。
getAllSigleShapeContainers public ShapeContainer[] getAllSingleShapeContainers()
ContainerListに登録されている全てのShapeContainerのうちグループ図形を除く単一図形のShapeContainerを全て返す。
例えば上記図1.1, 1.2, 1.3ではRound_Rectangle(No-0), Rectangle(No-3), Rectangle(No-4), Rectangle(No-6), Rectangle(No-7), Line(No-8), Line(No-9), Rectangle(No-10), Rectangle(No-11), Line(No-12), Line(No-13)がこの順番で返される。
ShapeContainer.getGroupedSingleShapeContainersメソッドで検索する。
renumberContainerList public void renumberContainerList()
ShapeContainer.shapeIdのシリアルナンバをリナンバーする。
getEditableTextBox public ShapeContainer getEditableTextBox()
テキスト入力・編集可能(アクティブ)なShapeContainerを返す。複数個存在するときはワーニングメッセージを出す。
makeAllTextBoxesUneditable public void makeAllTextBoxesUneditable()
TextBoxを持つ全てのShapeContainerをテキスト入力・編集できないようにする。
swapContainers public void swapContainers(ShapeContainer container1, ShapeContainer container2)
container1, container2のContainerListでの位置を交換する。図形の表示レイヤーを変えるときに使う。
group public ShapeContainer group(ShapeContainer[] containers)
・Group図形用のをShapeContainerを作成する。
・引数で指定される図形をGroupElementに登録する。
・Group図形用のShapeContainerをContainerListに登録する。
登録位置はグループ化された図形のindexの最大値の位置(図形の重なりでは一番手前)。
ungroup public void unGroup(ShapeContainer groupContainer)
・GroupElementに登録されている子要素がContainerListにあることを確認。なければエラーメッセージ出力。
・子要素を選択状態にする。
・groupContainerを削除。
undoSetupStart public void undoSetupStart()
Undo設定開始を宣言する。フィールド変数undoSetup=trueとする。
これ以降、getContainer系統のメソッド(このクラスの読み出しメソッド)が呼ばれると、変更前のShapeContainerのクローンをBackupContainerListにセーブする。
さらにContainerListに登録されているShapeContainerに対し"変更なし"を設定する。
undoSetupStart public void undoSetupStart(ShapeContainer[] containers)
Undo設定開始を宣言する。フィールド変数undoSetup=trueとする。
これ以降、getContainer系統のメソッド(このクラスの読み出しメソッド)が呼ばれると、変更前のShapeContainerのクローンをBackupContainerListにセーブする。
さらにContainerListに登録されているShapeContainerに対し"変更なし"を設定する。
backup private void backup(ShapeContainer container)
指定のShapeContainerのクローンをBackupContainerListにセーブする。
backup private void backup(ShapeContainer[] containers)
指定のShapeContainer(複数)のクローンをBackupContainerListにセーブする。
getBackup private ShapeContainer getBackup(String shapeId)
指定のshapeIdを持つShapeContainerをBackupContainerListから返す。
undoSetupOfAddOrDelete public void undoSetupOfAddOrDelete(int type, ShapeContainer container)
undoSetupStart()が呼ばれた後、undoSetupEnd()が呼ばれるまで、addContainerメソッドとdeleteContainerメソッドが、このメソッドを呼んでundoの設定を行う。
addContainerメソッドから呼ばれたときは、UndoableDrawEdit.CreateContainerオブジェクトをUndoDrawManagerに登録、deleteContainerメソッドから呼ばれたときは、UndoableDrawEdit.DeleteContainerオブジェクトをUndoDrawManagerに登録する。
undoSetupEnd public void undoSetupEnd()
ShapeContainerに変更があった場合、BackupContainerList内の変更前ShapeContainerを取り出し、変更後のShapeContainerとセットにし、変更の UndoableDrawEditオブジェクトをUndoDrawManagerに登録する。
現在のところ変更対象はShapeContainer、TextBox、PaintStyleの3種類に分類しており、コードはそれぞれUndoConstants.CONTAINER, UndoConstants.TEXTBOX, UndoConstants.PAINTSTYLE。ShapeContainerの位置・サイズ変更を意味するUndoConstants.SIZE_POSITION、図形データの変更を示すUndoConstants.SHAPEも用意してあるが、現在のところUndoConstants.CONTAINERで処理している。もっと粒度の細かいundo設定が必要になれば、UndoConstants.SIZE_POSITION、UndoConstants.SHAPEも使う。
変更対象に応じて次の3つのメソッドのどれかを呼ぶ。
undoSetupEndOfContainer private boolean undoSetupEndOfContainer(ShapeContainer container)
ShapeContainerの変更に対するundo設定を行う。
UndoableDrawEdit.ChangeContainerオブジェクトをUndoDrawManagerに登録する。
undoSetupEndOfTextBox private boolean undoSetupEndOfTextBox(ShapeContainer container)
指定ShapeContainerのTextBoxの変更に対するundo設定を行う。
UndoableDrawEdit.ChangeTextBoxオブジェクトをUndoDrawManagerに登録する。
undoSetupEndOfPaintStyle private boolean undoSetupEndOfPaintStyle(ShapeContainer container)
指定ShapeContainerのPaintStyleの変更に対するundo設定を行う。
UndoableDrawEdit.ChangePaintStyleオブジェクトをUndoDrawManagerに登録する。
printContainers public void printContainers()
ContainerList に登録されているShapeContainerを印字する。
toString public String toString()
printContainersの印刷内容を文字列で返す。


Copyright (c) 2009-2013
All other trademarks are property of their respective owners.