Compare commits

...

10 Commits

Author SHA1 Message Date
Matthias Neeracher
d438c0a961 Refactor date parsing, handle ISO 8601 dates 2011-08-24 21:45:46 +02:00
Matthias Neeracher
ee5d7b5d6f Better date parsing, some combinatorial explosion 2011-08-24 18:39:14 +02:00
Matthias Neeracher
5f00a54b60 Date parsing works, but too many false positives 2011-08-24 18:25:34 +02:00
Matthias Neeracher
e9e87825ed Rename Annotations panel to Tags panel 2011-08-24 14:05:15 +02:00
Matthias Neeracher
0c2fc028df Switch back to reference counted memory 2011-08-24 05:33:31 +02:00
Matthias Neeracher
b121d4f4ed Implement Media / Annotation search 2011-08-24 04:30:49 +02:00
Matthias Neeracher
a41504067d Make tag search case insensitive 2011-08-24 04:30:22 +02:00
Matthias Neeracher
3da35a706b Tag search works 2011-08-24 03:40:14 +02:00
Matthias Neeracher
05c678993b Live update of current time display 2011-08-23 22:14:15 +02:00
Matthias Neeracher
8fc0a50455 Tone down highlights in icons 2011-08-23 21:59:59 +02:00
49 changed files with 792 additions and 124 deletions

BIN
Artwork/.DS_Store vendored

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

View File

