| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| */ |
| |
| package org.apache.directory.studio.valueeditors.image; |
| |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| |
| import org.apache.directory.api.util.Strings; |
| import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; |
| import org.apache.directory.studio.connection.ui.ConnectionUIPlugin; |
| import org.apache.directory.studio.valueeditors.IValueEditor; |
| import org.apache.directory.studio.valueeditors.ValueEditorsActivator; |
| import org.apache.directory.studio.valueeditors.ValueEditorsConstants; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.SWTException; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.ImageData; |
| import org.eclipse.swt.graphics.ImageLoader; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.FileDialog; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.TabFolder; |
| import org.eclipse.swt.widgets.TabItem; |
| import org.eclipse.swt.widgets.Text; |
| |
| |
| /** |
| * The ImageDialog is used from the image value editor to view the current image |
| * and to select a new image. |
| * |
| * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> |
| */ |
| public class ImageDialog extends Dialog |
| { |
| /** The dialog setting key for the currently selected tab item */ |
| private static final String SELECTED_TAB_DIALOGSETTINGS_KEY = ImageDialog.class.getName() + ".tab"; //$NON-NLS-1$ |
| |
| /** The maximum width for the image */ |
| private static final int MAX_WIDTH = 400; |
| |
| /** The maximum height for the image */ |
| private static final int MAX_HEIGHT = 400; |
| |
| /** The current image tab item */ |
| private static final int CURRENT_TAB = 0; |
| |
| /** The new image tab item */ |
| private static final int NEW_TAB = 1; |
| |
| /** The current image bytes */ |
| private byte[] currentImageRawData; |
| |
| /** The required image type */ |
| private int requiredImageType; |
| |
| /** The new image bytes */ |
| private byte[] newImageRawData; |
| |
| /** The new image bytes in the required image format */ |
| private byte[] newImageRawDataInRequiredFormat; |
| |
| // UI widgets |
| private TabFolder tabFolder; |
| |
| private TabItem currentTab; |
| private Composite currentImageContainer; |
| private Image currentImage; |
| private Label currentImageLabel; |
| private Text currentImageTypeText; |
| private Text currentImageWidthText; |
| private Text currentImageHeightText; |
| private Text currentImageSizeText; |
| private Button currentImageSaveButton; |
| |
| private TabItem newTab; |
| private Composite newImageContainer; |
| private Image newImage; |
| private Label newImageLabel; |
| private Text newImageTypeText; |
| private Text newImageWidthText; |
| private Text newImageHeightText; |
| private Text newImageSizeText; |
| private Text newImageFilenameText; |
| private Button newImageBrowseButton; |
| |
| private Button okButton; |
| |
| |
| /** |
| * Creates a new instance of ImageDialog. |
| * |
| * @param parentShell the parent shell |
| * @param currentImageRawData the current image raw data |
| * @param requiredImageType the required image type |
| */ |
| public ImageDialog( Shell parentShell, byte[] currentImageRawData, int requiredImageType ) |
| { |
| super( parentShell ); |
| super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); |
| this.currentImageRawData = currentImageRawData; |
| this.requiredImageType = requiredImageType; |
| |
| newImageRawDataInRequiredFormat = null; |
| } |
| |
| |
| /** |
| * @see org.eclipse.jface.dialogs.Dialog#close() |
| */ |
| public boolean close() |
| { |
| // Disposing the current image |
| if ( ( currentImage != null ) && !currentImage.isDisposed() ) |
| { |
| currentImage.dispose(); |
| } |
| |
| // Disposing the new image |
| if ( ( newImage != null ) && !newImage.isDisposed() ) |
| { |
| newImage.dispose(); |
| } |
| |
| // Saving the selected tab item to dialog settings |
| ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_TAB_DIALOGSETTINGS_KEY, |
| tabFolder.getSelectionIndex() ); |
| |
| return super.close(); |
| } |
| |
| |
| /** |
| * @see org.eclipse.jface.dialogs.Dialog#buttonPressed(int) |
| */ |
| protected void buttonPressed( int buttonId ) |
| { |
| if ( buttonId == IDialogConstants.OK_ID ) |
| { |
| if ( newImageRawData != null ) |
| { |
| // Preparing the new image bytes for the required format |
| try |
| { |
| ImageData imageData = new ImageData( new ByteArrayInputStream( newImageRawData ) ); |
| |
| if ( imageData.type != requiredImageType ) |
| { |
| // Converting the new image in the required format |
| ImageLoader imageLoader = new ImageLoader(); |
| imageLoader.data = new ImageData[] |
| { imageData }; |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| imageLoader.save( baos, requiredImageType ); |
| newImageRawDataInRequiredFormat = baos.toByteArray(); |
| } |
| else |
| { |
| // Directly using the new image bytes |
| newImageRawDataInRequiredFormat = newImageRawData; |
| } |
| } |
| catch ( SWTException swte ) |
| { |
| newImageRawDataInRequiredFormat = null; |
| } |
| } |
| } |
| else |
| { |
| newImageRawDataInRequiredFormat = null; |
| } |
| |
| super.buttonPressed( buttonId ); |
| } |
| |
| |
| /** |
| * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) |
| */ |
| protected void configureShell( Shell shell ) |
| { |
| super.configureShell( shell ); |
| shell.setText( Messages.getString( "ImageDialog.ImageEditor" ) ); //$NON-NLS-1$ |
| shell.setImage( ValueEditorsActivator.getDefault().getImage( ValueEditorsConstants.IMG_IMAGEEDITOR ) ); |
| } |
| |
| |
| /** |
| * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite) |
| */ |
| protected void createButtonsForButtonBar( Composite parent ) |
| { |
| okButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false ); |
| createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false ); |
| |
| // load dialog settings |
| try |
| { |
| int tabIndex = ValueEditorsActivator.getDefault().getDialogSettings().getInt( |
| SELECTED_TAB_DIALOGSETTINGS_KEY ); |
| tabFolder.setSelection( tabIndex ); |
| } |
| catch ( Exception e ) |
| { |
| // Nothing to do |
| } |
| |
| // Updating the tab folder on load |
| updateTabFolder(); |
| } |
| |
| |
| /** |
| * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) |
| */ |
| protected Control createDialogArea( Composite parent ) |
| { |
| Composite composite = ( Composite ) super.createDialogArea( parent ); |
| tabFolder = new TabFolder( composite, SWT.TOP ); |
| tabFolder.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); |
| |
| tabFolder.addSelectionListener( new SelectionAdapter() |
| { |
| public void widgetSelected( SelectionEvent e ) |
| { |
| updateTabFolder(); |
| } |
| } ); |
| |
| // current image |
| if ( currentImageRawData != null && currentImageRawData.length > 0 ) |
| { |
| currentTab = new TabItem( tabFolder, SWT.NONE ); |
| currentTab.setText( Messages.getString( "ImageDialog.CurrentImage" ) ); //$NON-NLS-1$ |
| |
| currentImageContainer = createTabItemComposite(); |
| currentImageLabel = createImageLabel( currentImageContainer ); |
| |
| Composite currentImageInfoContainer = createImageInfoContainer( currentImageContainer ); |
| currentImageTypeText = createImageInfo( currentImageInfoContainer, Messages |
| .getString( "ImageDialog.ImageType" ) ); //$NON-NLS-1$ |
| currentImageSizeText = createImageInfo( currentImageInfoContainer, Messages |
| .getString( "ImageDialog.ImageSize" ) ); //$NON-NLS-1$ |
| currentImageWidthText = createImageInfo( currentImageInfoContainer, Messages |
| .getString( "ImageDialog.ImageWidth" ) ); //$NON-NLS-1$ |
| currentImageHeightText = createImageInfo( currentImageInfoContainer, Messages |
| .getString( "ImageDialog.ImageHeight" ) ); //$NON-NLS-1$ |
| |
| Composite currentImageSaveContainer = createImageInfoContainer( currentImageContainer ); |
| Label dummyLabel = BaseWidgetUtils.createLabel( currentImageSaveContainer, "", 1 ); //$NON-NLS-1$ |
| GridData gd = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL ); |
| dummyLabel.setLayoutData( gd ); |
| currentImageSaveButton = createButton( currentImageSaveContainer, Messages.getString( "ImageDialog.Save" ) ); //$NON-NLS-1$ |
| |
| currentImageSaveButton.addSelectionListener( new SelectionAdapter() |
| { |
| public void widgetSelected( SelectionEvent event ) |
| { |
| FileDialog fileDialog = new FileDialog( ImageDialog.this.getShell(), SWT.SAVE ); |
| fileDialog.setText( Messages.getString( "ImageDialog.SaveImage" ) ); //$NON-NLS-1$ |
| fileDialog.setFilterExtensions( new String[] |
| { "*.jpg" } ); //$NON-NLS-1$ |
| String returnedFileName = fileDialog.open(); |
| |
| if ( returnedFileName != null ) |
| { |
| try |
| { |
| File file = new File( returnedFileName ); |
| FileOutputStream out = new FileOutputStream( file ); |
| out.write( currentImageRawData ); |
| out.flush(); |
| out.close(); |
| } |
| catch ( FileNotFoundException e ) |
| { |
| ConnectionUIPlugin.getDefault().getExceptionHandler().handleException( |
| new Status( IStatus.ERROR, ValueEditorsConstants.PLUGIN_ID, IStatus.ERROR, Messages |
| .getString( "ImageDialog.CantWriteFile" ), e ) ); //$NON-NLS-1$ |
| } |
| catch ( IOException e ) |
| { |
| ConnectionUIPlugin.getDefault().getExceptionHandler().handleException( |
| new Status( IStatus.ERROR, ValueEditorsConstants.PLUGIN_ID, IStatus.ERROR, Messages |
| .getString( "ImageDialog.CantWriteFile" ), e ) ); //$NON-NLS-1$ |
| } |
| } |
| } |
| } ); |
| |
| currentTab.setControl( currentImageContainer ); |
| } |
| |
| // new image |
| newTab = new TabItem( tabFolder, SWT.NONE ); |
| newTab.setText( Messages.getString( "ImageDialog.NewImage" ) ); //$NON-NLS-1$ |
| |
| newImageContainer = createTabItemComposite(); |
| newImageLabel = createImageLabel( newImageContainer ); |
| |
| Composite newImageInfoContainer = createImageInfoContainer( newImageContainer ); |
| newImageTypeText = createImageInfo( newImageInfoContainer, Messages.getString( "ImageDialog.ImageType" ) ); //$NON-NLS-1$ |
| newImageSizeText = createImageInfo( newImageInfoContainer, Messages.getString( "ImageDialog.ImageSize" ) ); //$NON-NLS-1$ |
| newImageWidthText = createImageInfo( newImageInfoContainer, Messages.getString( "ImageDialog.ImageWidth" ) ); //$NON-NLS-1$ |
| newImageHeightText = createImageInfo( newImageInfoContainer, Messages.getString( "ImageDialog.ImageHeight" ) ); //$NON-NLS-1$ |
| |
| Composite newImageSelectContainer = createImageInfoContainer( newImageContainer ); |
| newImageFilenameText = new Text( newImageSelectContainer, SWT.SINGLE | SWT.BORDER ); |
| GridData gd = new GridData( SWT.FILL, SWT.CENTER, true, false ); |
| newImageFilenameText.setLayoutData( gd ); |
| |
| newImageFilenameText.addModifyListener( new ModifyListener() |
| { |
| public void modifyText( ModifyEvent e ) |
| { |
| updateNewImageGroup(); |
| } |
| } ); |
| |
| newImageBrowseButton = createButton( newImageSelectContainer, Messages.getString( "ImageDialog.Browse" ) ); //$NON-NLS-1$ |
| |
| newImageBrowseButton.addSelectionListener( new SelectionAdapter() |
| { |
| public void widgetSelected( SelectionEvent event ) |
| { |
| FileDialog fileDialog = new FileDialog( ImageDialog.this.getShell(), SWT.OPEN ); |
| fileDialog.setText( Messages.getString( "ImageDialog.SelectImage" ) ); //$NON-NLS-1$ |
| fileDialog.setFileName( new File( newImageFilenameText.getText() ).getName() ); |
| fileDialog.setFilterPath( new File( newImageFilenameText.getText() ).getParent() ); |
| |
| String returnedFileName = fileDialog.open(); |
| |
| if ( returnedFileName != null ) |
| { |
| newImageFilenameText.setText( returnedFileName ); |
| } |
| } |
| } ); |
| |
| newTab.setControl( newImageContainer ); |
| applyDialogFont( composite ); |
| |
| return composite; |
| } |
| |
| |
| /** |
| * Creates a tab item composite. |
| * |
| * @return a tab item composite |
| */ |
| private Composite createTabItemComposite() |
| { |
| Composite composite = new Composite( tabFolder, SWT.NONE ); |
| |
| GridLayout compositeLayout = new GridLayout( 1, false ); |
| compositeLayout.marginHeight = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_MARGIN ); |
| compositeLayout.marginWidth = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_MARGIN ); |
| compositeLayout.verticalSpacing = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_SPACING ); |
| compositeLayout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING ); |
| composite.setLayout( compositeLayout ); |
| |
| composite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); |
| |
| return composite; |
| } |
| |
| |
| /** |
| * Creates the image label. |
| * |
| * @param parent the parent |
| * @return the image label |
| */ |
| private Label createImageLabel( Composite parent ) |
| { |
| Composite labelComposite = new Composite( parent, SWT.BORDER ); |
| labelComposite.setLayout( new GridLayout() ); |
| GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true ); |
| labelComposite.setLayoutData( gd ); |
| labelComposite.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WIDGET_NORMAL_SHADOW ) ); |
| |
| Label imageLabel = new Label( labelComposite, SWT.CENTER ); |
| gd = new GridData( SWT.CENTER, SWT.CENTER, true, true ); |
| imageLabel.setLayoutData( gd ); |
| |
| return imageLabel; |
| } |
| |
| |
| /** |
| * Update current image tab. |
| */ |
| private void updateCurrentImageGroup() |
| { |
| if ( currentTab != null ) |
| { |
| if ( ( currentImage != null ) && !currentImage.isDisposed() ) |
| { |
| currentImage.dispose(); |
| currentImage = null; |
| } |
| |
| if ( currentImageRawData != null && currentImageRawData.length > 0 ) |
| { |
| try |
| { |
| ImageData imageData = new ImageData( new ByteArrayInputStream( currentImageRawData ) ); |
| currentImage = new Image( getShell().getDisplay(), resizeImage( imageData ) ); |
| currentImageLabel.setText( "" ); //$NON-NLS-1$ |
| currentImageLabel.setImage( currentImage ); |
| GridData currentImageLabelGridData = new GridData( SWT.CENTER, SWT.CENTER, true, true ); |
| currentImageLabelGridData.widthHint = currentImage.getBounds().width; |
| currentImageLabelGridData.heightHint = currentImage.getBounds().height; |
| currentImageLabel.setLayoutData( currentImageLabelGridData ); |
| currentImageTypeText.setText( getImageType( imageData.type ) ); |
| currentImageSizeText.setText( getSizeString( currentImageRawData.length ) ); |
| currentImageWidthText.setText( NLS |
| .bind( Messages.getString( "ImageDialog.Pixel" ), imageData.width ) ); //$NON-NLS-1$ |
| currentImageHeightText.setText( NLS.bind( |
| Messages.getString( "ImageDialog.Pixel" ), imageData.height ) ); //$NON-NLS-1$ |
| } |
| catch ( SWTException swte ) |
| { |
| currentImageLabel.setImage( null ); |
| currentImageLabel.setText( Messages.getString( "ImageDialog.UnsupportedFormatSpaces" ) ); //$NON-NLS-1$ |
| currentImageTypeText.setText( Messages.getString( "ImageDialog.UnsupportedFormat" ) ); //$NON-NLS-1$ |
| currentImageSizeText.setText( getSizeString( currentImageRawData.length ) ); |
| currentImageWidthText.setText( "-" ); //$NON-NLS-1$ |
| currentImageHeightText.setText( "-" ); //$NON-NLS-1$ |
| } |
| } |
| else |
| { |
| currentImageLabel.setImage( null ); |
| currentImageLabel.setText( Messages.getString( "ImageDialog.NoImageSpaces" ) ); //$NON-NLS-1$ |
| currentImageTypeText.setText( Messages.getString( "ImageDialog.NoImage" ) ); //$NON-NLS-1$ |
| currentImageSizeText.setText( "-" ); //$NON-NLS-1$ |
| currentImageWidthText.setText( "-" ); //$NON-NLS-1$ |
| currentImageHeightText.setText( "-" ); //$NON-NLS-1$ |
| } |
| |
| currentImageSaveButton.setEnabled( currentImageRawData != null && currentImageRawData.length > 0 ); |
| } |
| } |
| |
| |
| /** |
| * Update new image tab. |
| */ |
| private void updateNewImageGroup() |
| { |
| if ( ( newImage != null ) && !newImage.isDisposed() ) |
| { |
| newImage.dispose(); |
| newImage = null; |
| } |
| |
| String newImageFileName = newImageFilenameText.getText(); |
| |
| if ( !Strings.isEmpty( newImageFileName ) ) //$NON-NLS-1$ |
| { |
| try |
| { |
| File file = new File( newImageFileName ); |
| FileInputStream in = new FileInputStream( file ); |
| ByteArrayOutputStream out = new ByteArrayOutputStream( ( int ) file.length() ); |
| byte[] buf = new byte[4096]; |
| int len; |
| |
| while ( ( len = in.read( buf ) ) > 0 ) |
| { |
| out.write( buf, 0, len ); |
| } |
| |
| newImageRawData = out.toByteArray(); |
| out.close(); |
| in.close(); |
| } |
| catch ( FileNotFoundException e ) |
| { |
| newImageRawData = null; |
| newImageLabel.setImage( null ); |
| newImageLabel.setText( Messages.getString( "ImageDialog.ErrorFileNotFound" ) ); //$NON-NLS-1$ |
| newImageTypeText.setText( "-" ); //$NON-NLS-1$ |
| newImageSizeText.setText( "-" ); //$NON-NLS-1$ |
| newImageWidthText.setText( "-" ); //$NON-NLS-1$ |
| newImageHeightText.setText( "-" ); //$NON-NLS-1$ |
| } |
| catch ( IOException e ) |
| { |
| newImageRawData = null; |
| newImageLabel.setImage( null ); |
| newImageLabel.setText( NLS.bind( |
| Messages.getString( "ImageDialog.CantReadFile" ), new String[] { e.getMessage() } ) ); //$NON-NLS-1$ |
| newImageTypeText.setText( "-" ); //$NON-NLS-1$ |
| newImageSizeText.setText( "-" ); //$NON-NLS-1$ |
| newImageWidthText.setText( "-" ); //$NON-NLS-1$ |
| newImageHeightText.setText( "-" ); //$NON-NLS-1$ |
| } |
| } |
| else |
| { |
| newImageRawData = null; |
| newImageLabel.setImage( null ); |
| newImageLabel.setText( Messages.getString( "ImageDialog.NoImageSelected" ) ); //$NON-NLS-1$ |
| newImageTypeText.setText( "-" ); //$NON-NLS-1$ |
| newImageSizeText.setText( "-" ); //$NON-NLS-1$ |
| newImageWidthText.setText( "-" ); //$NON-NLS-1$ |
| newImageHeightText.setText( "-" ); //$NON-NLS-1$ |
| } |
| |
| if ( ( newImageRawData != null ) && ( newImageRawData.length > 0 ) ) |
| { |
| try |
| { |
| ImageData imageData = new ImageData( new ByteArrayInputStream( newImageRawData ) ); |
| newImage = new Image( getShell().getDisplay(), resizeImage( imageData ) ); |
| newImageLabel.setImage( newImage ); |
| newImageTypeText.setText( getImageType( imageData.type ) ); |
| |
| if ( imageData.type != requiredImageType ) |
| { |
| newImageTypeText |
| .setText( newImageTypeText.getText() |
| + NLS |
| .bind( |
| Messages.getString( "ImageDialog.WillBeConverted" ), new String[] { getImageType( requiredImageType ) } ) ); //$NON-NLS-1$ |
| } |
| |
| newImageSizeText.setText( getSizeString( newImageRawData.length ) ); |
| newImageWidthText.setText( NLS.bind( Messages.getString( "ImageDialog.Pixel" ), imageData.width ) ); //$NON-NLS-1$ |
| newImageHeightText.setText( NLS.bind( Messages.getString( "ImageDialog.Pixel" ), imageData.height ) ); //$NON-NLS-1$ |
| } |
| catch ( SWTException swte ) |
| { |
| newImageLabel.setImage( null ); |
| newImageLabel.setText( Messages.getString( "ImageDialog.UnsupportedFormatSpaces" ) ); //$NON-NLS-1$ |
| newImageTypeText.setText( Messages.getString( "ImageDialog.UnsupportedFormat" ) ); //$NON-NLS-1$ |
| newImageSizeText.setText( getSizeString( newImageRawData.length ) ); |
| newImageWidthText.setText( "-" ); //$NON-NLS-1$ |
| newImageHeightText.setText( "-" ); //$NON-NLS-1$ |
| } |
| } |
| |
| if ( okButton != null ) |
| { |
| okButton.setEnabled( newImage != null ); |
| } |
| |
| newImageLabel.getParent().layout(); |
| newImageTypeText.getParent().layout(); |
| } |
| |
| |
| /** |
| * Update tab folder and the tabs. |
| */ |
| private void updateTabFolder() |
| { |
| if ( currentImageSaveButton != null ) |
| { |
| if ( tabFolder.getSelectionIndex() == CURRENT_TAB ) |
| { |
| currentImageSaveButton.setFocus(); |
| } |
| |
| updateCurrentImageGroup(); |
| } |
| |
| if ( newImageBrowseButton != null ) |
| { |
| if ( ( tabFolder.getSelectionIndex() == NEW_TAB ) || ( currentImageSaveButton == null ) ) |
| { |
| newImageBrowseButton.setFocus(); |
| } |
| |
| updateNewImageGroup(); |
| } |
| } |
| |
| |
| /** |
| * Resizes the image. |
| * |
| * @param imageData the image data to resize |
| * |
| * @return the resized image data |
| */ |
| private ImageData resizeImage( ImageData imageData ) |
| { |
| // Computing the width scale factor |
| double widthScaleFactor = 1.0; |
| |
| if ( imageData.width > MAX_WIDTH ) |
| { |
| widthScaleFactor = ( double ) MAX_WIDTH / imageData.width; |
| } |
| |
| // Computing the height scale factor |
| double heightScaleFactor = 1.0; |
| |
| if ( imageData.height > MAX_HEIGHT ) |
| { |
| heightScaleFactor = ( double ) MAX_HEIGHT / imageData.height; |
| } |
| |
| // Taking the minimum of both |
| double minScalefactor = Math.min( heightScaleFactor, widthScaleFactor ); |
| |
| // Resizing the image data |
| return resize( imageData, ( int ) ( imageData.width * minScalefactor ), |
| ( int ) ( imageData.height * minScalefactor ) ); |
| } |
| |
| |
| /** |
| * Resizes an image using the GC (for better quality). |
| * |
| * @param imageData the image data |
| * @param width the width |
| * @param height the height |
| * @return the resized image |
| */ |
| private ImageData resize( ImageData imageData, int width, int height ) |
| { |
| Image image = new Image( Display.getDefault(), imageData ); |
| Image resizedImage = new Image( Display.getDefault(), width, height ); |
| |
| try |
| { |
| GC gc = new GC( resizedImage ); |
| |
| try |
| { |
| gc.setAntialias( SWT.ON ); |
| gc.setInterpolation( SWT.HIGH ); |
| gc.drawImage( image, 0, 0, image.getBounds().width, image.getBounds().height, 0, 0, width, height ); |
| } |
| finally |
| { |
| gc.dispose(); |
| } |
| |
| ImageData resizedImageData = resizedImage.getImageData(); |
| |
| return resizedImageData; |
| } |
| finally |
| { |
| image.dispose(); |
| resizedImage.dispose(); |
| } |
| } |
| |
| |
| /** |
| * Creates the image info container. |
| * |
| * @param parent the parent |
| * |
| * @return the image info container |
| */ |
| private Composite createImageInfoContainer( Composite parent ) |
| { |
| Composite imageInfoContainer = new Composite( parent, SWT.NONE ); |
| GridLayout gl = new GridLayout( 2, false ); |
| gl.marginHeight = gl.marginWidth = 0; |
| imageInfoContainer.setLayout( gl ); |
| imageInfoContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); |
| |
| return imageInfoContainer; |
| } |
| |
| |
| /** |
| * Creates the image info. |
| * |
| * @param label the label |
| * @param parent the parent |
| * |
| * @return the image info |
| */ |
| private Text createImageInfo( Composite parent, String label ) |
| { |
| BaseWidgetUtils.createLabel( parent, label, 1 ); |
| Text text = BaseWidgetUtils.createLabeledText( parent, "", 1 ); //$NON-NLS-1$ |
| |
| return text; |
| } |
| |
| |
| /** |
| * Creates the button. |
| * |
| * @param label the label |
| * @param parent the parent |
| * |
| * @return the button |
| */ |
| private Button createButton( Composite parent, String label ) |
| { |
| Button button = BaseWidgetUtils.createButton( parent, label, 1 ); |
| |
| return button; |
| } |
| |
| |
| /** |
| * Gets the size string. |
| * |
| * @param length the length |
| * |
| * @return the size string |
| */ |
| private static String getSizeString( int length ) |
| { |
| if ( length > 1000000 ) |
| { |
| return ( length / 1000000 ) + NLS.bind( Messages.getString( "ImageDialog.MB" ), new Integer[] //$NON-NLS-1$ |
| { length } ); //$NON-NLS-1$ |
| } |
| else if ( length > 1000 ) |
| { |
| return ( length / 1000 ) + NLS.bind( Messages.getString( "ImageDialog.KB" ), new Integer[] //$NON-NLS-1$ |
| { length } ); //$NON-NLS-1$ |
| } |
| else |
| { |
| return length + Messages.getString( "ImageDialog.Bytes" ); //$NON-NLS-1$ |
| } |
| } |
| |
| |
| /** |
| * Gets the image info. |
| * |
| * @param imageRawData the image raw data |
| * |
| * @return the image info |
| */ |
| public static String getImageInfo( byte[] imageRawData ) |
| { |
| if ( imageRawData == null ) |
| { |
| return IValueEditor.NULL; |
| } |
| |
| String text; |
| try |
| { |
| ByteArrayInputStream bais = new ByteArrayInputStream( imageRawData ); |
| ImageData imageData = new ImageData( bais ); |
| String typePrefix = getImageType( imageData.type ); |
| |
| if ( !Strings.isEmpty( typePrefix ) ) //$NON-NLS-1$ |
| { |
| typePrefix += "-"; //$NON-NLS-1$ |
| } |
| |
| text = NLS |
| .bind( |
| Messages.getString( "ImageDialog.Image" ), new Object[] { typePrefix, imageData.width, imageData.height, imageRawData.length } ); //$NON-NLS-1$ |
| } |
| catch ( SWTException swte ) |
| { |
| text = NLS.bind( Messages.getString( "ImageDialog.InvalidImage" ), new Object[] { imageRawData.length } ); //$NON-NLS-1$ |
| } |
| |
| return text; |
| } |
| |
| |
| /** |
| * Gets the image type. |
| * |
| * @param swtCode the swt code |
| * |
| * @return the image type |
| */ |
| private static String getImageType( int swtCode ) |
| { |
| switch ( swtCode ) |
| { |
| case SWT.IMAGE_JPEG : |
| return "JPEG"; //$NON-NLS-1$ |
| |
| case SWT.IMAGE_GIF : |
| return "GIF"; //$NON-NLS-1$ |
| |
| case SWT.IMAGE_PNG : |
| return "PNG"; //$NON-NLS-1$ |
| |
| case SWT.IMAGE_BMP : |
| case SWT.IMAGE_BMP_RLE : |
| return "BMP"; //$NON-NLS-1$ |
| |
| default : |
| return ""; |
| } |
| } |
| |
| |
| /** |
| * Gets the image data in required format. |
| * |
| * @return Returns the image data in required format or null. |
| */ |
| public byte[] getNewImageRawData() |
| { |
| return newImageRawDataInRequiredFormat; |
| } |
| } |