diff dwtx/jface/preference/PreferenceDialog.d @ 34:b3c8e32d406f

preference
author Frank Benoit <benoit@tionex.de>
date Sat, 05 Apr 2008 01:45:47 +0200
parents 6c14e54dfc11
children 644f1334b451
line wrap: on
line diff
--- a/dwtx/jface/preference/PreferenceDialog.d	Thu Apr 03 20:41:52 2008 +0200
+++ b/dwtx/jface/preference/PreferenceDialog.d	Sat Apr 05 01:45:47 2008 +0200
@@ -14,17 +14,15 @@
  *******************************************************************************/
 module dwtx.jface.preference.PreferenceDialog;
 
-import dwt.dwthelper.utils;
-
-pragma( msg, "FIXME dwtx.jface.preference.PreferenceDialog" );
-class PreferenceDialog{
-    public static const String PREF_DLG_TITLE_IMG = "preference_dialog_title_image"; //$NON-NLS-1$
-}
-
-/++
-import java.io.IOException;
-import java.util.Iterator;
-import java.util.List;
+import dwtx.jface.preference.IPreferencePageContainer;
+import dwtx.jface.preference.IPreferencePage;
+import dwtx.jface.preference.IPreferenceNode;
+import dwtx.jface.preference.IPreferenceStore;
+import dwtx.jface.preference.IPersistentPreferenceStore;
+import dwtx.jface.preference.PreferenceManager;
+import dwtx.jface.preference.PreferencePage;
+import dwtx.jface.preference.PreferenceLabelProvider;
+import dwtx.jface.preference.PreferenceContentProvider;
 
 import dwt.DWT;
 import dwt.custom.BusyIndicator;
@@ -84,18 +82,21 @@
 import dwtx.jface.viewers.TreeViewer;
 import dwtx.jface.viewers.ViewerFilter;
 
+import dwt.dwthelper.utils;
+import dwt.dwthelper.Runnable;
+
 /**
  * A preference dialog is a hierarchical presentation of preference pages. Each
  * page is represented by a node in the tree shown on the left hand side of the
  * dialog; when a node is selected, the corresponding page is shown on the right
  * hand side.
  */
