The R Project SVN R-packages

Rev

Rev 6232 | Rev 6238 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6232 Rev 6233
Line 45... Line 45...
45
static SEL _getSel;
45
static SEL _getSel;
46
static SEL _setSel;
46
static SEL _setSel;
47
static SEL _strSel;
47
static SEL _strSel;
48
static SEL _replSel;
48
static SEL _replSel;
49
static SEL _editSel;
49
static SEL _editSel;
-
 
50
static SEL _getlSel;
-
 
51
 
50
 
52
 
51
+ (void)initialize
53
+ (void)initialize
52
{
54
{
53
 
55
 
54
	if ([self class] == [RScriptEditorTextStorage class]) {
56
	if ([self class] == [RScriptEditorTextStorage class]) {
Line 59... Line 61...
59
		_getSel  = @selector(attributesAtIndex:effectiveRange:);
61
		_getSel  = @selector(attributesAtIndex:effectiveRange:);
60
		_setSel  = @selector(setAttributes:range:);
62
		_setSel  = @selector(setAttributes:range:);
61
		_strSel  = @selector(string);
63
		_strSel  = @selector(string);
62
		_replSel = @selector(replaceCharactersInRange:withString:);
64
		_replSel = @selector(replaceCharactersInRange:withString:);
63
		_editSel = @selector(edited:range:changeInLength:);
65
		_editSel = @selector(edited:range:changeInLength:);
64
		_lineFoldingEnabled = NO;
66
		_getlSel = @selector(attribute:atIndex:longestEffectiveRange:inRange:);
-
 
67
 
65
	}
68
	}
66
}
69
}
67
 
70
 
68
+ (NSTextAttachment *)attachment
71
+ (NSTextAttachment *)attachment
69
{
72
{
Line 78... Line 81...
78
		_attributedString = [[NSTextStorage alloc] init];
81
		_attributedString = [[NSTextStorage alloc] init];
79
		_getImp  = [_attributedString methodForSelector:_getSel];
82
		_getImp  = [_attributedString methodForSelector:_getSel];
80
		_setImp  = [_attributedString methodForSelector:_setSel];
83
		_setImp  = [_attributedString methodForSelector:_setSel];
81
		_strImp  = [_attributedString methodForSelector:_strSel];
84
		_strImp  = [_attributedString methodForSelector:_strSel];
82
		_replImp = [_attributedString methodForSelector:_replSel];
85
		_replImp = [_attributedString methodForSelector:_replSel];
-
 
86
		_editImp = [self methodForSelector:_editSel];
83
		_editImp = [_attributedString methodForSelector:_editSel];
87
		_getlImp = [_attributedString methodForSelector:_getlSel];
-
 
88
 
-
 
89
		foldedCounter = 0;
-
 
90
 
-
 
91
		for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
92
			foldedRanges[i][0] = -1;
-
 
93
			foldedRanges[i][1] = 0;
-
 
94
		}
84
	}
95
	}
85
 
96
 
86
	return self;
97
	return self;
87
}
98
}
88
 
99
 
Line 92... Line 103...
92
	[_attributedString release];
103
	[_attributedString release];
93
	if(sharedAttachment) [sharedAttachment release];
104
	if(sharedAttachment) [sharedAttachment release];
94
	[super dealloc];
105
	[super dealloc];
95
}
106
}
96
 
107
 
-
 
108
- (BOOL)hasFoldedItems
-
 
109
{
-
 
110
	return (foldedCounter == 0) ? NO : YES;
-
 
111
}
-
 
112
 
-
 
113
- (NSInteger)foldedAtIndex:(NSInteger)index
-
 
114
{
-
 
115
 
-
 
116
	if(!foldedCounter) return -1;
-
 
117
 
-
 
118
	NSInteger i = 0;
-
 
119
	for(i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
120
		if(foldedRanges[i][0] <= index && foldedRanges[i][0]+foldedRanges[i][1] > index) {
-
 
121
			return i;
-
 
122
		}
-
 
123
	}
-
 
124
	return -1;
-
 
125
}
-
 
126
 
-
 
127
- (NSInteger)foldedForIndicatorAtIndex:(NSInteger)index
-
 
128
{
-
 
129
 
-
 
130
	if(!foldedCounter) return -1;
-
 
131
 
-
 
132
	if(index) {
-
 
133
		// Folded ranges are stored from { to } but indicator will drawn inside of { and }
-
 
134
		for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
135
			if(foldedRanges[i][0] > -1 && foldedRanges[i][0] <= (index-1) && foldedRanges[i][0]+foldedRanges[i][1] > index+1) {
-
 
136
				return i;
-
 
137
			}
-
 
138
		}
-
 
139
	}
-
 