@ -0,0 +1,71 @@
%PDF-1.3
%Äåòåë§ó ÐÄÆ
4 0 obj
<< /Length 5 0 R /Filter /FlateDecode >>
stream
x]ÍK
Eṫ8+0_8o®Aˆˆû‡¨@²á÷p™†ÑƒeíBézA$ Îë$Ñs>ôÁQ±V´Ÿ˜©Æ¸²cÃTß|ç.Nõà·V¿ï<C2BF>|¯¡"é
endstream
endobj
5 0 obj
91
endobj
2 0 obj
<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [115 134 362 453]
>>
endobj
6 0 obj
<< /ProcSet [ /PDF ] /ColorSpace << /Cs1 7 0 R >> >>
endobj
8 0 obj
<< /Length 9 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>
stream
x…TMLA~-K½bâO2'%ÈBüMÔBK-<2D>Z Ä¢F³l§ta»]g· „½)ñàÝÄx6ž ñà<C3B1>Äh4!èÝăñ'&Î~o·¥ÔÄ0Ít¿™÷Í{ß{ó2D­k†ëÚQATv|•ÊÅgó³×Å¡¥vj# ÃôÜx6;ÉØ©8¿Íc÷#Exg»<67>}5Û¤gõ³RðÌ2QD'jùiºÊ'jØZö]Æyà£Ó¹Q`ŽÓ^; HÇRÒÊ2EJ+"«*EËÞ¯õ ;û8p”í*kåq³ÍõGrøö`þ)ª±™GºVKÓ×#—Ë–ŸžîÎ;s™+À½À÷+øEA&Àç€ßxKSŒÁ<C592>j«¥Ñ 0üDŒñ,ðqà×ϲŸ!à¼cgøn !º!½äp7ðfÑK#Vô³k÷wumWÕë<œ0T2ò[¤3S;Ûò¨`$&°
œMÊ$EE²È&A£ø:´Jp
‡¾ÂjI0þëÌyXêÖ;TWÐ|Àõ6:«Ý®ûøÁººm™ïþj:YÙãÍÃo¸â8¬"ŒÆ ×-Öø_ÈynCÇÖÚ«Ž@©‚â;ÚËÛm[kG66ôH*crN¼=f؇æ"vêkÒ÷¿è¬Ä€Ï¦øEg£Óuo=ã,åýÌn†Ö{õçúwý©þIÿ¡ïèO€¾ýScVU¯×UP;5kÏVÎÕ ²¨çÀ»õ
/ÀÖ¨‚„ªæ[¬ÝCÀoŽ5dÖƒý•<C3BD>“B<E2809C> ü¹,šAD¡M!çîp<C3AE>÷ñ¸ œ<>Ö¥ himH&¡ÅµÓÚ%m"À<17>.h XÎk“±d,ˆõĆc±qÆè·Ú-ÆNÂ:Œÿd­ë½±<C2BD>Ótgr<1F>«Ö©Ñ1sÈ<73>ï<EFBFBD>;l ØÆ
¯‡/ïâÝ!­¸+Êš/ùbP×ÏŠ8ž9)ÒŽÙß+ Û<16>ÉJzR-ÉB?ñÊçˆ~_ ÞÆÈñ·fU-…{‰¼#ú y<>
endstream
endobj
9 0 obj
774
endobj
7 0 obj
[ /ICCBased 8 0 R ]
endobj
3 0 obj
<< /Type /Pages /MediaBox [115 134 362 453] /Count 1 /Kids [ 2 0 R ] >>
endobj
10 0 obj
<< /Type /Catalog /Pages 3 0 R >>
endobj
11 0 obj
(Mac OS X 10.7.1 Quartz PDFContext)
endobj
12 0 obj
(D:20110823021422Z00'00')
endobj
1 0 obj
<< /Producer 11 0 R /CreationDate 12 0 R /ModDate 12 0 R >>
endobj
xref
0 13
0000000000 65535 f
0000001542 00000 n
0000000205 00000 n
0000001311 00000 n
0000000022 00000 n
0000000187 00000 n
0000000313 00000 n
0000001276 00000 n
0000000381 00000 n
0000001257 00000 n
0000001398 00000 n
0000001448 00000 n
0000001500 00000 n
trailer
<< /Size 13 /Root 10 0 R /Info 1 0 R /ID [ <1d0e9c160b34370fcd9479d55fca29b1>
<1d0e9c160b34370fcd9479d55fca29b1> ] >>
startxref
1617
%%EOF

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

View File

@ -26,6 +26,7 @@
950BB7AA13F46BAF00D8E669 /* MAAddMediaSheet.mm in Sources */ = {isa = PBXBuildFile; fileRef = 950BB7A913F46BAF00D8E669 /* MAAddMediaSheet.mm */; };
950BB7AD13F46ECF00D8E669 /* MAAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 950BB7AC13F46ECF00D8E669 /* MAAppController.mm */; };
9556F185140426EB00B81D2E /* MAToolbarButton.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9556F184140426EB00B81D2E /* MAToolbarButton.mm */; };
958AAE3414052FC600365087 /* DateHypotheses.plist in Resources */ = {isa = PBXBuildFile; fileRef = 958AAE3314052FC600365087 /* DateHypotheses.plist */; };
95BCFA2113F76A04000F650F /* app.icns in Resources */ = {isa = PBXBuildFile; fileRef = 95BCFA1F13F76A04000F650F /* app.icns */; };
95BCFA2213F76A04000F650F /* doc.icns in Resources */ = {isa = PBXBuildFile; fileRef = 95BCFA2013F76A04000F650F /* doc.icns */; };
95BCFA2E13F8A3AD000F650F /* MAShortenQTTime.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95BCFA2D13F8A3AD000F650F /* MAShortenQTTime.mm */; };
@ -43,7 +44,7 @@
95D803AD1403505F000C0779 /* del.icns in Resources */ = {isa = PBXBuildFile; fileRef = 95D803AC1403505F000C0779 /* del.icns */; };
95D803B0140355E6000C0779 /* custom.icns in Resources */ = {isa = PBXBuildFile; fileRef = 95D803AE140355E6000C0779 /* custom.icns */; };
95D803B1140355E6000C0779 /* print.icns in Resources */ = {isa = PBXBuildFile; fileRef = 95D803AF140355E6000C0779 /* print.icns */; };
95E2027D13FE9BF500369B31 /* MAMovieWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 95E2027C13FE9BF500369B31 /* MAMovieWindow.m */; };
95E2027D13FE9BF500369B31 /* MAMovieWindow.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95E2027C13FE9BF500369B31 /* MAMovieWindow.mm */; };
95E2028113FE9C6C00369B31 /* MAMovie.xib in Resources */ = {isa = PBXBuildFile; fileRef = 95E2027F13FE9C6C00369B31 /* MAMovie.xib */; };
95E8C26713FD72D2004E9839 /* MAColorForURL.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95E8C26613FD72D2004E9839 /* MAColorForURL.mm */; };
/* End PBXBuildFile section */
@ -80,6 +81,7 @@
950BB7AC13F46ECF00D8E669 /* MAAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MAAppController.mm; sourceTree = "<group>"; };
9556F183140426EB00B81D2E /* MAToolbarButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAToolbarButton.h; sourceTree = "<group>"; };
9556F184140426EB00B81D2E /* MAToolbarButton.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MAToolbarButton.mm; sourceTree = "<group>"; };
958AAE3314052FC600365087 /* DateHypotheses.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = DateHypotheses.plist; path = Medianno/Resources/DateHypotheses.plist; sourceTree = "<group>"; };
95BCFA1F13F76A04000F650F /* app.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = app.icns; path = Resources/app.icns; sourceTree = "<group>"; };
95BCFA2013F76A04000F650F /* doc.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = doc.icns; path = Resources/doc.icns; sourceTree = "<group>"; };
95BCFA2C13F8A3AD000F650F /* MAShortenQTTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAShortenQTTime.h; sourceTree = "<group>"; };
@ -103,7 +105,7 @@
95D803AE140355E6000C0779 /* custom.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = custom.icns; path = Resources/custom.icns; sourceTree = "<group>"; };
95D803AF140355E6000C0779 /* print.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = print.icns; path = Resources/print.icns; sourceTree = "<group>"; };
95E2027B13FE9BF500369B31 /* MAMovieWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAMovieWindow.h; sourceTree = "<group>"; };
95E2027C13FE9BF500369B31 /* MAMovieWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MAMovieWindow.m; sourceTree = "<group>"; };
95E2027C13FE9BF500369B31 /* MAMovieWindow.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MAMovieWindow.mm; sourceTree = "<group>"; };
95E2028013FE9C6C00369B31 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = Medianno/en.lproj/MAMovie.xib; sourceTree = "<group>"; };
95E8C26513FD72D2004E9839 /* MAColorForURL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MAColorForURL.h; sourceTree = "<group>"; };
95E8C26613FD72D2004E9839 /* MAColorForURL.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MAColorForURL.mm; sourceTree = "<group>"; };
@ -164,16 +166,6 @@
950BB67113F1F26200D8E669 /* Supporting Files */ = {
isa = PBXGroup;
children = (
95D803AE140355E6000C0779 /* custom.icns */,
95D803AF140355E6000C0779 /* print.icns */,
95D803AC1403505F000C0779 /* del.icns */,
95D803AA14034E5F000C0779 /* anno.icns */,
95D803A1140344CF000C0779 /* fwd.icns */,
95D803A2140344CF000C0779 /* pause.icns */,
95D803A3140344CF000C0779 /* play.icns */,
95D803A4140344CF000C0779 /* rev.icns */,
95BCFA1F13F76A04000F650F /* app.icns */,
95BCFA2013F76A04000F650F /* doc.icns */,
950BB67213F1F26200D8E669 /* Medianno-Info.plist */,
950BB67313F1F26200D8E669 /* InfoPlist.strings */,
950BB67613F1F26200D8E669 /* main.m */,
@ -187,11 +179,13 @@
950BB7AE13F47FCA00D8E669 /* Resources */ = {
isa = PBXGroup;
children = (
958AAE3214052F7400365087 /* Icons */,
950BB67F13F1F26200D8E669 /* MADocument.xib */,
950BB7A513F467A400D8E669 /* MAAddMedia.xib */,
950BB68213F1F26200D8E669 /* MainMenu.xib */,
95E2027F13FE9C6C00369B31 /* MAMovie.xib */,
95CB6973140012FE005A0346 /* MATag.xib */,
958AAE3314052FC600365087 /* DateHypotheses.plist */,
);
name = Resources;
path = ..;
@ -235,7 +229,7 @@
95CB697614001F26005A0346 /* MAColorForTag.h */,
95CB697714001F26005A0346 /* MAColorForTag.mm */,
95E2027B13FE9BF500369B31 /* MAMovieWindow.h */,
95E2027C13FE9BF500369B31 /* MAMovieWindow.m */,
95E2027C13FE9BF500369B31 /* MAMovieWindow.mm */,
95D8038914012D7A000C0779 /* MADragging.h */,
95D8038A14012D7A000C0779 /* MADragging.mm */,
9556F183140426EB00B81D2E /* MAToolbarButton.h */,
@ -244,6 +238,24 @@
name = Classes;
sourceTree = "<group>";
};
958AAE3214052F7400365087 /* Icons */ = {
isa = PBXGroup;
children = (
95D803AE140355E6000C0779 /* custom.icns */,
95D803AF140355E6000C0779 /* print.icns */,
95D803AC1403505F000C0779 /* del.icns */,
95D803AA14034E5F000C0779 /* anno.icns */,
95D803A1140344CF000C0779 /* fwd.icns */,
95D803A2140344CF000C0779 /* pause.icns */,
95D803A3140344CF000C0779 /* play.icns */,
95D803A4140344CF000C0779 /* rev.icns */,
95BCFA1F13F76A04000F650F /* app.icns */,
95BCFA2013F76A04000F650F /* doc.icns */,
);
name = Icons;
path = Medianno;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -313,6 +325,7 @@
95D803AD1403505F000C0779 /* del.icns in Resources */,
95D803B0140355E6000C0779 /* custom.icns in Resources */,
95D803B1140355E6000C0779 /* print.icns in Resources */,
958AAE3414052FC600365087 /* DateHypotheses.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -336,7 +349,7 @@
95BCFA2E13F8A3AD000F650F /* MAShortenQTTime.mm in Sources */,
95CA841113FC149B00AE5AC4 /* MATokenFieldCell.mm in Sources */,
95E8C26713FD72D2004E9839 /* MAColorForURL.mm in Sources */,
95E2027D13FE9BF500369B31 /* MAMovieWindow.m in Sources */,
95E2027D13FE9BF500369B31 /* MAMovieWindow.mm in Sources */,
95CB69711400112A005A0346 /* MATagWindow.mm in Sources */,
95CB697814001F26005A0346 /* MAColorForTag.mm in Sources */,
95D8038B14012D7A000C0779 /* MADragging.mm in Sources */,
@ -465,7 +478,7 @@
950BB68B13F1F26200D8E669 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_ENABLE_OBJC_GC = required;
GCC_ENABLE_OBJC_GC = unsupported;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Medianno/Medianno-Prefix.pch";
INFOPLIST_FILE = "Medianno/Medianno-Info.plist";
@ -479,7 +492,7 @@
950BB68C13F1F26200D8E669 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_ENABLE_OBJC_GC = required;
GCC_ENABLE_OBJC_GC = unsupported;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "Medianno/Medianno-Prefix.pch";
INFOPLIST_FILE = "Medianno/Medianno-Info.plist";

View File

@ -9,12 +9,16 @@
#import <Cocoa/Cocoa.h>
@interface MAAddMediaSheet : NSWindowController {
IBOutlet NSMenu * dateFormatMenu;
}
@property (readonly) NSArray * media;
@property (readonly) NSArray * media;
@property (readonly) NSArray * dateFormats;
@property (assign) NSDictionary * selectedDateFormat;
- (void)runWithParentWindow:(NSWindowController *)parent media:(NSArray *)urls;
- (IBAction)useModificationDates:(id)sender;
- (IBAction)useFileNameDates:(id)sender;
@end

View File

@ -12,17 +12,105 @@
@implementation MAAddMediaSheet
@synthesize media;
static NSDictionary * sDateHypotheses;
@synthesize media, dateFormats, selectedDateFormat;
- (id)init
{
self = [super initWithWindowNibName:@"MAAddMedia"];
if (!sDateHypotheses)
sDateHypotheses = [[NSDictionary alloc] initWithContentsOfURL:
[[NSBundle mainBundle] URLForResource:@"DateHypotheses" withExtension:@"plist"]];
return self;
}
- (NSString *)normalizedFileName:(NSURL *)url
{
NSString * fileName = [[url lastPathComponent] stringByDeletingPathExtension];
for (NSArray * norm in [sDateHypotheses objectForKey:@"normalize"]) {
NSRegularExpression * regexp = [NSRegularExpression regularExpressionWithPattern:[norm objectAtIndex:0] options:0 error:nil];
NSString * templ = [norm objectAtIndex:1];
fileName = [regexp stringByReplacingMatchesInString:fileName options:0
range:NSMakeRange(0, [fileName length]) withTemplate:templ];
}
return fileName;
}
#define LOG_DATEGUESS 0
#if LOG_DATEGUESS
#define LOG_DG NSLog
#else
#define LOG_DG(...) do {} while(0)
#endif
- (void)guessDateFormats:(NSArray *)urls
{
[self window];
[self willChangeValueForKey:@"dateFormats"];
[dateFormats release];
dateFormats = nil;
while ([dateFormatMenu numberOfItems] > 2)
[dateFormatMenu removeItemAtIndex:2];
if (![urls count])
return;
NSMutableArray * formats = [NSMutableArray array];
NSString * fileName = [self normalizedFileName:[urls objectAtIndex:0]];
LOG_DG(@"Representative File: %@\n", fileName);
NSRange nameRange= NSMakeRange(0, [fileName length]);
//
// Since date and time formats are largely orthogonal, and since for each regular expression,
// there are a number of possible date format hypotheses, we end up with 4 nested loops:
// - Regular expressions matching date portion
// - Regular expressions matching time portion
// - Date format matching date portion
// - Date format matching time portion
//
for (NSDictionary * dateHypo in [sDateHypotheses objectForKey:@"date"]) {
NSString * filterString = [dateHypo objectForKey:@"regexp"];
NSRegularExpression * filter =
[NSRegularExpression regularExpressionWithPattern:filterString options:0 error:nil];
LOG_DG(@" Filtering %@\n", filterString);
if (![filter numberOfMatchesInString:fileName options:0 range:nameRange])
continue; // Not going to match this one, regardless of time format
for (NSDictionary * timeHypo in [sDateHypotheses objectForKey:@"time"]) {
NSString * regexpString =
[[dateHypo objectForKey:@"regexp"] stringByAppendingString:[timeHypo objectForKey:@"regexp"]];
LOG_DG(@" Trying %@\n", regexpString);
NSRegularExpression * regexp =
[NSRegularExpression regularExpressionWithPattern:regexpString options:0 error:nil];
NSTextCheckingResult* match = [regexp firstMatchInString:fileName options:0 range:nameRange];
if (match && [match range].location != NSNotFound) {
for (NSString * dateFmt in [dateHypo objectForKey:@"formats"]) {
for (NSString * timeFmt in [timeHypo objectForKey:@"formats"]) {
NSString * format = [dateFmt stringByAppendingString:timeFmt];
LOG_DG(@" Format %@\n", format);
NSString * dateFormat = [regexp replacementStringForResult:match inString:fileName offset:0 template:format];
NSString * dateTitle = [NSString stringWithFormat:NSLocalizedString(@"File Name Date", @"File Name yyyy-mm-dd"), dateFormat];
NSMenuItem * item = [dateFormatMenu addItemWithTitle:dateTitle action:@selector(useFileNameDates:) keyEquivalent:@""];
[item setTag:[formats count]];
[formats addObject:[NSDictionary dictionaryWithObjectsAndKeys:
dateFormat, @"format",
regexp, @"regexp",
nil]];
}
}
}
}
}
if ([formats count] > 0)
dateFormats = [formats retain];
[self didChangeValueForKey:@"dateFormats"];
}
- (void)runWithParentWindow:(NSWindowController *)parent media:(NSArray *)mediaUrls
{
[self guessDateFormats:mediaUrls];
NSMutableArray * m = [[NSMutableArray alloc] initWithCapacity:[mediaUrls count]];
for (NSURL * url in mediaUrls)
[m addObject:[NSMutableDictionary dictionaryWithObject:url forKey:@"url"]];
@ -40,16 +128,55 @@
}
[[self window] orderOut:self];
[self autorelease];
[media release];
media = nil;
}];
}
- (IBAction)useModificationDates:(id)sender
{
[self setSelectedDateFormat:nil];
[self willChangeValueForKey:@"media"];
for (NSMutableDictionary * m in media) {
NSDate * modificationDate;
[[m objectForKey:@"url"] getResourceValue:&modificationDate forKey:NSURLContentModificationDateKey error:nil];
if (![[m objectForKey:@"url"] getResourceValue:&modificationDate forKey:NSURLContentModificationDateKey error:nil])
modificationDate = nil;
[m setObject:(modificationDate ? modificationDate : [NSDate date]) forKey:@"date"];
}
[self didChangeValueForKey:@"media"];
}
- (IBAction)useFileNameDates:(id)sender
{
[self setSelectedDateFormat:[dateFormats objectAtIndex:[sender tag]]];
NSRegularExpression * regexp = [selectedDateFormat objectForKey:@"regexp"];
NSString * format = [selectedDateFormat objectForKey:@"format"];
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:format];
[self willChangeValueForKey:@"media"];
for (NSMutableDictionary * m in media) {
NSString * name = [self normalizedFileName:[m objectForKey:@"url"]];
LOG_DG(@"File %@\n", name);
NSTextCheckingResult * match= [regexp firstMatchInString:name options:0 range:NSMakeRange(0, [name length])];
NSDate * modificationDate = nil;
if (match && [match range].location != NSNotFound) {
//
// First and last capture is for leading and trailing context
//
NSRange dateRange = [match rangeAtIndex:1];
dateRange.location += dateRange.length;
dateRange.length = [match rangeAtIndex:[match numberOfRanges]-1].location - dateRange.location;
NSString * dateString = [name substringWithRange:dateRange];
modificationDate = [formatter dateFromString:dateString];
LOG_DG(@" Date %@ %@\n", format, (modificationDate ? @"succeeded" : @"failed"));
}
if (!modificationDate)
if (![[m objectForKey:@"url"] getResourceValue:&modificationDate forKey:NSURLContentModificationDateKey error:nil])
modificationDate = nil;
[m setObject:(modificationDate ? modificationDate : [NSDate date]) forKey:@"date"];
}
[self didChangeValueForKey:@"media"];
}
- (IBAction)endSheet:(id)sender

View File

@ -41,6 +41,7 @@
- (void)dealloc
{
[contents release];
[super dealloc];
}
+ (id)arrayWithArray:(NSArray *)array

View File

@ -26,8 +26,9 @@
QTTime lastMovieTime;
}
@property BOOL exportAnnotations;
@property BOOL exportTags;
@property BOOL exportAnnotations;
@property BOOL exportTags;
@property (nonatomic,retain)NSString * searchString;
- (IBAction)addMediaFiles:(id)sender;
- (IBAction)importText:(id)sender;

View File

@ -24,7 +24,7 @@ static const char * kMADocWindowObserver = "MADocWindowObserver";
@implementation MADocWindow
@synthesize exportAnnotations, exportTags;
@synthesize exportAnnotations, exportTags, searchString;
- (id)initWithWindow:(NSWindow *)window
{
@ -36,6 +36,13 @@ static const char * kMADocWindowObserver = "MADocWindowObserver";
return self;
}
- (void)dealloc
{
[currentMovie release];
[searchString release];
[super dealloc];
}
- (void)windowDidLoad
{
[super windowDidLoad];
@ -47,10 +54,6 @@ static const char * kMADocWindowObserver = "MADocWindowObserver";
[self registerOurDragTypes];
}
- (void)dealloc
{
}
- (MAMovieWindow *)moviePanel
{
return [[NSApp delegate] moviePanel];
@ -93,14 +96,17 @@ static const char * kMADocWindowObserver = "MADocWindowObserver";
//
// Current movie changed
//
[currentMovie release];
if (MAMedia * currentMedia = [self currentMedia]) {
NSURL * mediaURL = [NSURL URLWithString:[currentMedia media]];
currentMovie = [[QTMovie alloc] initWithURL:mediaURL error:nil];
currentMovieTitle = [currentMedia name];
} else {
currentMovie = nil;
currentMovieTitle = @"";
currentMovie = nil;
currentMovieTitle = @"";
}
lastMovieTime = QTMakeTime(-1, 600);
[self updateMovieTime:nil];
}
[self moviePanelDidAppear];
}
@ -225,6 +231,7 @@ static const char * kMADocWindowObserver = "MADocWindowObserver";
NSDictionary * attributes = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
forKey:QTMovieFlatten];
[exportMovie writeToFile:[url path] withAttributes:attributes];
[exportMovie release];
}
#define kMAAudioTypes @"m4a", @"aiff", @"aif", @"wav", @"caf", @"mp3"
@ -325,7 +332,8 @@ static NSTimeInterval sLastSkip = 0.0;
[currentMovie setCurrentTime:current];
sLastSkip *= 1.1;
[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(resetSkipFactor:) object:self];
[self performSelector:@selector(resetSkipFactor:) withObject:self afterDelay:1.0];
[self performSelector:@selector(resetSkipFactor:) withObject:self afterDelay:0.5];
[self updateMovieTime:nil];
}
- (IBAction)mediaSkipBackward:(id)sender
@ -501,6 +509,29 @@ static NSTimeInterval sLastSkip = 0.0;
}];
}
#pragma mark Searching
- (void)setSearchString:(NSString *)str
{
[self willChangeValueForKey:@"searchString"];
if (searchString != str) {
[searchString release];
searchString = [str retain];
}
if (!searchString || [searchString isEqual:@""]) {
[mediaController setFilterPredicate:nil];
[annotationController setFilterPredicate:nil];
} else {
NSArray * matchingTags = [[self document] tagDescriptionsMatching:searchString];
[mediaController setFilterPredicate:
[NSPredicate predicateWithFormat:@"SUBQUERY(annotations,$a,$a.notes CONTAINS[cd] %@ OR ANY $a.tagDescriptions IN %@).@count > 0",
searchString, matchingTags]];
[annotationController setFilterPredicate:
[NSPredicate predicateWithFormat:@"notes CONTAINS[cd] %@ OR ANY tagDescriptions IN %@",
searchString, matchingTags]];
}
[self didChangeValueForKey:@"searchString"];
}
@end
@implementation MADocumentWindow