-public class PreferenceDialog extends TrayDialog implements IPreferencePageContainer, IPageChangeProvider {
+public class PreferenceDialog : TrayDialog, IPreferencePageContainer, IPageChangeProvider {
     /**
      * Layout for the page container.
      *
      */
-    private class PageLayout extends Layout {
+    private class PageLayout : Layout {
         public Point computeSize(Composite composite, int wHint, int hHint, bool force) {
             if (wHint !is DWT.DEFAULT && hHint !is DWT.DEFAULT) {
                 return new Point(wHint, hHint);
@@ -144,17 +145,17 @@
     /**
      * Indentifier for the error image
      */
-    public static final String PREF_DLG_IMG_TITLE_ERROR = DLG_IMG_MESSAGE_ERROR;
+    public static const String PREF_DLG_IMG_TITLE_ERROR = DLG_IMG_MESSAGE_ERROR;
 
     /**
      * Title area fields
      */
-    public static final String PREF_DLG_TITLE_IMG = "preference_dialog_title_image"; //$NON-NLS-1$
+    public static const String PREF_DLG_TITLE_IMG = "preference_dialog_title_image"; //$NON-NLS-1$
 
     /**
      * Return code used when dialog failed
      */
-    protected static final int FAILED = 2;
+    protected static const int FAILED = 2;
 
     /**
      * The current preference page, or <code>null</code> if there is none.
@@ -172,7 +173,7 @@
      *
      * @see #setMinimumPageSize(Point)
      */
-    private Point minimumPageSize = new Point(400, 400);
+    private Point minimumPageSize;
 
     /**
      * The OK button.
@@ -208,7 +209,7 @@
      */
     private TreeViewer treeViewer;
 
-    private ListenerList pageChangedListeners = new ListenerList();
+    private ListenerList pageChangedListeners;
 
     /**
      *  Composite with a FormLayout to contain the title area
@@ -226,7 +227,9 @@
      * @param manager
      *            the preference manager
      */
-    public PreferenceDialog(Shell parentShell, PreferenceManager manager) {
+    public this(Shell parentShell, PreferenceManager manager) {
+        minimumPageSize = new Point(400, 400);
+        pageChangedListeners = new ListenerList();
         super(parentShell);
         setShellStyle(getShellStyle() | DWT.RESIZE | DWT.MAX);
         preferenceManager = manager;
@@ -261,13 +264,21 @@
      */
     protected void cancelPressed() {
         // Inform all pages that we are cancelling
-        Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER).iterator();
-        while (nodes.hasNext()) {
-            final IPreferenceNode node = (IPreferenceNode) nodes.next();
+        foreach( e; preferenceManager.getElements(PreferenceManager.PRE_ORDER)){
+            IPreferenceNode node = cast(IPreferenceNode) e;
             if (getPage(node) !is null) {
-                SafeRunnable.run(new SafeRunnable() {
+
+                // this_: strange workaround for compiler error with dmd 1.028 in run()
+                SafeRunnable.run(new class(this) SafeRunnable {
+                    PreferenceDialog this_;
+                    IPreferenceNode node_;
+                    this(PreferenceDialog outer_){
+                        node_=node;
+                        this_=outer_;
+                        auto p = this_.getPage( node );
+                    }
                     public void run() {
-                        if (!getPage(node).performCancel()) {
+                        if (!this_.getPage(node_).performCancel()) {
                             return;
                         }
                     }
@@ -294,14 +305,14 @@
     public bool close() {
 
         //Do this is in a SafeRunnable as it may run client code
-        SafeRunnable runnable = new SafeRunnable(){
+        SafeRunnable runnable = new class SafeRunnable{
             /* (non-Javadoc)
              * @see dwtx.core.runtime.ISafeRunnable#run()
              */
-            public void run() throws Exception {
-                List nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER);
+            public void run() {
+                auto nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER);
                 for (int i = 0; i < nodes.size(); i++) {
-                    IPreferenceNode node = (IPreferenceNode) nodes.get(i);
+                    IPreferenceNode node = cast(IPreferenceNode) nodes.get(i);
                     node.disposeResources();
                 }
 
@@ -310,7 +321,7 @@
             /* (non-Javadoc)
              * @see dwtx.jface.util.SafeRunnable#handleException(java.lang.Throwable)
              */
-            public void handleException(Throwable e) {
+            public void handleException(Exception e) {
                 super.handleException(e);
                 clearSelectedNode();//Do not cache a node with problems
             }
@@ -329,7 +340,7 @@
     protected void configureShell(Shell newShell) {
         super.configureShell(newShell);
         newShell.setText(JFaceResources.getString("PreferenceDialog.title")); //$NON-NLS-1$
-        newShell.addShellListener(new ShellAdapter() {
+        newShell.addShellListener(new class ShellAdapter {
             public void shellActivated(ShellEvent e) {
                 if (lastShellSize is null) {
                     lastShellSize = getShell().getSize();
@@ -370,11 +381,15 @@
      *
      * @see dwtx.jface.window.Window#createContents(dwt.widgets.Composite)
      */
-    protected Control createContents(final Composite parent) {
-        final Control[] control = new Control[1];
-        BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
+    protected Control createContents(Composite parent) {
+        Control[1] control;
+        BusyIndicator.showWhile(getShell().getDisplay(), new class Runnable {
+            Composite parent_;
+            this(){
+                parent_=parent;
+            }
             public void run() {
-                control[0] = PreferenceDialog.super.createContents(parent);
+                control[0] = callSuperCreateContents(parent);
                 // Add the first page
                 selectSavedItem();
             }
@@ -382,15 +397,17 @@
 
         return control[0];
     }
-
+    private Control callSuperCreateContents( Composite c ){
+        return super.createContents( c );
+    }
     /*
      * (non-Javadoc)
      *
      * @see dwtx.jface.dialogs.Dialog#createDialogArea(dwt.widgets.Composite)
      */
     protected Control createDialogArea(Composite parent) {
-        final Composite composite = (Composite) super.createDialogArea(parent);
-        GridLayout parentLayout = ((GridLayout) composite.getLayout());
+        final Composite composite = cast(Composite) super.createDialogArea(parent);
+        GridLayout parentLayout = (cast(GridLayout) composite.getLayout());
         parentLayout.numColumns = 4;
         parentLayout.marginHeight = 0;
         parentLayout.marginWidth = 0;
@@ -470,13 +487,21 @@
      *
      * @since 3.1
      */
-    protected Sash createSash(final Composite composite, final Control rightControl) {
-        final Sash sash = new Sash(composite, DWT.VERTICAL);
+    protected Sash createSash(Composite composite, Control rightControl) {
+        Sash sash = new Sash(composite, DWT.VERTICAL);
         sash.setLayoutData(new GridData(GridData.FILL_VERTICAL));
         sash.setBackground(composite.getDisplay().getSystemColor(DWT.COLOR_LIST_BACKGROUND));
         // the following listener resizes the tree control based on sash deltas.
         // If necessary, it will also grow/shrink the dialog.
-        sash.addListener(DWT.Selection, new Listener() {
+        sash.addListener(DWT.Selection, new class Listener {
+            Composite composite_;
+            Control rightControl_;
+            Sash sash_;
+            this(){
+                composite_=composite;
+                rightControl_=rightControl;
+                sash_=sash;
+            }
             /*
              * (non-Javadoc)
              *
@@ -486,8 +511,8 @@
                 if (event.detail is DWT.DRAG) {
                     return;
                 }
-                int shift = event.x - sash.getBounds().x;
-                GridData data = (GridData) rightControl.getLayoutData();
+                int shift = event.x - sash_.getBounds().x;
+                GridData data = cast(GridData) rightControl_.getLayoutData();
                 int newWidthHint = data.widthHint + shift;
                 if (newWidthHint < 20) {
                     return;
@@ -496,10 +521,10 @@
                 Point currentSize = getShell().getSize();
                 // if the dialog wasn't of a custom size we know we can shrink
                 // it if necessary based on sash movement.
-                bool customSize = !computedSize.equals(currentSize);
+                bool customSize = !computedSize.opEquals(currentSize);
                 data.widthHint = newWidthHint;
                 setLastTreeWidth(newWidthHint);
-                composite.layout(true);
+                composite_.layout(true);
                 // recompute based on new widget size
                 computedSize = getShell().computeSize(DWT.DEFAULT, DWT.DEFAULT);
                 // if the dialog was of a custom size then increase it only if
@@ -508,7 +533,7 @@
                     computedSize.x = Math.max(computedSize.x, currentSize.x);
                 }
                 computedSize.y = Math.max(computedSize.y, currentSize.y);
-                if (computedSize.equals(currentSize)) {
+                if (computedSize.opEquals(currentSize)) {
                     return;
                 }
                 setShellSize(computedSize.x, computedSize.y);
@@ -596,7 +621,7 @@
         messageArea = new DialogMessageArea();
         messageArea.createContents(titleArea);
 
-        titleArea.addControlListener(new ControlAdapter() {
+        titleArea.addControlListener(new class ControlAdapter {
             /* (non-Javadoc)
              * @see dwt.events.ControlAdapter#controlResized(dwt.events.ControlEvent)
              */
@@ -605,7 +630,7 @@
             }
         });
 
-        final IPropertyChangeListener fontListener = new IPropertyChangeListener() {
+        final IPropertyChangeListener fontListener = new class IPropertyChangeListener {
             public void propertyChange(PropertyChangeEvent event) {
                 if (JFaceResources.BANNER_FONT.equals(event.getProperty())) {
                     updateMessage();
@@ -614,7 +639,7 @@
                     updateMessage();
                     Font dialogFont = JFaceResources.getDialogFont();
                     updateTreeFont(dialogFont);
-                    Control[] children = ((Composite) buttonBar).getChildren();
+                    Control[] children = (cast(Composite) buttonBar).getChildren();
                     for (int i = 0; i < children.length; i++) {
                         children[i].setFont(dialogFont);
                     }
@@ -622,7 +647,7 @@
             }
         };
 
-        titleArea.addDisposeListener(new DisposeListener() {
+        titleArea.addDisposeListener(new class DisposeListener {
             public void widgetDisposed(DisposeEvent event) {
                 JFaceResources.getFontRegistry().removeListener(fontListener);
             }
@@ -684,50 +709,58 @@
      *
      * @since 3.1
      */
-    protected void addListeners(final TreeViewer viewer) {
-        viewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
+    protected void addListeners(TreeViewer viewer) {
+        viewer.addPostSelectionChangedListener(new class ISelectionChangedListener {
+            TreeViewer viewer_;
+            this(){
+                viewer_=viewer;
+            }
             private void handleError() {
                 try {
                     // remove the listener temporarily so that the events caused
                     // by the error handling dont further cause error handling
                     // to occur.
-                    viewer.removePostSelectionChangedListener(this);
+                    viewer_.removePostSelectionChangedListener(this);
                     showPageFlippingAbortDialog();
                     selectCurrentPageAgain();
                     clearSelectedNode();
                 } finally {
-                    viewer.addPostSelectionChangedListener(this);
+                    viewer_.addPostSelectionChangedListener(this);
                 }
             }
 
             public void selectionChanged(SelectionChangedEvent event) {
-                Object selection = getSingleSelection(event.getSelection());
-                if (selection instanceof IPreferenceNode) {
+                Object selection = cast(Object) getSingleSelection(event.getSelection());
+                if (cast(IPreferenceNode)selection ) {
                     if (!isCurrentPageValid()) {
                         handleError();
-                    } else if (!showPage((IPreferenceNode) selection)) {
+                    } else if (!showPage(cast(IPreferenceNode) selection)) {
                         // Page flipping wasn't successful
                         handleError();
                     } else {
                         // Everything went well
-                        lastSuccessfulNode = (IPreferenceNode) selection;
+                        lastSuccessfulNode = cast(IPreferenceNode) selection;
                     }
                 }
             }
         });
-        ((Tree) viewer.getControl()).addSelectionListener(new SelectionAdapter() {
-            public void widgetDefaultSelected(final SelectionEvent event) {
-                ISelection selection = viewer.getSelection();
+        (cast(Tree) viewer.getControl()).addSelectionListener(new class SelectionAdapter {
+            TreeViewer viewer_;
+            this(){
+                viewer_=viewer;
+            }
+            public void widgetDefaultSelected(SelectionEvent event) {
+                ISelection selection = viewer_.getSelection();
                 if (selection.isEmpty()) {
                     return;
                 }
                 IPreferenceNode singleSelection = getSingleSelection(selection);
-                bool expanded = viewer.getExpandedState(singleSelection);
-                viewer.setExpandedState(singleSelection, !expanded);
+                bool expanded = viewer_.getExpandedState(cast(Object)singleSelection);
+                viewer_.setExpandedState(cast(Object)singleSelection, !expanded);
             }
         });
         //Register help listener on the tree to use context sensitive help
-        viewer.getControl().addHelpListener(new HelpListener() {
+        viewer.getControl().addHelpListener(new class HelpListener {
             public void helpRequested(HelpEvent event) {
                 // call perform help on the current page
                 if (currentPage !is null) {
@@ -747,9 +780,8 @@
      *         found.
      */
     protected IPreferenceNode findNodeMatching(String nodeId) {
-        List nodes = preferenceManager.getElements(PreferenceManager.POST_ORDER);
-        for (Iterator i = nodes.iterator(); i.hasNext();) {
-            IPreferenceNode node = (IPreferenceNode) i.next();
+        foreach( e; preferenceManager.getElements(PreferenceManager.POST_ORDER)){
+            IPreferenceNode node = cast(IPreferenceNode) e;
             if (node.getId().equals(nodeId)) {
                 return node;
             }
@@ -800,9 +832,9 @@
      */
     protected IPreferenceNode getSingleSelection(ISelection selection) {
         if (!selection.isEmpty()) {
-            IStructuredSelection structured = (IStructuredSelection) selection;
-            if (structured.getFirstElement() instanceof IPreferenceNode) {
-                return (IPreferenceNode) structured.getFirstElement();
+            IStructuredSelection structured = cast(IStructuredSelection) selection;
+            if (cast(IPreferenceNode)structured.getFirstElement() ) {
+                return cast(IPreferenceNode) structured.getFirstElement();
             }
         }
         return null;
@@ -828,17 +860,16 @@
      * </p>
      */
     protected void handleSave() {
-        Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER).iterator();
-        while (nodes.hasNext()) {
-            IPreferenceNode node = (IPreferenceNode) nodes.next();
+        foreach( e; preferenceManager.getElements(PreferenceManager.PRE_ORDER)){
+            IPreferenceNode node = cast(IPreferenceNode) e;
             IPreferencePage page = node.getPage();
-            if (page instanceof PreferencePage) {
+            if (cast(PreferencePage)page ) {
                 // Save now in case tbe workbench does not shutdown cleanly
-                IPreferenceStore store = ((PreferencePage) page).getPreferenceStore();
+                IPreferenceStore store = (cast(PreferencePage) page).getPreferenceStore();
                 if (store !is null && store.needsSaving()
-                        && store instanceof IPersistentPreferenceStore) {
+                        && cast(IPersistentPreferenceStore)store ) {
                     try {
-                        ((IPersistentPreferenceStore) store).save();
+                        (cast(IPersistentPreferenceStore) store).save();
                     } catch (IOException e) {
                         MessageDialog
                                 .openError(
@@ -846,7 +877,7 @@
                                         JFaceResources.getString("PreferenceDialog.saveErrorTitle"), //$NON-NLS-1$
                                         JFaceResources
                                                 .format(
-                                                        "PreferenceDialog.saveErrorMessage", new Object[] { page.getTitle(), e.getMessage() })); //$NON-NLS-1$
+                                                        "PreferenceDialog.saveErrorMessage", [ page.getTitle(), e.msg ])); //$NON-NLS-1$
                     }
                 }
             }
@@ -913,7 +944,7 @@
      * save any state, and then calls <code>close</code> to close this dialog.
      */
     protected void okPressed() {
-        SafeRunnable.run(new SafeRunnable() {
+        SafeRunnable.run(new class SafeRunnable {
             private bool errorOccurred;
 
             /*
@@ -927,10 +958,8 @@
                 bool hasFailedOK = false;
                 try {
                     // Notify all the pages and give them a chance to abort
-                    Iterator nodes = preferenceManager.getElements(PreferenceManager.PRE_ORDER)
-                            .iterator();
-                    while (nodes.hasNext()) {
-                        IPreferenceNode node = (IPreferenceNode) nodes.next();
+                    foreach( e; preferenceManager.getElements(PreferenceManager.PRE_ORDER)){
+                        IPreferenceNode node = cast(IPreferenceNode) e;
                         IPreferencePage page = node.getPage();
                         if (page !is null) {
                             if (!page.performOk()){
@@ -946,16 +975,18 @@
                     if(hasFailedOK){
                         setReturnCode(FAILED);
                         getButton(IDialogConstants.OK_ID).setEnabled(true);
-                        return;
+                        //return;
                     }
+                    else{
 
-                    if (!errorOccurred) {
-                        //Give subclasses the choice to save the state of the
-                        //preference pages.
-                        handleSave();
+                        if (!errorOccurred) {
+                            //Give subclasses the choice to save the state of the
+                            //preference pages.
+                            handleSave();
+                        }
+                        setReturnCode(OK);
+                        close();
                     }
-                    setReturnCode(OK);
-                    close();
                 }
             }
 
@@ -964,7 +995,7 @@
              *
              * @see dwtx.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
              */
-            public void handleException(Throwable e) {
+            public void handleException(Exception e) {
                 errorOccurred = true;
 
                 Policy.getLog().log(new Status(IStatus.ERROR, Policy.JFACE, 0, e.toString(), e));
@@ -985,7 +1016,7 @@
         if (lastSuccessfulNode is null) {
             return;
         }
-        getTreeViewer().setSelection(new StructuredSelection(lastSuccessfulNode));
+        getTreeViewer().setSelection(new StructuredSelection(cast(Object)lastSuccessfulNode));
         currentPage.setVisible(true);
     }
 
@@ -1002,8 +1033,8 @@
                 IPreferenceNode selectedNode = nodes[i];
                 // See if it passes all filters
                 for (int j = 0; j < filters.length; j++) {
-                    if (!filters[j].select(this.treeViewer, preferenceManager
-                            .getRoot(), selectedNode)) {
+                    if (!filters[j].select(this.treeViewer, cast(Object)preferenceManager
+                            .getRoot_package(), cast(Object)selectedNode)) {
                         selectedNode = null;
                         break;
                     }
@@ -1016,7 +1047,7 @@
             }
         }
         if (node !is null) {
-            getTreeViewer().setSelection(new StructuredSelection(node), true);
+            getTreeViewer().setSelection(new StructuredSelection(cast(Object)node), true);
             // Keep focus in tree. See bugs 2692, 2621, and 6775.
             getTreeViewer().getControl().setFocus();
         }
@@ -1122,7 +1153,7 @@
      * @see #getPreferenceStore
      */
     public void setPreferenceStore(IPreferenceStore store) {
-        Assert.isNotNull(store);
+        Assert.isNotNull(cast(Object)store);
         preferenceStore = store;
     }
 
@@ -1131,9 +1162,9 @@
      */
     private void setSelectedNode() {
         String storeValue = null;
-        IStructuredSelection selection = (IStructuredSelection) getTreeViewer().getSelection();
+        IStructuredSelection selection = cast(IStructuredSelection) getTreeViewer().getSelection();
         if (selection.size() is 1) {
-            IPreferenceNode node = (IPreferenceNode) selection.getFirstElement();
+            IPreferenceNode node = cast(IPreferenceNode) selection.getFirstElement();
             storeValue = node.getId();
         }
         setSelectedNodePreference(storeValue);
@@ -1213,9 +1244,9 @@
         // Ensure that the page control has been created
         // (this allows lazy page control creation)
         if (currentPage.getControl() is null) {
-            final bool[] failed = { false };
-            SafeRunnable.run(new ISafeRunnable() {
-                public void handleException(Throwable e) {
+            bool[1] failed; failed[0] = false;
+            SafeRunnable.run(new class ISafeRunnable {
+                public void handleException(Exception e) {
                     failed[0] = true;
                 }
 
@@ -1235,8 +1266,8 @@
         // label can be wrapped.
         final Point[] size = new Point[1];
         final Point failed = new Point(-1, -1);
-        SafeRunnable.run(new ISafeRunnable() {
-            public void handleException(Throwable e) {
+        SafeRunnable.run(new class ISafeRunnable {
+            public void handleException(Exception e) {
                 size[0] = failed;
             }
 
@@ -1244,7 +1275,7 @@
                 size[0] = currentPage.computeSize();
             }
         });
-        if (size[0].equals(failed)) {
+        if (size[0].opEquals(failed)) {
             return false;
         }
         Point contentSize = size[0];
@@ -1259,7 +1290,7 @@
             Point containerSize = new Point(rect.width, rect.height);
             int hdiff = contentSize.x - containerSize.x;
             int vdiff = contentSize.y - containerSize.y;
-            if ((hdiff > 0 || vdiff > 0) && shellSize.equals(lastShellSize)) {
+            if ((hdiff > 0 || vdiff > 0) && shellSize.opEquals(lastShellSize)) {
                     hdiff = Math.max(0, hdiff);
                     vdiff = Math.max(0, vdiff);
                     setShellSize(shellSize.x + hdiff, shellSize.y + vdiff);
@@ -1336,7 +1367,7 @@
         updateButtons();
         //Saved the selected node in the preferences
         setSelectedNode();
-        firePageChanged(new PageChangedEvent(this, getCurrentPage()));
+        firePageChanged(new PageChangedEvent(this, cast(Object)getCurrentPage()));
     }
 
     /*
@@ -1361,8 +1392,8 @@
             errorMessage = currentPage.getErrorMessage();
         }
         int messageType = IMessageProvider.NONE;
-        if (message !is null && currentPage instanceof IMessageProvider) {
-            messageType = ((IMessageProvider) currentPage).getMessageType();
+        if (message !is null && cast(IMessageProvider)currentPage ) {
+            messageType = (cast(IMessageProvider) currentPage).getMessageType();
         }
 
         if (errorMessage is null){
@@ -1472,7 +1503,7 @@
      * @since 3.1
      */
     public Object getSelectedPage() {
-            return getCurrentPage();
+            return cast(Object)getCurrentPage();
         }
 
     /**
@@ -1480,7 +1511,7 @@
      * @since 3.1
      */
     public void addPageChangedListener(IPageChangedListener listener) {
-        pageChangedListeners.add(listener);
+        pageChangedListeners.add(cast(Object)listener);
     }
 
     /**
@@ -1488,7 +1519,7 @@
      * @since 3.1
      */
     public void removePageChangedListener(IPageChangedListener listener) {
-        pageChangedListeners.remove(listener);
+        pageChangedListeners.remove(cast(Object)listener);
 
     }
 
@@ -1503,16 +1534,20 @@
      *
      * @since 3.1
      */
-    protected void firePageChanged(final PageChangedEvent event) {
+    protected void firePageChanged(PageChangedEvent event) {
         Object[] listeners = pageChangedListeners.getListeners();
         for (int i = 0; i < listeners.length; i++) {
-            final IPageChangedListener l = (IPageChangedListener) listeners[i];
-            SafeRunnable.run(new SafeRunnable() {
+            SafeRunnable.run(new class SafeRunnable {
+                PageChangedEvent event_;
+                IPageChangedListener l;
+                this(){
+                    event_=event;
+                    l = cast(IPageChangedListener) listeners[i];
+                }
                 public void run() {
-                    l.pageChanged(event);
+                    l.pageChanged(event_);
                 }
             });
         }
     }
 }
-++/
\ No newline at end of file