diff dwtx/draw2d/ScrollPaneSolver.d @ 98:95307ad235d9

Added Draw2d code, still work in progress
author Frank Benoit <benoit@tionex.de>
date Sun, 03 Aug 2008 00:52:14 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/draw2d/ScrollPaneSolver.d	Sun Aug 03 00:52:14 2008 +0200
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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
+ * Port to the D programming language:
+ *     Frank Benoit <benoit@tionex.de>
+ *******************************************************************************/
+module dwtx.draw2d.ScrollPaneSolver;
+
+import dwt.dwthelper.utils;
+
+import dwtx.draw2d.geometry.Dimension;
+import dwtx.draw2d.geometry.Insets;
+import dwtx.draw2d.geometry.Rectangle;
+import dwtx.draw2d.Viewport;
+
+/**
+ * This class handles the calculation of solving for the area of a
+ * {@link dwtx.draw2d.ScrollPane}'s viewport and insets. Also determines if
+ * the horizontal and vertical scrollbars should be visible.
+ */
+public class ScrollPaneSolver {
+
+/** Scrollbar visibility constants -- never show scrollbars **/
+public static const int NEVER = 0;
+/** Scrollbar visibility constants -- show scrollbars automatically **/
+public static const int AUTOMATIC = 1;
+/** Scrollbar visibility constants -- always show scrollbars **/
+public static const int ALWAYS = 2;
+
+/**
+ * Container class for the results of ScrollPaneSolver's solve method
+ */
+public static class Result {
+    /** Show horizontal scrollbar bool **/
+    public bool showH;
+
+    /** Show vertical scrollbar bool **/
+    public bool showV;
+
+    /** Area of ScrollPane's viewport **/
+    public Rectangle viewportArea;
+
+    /** Insets of ScrollPane **/
+    public Insets insets;
+}
+
+/**
+ * Solves for the viewport area, insets, and visibility of horizontal and vertical
+ * scrollbars of a ScrollPane
+ * @param clientArea The ScrollPane's client area
+ * @param viewport The ScrollPane's Viewport
+ * @param hVis Horizontal scrollbar visibility
+ * @param vVis Vertical scrollbar visibility
+ * @param vBarWidth Width of vertical scrollbar
+ * @param hBarHeight Height of horizontal scrollbar
+ * @return the Result
+ */
+public static Result solve(Rectangle clientArea, Viewport viewport, int hVis, int vVis,
+                            int vBarWidth, int hBarHeight) {
+    Result result = new Result();
+    result.insets = new Insets();
+    result.insets.bottom = hBarHeight;
+    result.insets.right  = vBarWidth;
+
+    Dimension available  = clientArea.getSize();
+    Dimension guaranteed = (new Dimension(available)).shrink(
+                (vVis is NEVER ? 0 : result.insets.right),
+                (hVis is NEVER ? 0 : result.insets.bottom));
+    guaranteed.width = Math.max(guaranteed.width, 0);
+    guaranteed.height = Math.max(guaranteed.height, 0);
+    int wHint = guaranteed.width;
+    int hHint = guaranteed.height;
+
+    Dimension preferred  = viewport.getPreferredSize(wHint, hHint).getCopy();
+    Insets viewportInsets = viewport.getInsets();
+    /*
+     * This was calling viewport.getMinimumSize(), but viewport's minimum size was really
+     * small, and wasn't a function of its contents.
+     */
+    Dimension viewportMinSize = new Dimension(
+            viewportInsets.getWidth(), viewportInsets.getHeight());
+    if (viewport.getContents() !is null) {
+        if (viewport.getContentsTracksHeight() && hHint > -1)
+            hHint = Math.max(0, hHint - viewportInsets.getHeight());
+        if (viewport.getContentsTracksWidth() && wHint > -1)
+            wHint = Math.max(0, wHint - viewportInsets.getWidth());
+        viewportMinSize.expand(
+            viewport.getContents().getMinimumSize(wHint, hHint));
+    }
+
+    /*
+     * Adjust preferred size if tracking flags set.  Basically, tracking is "compress view
+     * until its minimum size is reached".
+     */
+    if (viewport.getContentsTracksHeight())
+        preferred.height = viewportMinSize.height;
+    if (viewport.getContentsTracksWidth())
+        preferred.width = viewportMinSize.width;
+
+    bool none = available.contains(preferred),
+            both = !none && preferred.containsProper(guaranteed),
+           showV = both || preferred.height > available.height,
+           showH = both || preferred.width  > available.width;
+
+    //Adjust for visibility override flags
+    result.showV = vVis !is NEVER && (showV || vVis is ALWAYS);
+    result.showH = hVis !is NEVER && (showH || hVis is ALWAYS);
+
+    if (!result.showV)
+        result.insets.right = 0;
+    if (!result.showH)
+        result.insets.bottom = 0;
+    result.viewportArea = clientArea.getCropped(result.insets);
+    viewport.setBounds(result.viewportArea);
+    return result;
+}
+
+}