// 15 august 2015
#import "uipriv_darwin.h"

void addConstraint(NSView *view, NSString *constraint, NSDictionary *metrics, NSDictionary *views)
{
	NSArray *constraints;

	constraints = [NSLayoutConstraint constraintsWithVisualFormat:constraint
		options:0
		metrics:metrics
		views:views];
	[view addConstraints:constraints];
}

NSLayoutPriority horzHuggingPri(NSView *view)
{
	return [view contentHuggingPriorityForOrientation:NSLayoutConstraintOrientationHorizontal];
}

NSLayoutPriority vertHuggingPri(NSView *view)
{
	return [view contentHuggingPriorityForOrientation:NSLayoutConstraintOrientationVertical];
}

void setHuggingPri(NSView *view, NSLayoutPriority priority, NSLayoutConstraintOrientation orientation)
{
	[view setContentHuggingPriority:priority forOrientation:orientation];
}

// precondition: constraints must have been removed from superview already
void layoutSingleView(NSView *superview, NSView *subview, int margined)
{
	NSDictionary *views;
	NSString *constraint;

	views = NSDictionaryOfVariableBindings(subview);

	constraint = @"H:|[subview]|";
	if (margined)
		constraint = @"H:|-[subview]-|";
	addConstraint(superview, constraint, nil, views);

	constraint = @"V:|[subview]|";
	if (margined)
		constraint = @"V:|-[subview]-|";
	addConstraint(superview, constraint, nil, views);
}

// use the fitting size, not the intrinsic content size, for the case of recursive views without an intrinsic content size
NSSize fittingAlignmentSize(NSView *view)
{
	NSSize s;
	NSRect r;

	s = [view fittingSize];
	// the fitting size is for a frame rect; we need an alignment rect
	r = NSMakeRect(0, 0, s.width, s.height);
	r = [view alignmentRectForFrame:r];
	return r.size;
}