javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt/InstallerUiEswt.java
branchRCL_3
changeset 60 6c158198356e
parent 25 9ac0a0a7da70
child 83 26b2b12093af
--- a/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt/InstallerUiEswt.java	Thu Jul 15 18:31:06 2010 +0300
+++ b/javamanager/javainstaller/installerui/javasrc/com/nokia/mj/impl/installer/ui/eswt/InstallerUiEswt.java	Thu Aug 19 09:48:13 2010 +0300
@@ -35,6 +35,7 @@
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.util.Enumeration;
 import java.util.Hashtable;
 
 import org.eclipse.ercp.swt.midp.UIThreadSupport;
@@ -48,6 +49,8 @@
 import org.eclipse.swt.graphics.ImageLoader;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.internal.extension.DisplayExtension;
+import org.eclipse.swt.internal.extension.ImageUtil;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Composite;
@@ -126,7 +129,6 @@
         // Create a hashtable for icons.
         iImageTable = new Hashtable();
         // Create a new thread to be the UI main thread.
-        iUiThreadExists = true;
         UIThreadSupport.startInUIThread(new Runnable()
         {
             public void run()
@@ -145,6 +147,7 @@
     private void uiMain()
     {
         log("uiMain: thread started");
+        iUiThreadExists = true;
         try
         {
             // Create the necessary views.
@@ -201,10 +204,7 @@
                     display.sleep();
                 }
             }
-            if (iBoldFont != null && !iBoldFont.isDisposed())
-            {
-                iBoldFont.dispose();
-            }
+            disposeResources();
             display.dispose();
             log("uiMain: display disposed");
             synchronized (iExitWaitObject)
@@ -512,6 +512,12 @@
         // updating it.
         synchronized (iProgressSyncObject)
         {
+            if (iDlProgressView != null && iDlProgressView.isVisible())
+            {
+                // If download progress is being displayed,
+                // do not display installation progress.
+                return;
+            }
             if (iDisplayProgress && !iProgressView.isVisible())
             {
                 iProgressView.setVisible(true);
@@ -994,6 +1000,14 @@
     }
 
     /**
+     * Executes given Runnable synchronously in the UI thread.
+     */
+    public void syncExec(Runnable aRunnable)
+    {
+        iParent.getDisplay().syncExec(aRunnable);
+    }
+
+    /**
      * Returns string title basing on mode of this InstallerUi.
      */
     protected String getTitle()
@@ -1033,17 +1047,21 @@
         {
             return iSecurityIcon;
         }
-        String iconFilename = ResourceUtil.UNTRUSTED_ICON_NAME;
+        int id = ImageUtil.THEME_IMAGE_SECURITY_UNTRUSTED;
         if (aIdentified)
         {
-            iconFilename = ResourceUtil.TRUSTED_ICON_NAME;
+            id = ImageUtil.THEME_IMAGE_SECURITY_TRUSTED;
         }
-        String resourceDir = ResourceUtil.getResourceDir(0);
-        for (int i = 1; iSecurityIcon == null && resourceDir != null; i++)
+        
+        try 
         {
-            iSecurityIcon = loadImage(aDisplay, resourceDir + iconFilename, false);
-            resourceDir = ResourceUtil.getResourceDir(i);
+            iSecurityIcon = ImageUtil.createImageFromTheme(aDisplay, id);
         }
+        catch (Throwable t)
+        {
+            log("Can not load security icon: " + t);
+        }
+        
         return iSecurityIcon;
     }
 
@@ -1133,22 +1151,26 @@
         try
         {
             long startTime = System.currentTimeMillis();
-            ImageData[] imageDatas = new ImageLoader().load(aInputStream);
-            ImageData imageData = imageDatas[0];
+            
+            Image image = new Image(aDisplay, aInputStream);
             if (aScaleImage)
             {
-                Point bestSize = getBestImageSize(
-                                     imageData.width, imageData.height);
-                if (bestSize.x != imageData.width ||
-                        bestSize.y != imageData.height)
+                int maxWidth = DisplayExtension.getBestImageWidth(DisplayExtension.LIST_ELEMENT);
+                int maxHeight = DisplayExtension.getBestImageHeight(DisplayExtension.LIST_ELEMENT);
+                Rectangle rect = image.getBounds();
+                if (maxWidth != rect.width || maxHeight != rect.height)
                 {
-                    imageData = imageData.scaledTo(bestSize.x, bestSize.y);
-                    log("Image " + aImageName + " scaled from " +
-                        imageDatas[0].width + "x" + imageDatas[0].height +
-                        " to " + bestSize.x + "x" + bestSize.y);
+                    // Copy and scale natively preserving the aspect ratio
+                    result = ImageUtil.scaleImage(aDisplay, image, new Point(maxWidth, maxHeight), true);
+                    image.dispose();
+                    image = null;
                 }
             }
-            result = new Image(aDisplay, imageData);
+            if (result == null)
+            {
+                result = image;
+            }
+            
             long endTime = System.currentTimeMillis();
             log("Loaded image " + aImageName + " (load time " +
                 (endTime - startTime) + " ms)");
@@ -1162,33 +1184,6 @@
         return result;
     }
 
-    /**
-     * Determines the best image size for the image of given size.
-     */
-    private static Point getBestImageSize(int aWidth, int aHeight)
-    {
-        // Actually maximum image width and height should be obtained with
-        // org.eclipse.swt.internal.extension.DisplayExtension
-        // getBestImageWidth() and getBestImageHeight().
-        final int MAX_WIDTH = 50; // max width in pixels
-        final int MAX_HEIGHT = 50; // max height in pixels
-        Point result = new Point(aWidth, aHeight);
-        if (result.x > MAX_WIDTH || result.y > MAX_HEIGHT)
-        {
-            if (result.x >= MAX_WIDTH)
-            {
-                result.x = MAX_WIDTH;
-                result.y = MAX_WIDTH * aHeight / aWidth;
-            }
-            if (result.y >= MAX_HEIGHT)
-            {
-                result.x = MAX_HEIGHT * aWidth / aHeight;
-                result.y = MAX_HEIGHT;
-            }
-        }
-        return result;
-    }
-
     /** Returns true if UI has been created and can be used. */
     protected boolean isUiReady()
     {
@@ -1284,6 +1279,13 @@
         }
         return iBoldFont;
     }
+    
+    int iconLabelTopMargin()
+    {
+        // Aproximating the space at the top of a Label.
+        // eSWT's Label adds extra space around texts but not around images.
+        return getBoldFont().getFontData()[0].getHeight();
+    }
 
     void setActiveView(ViewBase aView)
     {
@@ -1299,4 +1301,24 @@
     {
         return iActiveView;
     }
+    
+    private void disposeResources() {
+        if (iBoldFont != null && !iBoldFont.isDisposed())
+        {
+            iBoldFont.dispose();
+        }
+        if (iSecurityIcon != null && !iSecurityIcon.isDisposed())
+        {
+            iSecurityIcon.dispose();
+        }
+        Enumeration e = iImageTable.elements();
+        while (e.hasMoreElements())
+        {
+            Image img = (Image)e.nextElement();
+            if (img != null && !img.isDisposed())
+            {
+                img.dispose();
+            }
+        }
+    }
 }