Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifdef HAVE_CONFIG_H
00010 # include <config.h>
00011 #endif
00012
00013
00014
00015 #import "CocoaWindowContentView.h"
00016 #import "CocoaGwenGUIProtocol.h"
00017
00018
00019 #ifndef COCOA_WINDOW_CONTENT_VIEW_MM
00020 #define COCOA_WINDOW_CONTENT_VIEW_MM
00021
00022 @implementation CocoaWindowContentView
00023
00024 @synthesize fillX;
00025 @synthesize fillY;
00026
00027 - (id)initWithFrame:(NSRect)frame {
00028 self = [super initWithFrame:frame];
00029 if (self) {
00030 subviewsInOrder = [[NSMutableArray alloc] init];
00031 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutSubviews) name:NSViewFrameDidChangeNotification object:self];
00032 }
00033 return self;
00034 }
00035
00036 -(void) dealloc {
00037 [[NSNotificationCenter defaultCenter] removeObserver:self];
00038 [subviewsInOrder release];
00039 [super dealloc];
00040 }
00041
00042
00043
00044
00045 -(void) layoutSubviews {
00046 NSRect bounds = [self bounds];
00047
00048 NSUInteger numOfSubViews = [subviewsInOrder count];
00049
00050 if (numOfSubViews > 0) {
00051
00052
00053 CGFloat sizesHeight[numOfSubViews];
00054 CGFloat sizesWidth[numOfSubViews];
00055 CGFloat exclusiveHeight = 0.0;
00056 NSUInteger exclusiveChilds = 0;
00057
00058 NSUInteger i;
00059 for (i=0; i<numOfSubViews; i++) {
00060 NSView* subview = [subviewsInOrder objectAtIndex:i];
00061 if ([subview conformsToProtocol:@protocol(CocoaGwenGUIProtocol)]) {
00062 if ([(<CocoaGwenGUIProtocol>)subview fillX]) sizesWidth[i] = -1.0;
00063 else {
00064 CGFloat neededWidth = [(<CocoaGwenGUIProtocol>)subview minSize].width;
00065 sizesWidth[i] = neededWidth;
00066 }
00067 if ([(<CocoaGwenGUIProtocol>)subview fillY]) sizesHeight[i] = -1.0;
00068 else {
00069 CGFloat neededHeight = [(<CocoaGwenGUIProtocol>)subview minSize].height;
00070 sizesHeight[i] = neededHeight;
00071 exclusiveHeight += neededHeight;
00072 exclusiveChilds++;
00073 }
00074 }
00075 else {
00076 sizesWidth[i] = -1.0;
00077 sizesHeight[i] = -1.0;
00078 }
00079 }
00080
00081
00082
00083
00084 CGFloat stdHeight = 0.0;
00085 if (numOfSubViews > exclusiveChilds) {
00086 CGFloat fillHeight = bounds.size.height-exclusiveHeight;
00087 stdHeight = (fillHeight)/(numOfSubViews-exclusiveChilds);
00088 }
00089 else {
00090 CGFloat fillHeight = bounds.size.height;
00091 stdHeight = (fillHeight)/(numOfSubViews);
00092 }
00093
00094 CGFloat stdWidth = bounds.size.width;
00095
00096
00097
00098 NSRect actualFrame = bounds;
00099 actualFrame.origin.x = 0.0;
00100 actualFrame.origin.y += bounds.size.height;
00101 for (i=0; i<numOfSubViews; i++) {
00102
00103 CGFloat usedHeight = sizesHeight[i];
00104 if (usedHeight < 0.0) usedHeight = stdHeight;
00105 actualFrame.origin.y -= usedHeight;
00106 actualFrame.size.height = usedHeight;
00107
00108 CGFloat usedWidth = sizesWidth[i];
00109 if (usedWidth < 0.0) usedWidth = stdWidth;
00110 NSView* subview = [subviewsInOrder objectAtIndex:i];
00111 actualFrame.size.width = usedWidth;
00112
00113 [subview setFrame:actualFrame];
00114
00115 }
00116 }
00117
00118 }
00119
00120 -(void) addLayoutSubview:(NSView*)new_subview {
00121 [subviewsInOrder addObject:new_subview];
00122 [self addSubview:new_subview];
00123 [self layoutSubviews];
00124 }
00125
00126 #pragma mark Protocoll Methods
00127
00128
00129 - (NSSize) minSize {
00130 NSUInteger numOfSubViews = [subviewsInOrder count];
00131
00132 NSSize size = NSMakeSize(0,0);
00133 if (numOfSubViews > 0) {
00134 NSUInteger i;
00135 for (i=0; i<numOfSubViews; i++) {
00136 NSView* subview = [subviewsInOrder objectAtIndex:i];
00137 if ([subview conformsToProtocol:@protocol(CocoaGwenGUIProtocol)]) {
00138 NSSize subViewMinSize = [(<CocoaGwenGUIProtocol>)subview minSize];
00139 if (subViewMinSize.width > size.width) {
00140 size.width = subViewMinSize.width;
00141 }
00142 size.height += subViewMinSize.height;
00143
00144 }
00145 }
00146 }
00147 return size;
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 @end
00162
00163 #endif