1 20 21 package org.apache.directory.ldapstudio.valueeditors.image; 22 23 24 import java.io.ByteArrayInputStream ; 25 import java.io.ByteArrayOutputStream ; 26 import java.io.File ; 27 import java.io.FileInputStream ; 28 import java.io.FileNotFoundException ; 29 import java.io.FileOutputStream ; 30 import java.io.IOException ; 31 32 import org.apache.directory.ldapstudio.browser.common.BrowserCommonActivator; 33 import org.apache.directory.ldapstudio.browser.common.widgets.BaseWidgetUtils; 34 import org.apache.directory.ldapstudio.valueeditors.ValueEditorsActivator; 35 import org.apache.directory.ldapstudio.valueeditors.ValueEditorsConstants; 36 import org.eclipse.core.runtime.IStatus; 37 import org.eclipse.core.runtime.Status; 38 import org.eclipse.jface.dialogs.Dialog; 39 import org.eclipse.jface.dialogs.IDialogConstants; 40 import org.eclipse.swt.SWT; 41 import org.eclipse.swt.SWTException; 42 import org.eclipse.swt.events.ModifyEvent; 43 import org.eclipse.swt.events.ModifyListener; 44 import org.eclipse.swt.events.SelectionAdapter; 45 import org.eclipse.swt.events.SelectionEvent; 46 import org.eclipse.swt.graphics.Image; 47 import org.eclipse.swt.graphics.ImageData; 48 import org.eclipse.swt.graphics.ImageLoader; 49 import org.eclipse.swt.layout.GridData; 50 import org.eclipse.swt.layout.GridLayout; 51 import org.eclipse.swt.widgets.Button; 52 import org.eclipse.swt.widgets.Composite; 53 import org.eclipse.swt.widgets.Control; 54 import org.eclipse.swt.widgets.FileDialog; 55 import org.eclipse.swt.widgets.Label; 56 import org.eclipse.swt.widgets.Shell; 57 import org.eclipse.swt.widgets.TabFolder; 58 import org.eclipse.swt.widgets.TabItem; 59 import org.eclipse.swt.widgets.Text; 60 61 62 public class ImageDialog extends Dialog 63 { 64 65 public static final String DIALOG_TITLE = "Image Editor"; 66 67 public static final int MAX_WIDTH = 250; 70 71 public static final int MAX_HEIGHT = 250; 72 73 public static final int CURRENT_TAB = 0; 74 75 public static final int NEW_TAB = 1; 76 77 public static final String SELECTED_TAB_DIALOGSETTINGS_KEY = ImageDialog.class.getName() + ".tab"; 78 79 private TabFolder tabFolder; 80 81 private TabItem currentTab; 82 83 private TabItem newTab; 84 85 private byte[] currentImageRawData; 86 87 private Image currentImage; 88 89 private Composite currentImageContainer; 90 91 private Label currentImageLabel; 92 93 private Text currentImageTypeText; 94 95 private Text currentImageWidthText; 96 97 private Text currentImageHeightText; 98 99 private Text currentImageSizeText; 100 101 private Button currentImageSaveButton; 102 103 private byte[] newImageRawData; 104 105 private Image newImage; 106 107 private Composite newImageContainer; 108 109 private Label newImageLabel; 110 111 private Text newImageTypeText; 112 113 private Text newImageWidthText; 114 115 private Text newImageHeightText; 116 117 private Text newImageSizeText; 118 119 private Text newImageFilenameText; 120 121 private Button newImageBrowseButton; 122 123 private int requiredImageType; 124 125 private byte[] newImageRawDataInRequiredFormat; 126 127 private Button okButton; 128 129 130 public ImageDialog( Shell parentShell, byte[] currentImageRawData, int requiredImageType ) 131 { 132 super( parentShell ); 133 super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); 134 this.currentImageRawData = currentImageRawData; 135 this.requiredImageType = requiredImageType; 136 137 newImageRawDataInRequiredFormat = null; 138 } 139 140 141 public boolean close() 142 { 143 if ( this.currentImage != null && !this.currentImage.isDisposed() ) 144 { 145 this.currentImage.dispose(); 146 } 147 if ( this.newImage != null && !this.newImage.isDisposed() ) 148 { 149 this.newImage.dispose(); 150 } 151 152 ValueEditorsActivator.getDefault().getDialogSettings().put( SELECTED_TAB_DIALOGSETTINGS_KEY, 154 this.tabFolder.getSelectionIndex() ); 155 156 return super.close(); 157 } 158 159 160 protected void buttonPressed( int buttonId ) 161 { 162 if ( buttonId == IDialogConstants.OK_ID ) 163 { 164 if ( this.newImageRawData != null ) 165 { 166 try 167 { 168 ImageData imageData = new ImageData( new ByteArrayInputStream ( this.newImageRawData ) ); 169 if ( imageData.type != this.requiredImageType ) 170 { 171 ImageLoader imageLoader = new ImageLoader(); 172 imageLoader.data = new ImageData[] 173 { imageData }; 174 ByteArrayOutputStream baos = new ByteArrayOutputStream (); 175 imageLoader.save( baos, this.requiredImageType ); 176 this.newImageRawDataInRequiredFormat = baos.toByteArray(); 177 } 178 else 179 { 180 this.newImageRawDataInRequiredFormat = this.newImageRawData; 181 } 182 } 183 catch ( SWTException swte ) 184 { 185 this.newImageRawDataInRequiredFormat = null; 186 } 187 } 188 189 } 190 else 191 { 192 this.newImageRawDataInRequiredFormat = null; 193 } 194 195 super.buttonPressed( buttonId ); 196 } 197 198 199 protected void configureShell( Shell shell ) 200 { 201 super.configureShell( shell ); 202 shell.setText( DIALOG_TITLE ); 203 shell.setImage( ValueEditorsActivator.getDefault().getImage( ValueEditorsConstants.IMG_IMAGEEDITOR ) ); 204 } 205 206 207 protected void createButtonsForButtonBar( Composite parent ) 208 { 209 okButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false ); 210 createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false ); 211 212 try 214 { 215 int tabIndex = ValueEditorsActivator.getDefault().getDialogSettings().getInt( SELECTED_TAB_DIALOGSETTINGS_KEY ); 216 this.tabFolder.setSelection( tabIndex ); 217 } 218 catch ( Exception e ) 219 { 220 } 221 222 updateTabFolder(); 224 } 225 226 227 protected Control createDialogArea( Composite parent ) 228 { 229 230 Composite composite = ( Composite ) super.createDialogArea( parent ); 231 GridData gd1 = new GridData( GridData.FILL_BOTH ); 232 gd1.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ); 233 gd1.heightHint = convertVerticalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ); 234 composite.setLayoutData( gd1 ); 235 236 this.tabFolder = new TabFolder( composite, SWT.TOP ); 237 GridLayout mainLayout = new GridLayout(); 238 mainLayout.marginWidth = 0; 239 mainLayout.marginHeight = 0; 240 this.tabFolder.setLayout( mainLayout ); 241 this.tabFolder.setLayoutData( new GridData( GridData.FILL_BOTH ) ); 242 this.tabFolder.addSelectionListener( new SelectionAdapter() 243 { 244 public void widgetSelected( SelectionEvent e ) 245 { 246 updateTabFolder(); 247 } 248 } ); 249 250 if ( this.currentImageRawData != null && this.currentImageRawData.length > 0 ) 252 { 253 currentImageContainer = new Composite( this.tabFolder, SWT.NONE ); 254 GridLayout currentLayout = new GridLayout( 1, false ); 255 currentLayout.marginHeight = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_MARGIN ); 256 currentLayout.marginWidth = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_MARGIN ); 257 currentLayout.verticalSpacing = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_SPACING ); 258 currentLayout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING ); 259 currentImageContainer.setLayout( currentLayout ); 260 currentImageContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); 261 262 currentImageLabel = createImageLabel( currentImageContainer ); 263 264 Composite currentImageInfoContainer = createImageInfoContainer( currentImageContainer ); 265 currentImageTypeText = createImageInfo( currentImageInfoContainer, "Image Type:" ); 266 currentImageSizeText = createImageInfo( currentImageInfoContainer, "Image Size:" ); 267 currentImageWidthText = createImageInfo( currentImageInfoContainer, "Image Width:" ); 268 currentImageHeightText = createImageInfo( currentImageInfoContainer, "Image Height:" ); 269 270 Composite currentImageSaveContainer = createImageInfoContainer( currentImageContainer ); 271 Label dummyLabel = BaseWidgetUtils.createLabel( currentImageSaveContainer, "", 1 ); 272 GridData gd = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL ); 273 dummyLabel.setLayoutData( gd ); 274 currentImageSaveButton = createButton( currentImageSaveContainer, "Save..." ); 275 currentImageSaveButton.addSelectionListener( new SelectionAdapter() 276 { 277 public void widgetSelected( SelectionEvent event ) 278 { 279 FileDialog fileDialog = new FileDialog( ImageDialog.this.getShell(), SWT.SAVE ); 280 fileDialog.setText( "Save Image" ); 281 fileDialog.setFilterExtensions( new String [] 282 { "*.jpg" } ); 283 String returnedFileName = fileDialog.open(); 284 if ( returnedFileName != null ) 285 { 286 try 287 { 288 File file = new File ( returnedFileName ); 289 FileOutputStream out = new FileOutputStream ( file ); 290 out.write( currentImageRawData ); 291 out.flush(); 292 out.close(); 293 } 294 catch ( FileNotFoundException e ) 295 { 296 297 BrowserCommonActivator.getDefault() 298 .getExceptionHandler().handleException( 299 new Status( IStatus.ERROR, ValueEditorsActivator.PLUGIN_ID, IStatus.ERROR, 300 "Can't write to file", e ) ); 301 } 302 catch ( IOException e ) 303 { 304 BrowserCommonActivator.getDefault() 305 .getExceptionHandler().handleException( 306 new Status( IStatus.ERROR, ValueEditorsActivator.PLUGIN_ID, IStatus.ERROR, 307 "Can't write to file", e ) ); 308 } 309 } 310 } 311 } ); 312 313 this.currentTab = new TabItem( this.tabFolder, SWT.NONE ); 314 this.currentTab.setText( "Current Image" ); 315 this.currentTab.setControl( currentImageContainer ); 316 } 317 318 newImageContainer = new Composite( this.tabFolder, SWT.NONE ); 320 GridLayout newLayout = new GridLayout( 1, false ); 321 newLayout.marginHeight = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_MARGIN ); 322 newLayout.marginWidth = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_MARGIN ); 323 newLayout.verticalSpacing = convertVerticalDLUsToPixels( IDialogConstants.VERTICAL_SPACING ); 324 newLayout.horizontalSpacing = convertHorizontalDLUsToPixels( IDialogConstants.HORIZONTAL_SPACING ); 325 newImageContainer.setLayout( newLayout ); 326 newImageContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); 327 328 newImageLabel = createImageLabel( newImageContainer ); 329 330 Composite newImageInfoContainer = createImageInfoContainer( newImageContainer ); 331 newImageTypeText = createImageInfo( newImageInfoContainer, "Image Type:" ); 332 newImageSizeText = createImageInfo( newImageInfoContainer, "Image Size:" ); 333 newImageWidthText = createImageInfo( newImageInfoContainer, "Image Width:" ); 334 newImageHeightText = createImageInfo( newImageInfoContainer, "Image Height:" ); 335 336 Composite newImageSelectContainer = createImageInfoContainer( newImageContainer ); 337 newImageFilenameText = new Text( newImageSelectContainer, SWT.SINGLE | SWT.BORDER ); 338 GridData gd = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL ); 339 newImageFilenameText.setLayoutData( gd ); 340 newImageFilenameText.addModifyListener( new ModifyListener() 341 { 342 public void modifyText( ModifyEvent e ) 343 { 344 updateNewImageGroup(); 345 } 346 } ); 347 newImageBrowseButton = createButton( newImageSelectContainer, "Browse..." ); 348 newImageBrowseButton.addSelectionListener( new SelectionAdapter() 349 { 350 public void widgetSelected( SelectionEvent event ) 351 { 352 FileDialog fileDialog = new FileDialog( ImageDialog.this.getShell(), SWT.OPEN ); 353 fileDialog.setText( "Select Image" ); 354 fileDialog.setFileName( new File ( newImageFilenameText.getText() ).getName() ); 356 fileDialog.setFilterPath( new File ( newImageFilenameText.getText() ).getParent() ); 357 String returnedFileName = fileDialog.open(); 358 if ( returnedFileName != null ) 359 { 360 newImageFilenameText.setText( returnedFileName ); 361 } 362 } 363 } ); 364 365 this.newTab = new TabItem( this.tabFolder, SWT.NONE ); 366 this.newTab.setText( "New Image" ); 367 this.newTab.setControl( newImageContainer ); 368 369 applyDialogFont( composite ); 370 return composite; 371 } 372 373 374 private void updateCurrentImageGroup() 375 { 376 377 if ( currentTab != null ) 378 { 379 380 if ( currentImage != null && !currentImage.isDisposed() ) 381 { 382 currentImage.dispose(); 383 currentImage = null; 384 } 385 386 if ( currentImageRawData != null && currentImageRawData.length > 0 ) 387 { 388 try 389 { 390 ImageData imageData = new ImageData( new ByteArrayInputStream ( currentImageRawData ) ); 391 currentImage = new Image( getShell().getDisplay(), resizeImage( imageData ) ); 392 currentImageLabel.setText( "" ); 393 currentImageLabel.setImage( currentImage ); 394 currentImageTypeText.setText( getImageType( imageData.type ) ); 395 currentImageSizeText.setText( getSizeString( currentImageRawData.length ) ); 396 currentImageWidthText.setText( imageData.width + " Pixel" ); 397 currentImageHeightText.setText( imageData.height + " Pixel" ); 398 } 399 catch ( SWTException swte ) 400 { 401 currentImageLabel.setImage( null ); 402 currentImageLabel.setText( " Unsupported format " ); 403 currentImageTypeText.setText( "Unsupported format" ); 404 currentImageSizeText.setText( getSizeString( currentImageRawData.length ) ); 405 currentImageWidthText.setText( "-" ); 406 currentImageHeightText.setText( "-" ); 407 } 408 } 410 else 411 { 412 currentImageLabel.setImage( null ); 413 currentImageLabel.setText( " No Image " ); 414 currentImageTypeText.setText( "No Image" ); 415 currentImageSizeText.setText( "-" ); 416 currentImageWidthText.setText( "-" ); 417 currentImageHeightText.setText( "-" ); 418 } 419 420 currentImageSaveButton.setEnabled( currentImageRawData != null && currentImageRawData.length > 0 ); 421 422 } 424 } 425 426 427 private void updateNewImageGroup() 428 { 429 430 if ( newImage != null && !newImage.isDisposed() ) 431 { 432 newImage.dispose(); 433 newImage = null; 434 } 435 436 if ( !"".equals( newImageFilenameText.getText() ) ) 437 { 438 try 439 { 440 File file = new File ( newImageFilenameText.getText() ); 441 FileInputStream in = new FileInputStream ( file ); 442 ByteArrayOutputStream out = new ByteArrayOutputStream ( ( int ) file.length() ); 443 byte[] buf = new byte[4096]; 444 int len; 445 while ( ( len = in.read( buf ) ) > 0 ) 446 { 447 out.write( buf, 0, len ); 448 } 449 this.newImageRawData = out.toByteArray(); 450 out.close(); 451 in.close(); 452 } 453 catch ( FileNotFoundException e ) 454 { 455 newImageRawData = null; 456 newImageLabel.setImage( null ); 457 newImageLabel.setText( " Error: File not found " ); 458 newImageTypeText.setText( "-" ); 459 newImageSizeText.setText( "-" ); 460 newImageWidthText.setText( "-" ); 461 newImageHeightText.setText( "-" ); 462 } 463 catch ( IOException e ) 464 { 465 newImageRawData = null; 466 newImageLabel.setImage( null ); 467 newImageLabel.setText( " Error: Can't read file (" + e.getMessage() + ") " ); 468 newImageTypeText.setText( "-" ); 469 newImageSizeText.setText( "-" ); 470 newImageWidthText.setText( "-" ); 471 newImageHeightText.setText( "-" ); 472 } 473 } 474 else 475 { 476 newImageRawData = null; 477 newImageLabel.setImage( null ); 478 newImageLabel.setText( " No image selected " ); 479 newImageTypeText.setText( "-" ); 480 newImageSizeText.setText( "-" ); 481 newImageWidthText.setText( "-" ); 482 newImageHeightText.setText( "-" ); 483 } 484 485 if ( newImageRawData != null && newImageRawData.length > 0 ) 486 { 487 try 488 { 489 ImageData imageData = new ImageData( new ByteArrayInputStream ( newImageRawData ) ); 490 newImage = new Image( getShell().getDisplay(), resizeImage( imageData ) ); 491 newImageLabel.setImage( newImage ); 492 newImageTypeText.setText( getImageType( imageData.type ) ); 493 if ( imageData.type != requiredImageType ) 494 { 495 newImageTypeText.setText( newImageTypeText.getText() + " (will be converted to " 496 + getImageType( this.requiredImageType ) + ")" ); 497 } 498 newImageSizeText.setText( getSizeString( newImageRawData.length ) ); 499 newImageWidthText.setText( imageData.width + " Pixel" ); 500 newImageHeightText.setText( imageData.height + " Pixel" ); 501 } 502 catch ( SWTException swte ) 503 { 504 newImageLabel.setImage( null ); 505 newImageLabel.setText( " Unsupported format " ); 506 newImageTypeText.setText( "Unsupported format" ); 507 newImageSizeText.setText( getSizeString( newImageRawData.length ) ); 508 newImageWidthText.setText( "-" ); 509 newImageHeightText.setText( "-" ); 510 } 511 } 512 513 if ( okButton != null ) 514 { 515 okButton.setEnabled( newImage != null ); 516 } 517 518 newImageLabel.getParent().layout(); 519 newImageTypeText.getParent().layout(); 520 523 } 524 525 526 private void updateTabFolder() 527 { 528 if ( currentImageSaveButton != null ) 529 { 530 if ( tabFolder.getSelectionIndex() == CURRENT_TAB ) 531 { 532 currentImageSaveButton.setFocus(); 533 } 534 updateCurrentImageGroup(); 535 } 536 537 if ( newImageBrowseButton != null ) 538 { 539 if ( tabFolder.getSelectionIndex() == NEW_TAB || currentImageSaveButton == null ) 540 { 541 newImageBrowseButton.setFocus(); 542 } 543 updateNewImageGroup(); 544 } 545 } 546 547 548 private ImageData resizeImage( ImageData imageData ) 549 { 550 double widthScaleFactor = 1.0; 551 if ( imageData.width > MAX_WIDTH ) 552 { 553 widthScaleFactor = ( double ) MAX_WIDTH / imageData.width; 554 } 555 double heightScaleFactor = 1.0; 556 if ( imageData.height > MAX_HEIGHT ) 557 { 558 heightScaleFactor = ( double ) MAX_HEIGHT / imageData.height; 559 } 560 561 if ( heightScaleFactor < widthScaleFactor ) 562 { 563 imageData = imageData.scaledTo( 564 convertHorizontalDLUsToPixels( ( int ) ( imageData.width * heightScaleFactor ) ), 565 convertHorizontalDLUsToPixels( ( int ) ( imageData.height * heightScaleFactor ) ) ); 566 } 567 else 568 { 569 imageData = imageData.scaledTo( 570 convertHorizontalDLUsToPixels( ( int ) ( imageData.width * widthScaleFactor ) ), 571 convertHorizontalDLUsToPixels( ( int ) ( imageData.height * widthScaleFactor ) ) ); 572 } 573 574 return imageData; 575 } 576 577 578 private Label createImageLabel( Composite parent ) 579 { 580 Composite labelComposite = new Composite( parent, SWT.BORDER ); 581 GridLayout gl = new GridLayout( 1, true ); 582 labelComposite.setLayout( gl ); 583 GridData gd = new GridData( GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL ); 584 gd.widthHint = MAX_WIDTH; 585 gd.heightHint = MAX_HEIGHT; 586 labelComposite.setLayoutData( gd ); 587 labelComposite.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WIDGET_NORMAL_SHADOW ) ); 588 589 Label imageLabel = new Label( labelComposite, SWT.CENTER ); 590 gd = new GridData( SWT.CENTER, SWT.CENTER, true, true ); 591 imageLabel.setLayoutData( gd ); 592 return imageLabel; 593 } 594 595 596 private Composite createImageInfoContainer( Composite parent ) 597 { 598 Composite imageInfoContainer = new Composite( parent, SWT.NONE ); 599 GridLayout gl = new GridLayout( 2, false ); 600 gl.marginHeight = gl.marginWidth = 0; 601 imageInfoContainer.setLayout( gl ); 602 imageInfoContainer.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); 603 return imageInfoContainer; 604 } 605 606 607 private Text createImageInfo( Composite parent, String label ) 608 { 609 BaseWidgetUtils.createLabel( parent, label, 1 ); 610 Text text = BaseWidgetUtils.createLabeledText( parent, "", 1 ); 611 return text; 612 } 613 614 615 private Button createButton( Composite parent, String label ) 616 { 617 Button button = BaseWidgetUtils.createButton( parent, label, 1 ); 618 return button; 619 } 620 621 622 public static String getSizeString( int length ) 623 { 624 if ( length > 1000000 ) 625 return ( length / 1000000 ) + " MB (" + length + " bytes)"; 626 else if ( length > 1000 ) 627 return ( length / 1000 ) + " KB (" + length + " bytes)"; 628 else 629 return length + " bytes"; 630 } 631 632 633 public static String getImageInfo( byte[] imageRawData ) 634 { 635 636 if ( imageRawData == null ) 637 { 638 return "NULL"; 639 } 640 641 String text = "Image (" + imageRawData.length + " Bytes)"; 642 try 643 { 644 ByteArrayInputStream bais = new ByteArrayInputStream ( imageRawData ); 645 ImageData imageData = new ImageData( bais ); 646 647 String typePrefix = getImageType( imageData.type ); 648 if ( !"".equals( typePrefix ) ) 649 typePrefix += "-"; 650 651 text = typePrefix + "Image (" + imageData.width + "x" + imageData.height + " Pixel, " + imageRawData.length 652 + " Bytes)"; 653 } 654 catch ( SWTException swte ) 655 { 656 text = "Invalid Image (" + imageRawData.length + " Bytes)"; 657 } 658 return text; 659 } 660 661 662 public static String getImageType( int swtCode ) 663 { 664 String type = ""; 665 if ( swtCode == SWT.IMAGE_JPEG ) 666 type = "JPEG"; 667 else if ( swtCode == SWT.IMAGE_GIF ) 668 type = "GIF"; 669 else if ( swtCode == SWT.IMAGE_PNG ) 670 type = "PNG"; 671 else if ( swtCode == SWT.IMAGE_BMP || swtCode == SWT.IMAGE_BMP_RLE ) 672 type = "BMP"; 673 return type; 674 } 675 676 677 682 public byte[] getNewImageRawData() 683 { 684 return this.newImageRawDataInRequiredFormat; 685 } 686 } 687
| Popular Tags
|