プログラムはまだ完成していません。「openFile」と「saveFile」をここで実装することにしましょう。(※プロマネAさんのご助力による)
openFile
完成版のopenFileは後ほど示すことにして、その完成版に至るまでの「プログラムの生い立ち」を見てゆきます。
ワークスペース等に貼り付けてDo itまたはInspect itしながら、発展の過程を垣間見ていただければと思います。
| aMenuBuilder aMenu |
aMenuBuilder := MenuBuilder new.
aMenuBuilder add: 'テキストファイル' -> (Array with: '*.txt' with: '*.TXT').
aMenuBuilder line.
aMenuBuilder add: 'すべてのファイル' -> (Array with: '*').
aMenu := aMenuBuilder menu.
aMenu yourself
これをInspect itするとメニューが得られるはずです。「メニュー」というほどですから、きっと「メニューを開く」こともできるはず。
それでは、「メニューを開いてください!」とお願いしてみましょう。(startUpというメッセージを送ってみてください。)
確かにメニューが作られたようですね。
| aMenuBuilder aMenu aFilename |
aMenuBuilder := MenuBuilder new.
aMenuBuilder add: 'テキストファイル' -> (Array with: '*.txt' with: '*.TXT').
aMenuBuilder line.
aMenuBuilder add: 'すべてのファイル' -> (Array with: '*').
aMenu := aMenuBuilder menu.
aFilename := JunFileRequesterDialog
requestFilename: 'テキストファイルを選択してください。'
fileTypeMenu: aMenu
initialFileType: aMenu values first.
aFilename yourself
さっき作ったメニューをJunFileRequesterDialogに渡して何かしているようですね。これをInspect itしてみてください。
ファイル選択用のダイアログが表示されるはずです。
最後に応答されるのはユーザが選択したファイルです。何も選択せずに「Cancel」した場合は、nilが応答されます。ちなみに、渡したメニューはファイルの種類を選択するためのメニューだったのです。
こうして得られたファイル名(aFilename)を使って、必要なデータを読み込むのです。次の3行によって読み込みを実現します。
aStream := (aFilename withEncoding: #UTF_8) readStream.
[aString := aStream contents] ensure: [aStream close].
self textHolder value: aString
それでは、これらを結合した「openFile」を下に示します。
openFile
| aMenuBuilder aMenu aFilename aStream aString |
aMenuBuilder := MenuBuilder new.
aMenuBuilder add: 'テキストファイル' -> (Array with: '*.txt' with: '*.TXT').
aMenuBuilder line.
aMenuBuilder add: 'すべてのファイル' -> (Array with: '*').
aMenu := aMenuBuilder menu.
aFilename := JunFileRequesterDialog
requestFilename: 'テキストファイルを選択してください。'
fileTypeMenu: aMenu
initialFileType: aMenu values first.
aFilename ifNil: [^nil].
aStream := (aFilename withEncoding: #UTF_8) readStream.
[aString := aStream contents] ensure: [aStream close].
self textHolder value: aString
saveFile
次に、テキストデータの保存処理を行う「saveFile」を実装しましょう。「openFile」との違いはほんの少しですので、説明は省略します。
saveFile
| aMenuBuilder aMenu aFilename aStream aString |
aMenuBuilder := MenuBuilder new.
aMenuBuilder add: 'テキストファイル' -> (Array with: '*.txt' with: '*.TXT').
aMenuBuilder line.
aMenuBuilder add: 'すべてのファイル' -> (Array with: '*').
aMenu := aMenuBuilder menu.
aFilename := JunFileRequesterDialog
requestNewFilename: 'テキストファイルを入力してください。'
initialFilename: 'zzz.txt'
fileTypeMenu: aMenu
initialFileType: aMenu values first.
aFilename ifNil: [^nil].
aString := self textHolder value.
aStream := (aFilename withEncoding: #UTF_8) writeStream.
[aStream nextPutAll: aString] ensure: [aStream close]