You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@directory.apache.org by Emmanuel Lécharny <el...@gmail.com> on 2015/05/27 17:56:55 UTC

[Studio] org.eclipse.swt.graphics.* disposal : a methodology

Hi guys,

I finally closed DIRSTUDIO_1038. We now dispose all the
org.eclipse.swt.graphics.* elements.

For the upcoming developemnts, I'd like to give a bit of guidelines :

Font
----

Font must be disposed. It's then easier to use a FontRegistry to avoid
creating a font everytime it's needed. One way to do that is :

        FontData[] fontData =
Display.getDefault().getSystemFont().getFontData();
        FontData fontDataBoldItalic = new FontData(
fontData[0].getName(), fontData[0].getHeight(), SWT.BOLD | SWT.ITALIC );

        FontRegistry fontRegistry = new FontRegistry(
getWorkbench().getDisplay() );

        if ( !fontRegistry.hasValueFor( fontData[0].toString() ) )
        {
            fontRegistry.put( fontData[0].toString(), fontData );
        }

        Font newFont = fontRegistry.get( fontData[0].toString() );

GC
--

Not frequently used. One exemple :

        GC gc = new GC( control );
       
        try
        {
            gc.setFont( JFaceResources.getDialogFont() );
            FontMetrics fontMetrics = gc.getFontMetrics();
   
            int width = Dialog.convertHorizontalDLUsToPixels(
fontMetrics, IDialogConstants.BUTTON_WIDTH );

            return width;
        }
        finally
        {
            gc.dispose();
        }

The disposal is done in a finally clause, to be sure we dispose the GC,
no matter what

Image
-----
Even simpler : when you create an Image, be sure to call the dispose()
method when done. Otherwise, each plugin activator (ie the class which
extends AbstractUIPlugin) has a method getImage( String ) :

    /**
     * Use this method to get SWT images. A ImageRegistry is used
     * to manage the the path->Image mapping.
     * <p>
     * Note: Don't dispose the returned SWT Image. It is disposed
     * automatically when the plugin is stopped.
     *
     * @param path the path
     * @return The SWT Image or null
     */
    public Image getImage( String path )
    {
        Image image = getImageRegistry().get( path );
       
        if ( image == null )
        {
            ImageDescriptor id = getImageDescriptor( path );
           
            if ( id != null )
            {
                image = id.createImage();
                getImageRegistry().put( path, image );
            }
        }
       
        return image;
    }

Color
-----

Colors are quite frequently used. Hopefully, we mostly used quite common
colors, like Red, Black, or various greys. I have moved all the Color
creations and disposals into the CommonUiConstants/CommonUiPlugins classes :

    // To see the world in black and white
    public static final RGB BLACK = new RGB( 0, 0, 0 );
    public static Color BLACK_COLOR;
    public static final RGB WHITE = new RGB( 255, 255, 255 );
    public static Color WHITE_COLOR;
   
    // 7 shade of greys... From dark to light, with combinaisons
    public static final RGB BD_GREY = new RGB( 31, 31, 31 );    // Black
Dark grey
    public static Color BD_GREY_COLOR;
    public static final RGB D_GREY = new RGB( 63, 63, 63 );     // Dark grey
    public static Color D_GREY_COLOR;
    public static final RGB MD_GREY = new RGB( 95, 95, 95 );    //
Medium Dark grey
    public static Color MD_GREY_COLOR;
    public static final RGB M_GREY = new RGB( 127, 127, 127 );  // Grey
    public static Color M_GREY_COLOR;
    public static final RGB ML_GREY = new RGB( 159, 159, 159 ); //
Medium Light grey
    public static Color ML_GREY_COLOR;
    public static final RGB L_GREY = new RGB( 191, 191, 191 );  // Light
grey
    public static Color L_GREY_COLOR;
    public static final RGB WL_GREY = new RGB( 224, 224, 224 ); // White
Light grey
    public static Color WL_GREY_COLOR;
   
    // Red
    public static final RGB M_RED = new RGB( 127, 0, 0 );       //
Medium red
    public static Color M_RED_COLOR;
    public static final RGB ML_RED = new RGB( 159, 0, 0 );      //
Medium light red
    public static Color ML_RED_COLOR;
    public static final RGB RED = new RGB( 255, 0, 0 );         // Full red
    public static Color RED_COLOR;
   
    // Green
    public static final RGB M_GREEN = new RGB( 0, 127, 0 );     //
Medium green
    public static Color M_GREEN_COLOR;
    public static final RGB ML_GREEN = new RGB( 0, 159, 0 );    //
Medium Light green
    public static Color ML_GREEN_COLOR;
    public static final RGB GREEN = new RGB( 0, 255, 0 );       // Full
green
    public static Color GREEN_COLOR;
   
    // Blue
    public static final RGB M_BLUE = new RGB( 0, 0, 127 );      //
