changeset 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 ff59aeb96cac
children 36f5cb12e1a2
files dsss.conf dwt/DWT.d dwt/DWTError.d dwt/DWTException.d dwt/accessibility/Accessible.d dwt/accessibility/AccessibleControlEvent.d dwt/accessibility/AccessibleEvent.d dwt/accessibility/AccessibleTextEvent.d dwt/custom/BidiSegmentEvent.d dwt/custom/Bullet.d dwt/custom/BusyIndicator.d dwt/custom/CCombo.d dwt/custom/CLabel.d dwt/custom/CTabFolder.d dwt/custom/CTabFolderEvent.d dwt/custom/CTabItem.d dwt/custom/DefaultContent.d dwt/custom/ExtendedModifyEvent.d dwt/custom/LineBackgroundEvent.d dwt/custom/LineStyleEvent.d dwt/custom/MovementEvent.d dwt/custom/PopupList.d dwt/custom/SashFormData.d dwt/custom/ScrolledComposite.d dwt/custom/StackLayout.d dwt/custom/StyleRange.d dwt/custom/StyledText.d dwt/custom/StyledTextContent.d dwt/custom/StyledTextEvent.d dwt/custom/StyledTextPrintOptions.d dwt/custom/StyledTextRenderer.d dwt/custom/TableCursor.d dwt/custom/TableEditor.d dwt/custom/TableTree.d dwt/custom/TableTreeItem.d dwt/custom/TextChangingEvent.d dwt/custom/ViewForm.d dwt/dnd/Clipboard.d dwt/dnd/DND.d dwt/dnd/DragSource.d dwt/dnd/DropTarget.d dwt/dnd/DropTargetListener.d dwt/dnd/FileTransfer.d dwt/dnd/HTMLTransfer.d dwt/dnd/RTFTransfer.d dwt/dnd/TextTransfer.d dwt/dnd/Transfer.d dwt/dnd/URLTransfer.d dwt/dwthelper/ByteArrayOutputStream.d dwt/dwthelper/File.d dwt/dwthelper/FileInputStream.d dwt/dwthelper/FileOutputStream.d dwt/dwthelper/OutputStream.d dwt/dwthelper/ResourceBundle.d dwt/dwthelper/System.d dwt/dwthelper/XmlTranscode.d dwt/dwthelper/utils.d dwt/events/KeyEvent.d dwt/events/MenuDetectEvent.d dwt/events/MouseEvent.d dwt/events/PaintEvent.d dwt/events/SelectionEvent.d dwt/events/ShellEvent.d dwt/events/TraverseEvent.d dwt/events/TypedEvent.d dwt/events/VerifyEvent.d dwt/graphics/Color.d dwt/graphics/Cursor.d dwt/graphics/Device.d dwt/graphics/Font.d dwt/graphics/FontData.d dwt/graphics/GC.d dwt/graphics/GlyphMetrics.d dwt/graphics/Image.d dwt/graphics/ImageData.d dwt/graphics/ImageDataLoader.d dwt/graphics/ImageLoader.d dwt/graphics/ImageLoaderEvent.d dwt/graphics/Path.d dwt/graphics/Pattern.d dwt/graphics/Point.d dwt/graphics/RGB.d dwt/graphics/Rectangle.d dwt/graphics/Region.d dwt/graphics/TextLayout.d dwt/graphics/TextStyle.d dwt/graphics/Transform.d dwt/internal/BidiUtil.d dwt/internal/Compatibility.d dwt/internal/DWTEventObject.d dwt/internal/Library.d dwt/internal/Platform.d dwt/internal/image/FileFormat.d dwt/internal/image/GIFFileFormat.d dwt/internal/image/JPEGDecoder.d dwt/internal/image/PngChunk.d dwt/internal/image/PngIhdrChunk.d dwt/internal/image/PngPlteChunk.d dwt/internal/ole/win32/COM.d dwt/layout/FillLayout.d dwt/layout/FormAttachment.d dwt/layout/FormData.d dwt/layout/FormLayout.d dwt/layout/GridData.d dwt/layout/GridLayout.d dwt/layout/RowData.d dwt/layout/RowLayout.d dwt/ole/win32/OLE.d dwt/ole/win32/OleAutomation.d dwt/ole/win32/OleClientSite.d dwt/ole/win32/OleControlSite.d dwt/ole/win32/OleFrame.d dwt/ole/win32/OleFunctionDescription.d dwt/ole/win32/OleParameterDescription.d dwt/ole/win32/OlePropertyDescription.d dwt/ole/win32/Variant.d dwt/opengl/GLData.d dwt/printing/PrintDialog.d dwt/printing/Printer.d dwt/printing/PrinterData.d dwt/program/Program.d dwt/widgets/Button.d dwt/widgets/Combo.d dwt/widgets/Composite.d dwt/widgets/Control.d dwt/widgets/CoolBar.d dwt/widgets/DateTime.d dwt/widgets/Decorations.d dwt/widgets/Dialog.d dwt/widgets/DirectoryDialog.d dwt/widgets/Display.d dwt/widgets/Event.d dwt/widgets/ExpandBar.d dwt/widgets/ExpandItem.d dwt/widgets/FileDialog.d dwt/widgets/Group.d dwt/widgets/Item.d dwt/widgets/Label.d dwt/widgets/Link.d dwt/widgets/List.d dwt/widgets/Menu.d dwt/widgets/MenuItem.d dwt/widgets/MessageBox.d dwt/widgets/ProgressBar.d dwt/widgets/Sash.d dwt/widgets/Scale.d dwt/widgets/Scrollable.d dwt/widgets/Shell.d dwt/widgets/Slider.d dwt/widgets/Spinner.d dwt/widgets/TabFolder.d dwt/widgets/TabItem.d dwt/widgets/Table.d dwt/widgets/TableColumn.d dwt/widgets/TableItem.d dwt/widgets/Text.d dwt/widgets/ToolBar.d dwt/widgets/ToolItem.d dwt/widgets/ToolTip.d dwt/widgets/TrayItem.d dwt/widgets/Tree.d dwt/widgets/TreeColumn.d dwt/widgets/TreeItem.d dwt/widgets/Widget.d
diffstat 164 files changed, 1230 insertions(+), 1147 deletions(-) [+]
line wrap: on
line diff
--- a/dsss.conf	Sat Apr 26 10:01:48 2008 +0200
+++ b/dsss.conf	Mon May 05 00:12:38 2008 +0200
@@ -15,6 +15,6 @@
 #}
 
 [dwt]
-type=sourcelibrary
+type=library
 
 
--- a/dwt/DWT.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/DWT.d	Mon May 05 00:12:38 2008 +0200
@@ -20,6 +20,7 @@
 import dwt.DWTException;
 
 import tango.core.Exception;
