annotate dwt/internal/BidiUtil.d @ 237:e2affbeb686d

Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
author Frank Benoit <benoit@tionex.de>
date Thu, 19 Jun 2008 03:25:36 +0200
parents 36f5cb12e1a2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2000, 2007 IBM Corporation and others.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D programming language:
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.internal.BidiUtil;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.DWT;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.graphics.GC;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.internal.win32.OS;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
20 import dwt.widgets.Control;
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import tango.util.Convert;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.dwthelper.utils;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.dwthelper.Runnable;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 /*
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 * Wraps Win32 API used to bidi enable the StyledText widget.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 public class BidiUtil {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 // Keyboard language ids
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 public static const int KEYBOARD_NON_BIDI = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 public static const int KEYBOARD_BIDI = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 // bidi flag
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 static int isBidiPlatform_ = -1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 // getRenderInfo flag values
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 public static const int CLASSIN = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 public static const int LINKBEFORE = 2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 public static const int LINKAFTER = 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 // variables used for providing a listener mechanism for keyboard language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 // switching
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 static Runnable[HWND] languageMap;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 static Runnable[HWND] keyMap;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 static WNDPROC[HWND] oldProcMap;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 /*
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 * This code is intentionally commented. In order
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * to support CLDC, .class cannot be used because
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * it does not compile on some Java compilers when
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * they are targeted for CLDC.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 // static Callback callback = new Callback (BidiUtil.class, "windowProc", 4);
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
54 static const String CLASS_NAME = "org.eclipse.swt.internal.BidiUtil"; //$NON-NLS-1$
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 // static this() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 // try {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 // callback = new Callback (Class.forName (CLASS_NAME), "windowProc", 4); //$NON-NLS-1$
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 // if (callback.getAddress () is 0) DWT.error (DWT.ERROR_NO_MORE_CALLBACKS);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 // } catch (ClassNotFoundException e) {}
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 // }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 // GetCharacterPlacement constants
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 static const int GCP_REORDER = 0x0002;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 static const int GCP_GLYPHSHAPE = 0x0010;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 static const int GCP_LIGATE = 0x0020;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 static const int GCP_CLASSIN = 0x00080000;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 static const byte GCPCLASS_ARABIC = 2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 static const byte GCPCLASS_HEBREW = 2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 static const byte GCPCLASS_LOCALNUMBER = 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 static const byte GCPCLASS_LATINNUMBER = 5;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 static const int GCPGLYPH_LINKBEFORE = 0x8000;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 static const int GCPGLYPH_LINKAFTER = 0x4000;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 // ExtTextOut constants
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 static const int ETO_CLIPPED = 0x4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 static const int ETO_GLYPH_INDEX = 0x0010;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 // Windows primary language identifiers
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 static const int LANG_ARABIC = 0x01;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 static const int LANG_HEBREW = 0x0d;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 // code page identifiers
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
80 static const String CD_PG_HEBREW = "1255"; //$NON-NLS-1$
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
81 static const String CD_PG_ARABIC = "1256"; //$NON-NLS-1$
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 // ActivateKeyboard constants
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 static const int HKL_NEXT = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 static const int HKL_PREV = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 /*
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * Public character class constants are the same as Windows
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 * platform constants.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 * Saves conversion of class array in getRenderInfo to arbitrary
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90 * constants for now.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 public static const int CLASS_HEBREW = GCPCLASS_ARABIC;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 public static const int CLASS_ARABIC = GCPCLASS_HEBREW;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 public static const int CLASS_LOCALNUMBER = GCPCLASS_LOCALNUMBER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 public static const int CLASS_LATINNUMBER = GCPCLASS_LATINNUMBER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 public static const int REORDER = GCP_REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 public static const int LIGATE = GCP_LIGATE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 public static const int GLYPHSHAPE = GCP_GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 * Adds a language listener. The listener will get notified when the language of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * the keyboard changes (via Alt-Shift on Win platforms). Do this by creating a
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * window proc for the Control so that the window messages for the Control can be
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * monitored.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 * @param hwnd the handle of the Control that is listening for keyboard language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 * changes
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * @param runnable the code that should be executed when a keyboard language change
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 * occurs
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 public static void addLanguageListener (HWND hwnd, Runnable runnable) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 languageMap[hwnd] = runnable;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 subclass(hwnd);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
116 public static void addLanguageListener (Control control, Runnable runnable) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
117 addLanguageListener(control.handle, runnable);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
118 }
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 * Proc used for OS.EnumSystemLanguageGroups call during isBidiPlatform test.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 static extern(Windows) int EnumSystemLanguageGroupsProc(uint lpLangGrpId, wchar* lpLangGrpIdString, wchar* lpLangGrpName, uint options, int lParam) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 if (lpLangGrpId is OS.LGRPID_HEBREW) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 isBidiPlatform_ = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 return 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 if (lpLangGrpId is OS.LGRPID_ARABIC) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 isBidiPlatform_ = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 return 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 return 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 * Wraps the ExtTextOut function.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 * @param gc the gc to use for rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 * @param renderBuffer the glyphs to render as an array of characters
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 * @param renderDx the width of each glyph in renderBuffer
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 * @param x x position to start rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 * @param y y position to start rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 public static void drawGlyphs(GC gc, wchar[] renderBuffer, int[] renderDx, int x, int y) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 int length_ = renderDx.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 if (OS.GetLayout (gc.handle) !is 0) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 reverse(renderDx);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 renderDx[length_-1]--; //fixes bug 40006
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 reverse(renderBuffer);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 // render transparently to avoid overlapping segments. fixes bug 40006
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 int oldBkMode = OS.SetBkMode(gc.handle, OS.TRANSPARENT);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 OS.ExtTextOutW(gc.handle, x, y, ETO_GLYPH_INDEX , null, renderBuffer.ptr, renderBuffer.length, renderDx.ptr);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 OS.SetBkMode(gc.handle, oldBkMode);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 * Return ordering and rendering information for the given text. Wraps the GetFontLanguageInfo
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 * and GetCharacterPlacement functions.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 * @param gc the GC to use for measuring of this line, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * @param text text that bidi data should be calculated for, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 * @param order an array of integers representing the visual position of each character in
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * the text array, output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 * @param classBuffer an array of integers representing the type (e.g., ARABIC, HEBREW,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 * LOCALNUMBER) of each character in the text array, input/output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 * @param dx an array of integers representing the pixel width of each glyph in the returned
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * glyph buffer, output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 * @param flags an integer representing rendering flag information, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 * @param offsets text segments that should be measured and reordered separately, input
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * parameter. See org.eclipse.swt.custom.BidiSegmentEvent for details.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * @return buffer with the glyphs that should be rendered for the given text
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
176 public static char[] getRenderInfo(GC gc, String text, int[] order, byte[] classBuffer, int[] dx, int flags, int [] offsets) {
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 auto fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 auto hHeap = OS.GetProcessHeap();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 int[8] lpCs;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 int cs = OS.GetTextCharset(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 bool isRightOriented = false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 isRightOriented = OS.GetLayout(gc.handle) !is 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 OS.TranslateCharsetInfo( cast(uint*)cs, cast(CHARSETINFO*)lpCs.ptr, OS.TCI_SRCCHARSET);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 TCHAR[] textBuffer = StrToTCHARs(lpCs[1], text, false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 int byteCount = textBuffer.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 bool linkBefore = (flags & LINKBEFORE) is LINKBEFORE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 bool linkAfter = (flags & LINKAFTER) is LINKAFTER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 GCP_RESULTS result;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 result.lStructSize = GCP_RESULTS.sizeof;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 result.nGlyphs = byteCount;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 auto lpOrder = result.lpOrder = cast(uint*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 auto lpDx = result.lpDx = cast(int*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount * 4);
237
e2affbeb686d Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
196 auto lpClass = result.lpClass = cast(CHAR*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 auto lpGlyphs = result.lpGlyphs = cast(wchar*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount * 2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 // set required dwFlags
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 int dwFlags = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 int glyphFlags = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 // Always reorder. We assume that if we are calling this function we're
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 // on a platform that supports bidi. Fixes 20690.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 dwFlags |= GCP_REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 if ((fontLanguageInfo & GCP_LIGATE) is GCP_LIGATE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 dwFlags |= GCP_LIGATE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 glyphFlags |= 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 if ((fontLanguageInfo & GCP_GLYPHSHAPE) is GCP_GLYPHSHAPE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 dwFlags |= GCP_GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 if (linkBefore) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 glyphFlags |= GCPGLYPH_LINKBEFORE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 if (linkAfter) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 glyphFlags |= GCPGLYPH_LINKAFTER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 byte[] lpGlyphs2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 if (linkBefore || linkAfter) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 lpGlyphs2 = new byte[2];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 lpGlyphs2[0]=cast(byte)glyphFlags;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 lpGlyphs2[1]=cast(byte)(glyphFlags >> 8);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 else {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 lpGlyphs2 = [cast(byte) glyphFlags];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 OS.MoveMemory(result.lpGlyphs, lpGlyphs2.ptr, lpGlyphs2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 if ((flags & CLASSIN) is CLASSIN) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 // set classification values for the substring
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 dwFlags |= GCP_CLASSIN;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 OS.MoveMemory(result.lpClass, classBuffer.ptr, classBuffer.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 wchar[] glyphBuffer = new wchar[result.nGlyphs];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 int glyphCount = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 for (int i=0; i<offsets.length-1; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 int offset = offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 int length_ = offsets [i+1] - offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 // The number of glyphs expected is <= length (segment length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 // the actual number returned may be less in case of Arabic ligatures.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 result.nGlyphs = length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 TCHAR[] textBuffer2 = StrToTCHARs(lpCs[1], text.substring(offset, offset + length_), false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 OS.GetCharacterPlacement(gc.handle, textBuffer2.ptr, textBuffer2.length, 0, &result, dwFlags);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 if (dx !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 int [] dx2 = new int [result.nGlyphs];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 OS.MoveMemory(dx2.ptr, result.lpDx, dx2.length * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 if (isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 reverse(dx2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 System.arraycopy (dx2, 0, dx, glyphCount, dx2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 if (order !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 int [] order2 = new int [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 OS.MoveMemory(order2.ptr, result.lpOrder, order2.length * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 translateOrder(order2, glyphCount, isRightOriented);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 System.arraycopy (order2, 0, order, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 if (classBuffer !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 byte [] classBuffer2 = new byte [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 OS.MoveMemory(classBuffer2.ptr, result.lpClass, classBuffer2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 System.arraycopy (classBuffer2, 0, classBuffer, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 wchar[] glyphBuffer2 = new wchar[result.nGlyphs];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 OS.MoveMemory(glyphBuffer2.ptr, result.lpGlyphs, glyphBuffer2.length * 2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 if (isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 reverse(glyphBuffer2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 System.arraycopy (glyphBuffer2, 0, glyphBuffer, glyphCount, glyphBuffer2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 glyphCount += glyphBuffer2.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 // We concatenate successive results of calls to GCP.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 // For Arabic, it is the only good method since the number of output
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 // glyphs might be less than the number of input characters.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 // This assumes that the whole line is built by successive adjacent
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 // segments without overlapping.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 result.lpOrder += length_ * 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 result.lpDx += length_ * 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 result.lpClass += length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 result.lpGlyphs += glyphBuffer2.length * 2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 /* Free the memory that was allocated. */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 OS.HeapFree(hHeap, 0, lpGlyphs);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 OS.HeapFree(hHeap, 0, lpClass);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 OS.HeapFree(hHeap, 0, lpDx);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 OS.HeapFree(hHeap, 0, lpOrder);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 return WCHARsToStr(glyphBuffer);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 * Return bidi ordering information for the given text. Does not return rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 * information (e.g., glyphs, glyph distances). Use this method when you only need
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 * ordering information. Doing so will improve performance. Wraps the
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 * GetFontLanguageInfo and GetCharacterPlacement functions.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 * @param gc the GC to use for measuring of this line, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 * @param text text that bidi data should be calculated for, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 * @param order an array of integers representing the visual position of each character in
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 * the text array, output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 * @param classBuffer an array of integers representing the type (e.g., ARABIC, HEBREW,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 * LOCALNUMBER) of each character in the text array, input/output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 * @param flags an integer representing rendering flag information, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 * @param offsets text segments that should be measured and reordered separately, input
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 * parameter. See org.eclipse.swt.custom.BidiSegmentEvent for details.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
309 public static void getOrderInfo(GC gc, String text, int[] order, byte[] classBuffer, int flags, int [] offsets) {
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 int fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 auto hHeap = OS.GetProcessHeap();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 int[8] lpCs;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 int cs = OS.GetTextCharset(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 OS.TranslateCharsetInfo( cast(uint*) cs, cast(CHARSETINFO*)lpCs.ptr, OS.TCI_SRCCHARSET);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 TCHAR[] textBuffer = StrToTCHARs(lpCs[1], text, false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 int byteCount = textBuffer.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 bool isRightOriented = false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 isRightOriented = OS.GetLayout(gc.handle) !is 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 GCP_RESULTS result;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 result.lStructSize = GCP_RESULTS.sizeof;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 result.nGlyphs = byteCount;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 auto lpOrder = result.lpOrder = cast(uint*) OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount * 4);
237
e2affbeb686d Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
326 auto lpClass = result.lpClass = cast(CHAR*) OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 // set required dwFlags, these values will affect how the text gets rendered and
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 // ordered
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 int dwFlags = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 // Always reorder. We assume that if we are calling this function we're
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 // on a platform that supports bidi. Fixes 20690.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 dwFlags |= GCP_REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 if ((fontLanguageInfo & GCP_LIGATE) is GCP_LIGATE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 dwFlags |= GCP_LIGATE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 if ((fontLanguageInfo & GCP_GLYPHSHAPE) is GCP_GLYPHSHAPE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 dwFlags |= GCP_GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 if ((flags & CLASSIN) is CLASSIN) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 // set classification values for the substring, classification values
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 // can be specified on input
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 dwFlags |= GCP_CLASSIN;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 OS.MoveMemory(result.lpClass, classBuffer.ptr, classBuffer.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 int glyphCount = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 for (int i=0; i<offsets.length-1; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 int offset = offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 int length_ = offsets [i+1] - offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 // The number of glyphs expected is <= length (segment length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 // the actual number returned may be less in case of Arabic ligatures.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 result.nGlyphs = length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 TCHAR[] textBuffer2 = StrToTCHARs(lpCs[1], text.substring(offset, offset + length_), false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 OS.GetCharacterPlacement(gc.handle, textBuffer2.ptr, textBuffer2.length, 0, &result, dwFlags);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 if (order !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 int [] order2 = new int [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 OS.MoveMemory(order2.ptr, result.lpOrder, order2.length * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 translateOrder(order2, glyphCount, isRightOriented);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 System.arraycopy (order2, 0, order, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 if (classBuffer !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 byte [] classBuffer2 = new byte [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 OS.MoveMemory(classBuffer2.ptr, result.lpClass, classBuffer2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 System.arraycopy (classBuffer2, 0, classBuffer, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 glyphCount += result.nGlyphs;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 // We concatenate successive results of calls to GCP.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 // For Arabic, it is the only good method since the number of output
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 // glyphs might be less than the number of input characters.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 // This assumes that the whole line is built by successive adjacent
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 // segments without overlapping.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 result.lpOrder += length_ * 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 result.lpClass += length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 /* Free the memory that was allocated. */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 OS.HeapFree(hHeap, 0, lpClass);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 OS.HeapFree(hHeap, 0, lpOrder);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 * Return bidi attribute information for the font in the specified gc.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 * @param gc the gc to query
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 * @return bitwise OR of the REORDER, LIGATE and GLYPHSHAPE flags
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 * defined by this class.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 public static int getFontBidiAttributes(GC gc) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 int fontStyle = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 int fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 if (((fontLanguageInfo & GCP_REORDER) !is 0)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 fontStyle |= REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 if (((fontLanguageInfo & GCP_LIGATE) !is 0)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 fontStyle |= LIGATE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 if (((fontLanguageInfo & GCP_GLYPHSHAPE) !is 0)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 fontStyle |= GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 return fontStyle;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 * Return the active keyboard language type.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 * @return an integer representing the active keyboard language (KEYBOARD_BIDI,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 * KEYBOARD_NON_BIDI)
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 public static int getKeyboardLanguage() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 int layout = cast(int) OS.GetKeyboardLayout(0);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
414 int langID = OS.PRIMARYLANGID(OS.LOWORD(layout));
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
415 if (langID is LANG_HEBREW) return KEYBOARD_BIDI;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
416 if (langID is LANG_ARABIC) return KEYBOARD_BIDI;
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 // return non-bidi for all other languages
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 return KEYBOARD_NON_BIDI;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 * Return the languages that are installed for the keyboard.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 * @return integer array with an entry for each installed language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 static void*[] getKeyboardLanguageList() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 int maxSize = 10;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 void*[] tempList = new void*[maxSize];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 int size = OS.GetKeyboardLayoutList(maxSize, tempList.ptr);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 void*[] list = new void*[size];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 System.arraycopy(tempList, 0, list, 0, size);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 return list;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 * Return whether or not the platform supports a bidi language. Determine this
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 * by looking at the languages that are installed.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 * @return true if bidi is supported, false otherwise. Always
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 * false on Windows CE.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 public static bool isBidiPlatform() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 if (OS.IsWinCE) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 if (isBidiPlatform_ !is -1) return isBidiPlatform_ is 1; // already set
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 isBidiPlatform_ = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 // The following test is a workaround for bug report 27629. On WinXP,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 // both bidi and complex script (e.g., Thai) languages must be installed
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 // at the same time. Since the bidi platform calls do not support
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 // double byte characters, there is no way to run Eclipse using the
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 // complex script languages on XP, so constrain this test to answer true
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 // only if a bidi input language is defined. Doing so will allow complex
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 // script languages to work (e.g., one can install bidi and complex script
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 // languages, but only install the Thai keyboard).
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 if (!isKeyboardBidi()) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 //Callback callback = null;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 //try {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 //callback = new Callback (Class.forName (CLASS_NAME), "EnumSystemLanguageGroupsProc", 5); //$NON-NLS-1$
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 //int lpEnumSystemLanguageGroupsProc = callback.getAddress ();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 //if (lpEnumSystemLanguageGroupsProc is 0) DWT.error(DWT.ERROR_NO_MORE_CALLBACKS);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 OS.EnumSystemLanguageGroups(&EnumSystemLanguageGroupsProc, OS.LGRPID_INSTALLED, 0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 //callback.dispose ();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 //} catch (ClassNotFoundException e) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 //if (callback !is null) callback.dispose();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 //}
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 if (isBidiPlatform_ is 1) return true;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 // need to look at system code page for NT & 98 platforms since EnumSystemLanguageGroups is
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 // not supported for these platforms
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
471 String codePage = to!(String)(OS.GetACP());
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 if (CD_PG_ARABIC==/*eq*/codePage || CD_PG_HEBREW==/*eq*/codePage) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 isBidiPlatform_ = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 return isBidiPlatform_ is 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * Return whether or not the keyboard supports input of a bidi language. Determine this
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 * by looking at the languages that are installed for the keyboard.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 * @return true if bidi is supported, false otherwise.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 public static bool isKeyboardBidi() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 void*[] list = getKeyboardLanguageList();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 for (int i=0; i<list.length; i++) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
487 int id = OS.PRIMARYLANGID(OS.LOWORD( cast(int) list[i]));
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 if ((id is LANG_ARABIC) || (id is LANG_HEBREW)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 return true;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 * Removes the specified language listener.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 * @param hwnd the handle of the Control that is listening for keyboard language changes
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 public static void removeLanguageListener (HWND hwnd) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 languageMap.remove(hwnd);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 unsubclass(hwnd);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
504 public static void removeLanguageListener (Control control) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
505 removeLanguageListener(control.handle);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
506 }
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 * Switch the keyboard language to the specified language type. We do
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 * not distinguish between multiple bidi or multiple non-bidi languages, so
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 * set the keyboard to the first language of the given type.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 * @param language integer representing language. One of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 * KEYBOARD_BIDI, KEYBOARD_NON_BIDI.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 public static void setKeyboardLanguage(int language) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 // don't switch the keyboard if it doesn't need to be
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 if (language is getKeyboardLanguage()) return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 if (language is KEYBOARD_BIDI) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 // get the list of active languages
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 void*[] list = getKeyboardLanguageList();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 // set to first bidi language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 for (int i=0; i<list.length; i++) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
525 int id = OS.PRIMARYLANGID(OS.LOWORD( cast(int) list[i]));
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 if ((id is LANG_ARABIC) || (id is LANG_HEBREW)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 OS.ActivateKeyboardLayout(list[i], 0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 } else {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 // get the list of active languages
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 void*[] list = getKeyboardLanguageList();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 // set to the first non-bidi language (anything not
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 // Hebrew or Arabic)
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 for (int i=0; i<list.length; i++) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
537 int id = OS.PRIMARYLANGID(OS.LOWORD( cast(int) list[i]));
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 if ((id !is LANG_HEBREW) && (id !is LANG_ARABIC)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 OS.ActivateKeyboardLayout(list[i], 0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * Sets the orientation (writing order) of the specified control. Text will
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * be right aligned for right to left writing order.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * @param hwnd the handle of the Control to change the orientation of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 * @param orientation one of DWT.RIGHT_TO_LEFT or DWT.LEFT_TO_RIGHT
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 * @return true if the orientation was changed, false if the orientation
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 * could not be changed
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 public static bool setOrientation (HWND hwnd, int orientation) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 if (OS.IsWinCE) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 if (OS.WIN32_VERSION < OS.VERSION(4, 10)) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 int bits = OS.GetWindowLong (hwnd, OS.GWL_EXSTYLE);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 if ((orientation & DWT.RIGHT_TO_LEFT) !is 0) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 bits |= OS.WS_EX_LAYOUTRTL;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 } else {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 bits &= ~OS.WS_EX_LAYOUTRTL;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 OS.SetWindowLong (hwnd, OS.GWL_EXSTYLE, bits);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 return true;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
567 public static bool setOrientation (Control control, int orientation) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
568 return setOrientation(control.handle, orientation);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
569 }
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 * Override the window proc.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 * @param hwnd control to override the window proc of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 static void subclass(HWND hwnd) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 HWND key = hwnd;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 if ( ( key in oldProcMap ) is null) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
578 int /*long*/ oldProc = OS.GetWindowLongPtr(hwnd, OS.GWLP_WNDPROC);
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 oldProcMap[key] = cast(WNDPROC)oldProc;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 WNDPROC t = &windowProc; // test signature
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
581 OS.SetWindowLongPtr(hwnd, OS.GWLP_WNDPROC, cast(LONG_PTR)&windowProc);
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 * Reverse the character array. Used for right orientation.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 * @param charArray character array to reverse
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 static void reverse(wchar[] charArray) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 int length_ = charArray.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 for (int i = 0; i <= (length_ - 1) / 2; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 wchar tmp = charArray[i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 charArray[i] = charArray[length_ - 1 - i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 charArray[length_ - 1 - i] = tmp;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 * Reverse the integer array. Used for right orientation.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 * @param intArray integer array to reverse
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 static void reverse(int[] intArray) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 int length_ = intArray.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 for (int i = 0; i <= (length_ - 1) / 2; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
605 int tmp = intArray[i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 intArray[i] = intArray[length_ - 1 - i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 intArray[length_ - 1 - i] = tmp;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 * Adjust the order array so that it is relative to the start of the line. Also reverse the order array if the orientation
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 * is to the right.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 * @param orderArray integer array of order values to translate
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 * @param glyphCount number of glyphs that have been processed for the current line
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 * @param isRightOriented flag indicating whether or not current orientation is to the right
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 static void translateOrder(int[] orderArray, int glyphCount, bool isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 int maxOrder = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 int length_ = orderArray.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 if (isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 for (int i=0; i<length_; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623 maxOrder = Math.max(maxOrder, orderArray[i]);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 for (int i=0; i<length_; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 if (isRightOriented) orderArray[i] = maxOrder - orderArray[i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 orderArray [i] += glyphCount;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 * Remove the overridden the window proc.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 * @param hwnd control to remove the window proc override for
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 static void unsubclass(HWND hwnd) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 HWND key = hwnd;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 if (( key in languageMap ) is null && ( key in keyMap ) is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 WNDPROC proc;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 if( auto p = key in oldProcMap ){
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 proc = *p;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 oldProcMap.remove( key );
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 if (proc is null) return;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
645 OS.SetWindowLongPtr(hwnd, OS.GWLP_WNDPROC, cast(LONG_PTR) proc );
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 * Window proc to intercept keyboard language switch event (WS_INPUTLANGCHANGE)
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 * and widget orientation changes.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 * Run the Control's registered runnable when the keyboard language is switched.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 * @param hwnd handle of the control that is listening for the keyboard language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 * change event
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 * @param msg window message
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 static extern(Windows) int windowProc (HWND hwnd, uint msg, uint wParam, int lParam) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 HWND key = hwnd;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 switch (msg) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 case 0x51 /*OS.WM_INPUTLANGCHANGE*/:
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 Runnable runnable = languageMap[key];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 if (runnable !is null) runnable.run ();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 break;
155
a5afe31f5cdd Added custom controls
Frank Benoit <benoit@tionex.de>
parents: 154
diff changeset
664 default:
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 auto oldProc = oldProcMap[key];
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
667 return oldProc( hwnd, msg, wParam, lParam);
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 }