annotate dwt/widgets/Scrollable.d @ 34:3a3e3aa76b66

Composite
author Frank Benoit <benoit@tionex.de>
date Thu, 10 Jan 2008 03:51:48 +0100
parents 27324bbbac70
children a5c274fa5af9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2007 IBM Corporation and others.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 *******************************************************************************/
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 module dwt.widgets.Scrollable;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14 import dwt.SWT;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwt.internal.gtk.OS;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.graphics.Rectangle;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.widgets.Composite;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.widgets.Control;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.widgets.Display;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.widgets.ScrollBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.widgets.Widget;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import tango.stdc.string;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import tango.stdc.stringz;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 * This class is the abstract superclass of all classes which
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 * represent controls that have standard scroll bars.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 * <dl>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 * <dt><b>Styles:</b></dt>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 * <dd>H_SCROLL, V_SCROLL</dd>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 * <dt><b>Events:</b>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 * <dd>(none)</dd>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 * </dl>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 * <p>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 * IMPORTANT: This class is intended to be subclassed <em>only</em>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 * within the SWT implementation.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 * </p>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 public abstract class Scrollable : Control {
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
41 GtkWidget* scrolledHandle;
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 ScrollBar horizontalBar, verticalBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 * Prevents uninitialized instances from being created outside the package.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 this () {}
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * Constructs a new instance of this class given its parent
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * and a style value describing its behavior and appearance.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * <p>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 * The style value is either one of the style constants defined in
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * class <code>SWT</code> which is applicable to instances of this
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 * class, or must be built by <em>bitwise OR</em>'ing together
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 * (that is, using the <code>int</code> "|" operator) two or more
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * of those <code>SWT</code> style constants. The class description
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * lists the style constants that are applicable to the class.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * Style bits are also inherited from superclasses.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 * </p>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * @param parent a composite control which will be the parent of the new instance (cannot be null)
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 * @param style the style of control to construct
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * @exception IllegalArgumentException <ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * </ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 * @exception SWTException <ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * </ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * @see SWT#H_SCROLL
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * @see SWT#V_SCROLL
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * @see Widget#checkSubclass
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 * @see Widget#getStyle
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 public this (Composite parent, int style) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 super (parent, style);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 GtkWidget* clientHandle () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 return handle;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * Given a desired <em>client area</em> for the receiver
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 * (as described by the arguments), returns the bounding
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 * rectangle which would be required to produce that client
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 * area.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 * <p>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 * In other words, it returns a rectangle such that, if the
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 * receiver's bounds were set to that rectangle, the area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 * of the receiver which is capable of displaying data
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 * (that is, not covered by the "trimmings") would be the
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 * rectangle described by the arguments (relative to the
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * receiver's parent).
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 * </p>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * @param x the desired x coordinate of the client area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 * @param y the desired y coordinate of the client area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * @param width the desired width of the client area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * @param height the desired height of the client area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * @return the required bounds to produce the given client area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 * @exception SWTException <ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * </ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 * @see #getClientArea
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 public Rectangle computeTrim (int x, int y, int width, int height) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 checkWidget();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 int border = 0;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 if (fixedHandle !is null) border += OS.gtk_container_get_border_width (cast(GtkContainer*)fixedHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 if (scrolledHandle !is null) border += OS.gtk_container_get_border_width (cast(GtkContainer*)scrolledHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 int trimX = x - border, trimY = y - border;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 int trimWidth = width + (border * 2), trimHeight = height + (border * 2);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 trimHeight += hScrollBarWidth ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 trimWidth += vScrollBarWidth ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 if (scrolledHandle !is null) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 if (OS.gtk_scrolled_window_get_shadow_type (cast(GtkScrolledWindow*)scrolledHandle) !is OS.GTK_SHADOW_NONE) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 auto style = OS.gtk_widget_get_style (cast(GtkWidget*)scrolledHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 int xthickness = OS.gtk_style_get_xthickness (style);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 int ythickness = OS.gtk_style_get_ythickness (style);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 trimX -= xthickness;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 trimY -= ythickness;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 trimWidth += xthickness * 2;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 trimHeight += ythickness * 2;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 return new Rectangle (trimX, trimY, trimWidth, trimHeight);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 ScrollBar createScrollBar (int style) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 if (scrolledHandle is null) return null;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 ScrollBar bar = new ScrollBar ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 bar.parent = this;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 bar.style = style;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 bar.display = display;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 bar.state |= HANDLE;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 if ((style & SWT.H_SCROLL) !is 0) {
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
144 bar.handle = OS.GTK_SCROLLED_WINDOW_HSCROLLBAR (cast(GtkScrolledWindow*)scrolledHandle);
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
145 bar.adjustmentHandle = OS.gtk_scrolled_window_get_hadjustment (cast(GtkScrolledWindow*)scrolledHandle);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 } else {
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
147 bar.handle = OS.GTK_SCROLLED_WINDOW_VSCROLLBAR (cast(GtkScrolledWindow*)scrolledHandle);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 bar.adjustmentHandle = OS.gtk_scrolled_window_get_vadjustment (cast(GtkScrolledWindow*)scrolledHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 bar.hookEvents ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 bar.register ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 return bar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 void createWidget (int index) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 super.createWidget (index);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 if ((style & SWT.H_SCROLL) !is 0) horizontalBar = createScrollBar (SWT.H_SCROLL);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 if ((style & SWT.V_SCROLL) !is 0) verticalBar = createScrollBar (SWT.V_SCROLL);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 void deregister () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 super.deregister ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 if (scrolledHandle !is null) display.removeWidget (cast(GtkWidget*)scrolledHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 public int getBorderWidth () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 checkWidget();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 int border = 0;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 if (fixedHandle !is null) border += OS.gtk_container_get_border_width (cast(GtkContainer*)fixedHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 if (scrolledHandle !is null) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 border += OS.gtk_container_get_border_width (cast(GtkContainer*)scrolledHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 if (OS.gtk_scrolled_window_get_shadow_type (cast(GtkScrolledWindow*)scrolledHandle) !is OS.GTK_SHADOW_NONE) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 border += OS.gtk_style_get_xthickness (OS.gtk_widget_get_style (cast(GtkWidget*)scrolledHandle));
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 return border;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 * Returns a rectangle which describes the area of the
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 * receiver which is capable of displaying data (that is,
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 * not covered by the "trimmings").
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 * @return the client area
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 * @exception SWTException <ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 * </ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 * @see #computeTrim
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 public Rectangle getClientArea () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 checkWidget ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 forceResize ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 auto clientHandle = clientHandle ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 int x = OS.GTK_WIDGET_X (clientHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 int y = OS.GTK_WIDGET_Y (clientHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 int width = (state & ZERO_WIDTH) !is 0 ? 0 : OS.GTK_WIDGET_WIDTH (clientHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 int height = (state & ZERO_HEIGHT) !is 0 ? 0 : OS.GTK_WIDGET_HEIGHT (clientHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 return new Rectangle (x, y, width, height);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 * Returns the receiver's horizontal scroll bar if it has
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 * one, and null if it does not.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 * @return the horizontal scroll bar (or null)
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 * @exception SWTException <ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 * </ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 public ScrollBar getHorizontalBar () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 checkWidget ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 return horizontalBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 /**
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 * Returns the receiver's vertical scroll bar if it has
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 * one, and null if it does not.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 * @return the vertical scroll bar (or null)
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 *
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 * @exception SWTException <ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 * </ul>
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 public ScrollBar getVerticalBar () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 checkWidget ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 return verticalBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 int /*long*/ gtk_scroll_event (GtkWidget* widget, GdkEventScroll* eventPtr) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 auto result = super.gtk_scroll_event (widget, eventPtr);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 /*
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 * Feature in GTK. Scrolled windows do not scroll if the scrollbars
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 * are hidden. This is not a bug, but is inconsistent with other platforms.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 * The fix is to set the adjustment values directly.
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 if ((state & CANVAS) !is 0) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 ScrollBar scrollBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 GdkEventScroll* gdkEvent = new GdkEventScroll ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 memmove (gdkEvent, eventPtr, GdkEventScroll.sizeof);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 if (gdkEvent.direction is OS.GDK_SCROLL_UP || gdkEvent.direction is OS.GDK_SCROLL_DOWN) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 scrollBar = verticalBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 } else {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 scrollBar = horizontalBar;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 if (scrollBar !is null && !OS.GTK_WIDGET_VISIBLE (scrollBar.handle) && scrollBar.getEnabled()) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 GtkAdjustment* adjustment = new GtkAdjustment ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 memmove (adjustment, scrollBar.adjustmentHandle, GtkAdjustment.sizeof );
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 /* Calculate wheel delta to match GTK+ 2.4 and higher */
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 int wheel_delta = cast(int) Math.pow(adjustment.page_size, 2.0 / 3.0);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 if (gdkEvent.direction is OS.GDK_SCROLL_UP || gdkEvent.direction is OS.GDK_SCROLL_LEFT)
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 wheel_delta = -wheel_delta;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 int value = cast(int) Math.max(adjustment.lower,
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 Math.min(adjustment.upper - adjustment.page_size, adjustment.value + wheel_delta));
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 OS.gtk_adjustment_set_value (scrollBar.adjustmentHandle, value);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 return 1;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 return result;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 int hScrollBarWidth() {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 if (horizontalBar is null) return 0;
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
269 auto hBarHandle = OS.GTK_SCROLLED_WINDOW_HSCROLLBAR(cast(GtkScrolledWindow*)scrolledHandle);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 if (hBarHandle is null) return 0;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 GtkRequisition* requisition = new GtkRequisition();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 OS.gtk_widget_size_request(cast(GtkWidget*)hBarHandle, requisition);
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
273 int spacing = OS.GTK_SCROLLED_WINDOW_SCROLLBAR_SPACING(cast(GtkScrolledWindow*)scrolledHandle);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 return requisition.height + spacing;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 bool sendLeaveNotify () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 return scrolledHandle !is null;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 void setOrientation () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 super.setOrientation ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 if ((style & SWT.RIGHT_TO_LEFT) !is 0) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 if (scrolledHandle !is null) {
33
27324bbbac70 changed to regenerated BCD bindings
Frank Benoit <benoit@tionex.de>
parents: 31
diff changeset
285 OS.gtk_widget_set_direction (cast(GtkWidget*)scrolledHandle, OS.GTK_TEXT_DIR_RTL);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 bool setScrollBarVisible (ScrollBar bar, bool visible) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 if (scrolledHandle is null) return false;
33
27324bbbac70 changed to regenerated BCD bindings
Frank Benoit <benoit@tionex.de>
parents: 31
diff changeset
292 int hsp, vsp;
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
293 OS.gtk_scrolled_window_get_policy (cast(GtkScrolledWindow*)scrolledHandle, &hsp, &vsp);
33
27324bbbac70 changed to regenerated BCD bindings
Frank Benoit <benoit@tionex.de>
parents: 31
diff changeset
294 int policy = visible ? OS.GTK_POLICY_ALWAYS : OS.GTK_POLICY_NEVER;
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 if ((bar.style & SWT.HORIZONTAL) !is 0) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 if (hsp is policy) return false;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 hsp = policy;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 } else {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 if (vsp is policy) return false;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 vsp = policy;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 }
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
302 OS.gtk_scrolled_window_set_policy (cast(GtkScrolledWindow*)scrolledHandle, hsp, vsp);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 bar.sendEvent (visible ? SWT.Show : SWT.Hide);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 sendEvent (SWT.Resize);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 return true;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 void redrawBackgroundImage () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 void redrawWidget (int x, int y, int width, int height, bool redrawAll, bool all, bool trim) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 super.redrawWidget (x, y, width, height, redrawAll, all, trim);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 if ((OS.GTK_WIDGET_FLAGS (handle) & OS.GTK_REALIZED) is 0) return;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 if (!trim) return;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 auto topHandle = topHandle (), paintHandle = paintHandle ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 if (topHandle is paintHandle) return;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 auto window = OS.GTK_WIDGET_WINDOW (topHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 GdkRectangle* rect = new GdkRectangle ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 if (redrawAll) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 rect.width = OS.GTK_WIDGET_WIDTH (topHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 rect.height = OS.GTK_WIDGET_HEIGHT (topHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 } else {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 int destX, destY;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 OS.gtk_widget_translate_coordinates (cast(GtkWidget*)paintHandle, topHandle, x, y, &destX, &destY);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 rect.x = destX;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 rect.y = destY;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 rect.width = width;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 rect.height = height;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 OS.gdk_window_invalidate_rect (window, rect, all);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 void register () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 super.register ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 if (scrolledHandle !is null) display.addWidget (cast(GtkWidget*)scrolledHandle, this);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 void releaseHandle () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 super.releaseHandle ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 scrolledHandle = null;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 void releaseChildren (bool destroy) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 if (horizontalBar !is null) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 horizontalBar.release (false);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 horizontalBar = null;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 if (verticalBar !is null) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 verticalBar.release (false);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 verticalBar = null;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 super.releaseChildren (destroy);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 void resizeHandle (int width, int height) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 if (fixedHandle !is null) OS.gtk_widget_set_size_request (cast(GtkWidget*)fixedHandle, width, height);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 OS.gtk_widget_set_size_request (scrolledHandle !is null ? cast(GtkWidget*)scrolledHandle : handle, width, height);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 void showWidget () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 super.showWidget ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 if (scrolledHandle !is null) OS.gtk_widget_show (cast(GtkWidget*)scrolledHandle);
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 GtkWidget* topHandle () {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 if (fixedHandle !is null) return fixedHandle;
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
367 if (scrolledHandle !is null) return scrolledHandle;
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 return super.topHandle ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 void updateScrollBarValue (ScrollBar bar) {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 redrawBackgroundImage ();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 int vScrollBarWidth() {
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 if (verticalBar is null) return 0;
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
377 auto vBarHandle = OS.GTK_SCROLLED_WINDOW_VSCROLLBAR(cast(GtkScrolledWindow*)scrolledHandle);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 if (vBarHandle is null) return 0;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 GtkRequisition* requisition = new GtkRequisition();
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 OS.gtk_widget_size_request (cast(GtkWidget*)vBarHandle, requisition);
34
3a3e3aa76b66 Composite
Frank Benoit <benoit@tionex.de>
parents: 33
diff changeset
381 int spacing = OS.GTK_SCROLLED_WINDOW_SCROLLBAR_SPACING(cast(GtkScrolledWindow*)scrolledHandle);
31
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 return requisition.width + spacing;
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 }
5c24c1a67fc2 Scrollable
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 }