Flycut/JumpcutEngine/JumpcutClipping.m

258 lines
7.1 KiB
Objective-C
Executable file

//
// JumpcutClipping.m
// Jumpcut
// http://jumpcut.sourceforge.net/
//
// Created by steve on Sun Jan 12 2003.
// Copyright (c) 2003-2006 Steve Cook
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
// THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
#import "JumpcutClipping.h"
@implementation JumpcutClipping
-(id) init
{
[self initWithContents:@""
withType:@""
withDisplayLength:40
withAppLocalizedName:@""
withAppBundleURL:nil
withTimestamp:0];
return self;
}
-(id) initWithContents:(NSString *)contents withType:(NSString *)type withDisplayLength:(int)displayLength withAppLocalizedName:(NSString *)localizedName withAppBundleURL:(NSString*)bundleURL withTimestamp:(int)timestamp
{
[super init];
clipContents = [[[NSString alloc] init] retain];
clipDisplayString = [[[NSString alloc] init] retain];
clipType = [[[NSString alloc] init] retain];
[self setContents:contents setDisplayLength:displayLength];
[self setType:type];
[self setAppLocalizedName:localizedName];
[self setAppBundleURL:bundleURL];
[self setTimestamp:timestamp];
[self setHasName:false];
return self;
}
/* - (id)initWithCoder:(NSCoder *)coder
{
NSString * newContents;
int newDisplayLength;
NSString *newType;
BOOL newHasName;
if ( self = [super init]) {
newContents = [NSString stringWithString:[coder decodeObject]];
[coder decodeValueOfObjCType:@encode(int) at:&newDisplayLength];
newType = [NSString stringWithString:[coder decodeObject]];
[coder decodeValueOfObjCType:@encode(BOOL) at:&newHasName];
[self setContents:newContents
setDisplayLength:newDisplayLength];
[self setType:newType];
[self setHasName:newHasName];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
int codeDisplayLength = [self displayLength];
BOOL codeHasName = [self hasName];
[coder encodeObject:[self contents]];
[coder encodeValueOfObjCType:@encode(int) at:&codeDisplayLength];
[coder encodeObject:[self type]];
[coder encodeValueOfObjCType:@encode(BOOL) at:&codeHasName];
} */
-(void) setContents:(NSString *)newContents setDisplayLength:(int)newDisplayLength
{
id old = clipContents;
[newContents retain];
clipContents = newContents;
[old release];
if ( newDisplayLength > 0 ) {
clipDisplayLength = newDisplayLength;
}
[self resetDisplayString];
}
-(void) setContents:(NSString *)newContents
{
id old = clipContents;
[newContents retain];
clipContents = newContents;
[old release];
[self resetDisplayString];
}
-(void) setType:(NSString *)newType
{
id old = clipType;
[newType retain];
clipType = newType;
[old release];
}
-(void) setDisplayLength:(int)newDisplayLength
{
if ( newDisplayLength > 0 ) {
clipDisplayLength = newDisplayLength;
[self resetDisplayString];
}
}
-(void) setAppLocalizedName:(NSString *)new
{
id old = appLocalizedName;
[new retain];
appLocalizedName = new;
[old release];
}
-(void) setAppBundleURL:(NSString *)new
{
id old = appBundleURL;
[new retain];
appBundleURL = new;
[old release];
}
-(void) setTimestamp:(NSString *)newTimestamp
{
clipTimestamp = newTimestamp;
}
-(void) setHasName:(BOOL)newHasName
{
clipHasName = newHasName;
}
-(void) resetDisplayString
{
NSString *newDisplayString, *firstLineOfClipping, *trimmedString;
NSUInteger start, lineEnd, contentsEnd;
NSRange startRange = NSMakeRange(0,0);
NSRange contentsRange;
// We're resetting the display string, so release the old one.
[clipDisplayString release];
// We want to restrict the display string to the clipping contents through the first line break.
trimmedString = [clipContents stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[trimmedString getLineStart:&start end:&lineEnd contentsEnd:&contentsEnd forRange:startRange];
contentsRange = NSMakeRange(0, contentsEnd);
firstLineOfClipping = [trimmedString substringWithRange:contentsRange];
if ( [firstLineOfClipping length] > clipDisplayLength ) {
newDisplayString = [[NSString stringWithString:[firstLineOfClipping substringToIndex:clipDisplayLength]] stringByAppendingString:@""];
} else {
newDisplayString = [NSString stringWithString:firstLineOfClipping];
}
[newDisplayString retain];
clipDisplayString = newDisplayString;
}
-(NSString *) description
{
NSString *description = [[super description] stringByAppendingString:@": "];
description = [description stringByAppendingString:[self displayString]];
return description;
}
-(JumpcutClipping *) clipping
{
return self;
}
-(NSString *) contents
{
// NSString *returnClipContents;
// returnClipContents = [NSString stringWithString:clipContents];
// return returnClipContents;
return clipContents;
}
-(NSString *) appLocalizedName
{
return appLocalizedName;
}
-(NSString *) appBundleURL
{
return appBundleURL;
}
-(int) timestamp
{
return clipTimestamp;
}
-(int) displayLength
{
return clipDisplayLength;
}
-(NSString *) type
{
return clipType;
}
-(NSString *) displayString
{
// QUESTION
// Why doesn't the below work?
// NSString *returnClipDisplayString;
// returnClipDisplayString = [NSString stringWithString:clipDisplayString];
// return returnClipDisplayString;
return clipDisplayString;
}
-(BOOL) hasName
{
return clipHasName;
}
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
JumpcutClipping * otherClip = (JumpcutClipping *)other;
return ([self.type isEqualToString:otherClip.type] &&
[self.displayString isEqualToString:otherClip.displayString] &&
(self.displayLength == otherClip.displayLength) &&
[self.contents isEqualToString:otherClip.contents]);
}
-(void) dealloc
{
[clipContents release];
[clipType release];
[appLocalizedName release];
[appBundleURL release];
clipDisplayLength = 0;
[clipDisplayString release];
clipHasName = 0;
[super dealloc];
}
@end