/** NSSelection NSSelection is used by NSDataLink to refer to a selection within a document. Copyright (C) 1996 Free Software Foundation, Inc. Author: Gregory John Casamento Date: 2001 Author: Scott Christley Date: 1996 This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; see the file COPYING.LIB. If not, see or write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "config.h" #import #import #import "AppKit/NSSelection.h" #import "AppKit/NSPasteboard.h" // // Global instances of these selections // static NSSelection *_sharedAllSelection = nil; static NSSelection *_sharedCurrentSelection = nil; static NSSelection *_sharedEmptySelection = nil; // Private methods and variables for NSSelection typedef enum { GSCustomSelection, GSAllSelection, GSCurrentSelection, GSEmptySelection } GSSelectionType; @interface NSSelection (PrivateMethods) - (void)_setIsWellKnownSelection: (BOOL)wellknown; - (GSSelectionType)_selectionType; - (void)_setSelectionType: (GSSelectionType)type; + (NSSelection *)_wellKnownSelection: (char *)description; @end @implementation NSSelection (PrivateMethods) - (void)_setIsWellKnownSelection: (BOOL)wellknown { _isWellKnownSelection = wellknown; } - (void)_setSelectionType: (GSSelectionType)type { _selectionType = type; } - (GSSelectionType)_selectionType { return _selectionType; } + (NSSelection *)_wellKnownSelection: (char *)description { NSData *selectionData = [NSData dataWithBytes: description length: strlen(description)]; NSSelection *selection = [NSSelection selectionWithDescriptionData: selectionData]; [selection _setIsWellKnownSelection: YES]; return selection; } @end @implementation NSSelection // // Class methods // + (void)initialize { if (self == [NSSelection class]) { // Initial version [self setVersion: 0]; } } // // Returning Special Selection Shared Instances // // // NOTE: The description returned for each of these is similar to the one // returned under OPENSTEP. // + (NSSelection *)allSelection { if (!_sharedAllSelection) { _sharedAllSelection = [NSSelection _wellKnownSelection: "GNUstep All selection marker"]; [_sharedEmptySelection _setSelectionType: GSAllSelection]; } return _sharedAllSelection; } + (NSSelection *)currentSelection { if (!_sharedCurrentSelection) { _sharedCurrentSelection = [NSSelection _wellKnownSelection: "GNUstep Current selection marker"]; [_sharedCurrentSelection _setSelectionType: GSCurrentSelection]; } return _sharedCurrentSelection; } + (NSSelection *)emptySelection { if (!_sharedEmptySelection) { _sharedEmptySelection = [NSSelection _wellKnownSelection: "GNUstep Empty selection marker"]; [_sharedEmptySelection _setSelectionType: GSEmptySelection]; } return _sharedEmptySelection; } // // Creating and Initializing a Selection // + (NSSelection *)selectionWithDescriptionData:(NSData *)data { NSSelection *selection = AUTORELEASE([[NSSelection alloc] initWithDescriptionData: data]); return selection; } // // Instance methods // // // Creating and Initializing a Selection // - (id)initWithDescriptionData:(NSData *)newData { [super init]; ASSIGN(_descriptionData, newData); _isWellKnownSelection = NO; _selectionType = GSCustomSelection; return self; } - (id)initWithPasteboard:(NSPasteboard *)pasteboard { [super init]; ASSIGN(_descriptionData, [pasteboard dataForType: NSGeneralPboardType]); _isWellKnownSelection = NO; return self; } - (void) dealloc { RELEASE(_descriptionData); [super dealloc]; } // // Describing a Selection // - (NSData *)descriptionData { return _descriptionData; } - (BOOL)isWellKnownSelection { return _isWellKnownSelection; } // // Writing a Selection to the Pasteboard // - (void)writeToPasteboard:(NSPasteboard *)pasteboard { [pasteboard setData: _descriptionData forType: NSGeneralPboardType]; } // // NSCoding protocol // - (void) encodeWithCoder: (NSCoder*)aCoder { if ([aCoder allowsKeyedCoding]) { [aCoder encodeBool: _isWellKnownSelection forKey: @"GSIsWellKnownSelection"]; [aCoder encodeBool: _selectionType forKey: @"GSSelectionType"]; [aCoder encodeObject: _descriptionData forKey: @"GSDescriptionData"]; } else { [aCoder encodeValueOfObjCType: @encode(BOOL) at: &_isWellKnownSelection]; [aCoder encodeValueOfObjCType: @encode(int) at: &_selectionType]; [aCoder encodeValueOfObjCType: @encode(id) at: _descriptionData]; } } - (id) initWithCoder: (NSCoder*)aDecoder { [super init]; if ([aDecoder allowsKeyedCoding]) { _isWellKnownSelection = [aDecoder decodeBoolForKey: @"GSIsWellKnownSelection"]; _selectionType = [aDecoder decodeIntForKey: @"GSSelectionType"]; ASSIGN(_descriptionData, [aDecoder decodeObjectForKey: @"GSDescriptionData"]); } else { id obj; [aDecoder decodeValueOfObjCType: @encode(BOOL) at: &_isWellKnownSelection]; [aDecoder decodeValueOfObjCType: @encode(int) at: &_selectionType]; [aDecoder decodeValueOfObjCType: @encode(id) at: &obj]; ASSIGN(_descriptionData, obj); } // if it's a well known selection then determine which one it is. if (_isWellKnownSelection) { switch(_selectionType) { case GSAllSelection: RELEASE(self); self = RETAIN([NSSelection allSelection]); break; case GSCurrentSelection: RELEASE(self); self = RETAIN([NSSelection currentSelection]); break; case GSEmptySelection: RELEASE(self); self = RETAIN([NSSelection emptySelection]); break; default: // Shouldn't get here. break; } } return self; } @end