annotate dwt/internal/BidiUtil.d @ 212:ab60f3309436

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