MacOSX用アプリ”CardBook.app”をビルドする

ノートテーカー系のアプリを作成しようと思い、参考になりそうなソースコードを漁っていると良さげなアプリをまた見つけた。

CardBook.app http://www.paullynch.org/macosx/cardbook/ https://github.com/pauldlynch/CardBook

細かい実装を丁寧にこなしている印象なメモアプリ。

../../../_images/CardBookSS01.png

修正

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な修飾を直接使う方がフツーに便利かもと再考させられた。

カード間リンクはない。 “フォーカス”機能で一部のカードだけをリストアップする機能がある。

標準のメモアプリの使用感が一番近いかもしれない。