26 @global appkit_tag_dom_elements
48 DOMElement _DOMImageElement;
56 CPImageAlignment _imageAlignment;
69 + (Class)_binderClassForBinding:(
CPString)aBinding
71 if (aBinding === CPValueBinding || aBinding === CPValueURLBinding || aBinding === CPValuePathBinding || aBinding === CPDataBinding)
73 else if ([aBinding hasPrefix:CPEditableBinding])
76 return [
super _binderClassForBinding:aBinding];
79 - (id)initWithFrame:(CGRect)aFrame
86 [
self _createDOMImageElement];
93 - (void)_createDOMImageElement
99 _DOMImageElement = document.createElement(
"img");
100 _DOMImageElement.style.position =
"absolute";
101 _DOMImageElement.style.left =
"0px";
102 _DOMImageElement.style.top =
"0px";
106 _DOMImageElement.setAttribute(
"draggable",
"true");
107 _DOMImageElement.style["-khtml-user-drag"] =
"element";
110 _DOMImageElement.style.visibility =
"hidden";
111 AppKitTagDOMElement(
self, _DOMImageElement);
113 CPDOMDisplayServerAppendChild(_DOMElement, _DOMImageElement);
135 if (oldImage === anImage)
143 [defaultCenter removeObserver:self name:CPImageDidLoadNotification object:oldImage];
148 if (!_DOMImageElement)
149 [
self _createDOMImageElement];
151 _DOMImageElement.src = newImage ? [newImage filename] : [CPImageViewEmptyPlaceholderImage filename];
154 var size = [newImage size];
156 if (size && size.width === -1 && size.height === -1)
158 [defaultCenter addObserver:self selector:@selector(imageDidLoad:) name:CPImageDidLoadNotification object:newImage];
161 _DOMImageElement.width = 0;
162 _DOMImageElement.height = 0;
165 [_shadowView setHidden:YES];
170 [
self setNeedsLayout];
171 [
self setNeedsDisplay:YES];
179 [
self setNeedsLayout];
180 [
self setNeedsDisplay:YES];
196 - (void)setHasShadow:(BOOL)shouldHaveShadow
198 if (_hasShadow == shouldHaveShadow)
201 _hasShadow = shouldHaveShadow;
205 _shadowView = [[
CPShadowView alloc] initWithFrame:[
self bounds]];
207 [
self addSubview:_shadowView];
209 [
self setNeedsLayout];
210 [
self setNeedsDisplay:YES];
214 [_shadowView removeFromSuperview];
227 - (void)setImageAlignment:(CPImageAlignment)anImageAlignment
229 if (_imageAlignment == anImageAlignment)
232 _imageAlignment = anImageAlignment;
237 [
self setNeedsLayout];
238 [
self setNeedsDisplay:YES];
241 - (unsigned)imageAlignment
243 return _imageAlignment;
251 - (void)setImageScaling:(CPImageScaling)anImageScaling
258 CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, 0.0, 0.0);
262 [
self setNeedsLayout];
263 [
self setNeedsDisplay:YES];
266 - (CPUInteger)imageScaling
268 return [
self currentValueForThemeAttribute:@"image-scaling"];
274 - (void)hideOrDisplayContents
279 _DOMImageElement.style.visibility =
"hidden";
281 [_shadowView setHidden:YES];
286 _DOMImageElement.style.visibility =
"visible";
288 [_shadowView setHidden:NO];
303 - (void)layoutSubviews
308 var bounds = [
self bounds],
309 image = [
self image],
310 imageScaling = [
self currentValueForThemeAttribute:@"image-scaling"],
313 insetWidth = (_hasShadow ? [_shadowView horizontalInset] : 0.0),
314 insetHeight = (_hasShadow ? [_shadowView verticalInset] : 0.0),
315 boundsWidth = CGRectGetWidth(bounds),
316 boundsHeight = CGRectGetHeight(bounds),
317 width = boundsWidth - insetWidth,
318 height = boundsHeight - insetHeight;
323 _DOMImageElement.width = ROUND(
width);
324 _DOMImageElement.height = ROUND(height);
331 if (size.width == -1 && size.height == -1)
334 switch (imageScaling)
337 if (
width >= size.width && height >= size.height)
340 height = size.height;
347 var imageRatio = size.width / size.height,
348 viewRatio =
width / height;
350 if (viewRatio > imageRatio)
351 width = height * imageRatio;
353 height =
width / imageRatio;
359 height = size.height;
364 _DOMImageElement.width = ROUND(
width);
365 _DOMImageElement.height = ROUND(height);
371 switch (_imageAlignment)
382 x = boundsWidth -
width;
386 x = (boundsWidth -
width) / 2.0;
390 switch (_imageAlignment)
401 y = boundsHeight - height;
405 y = (boundsHeight - height) / 2.0;
410 CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, x, y);
414 _imageRect = CGRectMake(x, y,
width, height);
417 [_shadowView setFrame:CGRectMake(x - [_shadowView leftInset], y - [_shadowView topInset], width + insetWidth, height + insetHeight)];
423 [[
self nextResponder] mouseDown:anEvent];
426 - (void)setEditable:(BOOL)shouldBeEditable
428 if (_isEditable === shouldBeEditable)
431 _isEditable = shouldBeEditable;
434 [
self registerForDraggedTypes:[CPImagesPboardType]];
438 var draggedTypes = [
self registeredDraggedTypes];
440 [
self unregisterDraggedTypes];
442 [draggedTypes removeObjectIdenticalTo:CPImagesPboardType];
444 [
self registerForDraggedTypes:draggedTypes];
472 - (void)_updatePlaceholdersWithOptions:(
CPDictionary)options
474 [
self _setPlaceholder:nil forMarker:CPMultipleValuesMarker isDefault:YES];
475 [
self _setPlaceholder:nil forMarker:CPNoSelectionMarker isDefault:YES];
476 [
self _setPlaceholder:nil forMarker:CPNotApplicableMarker isDefault:YES];
477 [
self _setPlaceholder:nil forMarker:CPNullMarker isDefault:YES];
480 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
482 [_source setImage:nil];
485 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
491 else if (aBinding === CPDataBinding)
492 image = [[
CPImage alloc] initWithData:aValue];
493 else if (aBinding === CPValueURLBinding || aBinding === CPValuePathBinding)
495 else if (aBinding === CPValueBinding)
498 [_source setImage:image];
503 var image = [_source image];
505 if (aBinding === CPDataBinding)
507 else if (aBinding === CPValueURLBinding || aBinding === CPValuePathBinding)
508 return [image filename];
509 else if (aBinding === CPValueBinding)
535 [
self _createDOMImageElement];
538 [
self setHasShadow:[aCoder decodeBoolForKey:CPImageViewHasShadowKey]];
544 [
self setNeedsLayout];
545 [
self setNeedsDisplay:YES];
561 [_shadowView removeFromSuperview];
566 [
self addSubview:_shadowView];
568 [aCoder encodeBool:_hasShadow forKey:CPImageViewHasShadowKey];
569 [aCoder encodeInt:_imageAlignment forKey:CPImageViewImageAlignmentKey];
572 [aCoder encodeBool:_isEditable forKey:CPImageViewIsEditableKey];
581 var cached_name = [
CPString stringWithFormat:@"%@_%d", [
self class], [aFile hash]],
586 image = [[
CPImage alloc] initWithContentsOfFile:aFile];
587 [
image setName:cached_name];