Medium blue
    public static Color M_BLUE_COLOR;
    public static final RGB L_BLUE = new RGB( 0, 0, 191 );      // Light
blue
    public static Color L_BLUE_COLOR;
    public static final RGB BLUE = new RGB( 0, 0, 255 );        // Full blue
    public static Color BLUE_COLOR;
   
    // Purple
    public static final RGB M_PURPLE = new RGB( 127, 0, 127 );  //
Middle purple
    public static Color M_PURPLE_COLOR;
    public static final RGB PURPLE = new RGB( 255, 0, 255 );    // Full
purple
    public static Color PURPLE_COLOR;

    // Other colors
    public static final RGB R0_G127_B255 = new RGB( 0, 127, 255 );
    public static Color R0_G127_B255_COLOR;
    public static final RGB R95_G63_B159 = new RGB( 95, 63, 159 );
    public static Color R95_G63_B159_COLOR;
    public static final RGB R63_G127_B63 = new RGB( 63, 127, 63 );
    public static Color R63_G127_B63_COLOR;

Each color is declared as a RGB instance, and a Color instance is
created in the CommonUIPlugins class start's method :

    public void start( BundleContext context ) throws Exception
    {
        super.start( context );
       
        // Create the colors we use
        CommonUIConstants.BLACK_COLOR = new Color( null,
CommonUIConstants.BLACK );
        CommonUIConstants.WHITE_COLOR = new Color( null,
CommonUIConstants.WHITE );
        ...

and the dispose() method is called in the stop method :

    public void stop( BundleContext context ) throws Exception
    {
        plugin = null;
       
        // Dispose the colors
        CommonUIConstants.BLACK_COLOR.dispose();
        CommonUIConstants.WHITE_COLOR.dispose();
       


Would you want to create a new color, it's enough to add the RGB
instance and declare the Color instance in the CommonUiConstants class,
and to instanciate it and dispose it in the CommonUIPlugins class.


Comments ?



Re: [Studio] org.eclipse.swt.graphics.* disposal : a methodology

Posted by Stefan Seelmann <ma...@stefan-seelmann.de>.
Thanks Emmanuel for fixing the issue and the advices. Now that the code
is 'clean' I hope we don't just allocate any new SWT resource.

In the UI integration tests we also have a test called SwtResourcesTest
that was created to check the number of created SWT resources is not too
high (less than 1000). But I think it is hard to also test that they are
being dieposed, we'd need to stop the plugins.

Kind Regards,
Stefan


On 05/27/2015 05:56 PM, Emmanuel Lécharny wrote:
> Hi guys,
> 
> I finally closed DIRSTUDIO_1038. We now dispose all the
> org.eclipse.swt.graphics.* elements.
> 
> For the upcoming developemnts, I'd like to give a bit of guidelines :
> 
> Font
> ----
> 
> Font must be disposed. It's then easier to use a FontRegistry to avoid
> creating a font everytime it's needed. One way to do that is :
> 
>         FontData[] fontData =
> Display.getDefault().getSystemFont().getFontData();
>         FontData fontDataBoldItalic = new FontData(
> fontData[0].getName(), fontData[0].getHeight(), SWT.BOLD | SWT.ITALIC );
> 
>         FontRegistry fontRegistry = new FontRegistry(
> getWorkbench().getDisplay() );
> 
>         if ( !fontRegistry.hasValueFor( fontData[0].toString() ) )
>         {
>             fontRegistry.put( fontData[0].toString(), fontData );
>         }
> 
>         Font newFont = fontRegistry.get( fontData[0].toString() );
> 
> GC
> --
> 
> Not frequently used. One exemple :
> 
>         GC gc = new GC( control );
>        
>         try
>         {
>             gc.setFont( JFaceResources.getDialogFont() );
>             FontMetrics fontMetrics = gc.getFontMetrics();
>    
>             int width = Dialog.convertHorizontalDLUsToPixels(
> fontMetrics, IDialogConstants.BUTTON_WIDTH );
> 
>             return width;
>         }
>         finally
>         {
>             gc.dispose();
>         }
> 
> The disposal is done in a finally clause, to be sure we dispose the GC,
> no matter what
> 
> Image
> -----
> Even simpler : when you create an Image, be sure to call the dispose()
> method when done. Otherwise, each plugin activator (ie the class which
> extends AbstractUIPlugin) has a method getImage( String ) :
> 
>     /**
>      * Use this method to get SWT images. A ImageRegistry is used
>      * to manage the the path->Image mapping.
>      * <p>
>      * Note: Don't dispose the returned SWT Image. It is disposed
>      * automatically when the plugin is stopped.
>      *
>      * @param path the path
>      * @return The SWT Image or null
>      */
>     public Image getImage( String path )
>     {
>         Image image = getImageRegistry().get( path );
>        
>         if ( image == null )
>         {
>             ImageDescriptor id = getImageDescriptor( path );
>            
>             if ( id != null )
>             {
>                 image = id.createImage();
>                 getImageRegistry().put( path, image );
>             }
>         }
>        
>         return image;
>     }
> 
> Color
> -----
> 
> Colors are quite frequently used. Hopefully, we mostly used quite common
> colors, like Red, Black, or various greys. I have moved all the Color
> creations and disposals into the CommonUiConstants/CommonUiPlugins classes :
> 
>     // To see the world in black and white
>     public static final RGB BLACK = new RGB( 0, 0, 0 );
>     public static Color BLACK_COLOR;
>     public static final RGB WHITE = new RGB( 255, 255, 255 );
>     public static Color WHITE_COLOR;
>    
>     // 7 shade of greys... From dark to light, with combinaisons
>     public static final RGB BD_GREY = new RGB( 31, 31, 31 );    // Black
> Dark grey
>     public static Color BD_GREY_COLOR;
>     public static final RGB D_GREY = new RGB( 63, 63, 63 );     // Dark grey
>     public static Color D_GREY_COLOR;
>     public static final RGB MD_GREY = new RGB( 95, 95, 95 );    //
> Medium Dark grey
>     public static Color MD_GREY_COLOR;
>     public static final RGB M_GREY = new RGB( 127, 127, 127 );  // Grey
>     public static Color M_GREY_COLOR;
>     public static final RGB ML_GREY = new RGB( 159, 159, 159 ); //
> Medium Light grey
>     public static Color ML_GREY_COLOR;
>     public static final RGB L_GREY = new RGB( 191, 191, 191 );  // Light
> grey
>     public static Color L_GREY_COLOR;
>     public static final RGB WL_GREY = new RGB( 224, 224, 224 ); // White
> Light grey
>     public static Color WL_GREY_COLOR;
>    
>     // Red
>     public static final RGB M_RED = new RGB( 127, 0, 0 );       //
> Medium red
>     public static Color M_RED_COLOR;
>     public static final RGB ML_RED = new RGB( 159, 0, 0 );      //
> Medium light red
>     public static Color ML_RED_COLOR;
>     public static final RGB RED = new RGB( 255, 0, 0 );         // Full red
>     public static Color RED_COLOR;
>    
>     // Green
>     public static final RGB M_GREEN = new RGB( 0, 127, 0 );     //
> Medium green
>     public static Color M_GREEN_COLOR;
>     public static final RGB ML_GREEN = new RGB( 0, 159, 0 );    //
> Medium Light green
>     public static Color ML_GREEN_COLOR;
>     public static final RGB GREEN = new RGB( 0, 255, 0 );       // Full
> green
>     public static Color GREEN_COLOR;
>    
>     // Blue
>     public static final RGB M_BLUE = new RGB( 0, 0, 127 );      //
> Medium blue
>     public static Color M_BLUE_COLOR;
>     public static final RGB L_BLUE = new RGB( 0, 0, 191 );      // Light
> blue
>     public static Color L_BLUE_COLOR;
>     public static final RGB BLUE = new RGB( 0, 0, 255 );        // Full blue
>     public static Color BLUE_COLOR;
>    
>     // Purple
>     public static final RGB M_PURPLE = new RGB( 127, 0, 127 );  //
> Middle purple
>     public static Color M_PURPLE_COLOR;
>     public static final RGB PURPLE = new RGB( 255, 0, 255 );    // Full
> purple
>     public static Color PURPLE_COLOR;
> 
>     // Other colors
>     public static final RGB R0_G127_B255 = new RGB( 0, 127, 255 );
>     public static Color R0_G127_B255_COLOR;
>     public static final RGB R95_G63_B159 = new RGB( 95, 63, 159 );
>     public static Color R95_G63_B159_COLOR;
>     public static final RGB R63_G127_B63 = new RGB( 63, 127, 63 );
>     public static Color R63_G127_B63_COLOR;
> 
> Each color is declared as a RGB instance, and a Color instance is
> created in the CommonUIPlugins class start's method :
> 
>     public void start( BundleContext context ) throws Exception
>     {
>         super.start( context );
>        
>         // Create the colors we use
>         CommonUIConstants.BLACK_COLOR = new Color( null,
> CommonUIConstants.BLACK );
>         CommonUIConstants.WHITE_COLOR = new Color( null,
> CommonUIConstants.WHITE );
>         ...
> 
> and the dispose() method is called in the stop method :
> 
>     public void stop( BundleContext context ) throws Exception
>     {
>         plugin = null;
>        
>         // Dispose the colors
>         CommonUIConstants.BLACK_COLOR.dispose();
>         CommonUIConstants.WHITE_COLOR.dispose();
>        
> 
> 
> Would you want to create a new color, it's enough to add the RGB
> instance and declare the Color instance in the CommonUiConstants class,
> and to instanciate it and dispose it in the CommonUIPlugins class.
> 
> 
> Comments ?
> 
>