26 @global appkit_tag_dom_elements
28 @
typedef CPImageAlignment
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
96 var image = [
self objectValue],
97 isCSSBasedImage = [image isCSSBased],
98 isIMGImageElement = _DOMImageElement && (_DOMImageElement.nodeName ==
"IMG");
103 if (_DOMImageElement)
105 if ((isIMGImageElement && isCSSBasedImage) || (!isIMGImageElement && !isCSSBasedImage))
109 _DOMElement.removeChild(_DOMImageElement);
111 _DOMImageElement = nil;
114 _cssStylePreviousState = @[];
121 _DOMImageElement = document.createElement(isCSSBasedImage ?
"div" :
"img");
122 _DOMImageElement.style.position =
"absolute";
123 _DOMImageElement.style.left =
"0px";
124 _DOMImageElement.style.top =
"0px";
128 _DOMImageElement.setAttribute(
"draggable",
"true");
129 _DOMImageElement.style["-khtml-user-drag"] =
"element";
132 _DOMImageElement.style.visibility =
"hidden";
133 AppKitTagDOMElement(
self, _DOMImageElement);
135 CPDOMDisplayServerAppendChild(_DOMElement, _DOMImageElement);
157 if (oldImage === anImage)
165 [defaultCenter removeObserver:self name:CPImageDidLoadNotification object:oldImage];
170 [
self _createDOMImageElement];
172 if ([newImage isCSSBased])
173 _cssStyleNode = [newImage applyCSSImageForView:self
174 onDOMElement:_DOMImageElement
175 styleNode:_cssStyleNode
176 previousState:@ref(_cssStylePreviousState)];
178 _DOMImageElement.src = newImage ? [newImage filename] : [CPImageViewEmptyPlaceholderImage filename];
181 var size = [newImage size];
183 if (size && size.width === -1 && size.height === -1)
185 [defaultCenter addObserver:self selector:@selector(imageDidLoad:) name:CPImageDidLoadNotification object:newImage];
188 _DOMImageElement.width = 0;
189 _DOMImageElement.height = 0;
192 [_shadowView setHidden:YES];
224 - (void)setHasShadow:(BOOL)shouldHaveShadow
226 if (_hasShadow == shouldHaveShadow)
229 _hasShadow = shouldHaveShadow;
242 [_shadowView removeFromSuperview];
255 - (void)setImageAlignment:(CPImageAlignment)anImageAlignment
257 if (_imageAlignment == anImageAlignment)
260 _imageAlignment = anImageAlignment;
269 - (unsigned)imageAlignment
271 return _imageAlignment;
279 - (void)setImageScaling:(CPImageScaling)anImageScaling
286 CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, 0.0, 0.0);
294 - (CPUInteger)imageScaling
296 return [
self currentValueForThemeAttribute:@"image-scaling"];
302 - (void)hideOrDisplayContents
307 _DOMImageElement.style.visibility =
"hidden";
309 [_shadowView setHidden:YES];
314 _DOMImageElement.style.visibility =
"visible";
316 [_shadowView setHidden:NO];
331 - (void)layoutSubviews
337 image = [
self image],
338 imageScaling = [
self currentValueForThemeAttribute:@"image-scaling"],
341 insetWidth = (_hasShadow ? [_shadowView horizontalInset] : 0.0),
342 insetHeight = (_hasShadow ? [_shadowView verticalInset] : 0.0),
343 boundsWidth = CGRectGetWidth(
bounds),
344 boundsHeight = CGRectGetHeight(
bounds),
345 width = boundsWidth - insetWidth,
346 height = boundsHeight - insetHeight;
351 _DOMImageElement.width = ROUND(
width);
352 _DOMImageElement.height = ROUND(height);
359 if (size.width == -1 && size.height == -1)
362 switch (imageScaling)
365 if (
width >= size.width && height >= size.height)
368 height = size.height;
375 var imageRatio = size.width / size.height,
376 viewRatio =
width / height;
378 if (viewRatio > imageRatio)
379 width = height * imageRatio;
381 height =
width / imageRatio;
387 height = size.height;
392 _DOMImageElement.width = ROUND(
width);
393 _DOMImageElement.height = ROUND(height);
399 switch (_imageAlignment)
410 x = boundsWidth -
width;
414 x = (boundsWidth -
width) / 2.0;
418 switch (_imageAlignment)
429 y = boundsHeight - height;
433 y = (boundsHeight - height) / 2.0;
438 CPDOMDisplayServerSetStyleLeftTop(_DOMImageElement, NULL, x, y);
442 _imageRect = CGRectMake(x, y,
width, height);
445 [_shadowView setFrame:CGRectMake(x - [_shadowView leftInset], y - [_shadowView topInset], width + insetWidth, height + insetHeight)];
451 [[
self nextResponder] mouseDown:anEvent];
454 - (void)setEditable:(BOOL)shouldBeEditable
456 if (_isEditable === shouldBeEditable)
459 _isEditable = shouldBeEditable;
470 [draggedTypes removeObjectIdenticalTo:CPImagesPboardType];
500 - (void)_updatePlaceholdersWithOptions:(
CPDictionary)options
502 [
self _setPlaceholder:nil forMarker:CPMultipleValuesMarker isDefault:YES];
503 [
self _setPlaceholder:nil forMarker:CPNoSelectionMarker isDefault:YES];
504 [
self _setPlaceholder:nil forMarker:CPNotApplicableMarker isDefault:YES];
505 [
self _setPlaceholder:nil forMarker:CPNullMarker isDefault:YES];
508 - (void)setPlaceholderValue:(
id)aValue withMarker:(
CPString)aMarker forBinding:(
CPString)aBinding
510 [_source setImage:nil];
513 - (void)setValue:(
id)aValue forBinding:(
CPString)aBinding
519 else if (aBinding === CPDataBinding)
521 else if (aBinding === CPValueURLBinding || aBinding === CPValuePathBinding)
523 else if (aBinding === CPValueBinding)
526 [_source setImage:image];
531 var image = [_source image];
533 if (aBinding === CPDataBinding)
535 else if (aBinding === CPValueURLBinding || aBinding === CPValuePathBinding)
536 return [image filename];
537 else if (aBinding === CPValueBinding)
563 [
self _createDOMImageElement];
566 [
self setHasShadow:[aCoder decodeBoolForKey:CPImageViewHasShadowKey]];
589 [_shadowView removeFromSuperview];
596 [aCoder encodeBool:_hasShadow forKey:CPImageViewHasShadowKey];
597 [aCoder encodeInt:_imageAlignment forKey:CPImageViewImageAlignmentKey];
600 [aCoder encodeBool:_isEditable forKey:CPImageViewIsEditableKey];
615 [
image setName:cached_name];
var CPImageViewImageAlignmentKey
CPPasteboard draggingPasteboard()
void addSubview:(CPView aSubview)
var CPImageViewIsEditableKey
id initWithFrame:(CGRect aFrame)
void setHasShadow:(BOOL shouldHaveShadow)
CPArray registeredDraggedTypes()
Unarchives objects created using CPKeyedArchiver.
CPImageScaleProportionallyDown
void setImageScaling:(CPImageScaling scaling)
var CPImageViewEmptyPlaceholderImage
CPNotificationCenter defaultCenter()
A mutable key-value pair collection.
var CPImageViewHasShadowKey
CPImageScaleAxesIndependently
id imageNamed:(CPString aName)
CPImage cachedImageWithContentsOfFile:(CPString aFile)
void setImage:(CPImage anImage)
An immutable string (collection of characters).
BOOL sendAction:to:(SEL anAction, [to] id anObject)
id initWithCoder:(CPCoder aCoder)
void setNeedsDisplay:(BOOL aFlag)
void setObjectValue:(id anObject)
id initWithContentsOfFile:(CPString aFilename)
void setEditable:(BOOL shouldBeEditable)
A notification that can be posted to a CPNotificationCenter.
void hideOrDisplayContents()
Defines methods for use when archiving & restoring (enc/decoding).
id unarchiveObjectWithData:(CPData aData)
void setObjectValue:(CPImage anImage)
Sends messages (CPNotification) between objects.
var CPImageViewImageScalingKey
CPBundle bundleForClass:(Class aClass)
void removeObserver:name:object:(id anObserver, [name] CPString aNotificationName, [object] id anObject)
CPData dataForType:(CPString aType)
CPImageScaleProportionallyUpOrDown
void encodeWithCoder:(CPCoder aCoder)
void unregisterDraggedTypes()
void setImageAlignment:(CPImageAlignment anImageAlignment)
void registerForDraggedTypes:(CPArray pasteboardTypes)
global CPImagesPboardType global appkit_tag_dom_elements typedef CPImageAlignment CPImageAlignCenter
id stringWithFormat:(CPString format, [,] ...)