All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.swt.custom.ViewFormLayout Maven / Gradle / Ivy

Go to download

The osx x86_64 swt jar as available in the Eclipse 4.6 (Neon) release for OSX. It is suitable for use with jface and other dependencies available from maven central in the org.eclipse.scout.sdk.deps group. The sources is copied from swt-4.6-cocoa-macosx-x86_64.zip from http://download.eclipse.org/eclipse/downloads/drops4/R-4.6-201606061100/ and javadoc is generated from sources.

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2009 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * 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 != null && 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);
	}
}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy