annotate dwt/internal/BidiUtil.d @ 155:a5afe31f5cdd

Added custom controls
author Frank Benoit <benoit@tionex.de>
date Thu, 14 Feb 2008 19:18:37 +0100
parents b0279a69d976
children 184ab53b7785
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
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import tango.util.Convert;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.dwthelper.utils;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.dwthelper.Integer;
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);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 static const char[] CLASS_NAME = "org.eclipse.swt.internal.BidiUtil"; //$NON-NLS-1$
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
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 static const char[] CD_PG_HEBREW = "1255"; //$NON-NLS-1$
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 static const char[] CD_PG_ARABIC = "1256"; //$NON-NLS-1$
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 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 * Proc used for OS.EnumSystemLanguageGroups call during isBidiPlatform test.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 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
120 if (lpLangGrpId is OS.LGRPID_HEBREW) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 isBidiPlatform_ = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 return 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 if (lpLangGrpId is OS.LGRPID_ARABIC) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 isBidiPlatform_ = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 return 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 return 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 * Wraps the ExtTextOut function.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 * @param gc the gc to use for rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 * @param renderBuffer the glyphs to render as an array of characters
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 * @param renderDx the width of each glyph in renderBuffer
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 * @param x x position to start rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 * @param y y position to start rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 public static void drawGlyphs(GC gc, wchar[] renderBuffer, int[] renderDx, int x, int y) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 int length_ = renderDx.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 if (OS.GetLayout (gc.handle) !is 0) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 reverse(renderDx);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 renderDx[length_-1]--; //fixes bug 40006
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 reverse(renderBuffer);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 // render transparently to avoid overlapping segments. fixes bug 40006
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 int oldBkMode = OS.SetBkMode(gc.handle, OS.TRANSPARENT);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 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
153 OS.SetBkMode(gc.handle, oldBkMode);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 * Return ordering and rendering information for the given text. Wraps the GetFontLanguageInfo
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 * and GetCharacterPlacement functions.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 * @param gc the GC to use for measuring of this line, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 * @param text text that bidi data should be calculated for, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162 * @param order an array of integers representing the visual position of each character in
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 * the text array, output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * @param classBuffer an array of integers representing the type (e.g., ARABIC, HEBREW,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 * LOCALNUMBER) of each character in the text array, input/output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 * @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
167 * glyph buffer, output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 * @param flags an integer representing rendering flag information, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 * @param offsets text segments that should be measured and reordered separately, input
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * parameter. See org.eclipse.swt.custom.BidiSegmentEvent for details.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 * @return buffer with the glyphs that should be rendered for the given text
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 public static char[] getRenderInfo(GC gc, char[] text, int[] order, byte[] classBuffer, int[] dx, int flags, int [] offsets) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 auto fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 auto hHeap = OS.GetProcessHeap();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 int[8] lpCs;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 int cs = OS.GetTextCharset(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 bool isRightOriented = false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 isRightOriented = OS.GetLayout(gc.handle) !is 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 OS.TranslateCharsetInfo( cast(uint*)cs, cast(CHARSETINFO*)lpCs.ptr, OS.TCI_SRCCHARSET);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 TCHAR[] textBuffer = StrToTCHARs(lpCs[1], text, false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 int byteCount = textBuffer.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 bool linkBefore = (flags & LINKBEFORE) is LINKBEFORE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 bool linkAfter = (flags & LINKAFTER) is LINKAFTER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 GCP_RESULTS result;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 result.lStructSize = GCP_RESULTS.sizeof;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 result.nGlyphs = byteCount;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 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
192 auto lpDx = result.lpDx = cast(int*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 auto lpClass = result.lpClass = cast(char*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 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
195
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 // set required dwFlags
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 int dwFlags = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 int glyphFlags = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 // Always reorder. We assume that if we are calling this function we're
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 // on a platform that supports bidi. Fixes 20690.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 dwFlags |= GCP_REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 if ((fontLanguageInfo & GCP_LIGATE) is GCP_LIGATE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 dwFlags |= GCP_LIGATE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 glyphFlags |= 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 if ((fontLanguageInfo & GCP_GLYPHSHAPE) is GCP_GLYPHSHAPE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 dwFlags |= GCP_GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 if (linkBefore) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 glyphFlags |= GCPGLYPH_LINKBEFORE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 if (linkAfter) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 glyphFlags |= GCPGLYPH_LINKAFTER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 byte[] lpGlyphs2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 if (linkBefore || linkAfter) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 lpGlyphs2 = new byte[2];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 lpGlyphs2[0]=cast(byte)glyphFlags;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 lpGlyphs2[1]=cast(byte)(glyphFlags >> 8);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 else {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 lpGlyphs2 = [cast(byte) glyphFlags];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 OS.MoveMemory(result.lpGlyphs, lpGlyphs2.ptr, lpGlyphs2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 if ((flags & CLASSIN) is CLASSIN) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 // set classification values for the substring
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 dwFlags |= GCP_CLASSIN;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 OS.MoveMemory(result.lpClass, classBuffer.ptr, classBuffer.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 wchar[] glyphBuffer = new wchar[result.nGlyphs];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 int glyphCount = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 for (int i=0; i<offsets.length-1; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 int offset = offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 int length_ = offsets [i+1] - offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 // The number of glyphs expected is <= length (segment length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 // the actual number returned may be less in case of Arabic ligatures.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 result.nGlyphs = length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 TCHAR[] textBuffer2 = StrToTCHARs(lpCs[1], text.substring(offset, offset + length_), false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 OS.GetCharacterPlacement(gc.handle, textBuffer2.ptr, textBuffer2.length, 0, &result, dwFlags);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 if (dx !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 int [] dx2 = new int [result.nGlyphs];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 OS.MoveMemory(dx2.ptr, result.lpDx, dx2.length * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 if (isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 reverse(dx2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 System.arraycopy (dx2, 0, dx, glyphCount, dx2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 if (order !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 int [] order2 = new int [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 OS.MoveMemory(order2.ptr, result.lpOrder, order2.length * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 translateOrder(order2, glyphCount, isRightOriented);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 System.arraycopy (order2, 0, order, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 if (classBuffer !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 byte [] classBuffer2 = new byte [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 OS.MoveMemory(classBuffer2.ptr, result.lpClass, classBuffer2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 System.arraycopy (classBuffer2, 0, classBuffer, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 wchar[] glyphBuffer2 = new wchar[result.nGlyphs];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 OS.MoveMemory(glyphBuffer2.ptr, result.lpGlyphs, glyphBuffer2.length * 2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 if (isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 reverse(glyphBuffer2);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 System.arraycopy (glyphBuffer2, 0, glyphBuffer, glyphCount, glyphBuffer2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 glyphCount += glyphBuffer2.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 // We concatenate successive results of calls to GCP.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 // For Arabic, it is the only good method since the number of output
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 // glyphs might be less than the number of input characters.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 // This assumes that the whole line is built by successive adjacent
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 // segments without overlapping.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 result.lpOrder += length_ * 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 result.lpDx += length_ * 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 result.lpClass += length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 result.lpGlyphs += glyphBuffer2.length * 2;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 /* Free the memory that was allocated. */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 OS.HeapFree(hHeap, 0, lpGlyphs);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 OS.HeapFree(hHeap, 0, lpClass);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 OS.HeapFree(hHeap, 0, lpDx);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 OS.HeapFree(hHeap, 0, lpOrder);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 return WCHARsToStr(glyphBuffer);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 * Return bidi ordering information for the given text. Does not return rendering
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 * information (e.g., glyphs, glyph distances). Use this method when you only need
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 * ordering information. Doing so will improve performance. Wraps the
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 * GetFontLanguageInfo and GetCharacterPlacement functions.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 * @param gc the GC to use for measuring of this line, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 * @param text text that bidi data should be calculated for, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 * @param order an array of integers representing the visual position of each character in
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 * the text array, output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 * @param classBuffer an array of integers representing the type (e.g., ARABIC, HEBREW,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 * LOCALNUMBER) of each character in the text array, input/output parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 * @param flags an integer representing rendering flag information, input parameter
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 * @param offsets text segments that should be measured and reordered separately, input
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 * parameter. See org.eclipse.swt.custom.BidiSegmentEvent for details.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 public static void getOrderInfo(GC gc, char[] text, int[] order, byte[] classBuffer, int flags, int [] offsets) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 int fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 auto hHeap = OS.GetProcessHeap();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 int[8] lpCs;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 int cs = OS.GetTextCharset(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 OS.TranslateCharsetInfo( cast(uint*) cs, cast(CHARSETINFO*)lpCs.ptr, OS.TCI_SRCCHARSET);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 TCHAR[] textBuffer = StrToTCHARs(lpCs[1], text, false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 int byteCount = textBuffer.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 bool isRightOriented = false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION(4, 10)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 isRightOriented = OS.GetLayout(gc.handle) !is 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 GCP_RESULTS result;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 result.lStructSize = GCP_RESULTS.sizeof;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 result.nGlyphs = byteCount;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 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
323 auto lpClass = result.lpClass = cast(char*) OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 // set required dwFlags, these values will affect how the text gets rendered and
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 // ordered
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 int dwFlags = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 // Always reorder. We assume that if we are calling this function we're
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 // on a platform that supports bidi. Fixes 20690.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 dwFlags |= GCP_REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 if ((fontLanguageInfo & GCP_LIGATE) is GCP_LIGATE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 dwFlags |= GCP_LIGATE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 if ((fontLanguageInfo & GCP_GLYPHSHAPE) is GCP_GLYPHSHAPE) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 dwFlags |= GCP_GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 if ((flags & CLASSIN) is CLASSIN) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 // set classification values for the substring, classification values
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 // can be specified on input
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 dwFlags |= GCP_CLASSIN;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 OS.MoveMemory(result.lpClass, classBuffer.ptr, classBuffer.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 int glyphCount = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 for (int i=0; i<offsets.length-1; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 int offset = offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 int length_ = offsets [i+1] - offsets [i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 // The number of glyphs expected is <= length (segment length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 // the actual number returned may be less in case of Arabic ligatures.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 result.nGlyphs = length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 TCHAR[] textBuffer2 = StrToTCHARs(lpCs[1], text.substring(offset, offset + length_), false);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 OS.GetCharacterPlacement(gc.handle, textBuffer2.ptr, textBuffer2.length, 0, &result, dwFlags);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 if (order !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 int [] order2 = new int [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 OS.MoveMemory(order2.ptr, result.lpOrder, order2.length * 4);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 translateOrder(order2, glyphCount, isRightOriented);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 System.arraycopy (order2, 0, order, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 if (classBuffer !is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 byte [] classBuffer2 = new byte [length_];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 OS.MoveMemory(classBuffer2.ptr, result.lpClass, classBuffer2.length);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 System.arraycopy (classBuffer2, 0, classBuffer, offset, length_);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 glyphCount += result.nGlyphs;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 // We concatenate successive results of calls to GCP.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 // For Arabic, it is the only good method since the number of output
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 // glyphs might be less than the number of input characters.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 // This assumes that the whole line is built by successive adjacent
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 // segments without overlapping.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 result.lpOrder += length_ * 4;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 result.lpClass += length_;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 /* Free the memory that was allocated. */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 OS.HeapFree(hHeap, 0, lpClass);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 OS.HeapFree(hHeap, 0, lpOrder);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 * Return bidi attribute information for the font in the specified gc.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 * @param gc the gc to query
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 * @return bitwise OR of the REORDER, LIGATE and GLYPHSHAPE flags
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 * defined by this class.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 public static int getFontBidiAttributes(GC gc) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 int fontStyle = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 int fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 if (((fontLanguageInfo & GCP_REORDER) !is 0)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 fontStyle |= REORDER;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 if (((fontLanguageInfo & GCP_LIGATE) !is 0)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 fontStyle |= LIGATE;
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_GLYPHSHAPE) !is 0)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 fontStyle |= GLYPHSHAPE;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 return fontStyle;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 * Return the active keyboard language type.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 * @return an integer representing the active keyboard language (KEYBOARD_BIDI,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
407 * KEYBOARD_NON_BIDI)
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
408 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 public static int getKeyboardLanguage() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 int layout = cast(int) OS.GetKeyboardLayout(0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 // only interested in low 2 bytes, which is the primary
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 // language identifier
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 layout = layout & 0x000000FF;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 if (layout is LANG_HEBREW) return KEYBOARD_BIDI;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 if (layout is LANG_ARABIC) return KEYBOARD_BIDI;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 // return non-bidi for all other languages
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 return KEYBOARD_NON_BIDI;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 * Return the languages that are installed for the keyboard.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 * @return integer array with an entry for each installed language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 static void*[] getKeyboardLanguageList() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 int maxSize = 10;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 void*[] tempList = new void*[maxSize];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 int size = OS.GetKeyboardLayoutList(maxSize, tempList.ptr);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 void*[] list = new void*[size];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 System.arraycopy(tempList, 0, list, 0, size);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 return list;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 * Return whether or not the platform supports a bidi language. Determine this
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 * by looking at the languages that are installed.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 * @return true if bidi is supported, false otherwise. Always
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 * false on Windows CE.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 public static bool isBidiPlatform() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 if (OS.IsWinCE) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 if (isBidiPlatform_ !is -1) return isBidiPlatform_ is 1; // already set
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 isBidiPlatform_ = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
447 // The following test is a workaround for bug report 27629. On WinXP,
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 // both bidi and complex script (e.g., Thai) languages must be installed
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 // at the same time. Since the bidi platform calls do not support
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450 // double byte characters, there is no way to run Eclipse using the
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 // complex script languages on XP, so constrain this test to answer true
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452 // only if a bidi input language is defined. Doing so will allow complex
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 // script languages to work (e.g., one can install bidi and complex script
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 // languages, but only install the Thai keyboard).
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 if (!isKeyboardBidi()) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 //Callback callback = null;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 //try {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 //callback = new Callback (Class.forName (CLASS_NAME), "EnumSystemLanguageGroupsProc", 5); //$NON-NLS-1$
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 //int lpEnumSystemLanguageGroupsProc = callback.getAddress ();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 //if (lpEnumSystemLanguageGroupsProc is 0) DWT.error(DWT.ERROR_NO_MORE_CALLBACKS);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 OS.EnumSystemLanguageGroups(&EnumSystemLanguageGroupsProc, OS.LGRPID_INSTALLED, 0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 //callback.dispose ();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 //} catch (ClassNotFoundException e) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 //if (callback !is null) callback.dispose();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 //}
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 if (isBidiPlatform_ is 1) return true;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 // need to look at system code page for NT & 98 platforms since EnumSystemLanguageGroups is
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 // not supported for these platforms
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 char[] codePage = to!(char[])(OS.GetACP());
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 if (CD_PG_ARABIC==/*eq*/codePage || CD_PG_HEBREW==/*eq*/codePage) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 isBidiPlatform_ = 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 return isBidiPlatform_ is 1;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 * Return whether or not the keyboard supports input of a bidi language. Determine this
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * by looking at the languages that are installed for the keyboard.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 * @return true if bidi is supported, false otherwise.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 public static bool isKeyboardBidi() {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 void*[] list = getKeyboardLanguageList();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 for (int i=0; i<list.length; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 int id = cast(int)list[i] & 0x000000FF;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487 if ((id is LANG_ARABIC) || (id is LANG_HEBREW)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 return true;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 * Removes the specified language listener.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 * @param hwnd the handle of the Control that is listening for keyboard language changes
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 public static void removeLanguageListener (HWND hwnd) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 languageMap.remove(hwnd);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 unsubclass(hwnd);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 * Switch the keyboard language to the specified language type. We do
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 * not distinguish between multiple bidi or multiple non-bidi languages, so
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 * set the keyboard to the first language of the given type.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 * @param language integer representing language. One of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 * KEYBOARD_BIDI, KEYBOARD_NON_BIDI.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 public static void setKeyboardLanguage(int language) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 // don't switch the keyboard if it doesn't need to be
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 if (language is getKeyboardLanguage()) return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 if (language is KEYBOARD_BIDI) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 // get the list of active languages
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 void*[] list = getKeyboardLanguageList();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 // set to first bidi language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 for (int i=0; i<list.length; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 int id = cast(int)list[i] & 0x000000FF;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 if ((id is LANG_ARABIC) || (id is LANG_HEBREW)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 OS.ActivateKeyboardLayout(list[i], 0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 } else {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 // get the list of active languages
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 void*[] list = getKeyboardLanguageList();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 // set to the first non-bidi language (anything not
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 // Hebrew or Arabic)
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 for (int i=0; i<list.length; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 int id = cast(int)list[i] & 0x000000FF;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 if ((id !is LANG_HEBREW) && (id !is LANG_ARABIC)) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 OS.ActivateKeyboardLayout(list[i], 0);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 * Sets the orientation (writing order) of the specified control. Text will
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 * be right aligned for right to left writing order.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 * <p>
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * @param hwnd the handle of the Control to change the orientation of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * @param orientation one of DWT.RIGHT_TO_LEFT or DWT.LEFT_TO_RIGHT
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * @return true if the orientation was changed, false if the orientation
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 * could not be changed
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 public static bool setOrientation (HWND hwnd, int orientation) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 if (OS.IsWinCE) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 if (OS.WIN32_VERSION < OS.VERSION(4, 10)) return false;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 int bits = OS.GetWindowLong (hwnd, OS.GWL_EXSTYLE);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 if ((orientation & DWT.RIGHT_TO_LEFT) !is 0) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 bits |= OS.WS_EX_LAYOUTRTL;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 } else {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 bits &= ~OS.WS_EX_LAYOUTRTL;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 OS.SetWindowLong (hwnd, OS.GWL_EXSTYLE, bits);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 return true;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 * Override the window proc.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
565 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 * @param hwnd control to override the window proc of
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 static void subclass(HWND hwnd) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 HWND key = hwnd;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 if ( ( key in oldProcMap ) is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 int oldProc = OS.GetWindowLong(hwnd, OS.GWL_WNDPROC);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 oldProcMap[key] = cast(WNDPROC)oldProc;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 WNDPROC t = &windowProc; // test signature
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 OS.SetWindowLong(hwnd, OS.GWL_WNDPROC, cast(int) &windowProc);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 * Reverse the character array. Used for right orientation.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 * @param charArray character array to reverse
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 static void reverse(wchar[] charArray) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 int length_ = charArray.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
584 for (int i = 0; i <= (length_ - 1) / 2; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 wchar tmp = charArray[i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 charArray[i] = charArray[length_ - 1 - i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
587 charArray[length_ - 1 - i] = tmp;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
588 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 * Reverse the integer array. Used for right orientation.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 * @param intArray integer array to reverse
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
595 static void reverse(int[] intArray) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
596 int length_ = intArray.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 for (int i = 0; i <= (length_ - 1) / 2; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 int tmp = intArray[i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 intArray[i] = intArray[length_ - 1 - i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 intArray[length_ - 1 - i] = tmp;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
602 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 * 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
605 * is to the right.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
607 * @param orderArray integer array of order values to translate
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 * @param glyphCount number of glyphs that have been processed for the current line
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 * @param isRightOriented flag indicating whether or not current orientation is to the right
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
610 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 static void translateOrder(int[] orderArray, int glyphCount, bool isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 int maxOrder = 0;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 int length_ = orderArray.length;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 if (isRightOriented) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 for (int i=0; i<length_; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 maxOrder = Math.max(maxOrder, orderArray[i]);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 for (int i=0; i<length_; i++) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 if (isRightOriented) orderArray[i] = maxOrder - orderArray[i];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 orderArray [i] += glyphCount;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 * Remove the overridden the window proc.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
627 * @param hwnd control to remove the window proc override for
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 static void unsubclass(HWND hwnd) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 HWND key = hwnd;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 if (( key in languageMap ) is null && ( key in keyMap ) is null) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 WNDPROC proc;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 if( auto p = key in oldProcMap ){
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 proc = *p;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 oldProcMap.remove( key );
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 if (proc is null) return;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 OS.SetWindowLong(hwnd, OS.GWL_WNDPROC, cast(int)proc );
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 /**
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 * Window proc to intercept keyboard language switch event (WS_INPUTLANGCHANGE)
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 * and widget orientation changes.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 * Run the Control's registered runnable when the keyboard language is switched.
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645 *
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 * @param hwnd handle of the control that is listening for the keyboard language
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 * change event
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 * @param msg window message
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 */
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 static extern(Windows) int windowProc (HWND hwnd, uint msg, uint wParam, int lParam) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 HWND key = hwnd;
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 switch (msg) {
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 case 0x51 /*OS.WM_INPUTLANGCHANGE*/:
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 Runnable runnable = languageMap[key];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 if (runnable !is null) runnable.run ();
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 break;
155
a5afe31f5cdd Added custom controls
Frank Benoit <benoit@tionex.de>
parents: 154
diff changeset
657 default:
154
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 auto oldProc = oldProcMap[key];
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 return OS.CallWindowProc ( oldProc, hwnd, msg, wParam, lParam);
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 }
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662
b0279a69d976 BidiUtil
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 }