25 - (id)initWithFrame:(NSRect)frame {
26 self = [
super initWithFrame:frame];
31 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(layoutSubviews) name:NSViewFrameDidChangeNotification object:self];
37 [[NSNotificationCenter defaultCenter] removeObserver:self];
38 [subviewsInOrder release];
48 #define borderDistance 8.0
49 #define cellDistance 4.0
51 -(void) layoutSubviews {
52 NSRect bounds = [
self bounds];
54 NSUInteger numOfSubViews = [subviewsInOrder count];
56 if (numOfSubViews > 0) {
58 BOOL columnMode = (
columns > 0);
60 NSInteger neededColumns, neededRows;
68 neededColumns = numOfSubViews/
rows + numOfSubViews%
rows;
74 neededRows = numOfSubViews;
79 CGFloat minWidthNeededForColumn[neededColumns];
80 CGFloat minHeightNeededForRow[neededRows];
81 char fillXFlags[neededColumns];
82 char fillYFlags[neededRows];
85 for (i=0; i<neededColumns; i++) {
86 minWidthNeededForColumn[i] = 0.0;
89 for (i=0; i<neededRows; i++) {
90 minHeightNeededForRow[i] = 0.0;
94 NSInteger actualRow, actualColumn;
96 for (i=0; i<numOfSubViews; i++) {
98 actualRow = i/neededColumns;
99 actualColumn = i%neededColumns;
102 actualRow = i%neededRows;
103 actualColumn = i/neededRows;
106 NSView* subview = [subviewsInOrder objectAtIndex:i];
110 if (minWidthNeededForColumn[actualColumn] < minSize.width)
111 minWidthNeededForColumn[actualColumn] = minSize.width;
113 if (minHeightNeededForRow[actualRow] < minSize.height)
114 minHeightNeededForRow[actualRow] = minSize.height;
125 NSInteger flexibleCells = 0;
126 for(i=0; i<neededColumns; i++) {
127 if (fillXFlags[i] == 1) flexibleCells++;
128 else maxWidth -= minWidthNeededForColumn[i];
130 if (maxWidth > 0.0 && flexibleCells > 0) {
131 CGFloat flexibleStdWidth = maxWidth/flexibleCells;
132 for (i=0; i<neededColumns; i++) {
133 if (fillXFlags[i] == 1) minWidthNeededForColumn[i] = flexibleStdWidth;
139 for(i=0; i<neededRows; i++) {
140 if (fillYFlags[i] == 1) flexibleCells++;
141 else maxHeight -= minHeightNeededForRow[i];
143 if (maxHeight > 0.0 && flexibleCells > 0) {
144 CGFloat flexibleStdHeight = maxHeight/flexibleCells;
145 for (i=0; i<neededRows; i++) {
146 if (fillYFlags[i] == 1) minHeightNeededForRow[i] = flexibleStdHeight;
154 NSRect actualFrame = bounds;
159 NSInteger oldIndex = -1;
161 for (i=0; i<numOfSubViews; i++) {
163 actualRow = i/neededColumns;
164 actualColumn = i%neededColumns;
166 if (oldIndex != actualRow) {
168 actualFrame.origin.y -= minHeightNeededForRow[actualRow]+
cellDistance;
169 oldIndex = actualRow;
173 actualRow = i%neededRows;
174 actualColumn = i/neededRows;
176 if (oldIndex != actualColumn) {
177 if (oldIndex >= 0) actualFrame.origin.x += minWidthNeededForColumn[oldIndex]+
cellDistance;
178 actualFrame.origin.y = bounds.origin.y+bounds.size.height-
borderDistance-minHeightNeededForRow[actualRow];
179 oldIndex = actualColumn;
183 NSView* subview = [subviewsInOrder objectAtIndex:i];
185 actualFrame.size.height = minHeightNeededForRow[actualRow];
186 actualFrame.size.width = minWidthNeededForColumn[actualColumn];
187 NSRect realFrame = actualFrame;
191 if (!flexWidth || !flexHeight) {
193 if (!flexWidth && minSize.width < realFrame.size.width) realFrame.size.width = minSize.width;
194 if (!flexHeight && minSize.height < realFrame.size.height) {
195 realFrame.origin.y += realFrame.size.height-minSize.height;
196 realFrame.size.height = minSize.height;
200 [subview setFrame:realFrame];
203 if (columnMode) actualFrame.origin.x += actualFrame.size.width+
cellDistance;
204 else if (actualRow+1 < neededRows) actualFrame.origin.y -= minHeightNeededForRow[actualRow+1]+
cellDistance;
274 -(void) addLayoutSubview:(NSView*)new_subview {
276 [
self addSubview:new_subview];
277 [
self layoutSubviews];
280 #pragma mark Protocoll Methods
283 NSUInteger numOfSubViews = [subviewsInOrder count];
285 if (numOfSubViews > 0) {
287 NSInteger neededColumns, neededRows;
288 BOOL columnMode = (
columns > 0);
295 neededColumns = numOfSubViews/
rows + numOfSubViews%
rows;
301 neededRows = numOfSubViews;
306 CGFloat minWidthNeededForColumn[neededColumns];
307 CGFloat minHeightNeededForRow[neededRows];
310 for (i=0; i<neededColumns; i++) {
311 minWidthNeededForColumn[i] = 0.0;
313 for (i=0; i<neededRows; i++) {
314 minHeightNeededForRow[i] = 0.0;
317 NSInteger actualRow, actualColumn;
319 for (i=0; i<numOfSubViews; i++) {
321 actualRow = i/neededColumns;
322 actualColumn = i%neededColumns;
325 actualRow = i%neededRows;
326 actualColumn = i/neededRows;
329 NSView* subview = [subviewsInOrder objectAtIndex:i];
333 if (minWidthNeededForColumn[actualColumn] < minSize.width)
334 minWidthNeededForColumn[actualColumn] = minSize.width;
336 if (minHeightNeededForRow[actualRow] < minSize.height)
337 minHeightNeededForRow[actualRow] = minSize.height;
341 for (i=0; i<neededColumns; i++) {
342 minNeededWidth += minWidthNeededForColumn[i];
345 for (i=0; i<neededRows; i++) {
346 minNeededHeight += minHeightNeededForRow[i];
348 return NSMakeSize(minNeededWidth, minNeededHeight);
353 - (void)setFrame:(NSRect)frameRect {
354 NSSize
minSize = [
self minSize];
355 if (frameRect.size.height < minSize.height) {
356 frameRect.size.height = minSize.height;
358 if (frameRect.size.width < minSize.width) {
359 frameRect.size.width = minSize.width;
361 [
super setFrame:frameRect];