View File

@ -23,5 +23,6 @@
- (MATagDescription *)tagDescriptionForName:(NSString *)name notes:(NSString *)notes;
- (NSArray *)tagNamesMatchingPrefix:(NSString *)prefix;
- (NSSet *)allTags;
- (NSArray *)tagDescriptionsMatching:(NSString *)substring;
@end

View File

@ -31,6 +31,7 @@
{
MADocWindow * windowController = [[MADocWindow alloc] initWithWindowNibName:[self windowNibName]];
[self addWindowController:windowController];
[windowController release];
}
+ (BOOL)autosavesInPlace
@ -133,6 +134,16 @@
return names;
}
- (NSArray *)tagDescriptionsMatching:(NSString *)substring
{
NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest * fetch = [NSFetchRequest fetchRequestWithEntityName:@"MATagDescription"];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@ OR notes CONTAINS[cd] %@",
substring, substring]];
return [moc executeFetchRequest:fetch error:nil];
}
- (NSSet *)allTags
{
NSManagedObjectContext *moc = [self managedObjectContext];

View File

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>date</key>
<array>
<dict>
<key>regexp</key>
<string>^(.*\D|)\d\d\d\d()\d\d(\2)\d\d</string>
<key>comment</key>
<string>4 digit year, no separators</string>
<key>formats</key>
<array>
<string>yyyyddMM</string>
<string>yyyyMMdd</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>^(.*\D|)\d\d\d\d(\D)\d\d?(\2)\d\d?</string>
<key>comment</key>
<string>4 digit year, separators</string>
<key>formats</key>
<array>
<string>yyyy$2dd$3MM</string>
<string>yyyy$2MM$3dd</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>^(.*\D|)\d\d()\d\d(\2)\d\d</string>
<key>comment</key>
<string>2 digit year, no separators</string>
<key>formats</key>
<array>
<string>MMddyy</string>
<string>ddMMyy</string>
<string>yyMMdd</string>
<string>yyddMM</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>^(.*\D|)\d\d?(\D)\d\d(\2)\d\d</string>
<key>comment</key>
<string>2 digit year (yy at end), separators</string>
<key>formats</key>
<array>
<string>MM$2dd$3yy</string>
<string>dd$2MM$3yy</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>^(.*\D|)\d\d(\D)\d\d(\2)\d\d?</string>
<key>comment</key>
<string>2 digit year (yy at beginning), separators</string>
<key>formats</key>
<array>
<string>yy$2dd$3MM</string>
<string>yy$2MM$3dd</string>
</array>
</dict>
</array>
<key>time</key>
<array>
<dict>
<key>regexp</key>
<string>(\D*\s\D*)\d\d?(\D?)\d\d(\5)\d\d(\s+)[APap][mM](\W.*|)$</string>
<key>comment</key>
<string>seconds, AM/PM</string>
<key>formats</key>
<array>
<string>$4hh$5mm$6ss$7a</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\D*\s\D*)\d\d?(\D?)\d\d(\s+)[APap][mM](\W.*|)$</string>
<key>comment</key>
<string>no seconds, AM/PM</string>
<key>formats</key>
<array>
<string>$4hh$5mm$6a</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\D*\s\D*)\d\d?(\D?)\d\d(\5)\d\d(\D.*|)$</string>
<key>comment</key>
<string>seconds, no AM/PM</string>
<key>formats</key>
<array>
<string>$4HH$5mm$6ss</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\D*\s\D*)\d\d?(\D?)\d\d(\D.*|)$</string>
<key>comment</key>
<string>no seconds, no AM/PM</string>
<key>formats</key>
<array>
<string>$4HH$5mm</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\D.*|)$</string>
<key>comment</key>
<string>date only</string>
<key>formats</key>
<array>
<string></string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\s*T\s*)\d\d?(\D?)\d\d(\5)\d\d(\s*Z?\D.*|)$</string>
<key>comment</key>
<string>seconds, ISO UTC</string>
<key>formats</key>
<array>
<string>&apos;$4&apos;HH$5mm$6ss</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\s+)\d\d?(\D?)\d\d(\5)\d\d(\s*Z\D.*|)$</string>
<key>comment</key>
<string>seconds, ISO UTC</string>
<key>formats</key>
<array>
<string>$4HH$5mm$6ss</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\s*(?:T|\s)\s*)\d\d?(\D?)\d\d(\5)\d\d(\s*)[-+]\d\d(\d\d|)(\s*\D.*|)$</string>
<key>comment</key>
<string>seconds, ISO time zone</string>
<key>formats</key>
<array>
<string>&apos;$4&apos;HH$5mm$6ss$7ZZZ</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\s*T\s*)\d\d?(\D?)\d\d(\s*Z?\D.*|)$</string>
<key>comment</key>
<string>no seconds, ISO UTC</string>
<key>formats</key>
<array>
<string>&apos;$4&apos;HH$5mm</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\s+)\d\d?(\D?)\d\d(\s*Z\D.*|)$</string>
<key>comment</key>
<string>no seconds, ISO UTC</string>
<key>formats</key>
<array>
<string>$4HH$5mm</string>
</array>
</dict>
<dict>
<key>regexp</key>
<string>(\s*(?:T|\s)\s*)\d\d?(\D?)\d\d(\s*)[-+]\d\d(\d\d|)(\s*\D.*|)$</string>
<key>comment</key>
<string>no seconds, ISO time zone</string>
<key>formats</key>
<array>
<string>&apos;$4&apos;HH$5mm$6ZZZ</string>
</array>
</dict>
</array>
<key>normalize</key>
<array>
<array>
<string>([-+]\d\d):(\d\d)</string>
<string>$1$2</string>
</array>
</array>
</dict>
</plist>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,5 +6,6 @@
Copyright 2011 Matthias Neeracher. All rights reserved.
*/
"Play" = "Play";
"Pause"= "Pause";
"Play" = "Play";
"Pause" = "Pause";
"File Name Date" = "File Name <%@>";

