はじめての2chブラウザのつくりかた(その1)

昨日のエントリにスターがついてるので調子に乗っていろいろ書くことにします。まずはコードの解説。
ヘッダファイルには全て

#import <Thousand2ch/Thousand2ch.h>

が追加してあります。これがないとThousand2chフレームワークが使えませんから。

MyAppDelegate.h, MyAppDelegate.m

NSApplicationのデリゲートで起動時の処理を行ってます。

- (void)applicationWillFinishLaunching:(NSNotification *)notification {
	
	// Thousand 2ch Setup
	T2SetupManager *setupManager = [T2SetupManager sharedManager];
	// Insert Application-specific setup code here
	
	[setupManager setup];
	
	// update 2ch menu
	NSObject <T2ListImporting_v100> *listImporter = (NSObject <T2ListImporting_v100> *)[[T2PluginManager sharedManager] pluginForUniqueName:@"jp_natori_Thousand_2chImporter"];
	T2List *list = [[[listImporter rootListFaces] objectAtIndex:0] list];
	[list load];
}

T2SetupManagerは、起動時のセットアップを担当します*1。Thousand2chフレームワークにはいろんなオブジェクトがあって、それらが活動時に必要とする設定、例えばプラグインフォルダの場所とか画像リソースの場所とか、をまず設定してやらなければなりません。
[setupManager setup] で、デフォルトの設定を行った上でプラグインなどの読み込みを行ってくれます。アプリケーション独自の設定は、setupを呼び出す前にsetupManagerに対してメソッドを呼び出す形で行います。

その後のコードはT2PluginManagerを使って2ちゃんねる読み込み用プラグインを呼び出し、bbsmenu.html(掲示板リスト)を読み込ませています。Thousand2chフレームワークだけでは、2ちゃんねるへのアクセスすら出来ません。標準プラグインにその機能があるわけですが、こいつが困ったことにbbsmenu.htmlを読み込まないと掲示板とサーバの対応表が作れないので、無理矢理読み込ませています。ここらへんはいずれ、ローカルのbsmenu.htmlが無い場合は自動で読み込むようにする予定です。そうなればここのコードは要りません。

MyDocument.h, MyDocument.m
@interface MyDocument : NSDocument
{
	IBOutlet NSTextField *_textField;
	IBOutlet T2ThreadView *_threadView;
}
-(IBAction)load:(id)sender ;
@end

ヘッダはアウトレットとアクションだけです。実装は、

-(IBAction)load:(id)sender {
	NSString *urlString = [_textField stringValue];
	if (!urlString || [urlString length] == 0) return;
	NSString *internalPath = [[T2PluginManager sharedManager] threadInternalPathForProposedURLString:urlString];
	if (internalPath) {
		[_threadView setResExtractPath:@"allRes"];
		[_threadView setThreadInternalPath:internalPath];
		[[_threadView thread] load];
	}
}

まずテキストフィールドの内容を取り出してから、T2PluginManagerを呼び出して「このURLを解釈できるプラグインはいますか?」と聞きます。返ってきたinternalPathは、スレッドに一意のIDみたいなものです。
T2ThreadViewはスレッドを表示するためのWebViewのサブクラスです。表示する前にsetResExtractPath:*2で表示する範囲を設定し、スレッドのinternalPathを設定します。この時点でT2ThreadViewはスレッドオブジェクトを作成し、ローカルにログがある場合はそれも読み込みます。[[_threadView thread] load]で、ネットにアクセスしてスレッドを更新します。
多分この一連の動作は[_threadView takeStringURLFrom:_textField]でも出来ます。ただしこちらの場合は、プラグインのどれもそのURLを解釈できなかったときには、WebViewと同様の動作をします。

*1:なんたらマネージャってあまり好きな形ではないけど

*2:メソッド名から作者の英語力の無さが窺えます