MacOSX用アプリ”CardBook.app”をビルドする
ノートテーカー系のアプリを作成しようと思い、参考になりそうなソースコードを漁っていると良さげなアプリをまた見つけた。
CardBook.app http://www.paullynch.org/macosx/cardbook/ https://github.com/pauldlynch/CardBook
細かい実装を丁寧にこなしている印象なメモアプリ。
修正
Copy&PasteやDrag&Drop時に例外を吐いたの少しだけ修正しました。 原因はNSArchiverの書き出しが現在のMacOSXではサポートされていないため。対応として、NSArchiverをNSKeyedArchiverに、NSUnarchiverをNSKeyedUnarchiverに書き換える以外は何もしていない。
修正箇所はファイルMyDocument.mの以下の2つのメソッドだけ。
[MyDocument copyRows:toPasteboard:]
- (void)copyRows:(NSArray *)rows toPasteboard:(NSPasteboard *)pboard {
NSArray *array = [self cardsForRows:rows];
// NSArchiverをNSKeyedArchiverに置き換え
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];// <-- ここ
NSMutableAttributedString *aString = [[NSMutableAttributedString alloc] initWithString:@""];
NSEnumerator *e = [array objectEnumerator];
Card *card;
while (card = [e nextObject]) {
[aString appendAttributedString:[card card]];
}
[pboard declareTypes:[self pboardTypes] owner:self];
[pboard setData:data forType:CardPboardType];
[pboard setString:[aString string] forType:NSStringPboardType];
[pboard setData:[aString RTFDFromRange:NSMakeRange(0, [aString length]) documentAttributes:nil] forType:NSRTFDPboardType];
[pboard setData:[aString RTFFromRange:NSMakeRange(0, [aString length]) documentAttributes:nil] forType:NSRTFPboardType];
[aString release];
}
[MyDocument addCardFromPboard:atRow:]
- (void)addCardFromPboard:(NSPasteboard *)pboard atRow:(NSInteger)row {
Card *card;
NSData *data;
NSString *type;
type = [pboard availableTypeFromArray:[self pboardTypes]];
if ([type isEqual:CardPboardType]) {
NSEnumerator *e;
NSArray *cardArray;
data = [pboard dataForType:CardPboardType];
// NSUnarchiverをNSKeyedUnarchiverに置き換え
cardArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];//<--ここ
e = [cardArray objectEnumerator];
while (card = [e nextObject])
[self addCard:card atRow:row];
}
if ([type isEqual:NSRTFDPboardType]) {
data = [pboard dataForType:NSRTFDPboardType];
card = [Card card];
[card setCardRTFD:data];
[self addCard:card atRow:row];
}
if ([type isEqual:NSRTFPboardType]) {
data = [pboard dataForType:NSRTFPboardType];
card = [Card card];
[card setCardRTF:data];
[self addCard:card atRow:row];
}
if ([type isEqual:NSStringPboardType]) {
NSString *pboardString = [pboard stringForType:NSStringPboardType];
card = [Card card];
[card setCardString:pboardString];
[self addCard:card atRow:row];
}
}
修正したソースコードはここ。( CardBook-master.zip )
ソースコードの特徴
作成された年代的に以下の技術は使用されていない。
- cocoa binding
- core data
- restore state
- プロパティ
- ARC
- NSViewController
素直に、コードで書かれている。window位置が再生されるのは、保存ファイルに位置を書き込んでいるから。 データの保存は、伝統的なNSKeyedArchiverを使用している。
印刷時にはCardsViewクラスを使ってA4の紙に複数のカードを纏めて印刷可能にしている。最近印刷を前提としていないアプリばかりなので、これは時代的なものなのかもしれない。
他にも、AppleScript用のリソースやローカライズリソースなども存在しており、丁寧に作られているように見える。
UIの特徴
NSTableViewとNSTextEditViewの組み合わせで特に特徴的なものはない。
しかし、Wiki文法やmarkDownを使うことなく、RTFDな修飾を直接使う方がフツーに便利かもと再考させられた。
カード間リンクはない。 “フォーカス”機能で一部のカードだけをリストアップする機能がある。
標準のメモアプリの使用感が一番近いかもしれない。