140
	return -1;
-
 
141
}
-
 
142
 
-
 
143
- (NSInteger)registerFoldedRange:(NSRange)range
-
 
144
{
-
 
145
 
-
 
146
	NSInteger index = -1;
-
 
147
	for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
148
		if(foldedRanges[i][0] == -1) {
-
 
149
			index = i;
-
 
150
			foldedRanges[i][0] = (NSInteger)range.location;
-
 
151
			foldedRanges[i][1] = (NSInteger)range.length;
-
 
152
			foldedCounter++;
-
 
153
			break;
-
 
154
		}
-
 
155
	}
-
 
156
 
-
 
157
	return(index);
-
 
158
 
-
 
159
}
-
 
160
 
-
 
161
- (BOOL)removeFoldedRangeWithId:(NSNumber*)index
-
 
162
{
-
 
163
 
-
 
164
	NSInteger i = [index integerValue];
-
 
165
 
-
 
166
	if(i < 0 || i >= R_MAX_FOLDED_ITEMS) {
-
 
167
		[self removeAllFoldedRanges];
-
 
168
		return NO;
-
 
169
	}
-
 
170
 
-
 
171
	[[[self delegate] undoManager] disableUndoRegistration];
-
 
172
 
-
 
173
	NSRange range = NSMakeRange(foldedRanges[i][0], foldedRanges[i][1]);
-
 
174
	range = NSIntersectionRange(NSMakeRange(0, [_attributedString length]), range);
-
 
175
	if(range.length) {
-
 
176
		[self beginEditing];
-
 
177
		// [self removeAttribute:foldingAttributeName range:range];
-
 
178
		[self removeAttribute:foldingAttributeId range:range];
-
 
179
		[self removeAttribute:NSCursorAttributeName range:range];
-
 
180
		[self removeAttribute:NSToolTipAttributeName range:range];
-
 
181
		[self endEditing];
-
 
182
	}
-
 
183
 
-
 
184
	foldedRanges[i][0] = -1;
-
 
185
	foldedRanges[i][1] = 0;
-
 
186
	foldedCounter--;
-
 
187
	if(foldedCounter < 0) foldedCounter = 0;
-
 
188
 
-
 
189
	[[[self delegate] undoManager] enableUndoRegistration];
-
 
190
 
-
 
191
	return YES;
-
 
192
}
-
 
193
 
-
 
194
- (void)removeAllFoldedRanges
-
 
195
{
-
 
196
	for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
197
		foldedRanges[i][0] = -1;
-
 
198
		foldedRanges[i][1] = 0;
-
 
199
	}
-
 
200
	[[[self delegate] undoManager] disableUndoRegistration];
-
 
201
	NSRange range = NSMakeRange(0, [_attributedString length]);
-
 
202
	[self beginEditing];
-
 
203
	// [self removeAttribute:foldingAttributeName range:range];
-
 
204
	[self removeAttribute:foldingAttributeId range:range];
-
 
205
	[self removeAttribute:NSCursorAttributeName range:range];
-
 
206
	[self removeAttribute:NSToolTipAttributeName range:range];
-
 
207
	[self endEditing];
-
 
208
	[[[self delegate] undoManager] enableUndoRegistration];
-
 
209
	foldedCounter = 0;
-
 
210
}
-
 
211
 
-
 
212
- (BOOL)existsFoldedRange:(NSRange)range
-
 
213
{
-
 
214
 
-
 
215
	if(!foldedCounter) return NO;
-
 
216
 
-
 
217
	BOOL success = NO;
-
 
218
	for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
219
		if(foldedRanges[i][0] == range.location && foldedRanges[i][1] == range.length) {
-
 
220
			success = YES;
-
 
221
			break;
-
 
222
		}
-
 
223
	}
-
 
224
 
-
 
225
	return success;
-
 
226
	
-
 
227
}
-
 
228
 
-
 
229
- (NSRange)foldedRangeAtIndex:(NSInteger)index
-
 
230
{
-
 
231
 
-
 
232
	if(!foldedCounter || index < 0 || index > R_MAX_FOLDED_ITEMS) return NSMakeRange(NSNotFound, 0);
-
 
233
 
-
 
234
	NSInteger loc = foldedRanges[index][0];
-
 
235
	if(loc == -1) return NSMakeRange(NSNotFound, 0);
-
 
236
	return NSMakeRange(loc, foldedRanges[index][1]-foldedRanges[index][0]);
-
 
237
}
-
 
238
 
