| /******************************************************************************* |
| * Copyright (c) 2000, 2009 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.swt.custom; |
| |
| import org.eclipse.swt.*; |
| import org.eclipse.swt.graphics.*; |
| import org.eclipse.swt.widgets.*; |
| |
| /** |
| * This class provides the layout for ViewForm |
| * |
| * @see ViewForm |
| */ |
| class ViewFormLayout extends Layout { |
| |
| @Override |
| protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) { |
| ViewForm form = (ViewForm)composite; |
| Control left = form.topLeft; |
| Control center = form.topCenter; |
| Control right = form.topRight; |
| Control content = form.content; |
| |
| Point leftSize = new Point(0, 0); |
| if (left != null) { |
| leftSize = computeChildSize(left, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| } |
| Point centerSize = new Point(0, 0); |
| if (center != null) { |
| centerSize = computeChildSize(center, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| } |
| Point rightSize = new Point(0, 0); |
| if (right != null) { |
| rightSize = computeChildSize(right, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| } |
| Point size = new Point(0, 0); |
| // calculate width of title bar |
| if (form.separateTopCenter || |
| (wHint != SWT.DEFAULT && leftSize.x + centerSize.x + rightSize.x > wHint)) { |
| size.x = leftSize.x + rightSize.x; |
| if (leftSize.x > 0 && rightSize.x > 0) size.x += form.horizontalSpacing; |
| size.x = Math.max(centerSize.x, size.x); |
| size.y = Math.max(leftSize.y, rightSize.y); |
| if (center != null){ |
| size.y += centerSize.y; |
| if (left != null ||right != null)size.y += form.verticalSpacing; |
| } |
| } else { |
| size.x = leftSize.x + centerSize.x + rightSize.x; |
| int count = -1; |
| if (leftSize.x > 0) count++; |
| if (centerSize.x > 0) count++; |
| if (rightSize.x > 0) count++; |
| if (count > 0) size.x += count * form.horizontalSpacing; |
| size.y = Math.max(leftSize.y, Math.max(centerSize.y, rightSize.y)); |
| } |
| |
| if (content != null) { |
| if (left != null || right != null || center != null) size.y += 1; // allow space for a vertical separator |
| Point contentSize = new Point(0, 0); |
| contentSize = computeChildSize(content, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| size.x = Math.max (size.x, contentSize.x); |
| size.y += contentSize.y; |
| if (size.y > contentSize.y) size.y += form.verticalSpacing; |
| } |
| |
| size.x += 2*form.marginWidth; |
| size.y += 2*form.marginHeight; |
| |
| if (wHint != SWT.DEFAULT) size.x = wHint; |
| if (hHint != SWT.DEFAULT) size.y = hHint; |
| |
| return size; |
| } |
| |
| Point computeChildSize(Control control, int wHint, int hHint, boolean flushCache) { |
| Object data = control.getLayoutData(); |
| if (data == null || !(data instanceof CLayoutData)) { |
| data = new CLayoutData(); |
| control.setLayoutData(data); |
| } |
| return ((CLayoutData)data).computeSize(control, wHint, hHint, flushCache); |
| } |
| |
| int computeTrim(Control c) { |
| if (c instanceof Scrollable) { |
| Rectangle rect = ((Scrollable) c).computeTrim (0, 0, 0, 0); |
| return rect.width; |
| } |
| return c.getBorderWidth () * 2; |
| } |
| |
| @Override |
| protected boolean flushCache(Control control) { |
| Object data = control.getLayoutData(); |
| if (data instanceof CLayoutData) ((CLayoutData)data).flushCache(); |
| return true; |
| } |
| |
| @Override |
| protected void layout(Composite composite, boolean flushCache) { |
| ViewForm form = (ViewForm)composite; |
| Control left = form.topLeft; |
| Control center = form.topCenter; |
| Control right = form.topRight; |
| Control content = form.content; |
| |
| Rectangle rect = composite.getClientArea(); |
| |
| Point leftSize = new Point(0, 0); |
| if (left != null && !left.isDisposed()) { |
| leftSize = computeChildSize(left, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| } |
| Point centerSize = new Point(0, 0); |
| if (center != null && !center.isDisposed()) { |
| centerSize = computeChildSize(center, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| } |
| Point rightSize = new Point(0, 0); |
| if (right != null && !right.isDisposed()) { |
| rightSize = computeChildSize(right, SWT.DEFAULT, SWT.DEFAULT, flushCache); |
| } |
| |
| int minTopWidth = leftSize.x + centerSize.x + rightSize.x + 2*form.marginWidth + 2*form.highlight; |
| int count = -1; |
| if (leftSize.x > 0) count++; |
| if (centerSize.x > 0) count++; |
| if (rightSize.x > 0) count++; |
| if (count > 0) minTopWidth += count * form.horizontalSpacing; |
| |
| int x = rect.x + rect.width - form.marginWidth - form.highlight; |
| int y = rect.y + form.marginHeight + form.highlight; |
| |
| boolean top = false; |
| if (form.separateTopCenter || minTopWidth > rect.width) { |
| int topHeight = Math.max(rightSize.y, leftSize.y); |
| if (right != null && !right.isDisposed()) { |
| top = true; |
| x -= rightSize.x; |
| right.setBounds(x, y, rightSize.x, topHeight); |
| x -= form.horizontalSpacing; |
| } |
| if (left != null && !left.isDisposed()) { |
| top = true; |
| int trim = computeTrim(left); |
| int leftW = x - rect.x - form.marginWidth - form.highlight - trim; |
| leftSize = computeChildSize(left, leftW, SWT.DEFAULT, false); |
| left.setBounds(rect.x + form.marginWidth + form.highlight, y, leftSize.x, topHeight); |
| } |
| if (top) y += topHeight + form.verticalSpacing; |
| if (center != null && !center.isDisposed()) { |
| top = true; |
| int trim = computeTrim(center); |
| int w = rect.width - 2*form.marginWidth - 2*form.highlight - trim; |
| Point size = computeChildSize(center, w, SWT.DEFAULT, false); |
| if (size.x < centerSize.x) { |
| centerSize = size; |
| } |
| center.setBounds(rect.x + rect.width - form.marginWidth - form.highlight - centerSize.x, y, centerSize.x, centerSize.y); |
| y += centerSize.y + form.verticalSpacing; |
| } |
| } else { |
| int topHeight = Math.max(rightSize.y, Math.max(centerSize.y, leftSize.y)); |
| if (right != null && !right.isDisposed()) { |
| top = true; |
| x -= rightSize.x; |
| right.setBounds(x, y, rightSize.x, topHeight); |
| x -= form.horizontalSpacing; |
| } |
| if (center != null && !center.isDisposed()) { |
| top = true; |
| x -= centerSize.x; |
| center.setBounds(x, y, centerSize.x, topHeight); |
| x -= form.horizontalSpacing; |
| } |
| if (left != null && !left.isDisposed()) { |
| top = true; |
| Rectangle trim = left instanceof Composite ? ((Composite)left).computeTrim(0, 0, 0, 0) : new Rectangle(0, 0, 0, 0); |
| int w = x - rect.x - form.marginWidth - form.highlight - trim.width; |
| int h = topHeight - trim.height; |
| leftSize = computeChildSize(left, w, h, false); |
| left.setBounds(rect.x + form.marginWidth + form.highlight, y, leftSize.x, topHeight); |
| } |
| if (top)y += topHeight + form.verticalSpacing; |
| } |
| int oldSeperator = form.separator; |
| form.separator = -1; |
| if (content != null && !content.isDisposed()) { |
| if (left != null || right!= null || center != null){ |
| form.separator = y; |
| y++; |
| } |
| content.setBounds(rect.x + form.marginWidth + form.highlight, y, rect.width - 2 * form.marginWidth - 2*form.highlight, rect.y + rect.height - y - form.marginHeight - form.highlight); |
| } |
| if (oldSeperator != form.separator) { |
| int t, b; |
| if (oldSeperator == -1) { |
| t = form.separator; |
| b = form.separator + 1; |
| } else if (form.separator == -1) { |
| t = oldSeperator; |
| b = oldSeperator + 1; |
| } else { |
| t = Math.min(form.separator, oldSeperator); |
| b = Math.max(form.separator, oldSeperator); |
| } |
| form.redraw(form.borderLeft, t, form.getSize().x - form.borderLeft - form.borderRight, b - t, false); |
| } |
| } |
| } |