+import dwt.dwthelper.utils;
 
 version(build){
     pragma(link, "advapi32");
@@ -3392,7 +3393,7 @@
  *
  * @see DWT
  */
-static char[] findErrorText (int code) {
+static String findErrorText (int code) {
     switch (code) {
         case ERROR_UNSPECIFIED:            return "Unspecified error"; //$NON-NLS-1$
         case ERROR_NO_HANDLES:             return "No more handles"; //$NON-NLS-1$
@@ -3448,7 +3449,7 @@
  *    <li>ERROR_NULL_ARGUMENT - if the key is null</li>
  * </ul>
  */
-public static char[] getMessage(char[] key) {
+public static String getMessage(String key) {
     //return Compatibility.getMessage(key);
     return "";
 }
@@ -3459,7 +3460,7 @@
  *
  * @return the DWT platform name
  */
-public static char[] getPlatform () {
+public static String getPlatform () {
     return Platform.PLATFORM;
 }
 
@@ -3478,7 +3479,7 @@
  *
  * @param code the DWT error code
  */
-public static void error (char[] file, long line, int code) {
+public static void error (String file, long line, int code) {
     error (code, null);
 }
 public static void error (int code) {
@@ -3542,7 +3543,7 @@
  *
  * @since 3.0
  */
-public static void error (int code, Exception throwable, char[] detail) {
+public static void error (int code, Exception throwable, String detail) {
 
     /*
     * This code prevents the creation of "chains" of SWTErrors and
@@ -3563,7 +3564,7 @@
         if (auto t = cast(DWTException)throwable ) throw t;
     }
 
-    char[] message = findErrorText (code);
+    String message = findErrorText (code);
     if (detail != null) message ~= detail;
     switch (code) {
 
--- a/dwt/DWTError.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/DWTError.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 
 import tango.core.Exception;
 import tango.io.Stdout;
+import dwt.dwthelper.utils;
 
 /**
  * This error is thrown whenever an unrecoverable error
@@ -80,7 +81,7 @@
  *
  * @param message the detail message for the exception
  */
-public this (char[] message) {
+public this (String message) {
     this (DWT.ERROR_UNSPECIFIED, message);
 }
 
@@ -103,7 +104,7 @@
  * @param code the DWT error code
  * @param message the detail message for the exception
  */
-public this (int code, char[] message) {
+public this (int code, String message) {
     super (message);
     this.code = code;
 }
@@ -132,7 +133,7 @@
  *  </p>
  *  @return the error message string of this DWTError object
  */
-public char[] getMessage () {
+public String getMessage () {
     if (throwable is null)
         return super.toString();
     return super.toString () ~ " (" ~ throwable.toString () ~ ")"; //$NON-NLS-1$ //$NON-NLS-2$
--- a/dwt/DWTException.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/DWTException.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 
 import tango.core.Exception;
 import tango.io.Stdout;
+import dwt.dwthelper.utils;
 
 /**
  * This runtime exception is thrown whenever a recoverable error
@@ -72,7 +73,7 @@
  *
  * @param message the detail message for the exception
  */
-public this (char[] message) {
+public this (String message) {
     this (DWT.ERROR_UNSPECIFIED, message);
 }
 
@@ -95,7 +96,7 @@
  * @param code the DWT error code
  * @param message the detail message for the exception
  */
-public this (int code, char[] message) {
+public this (int code, String message) {
     super (message);
     this.code = code;
 }
@@ -124,7 +125,7 @@
  *  </p>
  *  @return the error message string of this DWTException object
  */
-public char[] getMessage () {
+public String getMessage () {
     if (throwable is null) return super.toString ();
     return super.toString () ~ " (" ~ throwable.toString () ~ ")"; //$NON-NLS-1$ //$NON-NLS-2$
 }
--- a/dwt/accessibility/Accessible.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/accessibility/Accessible.d	Mon May 05 00:12:38 2008 +0200
@@ -631,7 +631,7 @@
         if ((v.vt & 0xFFFF) !is COM.VT_I4) return COM.E_INVALIDARG;
 
         /* Get the default defaultAction from the OS. */
-        char[] osDefaultAction = null;
+        String osDefaultAction = null;
         int code = iaccessible.get_accDefaultAction(variant, pszDefaultAction);
         if (code is COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
         if (accessibleControlListeners.length is 0) return code;
@@ -659,7 +659,7 @@
         if ((v.vt & 0xFFFF) !is COM.VT_I4) return COM.E_INVALIDARG;
 
         /* Get the default description from the OS. */
-        char[] osDescription = null;
+        String osDescription = null;
         int code = iaccessible.get_accDescription(variant, pszDescription);
         if (code is COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
         // TEMPORARY CODE - process tree even if there are no apps listening
@@ -769,7 +769,7 @@
         if ((v.vt & 0xFFFF) !is COM.VT_I4) return COM.E_INVALIDARG;
 
         /* Get the default help string from the OS. */
-        char[] osHelp = null;
+        String osHelp = null;
         int code = iaccessible.get_accHelp(variant, pszHelp);
         if (code is COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
         if (accessibleListeners.length is 0) return code;
@@ -806,7 +806,7 @@
         if ((v.vt & 0xFFFF) !is COM.VT_I4) return COM.E_INVALIDARG;
 
         /* Get the default keyboard shortcut from the OS. */
-        char[] osKeyboardShortcut = null;
+        String osKeyboardShortcut = null;
         int code = iaccessible.get_accKeyboardShortcut(variant, pszKeyboardShortcut);
         if (code is COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
         if (accessibleListeners.length is 0) return code;
@@ -835,7 +835,7 @@
         if ((v.vt & 0xFFFF) !is COM.VT_I4) return COM.E_INVALIDARG;
 
         /* Get the default name from the OS. */
-        char[] osName = null;
+        String osName = null;
         int code = iaccessible.get_accName(variant, pszName);
         if (code is COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
         if (accessibleListeners.length is 0) return code;
@@ -1036,7 +1036,7 @@
         if ((v.vt & 0xFFFF) !is COM.VT_I4) return COM.E_INVALIDARG;
 
         /* Get the default value string from the OS. */
-        char[] osValue = null;
+        String osValue = null;
         int code = iaccessible.get_accValue(variant, pszValue);
         if (code is COM.E_INVALIDARG) code = COM.S_FALSE; // proxy doesn't know about app childID
         if (accessibleControlListeners.length is 0) return code;
--- a/dwt/accessibility/AccessibleControlEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/accessibility/AccessibleControlEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 
 import dwt.internal.DWTEventObject;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent as a result of
@@ -39,7 +40,7 @@
     public int x, y;                // IN/OUT
     public int width, height;       // OUT
     public int detail;          // IN/OUT
-    public char[] result;           // OUT
+    public String result;           // OUT
     public Object children[];       // [OUT]
 
     //static final long serialVersionUID = 3257281444169529141L;
@@ -59,7 +60,7 @@
  *
  * @return a string representation of the event
  */
-public char[] toString () {
+public String toString () {
     return Format( "AccessibleControlEvent {childID={} accessible={} x={} y={} width={} heigth={} detail={} result={}",
         childID, accessible, x, y, width, height, detail, result);
 }
--- a/dwt/accessibility/AccessibleEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/accessibility/AccessibleEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -15,6 +15,7 @@
 
 import dwt.internal.DWTEventObject;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent as a result of
@@ -45,7 +46,7 @@
      * What to set it to depends on the listener method called, and
      * the childID specified by the client.
      */
-    public char[] result;
+    public String result;
 
     //static final long serialVersionUID = 3257567304224026934L;
 
@@ -64,7 +65,7 @@
  *
  * @return a string representation of the event
  */
-override public char[] toString () {
+override public String toString () {
     return Format( "AccessibleEvent {childID={} result={}}", childID, result );
 }
 }
--- a/dwt/accessibility/AccessibleTextEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/accessibility/AccessibleTextEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -15,6 +15,7 @@
 
 import dwt.internal.DWTEventObject;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent as a result of
@@ -53,7 +54,7 @@
  *
  * @return a string representation of the event
  */
-override public char[] toString () {
+override public String toString () {
     return Format( "AccessibleTextEvent {{childID={} offset={} length={}}",
         childID,
         offset,
--- a/dwt/custom/BidiSegmentEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/BidiSegmentEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -15,6 +15,7 @@
 
 import dwt.events.TypedEvent;
 import dwt.custom.StyledTextEvent;
+import dwt.dwthelper.utils;
 
 /**
  * This event is sent to BidiSegmentListeners when a line is to
@@ -70,7 +71,7 @@
     /**
      * line text
      */
-    public char[] lineText;
+    public String lineText;
 
     /**
      * bidi segments, see above
--- a/dwt/custom/Bullet.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/Bullet.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -16,6 +16,7 @@
 import dwt.custom.StyleRange;
 import dwt.custom.ST;
 import dwt.dwthelper.System;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent bullets in the <code>StyledText</code>.
@@ -38,7 +39,7 @@
 public class Bullet {
     public int type;
     public StyleRange style;
-    public char[] text;
+    public String text;
     int[] linesIndices;
     int count;
 
--- a/dwt/custom/BusyIndicator.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/BusyIndicator.d	Mon May 05 00:12:38 2008 +0200
@@ -27,8 +27,8 @@
 public class BusyIndicator {
 
     static int nextBusyId = 1;
-    static const char[] BUSYID_NAME = "DWT BusyIndicator"; //$NON-NLS-1$
-    static const char[] BUSY_CURSOR = "DWT BusyIndicator Cursor"; //$NON-NLS-1$
+    static const String BUSYID_NAME = "DWT BusyIndicator"; //$NON-NLS-1$
+    static const String BUSY_CURSOR = "DWT BusyIndicator Cursor"; //$NON-NLS-1$
 
 /**
  * Runs the given <code>Runnable</code> while providing
--- a/dwt/custom/CCombo.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/CCombo.d	Mon May 05 00:12:38 2008 +0200
@@ -196,7 +196,7 @@
  *
  * @see #add(String,int)
  */
-public void add (char[] string) {
+public void add (String string) {
     checkWidget();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     list.add (string);
@@ -224,7 +224,7 @@
  *
  * @see #add(String)
  */
-public void add (char[] string, int index) {
+public void add (String string, int index) {
     checkWidget();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     list.add (string, index);
@@ -376,7 +376,7 @@
 public override Point computeSize (int wHint, int hHint, bool changed) {
     checkWidget ();
     int width = 0, height = 0;
-    char[][] items = list.getItems ();
+    String[] items = list.getItems ();
     GC gc = new GC (text);
     int spacer = gc.stringExtent (" ").x; //$NON-NLS-1$
     int textWidth = gc.stringExtent (text.getText ()).x;
@@ -412,7 +412,7 @@
     checkWidget ();
     text.copy ();
 }
-void createPopup(char[][] items, int selectionIndex) {
+void createPopup(String[] items, int selectionIndex) {
     // create shell and list
     popup = new Shell (getShell (), DWT.NO_TRIM | DWT.ON_TOP);
     int style = getStyle ();
@@ -496,7 +496,7 @@
     }
 
     if (getShell() !is popup.getParent ()) {
-        char[][] items = list.getItems ();
+        String[] items = list.getItems ();
         int selectionIndex = list.getSelectionIndex ();
         list.removeListener (DWT.Dispose, listener);
         popup.dispose();
@@ -534,7 +534,7 @@
  * an '&' character in the given string. If there are no '&'
  * characters in the given string, return '\0'.
  */
-dchar _findMnemonic (char[] string) {
+dchar _findMnemonic (String string) {
     if (string is null) return '\0';
     int index = 0;
     int length = string.length;
@@ -602,7 +602,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getItem (int index) {
+public String getItem (int index) {
     checkWidget();
     return list.getItem (index);
 }
@@ -651,7 +651,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] [] getItems () {
+public String [] getItems () {
     checkWidget ();
     return list.getItems ();
 }
@@ -708,7 +708,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     return text.getText ();
 }
@@ -810,7 +810,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int indexOf (char[] string) {
+public int indexOf (String string) {
     checkWidget ();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     return list.indexOf (string);
@@ -834,7 +834,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int indexOf (char[] string, int start) {
+public int indexOf (String string, int start) {
     checkWidget ();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     return list.indexOf (string, start);
@@ -843,7 +843,7 @@
 void initAccessible() {
     AccessibleAdapter accessibleAdapter = new class() AccessibleAdapter {
         public void getName (AccessibleEvent e) {
-            char[] name = null;
+            String name = null;
             Label label = getAssociatedLabel ();
             if (label !is null) {
                 name = stripMnemonic (label.getText());
@@ -851,10 +851,10 @@
             e.result = name;
         }
         public void getKeyboardShortcut(AccessibleEvent e) {
-            char[] shortcut = null;
+            String shortcut = null;
             Label label = getAssociatedLabel ();
             if (label !is null) {
-                char[] text = label.getText ();
+                String text = label.getText ();
                 if (text !is null) {
                     dchar mnemonic = _findMnemonic (text);
                     if (mnemonic !is '\0') {
@@ -964,7 +964,7 @@
     switch (event.type) {
         case DWT.Dispose:
             if (getShell () !is popup.getParent ()) {
-                char[][] items = list.getItems ();
+                String[] items = list.getItems ();
                 int selectionIndex = list.getSelectionIndex ();
                 popup = null;
                 list = null;
@@ -1170,7 +1170,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void remove (char[] string) {
+public void remove (String string) {
     checkWidget();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     list.remove (string);
@@ -1352,7 +1352,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setItem (int index, char[] string) {
+public void setItem (int index, String string) {
     checkWidget();
     list.setItem (index, string);
 }
@@ -1370,7 +1370,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setItems (char[] [] items) {
+public void setItems (String [] items) {
     checkWidget ();
     list.setItems (items);
     if (!text.getEditable ()) text.setText (""); //$NON-NLS-1$
@@ -1440,7 +1440,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     int index = list.indexOf (string);
@@ -1473,7 +1473,7 @@
     text.setTextLimit (limit);
 }
 
-public override void setToolTipText (char[] string) {
+public override void setToolTipText (String string) {
     checkWidget();
     super.setToolTipText(string);
     arrow.setToolTipText (string);
@@ -1507,7 +1507,7 @@
     if (count < 0) return;
     visibleItemCount = count;
 }
-char[] stripMnemonic (char[] string) {
+String stripMnemonic (String string) {
     int index = 0;
     int length_ = string.length;
     do {
--- a/dwt/custom/CLabel.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/CLabel.d	Mon May 05 00:12:38 2008 +0200
@@ -74,13 +74,13 @@
     /** Left and right margins */
     private static const int INDENT = 3;
     /** a string inserted in the middle of text that has been shortened */
-    private static const char[] ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026"
+    private static const String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026"
     /** the alignment. Either CENTER, RIGHT, LEFT. Default is LEFT*/
     private int align_ = DWT.LEFT;
     private int hIndent = INDENT;
     private int vIndent = INDENT;
     /** the current text */
-    private char[] text;
+    private String text;
     /** the current icon */
     private Image image;
     // The tooltip is used for two purposes - the application can set
@@ -88,7 +88,7 @@
     // the text has been truncated due to the label being too short.
     // The appToolTip stores the tooltip set by the application.  Control.tooltiptext
     // contains whatever tooltip is currently being displayed.
-    private char[] appToolTipText;
+    private String appToolTipText;
 
     private Image backgroundImage;
     private Color[] gradientColors;
@@ -209,7 +209,7 @@
  * an '&' character in the given string. If there are no '&'
  * characters in the given string, return '\0'.
  */
-dchar _findMnemonic (char[] string) {
+dchar _findMnemonic (String string) {
     if (string is null) return '\0';
     int index = 0;
     int length = string.length;
@@ -248,7 +248,7 @@
 /**
  * Compute the minimum size.
  */
-private Point getTotalSize(Image image, char[] text) {
+private Point getTotalSize(Image image, String text) {
     Point size = new Point(0, 0);
 
     if (image !is null) {
@@ -286,11 +286,11 @@
  *
  * @return the text of the label or null
  */
-public char[] getText() {
+public String getText() {
     //checkWidget();
     return text;
 }
-public override char[] getToolTipText () {
+public override String getToolTipText () {
     checkWidget();
     return appToolTipText;
 }
@@ -379,7 +379,7 @@
     if (rect.width is 0 || rect.height is 0) return;
 
     bool shortenText_ = false;
-    char[] t = text;
+    String t = text;
     Image img = image;
     int availableWidth = Math.max(0, rect.width - 2*hIndent);
     Point extent = getTotalSize(img, t);
@@ -392,7 +392,7 @@
     }
 
     GC gc = event.gc;
-    char[][] lines = text is null ? null : splitString(text);
+    String[] lines = text is null ? null : splitString(text);
 
     // shorten the text
     if (shortenText_) {
@@ -765,7 +765,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText(char[] text) {
+public void setText(String text) {
     checkWidget();
     if (text is null) text = ""; //$NON-NLS-1$
     if ( text !=/*eq*/ this.text) {
@@ -773,7 +773,7 @@
         redraw();
     }
 }
-public override void setToolTipText (char[] string) {
+public override void setToolTipText (String string) {
     super.setToolTipText (string);
     appToolTipText = super.getToolTipText();
 }
@@ -788,7 +788,7 @@
  * @param width the width to shorten the text to, in pixels
  * @return the shortened text
  */
-protected char[] shortenText(GC gc, char[] t, int width) {
+protected String shortenText(GC gc, String t, int width) {
     if (t is null) return null;
     int w = gc.textExtent(ELLIPSIS, DRAW_FLAGS).x;
     if (width<=w) return t;
@@ -798,8 +798,8 @@
     int mid = (max+min)/2 - 1;
     if (mid <= 0) return t;
     while (min < mid && mid < max) {
-        char[] s1 = t[0 .. mid].dup;
-        char[] s2 = t[l-mid .. l].dup;
+        String s1 = t[0 .. mid].dup;
+        String s2 = t[l-mid .. l].dup;
         int l1 = gc.textExtent(s1, DRAW_FLAGS).x;
         int l2 = gc.textExtent(s2, DRAW_FLAGS).x;
         if (l1+w+l2 > width) {
@@ -816,8 +816,8 @@
     return t[ 0 .. mid ] ~ ELLIPSIS ~ t[ l-mid .. l ];
 }
 
-private char[][] splitString(char[] text) {
-    char[][] lines = new char[][1];
+private String[] splitString(String text) {
+    String[] lines = new String[1];
     int start = 0, pos;
     do {
         pos = tango.text.Util.locate( text, '\n', start);
@@ -827,7 +827,7 @@
             bool crlf = (pos > 0) && (text[ pos - 1 ] is '\r');
             lines[lines.length - 1] = text[ start .. pos - (crlf ? 1 : 0)];
             start = pos + 1;
-            char[][] newLines = new char[][lines.length+1];
+            String[] newLines = new String[lines.length+1];
             System.arraycopy(lines, 0, newLines, 0, lines.length);
             lines = newLines;
         }
--- a/dwt/custom/CTabFolder.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/CTabFolder.d	Mon May 05 00:12:38 2008 +0200
@@ -411,7 +411,7 @@
      * NO_BACKGROUND style.  The NO_BACKGROUND style is not required on platforms
      * that use double buffering which is true in both of these cases.
      */
-    char[] platform = DWT.getPlatform();
+    String platform = DWT.getPlatform();
     if ("carbon"==platform || "gtk"==platform) return style; //$NON-NLS-1$ //$NON-NLS-2$
 
     //TEMPORARY CODE
@@ -879,7 +879,7 @@
         }
         count = items.length - showCount;
     }
-    char[] chevronString = count > 99 ? "99+" : to!(char[])(count); //$NON-NLS-1$
+    String chevronString = count > 99 ? "99+" : to!(String)(count); //$NON-NLS-1$
     switch (chevronImageState) {
         case NORMAL: {
             Color chevronBorder = single ? getSelectionForeground() : getForeground();
@@ -1296,7 +1296,7 @@
  * an '&' character in the given string. If there are no '&'
  * characters in the given string, return '\0'.
  */
-dchar _findMnemonic (char[] string) {
+dchar _findMnemonic (String string) {
     if (string is null) return '\0';
     int index = 0;
     int length_ = string.length;
@@ -1308,7 +1308,7 @@
     } while (index < length_);
     return '\0';
 }
-char[] stripMnemonic (char[] string) {
+String stripMnemonic (String string) {
     int index = 0;
     int length_ = string.length;
     do {
@@ -1641,7 +1641,7 @@
     final Accessible accessible = getAccessible();
     accessible.addAccessibleListener(new class() AccessibleAdapter {
         public void getName(AccessibleEvent e) {
-            char[] name = null;
+            String name = null;
             int childID = e.childID;
             if (childID >= 0 && childID < items.length) {
                 name = stripMnemonic(items[childID].getText());
@@ -1656,7 +1656,7 @@
         }
 
         public void getHelp(AccessibleEvent e) {
-            char[] help = null;
+            String help = null;
             int childID = e.childID;
             if (childID is ACC.CHILDID_SELF) {
                 help = getToolTipText();
@@ -1667,10 +1667,10 @@
         }
 
         public void getKeyboardShortcut(AccessibleEvent e) {
-            char[] shortcut = null;
+            String shortcut = null;
             int childID = e.childID;
             if (childID >= 0 && childID < items.length) {
-                char[] text = items[childID].getText();
+                String text = items[childID].getText();
                 if (text !is null) {
                     dchar mnemonic = _findMnemonic(text);
                     if (mnemonic !is '\0') {
@@ -1738,7 +1738,7 @@
         }
 
         public void getDefaultAction(AccessibleControlEvent e) {
-            char[] action = null;
+            String action = null;
             int childID = e.childID;
             if (childID >= 0 && childID < items.length) {
                 action = DWT.getMessage ("SWT_Switch"); //$NON-NLS-1$
@@ -3868,7 +3868,7 @@
             items[i].dispose();
         }
     }
-    static const char[] id = "CTabFolder_showList_Index"; //$NON-NLS-1$
+    static const String id = "CTabFolder_showList_Index"; //$NON-NLS-1$
     for (int i = 0; i < items.length; i++) {
         CTabItem tab = items[i];
         if (tab.showing) continue;
@@ -3912,8 +3912,8 @@
 }
 
 void _setToolTipText (int x, int y) {
-    char[] oldTip = getToolTipText();
-    char[] newTip = _getToolTip(x, y);
+    String oldTip = getToolTipText();
+    String newTip = _getToolTip(x, y);
     if (newTip is null || newTip!=oldTip) {
         setToolTipText(newTip);
     }
@@ -4045,7 +4045,7 @@
     notifyListeners(DWT.Resize, new Event());
     return true;
 }
-char[] _getToolTip(int x, int y) {
+String _getToolTip(int x, int y) {
     if (showMin && minRect.contains(x, y)) return minimized ? DWT.getMessage("SWT_Restore") : DWT.getMessage("SWT_Minimize"); //$NON-NLS-1$ //$NON-NLS-2$
     if (showMax && maxRect.contains(x, y)) return maximized ? DWT.getMessage("SWT_Restore") : DWT.getMessage("SWT_Maximize"); //$NON-NLS-1$ //$NON-NLS-2$
     if (showChevron && chevronRect.contains(x, y)) return DWT.getMessage("SWT_ShowList"); //$NON-NLS-1$
--- a/dwt/custom/CTabFolderEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/CTabFolderEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -18,6 +18,7 @@
 import dwt.widgets.Widget;
 
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 /**
  *
@@ -81,15 +82,15 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
-    char[] string = super.toString ();
+public override String toString() {
+    String string = super.toString ();
     return string[0.. $ - 1] // remove trailing '}'
-        ~ " item=" ~ to!(char[])(item)
-        ~ " doit=" ~ to!(char[])(doit)
-        ~ " x=" ~ to!(char[])(x)
-        ~ " y=" ~ to!(char[])(y)
-        ~ " width=" ~ to!(char[])(width)
-        ~ " height=" ~ to!(char[])(height)
+        ~ " item=" ~ to!(String)(item)
+        ~ " doit=" ~ to!(String)(doit)
+        ~ " x=" ~ to!(String)(x)
+        ~ " y=" ~ to!(String)(y)
+        ~ " width=" ~ to!(String)(width)
+        ~ " height=" ~ to!(String)(height)
         ~ "}";
 }
 }
--- a/dwt/custom/CTabItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/CTabItem.d	Mon May 05 00:12:38 2008 +0200
@@ -28,6 +28,7 @@
 import dwt.widgets.Item;
 import dwt.widgets.Widget;
 import dwt.custom.CTabFolder;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent a selectable user interface object
@@ -48,8 +49,8 @@
     int x,y,width,height = 0;
     Control control; // the tab page
 
-    char[] toolTipText;
-    char[] shortenedText;
+    String toolTipText;
+    String shortenedText;
     int shortenedTextWidth;
 
     // Appearance
@@ -68,7 +69,7 @@
     static final int RIGHT_MARGIN = 4;
     static final int INTERNAL_SPACING = 4;
     static final int FLAGS = DWT.DRAW_TRANSPARENT | DWT.DRAW_MNEMONIC;
-    static final char[] ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026"
+    static final String ELLIPSIS = "..."; //$NON-NLS-1$ // could use the ellipsis glyph on some platforms "\u2026"
 
 /**
  * Constructs a new instance of this class given its parent
@@ -148,13 +149,13 @@
     return parent.simple;
 }
 
-char[] shortenText(GC gc, char[] text, int width) {
+String shortenText(GC gc, String text, int width) {
     return useEllipses()
         ? shortenText(gc, text, width, ELLIPSIS)
         : shortenText(gc, text, width, ""); //$NON-NLS-1$
 }
 
-char[] shortenText(GC gc, char[] text, int width, char[] ellipses) {
+String shortenText(GC gc, String text, int width, String ellipses) {
     if (gc.textExtent(text, FLAGS).x <= width) return text;
     int ellipseWidth = gc.textExtent(ellipses, FLAGS).x;
     int length = text.length;
@@ -776,10 +777,10 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget();
     if (toolTipText is null && shortenedText !is null) {
-        char[] text = getText();
+        String text = getText();
         if (shortenedText!=text) return text;
     }
     return toolTipText;
@@ -811,7 +812,7 @@
 int preferredHeight(GC gc) {
     Image image = getImage();
     int h = (image is null) ? 0 : image.getBounds().height;
-    char[] text = getText();
+    String text = getText();
     if (font is null) {
         h = Math.max(h, gc.textExtent(text, FLAGS).y);
     } else {
@@ -831,7 +832,7 @@
     if (image !is null && (isSelected || parent.showUnselectedImage)) {
         w += image.getBounds().width;
     }
-    char[] text = null;
+    String text = null;
     if (minimum) {
         int minChars = parent.minChars;
         text = minChars is 0 ? null : getText();
@@ -996,7 +997,7 @@
         parent.redrawTabs();
     }
 }
-public override void setText (char[] string) {
+public override void setText (String string) {
     checkWidget();
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     if (string==getText()) return;
@@ -1019,7 +1020,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setToolTipText (char[] string) {
+public void setToolTipText (String string) {
     checkWidget();
     toolTipText = string;
 }
--- a/dwt/custom/DefaultContent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/DefaultContent.d	Mon May 05 00:12:38 2008 +0200
@@ -29,10 +29,10 @@
 alias tango.text.Text.Text!(char) StringBuffer;
 
 class DefaultContent : StyledTextContent {
-    private final static char[] LineDelimiter = tango.io.FileConst.FileConst.NewlineString;
+    private final static String LineDelimiter = tango.io.FileConst.FileConst.NewlineString;
 
     StyledTextListener[] textListeners; // stores text listeners for event sending
-    char[] textStore; // stores the actual text
+    String textStore; // stores the actual text
     int gapStart = -1;  // the character position start of the gap
     int gapEnd = -1;    // the character position after the end of the gap
     int gapLine = -1;   // the line on which the gap exists, the gap will always be associated with one line
@@ -187,7 +187,7 @@
  * @param newText start offset of text to replace
  * @return a bool specifying whether or not the replace operation is valid
  */
-protected bool isValidReplace(int start, int replaceLength, char[] newText){
+protected bool isValidReplace(int start, int replaceLength, String newText){
     if (replaceLength is 0) {
         // inserting text, see if the \r\n line delimiter is being split
         if (start is 0) return true;
@@ -272,7 +272,7 @@
  * @param position the position at which to insert the text
  * @param text the text to insert
  */
-void insert(int position, char[] text) {
+void insert(int position, String text) {
     if (text.length is 0) return;
 
     int startLine = getLineAtOffset(position);
@@ -454,7 +454,7 @@
  * @param text the text to lineate
  * @return number of lines in the text
  */
-int lineCount(char[] text){
+int lineCount(String text){
     int lineCount_ = 0;
     int length = text.length;
     for (int i = 0; i < length; i++) {
@@ -487,7 +487,7 @@
  *   <li>ERROR_INVALID_ARGUMENT when index is out of range</li>
  * </ul>
  */
-public char[] getLine(int index) {
+public String getLine(int index) {
     if ((index >= lineCount_) || (index < 0)) error(DWT.ERROR_INVALID_ARGUMENT);
     int start = lines[index][0];
     int length_ = lines[index][1];
@@ -520,7 +520,7 @@
  * @return the platform line delimiter as specified in the line.separator
  *  system property.
  */
-public char[] getLineDelimiter() {
+public String getLineDelimiter() {
     return LineDelimiter;
 }
 /**
@@ -529,7 +529,7 @@
  * @param index the index of the line to return
  * @return the logical line text (i.e., without the gap) with delimiters
  */
-char[] getFullLine(int index) {
+String getFullLine(int index) {
     int start = lines[index][0];
     int length_ = lines[index][1];
     int end = start + length_ - 1;
@@ -552,7 +552,7 @@
  * @param index the line index
  * @return the physical line
  */
-char[] getPhysicalLine(int index) {
+String getPhysicalLine(int index) {
     int start = lines[index][0];
     int length_ = lines[index][1];
     return getPhysicalText(start, length_);
@@ -700,7 +700,7 @@
  * @param length the physical length of the text to return
  * @return the text
  */
-char[] getPhysicalText(int start, int length_) {
+String getPhysicalText(int start, int length_) {
     return textStore[ start .. start + length_ ].dup;
 }
 /**
@@ -712,7 +712,7 @@
  * @param length the logical length of the text to return
  * @return the text
  */
-public char[] getTextRange(int start, int length_) {
+public String getTextRange(int start, int length_) {
     if (textStore is null)
         return "";
     if (length_ is 0)
@@ -775,7 +775,7 @@
  *      \r\n delimiter or deleting part of this line delimiter is not supported</li>
  * </ul>
  */
-public void replaceTextRange(int start, int replaceLength, char[] newText){
+public void replaceTextRange(int start, int replaceLength, String newText){
     // check for invalid replace operations
     if (!isValidReplace(start, replaceLength, newText)) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
 
@@ -814,7 +814,7 @@
  *
  * @param text the text
  */
-public void setText (char[] text){
+public void setText (String text){
     textStore = text.dup;
     gapStart = -1;
     gapEnd = -1;
@@ -839,7 +839,7 @@
     int startLineOffset = getOffsetAtLine(startLine);
     int endLine = getLineAtOffset(position + length_);
 
-    char[] endText = "";
+    String endText = "";
     bool splittingDelimiter = false;
     if (position + length_ < getCharCount()) {
         endText = getTextRange(position + length_ - 1, 2);
--- a/dwt/custom/ExtendedModifyEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/ExtendedModifyEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2004 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -14,6 +14,7 @@
 
 import dwt.events.TypedEvent;
 import dwt.custom.StyledTextEvent;
+import dwt.dwthelper.utils;
 
 /**
  * This event is sent after a text change occurs.
@@ -24,7 +25,7 @@
     /** length of the new text */
     public int length;
     /** replaced text or empty string if no text was replaced */
-    public char[] replacedText;
+    public String replacedText;
 
     static final long serialVersionUID = 3258696507027830832L;
 
--- a/dwt/custom/LineBackgroundEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/LineBackgroundEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -16,6 +16,7 @@
 import dwt.events.TypedEvent;
 import dwt.graphics.Color;
 import dwt.custom.StyledTextEvent;
+import dwt.dwthelper.utils;
 
 /**
  * This event is sent when a line is about to be drawn.
@@ -30,7 +31,7 @@
     /**
      * line text
      */
-    public char[] lineText;
+    public String lineText;
 
     /**
      * line background color
--- a/dwt/custom/LineStyleEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/LineStyleEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -16,6 +16,7 @@
 import dwt.custom.StyleRange;
 import dwt.custom.Bullet;
 import dwt.custom.StyledTextEvent;
+import dwt.dwthelper.utils;
 
 /**
  * This event is sent when a line is about to be drawn.
@@ -30,7 +31,7 @@
     /**
      * line text (input)
      */
-    public char[] lineText;
+    public String lineText;
 
     /**
      * line ranges (output)
--- a/dwt/custom/MovementEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/MovementEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -14,6 +14,7 @@
 
 import dwt.events.TypedEvent;
 import dwt.custom.StyledTextEvent;
+import dwt.dwthelper.utils;
 
 /**
  * This event is sent when a new offset is required based on the current
@@ -31,7 +32,7 @@
     /**
      * line text (input)
      */
-    public char[] lineText;
+    public String lineText;
 
     /**
      * the current offset (input)
--- a/dwt/custom/PopupList.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/PopupList.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -29,6 +29,8 @@
 import dwt.widgets.List;
 import dwt.widgets.Listener;
 import dwt.widgets.Shell;
+import dwt.dwthelper.utils;
+
 /**
 * A PopupList is a list of selectable items that appears in its own shell positioned above
 * its parent shell.  It is used for selecting items when editing a Table cell (similar to the
@@ -127,7 +129,7 @@
 *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
 *   </ul>
 */
-public char[][] getItems () {
+public String[] getItems () {
     return list.getItems();
 }
 /**
@@ -146,7 +148,7 @@
 *
 * @return the text of the selected item or null if no item is selected
 */
-public char[] open (Rectangle rect) {
+public String open (Rectangle rect) {
 
     Point listSize = list.computeSize (rect.width, DWT.DEFAULT, false);
     Rectangle screenSize = shell.getDisplay().getBounds();
@@ -194,16 +196,16 @@
         if (!display.readAndDispatch()) display.sleep();
     }
 
-    char[] result = null;
+    String result = null;
     if (!shell.isDisposed ()) {
-        char[] [] strings = list.getSelection ();
+        String [] strings = list.getSelection ();
         shell.dispose();
         if (strings.length !is 0) result = strings [0];
     }
     return result;
 }
 /**
-* Selects an item with text that starts with specified char[].
+* Selects an item with text that starts with specified String.
 * <p>
 * If the item is not currently selected, it is selected.
 * If the item at an index is selected, it remains selected.
@@ -216,8 +218,8 @@
 *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
 *   </ul>
 */
-public void select(char[] string) {
-    char[][] items = list.getItems();
+public void select(String string) {
+    String[] items = list.getItems();
 
     // find the first entry in the list that starts with the
     // specified string
@@ -269,7 +271,7 @@
 *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
 *   </ul>
 */
-public void setItems (char[][] strings) {
+public void setItems (String[] strings) {
     list.setItems(strings);
 }
 /**
--- a/dwt/custom/SashFormData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/SashFormData.d	Mon May 05 00:12:38 2008 +0200
@@ -14,13 +14,14 @@
 
 static import tango.text.Util;
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 class SashFormData {
 
     long weight;
 
-char[] getName () {
-    char[] string = this.classinfo.name;
+String getName () {
+    String string = this.classinfo.name;
     int index = tango.text.Util.locatePrior( string ,'.' );
     if (index is string.length ) return string;
     return string[ index + 1 .. $ ];
@@ -32,7 +33,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString () {
-    return getName()~" {weight="~to!(char[])(weight)~"}"; //$NON-NLS-2$
+public override String toString () {
+    return getName()~" {weight="~to!(String)(weight)~"}"; //$NON-NLS-2$
 }
 }
--- a/dwt/custom/ScrolledComposite.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/ScrolledComposite.d	Mon May 05 00:12:38 2008 +0200
@@ -24,6 +24,7 @@
 import dwt.widgets.Listener;
 import dwt.widgets.ScrollBar;
 import dwt.custom.ScrolledCompositeLayout;
+import dwt.dwthelper.utils;
 
 /**
  * A ScrolledComposite provides scrollbars and will scroll its content when the user
--- a/dwt/custom/StackLayout.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StackLayout.d	Mon May 05 00:12:38 2008 +0200
@@ -129,8 +129,8 @@
     }
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
+String getName () {
+    String string = this.classinfo.name;
     int index = tango.text.Util.locatePrior( string ,'.');
     if (index is string.length ) return string;
     return string[ index + 1 .. $ ];
@@ -142,11 +142,11 @@
  *
  * @return a string representation of the layout
  */
-public override char[] toString () {
-    char[] string = getName ()~" {";
-    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
-    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
-    if (topControl !is null) string ~= "topControl="~to!(char[])(topControl)~" ";
+public override String toString () {
+    String string = getName ()~" {";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(String)(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(String)(marginHeight)~" ";
+    if (topControl !is null) string ~= "topControl="~to!(String)(topControl)~" ";
     string = tango.text.Util.trim(string);
     string ~= "}";
     return string;
--- a/dwt/custom/StyleRange.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StyleRange.d	Mon May 05 00:12:38 2008 +0200
@@ -20,6 +20,7 @@
 import dwt.custom.StyleRange;
 import dwt.custom.TextChangedEvent;
 import dwt.custom.TextChangingEvent;
+import dwt.dwthelper.utils;
 
 static import tango.text.Text;
 alias tango.text.Text.Text!(char) StringBuffer;
@@ -175,7 +176,7 @@
  *
  * @return a string representation of the StyleRange
  */
-public override char[] toString() {
+public override String toString() {
     StringBuffer buffer = new StringBuffer();
     buffer.append("StyleRange {");
     buffer.append(start);
@@ -195,7 +196,7 @@
         default:
             buffer.append("normal");
     }
-    char[] str = super.toString();
+    String str = super.toString();
     int index = tango.text.Util.locate( str, '{');
     if( index is str.length ) index = -1;
     str = str[ index + 1 .. $ ];
--- a/dwt/custom/StyledText.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StyledText.d	Mon May 05 00:12:38 2008 +0200
@@ -148,7 +148,7 @@
     alias Canvas.computeSize computeSize;
 
     static const char TAB = '\t';
-    static const char[] PlatformLineDelimiter = tango.io.FileConst.FileConst.NewlineString;
+    static const String PlatformLineDelimiter = tango.io.FileConst.FileConst.NewlineString;
     static const int BIDI_CARET_WIDTH = 3;
     static const int DEFAULT_WIDTH  = 64;
     static const int DEFAULT_HEIGHT = 64;
@@ -229,7 +229,7 @@
 
     const static bool IS_CARBON, IS_GTK, IS_MOTIF;
     static this(){
-        char[] platform = DWT.getPlatform();
+        String platform = DWT.getPlatform();
         IS_CARBON = ("carbon" == platform);
         IS_GTK    = ("gtk"    == platform);
         IS_MOTIF  = ("motif"  == platform);
@@ -313,7 +313,7 @@
         if (styledText.isListening(LineGetBackground) || (styledText.isBidi() && styledText.isListening(LineGetSegments)) || styledText.isListening(LineGetStyle)) {
             StyledTextContent content = printerRenderer.content;
             for (int i = 0; i < lineCount; i++) {
-                char[] line = content.getLine(i);
+                String line = content.getLine(i);
                 int lineOffset = content.getOffsetAtLine(i);
                 StyledTextEvent event = styledText.getLineBackgroundData(lineOffset, line);
                 if (event !is null && event.lineBackground !is null) {
@@ -601,12 +601,12 @@
      * @param header true = print the header, false = print the footer
      */
     void printDecoration(int page, bool header, TextLayout layout) {
-        char[] text = header ? printOptions.header : printOptions.footer;
+        String text = header ? printOptions.header : printOptions.footer;
         if (text is null) return;
         int lastSegmentIndex = 0;
         for (int i = 0; i < 3; i++) {
             int segmentIndex = tango.text.Util.locatePattern( text, StyledTextPrintOptions.SEPARATOR, lastSegmentIndex);
-            char[] segment;
+            String segment;
             if (segmentIndex is text.length ) {
                 segment = text[ lastSegmentIndex .. $ ].dup;
                 printDecorationSegment(segment, i, page, header, layout);
@@ -628,7 +628,7 @@
      * @param page page number to print, if specified in the decoration segment.
      * @param header true = print the header, false = print the footer
      */
-    void printDecorationSegment(char[] segment, int alignment, int page, bool header, TextLayout layout) {
+    void printDecorationSegment(String segment, int alignment, int page, bool header, TextLayout layout) {
         int pageIndex = tango.text.Util.locatePattern( segment, StyledTextPrintOptions.PAGE_TAG );
         if (pageIndex !is segment.length ) {
             int pageTagLength = StyledTextPrintOptions.PAGE_TAG.length;
@@ -676,7 +676,7 @@
             FontMetrics metrics = layout.getLineMetrics(0);
             printLayout.setAscent(metrics.getAscent() + metrics.getDescent());
             printLayout.setDescent(metrics.getDescent());
-            printLayout.setText( to!(char[])(index) );
+            printLayout.setText( to!(String)(index) );
             int paintX = x - printMargin - printLayout.getBounds().width;
             printLayout.draw(gc, paintX, y);
             printLayout.setAscent(-1);
@@ -689,7 +689,7 @@
      * Starts a print job and prints the pages specified in the constructor.
      */
     public void run() {
-        char[] jobName = printOptions.jobName;
+        String jobName = printOptions.jobName;
         if (jobName is null) {
             jobName = "Printing";
         }
@@ -804,12 +804,12 @@
      * Don't write Unicode RTF on Windows 95/98/ME or NT.
      */
     void setUnicode() {
-//         const char[] Win95 = "windows 95";
-//         const char[] Win98 = "windows 98";
-//         const char[] WinME = "windows me";
-//         const char[] WinNT = "windows nt";
-//         char[] osName = System.getProperty("os.name").toLowerCase();
-//         char[] osVersion = System.getProperty("os.version");
+//         const String Win95 = "windows 95";
+//         const String Win98 = "windows 98";
+//         const String WinME = "windows me";
+//         const String WinNT = "windows nt";
+//         String osName = System.getProperty("os.name").toLowerCase();
+//         String osVersion = System.getProperty("os.version");
 //         int majorVersion = 0;
 //
 //         if (osName.startsWith(WinNT) && osVersion !is null) {
@@ -839,7 +839,7 @@
      * @param start start offset of segment. 0 based.
      * @param end end offset of segment
      */
-    void write(char[] string, int start, int end) {
+    void write(String string, int start, int end) {
         wchar[] wstring = tango.text.convert.Utf.toString16( string[ start .. end ] );
         start = 0;
         end = wstring.length;
@@ -852,7 +852,7 @@
                     write(tango.text.convert.Utf.toString(wstring[start .. index ]));
                 }
                 write("\\u");
-                write( to!(char[])( cast(short)ch ));
+                write( to!(String)( cast(short)ch ));
                 write(' ');                     // control word delimiter
                 start = index + 1;
             } else if (ch is '}' || ch is '{' || ch is '\\') {
@@ -881,8 +881,8 @@
         header.append("{\\rtf1\\ansi");
         // specify code page, necessary for copy to work in bidi
         // systems that don't support Unicode RTF.
-        // PORTING_TODO: char[] cpg = System.getProperty("file.encoding").toLowerCase();
-        char[] cpg = "UTF16";
+        // PORTING_TODO: String cpg = System.getProperty("file.encoding").toLowerCase();
+        String cpg = "UTF16";
         /+
         if (cpg.startsWith("cp") || cpg.startsWith("ms")) {
             cpg = cpg.substring(2, cpg.length());
@@ -934,7 +934,7 @@
      *   <li>ERROR_IO when the writer is closed.</li>
      * </ul>
      */
-    public override void writeLine(char[] line, int lineOffset) {
+    public override void writeLine(String line, int lineOffset) {
         if (isClosed()) {
             DWT.error(DWT.ERROR_IO);
         }
@@ -971,7 +971,7 @@
      *   <li>ERROR_IO when the writer is closed.</li>
      * </ul>
      */
-    public override void writeLineDelimiter(char[] lineDelimiter) {
+    public override void writeLineDelimiter(String lineDelimiter) {
         if (isClosed()) {
             DWT.error(DWT.ERROR_IO);
         }
@@ -996,7 +996,7 @@
      * @param lineBackground line background color to use for formatting.
      *  May be null.
      */
-    void writeStyledLine(char[] line, int lineOffset, int ranges[], StyleRange[] styles, Color lineBackground, int indent, int alignment, bool justify) {
+    void writeStyledLine(String line, int lineOffset, int ranges[], StyleRange[] styles, Color lineBackground, int indent, int alignment, bool justify) {
         int lineLength = line.length;
         int startOffset = getStart();
         int writeOffset = startOffset - lineOffset;
@@ -1174,13 +1174,13 @@
      *
      * @return the string
      */
-    public override char[] toString() {
+    public override String toString() {
         return buffer.toString();
     }
     /**
      * Appends the given string to the data.
      */
-    void write(char[] string) {
+    void write(String string) {
         buffer.append(string);
     }
     /**
@@ -1192,7 +1192,7 @@
      * @param string text to insert
      * @param offset offset in the existing data to insert "string" at.
      */
-    void write(char[] string, int offset) {
+    void write(String string, int offset) {
         if (offset < 0 || offset > buffer.length()) {
             return;
         }
@@ -1223,7 +1223,7 @@
      *   <li>ERROR_IO when the writer is closed.</li>
      * </ul>
      */
-    public void writeLine(char[] line, int lineOffset) {
+    public void writeLine(String line, int lineOffset) {
         if (isClosed_) {
             DWT.error(DWT.ERROR_IO);
         }
@@ -1250,7 +1250,7 @@
      *   <li>ERROR_IO when the writer is closed.</li>
      * </ul>
      */
-    public void writeLineDelimiter(char[] lineDelimiter) {
+    public void writeLineDelimiter(String lineDelimiter) {
         if (isClosed_) {
             DWT.error(DWT.ERROR_IO);
         }
@@ -1567,7 +1567,7 @@
  * Appends a string to the text at the end of the widget.
  *
  * @param string the string to be appended
- * @see #replaceTextRange(int,int,char[])
+ * @see #replaceTextRange(int,int,String)
  * @exception DWTException <ul>
  *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
@@ -1576,7 +1576,7 @@
  *    <li>ERROR_NULL_ARGUMENT when listener is null</li>
  * </ul>
  */
-public void append(char[] string) {
+public void append(String string) {
     checkWidget();
     if (string is null) {
         DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -1891,7 +1891,7 @@
  *  specified by the model. Returns only the first line if the widget
  *  has the DWT.SINGLE style.
  */
-char[] getModelDelimitedText(char[] text) {
+String getModelDelimitedText(String text) {
     int length = text.length;
     if (length is 0) {
         return text;
@@ -1900,7 +1900,7 @@
     int lfIndex = 0;
     int i = 0;
     StringBuffer convertedText = new StringBuffer(length);
-    char[] delimiter = getLineDelimiter();
+    String delimiter = getLineDelimiter();
     while (i < length) {
         if (crIndex !is -1) {
             crIndex = tango.text.Util.locate( text, DWT.CR, i);
@@ -2255,7 +2255,7 @@
         // tab character (tabs are always inserted without overwriting)?
         int lineIndex = content.getLineAtOffset(event.end);
         int lineOffset = content.getOffsetAtLine(lineIndex);
-        char[] line = content.getLine(lineIndex);
+        String line = content.getLine(lineIndex);
         // replace character at caret offset if the caret is not at the
         // end of the line
         if (event.end < lineOffset + line.length) {
@@ -3246,7 +3246,7 @@
 }
 Rectangle getBoundsAtOffset(int offset) {
     int lineIndex = content.getLineAtOffset(offset);
-    char[] line = content.getLine(lineIndex);
+    String line = content.getLine(lineIndex);
     Rectangle bounds;
     if (line.length !is 0) {
         int offsetInLine = offset - content.getOffsetAtLine(lineIndex);
@@ -3574,7 +3574,7 @@
  * @param line line to get line background data for
  * @return line background data for the given line.
  */
-StyledTextEvent getLineBackgroundData(int lineOffset, char[] line) {
+StyledTextEvent getLineBackgroundData(int lineOffset, String line) {
     return sendLineEvent(LineGetBackground, lineOffset, line);
 }
 /**
@@ -3615,7 +3615,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getLineDelimiter() {
+public String getLineDelimiter() {
     checkWidget();
     return content.getLineDelimiter();
 }
@@ -3753,7 +3753,7 @@
  * @return line style data for the given line. Styles may start before
  *  line start and end after line end
  */
-StyledTextEvent getLineStyleData(int lineOffset, char[] line) {
+StyledTextEvent getLineStyleData(int lineOffset, String line) {
     return sendLineEvent(LineGetStyle, lineOffset, line);
 }
 /**
@@ -3915,7 +3915,7 @@
     int x = point.x + horizontalScrollOffset - leftMargin ;
     int y = point.y - getLinePixel(lineIndex);
     int offsetInLine = layout.getOffset(x, y, trailing);
-    char[] line = content.getLine(lineIndex);
+    String line = content.getLine(lineIndex);
     if (offsetInLine !is line.length - 1) {
         offsetInLine = Math.min(line.length, offsetInLine + trailing[0]);
     }
@@ -3953,7 +3953,7 @@
             offsetInLine += trailing[0];
             caretAlignment = PREVIOUS_OFFSET_TRAILING;
         } else {
-            char[] line = content.getLine(lineIndex);
+            String line = content.getLine(lineIndex);
             int level;
             int offset = offsetInLine;
             while (offset > 0 && tango.text.Unicode.isDigit(line[offset])) offset--;
@@ -4023,11 +4023,11 @@
  * @return the content in the specified range using the platform line
  *  delimiter to separate lines as written by the specified TextWriter.
  */
-char[] getPlatformDelimitedText(TextWriter writer) {
+String getPlatformDelimitedText(TextWriter writer) {
     int end = writer.getStart() + writer.getCharCount();
     int startLine = content.getLineAtOffset(writer.getStart());
     int endLine = content.getLineAtOffset(end);
-    char[] endLineText = content.getLine(endLine);
+    String endLineText = content.getLine(endLine);
     int endLineOffset = content.getOffsetAtLine(endLine);
 
     for (int i = startLine; i <= endLine; i++) {
@@ -4216,7 +4216,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getSelectionText() {
+public String getSelectionText() {
     checkWidget();
     return content.getTextRange(selection.x, selection.y - selection.x);
 }
@@ -4248,7 +4248,7 @@
  *      exceed the line length or have duplicates</li>
  * </ul>
  */
-int [] getBidiSegments(int lineOffset, char[] line) {
+int [] getBidiSegments(int lineOffset, String line) {
     if (!isBidi()) return null;
     if (!isListening(LineGetSegments)) {
         return getBidiSegmentsCompatibility(line, lineOffset);
@@ -4285,7 +4285,7 @@
  * @see #getBidiSegments
  * Supports deprecated setBidiColoring API. Remove when API is removed.
  */
-int [] getBidiSegmentsCompatibility(char[] line, int lineOffset) {
+int [] getBidiSegmentsCompatibility(String line, int lineOffset) {
     int lineLength = line.length;
     if (!bidiColoring) {
         return [0, lineLength];
@@ -4539,14 +4539,14 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText() {
+public String getText() {
     checkWidget();
     return content.getTextRange(0, getCharCount());
 }
 /**
  * Returns the widget content between the two offsets.
  *
- * @param start offset of the first character in the returned char[]
+ * @param start offset of the first character in the returned String
  * @param end offset of the last character in the returned String
  * @return widget content starting at start and ending at end
  * @see #getTextRange(int,int)
@@ -4558,7 +4558,7 @@
  *   <li>ERROR_INVALID_RANGE when start and/or end are outside the widget content</li>
  * </ul>
  */
-public char[] getText(int start, int end) {
+public String getText(int start, int end) {
     checkWidget();
     int contentLength = getCharCount();
     if (start < 0 || start >= contentLength || end < 0 || end >= contentLength || start > end) {
@@ -4600,7 +4600,7 @@
             if (i is lineStart && i is lineEnd) {
                 rect = layout.getBounds(start - lineOffset, end - lineOffset);
             } else if (i is lineStart) {
-                char[] line = content.getLine(i);
+                String line = content.getLine(i);
                 rect = layout.getBounds(start - lineOffset, line.length);
             } else if (i is lineEnd) {
                 rect = layout.getBounds(0, end - lineOffset);
@@ -4633,7 +4633,7 @@
  *   <li>ERROR_INVALID_RANGE when start and/or length are outside the widget content</li>
  * </ul>
  */
-public char[] getTextRange(int start, int length) {
+public String getTextRange(int start, int length) {
     checkWidget();
     int contentLength = getCharCount();
     int end = start + length;
@@ -4730,7 +4730,7 @@
     updateCaretDirection = false;
     int caretLine = getCaretLine();
     int lineOffset = content.getOffsetAtLine(caretLine);
-    char[] line = content.getLine(caretLine);
+    String line = content.getLine(caretLine);
     int offset = caretOffset - lineOffset;
     int lineLength = line.length;
     if (lineLength is 0) return isMirrored() ? DWT.RIGHT : DWT.LEFT;
@@ -4760,7 +4760,7 @@
 }
 int getWordNext (int offset, int movement) {
     int newOffset, lineOffset;
-    char[] lineText;
+    String lineText;
     if (offset >= getCharCount()) {
         newOffset = offset;
         int lineIndex = content.getLineCount() - 1;
@@ -4783,7 +4783,7 @@
 }
 int getWordPrevious(int offset, int movement) {
     int newOffset, lineOffset;
-    char[] lineText;
+    String lineText;
     if (offset <= 0) {
         newOffset = 0;
         int lineIndex = content.getLineAtOffset(newOffset);
@@ -4794,7 +4794,7 @@
         lineOffset = content.getOffsetAtLine(lineIndex);
         lineText = content.getLine(lineIndex);
         if (offset is lineOffset) {
-            char[] nextLineText = content.getLine(lineIndex - 1);
+            String nextLineText = content.getLine(lineIndex - 1);
             int nextLineOffset = content.getOffsetAtLine(lineIndex - 1);
             newOffset = nextLineOffset + nextLineText.length;
         } else {
@@ -4825,7 +4825,7 @@
  */
 Point getPointAtOffset(int offset) {
     int lineIndex = content.getLineAtOffset(offset);
-    char[] line = content.getLine(lineIndex);
+    String line = content.getLine(lineIndex);
     int lineOffset = content.getOffsetAtLine(lineIndex);
     int offsetInLine = offset - lineOffset;
     int lineLength = line.length;
@@ -4867,7 +4867,7 @@
  * Inserts a string.  The old selection is replaced with the new text.
  *
  * @param string the string
- * @see #replaceTextRange(int,int,char[])
+ * @see #replaceTextRange(int,int,String)
  * @exception DWTException <ul>
  *    <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li>
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
@@ -4876,7 +4876,7 @@
  *    <li>ERROR_NULL_ARGUMENT when string is null</li>
  * </ul>
  */
-public void insert(char[] string) {
+public void insert(String string) {
     checkWidget();
     if (string is null) {
         DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -5210,7 +5210,7 @@
     //paste clipboard selection
     if (event.button is 2) {
         auto o = cast(ArrayWrapperString)getClipboardContent(DND.SELECTION_CLIPBOARD);
-        char[] text = o.array;
+        String text = o.array;
         if (text !is null && text.length > 0) {
             // position cursor
             doMouseLocationChange(event.x, event.y, false);
@@ -5526,7 +5526,7 @@
     final Accessible accessible = getAccessible();
     accessible.addAccessibleListener(new class() AccessibleAdapter {
         public void getName (AccessibleEvent e) {
-            char[] name = null;
+            String name = null;
             Label label = getAssociatedLabel ();
             if (label !is null) {
                 name = stripMnemonic (label.getText());
@@ -5537,10 +5537,10 @@
             e.result = getToolTipText();
         }
         public void getKeyboardShortcut(AccessibleEvent e) {
-            char[] shortcut = null;
+            String shortcut = null;
             Label label = getAssociatedLabel ();
             if (label !is null) {
-                char[] text = label.getText ();
+                String text = label.getText ();
                 if (text !is null) {
                     dchar mnemonic = _findMnemonic (text);
                     if (mnemonic !is '\0') {
@@ -5600,7 +5600,7 @@
     }
     return null;
 }
-char[] stripMnemonic (char[] string) {
+String stripMnemonic (String string) {
     int index = 0;
     int length_ = string.length;
     do {
@@ -5618,7 +5618,7 @@
  * an '&' character in the given string. If there are no '&'
  * characters in the given string, return '\0'.
  */
-dchar _findMnemonic (char[] string) {
+dchar _findMnemonic (String string) {
     if (string is null) return '\0';
     int index = 0;
     int length_ = string.length;
@@ -5918,7 +5918,7 @@
  */
 public void paste(){
     checkWidget();
-    char[] text = (cast(ArrayWrapperString) getClipboardContent(DND.CLIPBOARD)).array;
+    String text = (cast(ArrayWrapperString) getClipboardContent(DND.CLIPBOARD)).array;
     if (text !is null && text.length > 0) {
         Event event = new Event();
         event.start = selection.x;
@@ -6395,7 +6395,7 @@
  *   <li>ERROR_NULL_ARGUMENT when string is null</li>
  * </ul>
  */
-public void replaceTextRange(int start, int length, char[] text) {
+public void replaceTextRange(int start, int length, String text) {
     checkWidget();
     if (text is null) {
         DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -6638,7 +6638,7 @@
  * @return StyledTextEvent that can be used to request line data
  *  for the given line.
  */
-StyledTextEvent sendLineEvent(int eventType, int lineOffset, char[] line) {
+StyledTextEvent sendLineEvent(int eventType, int lineOffset, String line) {
     StyledTextEvent event = null;
     if (isListening(eventType)) {
         event = new StyledTextEvent(content);
@@ -6675,7 +6675,7 @@
     event.y = selection.y;
     notifyListeners(DWT.Selection, event);
 }
-int sendWordBoundaryEvent(int eventType, int movement, int offset, int newOffset, char[] lineText, int lineOffset) {
+int sendWordBoundaryEvent(int eventType, int movement, int offset, int newOffset, String lineText, int lineOffset) {
     if (isListening(eventType)) {
         StyledTextEvent event = new StyledTextEvent(content);
         event.detail = lineOffset;
@@ -6874,7 +6874,7 @@
     if (clipboardType is DND.SELECTION_CLIPBOARD && !(IS_MOTIF || IS_GTK)) return;
     TextTransfer plainTextTransfer = TextTransfer.getInstance();
     TextWriter plainTextWriter = new TextWriter(start, length);
-    char[] plainText = getPlatformDelimitedText(plainTextWriter);
+    String plainText = getPlatformDelimitedText(plainTextWriter);
     Object[] data;
     Transfer[] types;
     if (clipboardType is DND.SELECTION_CLIPBOARD) {
@@ -6883,7 +6883,7 @@
     } else {
         RTFTransfer rtfTransfer = RTFTransfer.getInstance();
         RTFWriter rtfWriter = new RTFWriter(start, length);
-        char[] rtfText = getPlatformDelimitedText(rtfWriter);
+        String rtfText = getPlatformDelimitedText(rtfWriter);
         data = [ cast(Object) new ArrayWrapperString(rtfText), new ArrayWrapperString(plainText) ];
         types = [ cast(Transfer)rtfTransfer, plainTextTransfer];
     }
@@ -8034,7 +8034,7 @@
  *    <li>ERROR_NULL_ARGUMENT when string is null</li>
  * </ul>
  */
-public void setText(char[] text) {
+public void setText(String text) {
     checkWidget();
     if (text is null) {
         DWT.error(DWT.ERROR_NULL_ARGUMENT);
--- a/dwt/custom/StyledTextContent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StyledTextContent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -13,6 +13,8 @@
 module dwt.custom.StyledTextContent;
 
 import dwt.custom.TextChangeListener;
+import dwt.dwthelper.utils;
+
 /**
  * Clients may implement the StyledTextContent interface to provide a
  * custom store for the StyledText widget content. The StyledText widget
@@ -53,7 +55,7 @@
  *  content.
  * @return the line text without delimiters
  */
-public char[] getLine(int lineIndex);
+public String getLine(int lineIndex);
 
 /**
  * Return the line index at the given character offset.
@@ -103,7 +105,7 @@
  * @return the line delimiter that should be used by the StyledText widget
  *  when inserting new lines.
  */
-public char[] getLineDelimiter();
+public String getLineDelimiter();
 
 /**
  * Return the character offset of the first character of the given line.
@@ -134,7 +136,7 @@
  * @param length the length of the text to return
  * @return the text at the given range
  */
-public char[] getTextRange(int start, int length);
+public String getTextRange(int start, int length);
 
 /**
  * Remove the specified text changed listener.
@@ -192,7 +194,7 @@
  * @param text text to replace
  * @see TextChangeListener
  */
-public void replaceTextRange(int start, int replaceLength, char[] text);
+public void replaceTextRange(int start, int replaceLength, String text);
 
 /**
  * Set text to "text".
@@ -204,5 +206,5 @@
  * @param text the new text
  * @see TextChangeListener
  */
-public void setText(char[] text);
+public void setText(String text);
 }
--- a/dwt/custom/StyledTextEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StyledTextEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -18,6 +18,7 @@
 import dwt.custom.StyleRange;
 import dwt.custom.Bullet;
 import dwt.custom.StyledTextContent;
+import dwt.dwthelper.utils;
 
 /**
  *
--- a/dwt/custom/StyledTextPrintOptions.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StyledTextPrintOptions.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -12,6 +12,8 @@
  *******************************************************************************/
 module dwt.custom.StyledTextPrintOptions;
 
+import dwt.dwthelper.utils;
+
 /**
  * Use StyledTextPrintOptions to specify printing options for the
  * StyledText.print(Printer, StyledTextPrintOptions) API.
@@ -36,12 +38,12 @@
      * Page number placeholder constant for use in <code>header</code>
      * and <code>footer</code>. Value is <code>&lt;page&gt;</code>
      */
-    public static final char[] PAGE_TAG = "<page>";
+    public static final String PAGE_TAG = "<page>";
     /**
      * Separator constant for use in <code>header</code> and
      * <code>footer</code>. Value is <code>\t</code>
      */
-    public static final char[] SEPARATOR = "\t";
+    public static final String SEPARATOR = "\t";
     /**
      * Formatted text to print in the header of each page.
      * <p>"left '\t' center '\t' right"</p>
@@ -52,7 +54,7 @@
      * left aligned, centered and right aligned. They are separated by a tab
      * character (<code>StyledTextPrintOptions.SEPARATOR</code>).
      */
-    public char[] header = null;
+    public String header = null;
     /**
      * Formatted text to print in the footer of each page.
      * <p>"left '\t' center '\t' right"</p>
@@ -63,11 +65,11 @@
      * left aligned, centered and right aligned. They are separated by a tab
      * character (<code>StyledTextPrintOptions.SEPARATOR</code>).
      */
-    public char[] footer = null;
+    public String footer = null;
     /**
      * Name of the print job.
      */
-    public char[] jobName = null;
+    public String jobName = null;
 
     /**
      * Print the text foreground color. Default value is <code>false</code>.
--- a/dwt/custom/StyledTextRenderer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/StyledTextRenderer.d	Mon May 05 00:12:38 2008 +0200
@@ -359,11 +359,11 @@
     }
     Font font = style.font;
     if (font !is null) gc.setFont(font);
-    char[] string = "";
+    String string = "";
     int type = bullet.type & (ST.BULLET_DOT|ST.BULLET_NUMBER|ST.BULLET_LETTER_LOWER|ST.BULLET_LETTER_UPPER);
     switch (type) {
         case ST.BULLET_DOT: string = "\u2022"; break;
-        case ST.BULLET_NUMBER: string = to!(char[])(index); break;
+        case ST.BULLET_NUMBER: string = to!(String)(index); break;
         case ST.BULLET_LETTER_LOWER: string = [cast(char) (index % 26 + 97)]; break;
         case ST.BULLET_LETTER_UPPER: string = [cast(char) (index % 26 + 65)]; break;
         default:
@@ -384,7 +384,7 @@
 }
 int drawLine(int lineIndex, int paintX, int paintY, GC gc, Color widgetBackground, Color widgetForeground) {
     TextLayout layout = getTextLayout(lineIndex);
-    char[] line = content.getLine(lineIndex);
+    String line = content.getLine(lineIndex);
     int lineOffset = content.getOffsetAtLine(lineIndex);
     int lineLength = line.length;
     Point selection = styledText.getSelection();
@@ -731,7 +731,7 @@
         }
     }
     if (layout is null) layout = new TextLayout(device);
-    char[] line = content.getLine(lineIndex);
+    String line = content.getLine(lineIndex);
     int lineOffset = content.getOffsetAtLine(lineIndex);
     int[] segments = null;
     int indent = 0;
--- a/dwt/custom/TableCursor.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/TableCursor.d	Mon May 05 00:12:38 2008 +0200
@@ -438,12 +438,12 @@
         gc.drawImage(image, x, imageY);
         x += imageSize.width;
     }
-    char[] text = row.getText(columnIndex);
+    String text = row.getText(columnIndex);
     if (text.length > 0) {
         Rectangle bounds = row.getBounds(columnIndex);
         Point extent = gc.stringExtent(text);
         // Temporary code - need a better way to determine table trim
-        char[] platform = DWT.getPlatform();
+        String platform = DWT.getPlatform();
         if ("win32"==platform) { //$NON-NLS-1$
             if (table.getColumnCount() is 0 || columnIndex is 0) {
                 x += 2;
--- a/dwt/custom/TableEditor.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/TableEditor.d	Mon May 05 00:12:38 2008 +0200
@@ -41,7 +41,7 @@
 *   TableColumn column2 = new TableColumn(table, DWT.NONE);
 *   for (int i = 0; i &lt; 10; i++) {
 *       TableItem item = new TableItem(table, DWT.NONE);
-*       item.setText(new char[][] {"item " + i, "edit this value"});
+*       item.setText(new String[] {"item " + i, "edit this value"});
 *   }
 *   column1.pack();
 *   column2.pack();
--- a/dwt/custom/TableTree.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/TableTree.d	Mon May 05 00:12:38 2008 +0200
@@ -85,9 +85,9 @@
     bool inDispose = false;
 
     static final TableTreeItem[] EMPTY_ITEMS;
-    static final char[][] EMPTY_TEXTS;
+    static final String[] EMPTY_TEXTS;
     static final Image[] EMPTY_IMAGES;
-    static final char[] ITEMID = "TableTreeItemID"; //$NON-NLS-1$
+    static final String ITEMID = "TableTreeItemID"; //$NON-NLS-1$
 
 /**
  * Constructs a new instance of this class given its parent
@@ -791,7 +791,7 @@
     }
     table.setSelection(tableItems);
 }
-public override void setToolTipText (char[] string) {
+public override void setToolTipText (String string) {
     super.setToolTipText(string);
     table.setToolTipText(string);
 }
--- a/dwt/custom/TableTreeItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/TableTreeItem.d	Mon May 05 00:12:38 2008 +0200
@@ -42,7 +42,7 @@
     TableTree parent;
     TableTreeItem parentItem;
     TableTreeItem [] items;
-    char[][] texts;
+    String[] texts;
     Image[] images;
     Color background;
     Color foreground;
@@ -488,7 +488,7 @@
     //checkWidget();
     return parentItem;
 }
-public override char[] getText () {
+public override String getText () {
     checkWidget();
     return getText(0);
 }
@@ -505,7 +505,7 @@
  * @param index the index of the item
  * @return the item text at the specified index, which can be null
  */
-public char[] getText(int index) {
+public String getText(int index) {
     //checkWidget();
     if (0 <= index && index < texts.length) return texts[index];
     return null;
@@ -827,20 +827,20 @@
  *      <li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li>
  *  </ul>
  */
-public void setText(int index, char[] text) {
+public void setText(int index, String text) {
     checkWidget();
     if (text is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     int columnCount = Math.max(parent.getTable().getColumnCount(), 1);
     if (index < 0 || index >= columnCount) return;
     if (texts.length < columnCount) {
-        char[][] newTexts = new char[][columnCount];
+        String[] newTexts = new String[columnCount];
         System.arraycopy(texts, 0, newTexts, 0, texts.length);
         texts = newTexts;
     }
     texts[index] = text;
     if (tableItem !is null) tableItem.setText(index, text);
 }
-public override void setText (char[] string) {
+public override void setText (String string) {
     setText(0, string);
 }
 
--- a/dwt/custom/TextChangingEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/TextChangingEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2004 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -16,6 +16,7 @@
 import dwt.events.TypedEvent;
 import dwt.custom.StyledTextContent;
 import dwt.custom.StyledTextEvent;
+import dwt.dwthelper.utils;
 
 /**
  * This event is sent by the StyledTextContent implementor when a change
@@ -30,7 +31,7 @@
      * Text that is going to be inserted or empty string
      * if no text will be inserted
      */
-    public char[] newText;
+    public String newText;
     /**
      * Length of text that is going to be replaced
      */
--- a/dwt/custom/ViewForm.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/custom/ViewForm.d	Mon May 05 00:12:38 2008 +0200
@@ -27,6 +27,7 @@
 import dwt.widgets.Layout;
 import dwt.widgets.Listener;
 import dwt.custom.ViewFormLayout;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class implement a Composite that positions and sizes
--- a/dwt/dnd/Clipboard.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/Clipboard.d	Mon May 05 00:12:38 2008 +0200
@@ -108,8 +108,8 @@
  * </ul>
  */
 protected void checkSubclass () {
-    char[] name = this.classinfo.name;
-    char[] validName = Clipboard.classinfo.name;
+    String name = this.classinfo.name;
+    String validName = Clipboard.classinfo.name;
     if (validName!=/*eq*/name) {
         DND.error (DWT.ERROR_INVALID_SUBCLASS);
     }
@@ -721,10 +721,10 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[][] getAvailableTypeNames() {
+public String[] getAvailableTypeNames() {
     checkWidget();
     FORMATETC*[] types = _getAvailableTypes();
-    char[][] names = new char[][](types.length);
+    String[] names = new String[](types.length);
     int maxSize = 128;
     for (int i = 0; i < types.length; i++){
         TCHAR[] buffer = NewTCHARs(0, maxSize);
--- a/dwt/dnd/DND.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/DND.d	Mon May 05 00:12:38 2008 +0200
@@ -18,6 +18,7 @@
 import dwt.DWTException;
 
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 /**
  *
@@ -200,10 +201,10 @@
     public static const int ERROR_INVALID_DATA = 2003;
 
 
-    static const char[] INIT_DRAG_MESSAGE = "Cannot initialize Drag"; //$NON-NLS-1$
-    static const char[] INIT_DROP_MESSAGE = "Cannot initialize Drop"; //$NON-NLS-1$
-    static const char[] CANNOT_SET_CLIPBOARD_MESSAGE = "Cannot set data in clipboard"; //$NON-NLS-1$
-    static const char[] INVALID_DATA_MESSAGE = "Data does not have correct format for type"; //$NON-NLS-1$
+    static const String INIT_DRAG_MESSAGE = "Cannot initialize Drag"; //$NON-NLS-1$
+    static const String INIT_DROP_MESSAGE = "Cannot initialize Drop"; //$NON-NLS-1$
+    static const String CANNOT_SET_CLIPBOARD_MESSAGE = "Cannot set data in clipboard"; //$NON-NLS-1$
+    static const String INVALID_DATA_MESSAGE = "Data does not have correct format for type"; //$NON-NLS-1$
 
 /**
  * Throws an appropriate exception based on the passed in error code.
@@ -243,23 +244,23 @@
     switch (code) {
         /* OS Failure/Limit (fatal, may occur only on some platforms) */
         case DND.ERROR_CANNOT_INIT_DRAG:{
-            char[] msg = DND.INIT_DRAG_MESSAGE;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult); //$NON-NLS-1$
+            String msg = DND.INIT_DRAG_MESSAGE;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult); //$NON-NLS-1$
             throw new DWTError (code, msg);
         }
         case DND.ERROR_CANNOT_INIT_DROP:{
-            char[] msg = DND.INIT_DROP_MESSAGE;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult); //$NON-NLS-1$
+            String msg = DND.INIT_DROP_MESSAGE;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult); //$NON-NLS-1$
             throw new DWTError (code, msg);
         }
         case DND.ERROR_CANNOT_SET_CLIPBOARD:{
-            char[] msg = DND.CANNOT_SET_CLIPBOARD_MESSAGE;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult); //$NON-NLS-1$
+            String msg = DND.CANNOT_SET_CLIPBOARD_MESSAGE;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult); //$NON-NLS-1$
             throw new DWTError (code, msg);
         }
         case DND.ERROR_INVALID_DATA:{
-            char[] msg = DND.INVALID_DATA_MESSAGE;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult); //$NON-NLS-1$
+            String msg = DND.INVALID_DATA_MESSAGE;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult); //$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         default:
--- a/dwt/dnd/DragSource.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/DragSource.d	Mon May 05 00:12:38 2008 +0200
@@ -141,8 +141,8 @@
     //workaround - track the operation performed by the drop target for DragEnd event
     int dataEffect = DND.DROP_NONE;
 
-    static const char[] DEFAULT_DRAG_SOURCE_EFFECT = "DEFAULT_DRAG_SOURCE_EFFECT"; //$NON-NLS-1$
-    static const char[] DRAGSOURCEID = "DragSource"; //$NON-NLS-1$
+    static const String DEFAULT_DRAG_SOURCE_EFFECT = "DEFAULT_DRAG_SOURCE_EFFECT"; //$NON-NLS-1$
+    static const String DRAGSOURCEID = "DragSource"; //$NON-NLS-1$
     static const int CFSTR_PERFORMEDDROPEFFECT;
     static final TCHAR[] WindowClass = "#32770\0";
     static this(){
@@ -275,8 +275,8 @@
 }
 
 protected void checkSubclass() {
-    char[] name = this.classinfo.name;
-    char[] validName = DragSource.classinfo.name;
+    String name = this.classinfo.name;
+    String validName = DragSource.classinfo.name;
     if (validName!=/*eq*/name) {
         DND.error(DWT.ERROR_INVALID_SUBCLASS);
     }
@@ -300,7 +300,7 @@
     uint[1] pdwEffect;
     int operations = opToOs(getStyle());
     Display display = control.getDisplay();
-    char[] key = "dwt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
+    String key = "dwt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
     Object oldValue = display.getData(key);
     display.setData(key, new ValueWrapperBool(true));
     ImageList imagelist = null;
--- a/dwt/dnd/DropTarget.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/DropTarget.d	Mon May 05 00:12:38 2008 +0200
@@ -114,8 +114,8 @@
     _IDropTargetImpl iDropTarget;
     int refCount;
 
-    static final char[] DEFAULT_DROP_TARGET_EFFECT = "DEFAULT_DROP_TARGET_EFFECT"; //$NON-NLS-1$
-    static final char[] DROPTARGETID = "DropTarget"; //$NON-NLS-1$
+    static final String DEFAULT_DROP_TARGET_EFFECT = "DEFAULT_DROP_TARGET_EFFECT"; //$NON-NLS-1$
+    static final String DROPTARGETID = "DropTarget"; //$NON-NLS-1$
 
 /**
  * Creates a new <code>DropTarget</code> to allow data to be dropped on the specified
@@ -243,8 +243,8 @@
 }
 
 protected void checkSubclass () {
-    char[] name = this.classinfo.name;
-    char[] validName = DropTarget.classinfo.name;
+    String name = this.classinfo.name;
+    String validName = DropTarget.classinfo.name;
     if (validName!=/*eq*/name) {
         DND.error (DWT.ERROR_INVALID_SUBCLASS);
     }
--- a/dwt/dnd/DropTargetListener.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/DropTargetListener.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2003 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -14,6 +14,7 @@
 
 import dwt.internal.DWTEventListener;
 import dwt.dnd.DropTargetEvent;
+import dwt.dwthelper.utils;
 
 /**
  * The <code>DropTargetListener</code> class provides event notification to the application
--- a/dwt/dnd/FileTransfer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/FileTransfer.d	Mon May 05 00:12:38 2008 +0200
@@ -46,9 +46,9 @@
 public class FileTransfer : ByteArrayTransfer {
 
     private static FileTransfer _instance;
-    private static final char[] CF_HDROP = "CF_HDROP "; //$NON-NLS-1$
+    private static final String CF_HDROP = "CF_HDROP "; //$NON-NLS-1$
     private static final int CF_HDROPID = COM.CF_HDROP;
-    private static final char[] CF_HDROP_SEPARATOR = "\0"; //$NON-NLS-1$
+    private static final String CF_HDROP_SEPARATOR = "\0"; //$NON-NLS-1$
 
 private this() {}
 
@@ -84,7 +84,7 @@
     if (!checkFile(object) || !isSupportedType(transferData)) {
         DND.error(DND.ERROR_INVALID_DATA);
     }
-    char[][] fileNames;
+    String[] fileNames;
     if( auto strs = cast(ArrayWrapperString2) object ){
         fileNames = strs.array;
     }
@@ -142,7 +142,7 @@
     if (transferData.result !is COM.S_OK) return null;
     // How many files are there?
     int count = OS.DragQueryFile(stgmedium.unionField, 0xFFFFFFFF, null, 0);
-    char[][] fileNames = new char[][](count);
+    String[] fileNames = new String[](count);
     for (int i = 0; i < count; i++) {
         // How long is the name ?
         int size = OS.DragQueryFile(stgmedium.unionField, i, null, 0) + 1;
@@ -159,11 +159,11 @@
     return [CF_HDROPID];
 }
 
-protected char[][] getTypeNames(){
+protected String[] getTypeNames(){
     return [CF_HDROP];
 }
 bool checkFile(Object object) {
-    char[][] strings;
+    String[] strings;
     if( auto strs = cast(ArrayWrapperString2)object ){
         strings = strs.array;
     }
--- a/dwt/dnd/HTMLTransfer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/HTMLTransfer.d	Mon May 05 00:12:38 2008 +0200
@@ -40,14 +40,14 @@
 public class HTMLTransfer : ByteArrayTransfer {
 
     static HTMLTransfer _instance;
-    static const char[] HTML_FORMAT = "HTML Format"; //$NON-NLS-1$
+    static const String HTML_FORMAT = "HTML Format"; //$NON-NLS-1$
     static const int HTML_FORMATID;
-    static const char[] NUMBER = "00000000"; //$NON-NLS-1$
-    static const char[] HEADER = "Version:0.9\r\nStartHTML:"~NUMBER~"\r\nEndHTML:"~NUMBER~"\r\nStartFragment:"~NUMBER~"\r\nEndFragment:"~NUMBER~"\r\n";
-    static const char[] PREFIX = "<html><body><!--StartFragment-->"; //$NON-NLS-1$
-    static const char[] SUFFIX = "<!--EndFragment--></body></html>"; //$NON-NLS-1$
-    static const char[] StartFragment = "StartFragment:"; //$NON-NLS-1$
-    static const char[] EndFragment = "EndFragment:"; //$NON-NLS-1$
+    static const String NUMBER = "00000000"; //$NON-NLS-1$
+    static const String HEADER = "Version:0.9\r\nStartHTML:"~NUMBER~"\r\nEndHTML:"~NUMBER~"\r\nStartFragment:"~NUMBER~"\r\nEndFragment:"~NUMBER~"\r\n";
+    static const String PREFIX = "<html><body><!--StartFragment-->"; //$NON-NLS-1$
+    static const String SUFFIX = "<!--EndFragment--></body></html>"; //$NON-NLS-1$
+    static const String StartFragment = "StartFragment:"; //$NON-NLS-1$
+    static const String EndFragment = "EndFragment:"; //$NON-NLS-1$
 
 static this(){
     HTML_FORMATID = registerType(HTML_FORMAT);
@@ -84,7 +84,7 @@
     if (!checkHTML(object) || !isSupportedType(transferData)) {
         DND.error(DND.ERROR_INVALID_DATA);
     }
-    char[] string = ( cast(ArrayWrapperString)object ).array;
+    String string = ( cast(ArrayWrapperString)object ).array;
     int codePage = OS.GetACP();
     int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, StrToTCHARz(string), -1, null, 0, null, null);
     if (cchMultiByte is 0) {
@@ -101,7 +101,7 @@
     int maxLength = NUMBER.length;
     //startHTML
     int start = buffer.toString().indexOf(NUMBER);
-    char[] temp = Integer.toString(startHTML);
+    String temp = Integer.toString(startHTML);
     buffer.select(start + maxLength-temp.length, temp.length);
     buffer.replace(temp);
     buffer.select();
@@ -173,12 +173,12 @@
             if (cchWideChar is 0) return null;
             wchar[] lpWideCharStr = new wchar [cchWideChar - 1];
             OS.MultiByteToWideChar (codePage, OS.MB_PRECOMPOSED, lpMultiByteStr, -1, lpWideCharStr.ptr, lpWideCharStr.length);
-            char[] string = WCHARzToStr(lpWideCharStr.ptr);
+            String string = WCHARzToStr(lpWideCharStr.ptr);
             int fragmentStart = 0, fragmentEnd = 0;
             int start = string.indexOf(StartFragment) + StartFragment.length;
             int end = start + 1;
             while (end < string.length) {
-                char[] s = string.substring(start, end);
+                String s = string.substring(start, end);
                 try {
                     fragmentStart = Integer.parseInt(s);
                     end++;
@@ -189,7 +189,7 @@
             start = string.indexOf(EndFragment) + EndFragment.length;
             end = start + 1;
             while (end < string.length) {
-                char[] s = string.substring(start, end);
+                String s = string.substring(start, end);
                 try {
                     fragmentEnd = Integer.parseInt(s);
                     end++;
@@ -202,11 +202,11 @@
              * FragmentStart and FragmentEnd are offsets in original byte stream, not
              * the wide char version of the byte stream.
              */
-            char[] s = string.substring(fragmentStart, fragmentEnd);
+            String s = string.substring(fragmentStart, fragmentEnd);
             /*
              * Firefox includes <!--StartFragment --> in the fragment, so remove it.
              */
-            char[] foxStart = "<!--StartFragment -->\r\n"; //$NON-NLS-1$
+            String foxStart = "<!--StartFragment -->\r\n"; //$NON-NLS-1$
             int prefix = s.indexOf(foxStart);
             if (prefix !is -1) {
                 prefix += foxStart.length;
@@ -223,7 +223,7 @@
 protected int[] getTypeIds(){
     return [HTML_FORMATID];
 }
-protected char[][] getTypeNames(){
+protected String[] getTypeNames(){
     return [HTML_FORMAT];
 }
 bool checkHTML(Object object) {
--- a/dwt/dnd/RTFTransfer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/RTFTransfer.d	Mon May 05 00:12:38 2008 +0200
@@ -41,7 +41,7 @@
 public class RTFTransfer : ByteArrayTransfer {
 
     private static RTFTransfer _instance;
-    private static const char[] CF_RTF = "Rich Text Format"; //$NON-NLS-1$
+    private static const String CF_RTF = "Rich Text Format"; //$NON-NLS-1$
     private static const int CF_RTFID;
 
 static this(){
@@ -80,7 +80,7 @@
         DND.error(DND.ERROR_INVALID_DATA);
     }
     // CF_RTF is stored as a null terminated byte array
-    char[] string = (cast(ArrayWrapperString)object).array;
+    String string = (cast(ArrayWrapperString)object).array;
     wchar* chars = StrToWCHARz(string);
     int codePage = OS.GetACP();
     int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars, -1, null, 0, null, null);
@@ -142,7 +142,7 @@
     return [CF_RTFID];
 }
 
-protected char[][] getTypeNames(){
+protected String[] getTypeNames(){
     return [CF_RTF];
 }
 
--- a/dwt/dnd/TextTransfer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/TextTransfer.d	Mon May 05 00:12:38 2008 +0200
@@ -41,8 +41,8 @@
 public class TextTransfer : ByteArrayTransfer {
 
     private static TextTransfer _instance;
-    private static const char[] CF_UNICODETEXT = "CF_UNICODETEXT"; //$NON-NLS-1$
-    private static const char[] CF_TEXT = "CF_TEXT"; //$NON-NLS-1$
+    private static const String CF_UNICODETEXT = "CF_UNICODETEXT"; //$NON-NLS-1$
+    private static const String CF_TEXT = "CF_TEXT"; //$NON-NLS-1$
     private static const int CF_UNICODETEXTID = COM.CF_UNICODETEXT;
     private static const int CF_TEXTID = COM.CF_TEXT;
 
@@ -79,7 +79,7 @@
         DND.error(DND.ERROR_INVALID_DATA);
     }
     transferData.result = COM.E_FAIL;
-    char[] string = (cast(ArrayWrapperString)object).array;
+    String string = (cast(ArrayWrapperString)object).array;
     switch (transferData.type) {
         case COM.CF_UNICODETEXT: {
             wchar[] chars = StrToWCHARs(0,string, true);
@@ -188,7 +188,7 @@
     return [CF_UNICODETEXTID, CF_TEXTID];
 }
 
-protected char[][] getTypeNames(){
+protected String[] getTypeNames(){
     return [CF_UNICODETEXT, CF_TEXT];
 }
 
--- a/dwt/dnd/Transfer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/Transfer.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 import dwt.internal.win32.OS;
 
 import dwt.dnd.TransferData;
+import dwt.dwthelper.utils;
 
 /**
  * <code>Transfer</code> provides a mechanism for converting between a java
@@ -71,7 +72,7 @@
  * @return the platform specific names of the data types that can be converted
  * using this transfer agent.
  */
-abstract protected char[][] getTypeNames();
+abstract protected String[] getTypeNames();
 
 /**
  * Converts a java representation of data to a platform specific representation of
@@ -133,7 +134,7 @@
  *
  * @return the unique identifier associated with this data type
  */
-public static int registerType(char[] formatName) {
+public static int registerType(String formatName) {
     // Look name up in the registry
     // If name is not in registry, add it and return assigned value.
     // If name already exists in registry, return its assigned value
--- a/dwt/dnd/URLTransfer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dnd/URLTransfer.d	Mon May 05 00:12:38 2008 +0200
@@ -45,7 +45,7 @@
 /*public*/ class URLTransfer : ByteArrayTransfer {
 
     static URLTransfer _instance;
-    static const char[] CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$
+    static const String CFSTR_INETURL = "UniformResourceLocator"; //$NON-NLS-1$
     static const int CFSTR_INETURLID;
 
 static this(){
@@ -85,7 +85,7 @@
     }
     transferData.result = COM.E_FAIL;
     // URL is stored as a null terminated byte array
-    char[] url = (cast(ArrayWrapperString2)object).array[0];
+    String url = (cast(ArrayWrapperString2)object).array[0];
     int codePage = OS.GetACP();
     wchar[] chars = StrToWCHARs(codePage, url, true );
     int cchMultiByte = OS.WideCharToMultiByte(codePage, 0, chars.ptr, -1, null, 0, null, null);
@@ -147,14 +147,14 @@
     return [CFSTR_INETURLID];
 }
 
-protected char[][] getTypeNames(){
+protected String[] getTypeNames(){
     return [CFSTR_INETURL];
 }
 
 bool checkURL(Object object) {
     if( auto s = cast(ArrayWrapperString2)object ){
         if( s.array.length is 0 ) return false;
-        char[][] strings = s.array;
+        String[] strings = s.array;
         if (strings[0] is null || strings[0].length is 0) return false;
         //PORTING_FIXME: how to validata URL?
         /+try {
--- a/dwt/dwthelper/ByteArrayOutputStream.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/ByteArrayOutputStream.d	Mon May 05 00:12:38 2008 +0200
@@ -44,17 +44,17 @@
         return 0;
     }
 
-    public override char[] toString(){
+    public override String toString(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
 
-    public char[] toString( char[] enc ){
+    public String toString( String enc ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
 
-    public char[] toString( int hibyte ){
+    public String toString( int hibyte ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
--- a/dwt/dwthelper/File.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/File.d	Mon May 05 00:12:38 2008 +0200
@@ -12,9 +12,9 @@
 public class File {
 
     public static char separatorChar;
-    public static char[] separator;
+    public static String separator;
     public static char pathSeparatorChar;
-    public static char[] pathSeparator;
+    public static String pathSeparator;
 
     private tango.io.FilePath.FilePath mFilePath;
 
@@ -25,15 +25,15 @@
         pathSeparatorChar = tango.io.FileConst.FileConst.SystemPathChar;
     }
 
-    public this ( char[] pathname ){
+    public this ( String pathname ){
         mFilePath = new tango.io.FilePath.FilePath( pathname );
     }
 
-    public this ( char[] parent, char[] child ){
+    public this ( String parent, String child ){
         mFilePath = new tango.io.FilePath.FilePath( tango.io.FilePath.FilePath.join( parent, child ) );
     }
 
-    public this ( dwt.dwthelper.File.File parent, char[] child ){
+    public this ( dwt.dwthelper.File.File parent, String child ){
         mFilePath = new tango.io.FilePath.FilePath( tango.io.FilePath.FilePath.join( parent.mFilePath.toString, child ) );
     }
 
@@ -42,12 +42,12 @@
         return 0;
     }
 
-    public char[] getName(){
+    public String getName(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
 
-    public char[] getParent(){
+    public String getParent(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -57,7 +57,7 @@
         return null;
     }
 
-    public char[] getPath(){
+    public String getPath(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -67,7 +67,7 @@
         return false;
     }
 
-    public char[] getAbsolutePath(){
+    public String getAbsolutePath(){
         return tango.io.FileSystem.FileSystem.toAbsolute( mFilePath ).toString;
     }
 
@@ -75,7 +75,7 @@
         return new File( getAbsolutePath() );
     }
 
-    public char[] getCanonicalPath(){
+    public String getCanonicalPath(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -136,7 +136,7 @@
         implMissing( __FILE__, __LINE__ );
     }
 
-    public char[][] list(){
+    public String[] list(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -176,12 +176,12 @@
         return null;
     }
 
-    public static dwt.dwthelper.File.File createTempFile( char[] prefix, char[] suffix, dwt.dwthelper.File.File directory ){
+    public static dwt.dwthelper.File.File createTempFile( String prefix, String suffix, dwt.dwthelper.File.File directory ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
 
-    public static dwt.dwthelper.File.File createTempFile( char[] prefix, char[] suffix ){
+    public static dwt.dwthelper.File.File createTempFile( String prefix, String suffix ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -191,7 +191,7 @@
         return 0;
     }
 
-    public char[] toString(){
+    public String toString(){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
--- a/dwt/dwthelper/FileInputStream.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/FileInputStream.d	Mon May 05 00:12:38 2008 +0200
@@ -23,7 +23,7 @@
     private const int BUFFER_SIZE = 0x10000;
     private bool eof;
 
-    public this ( char[] name ){
+    public this ( String name ){
         conduit = new FileConduit( name );
         buffer = new ubyte[]( BUFFER_SIZE );
     }
--- a/dwt/dwthelper/FileOutputStream.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/FileOutputStream.d	Mon May 05 00:12:38 2008 +0200
@@ -13,11 +13,11 @@
     alias dwt.dwthelper.OutputStream.OutputStream.write write;
     alias dwt.dwthelper.OutputStream.OutputStream.close close;
 
-    public this ( char[] name ){
+    public this ( String name ){
         implMissing( __FILE__, __LINE__ );
     }
 
-    public this ( char[] name, bool append ){
+    public this ( String name, bool append ){
         implMissing( __FILE__, __LINE__ );
     }
 
--- a/dwt/dwthelper/OutputStream.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/OutputStream.d	Mon May 05 00:12:38 2008 +0200
@@ -27,7 +27,7 @@
         ostr.write(b);
     }
 
-    public void write(char[] c) {
+    public void write(String c) {
         ostr.write(c);
     }
 
--- a/dwt/dwthelper/ResourceBundle.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/ResourceBundle.d	Mon May 05 00:12:38 2008 +0200
@@ -12,10 +12,10 @@
 
 class ResourceBundle {
 
-    char[][ char[] ] map;
+    String[ String ] map;
 
-    public this( char[] data ){
-        char[] line;
+    public this( String data ){
+        String line;
         int dataIndex;
 
         //tango.io.Stdout.Stdout.formatln( "properties put ..." );
@@ -31,8 +31,8 @@
         //tango.io.Stdout.Stdout.formatln( "properties put {}", __LINE__ );
         bool linecontinue = false;
         bool iskeypart = true;
-        char[] key;
-        char[] value;
+        String key;
+        String value;
 nextline:
         while( dataIndex < data.length ){
             //tango.io.Stdout.Stdout.formatln( "properties put {} startline", __LINE__ );
@@ -107,35 +107,35 @@
         }
     }
 
-    public bool hasString( char[] key ){
+    public bool hasString( String key ){
         return ( key in map ) !is null;
     }
 
-    public char[] getString( char[] key ){
+    public String getString( String key ){
         if( auto v = key in map ){
             return (*v).dup;
         }
         throw new MissingResourceException( "key not found", this.classinfo.name, key );
     }
 
-    public char[][] getKeys(){
+    public String[] getKeys(){
         return map.keys;
     }
 
     public static ResourceBundle getBundle( ImportData data ){
-        return new ResourceBundle( cast(char[]) data.data );
+        return new ResourceBundle( cast(String) data.data );
     }
-    public static ResourceBundle getBundle( char[] name ){
+    public static ResourceBundle getBundle( String name ){
         try{
             scope f = new File(name);
-            return new ResourceBundle( cast(char[]) f.read() );
+            return new ResourceBundle( cast(String) f.read() );
         }
         catch( IOException e){
             e.msg ~= " file:" ~ name;
             throw e;
         }
     }
-    public static ResourceBundle getBundleFromData( char[] data ){
+    public static ResourceBundle getBundleFromData( String data ){
         return new ResourceBundle( data );
     }
 }
--- a/dwt/dwthelper/System.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/System.d	Mon May 05 00:12:38 2008 +0200
@@ -7,6 +7,8 @@
 import tango.time.Clock;
 import tango.stdc.stdlib : exit;
 
+import dwt.dwthelper.utils;
+
 template SimpleType(T) {
     debug{
         static void validCheck(uint SrcLen, uint DestLen, uint copyLen){
@@ -135,7 +137,7 @@
         return (*cast(Object *)&x).toHash();
     }
 
-    public static char[] getProperty( char[] key ){
+    public static String getProperty( String key ){
         switch( key ){
         case "os.name": return "windows";
         default: return null;
--- a/dwt/dwthelper/XmlTranscode.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/XmlTranscode.d	Mon May 05 00:12:38 2008 +0200
@@ -9,7 +9,7 @@
  + Throws TextException on failure
  + The given string is modified.
  +/
-char[] xmlUnescape( char[] str ){
+String xmlUnescape( String str ){
 
     void error(){
         throw new TextException( "xmlUnescape" );
@@ -17,8 +17,8 @@
     // &lt; ...
     // &#1234;
     // &#x12AF;
-    char[] src = str;
-    char[] trg = str;
+    String src = str;
+    String trg = str;
     while( src.length ){
         if( src[0] !is '&' ){
             trg[0] = src[0];
@@ -34,7 +34,7 @@
             int semi = tango.text.Util.locate( src[0 .. len ], ';' );
             if( semi is len ) error(); // no semi found
 
-            char[] entityName = src[ 0 .. semi ]; // name without semi
+            String entityName = src[ 0 .. semi ]; // name without semi
             dchar entityValue = 0;
             switch( entityName ){
                 case "lt":   entityValue = '<'; break;
@@ -79,7 +79,7 @@
             dchar[1] arr;
             arr[0] = entityValue;
             uint ate = 0;
-            char[] res = tango.text.convert.Utf.toString( arr, trg, &ate );
+            String res = tango.text.convert.Utf.toString( arr, trg, &ate );
             trg = trg[ res.length .. $ ];
             src = src[ semi +1 .. $ ]; // go past semi
         }
@@ -94,7 +94,7 @@
  + If not, the original string is returned.
  + If processing is needed, a new string is allocated.
  +/
-char[] xmlEscape( char[] xml ){
+String xmlEscape( String xml ){
     bool needsReplacement( dchar c ){
         switch( c ){
             case '<':
@@ -121,7 +121,7 @@
 Lprocess:
 
     // yes, do a new string, start with +20 chars
-    char[] res = new char[ xml.length + 20 ];
+    String res = new char[ xml.length + 20 ];
     res.length = 0;
 
     foreach( dchar c; xml ){
--- a/dwt/dwthelper/utils.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/dwthelper/utils.d	Mon May 05 00:12:38 2008 +0200
@@ -35,7 +35,7 @@
 alias char[] String;
 alias tango.text.Text.Text!(char) StringBuffer;
 
-void implMissing( char[] file, uint line ){
+void implMissing( String file, uint line ){
     Stderr.formatln( "implementation missing in file {} line {}", file, line );
     Stderr.formatln( "exiting ..." );
     exit(1);
@@ -94,7 +94,7 @@
     public bool booleanValue(){
         return value;
     }
-    public static Boolean valueOf( char[] s ){
+    public static Boolean valueOf( String s ){
         if( s == "yes" || s == "true" ){
             return TRUE;
         }
@@ -109,7 +109,7 @@
 
 
 class Byte : ValueWrapperT!(byte) {
-    public static byte parseByte( char[] s ){
+    public static byte parseByte( String s ){
         try{
             int res = tango.text.convert.Integer.parse( s );
             if( res < byte.min || res > byte.max ){
@@ -138,11 +138,11 @@
         super( value );
     }
 
-    public this ( char[] s ){
+    public this ( String s ){
         super(parseInt(s));
     }
 
-    public static char[] toString( int i, int radix ){
+    public static String toString( int i, int radix ){
         switch( radix ){
         case 2:
             return toBinaryString(i);
@@ -158,23 +158,23 @@
         }
     }
 
-    public static char[] toHexString( int i ){
+    public static String toHexString( int i ){
         return tango.text.convert.Integer.toString(i, tango.text.convert.Integer.Style.Hex );
     }
 
-    public static char[] toOctalString( int i ){
+    public static String toOctalString( int i ){
         return tango.text.convert.Integer.toString(i, tango.text.convert.Integer.Style.Octal );
     }
 
-    public static char[] toBinaryString( int i ){
+    public static String toBinaryString( int i ){
         return tango.text.convert.Integer.toString(i, tango.text.convert.Integer.Style.Binary );
     }
 
-    public static char[] toString( int i ){
+    public static String toString( int i ){
         return tango.text.convert.Integer.toString(i);
     }
 
-    public static int parseInt( char[] s, int radix ){
+    public static int parseInt( String s, int radix ){
         try{
             return tango.text.convert.Integer.parse( s, cast(uint)radix );
         }
@@ -183,7 +183,7 @@
         }
     }
 
-    public static int parseInt( char[] s ){
+    public static int parseInt( String s ){
         try{
             return tango.text.convert.Integer.parse( s );
         }
@@ -192,12 +192,12 @@
         }
     }
 
-    public static Integer valueOf( char[] s, int radix ){
+    public static Integer valueOf( String s, int radix ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
 
-    public static Integer valueOf( char[] s ){
+    public static Integer valueOf( String s ){
         return valueOf( parseInt(s));
     }
 
@@ -233,7 +233,7 @@
         return intValue();
     }
 
-    public override char[] toString(){
+    public override String toString(){
         return tango.text.convert.Integer.toString( value );
     }
 }
@@ -243,14 +243,14 @@
     this( double value ){
         super(value);
     }
-    this( char[] str ){
+    this( String str ){
         implMissing( __FILE__, __LINE__ );
         super(0.0);
     }
     public double doubleValue(){
         return value;
     }
-    public static char[] toString( double value ){
+    public static String toString( double value ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -268,18 +268,18 @@
     this( float value ){
         super(value);
     }
-    this( char[] str ){
+    this( String str ){
         implMissing( __FILE__, __LINE__ );
         super(0.0);
     }
     public float floatValue(){
         return value;
     }
-    public static char[] toString( float value ){
+    public static String toString( float value ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
-    public static float parseFloat( char[] s ){
+    public static float parseFloat( String s ){
         try{
             return tango.text.convert.Float.toFloat( s );
         }
@@ -293,18 +293,18 @@
     this( long value ){
         super(value);
     }
-    this( char[] str ){
+    this( String str ){
         implMissing( __FILE__, __LINE__ );
         super(0);
     }
     public long longValue(){
         return value;
     }
-    public static long parseLong(char[] s){
+    public static long parseLong(String s){
         implMissing( __FILE__, __LINE__ );
         return 0;
     }
-    public static char[] toString( double value ){
+    public static String toString( double value ){
         implMissing( __FILE__, __LINE__ );
         return null;
     }
@@ -318,7 +318,7 @@
 alias ArrayWrapperT!(int)     ArrayWrapperInt;
 alias ArrayWrapperT!(Object)  ArrayWrapperObject;
 alias ArrayWrapperT!(char)    ArrayWrapperString;
-alias ArrayWrapperT!(char[])  ArrayWrapperString2;
+alias ArrayWrapperT!(String)  ArrayWrapperString2;
 
 Object[] StringArrayToObjectArray( String[] strs ){
     Object[] res = new Object[strs.length];
@@ -327,7 +327,7 @@
     }
     return res;
 }
-int codepointIndexToIndex( char[] str, int cpIndex ){
+int codepointIndexToIndex( String str, int cpIndex ){
     int cps = cpIndex;
     int res = 0;
     while( cps > 0 ){
@@ -347,7 +347,7 @@
     }
     return res;
 }
-int indexToCodepointIndex( char[] str, int index ){
+int indexToCodepointIndex( String str, int index ){
     int i = 0;
     int res = 0;
     while( i < index ){
@@ -368,7 +368,7 @@
     return res;
 }
 
-char[] firstCodePointStr( char[] str, out int consumed ){
+String firstCodePointStr( String str, out int consumed ){
     dchar[1] buf;
     uint ate;
     dchar[] res = str.toString32( buf, &ate );
@@ -376,11 +376,11 @@
     return str[ 0 .. ate ];
 }
 
-dchar firstCodePoint( char[] str ){
+dchar firstCodePoint( String str ){
     int dummy;
     return firstCodePoint( str, dummy );
 }
-dchar firstCodePoint( char[] str, out int consumed ){
+dchar firstCodePoint( String str, out int consumed ){
     dchar[1] buf;
     uint ate;
     dchar[] res = str.toString32( buf, &ate );
@@ -393,13 +393,13 @@
     return res[0];
 }
 
-char[] dcharToString( dchar key ){
+String dcharToString( dchar key ){
     dchar[1] buf;
     buf[0] = key;
     return tango.text.convert.Utf.toString( buf );
 }
 
-int codepointCount( char[] str ){
+int codepointCount( String str ){
     scope dchar[] buf = new dchar[]( str.length );
     uint ate;
     dchar[] res = tango.text.convert.Utf.toString32( str, buf, &ate );
@@ -410,7 +410,7 @@
 alias tango.text.convert.Utf.toString16 toString16;
 alias tango.text.convert.Utf.toString toString;
 
-int getRelativeCodePointOffset( char[] str, int startIndex, int searchRelCp ){
+int getRelativeCodePointOffset( String str, int startIndex, int searchRelCp ){
     int ignore;
     int i = startIndex;
     if( searchRelCp > 0 ){
@@ -462,13 +462,13 @@
     }
     return i - startIndex;
 }
-dchar getRelativeCodePoint( char[] str, int startIndex, int searchRelCp, out int relIndex ){
+dchar getRelativeCodePoint( String str, int startIndex, int searchRelCp, out int relIndex ){
     relIndex = getRelativeCodePointOffset( str, startIndex, searchRelCp );
     int ignore;
     return firstCodePoint( str[ startIndex+relIndex .. $ ], ignore );
 }
 
-int utf8AdjustOffset( char[] str, int offset ){
+int utf8AdjustOffset( String str, int offset ){
     if( str.length <= offset || offset <= 0 ){
         return offset;
     }
@@ -481,11 +481,11 @@
 bool CharacterIsDefined( dchar ch ){
     return (ch in tango.text.UnicodeData.unicodeData) !is null;
 }
-dchar CharacterFirstToLower( char[] str ){
+dchar CharacterFirstToLower( String str ){
     int consumed;
     return CharacterFirstToLower( str, consumed );
 }
-dchar CharacterFirstToLower( char[] str, out int consumed ){
+dchar CharacterFirstToLower( String str, out int consumed ){
     dchar[1] buf;
     buf[0] = firstCodePoint( str, consumed );
     dchar[] r = tango.text.Unicode.toLower( buf );
@@ -509,58 +509,58 @@
 bool CharacterIsLetter( dchar c ){
     return tango.text.Unicode.isLetter( c );
 }
-public char[] toUpperCase( char[] str ){
+public String toUpperCase( String str ){
     return tango.text.Unicode.toUpper( str );
 }
 
-public int indexOf( char[] str, char searched ){
+public int indexOf( String str, char searched ){
     int res = tango.text.Util.locate( str, searched );
     if( res is str.length ) res = -1;
     return res;
 }
 
-public int indexOf( char[] str, char searched, int startpos ){
+public int indexOf( String str, char searched, int startpos ){
     int res = tango.text.Util.locate( str, searched, startpos );
     if( res is str.length ) res = -1;
     return res;
 }
 
-public int indexOf(char[] str, char[] ch){
+public int indexOf(String str, String ch){
     return indexOf( str, ch, 0 );
 }
 
-public int indexOf(char[] str, char[] ch, int start){
+public int indexOf(String str, String ch, int start){
     int res = tango.text.Util.locatePattern( str, ch, start );
     if( res is str.length ) res = -1;
     return res;
 }
 
-public int lastIndexOf(char[] str, char ch){
+public int lastIndexOf(String str, char ch){
     return lastIndexOf( str, ch, str.length );
 }
-public int lastIndexOf(char[] str, char ch, int formIndex){
+public int lastIndexOf(String str, char ch, int formIndex){
     int res = tango.text.Util.locatePrior( str, ch, formIndex );
     if( res is str.length ) res = -1;
     return res;
 }
-public int lastIndexOf(char[] str, char[] ch ){
+public int lastIndexOf(String str, String ch ){
     return lastIndexOf( str, ch, str.length );
 }
-public int lastIndexOf(char[] str, char[] ch, int start ){
+public int lastIndexOf(String str, String ch, int start ){
     int res = tango.text.Util.locatePatternPrior( str, ch, start );
     if( res is str.length ) res = -1;
     return res;
 }
 
-public char[] replace( char[] str, char from, char to ){
+public String replace( String str, char from, char to ){
     return tango.text.Util.replace( str.dup, from, to );
 }
 
-public char[] substring( char[] str, int start ){
+public String substring( String str, int start ){
     return str[ start .. $ ].dup;
 }
 
-public char[] substring( char[] str, int start, int end ){
+public String substring( String str, int start, int end ){
     return str[ start .. end ].dup;
 }
 
@@ -572,66 +572,66 @@
     return str[ start .. end ].dup;
 }
 
-public char charAt( char[] str, int pos ){
+public char charAt( String str, int pos ){
     return str[ pos ];
 }
 
-public void getChars( char[] src, int srcBegin, int srcEnd, char[] dst, int dstBegin){
+public void getChars( String src, int srcBegin, int srcEnd, String dst, int dstBegin){
     dst[ dstBegin .. dstBegin + srcEnd - srcBegin ] = src[ srcBegin .. srcEnd ];
 }
 
-public wchar[] toCharArray( char[] str ){
+public wchar[] toCharArray( String str ){
     return toString16( str );
 }
 
-public bool endsWith( char[] src, char[] pattern ){
+public bool endsWith( String src, String pattern ){
     if( src.length < pattern.length ){
         return false;
     }
     return src[ $-pattern.length .. $ ] == pattern;
 }
 
-public bool equals( char[] src, char[] other ){
+public bool equals( String src, String other ){
     return src == other;
 }
 
-public bool equalsIgnoreCase( char[] src, char[] other ){
+public bool equalsIgnoreCase( String src, String other ){
     return tango.text.Unicode.toFold(src) == tango.text.Unicode.toFold(other);
 }
 
-public bool startsWith( char[] src, char[] pattern ){
+public bool startsWith( String src, String pattern ){
     if( src.length < pattern.length ){
         return false;
     }
     return src[ 0 .. pattern.length ] == pattern;
 }
 
-public char[] toLowerCase( char[] src ){
+public String toLowerCase( String src ){
     return tango.text.Unicode.toLower( src );
 }
 
-public hash_t toHash( char[] src ){
-    return typeid(char[]).getHash(&src);
+public hash_t toHash( String src ){
+    return typeid(String).getHash(&src);
 }
 
-public char[] trim( char[] str ){
+public String trim( String str ){
     return tango.text.Util.trim( str ).dup;
 }
-public char[] intern( char[] str ){
+public String intern( String str ){
     return str;
 }
 
-public char* toStringzValidPtr( char[] src ){
+public char* toStringzValidPtr( String src ){
     if( src ){
         return src.toStringz();
     }
     else{
-        static const char[] nullPtr = "\0";
+        static const String nullPtr = "\0";
         return nullPtr.ptr;
     }
 }
 
-static char[] toHex(uint value, bool prefix = true, int radix = 8){
+static String toHex(uint value, bool prefix = true, int radix = 8){
     return tango.text.convert.Integer.toString(
             value,
             radix is 10 ? tango.text.convert.Integer.Style.Signed :
@@ -643,7 +643,7 @@
 }
 
 class RuntimeException : Exception {
-    this( char[] e = null){
+    this( String e = null){
         super(e);
     }
     this( Exception e ){
@@ -656,13 +656,13 @@
 
 }
 class IndexOutOfBoundsException : Exception {
-    this( char[] e = null){
+    this( String e = null){
         super(e);
     }
 }
 
 class UnsupportedOperationException : RuntimeException {
-    this( char[] e = null){
+    this( String e = null){
         super(e);
     }
     this( Exception e ){
@@ -670,7 +670,7 @@
     }
 }
 class NumberFormatException : IllegalArgumentException {
-    this( char[] e ){
+    this( String e ){
         super(e);
     }
     this( Exception e ){
@@ -678,7 +678,7 @@
     }
 }
 class NullPointerException : Exception {
-    this( char[] e = null ){
+    this( String e = null ){
         super(e);
     }
     this( Exception e ){
@@ -686,7 +686,7 @@
     }
 }
 class IllegalStateException : Exception {
-    this( char[] e = null ){
+    this( String e = null ){
         super(e);
     }
     this( Exception e ){
@@ -694,7 +694,7 @@
     }
 }
 class InterruptedException : Exception {
-    this( char[] e = null ){
+    this( String e = null ){
         super(e);
     }
     this( Exception e ){
@@ -703,7 +703,7 @@
 }
 class InvocationTargetException : Exception {
     Exception cause;
-    this( Exception e = null, char[] msg = null ){
+    this( Exception e = null, String msg = null ){
         super(msg);
         cause = e;
     }
@@ -714,16 +714,16 @@
     }
 }
 class MissingResourceException : Exception {
-    char[] classname;
-    char[] key;
-    this( char[] msg, char[] classname, char[] key ){
+    String classname;
+    String key;
+    this( String msg, String classname, String key ){
         super(msg);
         this.classname = classname;
         this.key = key;
     }
 }
 class ParseException : Exception {
-    this( char[] e = null ){
+    this( String e = null ){
         super(e);
     }
 }
@@ -753,7 +753,7 @@
         return source;
     }
 
-    public override char[] toString() {
+    public override String toString() {
         return this.classinfo.name ~ "[source=" ~ source.toString() ~ "]";
     }
 }
@@ -831,23 +831,23 @@
     }
 }
 
-char[] stringcast( Object o ){
+String stringcast( Object o ){
     if( auto str = cast(ArrayWrapperString) o ){
         return str.array;
     }
     return null;
 }
-char[][] stringcast( Object[] objs ){
-    char[][] res = new char[][](objs.length);
+String[] stringcast( Object[] objs ){
+    String[] res = new String[](objs.length);
     foreach( idx, obj; objs ){
         res[idx] = stringcast(obj);
     }
     return res;
 }
-ArrayWrapperString stringcast( char[] str ){
+ArrayWrapperString stringcast( String str ){
     return new ArrayWrapperString( str );
 }
-ArrayWrapperString[] stringcast( char[][] strs ){
+ArrayWrapperString[] stringcast( String[] strs ){
     ArrayWrapperString[] res = new ArrayWrapperString[ strs.length ];
     foreach( idx, str; strs ){
         res[idx] = stringcast(str);
@@ -936,7 +936,7 @@
     return res;
 }
 
-void PrintStackTrace( int deepth = 100, char[] prefix = "trc" ){
+void PrintStackTrace( int deepth = 100, String prefix = "trc" ){
     auto e = new Exception( null );
     int idx = 0;
     const start = 3;
@@ -950,9 +950,9 @@
 
 struct ImportData{
     void[] data;
-    char[] name;
+    String name;
 
-    public static ImportData opCall( void[] data, char[] name ){
+    public static ImportData opCall( void[] data, String name ){
         ImportData res;
         res.data = data;
         res.name = name;
@@ -960,6 +960,6 @@
     }
 }
 
-template getImportData(char[] name ){
+template getImportData(String name ){
     const ImportData getImportData = ImportData( import(name), name );
-}
\ No newline at end of file
+}
--- a/dwt/events/KeyEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/KeyEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,7 @@
 import dwt.events.TypedEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent as a result of
@@ -98,7 +99,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} character={} keyCode={} stateMask={} doit={}}",
         super.toString[ 0 .. $-2 ],
         character, keyCode, stateMask, doit );
--- a/dwt/events/MenuDetectEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/MenuDetectEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,8 @@
 import dwt.events.TypedEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
+
 /**
  * Instances of this class are sent whenever the platform-
  * specific trigger for showing a context menu is detected.
@@ -67,7 +69,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} x={} y={} doit={}}", super.toString[ 0 .. $-2 ], x, y, doit );
 }
 }
--- a/dwt/events/MouseEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/MouseEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,7 @@
 import dwt.events.TypedEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent whenever mouse
@@ -93,7 +94,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} button={} stateMask={} x={} y={} count={}}",
         super.toString[ 0 .. $-1 ],
         button, stateMask, x, y, count );
--- a/dwt/events/PaintEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/PaintEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -19,6 +19,7 @@
 import dwt.events.TypedEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent as a result of
@@ -92,7 +93,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} gc={} x={} y={} width={} height={} count={}}",
         super.toString[ 0 .. $-1 ],
         gc is null ? "null" : gc.toString,
--- a/dwt/events/SelectionEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/SelectionEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -18,6 +18,8 @@
 import dwt.events.TypedEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
+
 /**
  * Instances of this class are sent as a result of
  * widgets being selected.
@@ -92,7 +94,7 @@
      * @see dwt.widgets.Link#setText(String)
      * @since 3.1
      */
-    public char[] text;
+    public String text;
 
     /**
      * A flag indicating whether the operation should be allowed.
@@ -128,7 +130,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} item={} detail={} x={} y={} width={} height={} stateMask={} text={} doit={}}",
         super.toString[ 0 .. $-2 ],
         item,
--- a/dwt/events/ShellEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/ShellEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,7 @@
 import dwt.events.TypedEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are sent as a result of
@@ -52,7 +53,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} doit={}}", super.toString[ 0 .. $-2 ], doit );
 }
 }
--- a/dwt/events/TraverseEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/TraverseEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,8 @@
 import dwt.events.KeyEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
+
 /**
  * Instances of this class are sent as a result of
  * widget traversal actions.
@@ -131,7 +133,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} detail={}}", super.toString[ 0 .. $-2 ], detail );
 }
 }
--- a/dwt/events/TypedEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/TypedEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -20,6 +20,7 @@
 
 import tango.text.convert.Format;
 import tango.text.Util : split;
+import dwt.dwthelper.utils;
 
 /**
  * This is the super class for all typed event classes provided
@@ -87,8 +88,8 @@
  *
  * @return the name of the event
  */
-char[] getName () {
-    char[] str = this.classinfo.name;
+String getName () {
+    String str = this.classinfo.name;
     return split( str, "." )[$-1];
 }
 
@@ -98,9 +99,9 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
-    char[] str_widget = widget is null ? "null" : widget.toString;
-    char[] str_data   = data is null ? "null" : data.toString;
+public override String toString() {
+    String str_widget = widget is null ? "null" : widget.toString;
+    String str_data   = data is null ? "null" : data.toString;
     return Format( "{}{{time={} data={}}", str_widget, time, str_data );
 }
 }
--- a/dwt/events/VerifyEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/events/VerifyEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,8 @@
 import dwt.events.KeyEvent;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
+
 /**
  * Instances of this class are sent as a result of
  * widgets handling keyboard events
@@ -37,7 +39,7 @@
      * Setting this field will change the text that is about to
      * be inserted or deleted.
      */
-    public char[] text;
+    public String text;
 
     //static final long serialVersionUID = 3257003246269577014L;
 
@@ -60,7 +62,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "{} start={} end={} text={}}", super.toString[ 0 .. $-2 ], start, end, text );
 }
 }
--- a/dwt/graphics/Color.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Color.d	Mon May 05 00:12:38 2008 +0200
@@ -21,6 +21,7 @@
 import dwt.graphics.Device;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class manage the operating system resources that
@@ -317,7 +318,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "Color {*DISPOSED*}"; //$NON-NLS-1$
     return Format( "Color {{{}, {}, {}}", getRed(), getGreen(), getBlue()); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 }
--- a/dwt/graphics/Cursor.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Cursor.d	Mon May 05 00:12:38 2008 +0200
@@ -25,6 +25,7 @@
 import dwt.graphics.Image;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class manage operating system resources that
@@ -456,7 +457,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "Cursor {*DISPOSED*}";
     return Format( "Cursor {{{}}", handle );
 }
--- a/dwt/graphics/Device.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Device.d	Mon May 05 00:12:38 2008 +0200
@@ -457,7 +457,7 @@
  *    <li>ERROR_DEVICE_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public FontData [] getFontList (char[] faceName, bool scalable) {
+public FontData [] getFontList (String faceName, bool scalable) {
     checkDevice ();
 
     /* Create the callback */
@@ -538,21 +538,21 @@
     return result;
 }
 
-char[] getLastError () {
+String getLastError () {
     int error = OS.GetLastError();
     if (error is 0) return ""; //$NON-NLS-1$
     return " [GetLastError=0x" ~ .toHex(error) ~ "]"; //$NON-NLS-1$ //$NON-NLS-2$
 }
 
-char[] getLastErrorText () {
+String getLastErrorText () {
     int error = OS.GetLastError();
     if (error is 0) return ""; //$NON-NLS-1$
     TCHAR* buffer = null;
     int dwFlags = OS.FORMAT_MESSAGE_ALLOCATE_BUFFER | OS.FORMAT_MESSAGE_FROM_SYSTEM | OS.FORMAT_MESSAGE_IGNORE_INSERTS;
     int length = OS.FormatMessage(dwFlags, null, error, OS.LANG_USER_DEFAULT, cast(TCHAR*)&buffer, 0, null);
-    char[] errorNum = ("[GetLastError=") ~ .toHex(error) ~ "] ";
+    String errorNum = ("[GetLastError=") ~ .toHex(error) ~ "] ";
     if (length == 0) return errorNum;
-    char[] buffer1 = .TCHARzToStr(buffer, length);
+    String buffer1 = .TCHARzToStr(buffer, length);
     if ( *buffer != 0)
         OS.LocalFree(cast(HLOCAL)buffer);
     return errorNum ~ buffer1;
@@ -791,7 +791,7 @@
  *
  * @since 3.3
  */
-public bool loadFont (char[] path) {
+public bool loadFont (String path) {
     checkDevice();
     if (path is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     if (OS.IsWinNT && OS.WIN32_VERSION >= OS.VERSION (4, 10)) {
--- a/dwt/graphics/Font.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Font.d	Mon May 05 00:12:38 2008 +0200
@@ -23,6 +23,7 @@
 import dwt.graphics.Device;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 //import tango.stdc.stringz;
 
 /**
@@ -141,7 +142,7 @@
  *    <li>ERROR_NO_HANDLES - if a font could not be created from the given arguments</li>
  * </ul>
  */
-public this(Device device, char[] name, int height, int style) {
+public this(Device device, String name, int height, int style) {
     if (device is null) device = Device.getDevice();
     if (device is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     if (name is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -149,7 +150,7 @@
     if (device.tracking) device.new_Object(this);
 }
 
-/*public*/ this(Device device, char[] name, float height, int style) {
+/*public*/ this(Device device, String name, float height, int style) {
     if (device is null) device = Device.getDevice();
     if (device is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     if (name is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -253,7 +254,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "Font {*DISPOSED*}";
     return Format( "Font {{{}}", handle );
 }
--- a/dwt/graphics/FontData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/FontData.d	Mon May 05 00:12:38 2008 +0200
@@ -75,7 +75,7 @@
     /**
      * The locales of the font
      */
-    char[] lang, country, variant;
+    String lang, country, variant;
 
     private static FontData s_this;
 
@@ -120,12 +120,12 @@
  *
  * @see #toString
  */
-public this(char[] string) {
+public this(String string) {
     if (string is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     int start = 0;
     int end = string.indexOf('|');
     if (end is -1) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
-    char[] version1 = string.substring(start, end);
+    String version1 = string.substring(start, end);
     try {
         if (Integer.parseInt(version1) !is 1) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
     } catch (NumberFormatException e) {
@@ -135,7 +135,7 @@
     start = end + 1;
     end = string.indexOf('|', start);
     if (end is -1) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
-    char[] name = string.substring(start, end);
+    String name = string.substring(start, end);
 
     start = end + 1;
     end = string.indexOf('|', start);
@@ -165,12 +165,12 @@
     setHeight(height);
     setStyle(style);
     if (end is -1) return;
-    char[] platform = string.substring(start, end);
+    String platform = string.substring(start, end);
 
     start = end + 1;
     end = string.indexOf('|', start);
     if (end is -1) return;
-    char[] version2 = string.substring(start, end);
+    String version2 = string.substring(start, end);
 
     if (platform ==/*eq*/ "WINDOWS" && version2 ==/*eq*/ "1") {  //$NON-NLS-1$//$NON-NLS-2$
         LOGFONT newData;// = OS.IsUnicode ? cast(LOGFONT)new LOGFONTW() : new LOGFONTA();
@@ -234,7 +234,7 @@
             setStyle(style);
             return;
         }
-        char[] buffer = string.substring(start);
+        String buffer = string.substring(start);
         auto wname = StrToTCHARs(buffer);
         int len = Math.min(OS.LF_FACESIZE - 1, wname.length);
         newData.lfFaceName[ 0 .. len ] = wname[ 0 .. len ];
@@ -257,7 +257,7 @@
  *    <li>ERROR_INVALID_ARGUMENT - if the height is negative</li>
  * </ul>
  */
-public this(char[] name, int height, int style) {
+public this(String name, int height, int style) {
     if (name is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     setName(name);
     setHeight(height);
@@ -268,7 +268,7 @@
     data.lfCharSet = cast(byte)OS.DEFAULT_CHARSET;
 }
 
-/*public*/ this(char[] name, float height, int style) {
+/*public*/ this(String name, float height, int style) {
     if (name is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     setName(name);
     setHeight(height);
@@ -322,7 +322,7 @@
 
     /* Get the locale ID */
     int length_ = 8;
-    char[] str = .TCHARzToStr( cast(TCHAR*)lpLocaleString, length_);
+    String str = .TCHARzToStr( cast(TCHAR*)lpLocaleString, length_);
     int lcid = Integer.parseInt(str, 16);
 
     TCHAR[] buffer = new TCHAR[length_];
@@ -380,7 +380,7 @@
  * @return the <code>String</code> representing a Locale object
  * @since 3.0
  */
-public char[] getLocale () {
+public String getLocale () {
     StringBuffer buffer = new StringBuffer ();
     char sep = '_';
     if (lang !is null) {
@@ -395,7 +395,7 @@
         buffer.append (variant);
     }
 
-    char[] result = buffer.toString ();
+    String result = buffer.toString ();
     int length_ = result.length;
     if (length_ > 0) {
         if (result.charAt (length_ - 1) is sep) {
@@ -414,7 +414,7 @@
  *
  * @see #setName
  */
-public char[] getName() {
+public String getName() {
     return .TCHARzToStr( data.lfFaceName.ptr, -1 );
 }
 
@@ -445,12 +445,12 @@
  * @see #equals
  */
 override public hash_t toHash () {
-    char[] name = getName();
+    String name = getName();
     return data.lfCharSet ^ getHeight() ^ data.lfWidth ^ data.lfEscapement ^
         data.lfOrientation ^ data.lfWeight ^ data.lfItalic ^data.lfUnderline ^
         data.lfStrikeOut ^ data.lfCharSet ^ data.lfOutPrecision ^
         data.lfClipPrecision ^ data.lfQuality ^ data.lfPitchAndFamily ^
-        typeid(char[]).getHash(&name);
+        typeid(String).getHash(&name);
 }
 
 /**
@@ -493,7 +493,7 @@
  * @param locale the <code>String</code> representing a Locale object
  * @see java.util.Locale#toString
  */
-public void setLocale(char[] locale) {
+public void setLocale(String locale) {
     lang = country = variant = null;
     if (locale !is null) {
         char sep = '_';
@@ -547,7 +547,7 @@
  *
  * @see #getName
  */
-public void setName(char[] name) {
+public void setName(String name) {
     if (name is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
 
     /* The field lfFaceName must be NULL terminated */
@@ -589,41 +589,41 @@
  *
  * @see FontData
  */
-override public char[] toString() {
+override public String toString() {
     StringBuffer buffer = new StringBuffer();
     buffer.append("1|"); //$NON-NLS-1$
     buffer.append(getName());
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(getHeightF()));
+    buffer.append(to!(String)(getHeightF()));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(getStyle()));
+    buffer.append(to!(String)(getStyle()));
     buffer.append("|"); //$NON-NLS-1$
     buffer.append("WINDOWS|1|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfHeight));
+    buffer.append(to!(String)(data.lfHeight));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfWidth));
+    buffer.append(to!(String)(data.lfWidth));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfEscapement));
+    buffer.append(to!(String)(data.lfEscapement));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfOrientation));
+    buffer.append(to!(String)(data.lfOrientation));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfWeight));
+    buffer.append(to!(String)(data.lfWeight));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfItalic));
+    buffer.append(to!(String)(data.lfItalic));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfUnderline));
+    buffer.append(to!(String)(data.lfUnderline));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfStrikeOut));
+    buffer.append(to!(String)(data.lfStrikeOut));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfCharSet));
+    buffer.append(to!(String)(data.lfCharSet));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfOutPrecision));
+    buffer.append(to!(String)(data.lfOutPrecision));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfClipPrecision));
+    buffer.append(to!(String)(data.lfClipPrecision));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfQuality));
+    buffer.append(to!(String)(data.lfQuality));
     buffer.append("|"); //$NON-NLS-1$
-    buffer.append(to!(char[])(data.lfPitchAndFamily));
+    buffer.append(to!(String)(data.lfPitchAndFamily));
     buffer.append("|"); //$NON-NLS-1$
     buffer.append(getName());
     return buffer.toString();
--- a/dwt/graphics/GC.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/GC.d	Mon May 05 00:12:38 2008 +0200
@@ -581,7 +581,7 @@
             chars = logFont.lfFaceName;
         } else {
             chars = new wchar[OS.LF_FACESIZE];
-            char[] bytes = logFont.lfFaceName;
+            String bytes = logFont.lfFaceName;
             OS.MultiByteToWideChar (OS.CP_ACP, OS.MB_PRECOMPOSED, bytes.ptr, bytes.length, chars, chars.length);
         }
         int index = 0;
@@ -589,7 +589,7 @@
             if (chars [index] is 0) break;
             index++;
         }
-        char[] name = WCHARsToStr( chars[ 0 .. index ] );
+        String name = WCHARsToStr( chars[ 0 .. index ] );
         if (Compatibility.equalsIgnoreCase(name, "Courier")) { //$NON-NLS-1$
             name = "Courier New"; //$NON-NLS-1$
         }
@@ -2080,7 +2080,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void drawString (char[] string, int x, int y) {
+public void drawString (String string, int x, int y) {
     drawString(string, x, y, false);
 }
 
@@ -2104,7 +2104,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void drawString (char[] string, int x, int y, bool isTransparent) {
+public void drawString (String string, int x, int y, bool isTransparent) {
     if (handle is null) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
     if (string is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
 //  TCHAR buffer = new TCHAR (getCodePage(), string, false);
@@ -2236,7 +2236,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void drawText (char[] string, int x, int y) {
+public void drawText (String string, int x, int y) {
     drawText(string, x, y, DWT.DRAW_DELIMITER | DWT.DRAW_TAB);
 }
 
@@ -2260,7 +2260,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void drawText (char[] string, int x, int y, bool isTransparent) {
+public void drawText (String string, int x, int y, bool isTransparent) {
     int flags = DWT.DRAW_DELIMITER | DWT.DRAW_TAB;
     if (isTransparent) flags |= DWT.DRAW_TRANSPARENT;
     drawText(string, x, y, flags);
@@ -2300,7 +2300,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void drawText (char[] string, int x, int y, int flags) {
+public void drawText (String string, int x, int y, int flags) {
     if (handle is null) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
     if (string is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     if (string.length is 0) return;
@@ -4686,7 +4686,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public Point stringExtent(char[] string) {
+public Point stringExtent(String string) {
     if (handle is null) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     checkGC(FONT);
@@ -4744,7 +4744,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public Point textExtent(char[] string) {
+public Point textExtent(String string) {
     return textExtent(string, DWT.DRAW_DELIMITER | DWT.DRAW_TAB);
 }
 
@@ -4779,7 +4779,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public Point textExtent(char[] string, int flags) {
+public Point textExtent(String string, int flags) {
     if (handle is null) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
     if (string is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     checkGC(FONT);
@@ -4830,7 +4830,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "GC {*DISPOSED*}";
     return Format( "GC {{{}}", handle );
 }
--- a/dwt/graphics/GlyphMetrics.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/GlyphMetrics.d	Mon May 05 00:12:38 2008 +0200
@@ -14,6 +14,8 @@
 
 import dwt.DWT;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
+
 /**
  * Instances of this class represent glyph metrics.
  * <p>
@@ -106,7 +108,7 @@
  *
  * @return a string representation of the <code>GlyphMetrics</code>
  */
-public override char[] toString () {
+public override String toString () {
     return Format( "GlyphMetrics {{{}, {}, {}}", ascent, descent, width ); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 }
 
--- a/dwt/graphics/Image.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Image.d	Mon May 05 00:12:38 2008 +0200
@@ -594,7 +594,7 @@
  *    <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
  * </ul>
  */
-public this (Device device, char[] filename) {
+public this (Device device, String filename) {
     if (device is null) device = Device.getDevice();
     if (device is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -2123,7 +2123,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "Image {*DISPOSED*}";
     return Format( "Image {{{}}", handle );
 }
--- a/dwt/graphics/ImageData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/ImageData.d	Mon May 05 00:12:38 2008 +0200
@@ -24,6 +24,7 @@
 
 public import dwt.dwthelper.InputStream;
 import dwt.dwthelper.System;
+import dwt.dwthelper.utils;
 
 
 /**
@@ -390,7 +391,7 @@
  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
  * </ul>
  */
-public this(char[] filename) {
+public this(String filename) {
     ImageData[] data = ImageDataLoader.load(filename);
     if (data.length < 1) DWT.error(DWT.ERROR_INVALID_IMAGE);
     ImageData i = data[0];
--- a/dwt/graphics/ImageDataLoader.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/ImageDataLoader.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 public import dwt.dwthelper.InputStream;
 
 import dwt.graphics.ImageLoader;
+import dwt.dwthelper.utils;
 
 /**
  * Internal class that separates ImageData from ImageLoader
@@ -27,7 +28,7 @@
         return (new ImageLoader()).load(stream);
     }
 
-    public static ImageData[] load(char[] filename) {
+    public static ImageData[] load(String filename) {
         return (new ImageLoader()).load(filename);
     }
 
--- a/dwt/graphics/ImageLoader.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/ImageLoader.d	Mon May 05 00:12:38 2008 +0200
@@ -23,6 +23,7 @@
 
 import tango.core.Exception;
 import tango.core.Array;
+import dwt.dwthelper.utils;
 
 
 /**
@@ -154,7 +155,7 @@
  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
  * </ul>
  */
-public ImageData[] load(char[] filename) {
+public ImageData[] load(String filename) {
     if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     InputStream stream = null;
     void close(){
@@ -240,7 +241,7 @@
  *    <li>ERROR_UNSUPPORTED_FORMAT - if the image data cannot be saved to the requested format</li>
  * </ul>
  */
-public void save(char[] filename, int format) {
+public void save(String filename, int format) {
     if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     OutputStream stream = null;
     try {
--- a/dwt/graphics/ImageLoaderEvent.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/ImageLoaderEvent.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 public import dwt.internal.DWTEventObject;
 public import dwt.graphics.ImageLoader;
 public import dwt.graphics.ImageData;
+import dwt.dwthelper.utils;
 
 import tango.text.convert.Format;
 
@@ -85,7 +86,7 @@
  *
  * @return a string representation of the event
  */
-public override char[] toString () {
+public override String toString () {
     return Format( "ImageLoaderEvent {source={} imageData={} incrementCount={} endOfImage={}}", source, imageData, incrementCount, endOfImage); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
 }
 
--- a/dwt/graphics/Path.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Path.d	Mon May 05 00:12:38 2008 +0200
@@ -29,6 +29,7 @@
 
 import dwt.dwthelper.System;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent paths through the two-dimensional
@@ -215,7 +216,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void addString(char[] string, float x, float y, Font font) {
+public void addString(String string, float x, float y, Font font) {
     if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
     if (font is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
     if (font.isDisposed()) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
@@ -518,7 +519,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString() {
+override public String toString() {
     if (isDisposed()) return "Path {*DISPOSED*}";
     return Format( "Path {{{}}", handle );
 }
--- a/dwt/graphics/Pattern.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Pattern.d	Mon May 05 00:12:38 2008 +0200
@@ -25,6 +25,7 @@
 import dwt.graphics.Image;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent patterns to use while drawing. Patterns
@@ -272,7 +273,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString() {
+override public String toString() {
     if (isDisposed()) return "Pattern {*DISPOSED*}";
     return Format( "Pattern {{{}}", handle );
 }
--- a/dwt/graphics/Point.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Point.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 public import dwt.internal.SerializableCompatibility;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent places on the (x, y)
@@ -104,7 +105,7 @@
  *
  * @return a string representation of the point
  */
-override public char[] toString () {
+override public String toString () {
     return Format( "Point {{{}, {}}", x, y );; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 }
 
--- a/dwt/graphics/RGB.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/RGB.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,7 @@
 import dwt.DWT;
 import Math = tango.math.Math : min, max;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are descriptions of colors in
@@ -223,7 +224,7 @@
  *
  * @return a String representation of the <code>RGB</code>
  */
-public override char[] toString() {
+public override String toString() {
     return Format( "RGB {{{}, {}, {}}", red, green, blue ); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 }
 
--- a/dwt/graphics/Rectangle.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Rectangle.d	Mon May 05 00:12:38 2008 +0200
@@ -18,6 +18,7 @@
 import dwt.DWT;
 import dwt.DWTError;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent rectangular areas in an
@@ -313,7 +314,7 @@
  *
  * @return a string representation of the rectangle
  */
-public override char[] toString () {
+public override String toString () {
     return Format( "Rectangle {{{}, {}, {}, {}}", x, y, width, height ); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
 }
 
--- a/dwt/graphics/Region.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Region.d	Mon May 05 00:12:38 2008 +0200
@@ -24,6 +24,7 @@
 import dwt.graphics.Device;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent areas of an x-y coordinate
@@ -590,7 +591,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "Region {*DISPOSED*}";
     return Format( "Region {{{}}", handle );
 }
--- a/dwt/graphics/TextLayout.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/TextLayout.d	Mon May 05 00:12:38 2008 +0200
@@ -52,7 +52,7 @@
  */
 public final class TextLayout : Resource {
     Font font;
-    char[] text, segmentsText;
+    String text, segmentsText;
     int lineSpacing;
     int ascent, descent;
     int alignment;
@@ -170,7 +170,7 @@
         x = 0;
         lineBreak = softBreak = false;
     }
-    override public char[] toString () {
+    override public String toString () {
         return Format( "StyleItem {{{}, {}}", start, style );
     }
     }
@@ -1736,7 +1736,7 @@
     return segments;
 }
 
-char[] getSegmentsText() {
+String getSegmentsText() {
     if (segments is null) return text;
     int nSegments = segments.length;
     if (nSegments <= 1) return text;
@@ -1857,7 +1857,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkLayout();
     return text;
 }
@@ -2358,7 +2358,7 @@
  *    <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
  * </ul>
  */
-public void setText (char[] text) {
+public void setText (String text) {
     checkLayout();
     //PORTING_CHANGE: allow null argument
     //if (text is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
@@ -2514,7 +2514,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
+override public String toString () {
     if (isDisposed()) return "TextLayout {*DISPOSED*}";
     return "TextLayout {}";
 }
--- a/dwt/graphics/TextStyle.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/TextStyle.d	Mon May 05 00:12:38 2008 +0200
@@ -18,6 +18,8 @@
 import dwt.graphics.GlyphMetrics;
 
 import tango.util.Convert;
+import dwt.dwthelper.utils;
+
 /**
  * <code>TextStyle</code> defines a set of styles that can be applied
  * to a range of text.
@@ -173,8 +175,8 @@
  *
  * @return a string representation of the <code>TextStyle</code>
  */
-override public char[] toString () {
-    char[] buffer = "TextStyle {";
+override public String toString () {
+    String buffer = "TextStyle {";
     int startLength = buffer.length;
     if (font !is null) {
         if (buffer.length > startLength) buffer ~= ", ";
@@ -202,7 +204,7 @@
     if (rise !is 0) {
         if (buffer.length > startLength) buffer ~= ", ";
         buffer ~= "rise=";
-        buffer ~= to!(char[])(rise);
+        buffer ~= to!(String)(rise);
     }
     if (metrics !is null) {
         if (buffer.length > startLength) buffer ~= ", ";
--- a/dwt/graphics/Transform.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/graphics/Transform.d	Mon May 05 00:12:38 2008 +0200
@@ -21,6 +21,7 @@
 import dwt.graphics.Device;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class represent transformation matrices for
@@ -343,7 +344,7 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString() {
+override public String toString() {
     if (isDisposed()) return "Transform {*DISPOSED*}";
     float[6] elements;
     getElements(elements);
--- a/dwt/internal/BidiUtil.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/BidiUtil.d	Mon May 05 00:12:38 2008 +0200
@@ -50,7 +50,7 @@
      * they are targeted for CLDC.
      */
     //  static Callback callback = new Callback (BidiUtil.class, "windowProc", 4);
-    static const char[] CLASS_NAME = "org.eclipse.swt.internal.BidiUtil"; //$NON-NLS-1$
+    static const String CLASS_NAME = "org.eclipse.swt.internal.BidiUtil"; //$NON-NLS-1$
 //     static this() {
 //         try {
 //             callback = new Callback (Class.forName (CLASS_NAME), "windowProc", 4); //$NON-NLS-1$
@@ -76,8 +76,8 @@
     static const int LANG_ARABIC = 0x01;
     static const int LANG_HEBREW = 0x0d;
     // code page identifiers
-    static const char[] CD_PG_HEBREW = "1255"; //$NON-NLS-1$
-    static const char[] CD_PG_ARABIC = "1256"; //$NON-NLS-1$
+    static const String CD_PG_HEBREW = "1255"; //$NON-NLS-1$
+    static const String CD_PG_ARABIC = "1256"; //$NON-NLS-1$
     // ActivateKeyboard constants
     static const int HKL_NEXT = 1;
     static const int HKL_PREV = 0;
@@ -169,7 +169,7 @@
  *  parameter. See org.eclipse.swt.custom.BidiSegmentEvent for details.
  * @return buffer with the glyphs that should be rendered for the given text
  */
-public static char[] getRenderInfo(GC gc, char[] text, int[] order, byte[] classBuffer, int[] dx, int flags, int [] offsets) {
+public static char[] getRenderInfo(GC gc, String text, int[] order, byte[] classBuffer, int[] dx, int flags, int [] offsets) {
     auto fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
     auto hHeap = OS.GetProcessHeap();
     int[8] lpCs;
@@ -302,7 +302,7 @@
  * @param offsets text segments that should be measured and reordered separately, input
  *  parameter. See org.eclipse.swt.custom.BidiSegmentEvent for details.
  */
-public static void getOrderInfo(GC gc, char[] text, int[] order, byte[] classBuffer, int flags, int [] offsets) {
+public static void getOrderInfo(GC gc, String text, int[] order, byte[] classBuffer, int flags, int [] offsets) {
     int fontLanguageInfo = OS.GetFontLanguageInfo(gc.handle);
     auto hHeap = OS.GetProcessHeap();
     int[8] lpCs;
@@ -466,7 +466,7 @@
     if (isBidiPlatform_ is 1) return true;
     // need to look at system code page for NT & 98 platforms since EnumSystemLanguageGroups is
     // not supported for these platforms
-    char[] codePage = to!(char[])(OS.GetACP());
+    String codePage = to!(String)(OS.GetACP());
     if (CD_PG_ARABIC==/*eq*/codePage || CD_PG_HEBREW==/*eq*/codePage) {
         isBidiPlatform_ = 1;
     }
--- a/dwt/internal/Compatibility.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/Compatibility.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -28,6 +28,7 @@
 import Math = tango.math.Math;
 import Unicode = tango.text.Unicode;
 import tango.sys.Process;
+import dwt.dwthelper.utils;
 
 /**
  * This class is a placeholder for utility methods commonly
@@ -163,7 +164,7 @@
  * @return a stream on the file if it could be opened.
  * @exception IOException
  */
-public static InputStream newFileInputStream(char[] filename) {
+public static InputStream newFileInputStream(String filename) {
     return new FileInputStream(filename);
 }
 
@@ -174,7 +175,7 @@
  * @return a stream on the file if it could be opened.
  * @exception IOException
  */
-public static OutputStream newFileOutputStream(char[] filename) {
+public static OutputStream newFileOutputStream(String filename) {
     return new FileOutputStream(filename);
 }
 
@@ -243,7 +244,7 @@
  * @exception ProcessException
  *  if the program cannot be executed
  */
-public static void exec(char[] prog) {
+public static void exec(String prog) {
     auto proc = new Process( prog );
     proc.execute;
 }
@@ -260,7 +261,7 @@
  * @exception ProcessException
  *  if the program cannot be executed
  */
-public static void exec(char[][] progArray) {
+public static void exec(String[] progArray) {
     auto proc = new Process( progArray );
     proc.execute;
 }
@@ -341,15 +342,15 @@
  * @param s2 string
  * @return true if the two instances of class String are equal
  */
-public static bool equalsIgnoreCase(char[] s1, char[] s2) {
-    char[] s1b = new char[ s1.length ];
-    char[] s2b = new char[ s1.length ];
+public static bool equalsIgnoreCase(String s1, String s2) {
+    String s1b = new char[ s1.length ];
+    String s2b = new char[ s1.length ];
     scope(exit){
         delete s1b;
         delete s2b;
     }
-    char[] s1c = Unicode.toFold( s1, s1b );
-    char[] s2c = Unicode.toFold( s2, s2b );
+    String s1c = Unicode.toFold( s1, s1b );
+    String s2c = Unicode.toFold( s2, s2b );
     return s1c == s2c;
 }
 
--- a/dwt/internal/DWTEventObject.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/DWTEventObject.d	Mon May 05 00:12:38 2008 +0200
@@ -32,7 +32,7 @@
     return source;
   }
 
-  public override char[] toString() {
+  public override String toString() {
     return this.classinfo.name ~ "[source=" ~ source.toString() ~ "]";
   }
 }
--- a/dwt/internal/Library.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/Library.d	Mon May 05 00:12:38 2008 +0200
@@ -13,6 +13,7 @@
 module dwt.internal.Library;
 
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 // do it here, so it can be evaluated at compile time
 // this saves a static ctor.
@@ -47,14 +48,14 @@
     public static const int SWT_VERSION = .buildSWT_VERSION(MAJOR_VERSION, MINOR_VERSION);
 
     version( Windows ){
-        static const char[] SEPARATOR = "\r\n";
+        static const String SEPARATOR = "\r\n";
     }
     else {
         static assert( false, "only windows supported for this port" );
     }
 
 
-static int parseVersion(char[] aVersion) {
+static int parseVersion(String aVersion) {
     if (aVersion == null) return 0;
     int major = 0, minor = 0, micro = 0;
     int length = aVersion.length, index = 0, start = 0;
@@ -101,7 +102,7 @@
     return .buildSWT_VERSION(major, minor);
 }
 /+ PORTING_LEFT
-static bool extract (char[] fileName, char[] mappedName) {
+static bool extract (String fileName, String mappedName) {
     FileOutputStream os = null;
     InputStream is = null;
     File file = new File(fileName);
@@ -137,7 +138,7 @@
     return false;
 }
 
-static bool load (char[] libName) {
+static bool load (String libName) {
     try {
         if (libName.indexOf (SEPARATOR) != -1) {
             System.load (libName);
@@ -160,7 +161,7 @@
  *
  * @param name the name of the library to load
  */
-public static void loadLibrary (char[] name) {
+public static void loadLibrary (String name) {
     loadLibrary (name, true);
 }
 
@@ -176,7 +177,7 @@
  * @param name the name of the library to load
  * @param mapName true if the name should be mapped, false otherwise
  */
-public static void loadLibrary (char[] name, boolean mapName) {
+public static void loadLibrary (String name, boolean mapName) {
 
     /* Compute the library name and mapped name */
     String libName1, libName2, mappedName1, mappedName2;
--- a/dwt/internal/Platform.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/Platform.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -9,9 +9,10 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 module dwt.internal.Platform;
+import dwt.dwthelper.utils;
 
 public class Platform {
-    
-public static const char[] PLATFORM = "win32"; //$NON-NLS-1$
+
+public static const String PLATFORM = "win32"; //$NON-NLS-1$
 
 }
--- a/dwt/internal/image/FileFormat.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/image/FileFormat.d	Mon May 05 00:12:38 2008 +0200
@@ -32,6 +32,7 @@
 
 import tango.core.Exception;
 import tango.core.Tuple;
+import dwt.dwthelper.utils;
 
 /**
  * Abstract factory class for loading/unloading images from files or streams
@@ -39,9 +40,9 @@
  *
  */
 public abstract class FileFormat {
-    static const char[] FORMAT_PACKAGE = "dwt.internal.image"; //$NON-NLS-1$
-    static const char[] FORMAT_SUFFIX = "FileFormat"; //$NON-NLS-1$
-    static const char[][] FORMATS = [ "WinBMP"[], "WinBMP", "GIF", "WinICO", "JPEG", "PNG", "TIFF", "OS2BMP" ]; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$//$NON-NLS-7$//$NON-NLS-8$
+    static const String FORMAT_PACKAGE = "dwt.internal.image"; //$NON-NLS-1$
+    static const String FORMAT_SUFFIX = "FileFormat"; //$NON-NLS-1$
+    static const String[] FORMATS = [ "WinBMP"[], "WinBMP", "GIF", "WinICO", "JPEG", "PNG", "TIFF", "OS2BMP" ]; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$//$NON-NLS-5$ //$NON-NLS-6$//$NON-NLS-7$//$NON-NLS-8$
     alias Tuple!( WinBMPFileFormat, WinBMPFileFormat, GIFFileFormat, WinICOFileFormat, JPEGFileFormat, PNGFileFormat, TIFFFileFormat, OS2BMPFileFormat ) TFormats;
     LEDataInputStream inputStream;
     LEDataOutputStream outputStream;
--- a/dwt/internal/image/GIFFileFormat.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/image/GIFFileFormat.d	Mon May 05 00:12:38 2008 +0200
@@ -23,9 +23,10 @@
 import dwt.graphics.ImageLoader;
 import tango.core.Exception;
 import dwt.dwthelper.System;
+import dwt.dwthelper.utils;
 
 final class GIFFileFormat : FileFormat {
-    char[] signature;
+    String signature;
     int screenWidth, screenHeight, backgroundPixel, bitsPerPixel, defaultDepth;
     int disposalMethod = 0;
     int delayTime = 0;
@@ -61,7 +62,7 @@
             byte[3] signature;
             stream.read(signature);
             stream.unread(signature);
-            return cast(char[])signature == "GIF"; //$NON-NLS-1$
+            return cast(String)signature == "GIF"; //$NON-NLS-1$
         } catch (Exception e) {
             return false;
         }
@@ -77,7 +78,7 @@
         byte[7] block;
         try {
             inputStream.read(signatureBytes);
-            signature = cast(char[])signatureBytes.dup;
+            signature = cast(String)signatureBytes.dup;
             if (signature != "GIF") //$NON-NLS-1$
                 DWT.error(DWT.ERROR_INVALID_IMAGE);
 
@@ -314,11 +315,11 @@
             // Read application identifier.
             byte[] applicationBytes = new byte[8];
             inputStream.read(applicationBytes);
-            char[] application = cast(char[])(applicationBytes.dup);
+            String application = cast(String)(applicationBytes.dup);
             // Read authentication code.
             byte[] authenticationBytes = new byte[3];
             inputStream.read(authenticationBytes);
-            char[] authentication = cast(char[])(authenticationBytes.dup);
+            String authentication = cast(String)(authenticationBytes.dup);
             // Read application data.
             byte[] data = new byte[0];
             byte[] block = new byte[255];
--- a/dwt/internal/image/JPEGDecoder.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/image/JPEGDecoder.d	Mon May 05 00:12:38 2008 +0200
@@ -25,6 +25,7 @@
 import tango.util.Convert;
 import Math = tango.math.Math;
 import dwt.dwthelper.System;
+import dwt.dwthelper.utils;
 
 public class JPEGDecoder {
 
@@ -2288,7 +2289,7 @@
     DWT.error(code);
 }
 
-static void error(char[] msg) {
+static void error(String msg) {
     DWT.error(DWT.ERROR_INVALID_IMAGE, null, msg);
 }
 
@@ -5833,7 +5834,7 @@
 
     /* For now, precision must match compiled-in value... */
     if (cinfo.data_precision !is BITS_IN_JSAMPLE)
-        error(" [data precision=" ~ to!(char[])(cinfo.data_precision) ~ "]");
+        error(" [data precision=" ~ to!(String)(cinfo.data_precision) ~ "]");
 //      ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo.data_precision);
 
     /* Check that number of components won't exceed internal array sizes */
--- a/dwt/internal/image/PngChunk.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/image/PngChunk.d	Mon May 05 00:12:38 2008 +0200
@@ -25,6 +25,7 @@
 import tango.core.Exception;
 import tango.text.convert.Format;
 import dwt.dwthelper.System;
+import dwt.dwthelper.utils;
 
 class PngChunk {
     byte[] reference;
@@ -374,7 +375,7 @@
  * Provided so that subclasses can override and add
  * data to the toString() call.
  */
-char[] contributeToString() {
+String contributeToString() {
     return "";
 }
 
@@ -384,10 +385,10 @@
  *
  * @return a string representation of the event
  */
-override public char[] toString() {
-    char[] buffer = Format( "{\n\tLength: {}\n\tType: {}{}\n\tCRC: {:X}\n}",
+override public String toString() {
+    String buffer = Format( "{\n\tLength: {}\n\tType: {}{}\n\tCRC: {:X}\n}",
         getLength(),
-        cast(char[]) getTypeBytes(),
+        cast(String) getTypeBytes(),
         contributeToString(),
         getCRC());
     return buffer;
--- a/dwt/internal/image/PngIhdrChunk.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/image/PngIhdrChunk.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -20,6 +20,7 @@
 import dwt.internal.image.PngIhdrChunk;
 import dwt.internal.image.PngChunk;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 class PngIhdrChunk : PngChunk {
     static const int IHDR_DATA_LENGTH = 13;
@@ -271,7 +272,7 @@
     }
 }
 
-char[] getColorTypeString() {
+String getColorTypeString() {
     switch (colorType) {
         case COLOR_TYPE_GRAYSCALE:              return "Grayscale";
         case COLOR_TYPE_RGB:                    return "RGB";
@@ -282,7 +283,7 @@
     }
 }
 
-char[] getFilterMethodString() {
+String getFilterMethodString() {
     switch (filterMethod) {
         case FILTER_NONE:       return "None";
         case FILTER_SUB:        return "Sub";
@@ -293,7 +294,7 @@
     }
 }
 
-char[] getInterlaceMethodString() {
+String getInterlaceMethodString() {
     switch (interlaceMethod) {
         case INTERLACE_METHOD_NONE:     return "Not Interlaced";
         case INTERLACE_METHOD_ADAM7:    return "Interlaced - ADAM7";
@@ -301,7 +302,7 @@
     }
 }
 
-override char[] contributeToString() {
+override String contributeToString() {
     return Format( "\n\tWidth: {}\n\tHeight: {}\n\tBit Depth: {}\n\tColor Type: {}\n\tCompression Method: {}\n\tFilter Method: {}\n\tInterlace Method: {}",
         width, height, bitDepth, getColorTypeString(), compressionMethod, getFilterMethodString(), getInterlaceMethodString() );
 }
--- a/dwt/internal/image/PngPlteChunk.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/image/PngPlteChunk.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -21,6 +21,7 @@
 import dwt.internal.image.PngIhdrChunk;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 class PngPlteChunk : PngChunk {
 
@@ -123,7 +124,7 @@
     if (256 < paletteSize) DWT.error(DWT.ERROR_INVALID_IMAGE);
 }
 
-override char[] contributeToString() {
+override String contributeToString() {
     return Format("\n\tPalette size:{}", paletteSize );
 }
 
--- a/dwt/internal/ole/win32/COM.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/internal/ole/win32/COM.d	Mon May 05 00:12:38 2008 +0200
@@ -24,13 +24,14 @@
 private import dwt.internal.ole.win32.extras;
 private import dwt.internal.ole.win32.ifs;
 private import dwt.internal.ole.win32.COMAPI;
+import dwt.dwthelper.utils;
 
 private alias dwt.internal.ole.win32.COMAPI COMAPI;
 
 
 public import dwt.internal.win32.OS;
 
-template IIDFromStringT(char[] g) {
+template IIDFromStringT(String g) {
    static if (g.length == 38)
      const GUID IIDFromStringT = IIDFromStringT!(g[1..$-1]);
    else static if (g.length == 36)
@@ -103,7 +104,7 @@
     //public static const GUID IIDIExternalConnection = IIDFromStringT!("{00000019-0000-0000-C000-000000000046}"); //$NON-NLS-1$
     public static const GUID IIDIFont = IIDFromStringT!("{BEF6E002-A874-101A-8BBA-00AA00300CAB}"); //$NON-NLS-1$
     //public static const GUID IIDIFontDisp = IIDFromStringT!("{BEF6E003-A874-101A-8BBA-00AA00300CAB}"); //$NON-NLS-1$
-    public static const /*GUID*/ char[] IIDIHTMLDocumentEvents2 = /*IIDFromStringT!(*/"{3050F613-98B5-11CF-BB82-00AA00BDCE0B}"/*)*/;
+    public static const /*GUID*/ String IIDIHTMLDocumentEvents2 = /*IIDFromStringT!(*/"{3050F613-98B5-11CF-BB82-00AA00BDCE0B}"/*)*/;
     public static const GUID IIDIInternetSecurityManager = IIDFromStringT!("{79eac9ee-baf9-11ce-8c82-00aa004ba90b}"); //$NON-NLS-1$
     //public static const GUID IIDILockBytes = IIDFromStringT!("{0000000A-0000-0000-C000-000000000046}"); //$NON-NLS-1$
     //public static const GUID IIDIMalloc = IIDFromStringT!("{00000002-0000-0000-C000-000000000046}"); //$NON-NLS-1$
@@ -441,7 +442,7 @@
 
 
 // alias dwt.internal.ole.win32.comapi.
-// public static GUID* IIDFromString(char[] lpsz) {
+// public static GUID* IIDFromString(String lpsz) {
 // 	GUID* lpiid = new GUID();
 // 	if (COM.IIDFromString(Converter.StrToWCHARz(lpsz), lpiid) == COM.S_OK)
 // 		return lpiid;
@@ -853,10 +854,10 @@
  */
 // BSTR is aliased to wchar*
 // Note : Free the "bstr" memory if freeTheString is true, default false
-char[] BSTRToStr( /*BSTR*/ inout wchar* bstr, bool freeTheString = false){
+String BSTRToStr( /*BSTR*/ inout wchar* bstr, bool freeTheString = false){
     if(bstr is null) return null;
     int size = (SysStringByteLen(bstr) + 1)/wchar.sizeof;
-    char[] result = WCHARzToStr(bstr, size);
+    String result = WCHARzToStr(bstr, size);
     if(freeTheString) {
         // free the string and set ptr to null
         SysFreeString(bstr);
--- a/dwt/layout/FillLayout.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/FillLayout.d	Mon May 05 00:12:38 2008 +0200
@@ -179,8 +179,8 @@
     return true;
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
+String getName () {
+    String string = this.classinfo.name;
     int index = string.lastIndexOf( '.');
     if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
@@ -232,12 +232,12 @@
  *
  * @return a string representation of the layout
  */
-override public char[] toString () {
-    char[] string = getName () ~ " {";
+override public String toString () {
+    String string = getName () ~ " {";
     string ~= "type="~((type is DWT.VERTICAL) ? "DWT.VERTICAL" : "DWT.HORIZONTAL")~" ";
-    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
-    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
-    if (spacing !is 0) string ~= "spacing="~to!(char[])(spacing)~" ";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(String)(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(String)(marginHeight)~" ";
+    if (spacing !is 0) string ~= "spacing="~to!(String)(spacing)~" ";
     string = string.trim();
     string ~= "}";
     return string;
--- a/dwt/layout/FormAttachment.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/FormAttachment.d	Mon May 05 00:12:38 2008 +0200
@@ -18,6 +18,7 @@
 import dwt.layout.FormData;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are used to define the edges of a control
@@ -298,8 +299,8 @@
  *
  * @return a string representation of the FormAttachment
  */
-public override char[] toString () {
-    char[] string = control !is null ? control.toString () : Format( "{}/{}", numerator, denominator );
+public override String toString () {
+    String string = control !is null ? control.toString () : Format( "{}/{}", numerator, denominator );
     return Format("{{y = ({})x + {}}", string, ( offset >= 0 ? Format(")x + {}", offset ) : Format( ")x - {}", -offset)));
 }
 
--- a/dwt/layout/FormData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/FormData.d	Mon May 05 00:12:38 2008 +0200
@@ -18,8 +18,8 @@
 import dwt.widgets.Control;
 import dwt.layout.FormAttachment;
 
-import tango.text.Util;
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are used to define the attachments
@@ -238,10 +238,10 @@
     return cacheLeft;
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
-    int index = locatePrior( string, '.');
-    if (index is string.length ) return string;
+String getName () {
+    String string = this.classinfo.name;
+    int index = string.lastIndexOf( '.');
+    if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
 }
 
@@ -333,15 +333,15 @@
  *
  * @return a string representation of the FormData object
  */
-override public char[] toString () {
-    char[] string = getName()~" {";
-    if (width !is DWT.DEFAULT) string ~= "width="~to!(char[])(width)~" ";
-    if (height !is DWT.DEFAULT) string ~= "height="~to!(char[])(height)~" ";
-    if (left !is null) string ~= "left="~to!(char[])(left)~" ";
-    if (right !is null) string ~= "right="~to!(char[])(right)~" ";
-    if (top !is null) string ~= "top="~to!(char[])(top)~" ";
-    if (bottom !is null) string ~= "bottom="~to!(char[])(bottom)~" ";
-    string = trim( string );
+override public String toString () {
+    String string = getName()~" {";
+    if (width !is DWT.DEFAULT) string ~= "width="~to!(String)(width)~" ";
+    if (height !is DWT.DEFAULT) string ~= "height="~to!(String)(height)~" ";
+    if (left !is null) string ~= "left="~to!(String)(left)~" ";
+    if (right !is null) string ~= "right="~to!(String)(right)~" ";
+    if (top !is null) string ~= "top="~to!(String)(top)~" ";
+    if (bottom !is null) string ~= "bottom="~to!(String)(bottom)~" ";
+    string = string.trim();
     string ~= "}";
     return string;
 }
--- a/dwt/layout/FormLayout.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/FormLayout.d	Mon May 05 00:12:38 2008 +0200
@@ -22,9 +22,9 @@
 import dwt.widgets.Composite;
 import dwt.widgets.Scrollable;
 
-import tango.text.Util;
 import tango.util.Convert;
 import Math = tango.math.Math;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class control the position and size of the
@@ -260,10 +260,10 @@
     return true;
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
-    int index = locatePrior( string, '.');
-    if (index is string.length ) return string;
+String getName () {
+    String string = this.classinfo.name;
+    int index = string.lastIndexOf('.');
+    if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
 }
 
@@ -379,16 +379,16 @@
  *
  * @return a string representation of the layout
  */
-override public char[] toString () {
-    char[] string =  getName ()~" {";
-    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
-    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
-    if (marginLeft !is 0) string ~= "marginLeft="~to!(char[])(marginLeft)~" ";
-    if (marginRight !is 0) string ~= "marginRight="~to!(char[])(marginRight)~" ";
-    if (marginTop !is 0) string ~= "marginTop="~to!(char[])(marginTop)~" ";
-    if (marginBottom !is 0) string ~= "marginBottom="~to!(char[])(marginBottom)~" ";
-    if (spacing !is 0) string ~= "spacing="~to!(char[])(spacing)~" ";
-    string = trim( string );
+override public String toString () {
+    String string =  getName ()~" {";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(String)(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(String)(marginHeight)~" ";
+    if (marginLeft !is 0) string ~= "marginLeft="~to!(String)(marginLeft)~" ";
+    if (marginRight !is 0) string ~= "marginRight="~to!(String)(marginRight)~" ";
+    if (marginTop !is 0) string ~= "marginTop="~to!(String)(marginTop)~" ";
+    if (marginBottom !is 0) string ~= "marginBottom="~to!(String)(marginBottom)~" ";
+    if (spacing !is 0) string ~= "spacing="~to!(String)(spacing)~" ";
+    string = string.trim();
     string ~= "}";
     return string;
 }
--- a/dwt/layout/GridData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/GridData.d	Mon May 05 00:12:38 2008 +0200
@@ -16,8 +16,8 @@
 import dwt.graphics.Point;
 import dwt.widgets.Control;
 
-import tango.text.Util;
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 /**
  * <code>GridData</code> is the layout data object associated with
@@ -503,10 +503,10 @@
     currentWidth = currentHeight = -1;
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
-    int index = locatePrior( string, '.');
-    if (index is string.length ) return string;
+String getName () {
+    String string = this.classinfo.name;
+    int index = string.lastIndexOf('.');
+    if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
 }
 
@@ -516,8 +516,8 @@
  *
  * @return a string representation of the GridData object
  */
-override public char[] toString () {
-    char[] hAlign = "";
+override public String toString () {
+    String hAlign = "";
     switch (horizontalAlignment) {
         case DWT.FILL: hAlign = "DWT.FILL"; break;
         case DWT.BEGINNING: hAlign = "DWT.BEGINNING"; break;
@@ -527,9 +527,9 @@
         case DWT.RIGHT: hAlign = "DWT.RIGHT"; break;
         case DWT.CENTER: hAlign = "DWT.CENTER"; break;
         case CENTER: hAlign = "GridData.CENTER"; break;
-        default: hAlign = "Undefined "~to!(char[])(horizontalAlignment); break;
+        default: hAlign = "Undefined "~to!(String)(horizontalAlignment); break;
     }
-    char[] vAlign = "";
+    String vAlign = "";
     switch (verticalAlignment) {
         case DWT.FILL: vAlign = "DWT.FILL"; break;
         case DWT.BEGINNING: vAlign = "DWT.BEGINNING"; break;
@@ -539,22 +539,22 @@
         case DWT.BOTTOM: vAlign = "DWT.BOTTOM"; break;
         case DWT.CENTER: vAlign = "DWT.CENTER"; break;
         case CENTER: vAlign = "GridData.CENTER"; break;
-        default: vAlign = "Undefined "~to!(char[])(verticalAlignment); break;
+        default: vAlign = "Undefined "~to!(String)(verticalAlignment); break;
     }
-    char[] string = getName()~" {";
-    string ~= "horizontalAlignment="~to!(char[])(hAlign)~" ";
-    if (horizontalIndent !is 0) string ~= "horizontalIndent="~to!(char[])(horizontalIndent)~" ";
-    if (horizontalSpan !is 1) string ~= "horizontalSpan="~to!(char[])(horizontalSpan)~" ";
-    if (grabExcessHorizontalSpace) string ~= "grabExcessHorizontalSpace="~to!(char[])(grabExcessHorizontalSpace)~" ";
-    if (widthHint !is DWT.DEFAULT) string ~= "widthHint="~to!(char[])(widthHint)~" ";
-    if (minimumWidth !is 0) string ~= "minimumWidth="~to!(char[])(minimumWidth)~" ";
+    String string = getName()~" {";
+    string ~= "horizontalAlignment="~to!(String)(hAlign)~" ";
+    if (horizontalIndent !is 0) string ~= "horizontalIndent="~to!(String)(horizontalIndent)~" ";
+    if (horizontalSpan !is 1) string ~= "horizontalSpan="~to!(String)(horizontalSpan)~" ";
+    if (grabExcessHorizontalSpace) string ~= "grabExcessHorizontalSpace="~to!(String)(grabExcessHorizontalSpace)~" ";
+    if (widthHint !is DWT.DEFAULT) string ~= "widthHint="~to!(String)(widthHint)~" ";
+    if (minimumWidth !is 0) string ~= "minimumWidth="~to!(String)(minimumWidth)~" ";
     string ~= "verticalAlignment="~vAlign~" ";
-    if (verticalIndent !is 0) string ~= "verticalIndent="~to!(char[])(verticalIndent)~" ";
-    if (verticalSpan !is 1) string ~= "verticalSpan="~to!(char[])(verticalSpan)~" ";
-    if (grabExcessVerticalSpace) string ~= "grabExcessVerticalSpace="~to!(char[])(grabExcessVerticalSpace)~" ";
-    if (heightHint !is DWT.DEFAULT) string ~= "heightHint="~to!(char[])(heightHint)~" ";
-    if (minimumHeight !is 0) string ~= "minimumHeight="~to!(char[])(minimumHeight)~" ";
-    if (exclude) string ~= "exclude="~to!(char[])(exclude)~" ";
+    if (verticalIndent !is 0) string ~= "verticalIndent="~to!(String)(verticalIndent)~" ";
+    if (verticalSpan !is 1) string ~= "verticalSpan="~to!(String)(verticalSpan)~" ";
+    if (grabExcessVerticalSpace) string ~= "grabExcessVerticalSpace="~to!(String)(grabExcessVerticalSpace)~" ";
+    if (heightHint !is DWT.DEFAULT) string ~= "heightHint="~to!(String)(heightHint)~" ";
+    if (minimumHeight !is 0) string ~= "minimumHeight="~to!(String)(minimumHeight)~" ";
+    if (exclude) string ~= "exclude="~to!(String)(exclude)~" ";
     string = string.trim();
     string ~= "}";
     return string;
--- a/dwt/layout/GridLayout.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/GridLayout.d	Mon May 05 00:12:38 2008 +0200
@@ -23,9 +23,9 @@
 
 import dwt.dwthelper.System;
 
-import tango.text.Util;
 import tango.util.Convert;
 import Math = tango.math.Math;
+import dwt.dwthelper.utils;
 
 
 /**
@@ -726,10 +726,10 @@
     return new Point (totalDefaultWidth, totalDefaultHeight);
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
-    int index = locatePrior( string, '.');
-    if (index is string.length ) return string;
+String getName () {
+    String string = this.classinfo.name;
+    int index = string.lastIndexOf('.');
+    if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
 }
 
@@ -739,18 +739,18 @@
  *
  * @return a string representation of the layout
  */
-override public char[] toString () {
-    char[] string = getName ()~" {";
-    if (numColumns !is 1) string ~= "numColumns="~to!(char[])(numColumns)~" ";
-    if (makeColumnsEqualWidth) string ~= "makeColumnsEqualWidth="~to!(char[])(makeColumnsEqualWidth)~" ";
-    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
-    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
-    if (marginLeft !is 0) string ~= "marginLeft="~to!(char[])(marginLeft)~" ";
-    if (marginRight !is 0) string ~= "marginRight="~to!(char[])(marginRight)~" ";
-    if (marginTop !is 0) string ~= "marginTop="~to!(char[])(marginTop)~" ";
-    if (marginBottom !is 0) string ~= "marginBottom="~to!(char[])(marginBottom)~" ";
-    if (horizontalSpacing !is 0) string ~= "horizontalSpacing="~to!(char[])(horizontalSpacing)~" ";
-    if (verticalSpacing !is 0) string ~= "verticalSpacing="~to!(char[])(verticalSpacing)~" ";
+override public String toString () {
+    String string = getName ()~" {";
+    if (numColumns !is 1) string ~= "numColumns="~to!(String)(numColumns)~" ";
+    if (makeColumnsEqualWidth) string ~= "makeColumnsEqualWidth="~to!(String)(makeColumnsEqualWidth)~" ";
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(String)(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(String)(marginHeight)~" ";
+    if (marginLeft !is 0) string ~= "marginLeft="~to!(String)(marginLeft)~" ";
+    if (marginRight !is 0) string ~= "marginRight="~to!(String)(marginRight)~" ";
+    if (marginTop !is 0) string ~= "marginTop="~to!(String)(marginTop)~" ";
+    if (marginBottom !is 0) string ~= "marginBottom="~to!(String)(marginBottom)~" ";
+    if (horizontalSpacing !is 0) string ~= "horizontalSpacing="~to!(String)(horizontalSpacing)~" ";
+    if (verticalSpacing !is 0) string ~= "verticalSpacing="~to!(String)(verticalSpacing)~" ";
     string = string.trim();
     string ~= "}";
     return string;
--- a/dwt/layout/RowData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/RowData.d	Mon May 05 00:12:38 2008 +0200
@@ -16,8 +16,8 @@
 import dwt.graphics.Point;
 import dwt.widgets.Control;
 
-import tango.text.Util;
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 /**
  * Each control controlled by a <code>RowLayout</code> can have its initial
@@ -105,10 +105,10 @@
     this (point.x, point.y);
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
-    int index = locatePrior( string, '.');
-    if (index is string.length ) return string;
+String getName () {
+    String string = this.classinfo.name;
+    int index = string.lastIndexOf('.');
+    if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
 }
 
@@ -118,12 +118,12 @@
  *
  * @return a string representation of the RowData object
  */
-override public char[] toString () {
-    char[] string = getName ()~" {";
-    if (width !is DWT.DEFAULT) string ~= "width="~to!(char[])(width)~" ";
-    if (height !is DWT.DEFAULT) string ~= "height="~to!(char[])(height)~" ";
-    if (exclude) string ~= "exclude="~to!(char[])(exclude)~" ";
-    string = trim( string );
+override public String toString () {
+    String string = getName ()~" {";
+    if (width !is DWT.DEFAULT) string ~= "width="~to!(String)(width)~" ";
+    if (height !is DWT.DEFAULT) string ~= "height="~to!(String)(height)~" ";
+    if (exclude) string ~= "exclude="~to!(String)(exclude)~" ";
+    string = string.trim();
     string ~= "}";
     return string;
 }
--- a/dwt/layout/RowLayout.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/layout/RowLayout.d	Mon May 05 00:12:38 2008 +0200
@@ -19,9 +19,9 @@
 import dwt.widgets.Layout;
 import dwt.widgets.Composite;
 import dwt.layout.RowData;
-import tango.text.Util;
 import tango.util.Convert;
 import Math = tango.math.Math;
+import dwt.dwthelper.utils;
 
 
 /**
@@ -220,10 +220,10 @@
     return true;
 }
 
-char[] getName () {
-    char[] string = this.classinfo.name;
-    int index = locatePrior( string, '.');
-    if (index is string.length ) return string;
+String getName () {
+    String string = this.classinfo.name;
+    int index = string.lastIndexOf('.');
+    if (index is -1 ) return string;
     return string[ index + 1 .. string.length ];
 }
 
@@ -456,21 +456,21 @@
  *
  * @return a string representation of the layout
  */
-override public char[] toString () {
-    char[] string = getName ()~" {";
+override public String toString () {
+    String string = getName ()~" {";
     string ~= "type="~((type !is DWT.HORIZONTAL) ? "DWT.VERTICAL" : "DWT.HORIZONTAL")~" ";
-    if (marginWidth !is 0) string ~= "marginWidth="~to!(char[])(marginWidth)~" ";
-    if (marginHeight !is 0) string ~= "marginHeight="~to!(char[])(marginHeight)~" ";
-    if (marginLeft !is 0) string ~= "marginLeft="~to!(char[])(marginLeft)~" ";
-    if (marginTop !is 0) string ~= "marginTop="~to!(char[])(marginTop)~" ";
-    if (marginRight !is 0) string ~= "marginRight="~to!(char[])(marginRight)~" ";
-    if (marginBottom !is 0) string ~= "marginBottom="~to!(char[])(marginBottom)~" ";
-    if (spacing !is 0) string ~= "spacing="~to!(char[])(spacing)~" ";
-    string ~= "wrap="~to!(char[])(wrap)~" ";
-    string ~= "pack="~to!(char[])(pack)~" ";
-    string ~= "fill="~to!(char[])(fill)~" ";
-    string ~= "justify="~to!(char[])(justify)~" ";
-    string = trim( string );
+    if (marginWidth !is 0) string ~= "marginWidth="~to!(String)(marginWidth)~" ";
+    if (marginHeight !is 0) string ~= "marginHeight="~to!(String)(marginHeight)~" ";
+    if (marginLeft !is 0) string ~= "marginLeft="~to!(String)(marginLeft)~" ";
+    if (marginTop !is 0) string ~= "marginTop="~to!(String)(marginTop)~" ";
+    if (marginRight !is 0) string ~= "marginRight="~to!(String)(marginRight)~" ";
+    if (marginBottom !is 0) string ~= "marginBottom="~to!(String)(marginBottom)~" ";
+    if (spacing !is 0) string ~= "spacing="~to!(String)(spacing)~" ";
+    string ~= "wrap="~to!(String)(wrap)~" ";
+    string ~= "pack="~to!(String)(pack)~" ";
+    string ~= "fill="~to!(String)(fill)~" ";
+    string ~= "justify="~to!(String)(justify)~" ";
+    string = string.trim();
     string ~= "}";
     return string;
 }
--- a/dwt/ole/win32/OLE.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OLE.d	Mon May 05 00:12:38 2008 +0200
@@ -38,8 +38,8 @@
     public static const int E_NOINTERFACE = -2147467262;  // QueryInterface did not recognize the requested interface.
     public static const int E_NOTIMPL = -2147467263; // Not implemented
 
-    public static const char[] IID_IUNKNOWN = "{00000000-0000-0000-C000-000000000046}"; //$NON-NLS-1$
-    public static const char[] IID_IDISPATCH = "{00020400-0000-0000-C000-000000000046}"; //$NON-NLS-1$
+    public static const String IID_IUNKNOWN = "{00000000-0000-0000-C000-000000000046}"; //$NON-NLS-1$
+    public static const String IID_IDISPATCH = "{00020400-0000-0000-C000-000000000046}"; //$NON-NLS-1$
 
     // Verbs that can be invoked on this client
     public static const int OLEIVERB_DISCARDUNDOSTATE = -6; // close the OLE object and discard the undo state
@@ -269,28 +269,28 @@
     public static const int CC_MPWPASCAL = 8;
     public static const int CC_MAX = 9;
 
-    static const char[] ERROR_NOT_IMPLEMENTED_MSG = "Required functionality not currently supported.";//$NON-NLS-1$
-    static const char[] ERROR_CANNOT_CREATE_FILE_MSG = "Failed to create file.";//$NON-NLS-1$
-    static const char[] ERROR_CANNOT_CREATE_OBJECT_MSG = "Failed to create Ole Client.";//$NON-NLS-1$
-    static const char[] ERROR_CANNOT_OPEN_FILE_MSG = "File does not exist, is not accessible to user or does not have the correct format.";//$NON-NLS-1$
-    static const char[] ERROR_INTERFACE_NOT_FOUND_MSG = "Failed to find requested interface on OLE Object.";//$NON-NLS-1$
-    static const char[] ERROR_INVALID_CLASSID_MSG = "Class ID not found in registry";//$NON-NLS-1$
-    static const char[] ERROR_CANNOT_ACCESS_CLASSFACTORY_MSG = "Failed to get the class factory for the specified classID";//$NON-NLS-1$
-    static const char[] ERROR_CANNOT_CREATE_LICENSED_OBJECT_MSG = "Failed to create Licensed instance";//$NON-NLS-1$
-    static const char[] ERROR_OUT_OF_MEMORY_MSG = "Out of Memory";//$NON-NLS-1$
-    static const char[] ERROR_CANNOT_CHANGE_VARIANT_TYPE_MSG = "Failed to change Variant type";//$NON-NLS-1$
-    static const char[] ERROR_INVALID_INTERFACE_ADDRESS_MSG = "Invalid address received for Ole Interface.";//$NON-NLS-1$
-    static const char[] ERROR_APPLICATION_NOT_FOUND_MSG = "Unable to find Application.";//$NON-NLS-1$
-    static const char[] ERROR_ACTION_NOT_PERFORMED_MSG = "Action can not be performed.";//$NON-NLS-1$
+    static const String ERROR_NOT_IMPLEMENTED_MSG = "Required functionality not currently supported.";//$NON-NLS-1$
+    static const String ERROR_CANNOT_CREATE_FILE_MSG = "Failed to create file.";//$NON-NLS-1$
+    static const String ERROR_CANNOT_CREATE_OBJECT_MSG = "Failed to create Ole Client.";//$NON-NLS-1$
+    static const String ERROR_CANNOT_OPEN_FILE_MSG = "File does not exist, is not accessible to user or does not have the correct format.";//$NON-NLS-1$
+    static const String ERROR_INTERFACE_NOT_FOUND_MSG = "Failed to find requested interface on OLE Object.";//$NON-NLS-1$
+    static const String ERROR_INVALID_CLASSID_MSG = "Class ID not found in registry";//$NON-NLS-1$
+    static const String ERROR_CANNOT_ACCESS_CLASSFACTORY_MSG = "Failed to get the class factory for the specified classID";//$NON-NLS-1$
+    static const String ERROR_CANNOT_CREATE_LICENSED_OBJECT_MSG = "Failed to create Licensed instance";//$NON-NLS-1$
+    static const String ERROR_OUT_OF_MEMORY_MSG = "Out of Memory";//$NON-NLS-1$
+    static const String ERROR_CANNOT_CHANGE_VARIANT_TYPE_MSG = "Failed to change Variant type";//$NON-NLS-1$
+    static const String ERROR_INVALID_INTERFACE_ADDRESS_MSG = "Invalid address received for Ole Interface.";//$NON-NLS-1$
+    static const String ERROR_APPLICATION_NOT_FOUND_MSG = "Unable to find Application.";//$NON-NLS-1$
+    static const String ERROR_ACTION_NOT_PERFORMED_MSG = "Action can not be performed.";//$NON-NLS-1$
 
 
-public static void error (char[] file, long line, int code) {
+public static void error (String file, long line, int code) {
     error (code, 0);
 }
 public static void error (int code) {
     error (code, 0);
 }
-public static void error (char[] file, long line, int code, int hresult) {
+public static void error (String file, long line, int code, int hresult) {
     error (code, hresult);
 }
 public static void error (int code, int hresult) {
@@ -303,60 +303,60 @@
 
         /* DWT Errors (non-fatal) */
         case ERROR_CANNOT_CREATE_FILE : {
-            char[] msg = ERROR_CANNOT_CREATE_FILE_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_CANNOT_CREATE_FILE_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_CANNOT_CREATE_OBJECT : {
-            char[] msg = ERROR_CANNOT_CREATE_OBJECT_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_CANNOT_CREATE_OBJECT_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);//$NON-NLS-1$
         }
         case ERROR_CANNOT_OPEN_FILE : {
-            char[] msg = ERROR_CANNOT_OPEN_FILE_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_CANNOT_OPEN_FILE_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_INTERFACE_NOT_FOUND : {
-            char[] msg = ERROR_INTERFACE_NOT_FOUND_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_INTERFACE_NOT_FOUND_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_INVALID_CLASSID : {
-            char[] msg = ERROR_INVALID_CLASSID_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_INVALID_CLASSID_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_CANNOT_ACCESS_CLASSFACTORY : {
-            char[] msg = ERROR_CANNOT_ACCESS_CLASSFACTORY_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_CANNOT_ACCESS_CLASSFACTORY_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_CANNOT_CREATE_LICENSED_OBJECT : {
-            char[] msg = ERROR_CANNOT_CREATE_LICENSED_OBJECT_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_CANNOT_CREATE_LICENSED_OBJECT_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_CANNOT_CHANGE_VARIANT_TYPE : {
-            char[] msg = ERROR_CANNOT_CHANGE_VARIANT_TYPE_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_CANNOT_CHANGE_VARIANT_TYPE_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_APPLICATION_NOT_FOUND : {
-            char[] msg = ERROR_APPLICATION_NOT_FOUND_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_APPLICATION_NOT_FOUND_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
         case ERROR_ACTION_NOT_PERFORMED : {
-            char[] msg = ERROR_ACTION_NOT_PERFORMED_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult);//$NON-NLS-1$
+            String msg = ERROR_ACTION_NOT_PERFORMED_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult);//$NON-NLS-1$
             throw new DWTException (code, msg);
         }
 
         /* OS Failure/Limit (fatal, may occur only on some platforms) */
         case ERROR_OUT_OF_MEMORY : {
-            char[] msg = ERROR_ACTION_NOT_PERFORMED_MSG;
-            if (hresult !is 0) msg ~= " result = "~to!(char[])(hresult); //$NON-NLS-1$
+            String msg = ERROR_ACTION_NOT_PERFORMED_MSG;
+            if (hresult !is 0) msg ~= " result = "~to!(String)(hresult); //$NON-NLS-1$
             throw new DWTError (code, msg);
         }
         default:
@@ -378,7 +378,7 @@
  *      <li>ERROR_NULL_ARGUMENT when extension is null</li>
  *  </ul>
  */
-public static char[] findProgramID (char[] extension) {
+public static String findProgramID (String extension) {
     if (extension is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     if (extension.length is 0) return ""; //$NON-NLS-1$
 
@@ -386,7 +386,7 @@
 
     /* Use the character encoding for the default locale */
     TCHAR[] extensionKey = StrToTCHARs(0, extension, true);
-    char[] result = getKeyValue(extensionKey);
+    String result = getKeyValue(extensionKey);
     if (result !is null) {
         // look for "<programID>\NotInsertable"
         TCHAR[] notInsertableKey = StrToTCHARs(0, result~"\\NotInsertable", true); //$NON-NLS-1$
@@ -401,12 +401,12 @@
 
     return ""; //$NON-NLS-1$
 }
-static char[] getKeyValue (TCHAR[] key) {
+static String getKeyValue (TCHAR[] key) {
     void* [1] phkResult;
     if (OS.RegOpenKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, key.ptr, 0, OS.KEY_READ, phkResult.ptr) !is 0) {
         return null;
     }
-    char[] result = null;
+    String result = null;
     uint [1] lpcbData;
     if (OS.RegQueryValueEx (phkResult [0], null, null, null, null, lpcbData.ptr) is 0) {
         int length_ = lpcbData [0] / TCHAR.sizeof;
--- a/dwt/ole/win32/OleAutomation.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OleAutomation.d	Mon May 05 00:12:38 2008 +0200
@@ -102,7 +102,7 @@
  */
 public final class OleAutomation {
     private IDispatch objIDispatch;
-    private char[] exceptionDescription;
+    private String exceptionDescription;
     private ITypeInfo objITypeInfo;
 
 this(IDispatch idispatch) {
@@ -156,23 +156,23 @@
 IDispatch getAddress() {
     return objIDispatch;
 }
-public char[] getHelpFile(int dispId) {
+public String getHelpFile(int dispId) {
     if (objITypeInfo is null) return null;
     BSTR file;
     HRESULT rc = objITypeInfo.GetDocumentation(dispId, null, null, null, &file );
     if (rc is OLE.S_OK) {
-        char[] str = WCHARzToStr( file, -1 );
+        String str = WCHARzToStr( file, -1 );
         COM.SysFreeString(file);
         return str;
     }
     return null;
 }
-public char[] getDocumentation(int dispId) {
+public String getDocumentation(int dispId) {
     if (objITypeInfo is null) return null;
     BSTR doc;
     HRESULT rc = objITypeInfo.GetDocumentation(dispId, null, &doc, null, null );
     if (rc == OLE.S_OK) {
-        char[] s = WCHARzToStr(doc, -1);
+        String s = WCHARzToStr(doc, -1);
         COM.SysFreeString(doc);
         return s;
     }
@@ -221,7 +221,7 @@
     data.documentation = getDocumentation(funcdesc.memid);
     data.helpFile = getHelpFile(funcdesc.memid);
 
-    char[][] names = getNames(funcdesc.memid, funcdesc.cParams + 1);
+    String[] names = getNames(funcdesc.memid, funcdesc.cParams + 1);
     if (names.length > 0) {
         data.name = names[0];
     }
@@ -267,25 +267,25 @@
     return typeattr;
 }
 
-public char[] getName(int dispId) {
+public String getName(int dispId) {
     if (objITypeInfo is null) return null;
     BSTR name;
     HRESULT rc = objITypeInfo.GetDocumentation(dispId, &name, null, null, null );
     if (rc == OLE.S_OK) {
-        char[] s = WCHARzToStr(name, -1);
+        String s = WCHARzToStr(name, -1);
         COM.SysFreeString(name);
         return s;
     }
     return null;
 }
 
-public char[][] getNames(int dispId, int maxSize) {
-    if (objITypeInfo is null) return new char[][0];
+public String[] getNames(int dispId, int maxSize) {
+    if (objITypeInfo is null) return new String[0];
     BSTR[] names = new BSTR[maxSize];
     uint count;
     HRESULT rc = objITypeInfo.GetNames(dispId, names.ptr, maxSize, &count);
     if (rc == OLE.S_OK) {
-        char[][] newNames = new char[][count];
+        String[] newNames = new String[count];
         for(int i=0; i<count; ++i){
             newNames[i] = WCHARzToStr(names[i], -1);
             COM.SysFreeString(names[i]);
@@ -304,7 +304,7 @@
  * @return positive integer values that are associated with the specified names in the same
  *         order as the names where provided; or null if the names are unknown
  */
-public int[] getIDsOfNames(char[][] names) {
+public int[] getIDsOfNames(String[] names) {
 
     int count = names.length;
     wchar*[] wcNames = new wchar*[count];
@@ -324,7 +324,7 @@
  *
  * @return a description of the last error encountered
  */
-public char[] getLastError() {
+public String getLastError() {
 
     return exceptionDescription;
 
--- a/dwt/ole/win32/OleClientSite.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OleClientSite.d	Mon May 05 00:12:38 2008 +0200
@@ -125,7 +125,7 @@
     private bool inInit = true;
     private bool inDispose = false;
 
-    private static const char[] WORDPROGID = "Word.Document"; //$NON-NLS-1$
+    private static const String WORDPROGID = "Word.Document"; //$NON-NLS-1$
 
     private Listener listener;
 
@@ -266,7 +266,7 @@
  *     <li>ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object
  * </ul>
  */
-public this(Composite parent, int style, char[] progId) {
+public this(Composite parent, int style, String progId) {
     this(parent, style);
     try {
         appClsid = getClassID(progId);
@@ -320,7 +320,7 @@
  *     <li>ERROR_CANNOT_OPEN_FILE when failed to open file
  * </ul>
  */
-public this(Composite parent, int style, char[] progId, File file) {
+public this(Composite parent, int style, String progId, File file) {
     this(parent, style);
     try {
         if (file is null || file.isDirectory() || !file.exists()) OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_ARGUMENT);
@@ -595,7 +595,7 @@
         return null;
     return ppvObject;
 }
-protected GUID* getClassID(char[] clientName) {
+protected GUID* getClassID(String clientName) {
     // create a GUID struct to hold the result
     GUID* guid = new GUID();
 
@@ -641,7 +641,7 @@
  *
  * @return the program ID of the OLE Document or ActiveX Control
  */
-public char[] getProgramID(){
+public String getProgramID(){
     if (appClsid !is null){
         wchar* hMem;
         if (COM.ProgIDFromCLSID(appClsid, &hMem) is COM.S_OK) {
@@ -652,7 +652,7 @@
             OS.GlobalUnlock(hMem);
             OS.GlobalFree(hMem);
 
-            char[] result = WCHARzToStr(buffer.ptr);
+            String result = WCHARzToStr(buffer.ptr);
             // remove null terminator
             //int index = result.indexOf("\0");
             return result;//.substring(0, index);
@@ -939,7 +939,7 @@
         return COM.S_OK;
     }
     if (COM.IsEqualGUID(guid, &COM.IIDIOleDocumentSite )) {
-        char[] progID = getProgramID();
+        String progID = getProgramID();
         if (!progID.startsWith("PowerPoint")) { //$NON-NLS-1$
             *ppvObject = cast(void*)cast(IOleDocumentSite)iOleDocumentSite;
             AddRef();
@@ -1237,7 +1237,7 @@
  *
  * @param title the name that will appear in the titlebar of the dialog
  */
-public void showProperties(char[] title) {
+public void showProperties(String title) {
 
     // Get the Property Page information from the OLE Object
     ISpecifyPropertyPages objISPP;
--- a/dwt/ole/win32/OleControlSite.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OleControlSite.d	Mon May 05 00:12:38 2008 +0200
@@ -106,7 +106,7 @@
  *     <li>ERROR_CANNOT_CREATE_LICENSED_OBJECT when failed to create a licensed OLE Object
  * </ul>
  */
-public this(Composite parent, int style, char[] progId) {
+public this(Composite parent, int style, String progId) {
     super(parent, style);
     try {
 
@@ -279,7 +279,7 @@
  *     <li>ERROR_NULL_ARGUMENT when listener is null</li>
  * </ul>
  */
-public void addEventListener(OleAutomation automation, char[] eventSinkId, int eventID, OleListener listener) {
+public void addEventListener(OleAutomation automation, String eventSinkId, int eventID, OleListener listener) {
     if (listener is null || automation is null || eventSinkId is null) OLE.error (__FILE__, __LINE__, DWT.ERROR_NULL_ARGUMENT);
     auto address = automation.getAddress();
     if (address is null) return;
--- a/dwt/ole/win32/OleFrame.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OleFrame.d	Mon May 05 00:12:38 2008 +0200
@@ -73,14 +73,14 @@
 
     private Listener listener;
 
-    private static char[] CHECK_FOCUS = "OLE_CHECK_FOCUS"; //$NON-NLS-1$
-    private static char[] HHOOK = "OLE_HHOOK"; //$NON-NLS-1$
-    private static char[] HHOOKMSG = "OLE_HHOOK_MSG"; //$NON-NLS-1$
+    private static String CHECK_FOCUS = "OLE_CHECK_FOCUS"; //$NON-NLS-1$
+    private static String HHOOK = "OLE_HHOOK"; //$NON-NLS-1$
+    private static String HHOOKMSG = "OLE_HHOOK_MSG"; //$NON-NLS-1$
 
     private static bool ignoreNextKey;
     private static const short [] ACCENTS = [ cast(short)'~', '`', '\'', '^', '"'];
 
-    private static const char[] CONSUME_KEY = "org.eclipse.swt.OleFrame.ConsumeKey"; //$NON-NLS-1$
+    private static const String CONSUME_KEY = "org.eclipse.swt.OleFrame.ConsumeKey"; //$NON-NLS-1$
 
 /**
  * Create an OleFrame child widget using style bits
--- a/dwt/ole/win32/OleFunctionDescription.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OleFunctionDescription.d	Mon May 05 00:12:38 2008 +0200
@@ -13,11 +13,12 @@
 module dwt.ole.win32.OleFunctionDescription;
 
 import dwt.ole.win32.OleParameterDescription;
+import dwt.dwthelper.utils;
 
 public class OleFunctionDescription {
 
     public int id;
-    public char[] name;
+    public String name;
     public OleParameterDescription[] args;
     public int optionalArgCount;
     public short returnType;
@@ -25,7 +26,7 @@
     public int funcKind;
     public short flags;
     public int callingConvention;
-    public char[] documentation;
-    public char[] helpFile;
+    public String documentation;
+    public String helpFile;
 
 }
--- a/dwt/ole/win32/OleParameterDescription.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OleParameterDescription.d	Mon May 05 00:12:38 2008 +0200
@@ -11,10 +11,11 @@
  *     Frank Benoit <benoit@tionex.de>
  *******************************************************************************/
 module dwt.ole.win32.OleParameterDescription;
+import dwt.dwthelper.utils;
 
 
 public class OleParameterDescription {
-    public char[] name;
+    public String name;
     public short flags;
     public short type;
 }
--- a/dwt/ole/win32/OlePropertyDescription.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/OlePropertyDescription.d	Mon May 05 00:12:38 2008 +0200
@@ -11,14 +11,15 @@
  *     Frank Benoit <benoit@tionex.de>
  *******************************************************************************/
 module dwt.ole.win32.OlePropertyDescription;
+import dwt.dwthelper.utils;
 
 
 public class OlePropertyDescription {
     public int id;
-    public char[] name;
+    public String name;
     public int type;
     public int flags;
     public int kind;
-    public char[] description;
-    public char[] helpFile;
+    public String description;
+    public String helpFile;
 }
--- a/dwt/ole/win32/Variant.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/ole/win32/Variant.d	Mon May 05 00:12:38 2008 +0200
@@ -25,6 +25,7 @@
 
 import tango.util.Convert;
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  *
@@ -49,12 +50,12 @@
     private bool booleanData;
     private byte    byteData;
     private short   shortData;
-    private char    charData;
+    private wchar   charData;
     private int     intData;
     private long    longData;
     private float   floatData;
     private double  doubleData;
-    private char[]  stringData;
+    private String  stringData;
     private void*   byRefPtr;
     private IDispatch dispatchData;
     private IUnknown unknownData;
@@ -216,7 +217,7 @@
  * @param string the Java String value that this Variant represents
  *
  */
-public this(char[] string) {
+public this(String string) {
     type = COM.VT_BSTR;
     stringData = string;
 }
@@ -448,7 +449,7 @@
  *
  * @since 3.3
  */
-public char getChar() {
+public wchar getChar() {
     if (type is COM.VT_EMPTY) {
         OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);
     }
@@ -739,7 +740,7 @@
  *     <li>ERROR_CANNOT_CHANGE_VARIANT_TYPE when type of Variant can not be coerced into a String</li>
  * </ul>
  */
-public char[] getString() {
+public String getString() {
     if (type is COM.VT_EMPTY) {
         OLE.error(OLE.ERROR_CANNOT_CHANGE_VARIANT_TYPE, -1);
     }
@@ -922,7 +923,7 @@
             shortData = newShortData[0];
             break;
         case COM.VT_UI2 :
-            char[1] newCharData;
+            wchar[1] newCharData;
             COM.MoveMemory(newCharData.ptr, pData + 8, 2);
             charData = newCharData[0];
             break;
@@ -1011,24 +1012,24 @@
  *
  * @return a string representation of the Variant
  */
-public char[] toString () {
+public String toString () {
     switch (type) {
         case COM.VT_BOOL :
-            return "VT_BOOL{"~to!(char[])(booleanData)~"}";
+            return "VT_BOOL{"~to!(String)(booleanData)~"}";
         case COM.VT_I1 :
-            return "VT_I1{"~to!(char[])(byteData)~"}";
+            return "VT_I1{"~to!(String)(byteData)~"}";
         case COM.VT_I2 :
-            return "VT_I2{"~to!(char[])(shortData)~"}";
+            return "VT_I2{"~to!(String)(shortData)~"}";
         case COM.VT_UI2 :
-            return "VT_UI2{"~charData~"}";
+            return "VT_UI2{"~ dcharToString(charData) ~"}";
         case COM.VT_I4 :
-            return "VT_I4{"~to!(char[])(intData)~"}";
+            return "VT_I4{"~to!(String)(intData)~"}";
         case COM.VT_I8 :
-            return "VT_I8{"~to!(char[])(longData)~"}";
+            return "VT_I8{"~to!(String)(longData)~"}";
         case COM.VT_R4 :
-            return "VT_R4{"~to!(char[])(floatData)~"}";
+            return "VT_R4{"~to!(String)(floatData)~"}";
         case COM.VT_R8 :
-            return "VT_R8{"~to!(char[])(doubleData)~"}";
+            return "VT_R8{"~to!(String)(doubleData)~"}";
         case COM.VT_BSTR :
             return "VT_BSTR{"~stringData~"}";
         case COM.VT_DISPATCH :
@@ -1044,6 +1045,6 @@
     if ((type & COM.VT_BYREF) !is 0) {
         return Format("VT_BYREF|{}{{{}}",(type & ~COM.VT_BYREF), byRefPtr );
     }
-    return "Unsupported Type "~to!(char[])(type);
+    return "Unsupported Type "~to!(String)(type);
 }
 }
--- a/dwt/opengl/GLData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/opengl/GLData.d	Mon May 05 00:12:38 2008 +0200
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*******************************************************************************
  * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -14,13 +14,14 @@
 
 import tango.text.Util;
 import tango.util.Convert;
+import dwt.dwthelper.utils;
 
 /**
  * The GLData class is a device-independent description
  * of the pixel format attributes of a GL drawable.
  *
  * @see GLCanvas
- * 
+ *
  * @since 3.2
  */
 
@@ -28,13 +29,13 @@
     /**
      * Specifies a double-buffered surface.  During context
      * creation, only double-buffered formats are considered
-     * when set to true. 
+     * when set to true.
      */
     public bool doubleBuffer;
 
     /**
      * Specifies a stereo surface.  During context creation,
-     * only stereo formats are considered when set to true. 
+     * only stereo formats are considered when set to true.
      */
     public bool stereo;
 
@@ -124,22 +125,22 @@
      * are preferred.
      */
     public int samples;
-    
+
 /**
  * Returns a string containing a concise, human-readable
  * description of the receiver.
  *
  * @return a string representation of the data
  */
-override public char[] toString() {
-    char[] string = doubleBuffer ? "doubleBuffer," : "";
+override public String toString() {
+    String string = doubleBuffer ? "doubleBuffer," : "";
     string ~= stereo ? "stereo," : "";
-    string ~= "r:" ~     to!(char[])(redSize)  ~ " g:" ~ to!(char[])(greenSize) ~ 
-              " b:" ~    to!(char[])(blueSize) ~ " a:" ~ to!(char[])(alphaSize) ~ "," ~
-              "depth:" ~ to!(char[])(depthSize) ~ ",stencil:" ~ to!(char[])(stencilSize) ~
-              ",accum r:" ~ to!(char[])(accumRedSize) ~ "g:" ~ to!(char[])(accumGreenSize) ~ 
-              "b:" ~ to!(char[])(accumBlueSize) ~ "a:" ~ to!(char[])(accumAlphaSize) ~
-              ",sampleBuffers:" ~ to!(char[])(sampleBuffers) ~ ",samples:" ~ to!(char[])(samples);
+    string ~= "r:" ~     to!(String)(redSize)  ~ " g:" ~ to!(String)(greenSize) ~
+              " b:" ~    to!(String)(blueSize) ~ " a:" ~ to!(String)(alphaSize) ~ "," ~
+              "depth:" ~ to!(String)(depthSize) ~ ",stencil:" ~ to!(String)(stencilSize) ~
+              ",accum r:" ~ to!(String)(accumRedSize) ~ "g:" ~ to!(String)(accumGreenSize) ~
+              "b:" ~ to!(String)(accumBlueSize) ~ "a:" ~ to!(String)(accumAlphaSize) ~
+              ",sampleBuffers:" ~ to!(String)(sampleBuffers) ~ ",samples:" ~ to!(String)(samples);
     return string;
 }
 }
--- a/dwt/printing/PrintDialog.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/printing/PrintDialog.d	Mon May 05 00:12:38 2008 +0200
@@ -211,8 +211,8 @@
 }
 
 protected void checkSubclass() {
-    char[] name = this.classinfo.name;
-    char[] validName = PrintDialog.classinfo.name;
+    String name = this.classinfo.name;
+    String validName = PrintDialog.classinfo.name;
     if (validName!=/*eq*/name) {
         DWT.error(DWT.ERROR_INVALID_SUBCLASS);
     }
@@ -258,7 +258,7 @@
         }
     }
     PrinterData data = null;
-    char[] key = "org.eclipse.swt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
+    String key = "org.eclipse.swt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
     Object oldValue = display.getData(key);
     display.setData(key, new ValueWrapperBool(true));
     bool success = cast(bool)OS.PrintDlg(&pd);
@@ -289,7 +289,7 @@
             if (buffer[driverOffset + i] is 0) break;
             i++;
         }
-        char[] driver = TCHARsToStr( buffer[driverOffset .. driverOffset+i] );
+        String driver = TCHARsToStr( buffer[driverOffset .. driverOffset+i] );
 
         int deviceOffset = offsets[1];
         i = 0;
@@ -297,7 +297,7 @@
             if (buffer[deviceOffset + i] is 0) break;
             i++;
         }
-        char[] device = TCHARsToStr( buffer[deviceOffset .. deviceOffset+i] );
+        String device = TCHARsToStr( buffer[deviceOffset .. deviceOffset+i] );
 
         int outputOffset = offsets[2];
         i = 0;
@@ -305,7 +305,7 @@
             if (buffer[outputOffset + i] is 0) break;
             i++;
         }
-        char[] output = TCHARsToStr( buffer[outputOffset .. outputOffset+i] );
+        String output = TCHARsToStr( buffer[outputOffset .. outputOffset+i] );
 
         /* Create PrinterData object and set fields from PRINTDLG */
         data = new PrinterData(driver, device);
--- a/dwt/printing/Printer.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/printing/Printer.d	Mon May 05 00:12:38 2008 +0200
@@ -91,16 +91,16 @@
 public static PrinterData[] getPrinterList() {
     int length = 1024;
     /* Use the character encoding for the default locale */
-    char[] buf = new char[](length);
+    String buf = new String(length);
     int n = OS.GetProfileString( TCHARsToStr(profile), null, null, buf, length);
     if (n is 0) return null;
-    char[][] deviceNames = new char[][](5);
+    String[] deviceNames = new String[](5);
     int nameCount = 0;
     int index = 0;
     for (int i = 0; i < n; i++) {
         if (buf[i] is 0) {
             if (nameCount is deviceNames.length) {
-                char[][] newNames = new char[][](deviceNames.length + 5);
+                String[] newNames = new String[](deviceNames.length + 5);
                 System.arraycopy(deviceNames, 0, newNames, 0, deviceNames.length);
                 deviceNames = newNames;
             }
@@ -111,8 +111,8 @@
     }
     PrinterData printerList[] = new PrinterData[nameCount];
     for (int p = 0; p < nameCount; p++) {
-        char[] device = deviceNames[p];
-        char[] driver = ""; //$NON-NLS-1$
+        String device = deviceNames[p];
+        String driver = ""; //$NON-NLS-1$
         if (OS.GetProfileString(TCHARsToStr(profile), device, null, buf, length) > 0) {
             int commaIndex = 0;
             while (buf[commaIndex] !is ',' && commaIndex < length) commaIndex++;
@@ -135,10 +135,10 @@
  * @since 2.1
  */
 public static PrinterData getDefaultPrinterData() {
-    char[] deviceName = null;
+    String deviceName = null;
     int length = 1024;
     /* Use the character encoding for the default locale */
-    char[] buf = new char[](length);
+    String buf = new String(length);
     int n = OS.GetProfileString(TCHARsToStr(appName), TCHARsToStr(keyName), null, buf, length);
     if (n is 0) return null;
     int commaIndex = 0;
@@ -146,7 +146,7 @@
     if (commaIndex < length) {
         deviceName = buf[0 .. commaIndex].dup;
     }
-    char[] driver = ""; //$NON-NLS-1$
+    String driver = ""; //$NON-NLS-1$
     if (OS.GetProfileString(TCHARsToStr(profile), deviceName, null, buf, length) > 0) {
         commaIndex = 0;
         while (buf[commaIndex] !is ',' && commaIndex < length) commaIndex++;
@@ -298,7 +298,7 @@
  * @see #endPage
  * @see #endJob
  */
-public bool startJob(char[] jobName) {
+public bool startJob(String jobName) {
     checkDevice();
     DOCINFO di;
     di.cbSize = DOCINFO.sizeof;
--- a/dwt/printing/PrinterData.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/printing/PrinterData.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 import dwt.graphics.DeviceData;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are descriptions of a print job
@@ -45,14 +46,14 @@
      * On GTK+, this is the backend type name (eg. GtkPrintBackendCups).
      */
     // TODO: note that this api is not finalized for GTK+
-    public char[] driver;
+    public String driver;
 
     /**
      * the name of the printer
      * On Windows systems, this is the name of the 'device'.
      * On Mac OSX, X/Window systems, and GTK+, this is the printer's 'name'.
      */
-    public char[] name;
+    public String name;
 
     /**
      * the scope of the print job, expressed as one of the following values:
@@ -88,7 +89,7 @@
      * the name of the file to print to if printToFile is true.
      * Note that this field is ignored if printToFile is false.
      */
-    public char[] fileName;
+    public String fileName;
 
     /**
      * the number of copies to print.
@@ -152,7 +153,7 @@
      * @see #driver
      * @see #name
      */
-    public this(char[] driver, char[] name) {
+    public this(String driver, String name) {
         this.driver = driver;
         this.name = name;
     }
@@ -163,7 +164,7 @@
      *
      * @return a string representation of the receiver
      */
-    public char[] toString() {
+    public String toString() {
         return Format("PrinterData {{driver = {}, name = {}}", driver, name );  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
     }
 }
--- a/dwt/program/Program.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/program/Program.d	Mon May 05 00:12:38 2008 +0200
@@ -26,11 +26,11 @@
  * system.
  */
 public final class Program {
-    char[] name;
-    char[] command;
-    char[] iconName;
-    char[] extension;
-    static const char[][] ARGUMENTS = ["%1"[], "%l", "%L"]; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    String name;
+    String command;
+    String iconName;
+    String extension;
+    static const String[] ARGUMENTS = ["%1"[], "%l", "%L"]; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 
 /**
  * Prevents uninitialized instances from being created outside the package.
@@ -38,7 +38,7 @@
 this () {
 }
 
-static char[] assocQueryString (int assocStr, TCHAR[] key, bool expand) {
+static String assocQueryString (int assocStr, TCHAR[] key, bool expand) {
     TCHAR[] pszOut = NewTCHARs(0, 1024);
     uint[1] pcchOut;
     pcchOut[0] = pszOut.length;
@@ -77,7 +77,7 @@
  *      <li>ERROR_NULL_ARGUMENT when extension is null</li>
  *  </ul>
  */
-public static Program findProgram (char[] extension) {
+public static Program findProgram (String extension) {
     if (extension is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     if (extension.length is 0) return null;
     if (extension.charAt (0) !is '.') extension = "." ~ extension; //$NON-NLS-1$
@@ -98,13 +98,13 @@
         }
         OS.RegCloseKey (phkResult [0]);
     } else {
-        char[] command = assocQueryString (OS.ASSOCSTR_COMMAND, key, true);
+        String command = assocQueryString (OS.ASSOCSTR_COMMAND, key, true);
         if (command !is null) {
-            char[] name = null;
+            String name = null;
             if (name is null) name = assocQueryString (OS.ASSOCSTR_FRIENDLYDOCNAME, key, false);
             if (name is null) name = assocQueryString (OS.ASSOCSTR_FRIENDLYAPPNAME, key, false);
             if (name is null) name = "";
-            char[] iconName = assocQueryString (OS.ASSOCSTR_DEFAULTICON, key, true);
+            String iconName = assocQueryString (OS.ASSOCSTR_DEFAULTICON, key, true);
             if (iconName is null) iconName = "";
             program = new Program ();
             program.name = name;
@@ -123,19 +123,19 @@
  *
  * @return an array of extensions
  */
-public static char[] [] getExtensions () {
-    char[] [] extensions = new char[] [1024];
+public static String [] getExtensions () {
+    String [] extensions = new String [1024];
     /* Use the character encoding for the default locale */
     TCHAR[] lpName = NewTCHARs (0, 1024);
     uint [1] lpcName; lpcName[0] = lpName.length;
     FILETIME ft;
     int dwIndex = 0, count = 0;
     while (OS.RegEnumKeyEx ( cast(void*)OS.HKEY_CLASSES_ROOT, dwIndex, lpName.ptr, lpcName.ptr, null, null, null, &ft) !is OS.ERROR_NO_MORE_ITEMS) {
-        char[] extension = TCHARsToStr( lpName[0 .. lpcName[0] ]);
+        String extension = TCHARsToStr( lpName[0 .. lpcName[0] ]);
         lpcName [0] = lpName.length;
         if (extension.length > 0 && extension.charAt (0) is '.') {
             if (count is extensions.length) {
-                char[][] newExtensions = new char[][]( extensions.length + 1024 );
+                String[] newExtensions = new String[]( extensions.length + 1024 );
                 System.arraycopy (extensions, 0, newExtensions, 0, extensions.length);
                 extensions = newExtensions;
             }
@@ -144,21 +144,21 @@
         dwIndex++;
     }
     if (count !is extensions.length) {
-        char[][] newExtension = new char[][]( count );
+        String[] newExtension = new String[]( count );
         System.arraycopy (extensions, 0, newExtension, 0, count);
         extensions = newExtension;
     }
     return extensions;
 }
 
-static char[] getKeyValue (char[] string, bool expand) {
+static String getKeyValue (String string, bool expand) {
     /* Use the character encoding for the default locale */
     TCHAR[] key = StrToTCHARs (0, string, true);
     void* [1] phkResult;
     if (OS.RegOpenKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, key.ptr, 0, OS.KEY_READ, phkResult.ptr) !is 0) {
         return null;
     }
-    char[] result = null;
+    String result = null;
     uint [1] lpcbData;
     if (OS.RegQueryValueEx (phkResult [0], null, null, null, null, lpcbData.ptr) is 0) {
         result = "";
@@ -185,25 +185,25 @@
     return result;
 }
 
-static Program getProgram (char[] key, char[] extension) {
+static Program getProgram (String key, String extension) {
 
     /* Name */
-    char[] name = getKeyValue (key, false);
+    String name = getKeyValue (key, false);
     if (name is null || name.length is 0) {
         name = key;
     }
 
     /* Command */
-    char[] DEFAULT_COMMAND = "\\shell"; //$NON-NLS-1$
-    char[] defaultCommand = getKeyValue (key ~ DEFAULT_COMMAND, true);
+    String DEFAULT_COMMAND = "\\shell"; //$NON-NLS-1$
+    String defaultCommand = getKeyValue (key ~ DEFAULT_COMMAND, true);
     if (defaultCommand is null || defaultCommand.length is 0) defaultCommand = "open"; //$NON-NLS-1$
-    char[] COMMAND = "\\shell\\" ~ defaultCommand ~ "\\command"; //$NON-NLS-1$
-    char[] command = getKeyValue (key ~ COMMAND, true);
+    String COMMAND = "\\shell\\" ~ defaultCommand ~ "\\command"; //$NON-NLS-1$
+    String command = getKeyValue (key ~ COMMAND, true);
     if (command is null || command.length is 0) return null;
 
     /* Icon */
-    char[] DEFAULT_ICON = "\\DefaultIcon"; //$NON-NLS-1$
-    char[] iconName = getKeyValue (key ~ DEFAULT_ICON, true);
+    String DEFAULT_ICON = "\\DefaultIcon"; //$NON-NLS-1$
+    String iconName = getKeyValue (key ~ DEFAULT_ICON, true);
     if (iconName is null) iconName = ""; //$NON-NLS-1$
 
     /* Program */
@@ -230,7 +230,7 @@
     FILETIME ft;
     int dwIndex = 0, count = 0;
     while (OS.RegEnumKeyEx (cast(void*)OS.HKEY_CLASSES_ROOT, dwIndex, lpName.ptr, lpcName.ptr, null, null, null, &ft) !is OS.ERROR_NO_MORE_ITEMS) {
-        char[] path = tango.text.convert.Utf.toString ( lpName[0 .. lpcName [0]]);
+        String path = tango.text.convert.Utf.toString ( lpName[0 .. lpcName [0]]);
         lpcName [0] = lpName.length ;
         Program program = getProgram (path, null);
         if (program !is null) {
@@ -265,7 +265,7 @@
  *    <li>ERROR_NULL_ARGUMENT when fileName is null</li>
  * </ul>
  */
-public static bool launch (char[] fileName) {
+public static bool launch (String fileName) {
     if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
 
     /* Use the character encoding for the default locale */
@@ -296,11 +296,11 @@
  *    <li>ERROR_NULL_ARGUMENT when fileName is null</li>
  * </ul>
  */
-public bool execute (char[] fileName) {
+public bool execute (String fileName) {
     if (fileName is null) DWT.error (DWT.ERROR_NULL_ARGUMENT);
     int index = 0;
     bool append = true;
-    char[] prefix = command, suffix = ""; //$NON-NLS-1$
+    String prefix = command, suffix = ""; //$NON-NLS-1$
     while (index < ARGUMENTS.length) {
         int i = command.indexOf (ARGUMENTS [index]);
         if (i !is -1) {
@@ -312,7 +312,7 @@
         index++;
     }
     if (append) fileName = " \"" ~ fileName ~ "\"";
-    char[] commandLine = prefix ~ fileName ~ suffix;
+    String commandLine = prefix ~ fileName ~ suffix;
     auto hHeap = OS.GetProcessHeap ();
     /* Use the character encoding for the default locale */
     TCHAR[] buffer = StrToTCHARs (0, commandLine, true);
@@ -350,11 +350,11 @@
         }
     }
     int nIconIndex = 0;
-    char[] fileName = iconName;
+    String fileName = iconName;
     int index = iconName.indexOf (',');
     if (index !is -1) {
         fileName = iconName.substring (0, index);
-        char[] iconIndex = iconName.substring (index + 1, iconName.length ).trim ();
+        String iconIndex = iconName.substring (index + 1, iconName.length ).trim ();
         try {
             nIconIndex = Integer.parseInt (iconIndex);
         } catch (NumberFormatException e) {}
@@ -378,7 +378,7 @@
  *
  * @return the name of the program
  */
-public char[] getName () {
+public String getName () {
     return name;
 }
 
@@ -421,7 +421,7 @@
  *
  * @return a string representation of the program
  */
-public char[] toString () {
+public String toString () {
     return "Program {" ~ name ~ "}"; //$NON-NLS-1$ //$NON-NLS-2$
 }
 
--- a/dwt/widgets/Button.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Button.d	Mon May 05 00:12:38 2008 +0200
@@ -60,7 +60,7 @@
     alias Control.windowProc windowProc;
 
     alias extern(Windows) int function( HWND, uint, uint, int ) TWindowProc;
-    char[] text = "", message = "";
+    String text = "", message = "";
     Image image, image2, disabledImage;
     ImageList imageList;
     bool ignoreMouse;
@@ -282,7 +282,7 @@
     }
 }
 
-void _setText (char[] text) {
+void _setText (String text) {
     int oldBits = OS.GetWindowLong (handle, OS.GWL_STYLE), newBits = oldBits;
     if (OS.COMCTL32_MAJOR >= 6) {
         newBits &= ~(OS.BS_LEFT | OS.BS_CENTER | OS.BS_RIGHT);
@@ -546,7 +546,7 @@
             int bits = OS.GetWindowLong (handle, OS.GWL_STYLE);
             bool hasImage = (bits & (OS.BS_BITMAP | OS.BS_ICON)) !is 0;
             if (!hasImage) {
-                char[] string = enabled ? text : " " ~ text ~ " ";
+                String string = enabled ? text : " " ~ text ~ " ";
                 TCHAR* buffer = StrToTCHARz (getCodePage (), string);
                 OS.SetWindowText (handle, buffer);
             }
@@ -654,12 +654,12 @@
  *
  * @since 3.3
  */
-/*public*/ char[] getMessage () {
+/*public*/ String getMessage () {
     checkWidget ();
     return message;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -698,7 +698,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     if ((style & DWT.ARROW) !is 0) return "";
     return text;
@@ -922,7 +922,7 @@
  *
  * @since 3.3
  */
-/*public*/ void setMessage (char[] message) {
+/*public*/ void setMessage (String message) {
     checkWidget ();
     if (message is null) error (DWT.ERROR_NULL_ARGUMENT);
     this.message = message;
@@ -1023,7 +1023,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if ((style & DWT.ARROW) !is 0) return;
@@ -1053,7 +1053,7 @@
     return bits | OS.BS_PUSHBUTTON | OS.WS_TABSTOP;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARzToStr( ButtonClass.ptr );
 }
 
--- a/dwt/widgets/Combo.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Combo.d	Mon May 05 00:12:38 2008 +0200
@@ -184,7 +184,7 @@
  *
  * @see #add(String,int)
  */
-public void add (char[] string) {
+public void add (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     auto buffer = StrToTCHARs( getCodePage(), string, true );
@@ -217,7 +217,7 @@
  *
  * @see #add(String)
  */
-public void add (char[] string, int index) {
+public void add (String string, int index) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     int count = OS.SendMessage (handle, OS.CB_GETCOUNT, 0, 0);
@@ -342,7 +342,7 @@
     if (nCode is OS.HCBT_CREATEWND) {
         TCHAR[128] buffer = 0;
         OS.GetClassName (cast(HANDLE)wParam, buffer.ptr, buffer.length );
-        char[] className = TCHARzToStr(buffer.ptr);
+        String className = TCHARzToStr(buffer.ptr);
         if (className=="Edit" || className=="EDIT") { //$NON-NLS-1$  //$NON-NLS-2$
             int bits = OS.GetWindowLong (cast(HANDLE)wParam, OS.GWL_STYLE);
             OS.SetWindowLong (cast(HANDLE)wParam, OS.GWL_STYLE, bits & ~OS.ES_NOHIDESEL);
@@ -669,7 +669,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getItem (int index) {
+public String getItem (int index) {
     checkWidget ();
     int length_ = OS.SendMessage (handle, OS.CB_GETLBTEXTLEN, index, 0);
     if (length_ !is OS.CB_ERR) {
@@ -734,10 +734,10 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] [] getItems () {
+public String [] getItems () {
     checkWidget ();
     int count = getItemCount ();
-    char[] [] result = new char[] [count];
+    String [] result = new String [count];
     for (int i=0; i<count; i++) result [i] = getItem (i);
     return result;
 }
@@ -769,7 +769,7 @@
     return true;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -852,7 +852,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     int length_ = OS.GetWindowTextLength (handle);
     if (length_ is 0) return "";
@@ -955,7 +955,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int indexOf (char[] string) {
+public int indexOf (String string) {
     return indexOf (string, 0);
 }
 
@@ -978,7 +978,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int indexOf (char[] string, int start) {
+public int indexOf (String string, int start) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
 
@@ -1201,7 +1201,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void remove (char[] string) {
+public void remove (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     int index = indexOf (string, 0);
@@ -1338,7 +1338,7 @@
     }
 
     /* Verify the character */
-    char[] oldText = "";
+    String oldText = "";
     int start, end;
     auto hwndText = OS.GetDlgItem (handle, CBID_EDIT);
     if (hwndText is null) return true;
@@ -1378,7 +1378,7 @@
             oldText = [key];
             break;
     }
-    char[] newText = verifyText (oldText, start, end, event);
+    String newText = verifyText (oldText, start, end, event);
     if (newText is null) return false;
     if (newText is oldText) return true;
     TCHAR* buffer = StrToTCHARz( newText );
@@ -1505,7 +1505,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setItem (int index, char[] string) {
+public void setItem (int index, String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     int selection = getSelectionIndex ();
@@ -1529,7 +1529,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setItems (char[] [] items) {
+public void setItems (String [] items) {
     checkWidget ();
     if (items is null) error (DWT.ERROR_NULL_ARGUMENT);
     for (int i=0; i<items.length; i++) {
@@ -1549,7 +1549,7 @@
     OS.SendMessage (handle, OS.CB_RESETCONTENT, 0, 0);
     int codePage = getCodePage ();
     for (int i=0; i<items.length; i++) {
-        char[] string = items [i];
+        String string = items [i];
         TCHAR* buffer = StrToTCHARz( string );
         int code = OS.SendMessage (handle, OS.CB_ADDSTRING, 0, buffer);
         if (code is OS.CB_ERR) error (DWT.ERROR_ITEM_NOT_ADDED);
@@ -1803,7 +1803,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if ((style & DWT.READ_ONLY) !is 0) {
@@ -1850,7 +1850,7 @@
     OS.SendMessage (handle, OS.CB_LIMITTEXT, limit, 0);
 }
 
-override void setToolTipText (Shell shell, char[] string) {
+override void setToolTipText (Shell shell, String string) {
     auto hwndText = OS.GetDlgItem (handle, CBID_EDIT);
     auto hwndList = OS.GetDlgItem (handle, CBID_LIST);
     if (hwndText !is null) shell.setToolTipText (hwndText, string);
@@ -1952,7 +1952,7 @@
     }
 }
 
-char[] verifyText (char[] string, int start, int end, Event keyEvent) {
+String verifyText (String string, int start, int end, Event keyEvent) {
     Event event = new Event ();
     event.text = string;
     event.start = start;
@@ -2006,7 +2006,7 @@
     return bits | OS.CBS_DROPDOWN;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARzToStr( ComboClass );
 }
 
@@ -2076,7 +2076,7 @@
     if (msg is OS.CB_SETCURSEL) {
         if ((style & DWT.READ_ONLY) !is 0) {
             if (hooks (DWT.Verify) || filters (DWT.Verify)) {
-                char[] oldText = getText (), newText = null;
+                String oldText = getText (), newText = null;
                 if (wParam is -1) {
                     newText = "";
                 } else {
@@ -2272,7 +2272,7 @@
     if (!hooks (DWT.Verify) && !filters (DWT.Verify)) return null;
     bool call = false;
     int start, end;
-    char[] newText = null;
+    String newText = null;
     switch (msg) {
         case OS.WM_CLEAR:
         case OS.WM_CUT:
@@ -2318,7 +2318,7 @@
         default:
     }
     if (newText !is null) {
-        char[] oldText = newText;
+        String oldText = newText;
         newText = verifyText (newText, start, end, null);
         if (newText is null) return LRESULT.ZERO;
         if (newText!=/*eq*/oldText) {
--- a/dwt/widgets/Composite.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Composite.d	Mon May 05 00:12:38 2008 +0200
@@ -950,10 +950,10 @@
     return false;
 }
 
-char[] toolTipText (NMTTDISPINFO* hdr) {
+String toolTipText (NMTTDISPINFO* hdr) {
     Shell shell = getShell ();
     if ((hdr.uFlags & OS.TTF_IDISHWND) is 0) {
-        char[] string = null;
+        String string = null;
         ToolTip toolTip = shell.findToolTip (hdr.hdr.idFrom);
         if (toolTip !is null) {
             string = toolTip.message;
@@ -1564,7 +1564,7 @@
 //                     lpnmtdi = new NMTTDISPINFOW ();
 //                     OS.MoveMemory (cast(NMTTDISPINFOW)lpnmtdi, lParam, NMTTDISPINFOW.sizeof);
 //                 }
-                char[] string = toolTipText (lpnmtdi);
+                String string = toolTipText (lpnmtdi);
                 if (string !is null) {
                     Shell shell = getShell ();
                     string = Display.withCrLf (string);
--- a/dwt/widgets/Control.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Control.d	Mon May 05 00:12:38 2008 +0200
@@ -97,7 +97,7 @@
     Composite parent;
     Cursor cursor;
     Menu menu;
-    char[] toolTipText_;
+    String toolTipText_;
     Object layoutData;
     Accessible accessible;
     Image backgroundImage;
@@ -943,7 +943,7 @@
     return new Menu [0];
 }
 
-char findMnemonic (char[] string) {
+char findMnemonic (String string) {
     int index = 0;
     int length_ = string.length;
     do {
@@ -1158,8 +1158,8 @@
     return OS.GetACP ();
 }
 
-char[] getClipboardText () {
-    char[] string = "";
+String getClipboardText () {
+    String string = "";
     if (OS.OpenClipboard (null)) {
         auto hMem = OS.GetClipboardData (OS.IsUnicode ? OS.CF_UNICODETEXT : OS.CF_TEXT);
         if (hMem !is null) {
@@ -1445,7 +1445,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget ();
     return toolTipText_;
 }
@@ -3080,13 +3080,13 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setToolTipText (char[] string) {
+public void setToolTipText (String string) {
     checkWidget ();
     toolTipText_ = string;
     setToolTipText (getShell (), string);
 }
 
-void setToolTipText (Shell shell, char[] string) {
+void setToolTipText (Shell shell, String string) {
     shell.setToolTipText (handle, string);
 }
 
@@ -3709,7 +3709,7 @@
     return true;
 }
 
-abstract char[] windowClass ();
+abstract String windowClass ();
 
 abstract int windowProc ();
 
@@ -4434,7 +4434,7 @@
                                 MenuItem [] items = menu.getItems ();
                                 for (int i=0; i<items.length; i++) {
                                     MenuItem item = items [i];
-                                    char[] text = item.getText ();
+                                    String text = item.getText ();
                                     char mnemonic = findMnemonic (text);
                                     if (text.length > 0 && mnemonic is 0) {
                                         char ch = text.charAt (0);
--- a/dwt/widgets/CoolBar.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/CoolBar.d	Mon May 05 00:12:38 2008 +0200
@@ -1000,7 +1000,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARzToStr( ReBarClass );
 }
 
--- a/dwt/widgets/DateTime.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/DateTime.d	Mon May 05 00:12:38 2008 +0200
@@ -140,7 +140,7 @@
     static_this();
     super (parent, checkStyle (style));
     if ((this.style & DWT.SHORT) !is 0) {
-        char[] buffer = ((this.style & DWT.DATE) !is 0) ? getCustomShortDateFormat() : getCustomShortTimeFormat();
+        String buffer = ((this.style & DWT.DATE) !is 0) ? getCustomShortDateFormat() : getCustomShortTimeFormat();
         TCHAR[] lpszFormat = StrToTCHARs (0, buffer, true);
         OS.SendMessage (handle, OS.DTM_SETFORMAT, 0, lpszFormat.ptr);
     }
@@ -362,7 +362,7 @@
     return OS.GetSysColor (OS.COLOR_WINDOW);
 }
 
-char[] getComputeSizeString () {
+String getComputeSizeString () {
     // TODO: Not currently used but might need for WinCE
     if ((style & DWT.DATE) !is 0) {
         if ((style & DWT.SHORT) !is 0) return getCustomShortDateFormat ();
@@ -376,7 +376,7 @@
     return "";
 }
 
-char[] getCustomShortDateFormat () {
+String getCustomShortDateFormat () {
     if (true) {
         TCHAR[] tchar = new TCHAR[80];
         int size = OS.GetLocaleInfo (OS.LOCALE_USER_DEFAULT, OS.LOCALE_SYEARMONTH, tchar.ptr, 80);
@@ -384,7 +384,7 @@
     }
 
     //TODO: Not currently used, but may need for WinCE (or if numeric short date is required)
-    char[] buffer = getShortDateFormat ();
+    String buffer = getShortDateFormat ();
     int length = buffer.length;
     bool inQuotes = false;
     int start = 0, end = 0;
@@ -418,8 +418,8 @@
     return buffer;
 }
 
-char[] getCustomShortTimeFormat () {
-    char[] buffer = getTimeFormat ();
+String getCustomShortTimeFormat () {
+    String buffer = getTimeFormat ();
     int length = buffer.length;
     bool inQuotes = false;
     int start = 0, end = 0;
@@ -440,14 +440,14 @@
     return buffer;
 }
 
-char[] getLongDateFormat () {
+String getLongDateFormat () {
     //TODO: Not currently used, but may need for WinCE
     TCHAR tchar[80];
     int size = OS.GetLocaleInfo (OS.LOCALE_USER_DEFAULT, OS.LOCALE_SLONGDATE, tchar.ptr, 80);
     return size > 0 ? TCHARsToStr(tchar[0..size - 1]) : "dddd, MMMM dd, yyyy"; //$NON-NLS-1$
 }
 
-char[] getShortDateFormat () {
+String getShortDateFormat () {
     //TODO: Not currently used, but may need for WinCE
     TCHAR tchar[80];
     //TODO: May need to OR with LOCALE_ICENTURY
@@ -460,13 +460,13 @@
     TCHAR tchar[80];
     int size = OS.GetLocaleInfo (OS.LOCALE_USER_DEFAULT, OS.LOCALE_IDATE, tchar.ptr, 4);
     if (size > 0) {
-        char[] number = TCHARsToStr(tchar[0..size - 1]);
+        String number = TCHARsToStr(tchar[0..size - 1]);
         return Integer.parse (number);
     }
     return 0;
 }
 
-char[] getTimeFormat () {
+String getTimeFormat () {
     TCHAR tchar[80];
     int size = OS.GetLocaleInfo (OS.LOCALE_USER_DEFAULT, OS.LOCALE_STIMEFORMAT, tchar.ptr, 80);
     return size > 0 ? TCHARsToStr(tchar[0..size - 1]) : "h:mm:ss tt"; //$NON-NLS-1$
@@ -476,7 +476,7 @@
     TCHAR tchar[4];
     int size = OS.GetLocaleInfo (OS.LOCALE_USER_DEFAULT, OS.LOCALE_ITIME, tchar.ptr, 4);
     if (size > 0) {
-        char[] number = TCHARsToStr(tchar[0..size - 1]);
+        String number = TCHARsToStr(tchar[0..size - 1]);
         return Integer.parse (number) !is 0;
     }
     return true;
@@ -566,7 +566,7 @@
     return systime.wMonth - 1;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return "DateTime";
 }
 
@@ -789,7 +789,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return (style & DWT.CALENDAR) !is 0 ? TCHARzToStr(CalendarClass) : TCHARzToStr(DateTimeClass);
 }
 
--- a/dwt/widgets/Decorations.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Decorations.d	Mon May 05 00:12:38 2008 +0200
@@ -717,7 +717,7 @@
     return swFlags is OS.SW_SHOWMINNOACTIVE;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -749,7 +749,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     int length = OS.GetWindowTextLength (handle);
     if (length is 0) return "";
@@ -1333,7 +1333,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     /* Use the character encoding for the default locale */
@@ -1607,7 +1607,7 @@
     if (OS.GetParent ( cast(HWND)lParam) is handle) {
         TCHAR[128] buffer = 0;
         OS.GetClassName (cast(HWND)lParam, buffer.ptr, buffer.length );
-        char[] className = TCHARzToStr( buffer.ptr );
+        String className = TCHARzToStr( buffer.ptr );
         if (className == Display.AWT_WINDOW_CLASS) {
             return LRESULT.ZERO;
         }
--- a/dwt/widgets/Dialog.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Dialog.d	Mon May 05 00:12:38 2008 +0200
@@ -17,6 +17,7 @@
 import dwt.DWTException;
 import dwt.widgets.Shell;
 import dwt.widgets.Display;
+import dwt.dwthelper.utils;
 
 /**
  * This class is the abstract superclass of the classes
@@ -81,7 +82,7 @@
 public abstract class Dialog {
     int style;
     Shell parent;
-    char[] title;
+    String title;
 
 /**
  * Constructs a new instance of this class given only its
@@ -228,7 +229,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     return title;
 }
 
@@ -247,7 +248,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     title = string;
 }
--- a/dwt/widgets/DirectoryDialog.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/DirectoryDialog.d	Mon May 05 00:12:38 2008 +0200
@@ -40,9 +40,9 @@
  */
 
 public class DirectoryDialog : Dialog {
-    static char[] message = "";
-    static char[] filterPath = "";  //$NON-NLS-1$//$NON-NLS-2$
-    static char[] directoryPath;
+    static String message = "";
+    static String filterPath = "";  //$NON-NLS-1$//$NON-NLS-2$
+    static String directoryPath;
 
 /**
  * Constructs a new instance of this class given only its parent.
@@ -128,7 +128,7 @@
  *
  * @see #setFilterPath
  */
-public char[] getFilterPath () {
+public String getFilterPath () {
     return filterPath;
 }
 
@@ -139,7 +139,7 @@
  *
  * @return the message
  */
-public char[] getMessage () {
+public String getMessage () {
     return message;
 }
 
@@ -155,7 +155,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the dialog</li>
  * </ul>
  */
-public char[] open () {
+public String open () {
     if (OS.IsWinCE) DWT.error (DWT.ERROR_NOT_IMPLEMENTED);
 
     auto hHeap = OS.GetProcessHeap ();
@@ -167,7 +167,7 @@
     /* Copy the message to OS memory */
     TCHAR* lpszTitle;
     if (message.length !is 0) {
-        char[] string = message;
+        String string = message;
         if (string.indexOf ('&') !is -1) {
             int length = string.length;
             char [] buffer = new char [length * 2];
@@ -297,7 +297,7 @@
  *
  * @param string the filter path
  */
-public void setFilterPath (char[] string) {
+public void setFilterPath (String string) {
     filterPath = string;
 }
 
@@ -312,7 +312,7 @@
  *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
  * </ul>
  */
-public void setMessage (char[] string) {
+public void setMessage (String string) {
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     message = string;
 }
--- a/dwt/widgets/Display.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Display.d	Mon May 05 00:12:38 2008 +0200
@@ -152,8 +152,8 @@
     int threadId;
     TCHAR[] windowClass_, windowShadowClass;
     static int WindowClassCount;
-    static const char[] WindowName = "SWT_Window"; //$NON-NLS-1$
-    static const char[] WindowShadowName = "SWT_WindowShadow"; //$NON-NLS-1$
+    static const String WindowName = "SWT_Window"; //$NON-NLS-1$
+    static const String WindowShadowName = "SWT_WindowShadow"; //$NON-NLS-1$
     EventTable eventTable, filterTable;
 
     /* Widget Table */
@@ -243,13 +243,13 @@
     HHOOK msgHook;
     HWND embeddedHwnd;
     int embeddedProc_;
-    static const char[] AWT_WINDOW_CLASS = "SunAwtWindow";
+    static const String AWT_WINDOW_CLASS = "SunAwtWindow";
     static const short [] ACCENTS = [ cast(short) '~', '`', '\'', '^', '"'];
 
     /* Sync/Async Widget Communication */
     Synchronizer synchronizer;
     bool runMessages = true, runMessagesInIdle = false;
-    static const char[] RUN_MESSAGES_IN_IDLE_KEY = "org.eclipse.swt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
+    static const String RUN_MESSAGES_IN_IDLE_KEY = "org.eclipse.swt.internal.win32.runMessagesInIdle"; //$NON-NLS-1$
     Thread thread;
 
     /* Display Shutdown */
@@ -311,7 +311,7 @@
 
     /* Display Data */
     Object data;
-    char[] [] keys;
+    String [] keys;
     Object [] values;
 
     /* Key Mappings */
@@ -422,7 +422,7 @@
     int hitCount;
 
     /* Package Name */
-    static const char[] PACKAGE_PREFIX = "org.eclipse.swt.widgets."; //$NON-NLS-1$
+    static const String PACKAGE_PREFIX = "org.eclipse.swt.widgets."; //$NON-NLS-1$
     /*
     * This code is intentionally commented.  In order
     * to support CLDC, .class cannot be used because
@@ -430,7 +430,7 @@
     * they are targeted for CLDC.
     */
 //  static {
-//      char[] name = Display.class.getName ();
+//      String name = Display.class.getName ();
 //      int index = name.lastIndexOf ('.');
 //      PACKAGE_PREFIX = name.substring (0, index + 1);
 //  }
@@ -1580,7 +1580,7 @@
 
 //PORTING_TODO
 /+static bool isValidClass (Class clazz) {
-    char[] name = clazz.getName ();
+    String name = clazz.getName ();
     int index = name.lastIndexOf ('.');
     return name.substring (0, index + 1).equals (PACKAGE_PREFIX);
 }+/
@@ -1610,7 +1610,7 @@
  * @see #setData(String, Object)
  * @see #disposeExec(Runnable)
  */
-public Object getData (char[] key) {
+public Object getData (String key) {
     checkDevice ();
     if (key is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (key ==/*eq*/RUN_MESSAGES_IN_IDLE_KEY) {
@@ -1712,7 +1712,7 @@
     return _getFocusControl ();
 }
 
-char[] getFontName (LOGFONT* logFont) {
+String getFontName (LOGFONT* logFont) {
     wchar* chars;
     static if (OS.IsUnicode) {
         chars = logFont.lfFaceName.ptr;
@@ -1791,7 +1791,7 @@
         result = OS.RegQueryValueEx (phkResult , buffer2, null, null, lpData.ptr, &lpcbData);
         if (result is 0) {
             try {
-                depth = Integer.parseInt ( cast(char[]) lpData );
+                depth = Integer.parseInt ( cast(String) lpData );
             } catch (NumberFormatException e) {}
         }
     }
@@ -2501,8 +2501,8 @@
     threadId = OS.GetCurrentThreadId ();
 
     /* Use the character encoding for the default locale */
-    windowClass_ = StrToTCHARs ( 0, WindowName ~ to!(char[])(WindowClassCount), true );
-    windowShadowClass = StrToTCHARs ( 0, WindowShadowName ~ to!(char[])(WindowClassCount), true );
+    windowClass_ = StrToTCHARs ( 0, WindowName ~ to!(String)(WindowClassCount), true );
+    windowShadowClass = StrToTCHARs ( 0, WindowShadowName ~ to!(String)(WindowClassCount), true );
     WindowClassCount++;
 
     /* Register the DWT window class */
@@ -3990,7 +3990,7 @@
  * @see #getData(String)
  * @see #disposeExec(Runnable)
  */
-public void setData (char[] key, Object value) {
+public void setData (String key, Object value) {
     checkDevice ();
     if (key is null) error (DWT.ERROR_NULL_ARGUMENT);
 
@@ -4010,7 +4010,7 @@
             keys = null;
             values = null;
         } else {
-            char[] [] newKeys = new char[] [keys.length - 1];
+            String [] newKeys = new String [keys.length - 1];
             Object [] newValues = new Object [values.length - 1];
             System.arraycopy (keys, 0, newKeys, 0, index);
             System.arraycopy (keys, index + 1, newKeys, index, newKeys.length - index);
@@ -4036,7 +4036,7 @@
             return;
         }
     }
-    char[] [] newKeys = new char[] [keys.length + 1];
+    String [] newKeys = new String [keys.length + 1];
     Object [] newValues = new Object [values.length + 1];
     System.arraycopy (keys, 0, newKeys, 0, keys.length);
     System.arraycopy (values, 0, newValues, 0, values.length);
@@ -4082,7 +4082,7 @@
  *
  * @param name the new app name or <code>null</code>
  */
-public static void setAppName (char[] name) {
+public static void setAppName (String name) {
     /* Do nothing */
 }
 
@@ -4490,7 +4490,7 @@
     return OS.DefWindowProc (hwnd, msg, wParam, lParam);
 }
 
-static char[] withCrLf (char[] string) {
+static String withCrLf (String string) {
 
     /* If the string is empty, return the string. */
     int length_ = string.length;
@@ -4535,7 +4535,7 @@
     return result.toString ();
 }
 
-char[] windowClass(){
+String windowClass(){
     return TCHARsToStr( windowClass_ );
 }
 
--- a/dwt/widgets/Event.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Event.d	Mon May 05 00:12:38 2008 +0200
@@ -19,6 +19,7 @@
 import dwt.widgets.Display;
 
 import tango.text.convert.Format;
+import dwt.dwthelper.utils;
 
 
 /**
@@ -180,7 +181,7 @@
      * Setting this field will change the text that is about to
      * be inserted or deleted.
      */
-    public char[] text;
+    public String text;
 
     /**
      * depending on the event, a flag indicating whether the operation
@@ -221,7 +222,7 @@
  *
  * @return a string representation of the event
  */
-override public char[] toString () {
+override public String toString () {
     return Format( "Event {{type={} {} time={} data={} x={} y={} width={} height={} detail={}}",
         type, widget, time, data, x, y, width, height, detail );  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
 }
--- a/dwt/widgets/ExpandBar.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/ExpandBar.d	Mon May 05 00:12:38 2008 +0200
@@ -582,7 +582,7 @@
     layoutItems (index + 1, true);
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return display.windowClass();
 }
 
--- a/dwt/widgets/ExpandItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/ExpandItem.d	Mon May 05 00:12:38 2008 +0200
@@ -497,7 +497,7 @@
     }
 }
 
-override public void setText (char[] string) {
+override public void setText (String string) {
     super.setText (string);
     redraw (true);
 }
--- a/dwt/widgets/FileDialog.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/FileDialog.d	Mon May 05 00:12:38 2008 +0200
@@ -39,11 +39,11 @@
  * </p>
  */
 public class FileDialog : Dialog {
-    char[] [] filterNames;
-    char[] [] filterExtensions;
-    char[] [] fileNames;
-    char[] filterPath = "", fileName = "";
-    static final char[] FILTER = "*.*";
+    String [] filterNames;
+    String [] filterExtensions;
+    String [] fileNames;
+    String filterPath = "", fileName = "";
+    static final String FILTER = "*.*";
     static int BUFFER_SIZE = 1024 * 32;
     static bool USE_HOOK;
 
@@ -100,7 +100,7 @@
  *
  * @return the relative path of the file
  */
-public char[] getFileName () {
+public String getFileName () {
     return fileName;
 }
 
@@ -110,7 +110,7 @@
  *
  * @return the relative paths of the files
  */
-public char[] [] getFileNames () {
+public String [] getFileNames () {
     return fileNames;
 }
 
@@ -120,7 +120,7 @@
  *
  * @return the file extensions filter
  */
-public char[] [] getFilterExtensions () {
+public String [] getFilterExtensions () {
     return filterExtensions;
 }
 
@@ -130,7 +130,7 @@
  *
  * @return the list of filter names
  */
-public char[] [] getFilterNames () {
+public String [] getFilterNames () {
     return filterNames;
 }
 
@@ -143,7 +143,7 @@
  *
  * @see #setFilterExtensions
  */
-public char[] getFilterPath () {
+public String getFilterPath () {
     return filterPath;
 }
 
@@ -188,7 +188,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the dialog</li>
  * </ul>
  */
-public char[] open () {
+public String open () {
     auto hHeap = OS.GetProcessHeap ();
 
     /* Get the owner HWND for the dialog */
@@ -204,11 +204,11 @@
     OS.MoveMemory (lpstrTitle, buffer3.ptr, byteCount3);
 
     /* Compute filters and copy into lpstrFilter */
-    char[] strFilter = "";
+    String strFilter = "";
     if (filterNames is null) filterNames = null;
     if (filterExtensions is null) filterExtensions = null;
     for (int i=0; i<filterExtensions.length; i++) {
-        char[] filterName = filterExtensions [i];
+        String filterName = filterExtensions [i];
         if (i < filterNames.length) filterName = filterNames [i];
         strFilter = strFilter ~ filterName ~ '\0' ~ filterExtensions [i] ~ '\0';
     }
@@ -335,8 +335,8 @@
     lpstrFile = struct_.lpstrFile;
 
     /* Set the new path, file name and filter */
-    fileNames = new char[] [0];
-    char[] fullPath = null;
+    fileNames = new String [0];
+    String fullPath = null;
     if (success) {
 
         /* Use the character encoding for the default locale */
@@ -378,15 +378,15 @@
             * by a NULL character with 2 NULL characters at the end.
             */
             int count = 0;
-            fileNames = new char[][]( (style & DWT.MULTI) !is 0 ? 4 : 1 );
+            fileNames = new String[]( (style & DWT.MULTI) !is 0 ? 4 : 1 );
             int start = nFileOffset;
             do {
                 int end = start;
                 while (end < buffer.length && buffer[end] !is 0) end++;
-                char[] string = TCHARsToStr( buffer[ start .. end ] );
+                String string = TCHARsToStr( buffer[ start .. end ] );
                 start = end;
                 if (count is fileNames.length) {
-                    char[] [] newFileNames = new char[][]( fileNames.length + 4 );
+                    String [] newFileNames = new String[]( fileNames.length + 4 );
                     System.arraycopy (fileNames, 0, newFileNames, 0, fileNames.length);
                     fileNames = newFileNames;
                 }
@@ -396,14 +396,14 @@
             } while (start < buffer.length && buffer[start] !is 0);
 
             if (fileNames.length > 0) fileName = fileNames  [0];
-            char[] separator = "";
+            String separator = "";
             int length_ = filterPath.length;
             if (length_ > 0 && filterPath[length_ - 1] !is '\\') {
                 separator = "\\";
             }
             fullPath = filterPath ~ separator ~ fileName;
             if (count < fileNames.length) {
-                char[] [] newFileNames = new char[][]( count );
+                String [] newFileNames = new String[]( count );
                 System.arraycopy (fileNames, 0, newFileNames, 0, count);
                 fileNames = newFileNames;
             }
@@ -437,7 +437,7 @@
  *
  * @param string the file name
  */
-public void setFileName (char[] string) {
+public void setFileName (String string) {
     fileName = string;
 }
 
@@ -456,7 +456,7 @@
  * @see #setFilterNames to specify the user-friendly
  * names corresponding to the extensions
  */
-public void setFilterExtensions (char[] [] extensions) {
+public void setFilterExtensions (String [] extensions) {
     filterExtensions = extensions;
 }
 
@@ -474,7 +474,7 @@
  *
  * @see #setFilterExtensions
  */
-public void setFilterNames (char[] [] names) {
+public void setFilterNames (String [] names) {
     filterNames = names;
 }
 
@@ -495,7 +495,7 @@
  *
  * @see #setFilterExtensions
  */
-public void setFilterPath (char[] string) {
+public void setFilterPath (String string) {
     filterPath = string;
 }
 
--- a/dwt/widgets/Group.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Group.d	Mon May 05 00:12:38 2008 +0200
@@ -49,7 +49,7 @@
     alias Composite.computeSize computeSize;
     alias Composite.windowProc windowProc;
 
-    char[] text = "";
+    String text = "";
     static const int CLIENT_INSET = 3;
     private static /+const+/ WNDPROC GroupProc;
     static if( OS.IsWinCE ){
@@ -187,7 +187,7 @@
         * the work around must run all the time to stop the preferred
         * size from changing when a group is enabled and disabled.
         */
-        char[] string = text;
+        String string = text;
         if ((style & DWT.RIGHT_TO_LEFT) !is 0) {
             if (OS.COMCTL32_MAJOR < 6 || !OS.IsAppThemed ()) {
                 string = " " ~ string ~ " ";
@@ -245,7 +245,7 @@
     */
     if ((style & DWT.RIGHT_TO_LEFT) !is 0) {
         if (OS.COMCTL32_MAJOR < 6 || !OS.IsAppThemed ()) {
-            char[] string = enabled || text.length is 0 ? text : " " ~ text ~ " ";
+            String string = enabled || text.length is 0 ? text : " " ~ text ~ " ";
             TCHAR* buffer = StrToTCHARz (/+getCodePage (),+/ string);
             OS.SetWindowText (handle, buffer);
         }
@@ -271,7 +271,7 @@
     return new Rectangle (x, y, width, height);
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -287,7 +287,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     return text;
 }
@@ -339,7 +339,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     text = string;
@@ -374,7 +374,7 @@
     return super.widgetStyle () | OS.BS_GROUPBOX | OS.WS_CLIPCHILDREN | OS.WS_CLIPSIBLINGS;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr( GroupClass );
 }
 
--- a/dwt/widgets/Item.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Item.d	Mon May 05 00:12:38 2008 +0200
@@ -16,6 +16,7 @@
 import dwt.widgets.Widget;
 import dwt.DWT;
 import dwt.graphics.Image;
+import dwt.dwthelper.utils;
 
 /**
  * This class is the abstract superclass of all non-windowed
@@ -30,7 +31,7 @@
  */
 
 public abstract class Item : Widget {
-    char[] text;
+    String text;
     Image image;
 
 /**
@@ -119,7 +120,7 @@
     return image;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -134,7 +135,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget();
     return text;
 }
@@ -178,7 +179,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     text = string;
--- a/dwt/widgets/Label.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Label.d	Mon May 05 00:12:38 2008 +0200
@@ -56,7 +56,7 @@
     alias Control.computeSize computeSize;
     alias Control.windowProc windowProc;
 
-    char[] text = "";
+    String text = "";
     Image image;
     static const int MARGIN = 4;
     static const bool IMAGE_AND_TEXT = false;
@@ -249,7 +249,7 @@
     return image;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -265,7 +265,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     if ((style & DWT.SEPARATOR) !is 0) return "";
     return text;
@@ -392,7 +392,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     // DWT extensions allow null argument
@@ -453,7 +453,7 @@
     return bits | OS.SS_LEFTNOWORDWRAP;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr( LabelClass );
 }
 
--- a/dwt/widgets/Link.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Link.d	Mon May 05 00:12:38 2008 +0200
@@ -65,12 +65,12 @@
     alias Control.computeSize computeSize;
     alias Control.windowProc windowProc;
 
-    char[] text;
+    String text;
     TextLayout layout;
     Color linkColor, disabledColor;
     Point [] offsets;
     Point selection;
-    char[] [] ids;
+    String [] ids;
     int [] mnemonics;
     int focusIndex, mouseDownIndex;
     HFONT font;
@@ -226,7 +226,7 @@
         }
         disabledColor = Color.win32_new (display, OS.GetSysColor (OS.COLOR_GRAYTEXT));
         offsets = new Point [0];
-        ids = new char[] [0];
+        ids = new String [0];
         mnemonics = new int [0];
         selection = new Point (-1, -1);
         focusIndex = mouseDownIndex = -1;
@@ -351,7 +351,7 @@
     });
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -395,15 +395,15 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     return text;
 }
 
-char[] parse (char[] string) {
+String parse (String string) {
     int length_ = string.length;
     offsets = new Point [length_ / 4];
-    ids = new char[] [length_ / 4];
+    ids = new String [length_ / 4];
     mnemonics = new int [length_ / 4 + 1];
     StringBuffer result = new StringBuffer ();
     char [] buffer = new char [length_];
@@ -537,7 +537,7 @@
         Point [] newOffsets = new Point [linkIndex];
         System.arraycopy (offsets, 0, newOffsets, 0, linkIndex);
         offsets = newOffsets;
-        char[] [] newIDs = new char[] [linkIndex];
+        String [] newIDs = new String [linkIndex];
         System.arraycopy (ids, 0, newIDs, 0, linkIndex);
         ids = newIDs;
         int [] newMnemonics = new int [linkIndex + 1];
@@ -626,7 +626,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (string==/*eq*/text) return;
@@ -679,7 +679,7 @@
     return bits | OS.WS_TABSTOP;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return OS.COMCTL32_MAJOR >= 6 ? TCHARsToStr(LinkClass) : display.windowClass();
 }
 
--- a/dwt/widgets/List.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/List.d	Mon May 05 00:12:38 2008 +0200
@@ -118,7 +118,7 @@
  *
  * @see #add(String,int)
  */
-public void add (char[] string) {
+public void add (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     TCHAR* buffer = StrToTCHARz ( getCodePage (), string);
@@ -150,7 +150,7 @@
  *
  * @see #add(String)
  */
-public void add (char[] string, int index) {
+public void add (String string, int index) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (index is -1) error (DWT.ERROR_INVALID_RANGE);
@@ -425,7 +425,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getItem (int index) {
+public String getItem (int index) {
     checkWidget ();
     int length_ = OS.SendMessage (handle, OS.LB_GETTEXTLEN, index, 0);
     if (length_ !is OS.LB_ERR) {
@@ -490,10 +490,10 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] [] getItems () {
+public String [] getItems () {
     checkWidget ();
     int count = getItemCount ();
-    char[] [] result = new char[] [count];
+    String [] result = new String [count];
     for (int i=0; i<count; i++) result [i] = getItem (i);
     return result;
 }
@@ -514,10 +514,10 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] [] getSelection () {
+public String [] getSelection () {
     checkWidget ();
     int [] indices = getSelectionIndices ();
-    char[] [] result = new char[] [indices.length];
+    String [] result = new String [indices.length];
     for (int i=0; i<indices.length; i++) {
         result [i] = getItem (indices [i]);
     }
@@ -642,7 +642,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int indexOf (char[] string) {
+public int indexOf (String string) {
     return indexOf (string, 0);
 }
 
@@ -665,7 +665,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public int indexOf (char[] string, int start) {
+public int indexOf (String string, int start) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
 
@@ -920,7 +920,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void remove (char[] string) {
+public void remove (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     int index = indexOf (string, 0);
@@ -1172,7 +1172,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setItem (int index, char[] string) {
+public void setItem (int index, String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     int topIndex = getTopIndex ();
@@ -1197,7 +1197,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setItems (char[] [] items) {
+public void setItems (String [] items) {
     checkWidget ();
     if (items is null) error (DWT.ERROR_NULL_ARGUMENT);
     for (int i=0; i<items.length; i++) {
@@ -1226,7 +1226,7 @@
     int index = 0;
     int cp = getCodePage ();
     while (index < length) {
-        char[] string = items [index];
+        String string = items [index];
         TCHAR* buffer = StrToTCHARz (cp, string);
         int result = OS.SendMessage (handle, OS.LB_ADDSTRING, 0, buffer);
         if (result is OS.LB_ERR || result is OS.LB_ERRSPACE) break;
@@ -1366,7 +1366,7 @@
  * @see List#select(int[])
  * @see List#setSelection(int[])
  */
-public void setSelection (char[] [] items) {
+public void setSelection (String [] items) {
     checkWidget ();
     if (items is null) error (DWT.ERROR_NULL_ARGUMENT);
     deselectAll ();
@@ -1374,7 +1374,7 @@
     if (length is 0 || ((style & DWT.SINGLE) !is 0 && length > 1)) return;
     int focusIndex = -1;
     for (int i=length-1; i>=0; --i) {
-        char[] string = items [i];
+        String string = items [i];
         int index = 0;
         if (string !is null) {
             int localFocus = -1;
@@ -1524,7 +1524,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr( ListClass );
 }
 
--- a/dwt/widgets/Menu.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Menu.d	Mon May 05 00:12:38 2008 +0200
@@ -879,8 +879,8 @@
     return OS.GetMenuItemCount (handle);
 }
 
-override char[] getNameText () {
-    char[] result = "";
+override String getNameText () {
+    String result = "";
     MenuItem [] items = getItems ();
     int length_ = items.length;
     if (length_ > 0) {
--- a/dwt/widgets/MenuItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/MenuItem.d	Mon May 05 00:12:38 2008 +0200
@@ -463,7 +463,7 @@
     return menu;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     if ((style & DWT.SEPARATOR) !is 0) return "|";
     return super.getNameText ();
 }
@@ -1043,7 +1043,7 @@
  *
  * @see #setAccelerator
  */
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if ((style & DWT.SEPARATOR) !is 0) return;
--- a/dwt/widgets/MessageBox.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/MessageBox.d	Mon May 05 00:12:38 2008 +0200
@@ -19,6 +19,7 @@
 import dwt.widgets.Dialog;
 import dwt.widgets.Shell;
 import dwt.widgets.Display;
+import dwt.dwthelper.utils;
 
 /**
  * Instances of this class are used to inform or warn the user.
@@ -41,7 +42,7 @@
  * </p>
  */
 public  class MessageBox : Dialog {
-    char[] message = "";
+    String message = "";
     private bool allowNullParent = false;
 
 /**
@@ -123,7 +124,7 @@
  *
  * @return the message
  */
-public char[] getMessage () {
+public String getMessage () {
     return message;
 }
 
@@ -264,7 +265,7 @@
  *    <li>ERROR_NULL_ARGUMENT - if the string is null</li>
  * </ul>
  */
-public void setMessage (char[] string) {
+public void setMessage (String string) {
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     message = string;
 }
@@ -272,7 +273,7 @@
 /++
  + DWT extension
  +/
-public static int showMessageBox(char[] str, char[] title, Shell shell, int style) {
+public static int showMessageBox(String str, String title, Shell shell, int style) {
     MessageBox msgBox = (shell is null ) ? new MessageBox( style ) : new MessageBox(shell, style);
     msgBox.setMessage(str);
     if(title !is null){
@@ -282,18 +283,18 @@
 }
 
 /// DWT extension
-public static int showInfo(char[] str, char[] title = null, Shell shell = null) {
+public static int showInfo(String str, String title = null, Shell shell = null) {
     return showMessageBox( str, title, shell, DWT.OK | DWT.ICON_INFORMATION );
 }
 /// DWT extension
 alias showInfo showInformation;
 
 /// DWT extension
-public static int showWarning(char[] str, char[] title = null, Shell shell = null) {
+public static int showWarning(String str, String title = null, Shell shell = null) {
     return showMessageBox( str, title, shell, DWT.OK | DWT.ICON_WARNING );
 }
 /// DWT extension
-public static int showError(char[] str, char[] title = null, Shell shell = null) {
+public static int showError(String str, String title = null, Shell shell = null) {
     return showMessageBox( str, title, shell, DWT.OK | DWT.ICON_ERROR );
 }
 
--- a/dwt/widgets/ProgressBar.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/ProgressBar.d	Mon May 05 00:12:38 2008 +0200
@@ -314,7 +314,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr( ProgressBarClass );
 }
 
--- a/dwt/widgets/Sash.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Sash.d	Mon May 05 00:12:38 2008 +0200
@@ -189,7 +189,7 @@
     eventTable.unhook (DWT.DefaultSelection,listener);
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return display.windowClass();
 }
 
--- a/dwt/widgets/Scale.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Scale.d	Mon May 05 00:12:38 2008 +0200
@@ -443,7 +443,7 @@
     return bits | OS.TBS_VERT;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr(TrackBarClass);
 }
 
--- a/dwt/widgets/Scrollable.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Scrollable.d	Mon May 05 00:12:38 2008 +0200
@@ -250,7 +250,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return display.windowClass();
 }
 
--- a/dwt/widgets/Shell.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Shell.d	Mon May 05 00:12:38 2008 +0200
@@ -148,7 +148,7 @@
     int minWidth = DWT.DEFAULT, minHeight = DWT.DEFAULT;
     HBRUSH [] brushes;
     bool showWithParent;
-    char[] toolTitle, balloonTitle;
+    String toolTitle, balloonTitle;
     HICON toolIcon;
     HICON balloonIcon;
     WNDPROC windowProc_;
@@ -801,7 +801,7 @@
 void fixShell (Shell newShell, Control control) {
     if (this is newShell) return;
     if (control is lastActive) setActiveControl (null);
-    char[] toolTipText = control.toolTipText_;
+    String toolTipText = control.toolTipText_;
     if (toolTipText !is null) {
         control.setToolTipText (this, null);
         control.setToolTipText (newShell, toolTipText);
@@ -1502,7 +1502,7 @@
     this.region = region;
 }
 
-void setToolTipText (HWND hwnd, char[] text) {
+void setToolTipText (HWND hwnd, String text) {
     static if (OS.IsWinCE) return;
     TOOLINFO lpti;
     lpti.cbSize = TOOLINFO.sizeof;
@@ -1555,7 +1555,7 @@
     lpnmtdi.lpszText = lpstrTip;
 }
 
-void setToolTipTitle (HWND hwndToolTip, char[] text, HICON icon) {
+void setToolTipTitle (HWND hwndToolTip, String text, HICON icon) {
     /*
     * Bug in Windows.  For some reason, when TTM_SETTITLE
     * is used to set the title of a tool tip, Windows leaks
@@ -1766,7 +1766,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     static if (OS.IsSP) return DialogClass;
     if ((style & DWT.TOOL) !is 0) {
         int trim = DWT.TITLE | DWT.CLOSE | DWT.MIN | DWT.MAX | DWT.BORDER | DWT.RESIZE;
--- a/dwt/widgets/Slider.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Slider.d	Mon May 05 00:12:38 2008 +0200
@@ -643,7 +643,7 @@
     return bits | OS.SBS_VERT;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr(ScrollBarClass);
 }
 
--- a/dwt/widgets/Spinner.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Spinner.d	Mon May 05 00:12:38 2008 +0200
@@ -313,7 +313,7 @@
         RECT rect;
         int max;
         OS.SendMessage (hwndUpDown , OS.UDM_GETRANGE32, null, &max);
-        char[] string = .toString( max );
+        String string = .toString( max );
         if (digits > 0) {
             StringBuffer buffer = new StringBuffer ();
             buffer.append (string);
@@ -451,7 +451,7 @@
     return digits;
 }
 
-char[] getDecimalSeparator () {
+String getDecimalSeparator () {
     TCHAR[] tchar = NewTCHARs (getCodePage (), 4);
     int size = OS.GetLocaleInfo (OS.LOCALE_USER_DEFAULT, OS.LOCALE_SDECIMAL, tchar.ptr, 4);
     return size !is 0 ? TCHARsToStr( tchar[0 .. size-1] ) : ".";
@@ -548,15 +548,15 @@
     int length_ = OS.GetWindowTextLength (hwndText);
     TCHAR[] buffer = NewTCHARs (getCodePage (), length_ + 1);
     OS.GetWindowText (hwndText, buffer.ptr, length_ + 1);
-    char[] string = TCHARsToStr( buffer[ 0 .. length_] );
+    String string = TCHARsToStr( buffer[ 0 .. length_] );
     try {
         int value;
         if (digits > 0) {
-            char[] decimalSeparator = getDecimalSeparator ();
+            String decimalSeparator = getDecimalSeparator ();
             int index = string.indexOf (decimalSeparator);
             if (index !is -1)  {
-                char[] wholePart = string.substring (0, index);
-                char[] decimalPart = string.substring (index + 1);
+                String wholePart = string.substring (0, index);
+                String decimalPart = string.substring (index + 1);
                 if (decimalPart.length > digits) {
                     decimalPart = decimalPart.substring (0, digits);
                 } else {
@@ -733,7 +733,7 @@
     }
 
     /* Verify the character */
-    char[] oldText = "";
+    String oldText = "";
     int start, end;
     OS.SendMessage (hwndText, OS.EM_GETSEL, &start, &end);
     switch (key) {
@@ -771,7 +771,7 @@
             oldText = [key];
             break;
     }
-    char[] newText = verifyText (oldText, start, end, event);
+    String newText = verifyText (oldText, start, end, event);
     if (newText is null) return false;
     if (newText is oldText) return true;
     TCHAR* buffer = StrToTCHARz (getCodePage (), newText);
@@ -963,9 +963,9 @@
         OS.SendMessage (hwndUpDown , OS.IsWinCE ? OS.UDM_SETPOS : OS.UDM_SETPOS32, 0, value);
     }
     if (setText) {
-        char[] string = .toString( value );
+        String string = .toString( value );
         if (digits > 0) {
-            char[] decimalSeparator = getDecimalSeparator ();
+            String decimalSeparator = getDecimalSeparator ();
             int index = string.length - digits;
             StringBuffer buffer = new StringBuffer ();
             if (index > 0) {
@@ -991,7 +991,7 @@
     if (notify) postEvent (DWT.Selection);
 }
 
-override void setToolTipText (Shell shell, char[] string) {
+override void setToolTipText (Shell shell, String string) {
     shell.setToolTipText (hwndText, string);
     shell.setToolTipText (hwndUpDown, string);
 }
@@ -1047,7 +1047,7 @@
     OS.SetWindowLong (hwndUpDown, OS.GWL_WNDPROC, cast(int) UpDownProc);
 }
 
-char[] verifyText (char[] string, int start, int end, Event keyEvent) {
+String verifyText (String string, int start, int end, Event keyEvent) {
     Event event = new Event ();
     event.text = string;
     event.start = start;
@@ -1059,7 +1059,7 @@
     }
     int index = 0;
     if (digits > 0) {
-        char[] decimalSeparator = getDecimalSeparator ();
+        String decimalSeparator = getDecimalSeparator ();
         index = string.indexOf (decimalSeparator);
         if (index !is -1) {
             string = string.substring (0, index) ~ string.substring (index + 1);
@@ -1206,7 +1206,7 @@
 //  if (!hooks (DWT.Verify) && !filters (DWT.Verify)) return null;
     bool call = false;
     int start, end;
-    char[] newText = null;
+    String newText = null;
     switch (msg) {
         case OS.WM_CLEAR:
         case OS.WM_CUT:
@@ -1243,7 +1243,7 @@
         default:
     }
     if (newText !is null) {
-        char[] oldText = newText;
+        String oldText = newText;
         newText = verifyText (newText, start, end, null);
         if (newText is null) return LRESULT.ZERO;
         if ( newText !=/*eq*/ oldText ) {
--- a/dwt/widgets/TabFolder.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TabFolder.d	Mon May 05 00:12:38 2008 +0200
@@ -725,7 +725,7 @@
     }
 }
 
-override char[] toolTipText (NMTTDISPINFO* hdr) {
+override String toolTipText (NMTTDISPINFO* hdr) {
     if ((hdr.uFlags & OS.TTF_IDISHWND) !is 0) {
         return null;
     }
@@ -773,7 +773,7 @@
     return bits | OS.TCS_TABS | OS.TCS_TOOLTIPS;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr( TabFolderClass );
 }
 
--- a/dwt/widgets/TabItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TabItem.d	Mon May 05 00:12:38 2008 +0200
@@ -41,7 +41,7 @@
 public class TabItem : Item {
     TabFolder parent;
     Control control;
-    char[] toolTipText;
+    String toolTipText;
 
 /**
  * Constructs a new instance of this class given its parent
@@ -117,7 +117,7 @@
     parent.createItem (this, index);
 }
 
-void _setText (int index, char[] string) {
+void _setText (int index, String string) {
     /*
     * Bug in Windows.  In version 6.00 of COMCTL32.DLL, tab
     * items with an image and a label that includes '&' cause
@@ -202,7 +202,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget();
     return toolTipText;
 }
@@ -311,7 +311,7 @@
  * </ul>
  *
  */
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (string ==/*eq*/text ) return;
@@ -332,7 +332,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setToolTipText (char[] string) {
+public void setToolTipText (String string) {
     checkWidget();
     toolTipText = string;
 }
--- a/dwt/widgets/Table.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Table.d	Mon May 05 00:12:38 2008 +0200
@@ -1337,9 +1337,9 @@
     for (int i=0; i<itemCount; i++) {
         TableItem item = items [i];
         if (item !is null) {
-            char[] [] strings = item.strings;
+            String [] strings = item.strings;
             if (strings !is null) {
-                char[] [] temp = new char[] [columnCount + 1];
+                String [] temp = new String [columnCount + 1];
                 System.arraycopy (strings, 0, temp, 0, index);
                 System.arraycopy (strings, index, temp, index + 1, columnCount -  index);
                 item.strings = temp;
@@ -1354,7 +1354,7 @@
             if (index is 0) {
                 if (columnCount !is 0) {
                     if (strings is null) {
-                        item.strings = new char[] [columnCount + 1];
+                        item.strings = new String [columnCount + 1];
                         item.strings [1] = item.text;
                     }
                     item.text = ""; //$NON-NLS-1$
@@ -1745,11 +1745,11 @@
                 item.cellFont = null;
             } else {
                 if (item.strings !is null) {
-                    char[] [] strings = item.strings;
+                    String [] strings = item.strings;
                     if (index is 0) {
                         item.text = strings [1] !is null ? strings [1] : ""; //$NON-NLS-1$
                     }
-                    char[] [] temp = new char[] [columnCount];
+                    String [] temp = new String [columnCount];
                     System.arraycopy (strings, 0, temp, 0, index);
                     System.arraycopy (strings, index + 1, temp, index, columnCount - index);
                     item.strings = temp;
@@ -4240,7 +4240,7 @@
         int newWidth = 0, imageIndent = 0, index = 0;
         int itemCount = OS.SendMessage (handle, OS.LVM_GETITEMCOUNT, 0, 0);
         while (index < itemCount) {
-            char[] string = null;
+            String string = null;
             HFONT font = cast(HFONT)-1;
             if (item !is null) {
                 string = item.text;
@@ -4869,7 +4869,7 @@
     }
 }
 
-override char[] toolTipText (NMTTDISPINFO* hdr) {
+override String toolTipText (NMTTDISPINFO* hdr) {
     auto hwndToolTip = cast(HWND) OS.SendMessage (handle, OS.LVM_GETTOOLTIPS, 0, 0);
     if (hwndToolTip is hdr.hdr.hwndFrom && toolTipText_ !is null) return ""; //$NON-NLS-1$
     if (headerToolTipHandle is hdr.hdr.hwndFrom) {
@@ -4977,7 +4977,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr( TableClass );
 }
 
@@ -5942,11 +5942,11 @@
                 item.cached = true;
             }
             if ((plvfi.item.mask & OS.LVIF_TEXT) !is 0) {
-                char[] string = null;
+                String string = null;
                 if (plvfi.item.iSubItem is 0) {
                     string = item.text;
                 } else {
-                    char[] [] strings  = item.strings;
+                    String [] strings  = item.strings;
                     if (strings !is null) string = strings [plvfi.item.iSubItem];
                 }
                 if (string !is null) {
--- a/dwt/widgets/TableColumn.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TableColumn.d	Mon May 05 00:12:38 2008 +0200
@@ -48,7 +48,7 @@
 public class TableColumn : Item {
     Table parent;
     bool resizable, moveable;
-    char[] toolTipText;
+    String toolTipText;
     int id;
 
 /**
@@ -223,7 +223,7 @@
     return DWT.LEFT;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -297,7 +297,7 @@
  *
  * @since 3.2
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget();
     return toolTipText;
 }
@@ -771,7 +771,7 @@
     }
 }
 
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (string==/*eq*/text) return;
@@ -824,7 +824,7 @@
  *
  * @since 3.2
  */
-public void setToolTipText (char[] string) {
+public void setToolTipText (String string) {
     checkWidget();
     toolTipText = string;
     auto hwndHeaderToolTip = parent.headerToolTipHandle;
--- a/dwt/widgets/TableItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TableItem.d	Mon May 05 00:12:38 2008 +0200
@@ -43,7 +43,7 @@
 
 public class TableItem : Item {
     Table parent;
-    char[] [] strings;
+    String [] strings;
     Image [] images;
     bool checked, grayed, cached;
     int imageIndent, background = -1, foreground = -1;
@@ -384,7 +384,7 @@
             if (code is 0) return RECT.init;
             if (!hasImage) rect.right = rect.left;
             if (getText) {
-                char[] string = column is 0 ? text : strings !is null ? strings [column] : null;
+                String string = column is 0 ? text : strings !is null ? strings [column] : null;
                 if (string !is null) {
                     RECT textRect;
                     TCHAR[] buffer = StrToTCHARs (parent.getCodePage (), string, false);
@@ -599,7 +599,7 @@
     return imageIndent;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     if ((parent.style & DWT.VIRTUAL) !is 0) {
         if (!cached) return "*virtual*"; //$NON-NLS-1$
     }
@@ -621,7 +621,7 @@
     return parent;
 }
 
-override public char[] getText () {
+override public String getText () {
     checkWidget();
     if (!parent.checkData (this, true)) error (DWT.ERROR_WIDGET_DISPOSED);
     return super.getText ();
@@ -639,13 +639,13 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText (int index) {
+public String getText (int index) {
     checkWidget();
     if (!parent.checkData (this, true)) error (DWT.ERROR_WIDGET_DISPOSED);
     if (index is 0) return getText ();
     if (strings !is null) {
         if (0 <= index && index < strings.length) {
-            char[] string = strings [index];
+            String string = strings [index];
             return string !is null ? string : "";
         }
     }
@@ -1166,11 +1166,11 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] [] strings) {
+public void setText (String [] strings) {
     checkWidget();
     if (strings is null) error (DWT.ERROR_NULL_ARGUMENT);
     for (int i=0; i<strings.length; i++) {
-        char[] string = strings [i];
+        String string = strings [i];
         if (string !is null) setText (i, string);
     }
 }
@@ -1189,7 +1189,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (int index, char[] string) {
+public void setText (int index, String string) {
     checkWidget();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (index is 0) {
@@ -1199,7 +1199,7 @@
     int count = Math.max (1, parent.getColumnCount ());
     if (0 > index || index > count - 1) return;
     if (strings is null && index !is 0)  {
-        strings = new char[][] (count);
+        strings = new String[] (count);
         strings [0] = text;
     }
     if (strings !is null) {
@@ -1236,7 +1236,7 @@
     redraw (index, true, false);
 }
 
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget();
     setText (0, string);
 }
--- a/dwt/widgets/Text.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Text.d	Mon May 05 00:12:38 2008 +0200
@@ -59,7 +59,7 @@
 
     int tabs, oldStart, oldEnd;
     bool doubleClick, ignoreModify, ignoreVerify, ignoreCharacter;
-    char[] message;
+    String message;
 
     /**
     * The maximum number of characters that can be entered
@@ -80,7 +80,7 @@
     * is queried and from the widget, it will be delimited using
     * this delimiter.
     */
-    public static const char[] DELIMITER = "\r\n";
+    public static const String DELIMITER = "\r\n";
 
     /*
     * This code is intentionally commented.
@@ -282,7 +282,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void append (char[] string) {
+public void append (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     string = Display.withCrLf (string);
@@ -811,7 +811,7 @@
  *
  * @see #DELIMITER
  */
-public char[] getLineDelimiter () {
+public String getLineDelimiter () {
     checkWidget ();
     return DELIMITER;
 }
@@ -876,7 +876,7 @@
  *
  * @since 3.3
  */
-public char[] getMessage () {
+public String getMessage () {
     checkWidget ();
     return message;
 }
@@ -963,7 +963,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getSelectionText () {
+public String getSelectionText () {
     checkWidget ();
     int length = OS.GetWindowTextLength (handle);
     if (length is 0) return "";
@@ -1023,7 +1023,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget ();
     int length_ = OS.GetWindowTextLength (handle);
     if (length_ is 0) return "";
@@ -1050,7 +1050,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText (int start, int end) {
+public String getText (int start, int end) {
     checkWidget ();
     if (!(start <= end && 0 <= end)) return "";
     int length = OS.GetWindowTextLength (handle);
@@ -1155,7 +1155,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void insert (char[] string) {
+public void insert (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     string = Display.withCrLf (string);
@@ -1188,7 +1188,7 @@
     int cp = getCodePage ();
     int wcsTotal = 0, mbcsTotal = 0;
     char [] buffer = new char [128];
-    char[] delimiter = getLineDelimiter();
+    String delimiter = getLineDelimiter();
     int delimiterSize = delimiter.length;
     int count = OS.SendMessageA (handle, OS.EM_GETLINECOUNT, 0, 0);
     for (int line=0; line<count; line++) {
@@ -1372,7 +1372,7 @@
     }
 
     /* Verify the character */
-    char[] oldText = "";
+    String oldText = "";
     int start, end;
     OS.SendMessage (handle, OS.EM_GETSEL, &start, &end);
     switch (key) {
@@ -1423,7 +1423,7 @@
             oldText = [key];
             break;
     }
-    char[] newText = verifyText (oldText, start, end, event);
+    String newText = verifyText (oldText, start, end, event);
     if (newText is null) return false;
     if (newText is oldText) return true;
     newText = Display.withCrLf (newText);
@@ -1605,7 +1605,7 @@
  *
  * @since 3.3
  */
-public void setMessage (char[] message) {
+public void setMessage (String message) {
     checkWidget ();
     if (message is null) error (DWT.ERROR_NULL_ARGUMENT);
     this.message = message;
@@ -1823,7 +1823,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     string = Display.withCrLf (string);
@@ -1919,7 +1919,7 @@
     OS.SendMessage (handle, OS.EM_SCROLLCARET, 0, 0);
 }
 
-char[] verifyText (char[] string, int start, int end, Event keyEvent) {
+String verifyText (String string, int start, int end, Event keyEvent) {
     if (ignoreVerify) return string;
     Event event = new Event ();
     event.text = string;
@@ -1951,7 +1951,7 @@
     int cp = getCodePage ();
     int wcsTotal = 0, mbcsTotal = 0;
     char [] buffer = new char [128];
-    char[] delimiter = getLineDelimiter ();
+    String delimiter = getLineDelimiter ();
     int delimiterSize = delimiter.length;
     int count = OS.SendMessageA (handle, OS.EM_GETLINECOUNT, 0, 0);
     for (int line=0; line<count; line++) {
@@ -2022,7 +2022,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr(EditClass);
 }
 
@@ -2292,7 +2292,7 @@
     if (!hooks (DWT.Verify) && !filters (DWT.Verify)) return null;
     bool call = false;
     int start, end;
-    char[] newText = null;
+    String newText = null;
     switch (msg) {
         case OS.WM_CLEAR:
         case OS.WM_CUT:
@@ -2329,7 +2329,7 @@
         default:
     }
     if (newText !is null) {
-        char[] oldText = newText;
+        String oldText = newText;
         newText = verifyText (newText, start, end, null);
         if (newText is null) return LRESULT.ZERO;
         if (newText !=/*eq*/oldText) {
--- a/dwt/widgets/ToolBar.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/ToolBar.d	Mon May 05 00:12:38 2008 +0200
@@ -994,7 +994,7 @@
     return super.setTabItemFocus ();
 }
 
-override char[] toolTipText (NMTTDISPINFO* hdr) {
+override String toolTipText (NMTTDISPINFO* hdr) {
     if ((hdr.uFlags & OS.TTF_IDISHWND) !is 0) {
         return null;
     }
@@ -1043,7 +1043,7 @@
     return bits;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr(ToolBarClass);
 }
 
--- a/dwt/widgets/ToolItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/ToolItem.d	Mon May 05 00:12:38 2008 +0200
@@ -49,7 +49,7 @@
 public class ToolItem : Item {
     ToolBar parent;
     Control control;
-    char[] toolTipText;
+    String toolTipText;
     Image disabledImage, hotImage;
     Image disabledImage2;
     int id;
@@ -360,7 +360,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget();
     return toolTipText;
 }
@@ -768,7 +768,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if ((style & DWT.SEPARATOR) !is 0) return;
@@ -818,7 +818,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setToolTipText (char[] string) {
+public void setToolTipText (String string) {
     checkWidget();
     toolTipText = string;
 }
--- a/dwt/widgets/ToolTip.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/ToolTip.d	Mon May 05 00:12:38 2008 +0200
@@ -52,7 +52,7 @@
 public class ToolTip : Widget {
     Shell parent;
     TrayItem item;
-    char[] text = "", message = "";
+    String text = "", message = "";
     int id, x, y;
     bool autoHide = true, hasLocation, visible;
     static const int TIMER_ID = 100;
@@ -165,7 +165,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getMessage () {
+public String getMessage () {
     checkWidget();
     return message;
 }
@@ -196,7 +196,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getText () {
+public String getText () {
     checkWidget();
     return text;
 }
@@ -402,7 +402,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setMessage (char[] string) {
+public void setMessage (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     message = string;
@@ -422,7 +422,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setText (char[] string) {
+public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     text = string;
--- a/dwt/widgets/TrayItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TrayItem.d	Mon May 05 00:12:38 2008 +0200
@@ -51,7 +51,7 @@
     int id;
     Image image2;
     ToolTip toolTip;
-    char[] toolTipText;
+    String toolTipText;
     bool visible = true;
 
 /**
@@ -216,7 +216,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget ();
     return toolTipText;
 }
@@ -465,7 +465,7 @@
  *    <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li>
  * </ul>
  */
-public void setToolTipText (char[] value) {
+public void setToolTipText (String value) {
     checkWidget ();
     toolTipText = value;
     NOTIFYICONDATA iconData;
--- a/dwt/widgets/Tree.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Tree.d	Mon May 05 00:12:38 2008 +0200
@@ -829,11 +829,11 @@
                     * all text drawing for empty rectangles.
                     */
                     if (rect.left < rect.right) {
-                        char[] string = null;
+                        String string = null;
                         if (index is 0) {
                             string = item.text;
                         } else {
-                            char[] [] strings  = item.strings;
+                            String [] strings  = item.strings;
                             if (strings !is null) string = strings [index];
                         }
                         if (string !is null) {
@@ -1817,7 +1817,7 @@
 }
 int CompareProc (int lParam1, int lParam2, int lParamSort) {
     TreeItem item1 = items [lParam1], item2 = items [lParam2];
-    char[] text1 = item1.getText (lParamSort), text2 = item2.getText (lParamSort);
+    String text1 = item1.getText (lParamSort), text2 = item2.getText (lParamSort);
     return sortDirection is DWT.UP ? ( text1 < text2 ) : ( text2 < text1 );
 }
 
@@ -1964,9 +1964,9 @@
     for (int i=0; i<items.length; i++) {
         TreeItem item = items [i];
         if (item !is null) {
-            char[] [] strings = item.strings;
+            String [] strings = item.strings;
             if (strings !is null) {
-                char[] [] temp = new char[] [columnCount + 1];
+                String [] temp = new String [columnCount + 1];
                 System.arraycopy (strings, 0, temp, 0, index);
                 System.arraycopy (strings, index, temp, index + 1, columnCount - index);
                 item.strings = temp;
@@ -1981,7 +1981,7 @@
             if (index is 0) {
                 if (columnCount !is 0) {
                     if (strings is null) {
-                        item.strings = new char[] [columnCount + 1];
+                        item.strings = new String [columnCount + 1];
                         item.strings [1] = item.text;
                     }
                     item.text = "";
@@ -2426,11 +2426,11 @@
                 item.cellFont = null;
             } else {
                 if (item.strings !is null) {
-                    char[] [] strings = item.strings;
+                    String [] strings = item.strings;
                     if (index is 0) {
                         item.text = strings [1] !is null ? strings [1] : "";
                     }
-                    char[] [] temp = new char[] [columnCount];
+                    String [] temp = new String [columnCount];
                     System.arraycopy (strings, 0, temp, 0, index);
                     System.arraycopy (strings, index + 1, temp, index, columnCount - index);
                     item.strings = temp;
@@ -5065,7 +5065,7 @@
     }
 }
 
-override char[] toolTipText (NMTTDISPINFO* hdr) {
+override String toolTipText (NMTTDISPINFO* hdr) {
     auto hwndToolTip = cast(HWND) OS.SendMessage (handle, OS.TVM_GETTOOLTIPS, 0, 0);
     if (hwndToolTip is hdr.hdr.hwndFrom && toolTipText_ !is null) return ""; //$NON-NLS-1$
     if (headerToolTipHandle is hdr.hdr.hwndFrom) {
@@ -5096,7 +5096,7 @@
                 OS.GetClientRect (hwndParent, &rect);
                 OS.MapWindowPoints (hwndParent, handle, cast(POINT*) &rect, 2);
                 TreeItem item = _getItem (lpht.hItem);
-                char[] text = null;
+                String text = null;
                 int index = 0, count = Math.max (1, OS.SendMessage (hwndHeader, OS.HDM_GETITEMCOUNT, 0, 0));
                 int [] order = new int [count];
                 OS.SendMessage (hwndHeader, OS.HDM_GETORDERARRAY, count, order.ptr);
@@ -5114,7 +5114,7 @@
                             if (order [index] is 0) {
                                 text = item.text;
                             } else {
-                                char[][] strings = item.strings;
+                                String[] strings = item.strings;
                                 if (strings !is null) text = strings [order [index]];
                             }
                         }
@@ -5266,7 +5266,7 @@
     return bits | OS.TVS_DISABLEDRAGDROP;
 }
 
-override char[] windowClass () {
+override String windowClass () {
     return TCHARsToStr(TreeClass);
 }
 
@@ -6913,11 +6913,11 @@
                 index = OS.SendMessage (hwndHeader, OS.HDM_ORDERTOINDEX, 0, 0);
             }
             if ((lptvdi.item.mask & OS.TVIF_TEXT) !is 0) {
-                char[] string = null;
+                String string = null;
                 if (index is 0) {
                     string = item.text;
                 } else {
-                    char[] [] strings  = item.strings;
+                    String [] strings  = item.strings;
                     if (strings !is null) string = strings [index];
                 }
                 if (string !is null) {
--- a/dwt/widgets/TreeColumn.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TreeColumn.d	Mon May 05 00:12:38 2008 +0200
@@ -51,7 +51,7 @@
 public class TreeColumn : Item {
     Tree parent;
     bool resizable, moveable;
-    char[] toolTipText;
+    String toolTipText;
     int id;
 
 /**
@@ -251,7 +251,7 @@
     return moveable;
 }
 
-override char[] getNameText () {
+override String getNameText () {
     return getText ();
 }
 
@@ -300,7 +300,7 @@
  *
  * @since 3.2
  */
-public char[] getToolTipText () {
+public String getToolTipText () {
     checkWidget();
     return toolTipText;
 }
@@ -665,7 +665,7 @@
     }
 }
 
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget ();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (string==/*eq*/text) return;
@@ -708,7 +708,7 @@
  *
  * @since 3.2
  */
-public void setToolTipText (char[] string) {
+public void setToolTipText (String string) {
     checkWidget();
     toolTipText = string;
     auto hwndHeaderToolTip = parent.headerToolTipHandle;
--- a/dwt/widgets/TreeItem.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/TreeItem.d	Mon May 05 00:12:38 2008 +0200
@@ -56,7 +56,7 @@
      */
     public HANDLE handle;
     Tree parent;
-    char[] [] strings;
+    String [] strings;
     Image [] images;
     bool cached;
     int background = -1, foreground = -1;
@@ -511,7 +511,7 @@
                     rect.left = rect.right + Tree.INSET;
                     rect.right = headerRect.right;
                 } else {
-                    char[] string = index is 0 ? text : strings !is null ? strings [index] : null;
+                    String string = index is 0 ? text : strings !is null ? strings [index] : null;
                     if (string !is null) {
                         RECT textRect;
                         TCHAR[] buffer = StrToTCHARs (parent.getCodePage (), string, false);
@@ -883,7 +883,7 @@
     return hItem !is null ? parent._getItem (hItem) : null;
 }
 
-override public char[] getText () {
+override public String getText () {
     checkWidget();
     if (!parent.checkData (this, true)) error (DWT.ERROR_WIDGET_DISPOSED);
     return super.getText ();
@@ -903,13 +903,13 @@
  *
  * @since 3.1
  */
-public char[] getText (int index) {
+public String getText (int index) {
     checkWidget();
     if (!parent.checkData (this, true)) error (DWT.ERROR_WIDGET_DISPOSED);
     if (index is 0) return getText ();
     if (strings !is null) {
         if (0 <= index && index < strings.length) {
-            char[] string = strings [index];
+            String string = strings [index];
             return string !is null ? string : "";
         }
     }
@@ -1777,11 +1777,11 @@
  *
  * @since 3.1
  */
-public void setText (char[][] strings) {
+public void setText (String[] strings) {
     checkWidget();
     if (strings is null) error (DWT.ERROR_NULL_ARGUMENT);
     for (int i=0; i<strings.length; i++) {
-        char[] string = strings [i];
+        String string = strings [i];
         if (string !is null) setText (i, string);
     }
 }
@@ -1802,7 +1802,7 @@
  *
  * @since 3.1
  */
-public void setText (int index, char[] string) {
+public void setText (int index, String string) {
     checkWidget();
     if (string is null) error (DWT.ERROR_NULL_ARGUMENT);
     if (index is 0) {
@@ -1812,7 +1812,7 @@
     int count = Math.max (1, parent.getColumnCount ());
     if (0 > index || index > count - 1) return;
     if (strings is null && index !is 0) {
-        strings = new char[] [count];
+        strings = new String [count];
         strings [0] = text;
     }
     if (strings !is null) {
@@ -1835,7 +1835,7 @@
     }
 }
 
-override public void setText (char[] string) {
+override public void setText (String string) {
     checkWidget();
     setText (0, string);
 }
--- a/dwt/widgets/Widget.d	Sat Apr 26 10:01:48 2008 +0200
+++ b/dwt/widgets/Widget.d	Mon May 05 00:12:38 2008 +0200
@@ -474,7 +474,7 @@
     return null;
 }
 
-char [] fixMnemonic (char[] string) {
+char [] fixMnemonic (String string) {
     char [] buffer = string.dup;
     int i = 0, j = 0;
     while (i < buffer.length) {
@@ -543,13 +543,13 @@
  *
  * @see #setData(String, Object)
  */
-public Object getData (char[] key) {
+public Object getData (String key) {
     checkWidget();
     if (key is null) error (DWT.ERROR_NULL_ARGUMENT);
     if ((state & KEYED_DATA) !is 0) {
         Object [] table = (cast(ArrayWrapperObject) data).array;
         for (int i=1; i<table.length; i+=2) {
-            char[] tablekey = (cast(ArrayWrapperString) table[i]).array;
+            String tablekey = (cast(ArrayWrapperString) table[i]).array;
             if (key ==/*eq*/ tablekey ) return table [i+1];
         }
     }
@@ -587,8 +587,8 @@
  *
  * @return the name of the widget
  */
-char[] getName () {
-    char[] str = this.classinfo.name;
+String getName () {
+    String str = this.classinfo.name;
     int index = str.length;
     while ((--index > 0) && (str[index] !is '.')) {}
     return str[index + 1 .. $ ];
@@ -604,7 +604,7 @@
  *
  * @see #toString
  */
-char[] getNameText () {
+String getNameText () {
     return ""; //$NON-NLS-1$
 }
 
@@ -1089,7 +1089,7 @@
  *
  * @see #getData(String)
  */
-public void setData (char[] key, Object value) {
+public void setData (String key, Object value) {
     checkWidget();
     if (key.length is 0) error (DWT.ERROR_NULL_ARGUMENT);
     int index = 1;
@@ -1097,7 +1097,7 @@
     if ((state & KEYED_DATA) !is 0) {
         table = (cast(ArrayWrapperObject) data).array;
         while (index < table.length) {
-            char[] tablekey = (cast(ArrayWrapperString)table[index]).array;
+            String tablekey = (cast(ArrayWrapperString)table[index]).array;
             if (key ==/*eq*/ tablekey ) break;
             index += 2;
         }
@@ -1296,8 +1296,8 @@
  *
  * @return a string representation of the receiver
  */
-override public char[] toString () {
-    char[] string = "*Disposed*"; //$NON-NLS-1$
+override public String toString () {
+    String string = "*Disposed*"; //$NON-NLS-1$
     if (!isDisposed ()) {
         string = "*Wrong Thread*"; //$NON-NLS-1$
         if (isValidThread ()) string = getNameText ();