97
// NSAttributedString primitives
239
// NSAttributedString primitives
98
- (NSString *)string
240
- (NSString *)string
99
{ 
241
{ 
100
	return (*_strImp)(_attributedString, _strSel);
242
	return (*_strImp)(_attributedString, _strSel);
101
}
243
}
Line 103... Line 245...
103
- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range
245
- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range
104
{
246
{
105
 
247
 
106
	NSDictionary *attributes = (*_getImp)(_attributedString, _getSel, location, range);
248
	NSDictionary *attributes = (*_getImp)(_attributedString, _getSel, location, range);
107
 
249
 
108
	if(!_lineFoldingEnabled) return attributes;
250
	if(!foldedCounter) return attributes;
109
 
251
 
110
	id value;
-
 
111
	NSRange effectiveRange;
252
	NSRange effectiveRange;
112
 
253
 
113
	value = [attributes objectForKey:foldingAttributeName];
254
	// Check if location is inside folded range for drawing indicator
-
 
255
	NSInteger index = -1;
114
	if (value && [value boolValue]) {
256
	if(location) {
-
 
257
		// Notes folded ranges are stored from { to } but indicator will drawn inside of { and }
-
 
258
		for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
115
		[_attributedString attribute:foldingAttributeName atIndex:location longestEffectiveRange:&effectiveRange inRange:NSMakeRange(0, [_attributedString length])];
259
			if(foldedRanges[i][0] <= (location-1) && foldedRanges[i][0]+foldedRanges[i][1] > location+2) {
-
 
260
				index = i;
-
 
261
				break;
-
 
262
			}
-
 
263
		}
-
 
264
	}
116
 
265
 
-
 
266
	if (index > -1) {
-
 
267
		effectiveRange = NSMakeRange(foldedRanges[index][0]+1, foldedRanges[index][1]-2);
117
		// We adds NSAttachmentAttributeName if in lineFoldingAttributeName
268
		// We adds NSAttachmentAttributeName if in lineFoldingAttributeName
118
		if (location == effectiveRange.location) { // beginning of a folded range
269
		if (location == effectiveRange.location) { // beginning of a folded range
-
 
270
 
119
			NSMutableDictionary *dict = [attributes mutableCopyWithZone:NULL];
271
			NSMutableDictionary *dict = [attributes mutableCopyWithZone:NULL];
120
			[dict setObject:sharedAttachment forKey:NSAttachmentAttributeName];
272
			[dict setObject:sharedAttachment forKey:NSAttachmentAttributeName];
121
			attributes = [dict autorelease];
273
			attributes = [dict autorelease];
122
			effectiveRange.length = 1;
274
			effectiveRange.length = 1;
-
 
275
 
123
		} else {
276
		} else {
124
			++(effectiveRange.location); --(effectiveRange.length);
277
			++(effectiveRange.location); --(effectiveRange.length);
125
		}
278
		}
126
		if (range) *range = effectiveRange;
279
		if (range) *range = effectiveRange;
127
	}
280
	}
128
 
281
 
129
	return attributes;
282
	return attributes;
130
 
283
 
131
}
284
}
132
 
285
 
-
 
286
- (void)edited:(NSUInteger)mask range:(NSRange)oldRange changeInLength:(NSInteger)lengthChange
-
 
287
{
-
 
288
 
-
 
289
	if(foldedCounter && mask == NSTextStorageEditedCharacters) {
-
 
290
		// update foldedRanges array
-
 
291
		NSInteger index = oldRange.location;
-
 
292
		for(NSInteger i = 0; i < R_MAX_FOLDED_ITEMS; i++) {
-
 
293
			if(index < foldedRanges[i][0]) {
-
 
294
				if(foldedRanges[i][0] >= oldRange.location && foldedRanges[i][0]+foldedRanges[i][1] <= NSMaxRange(oldRange)) {
-
 
295
					[self removeFoldedRangeWithId:[NSNumber numberWithInt:i]];
-
 
296
					continue;
-
 
297
				}
-
 
298
				foldedRanges[i][0] += lengthChange;
-
 
299
				if(foldedRanges[i][0] < -1) {
-
 
300
					[self removeFoldedRangeWithId:[NSNumber numberWithInt:i]];
-
 
301
				}
-
 
302
			}
-
 
303
		}
-
 
304
	}
-
 
305
 
-
 
306
	[super edited:mask range:oldRange changeInLength:lengthChange];
-
 
307
}
-
 
308
 
133
// NSMutableAttributedString primitives
309
// NSMutableAttributedString primitives
134
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str
310
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str
135
{
311
{
136
	(*_replImp)(_attributedString, _replSel, range, str);
312
	(*_replImp)(_attributedString, _replSel, range, str);
137
	(*_editImp)(self, _editSel, NSTextStorageEditedCharacters, range, [str length] - range.length);
313
	(*_editImp)(self, _editSel, NSTextStorageEditedCharacters, range, [str length] - range.length);