1. 概要
∙ cut/copyとpaste操作の対象となるデータは、TextBox内の文字列と図形データ
(ShapeContainer)である。
∙ 文字列のcut/copyとpaste
他アプリケーションとの文字列のやり取りは属性のないPlain textで行う。
本アプリケーションどうしのやり取りは属性つき文字列(java.text.AttributedString)で行う。
Clipboardへコピーするデータは、メソッドのないデータだけの
SerializableAttributedStringオブジェクトを使う。
∙ 図形データのcut/copyとpaste
他アプリケーションとの図形データのやり取りはImage(画像)で行う。
本アプリケーションどうしのやり取りはShapeContainerで行う。Clipboardへコピーするデータは、
メソッドのないデータだけのSerializableElement
オブジェクトを使う。
(1) 文字列のcut/copyとpaste
他アプリケーションとの文字列のやり取りは属性のないPlain textで行う。本アプリケーションどうしのやり取りは
属性つき文字列(java.text.AttributedString)で行う。Clipboardへコピーするデータは、メソッドのないデータだけの
SerializableAttributedStringオブジェクトを使う。
(2)図形データのcut/copyとpaste
2. Editクラス
戻る=>page top
public class Edit implements ClipboardOwner
フィールド
|
説明
|
systemClipboard
|
Clipboard systemClipboard
システムクリップボードを設定。次のように取得する。Toolkit.getDefaultToolkit().getSystemClipboard();
|
lostOwnership
|
boolean lostOwnership
オーナーシップを失ったときtrueを設定する。このクラスのlostOwnershipメソッドで設定する。
|
pasteContainerSave
|
PasteContainer pasteContainerSave
図形をペーストするときのペースト位置を決めるデータを保持するコンテナ。
|
clickedPointSave
|
Point2D clickedPointSave
図形をペーストする前に画面をクリックしたときに、そのクリック点を設定する。
|
AttributedStringFlavor
|
public static final DataFlavor AttributedStringFlavor
このアプリケーション特有のDataFlavor。属性つきAttributedStringのこと。
new DataFlavor(java.io.Serializable.class, "AttributedString")で作成する。
|
DrawShapeFlavor
|
public static final DataFlavor DrawShapeFlavor
このアプリケーション特有のDataFlavor。図形データ(ShapeContainer)のこと。
new DataFlavor(java.io.Serializable.class, "shapeElement")で作成する。
|
PlainString |
public static final int PlainString = 1;
systemClipboardにストアされているデータのタイプを表し、
hasClipboadメソッドの引数で使われる。属性のない文字列。
通常は他のアプリケーション(Microsoft Wordなど)からコピーされた文字列。
|
AttributedString |
public static final int AttributedString = 2;
systemClipboardにストアされているデータのタイプを表し、
hasClipboadメソッドの引数で使われる。
属性のある文字列で、このアプリケーションでコピーされた文字列。
|
Shape |
public static final int Shape = 3;
systemClipboardにストアされているデータのタイプを表し、
hasClipboadメソッドの引数で使われる。
このアプリケーションで作成された図形データ。
|
Image |
public static final int Image = 4;
systemClipboardにストアされているデータのタイプを表し、
hasClipboadメソッドの引数で使われる。
このアプリケーションで作成された画像データまたは他のアプリケーション(Microsoft Paintなど)からコピーされた画像データ。
|
メソッド
|
説明
|
cut
|
public void cut()
TextBoxの文字列または選択された図形をSystemClipboardにコピーする。
文字列のClipboadへのコピーはcopyStringメソッド、選択された図形のClipboadへのコピーはcopyContainersメソッド。
copyString、copyContainersの引数にfalseを設定しているのは、元の文字列または図形をClipboadへのコピーした後、
削除することを意味する。
|
copy
|
public void copy()
TextBoxの文字列または選択された図形をSystemClipboardにコピーする。
文字列のClipboadへのコピーはcopyStringメソッド、選択された図形のClipboadへのコピーはcopyContainersメソッド。
copyString、copyContainersの引数にtrueを設定しているのは、元の文字列または図形をClipboadへのコピーした後、
削除しないことを意味する。
|
copyString
|
private boolean copyString(ShapeContainer shapeContainer, boolean copy)
引数:
shapeContainer - TextBoxを持つ図形
copy - falseのときコピーする文字列をTextBoxから削除、trueのときは削除しない。
処理:
∙ 選択されている文字列をTextBoxから取り出す
TextBox textBox=shapeContainer.getTextBox();
AttributedString attribStr=textBox.getSelectedText();
∙ 引数copy=falseならば、textBoxの文字列の削除処理を行う。
∙ 取り出した文字列(AttributedString)からTransferableAttributedString
オブジェクトを作成しsystemClipboardにセットする。
|
copyContainers
|
private void copyContainers(ShapeContainer[] containers, boolean copy)
引数:
containers - 選択図形の配列
(ShapeContainer オブジェクト).
copy - falseならば選択図形を削除する。
処理:
∙ 選択図形に対してTransferableShapeContainer オブジェクトを作成し
systemClipboardに設定する。
|
copy
|
public void copy()
TextBoxの文字列または選択された図形をSystemClipboardにコピーする。
文字列のClipboadへのコピーはcopyStringメソッド、選択された図形のClipboadへのコピーはcopyContainersメソッド。
copyString、copyContainersの引数にtrueを設定しているのは、
元の文字列または図形をClipboadへのコピーした後、削除しないことを意味する。
|
hasClipboad
|
public boolean hasClipboad(int type)
引数:
type - SystemClipboardにストアされているデータの種類。
Edit.PlainString, Edit.AttributedString,
Edit.Shape, Edit.Imageのいずれかを指定する。
戻り値:
typeで指定したデータがSystemClipboardにストアされているときtrueを返す。
|
paste
|
public void paste()
SystemClipboardからcontentsを取り出す。
Transferable contents=this.systemClipboard.getContents(null);
contentsのDataFlavorに応じて次の処理を行う。
∙ Edit.AttributedStringFlavor
contentsは本アプリケーションのTextBoxからコピーした属性つき文字列である。
このクラスのpasteAttributedStringメソッドでTextBoxにペーストする。
∙ DataFlavor.stringFlavor
contentsは他のアプリケーションからコピーした属性なし文字列(Plain text)である。
このクラスのpasteStringメソッドでTextBoxにペーストする。
∙ Edit.DrawShapeFlavor
contentsは本アプリケーションからコピーした図形データである。
contentsオブジェクトから図形データ(SerializableElementオブジェクト)
を取り出しPasteContainerコンストラクターの引数に設定して
新しいPasteContainerオブジェクトを作成する。このPasteContainerオブジェクトとフィールド変数の
pasteContainerSaveにのオブジェクトをPasteContainerのidで比較し、
一致しなければpasteContainerSaveに新しいPasteContainerを設定する。
図形のペーストはこのクラスのpasteContainersメソッドで行なう。
∙ DataFlavor.imageFlavor
contentsは他のアプリケーションからコピーしたImageである。
contentsオブジェクトからデータを取り出しPasteContainerオブジェクトを作成する。
このオブジェクトとフィールド変数pasteContainerSaveのオブジェクトを比較し、
一致しなければ新しいオブジェクトをpasteContainerSaveに設定する。
画像データのペーストはこのクラスのpasteImageメソッドで行なう。
|
pasteString
|
public boolean pasteString(String str)
引数:
str - ペーストされる文字列.
戻り値:
ペーストを実行したらtrueを返す。
処理:
∙ ContainerManager.getEditableTextBox
でアクティブ(テキスト入力∙ 編集可能)なTextBoxを取り出す。
∙ 引数を属性なしのAttributedString に変換しTextBoxに挿入する。
textBox.insertText
(TextBox.COMMAND, position, attribStr.getIterator());
∙ TextBoxにinsertできた時、戻り値としてtrueを返す。
アクティブなTextBoxがないか、TextBoxのキャレット位置が指定されていなければ戻り値としてfalseを返す。
|
pasteAttributed
String
|
private boolean pasteAttributedString(SerializableAttributedString sString)
引数:
sString -ペーストするSerializableAttributedString オブジェクト
戻り値:
ペーストを実行したらtrueを返す。
処理:
AttributedStringは属性を保持したままpasteする。
ロジックはpasteStringと同じ。
|
pasteContainers
|
private boolean pasteContainers(PasteContainer pasteContainer)
引数:
pasteContainer - PasteContainer オブジェクト。
戻り値:
ペーストを実行したらtrueを返す。
処理:
図形データを、現在画面に表示している図形ファイルのページにペーストする。
実際に図形データをペーストしたときにtrueを返す。
∙ Clipboardから取りだしたSerializableElementの配列を
invertShapeContainerメソッド
でShapeContainerの配列に変換する。
∙ このクラスのgetPastePositionメソッドでペースト位置を計算する。
∙ ContainerManager.addContainerメソッドで
copyされた図形をContainerListに追加。
: ContainerManager.addContainerの前後を
ContainerManager.undoSetupStartと
ContainerManager.undoSetupEndで囲みundoの設定を行なう。
=>
ContainerManager Undoサポート機能
|
pasteImage
|
private boolean pasteImage(PasteContainer pasteContainer)
引数:
pasteContainer - PasteContainer オブジェクト
戻り値:
ペーストを実行したらtrueを返す。
処理:
画像データを、現在画面に表示している図形ファイルのページにペーストする。
∙ 引数pasteContainerから画像を取り出し、その画像を持つ
SerializableElementオブジェクトを作成する。
∙ SerializableElementオブジェクトを変換して、
画像データを持つShapeContainerオブジェクトを作成する。
∙ ShapeContainerオブジェクトを
ContainerManagerの
addContainerメソッドで
ContainerListに付け加える。
|
getPastePosition
|
private Vector2D getPastePosition(PasteContainer pasteContainer, ShapeContainer[]
containers)
引数:
pasteContainer - PasteContainer オブジェクト
containers - ペーストされる図形(ShapeContainer オブジェクト )
戻り値:
現在位置からのペースト位置の平行移動量。
処理:
ペースト位置の規則に従いペースト位置への平行移動量をVector2Dオブジェクトで返す。
つぎの手順で処理する。
∙ ペースト前に画面がクリックされていればクリック点を取り出し、clickedPointSaveに設定する。
∙ 引数 pasteContainer のgetCurrentShiftCountメソッドを呼んで、
右下へずらす回数を取得する。
∙ 元の図形からの平行移動量を計算し、戻り値として返す。
|
createSerializableElement
|
private SerializableElement createSerializableElement(Image image)
引数:
iamge - 画像オブジェクト.
戻り値:
画像データを保持したSerializableElementオブジェクト
処理:
SerializableElementオブジェクトを新規作成、
elementTypeをCommand.IMAGE(ImageElement)とする。
ImageElementに必要なデータを設定する。
∙ ImageElementのサイズを
縦または横が128ピクセルになるように設定する(ペーストした画像はこのサイズで表示される)。
∙ このクラスのgetByteImageメソッドでjava.awt.Imageをbyte配列に変換し、
SerializableElementの
imageByteDataフィールドに設定する。
|
getByteImage
|
public byte[] getByteImage(Image image)
ImageElement.getByteImageと同じ。
|
lostOwnership
|
public void lostOwnership(Clipboard clipboard, Transferable contents)
現在のところ次のgetClipboardInformationで情報を印刷するだけ。
どう使うか分からない。
|
getClipboardInformation
|
private String getClipboardInformation(Clipboard clipboard, ClipboardOwner clipboardOwner)
Clipboardの内容を文字列で返す。
|
delete
|
public void delete()
削除対象はTextBox内のテキストまたは選択されている図形(ShapeContainer)である。
∙ TextBox内のテキストを削除
ContainerManager.getEditableTextBoxメソッドでテキスト編集中のTextBoxがあるかをチェック。
選択テキストをdeleteコマンドまたはBackspaceキーで削除、選択テキストがなければカーソルの前の一文字をBack spaceキーで削除する。
∙ 図形の削除
ContainerManager.deleteContainerメソッドで行う
deleteContainerの前後にContainerManager.undoSetupStartと
ContainerManager.undoSetupEnd を呼んでUndo設定。
参照=>ContainerManager Undoサポート機能
|
:
ペースト位置の規則
Copyまたはcutした図形が格納されていた図形ファイルとページをoriginalFile, originalPageとする。
(1)図形をoriginalFile, originalPageにペーストする場合
右下にずらしてペーストする。続けてペーストするも右下にずらす。
(2)図形をoriginalFileとは異なるファイルまたはoriginalPageと異なるページにペーストする場合
1回目は元の図形の位置にペーストする。2回目からは右下にずらしてペーストする。
(3)ペーストの前に画面をクリックした場合
ペーストするファイル、ページには関係なく、1回目はクリック点に位置にペーストする。
2回目からは右下にずらしてペーストする。
3. TransferableAttributedStringクラス
戻る=>page top
public class TransferableAttributedString implements Transferable, Serializable
TextBox内の属性付きAttributedStringを設定する。
DataFlavor
このアプリケーションでは文字列のDataFlavorに次の2種類を使う。
∙ Edit.AttributedStringFlavor:
このアプリケーション特有のDataFlavor。標準ではないので独自にstatic定数で定義。
∙ DataFlavor.stringFlavor:
属性のないPlain textのDataFlavor。他アプリケーションとのデータ交換に使う。
メソッド
|
説明
|
コンストラクター |
public TransferableAttributedString(AttributedCharacterIterator iterator)
引数:
iterator - 属性つき文字列。
処理:
iterator からSerializableAttributedStringオブジェクトを作成して
sString に設定。
|
getTransferData
|
public Object getTransferData(DataFlavor flavor)
引数:
flavor - データフレーバ
処理:
∙ flavor=Edit.AttributedStringFlavorならば、フィールド変数dataを返す。
∙ flavor=DataFlavor.stringFlavorならば、フィールド変数dataからStringデータを取り出して返す。
|
getTransferDataFlavors
|
public DataFlavor[] getTransferDataFlavors()
Edit.AttributedStringFlavor、DataFlavor.stringFlavorを配列で返す。
|
isDataFlavorSupported
|
public boolean isDataFlavorSupported(DataFlavor flavor)
引数:
flavor - データフレーバ
処理:
flavor=Edit.AttributedStringFlavorまたはflavor=DataFlavor.stringFlavorならばtrueを返す。
|
4. TransferableShapeContainerクラス
戻る=>page top
public class TransferableShapeContainer implements Transferable, Serializable
(1) DataFlavor
このアプリケーションでは図形データのDataFlavorに次の2種類を使う。
∙ Edit.DrawShapeFlavor: このアプリケーション特有のDataFlavor。データフォーマットはSerializableElement.
∙ DataFlavor.imageFlavor: イメージのDataFlavor(java.awt.datatransfer.DataFlavor)。他アプリケーション (e.g. MS
Word, Paint) とのデータ交換に使う。
(2) データ変換
∙ ShapeContainer -> SerializableElement
SerializableElementUtilの
convertShapeContainerメソッドで行なう。
∙ ShapeContainer -> Image
ScreenImageのコンストラクタで行い、
getImageメソッドで取り出す。
メソッド
|
説明
|
コンストラクタ
|
public TransferableShapeContainer(ShapeContainer[] containers)
引数:
containers - クリップボードにコピーされる図形データの配列。
処理:
∙ 引数containersをSerializableElementに変換して
sElementsフィールドに設定する。
∙ 引数containersをScreenImageクラスで画像に変換し、
画像データを取り出してimageフィールドに設定する。
|
getTransferData
|
public Object getTransferData(DataFlavor flavor)
引数:
flavor - データフレーバ
処理:
∙ flavor=Edit.DrawShapeFlavorならば、
フィールド変数sElementsを返す。
∙ flavor=DataFlavor.imageFlavorならば、フィールド変数imageを返す。
|
getTransferDataFlavors
|
public DataFlavor[] getTransferDataFlavors()
Edit.DrawShapeFlavor、DataFlavor.imageFlavorを配列で返す。
|
isDataFlavorSupported
|
public boolean isDataFlavorSupported(DataFlavor flavor)
引数:
flavor - データフレーバ
処理:
flavor= Edit.DrawShapeFlavorまたはflavor= DataFlavor.imageFlavorならばtrueを返す。
|
5. ScreenImageクラス
戻る=>page top
public class ScreenImage implements Serializable, Cloneable
Clipboadに書き込むため選択された図形データの画面イメージを作成する。他アプリケーションとのデータ交換用に使う。
このクラスはBufferedImageからcreateGraphicsでGraphics2Dを作成し、
スクリーンへの描画処理を行うShapeContainer.drawShapeメソッドでBufferedImageに画像を書き込む。
この際、余分なもの(リサイズハンドル、選択ボックスなど)を書き込まないよう、
Draw引数.DrawModeにDraw引数.DrawImageをセットしておく。
フィールド
|
説明
|
containers
|
ShapeContainer[] containers
画面イメージを作成するShapeContainer配列。
このShapeContainer配列の図形を囲む領域をイメージ化する。
|
imageArea
|
Rectangle2D imageArea
イメージ化する領域。getImageSizeで取得する。
|
bufferedImage
|
BufferedImage bufferedImage
ここにShapeContainer.drawShapeメソッドで画像を書き込む。
|
メソッド
|
説明
|
コンストラクター
|
public ScreenImage(ShapeContainer[] containers)
引数:
containers - 画面イメージを作成するShapeContainer配列
処理:
∙ getImageSizeでイメージ化する領域を取得しフィールド変数imageAreaに設定する。
∙ imageAreaのサイズのBufferedImageオブジェクトを作成。
このBufferedImageにdrawImageメソッドでスクリーンイメージを生成する。
|
getImageSize
|
public Rectangle2D getImageSize(double scale, int marginX, int marginY)
引数:
scale - 表示倍率
margineX, margineY - イメージサイズのマージン(ピクセル)
戻り値:
フィールド変数containersを囲む領域を求め、それにmarginX、marginYを加えた領域を返す。
|
drawImage
|
public void drawImage(Graphics g, double scale)
引数:
g - bufferedImageから作成されたグラフィックオブジェクト
Graphics2D g2 = this.bufferedImage.createGraphics();
scale - The scale factor.
処理:
∙ Draw引数.DrawModeにDraw引数.DrawOnImageを設定。
次のdrawShapeメソッドの描画方法を決める。
∙ ShapeContainer.drawShape(g)でフィールド変数containersの図形を描画する。
|
getImage
|
Image getImage()
フィールド変数bufferedImageを返す。
|
toString
|
public String toString()
文字列表現を返す。
|
6. PasteContainerクラス
戻る=>page top
public class PasteContainer implements Serializable, Cloneable
図形データ、画像データを繰り返しペーストする場合、毎回右下にずらしてペーストする。またペーストの直前に画面をクリックするとクリック位置にペーストする。さらに繰り返しペーストすると、クリック点から右下に毎回ずれながらペーストする。このクラスは、繰り返しペーストするときに右下にずらす処理を行うためのデータを保持する。
参照=>ペースト位置の規則
フィールド
|
説明
|
originalFileName
|
String originalFileName
クリップボードにコピーした図形が格納されていたファイル名。画像の場合、他のアプリケーションでコピーされているのでこのフィールドは無効。
|
originalPage
|
int originalPage
クリップボードにコピーした図形が格納されていたページ番号。画像の場合、他のアプリケーションでコピーされているのでこのフィールドは無効。
|
newContents
|
boolean newContents
新しいコンテンツ(sdataまたはimage)をセットしたときtrue。
|
pastedFileName
|
Buffe String pasteFileName
図形、画像をペーストした先のファイル名。
|
pastedPage
|
int pastePage
図形、画像をペーストした先のページ番号。
|
shiftCount |
int shiftCount
|
id
|
String id
図形、画像の識別子。
∙ 図形のId
クリップボードにコピーした図形のSerializableElementを作成した日時をIdとする。この日時はSerializableElementのDate
dateフィールドから取得する。SerializableElementは一般に複数個であり得るが、先頭のSerializableElementの日時を使えばよい。
∙ 画像のId
クリップボードには標準的なDataFlavor.imageFlavorの形式で書き込まれるので、クリップボードにコピーされた日時は記録できない。そこで画像のピクセル情報からユニークに決まるidを作成する。画像のx,y軸中心線のRGBをパックした整数値(long型)を全て加えた値をString型に変換してIdとする。このIdはこのクラスのcreateImageIdを使って作成する。
|
sElements
|
SerializableElement[] sElements
クリップボードにコピーした図形のSerializableElementの配列。
|
image
|
BufferedImage image
クリップボードにコピーした画像データ。
|
メソッド
|
説明
|
コンストラクタ
|
public PasteContainer(SerializableElement[] sElements)
引数:
sElements - SerializableElement オブジェクト
処理:
図形データのPasteContainerオブジェクトを作成する。
フィールド変数originalFileName、originalPage、id、sdataに値を設定。newContentsにtrue、shiftCountに0を設定する。
|
コンストラクタ
|
public PasteContainer(BufferedImage bufferedImage)
引数:
bufferedImage - イメージオブジェクト
処理:
画像データのPasteContainerオブジェクトを作成する。
フィールド変数id、imageに値を設定。newContentsにtrue、shiftCountに0を設定する。
|
toString
|
public String toString()
このオブジェクトの文字列表現を返す。
|
createImageId
|
private long createImageId(BufferedImage bufferedImage)
引数:
bufferedImage - イメージオブジェクト
処理:
画像のx,y軸中心線のRGBをパックした整数値(long型)を全て加えた値を返す。
|
isNewContents
|
public boolean isNewContents()
フィールド変数newContentsを返す。
|
setNewContents
|
public void setNewContents(boolean newContents)
フィールド変数newContentsに引数の値を設定する。
|
getId
|
public String getId()
フィールド変数idを返す。
|
getOriginalFileName
|
public String getOriginalFileName()
フィールド変数originalFileNameを返す。
|
getOriginalPage
|
public int getOriginalPage()
フィールド変数originalPageを返す。
|
getPastedFileName
|
public String getPastedFileName()
フィールド変数pasteFileNameを返す。
|
setPastedFileName
|
public void setPastedFileName(String pasteFileName)
フィールド変数pasteFileNameに引数の値を設定する。
|
getPastedPage
|
public int getPastedPage()
フィールド変数pastePageを返す。
|
setPastedPage
|
public void setPastedPage(int pastePage)
フィールド変数pastePageに引数の値を設定する。
|
getShiftCount
|
public int getShiftCount()
フィールド変数shiftCountを返す。
|
setShiftCount
|
public void setShiftCount(int shiftCount)
フィールド変数shiftCountに引数の値を設定する。
|
getElementList
|
public SerializableElement[] getElementList()
フィールド変数sElementsを返す。
|
getImage
|
public Image getImage()
フィールド変数imageを返す。
|
getCurrentShiftCount
|
private int getCurrentShiftCount()
このクラスのgetPastePositionから呼ばれる。
同じファイルとページにペーストする回数(siftCount)をカウントする。
siftCountはpasteContainer.setShiftCountでPasteContainerオブジェクトに設定する。
|
pasteToOriginalFilePage
|
private boolean pasteToOriginalFilePage()
このクラスのgetShiftCountから呼ばれる。
クリップボードにコピーした図形が属していたファイルとページにペーストするときtrueを返す。
|
pasteToSameFilePage
|
private boolean pasteToSameFilePage()
このクラスのgetPastePosition, getShiftCountから呼ばれる。
一回前にペースとしたファイルとページにペーストするときtrueを返す。
|
|