1 /******************************************************************************* 2 * Copyright (c) 2000, 2006 IBM Corporation and others. 3 * All rights reserved. This program and the accompanying materials 4 * are made available under the terms of the Eclipse Public License v1.0 5 * which accompanies this distribution, and is available at 6 * http://www.eclipse.org/legal/epl-v10.html 7 * 8 * Contributors: 9 * IBM Corporation - initial API and implementation 10 * Port to the D programming language: 11 * Frank Benoit <benoit@tionex.de> 12 *******************************************************************************/ 13 module org.eclipse.swt.custom.ScrolledCompositeLayout; 14 15 import java.lang.all; 16 17 import org.eclipse.swt.SWT; 18 import org.eclipse.swt.graphics.Point; 19 import org.eclipse.swt.graphics.Rectangle; 20 import org.eclipse.swt.widgets.Composite; 21 import org.eclipse.swt.widgets.Control; 22 import org.eclipse.swt.widgets.Layout; 23 import org.eclipse.swt.widgets.ScrollBar; 24 import org.eclipse.swt.custom.ScrolledComposite; 25 26 27 /** 28 * This class provides the layout for ScrolledComposite 29 * 30 * @see ScrolledComposite 31 */ 32 class ScrolledCompositeLayout : Layout { 33 34 bool inLayout = false; 35 static const int DEFAULT_WIDTH = 64; 36 static const int DEFAULT_HEIGHT = 64; 37 38 protected override Point computeSize(Composite composite, int wHint, int hHint, bool flushCache) { 39 ScrolledComposite sc = cast(ScrolledComposite)composite; 40 Point size = new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT); 41 if (sc.content !is null) { 42 Point preferredSize = sc.content.computeSize(wHint, hHint, flushCache); 43 Point currentSize = sc.content.getSize(); 44 size.x = sc.getExpandHorizontal() ? preferredSize.x : currentSize.x; 45 size.y = sc.getExpandVertical() ? preferredSize.y : currentSize.y; 46 } 47 size.x = Math.max(size.x, sc.minWidth); 48 size.y = Math.max(size.y, sc.minHeight); 49 if (wHint !is SWT.DEFAULT) size.x = wHint; 50 if (hHint !is SWT.DEFAULT) size.y = hHint; 51 return size; 52 } 53 54 protected override bool flushCache(Control control) { 55 return true; 56 } 57 58 protected override void layout(Composite composite, bool flushCache) { 59 if (inLayout) return; 60 ScrolledComposite sc = cast(ScrolledComposite)composite; 61 if (sc.content is null) return; 62 ScrollBar hBar = sc.getHorizontalBar(); 63 ScrollBar vBar = sc.getVerticalBar(); 64 if (hBar !is null) { 65 if (hBar.getSize().y >= sc.getSize().y) { 66 return; 67 } 68 } 69 if (vBar !is null) { 70 if (vBar.getSize().x >= sc.getSize().x) { 71 return; 72 } 73 } 74 inLayout = true; 75 Rectangle contentRect = sc.content.getBounds(); 76 if (!sc.alwaysShowScroll) { 77 bool hVisible = sc.needHScroll(contentRect, false); 78 bool vVisible = sc.needVScroll(contentRect, hVisible); 79 if (!hVisible && vVisible) hVisible = sc.needHScroll(contentRect, vVisible); 80 if (hBar !is null) hBar.setVisible(hVisible); 81 if (vBar !is null) vBar.setVisible(vVisible); 82 } 83 Rectangle hostRect = sc.getClientArea(); 84 if (sc.expandHorizontal) { 85 contentRect.width = Math.max(sc.minWidth, hostRect.width); 86 } 87 if (sc.expandVertical) { 88 contentRect.height = Math.max(sc.minHeight, hostRect.height); 89 } 90 91 if (hBar !is null) { 92 hBar.setMaximum (contentRect.width); 93 hBar.setThumb (Math.min (contentRect.width, hostRect.width)); 94 int hPage = contentRect.width - hostRect.width; 95 int hSelection = hBar.getSelection (); 96 if (hSelection >= hPage) { 97 if (hPage <= 0) { 98 hSelection = 0; 99 hBar.setSelection(0); 100 } 101 contentRect.x = -hSelection; 102 } 103 } 104 105 if (vBar !is null) { 106 vBar.setMaximum (contentRect.height); 107 vBar.setThumb (Math.min (contentRect.height, hostRect.height)); 108 int vPage = contentRect.height - hostRect.height; 109 int vSelection = vBar.getSelection (); 110 if (vSelection >= vPage) { 111 if (vPage <= 0) { 112 vSelection = 0; 113 vBar.setSelection(0); 114 } 115 contentRect.y = -vSelection; 116 } 117 } 118 119 sc.content.setBounds (contentRect); 120 inLayout = false; 121 } 122 }