View File

@ -74,6 +74,7 @@
<string key="NSFrame">{{660, 12}, {107, 32}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:161</string>
<int key="NSTag">1000</int>
<bool key="NSEnabled">YES</bool>
@ -137,7 +138,7 @@
<string key="NSFrameSize">{781, 380}</string>
<reference key="NSSuperview" ref="482978525"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="106724295"/>
<reference key="NSNextKeyView" ref="635678385"/>
<string key="NSReuseIdentifierKey">_NS:1197</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTableHeaderView" key="NSHeaderView" id="678384619">
@ -340,7 +341,7 @@
<string key="NSFrame">{{-1, 54}, {783, 398}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="482978525"/>
<reference key="NSNextKeyView" ref="106724295"/>
<string key="NSReuseIdentifierKey">_NS:1193</string>
<int key="NSsFlags">133682</int>
<reference key="NSVScroller" ref="635678385"/>
@ -352,10 +353,10 @@
<object class="NSPopUpButton" id="19618719">
<reference key="NSNextResponder" ref="1006"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{137, 456}, {371, 26}}</string>
<string key="NSFrame">{{137, 456}, {468, 26}}</string>
<reference key="NSSuperview" ref="1006"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<reference key="NSNextKeyView" ref="333350533"/>
<string key="NSReuseIdentifierKey">_NS:179</string>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="247335376">
@ -370,34 +371,34 @@
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">400</int>
<int key="NSPeriodicInterval">75</int>
<object class="NSMenuItem" key="NSMenuItem" id="1014844797">
<reference key="NSMenu" ref="694863336"/>
<string key="NSTitle">Modification Date</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<int key="NSState">1</int>
<object class="NSCustomResource" key="NSOnImage" id="218087945">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="207621535">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="247335376"/>
</object>
<nil key="NSMenuItem"/>
<bool key="NSMenuItemRespectAlignment">YES</bool>
<object class="NSMenu" key="NSMenu" id="694863336">
<string key="NSTitle">OtherViews</string>
<object class="NSMutableArray" key="NSMenuItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="1014844797"/>
<object class="NSMenuItem" id="1014844797">
<reference key="NSMenu" ref="694863336"/>
<string key="NSTitle">Modification Date</string>
<string key="NSKeyEquiv"/>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
<object class="NSCustomResource" key="NSOnImage" id="218087945">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuCheckmark</string>
</object>
<object class="NSCustomResource" key="NSMixedImage" id="207621535">
<string key="NSClassName">NSImage</string>
<string key="NSResourceName">NSMenuMixedState</string>
</object>
<string key="NSAction">_popUpItemAction:</string>
<reference key="NSTarget" ref="247335376"/>
</object>
<object class="NSMenuItem" id="398634218">
<reference key="NSMenu" ref="694863336"/>
<bool key="NSIsDisabled">YES</bool>
<bool key="NSIsSeparator">YES</bool>
<bool key="NSIsHidden">YES</bool>
<string key="NSTitle"/>
<string key="NSKeyEquiv"/>
<int key="NSMnemonicLoc">2147483647</int>
@ -409,6 +410,7 @@
</object>
<reference key="NSMenuFont" ref="706852951"/>
</object>
<int key="NSSelectedIndex">-1</int>
<int key="NSPreferredEdge">1</int>
<bool key="NSUsesItemFromMenu">YES</bool>
<bool key="NSAltersState">YES</bool>
@ -560,6 +562,75 @@
</object>
<int key="connectionID">76</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">hidden: dateFormats</string>
<reference key="source" ref="398634218"/>
<reference key="destination" ref="1001"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="398634218"/>
<reference key="NSDestination" ref="1001"/>
<string key="NSLabel">hidden: dateFormats</string>
<string key="NSBinding">hidden</string>
<string key="NSKeyPath">dateFormats</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSValueTransformerName</string>
<string key="NS.object.0">NSIsNil</string>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">87</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: selectedDateFormat</string>
<reference key="source" ref="1014844797"/>
<reference key="destination" ref="1001"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="1014844797"/>
<reference key="NSDestination" ref="1001"/>
<string key="NSLabel">value: selectedDateFormat</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">selectedDateFormat</string>
<object class="NSDictionary" key="NSOptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSAllowsEditingMultipleValuesSelection</string>
<string>NSConditionallySetsEnabled</string>
<string>NSRaisesForNotApplicableKeys</string>
<string>NSValueTransformerName</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<boolean value="NO"/>
<boolean value="NO"/>
<boolean value="NO"/>
<string>NSIsNil</string>
</object>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">93</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">useModificationDates:</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="1014844797"/>
</object>
<int key="connectionID">97</int>
</object>
<object class="IBConnectionRecord">
<object class="IBOutletConnection" key="connection">
<string key="label">dateFormatMenu</string>
<reference key="source" ref="1001"/>
<reference key="destination" ref="694863336"/>
</object>
<int key="connectionID">101</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -860,7 +931,7 @@
<reference key="dict.values" ref="0"/>
</object>
<nil key="sourceID"/>
<int key="maxID">76</int>
<int key="maxID">101</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -869,14 +940,46 @@
<string key="className">MAAddMediaSheet</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">useModificationDates:</string>
<string key="NS.object.0">id</string>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>useFileNameDates:</string>
<string>useModificationDates:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<string key="NS.key.0">useModificationDates:</string>
<object class="IBActionInfo" key="NS.object.0">
<string key="name">useModificationDates:</string>
<string key="candidateClassName">id</string>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>useFileNameDates:</string>
<string>useModificationDates:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBActionInfo">
<string key="name">useFileNameDates:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">useModificationDates:</string>
<string key="candidateClassName">id</string>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<string key="NS.key.0">dateFormatMenu</string>
<string key="NS.object.0">NSMenu</string>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<string key="NS.key.0">dateFormatMenu</string>
<object class="IBToOneOutletInfo" key="NS.object.0">
<string key="name">dateFormatMenu</string>
<string key="candidateClassName">NSMenu</string>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">

View File

@ -158,11 +158,9 @@
<string key="NSToolbarItemPaletteLabel">&lt;&lt;</string>
<nil key="NSToolbarItemToolTip"/>
<object class="NSButton" key="NSToolbarItemView" id="401296146">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{0, 14}, {32, 32}}</string>
<reference key="NSSuperview"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:1491</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="135304652">
@ -251,11 +249,9 @@
<string key="NSToolbarItemPaletteLabel">&gt;&gt;</string>
<nil key="NSToolbarItemToolTip"/>
<object class="NSButton" key="NSToolbarItemView" id="734900919">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{0, 14}, {32, 32}}</string>
<reference key="NSSuperview"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:1491</string>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="272029418">
@ -318,19 +314,17 @@
<string key="NSToolbarItemPaletteLabel">Search</string>
<nil key="NSToolbarItemToolTip"/>
<object class="NSSearchField" key="NSToolbarItemView" id="891639952">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">268</int>
<string key="NSFrame">{{0, 14}, {96, 22}}</string>
<reference key="NSSuperview"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:123</string>
<int key="NSTag">100</int>
<bool key="NSEnabled">YES</bool>
<object class="NSSearchFieldCell" key="NSCell" id="774960126">
<int key="NSCellFlags">343014976</int>
<int key="NSCellFlags2">268436544</int>
<string key="NSContents"/>
<reference key="NSSupport" ref="23905036"/>
<string key="NSPlaceholderString">predicate</string>
<string key="NSCellIdentifier">_NS:123</string>
<reference key="NSControlView" ref="891639952"/>
<bool key="NSDrawsBackground">YES</bool>
@ -498,7 +492,7 @@
</object>
</object>
</object>
<object class="NSMutableArray" key="NSToolbarIBAllowedItems">
<object class="NSArray" key="NSToolbarIBAllowedItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="271164239"/>
<reference ref="962020774"/>
@ -508,11 +502,11 @@
<reference ref="1015085479"/>
<reference ref="957210769"/>
<reference ref="89055059"/>
<reference ref="916551158"/>
<reference ref="202060684"/>
<reference ref="585433049"/>
<reference ref="916551158"/>
</object>
<object class="NSArray" key="NSToolbarIBDefaultItems">
<object class="NSMutableArray" key="NSToolbarIBDefaultItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="490181719"/>
<reference ref="585433049"/>
@ -556,7 +550,7 @@
<string key="NSFrameSize">{1279, 183}</string>
<reference key="NSSuperview" ref="204692115"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="332479500"/>
<reference key="NSNextKeyView" ref="502749411"/>
<string key="NSReuseIdentifierKey">_NS:1197</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTableHeaderView" key="NSHeaderView" id="117432108">
@ -781,7 +775,7 @@
<string key="NSFrameSize">{1281, 201}</string>
<reference key="NSSuperview" ref="196617426"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="502749411"/>
<reference key="NSNextKeyView" ref="204692115"/>
<string key="NSReuseIdentifierKey">_NS:1193</string>
<int key="NSsFlags">133682</int>
<reference key="NSVScroller" ref="332479500"/>
@ -843,7 +837,7 @@
<string key="NSFrameSize">{1278, 565}</string>
<reference key="NSSuperview" ref="51131752"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="742629842"/>
<reference key="NSNextKeyView" ref="794153134"/>
<string key="NSReuseIdentifierKey">_NS:1197</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTableHeaderView" key="NSHeaderView" id="995480265">
@ -990,7 +984,6 @@
<string key="NSFrame">{{1, 566}, {1279, 15}}</string>
<reference key="NSSuperview" ref="1054473103"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:1216</string>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="1054473103"/>
@ -1016,7 +1009,7 @@
<string key="NSFrameSize">{1280, 583}</string>
<reference key="NSSuperview" ref="1058980817"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="794153134"/>
<reference key="NSNextKeyView" ref="51131752"/>
<string key="NSReuseIdentifierKey">_NS:1193</string>
<int key="NSsFlags">133682</int>
<reference key="NSVScroller" ref="715872882"/>
@ -1094,7 +1087,7 @@
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="196617426"/>
</object>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
<string key="NSMinSize">{450, 478}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<int key="NSWindowCollectionBehavior">128</int>
@ -1903,6 +1896,22 @@
</object>
<int key="connectionID">100308</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: searchString</string>
<reference key="source" ref="891639952"/>
<reference key="destination" ref="512844837"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="891639952"/>
<reference key="NSDestination" ref="512844837"/>
<string key="NSLabel">value: searchString</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">searchString</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">100316</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -2619,7 +2628,7 @@
<reference key="dict.values" ref="0"/>
</object>
<nil key="sourceID"/>
<int key="maxID">100308</int>
<int key="maxID">100316</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@ -381,7 +381,7 @@
<string key="NSFrameSize">{798, 432}</string>
<reference key="NSSuperview" ref="43006809"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="233033100"/>
<reference key="NSNextKeyView" ref="687601302"/>
<string key="NSReuseIdentifierKey">_NS:1197</string>
<bool key="NSEnabled">YES</bool>
<object class="NSTableHeaderView" key="NSHeaderView" id="818285608">
@ -528,7 +528,6 @@
<string key="NSFrame">{{1, 434}, {798, 15}}</string>
<reference key="NSSuperview" ref="296418393"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView"/>
<string key="NSReuseIdentifierKey">_NS:1216</string>
<int key="NSsFlags">1</int>
<reference key="NSTarget" ref="296418393"/>
@ -555,7 +554,7 @@
<string key="NSFrameSize">{800, 450}</string>
<reference key="NSSuperview" ref="19986666"/>
<reference key="NSWindow"/>
<reference key="NSNextKeyView" ref="687601302"/>
<reference key="NSNextKeyView" ref="43006809"/>
<string key="NSReuseIdentifierKey">_NS:1193</string>
<int key="NSsFlags">133682</int>
<reference key="NSVScroller" ref="233033100"/>
@ -571,7 +570,7 @@
<reference key="NSNextKeyView" ref="296418393"/>
<string key="NSReuseIdentifierKey">_NS:2837</string>
</object>
<string key="NSScreenRect">{{0, 0}, {1440, 878}}</string>
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
<string key="NSMinSize">{250, 172}</string>
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
<bool key="NSWindowIsRestorable">YES</bool>
@ -624,26 +623,6 @@
</object>
<int key="connectionID">18</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">displayPatternTitle1: currentDocument.displayName</string>
<reference key="source" ref="1011577982"/>
<reference key="destination" ref="1001"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="1011577982"/>
<reference key="NSDestination" ref="1001"/>
<string key="NSLabel">displayPatternTitle1: currentDocument.displayName</string>
<string key="NSBinding">displayPatternTitle1</string>
<string key="NSKeyPath">currentDocument.displayName</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSDisplayPattern</string>
<string key="NS.object.0">Annotations for %{title1}@</string>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">31</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">managedObjectContext: currentDocument.managedObjectContext</string>
@ -756,6 +735,55 @@
</object>
<int key="connectionID">62</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">predicate: filterPredicate</string>
<reference key="source" ref="1017784973"/>
<reference key="destination" ref="800890361"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="1017784973"/>
<reference key="NSDestination" ref="800890361"/>
<string key="NSLabel">predicate: filterPredicate</string>
<string key="NSBinding">predicate</string>
<string key="NSKeyPath">filterPredicate</string>
<object class="NSDictionary" key="NSOptions">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSDisplayName</string>
<string>NSPredicateFormat</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>predicate</string>
<string>name CONTAINS[cd] $value OR notes CONTAINS[cd] $value</string>
</object>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">65</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">displayPatternTitle1: currentDocument.displayName</string>
<reference key="source" ref="1011577982"/>
<reference key="destination" ref="1001"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="1011577982"/>
<reference key="NSDestination" ref="1001"/>
<string key="NSLabel">displayPatternTitle1: currentDocument.displayName</string>
<string key="NSBinding">displayPatternTitle1</string>
<string key="NSKeyPath">currentDocument.displayName</string>
<object class="NSDictionary" key="NSOptions">
<string key="NS.key.0">NSDisplayPattern</string>
<string key="NS.object.0">Tags for %{title1}@</string>
</object>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">66</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -1021,7 +1049,7 @@
<reference key="dict.values" ref="0"/>
</object>
<nil key="sourceID"/>
<int key="maxID">62</int>
<int key="maxID">66</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">

View File

@ -900,7 +900,7 @@
</object>
<object class="NSMenuItem" id="858734773">
<reference key="NSMenu" ref="835318025"/>
<string key="NSTitle">Annotation Panel</string>
<string key="NSTitle">Tag Panel</string>
<string key="NSKeyEquiv">t</string>
<int key="NSKeyEquivModMask">262144</int>
<int key="NSMnemonicLoc">2147483647</int>
@ -2503,13 +2503,16 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<string>addAnnotation:</string>
<string>addMediaFiles:</string>
<string>copy:</string>
<string>cut:</string>
<string>delete:</string>
<string>exportMedia:</string>
<string>exportText:</string>
<string>importText:</string>
<string>mediaSkipBackward:</string>
<string>mediaSkipForward:</string>
<string>paste:</string>
<string>toggleMediaPlay:</string>
<string>toggleMoviePanel:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -2522,6 +2525,9 @@
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
@ -2530,13 +2536,16 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<string>addAnnotation:</string>
<string>addMediaFiles:</string>
<string>copy:</string>
<string>cut:</string>
<string>delete:</string>
<string>exportMedia:</string>
<string>exportText:</string>
<string>importText:</string>
<string>mediaSkipBackward:</string>
<string>mediaSkipForward:</string>
<string>paste:</string>
<string>toggleMediaPlay:</string>
<string>toggleMoviePanel:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -2548,6 +2557,18 @@
<string key="name">addMediaFiles:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">copy:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">cut:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">delete:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">exportMedia:</string>
<string key="candidateClassName">id</string>
@ -2569,11 +2590,11 @@
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">toggleMediaPlay:</string>
<string key="name">paste:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">toggleMoviePanel:</string>
<string key="name">toggleMediaPlay:</string>
<string key="candidateClassName">id</string>
</object>
</object>
@ -2586,7 +2607,6 @@
<string>annotationTable</string>
<string>mediaController</string>
<string>mediaTable</string>
<string>moviePanel</string>
<string>movieView</string>
<string>textExportAccessoryView</string>
</object>
@ -2596,7 +2616,6 @@
<string>NSTableView</string>
<string>NSArrayController</string>
<string>NSTableView</string>
<string>MAMovieWindow</string>
<string>QTMovieView</string>
<string>NSView</string>
</object>
@ -2609,7 +2628,6 @@
<string>annotationTable</string>
<string>mediaController</string>
<string>mediaTable</string>
<string>moviePanel</string>
<string>movieView</string>
<string>textExportAccessoryView</string>
</object>
@ -2631,10 +2649,6 @@
<string key="name">mediaTable</string>
<string key="candidateClassName">NSTableView</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">moviePanel</string>
<string key="candidateClassName">MAMovieWindow</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">movieView</string>
<string key="candidateClassName">QTMovieView</string>
@ -2684,14 +2698,81 @@
<string key="className">MATagWindow</string>
<string key="superclassName">NSWindowController</string>
<object class="NSMutableDictionary" key="actions">
<string key="NS.key.0">toggleWindow:</string>
<string key="NS.object.0">id</string>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>copy:</string>
<string>cut:</string>
<string>delete:</string>
<string>toggleWindow:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="actionInfosByName">
<string key="NS.key.0">toggleWindow:</string>
<object class="IBActionInfo" key="NS.object.0">
<string key="name">toggleWindow:</string>
<string key="candidateClassName">id</string>
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>copy:</string>
<string>cut:</string>
<string>delete:</string>
<string>toggleWindow:</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBActionInfo">
<string key="name">copy:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">cut:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">delete:</string>
<string key="candidateClassName">id</string>
</object>
<object class="IBActionInfo">
<string key="name">toggleWindow:</string>
<string key="candidateClassName">id</string>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>tagController</string>
<string>tagTable</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>NSArrayController</string>
<string>NSTableView</string>
</object>
</object>
<object class="NSMutableDictionary" key="toOneOutletInfosByName">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>tagController</string>
<string>tagTable</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBToOneOutletInfo">
<string key="name">tagController</string>
<string key="candidateClassName">NSArrayController</string>
</object>
<object class="IBToOneOutletInfo">
<string key="name">tagTable</string>
<string key="candidateClassName">NSTableView</string>
</object>
</object>
</object>
<object class="IBClassDescriptionSource" key="sourceIdentifier">