001/***************************************************************************** 002 * Copyright by The HDF Group. * 003 * Copyright by the Board of Trustees of the University of Illinois. * 004 * All rights reserved. * 005 * * 006 * This file is part of the HDF Java Products distribution. * 007 * The full copyright notice, including terms governing use, modification, * 008 * and redistribution, is contained in the files COPYING and Copyright.html. * 009 * COPYING can be found at the root of the source code distribution tree. * 010 * Or, see https://support.hdfgroup.org/products/licenses.html * 011 * If you do not have access to either file, you may request a copy from * 012 * help@hdfgroup.org. * 013 ****************************************************************************/ 014 015package hdf.view.dialog; 016 017import java.io.File; 018import java.util.Iterator; 019import java.util.List; 020 021import org.eclipse.swt.SWT; 022import org.eclipse.swt.events.DisposeEvent; 023import org.eclipse.swt.events.DisposeListener; 024import org.eclipse.swt.events.SelectionAdapter; 025import org.eclipse.swt.events.SelectionEvent; 026import org.eclipse.swt.graphics.Font; 027import org.eclipse.swt.graphics.Point; 028import org.eclipse.swt.graphics.Rectangle; 029import org.eclipse.swt.layout.GridData; 030import org.eclipse.swt.layout.GridLayout; 031import org.eclipse.swt.widgets.Button; 032import org.eclipse.swt.widgets.Composite; 033import org.eclipse.swt.widgets.Dialog; 034import org.eclipse.swt.widgets.Display; 035import org.eclipse.swt.widgets.FileDialog; 036import org.eclipse.swt.widgets.Label; 037import org.eclipse.swt.widgets.Shell; 038import org.eclipse.swt.widgets.Text; 039 040import hdf.object.FileFormat; 041import hdf.view.DefaultFileFilter; 042import hdf.view.Tools; 043import hdf.view.ViewProperties; 044 045/** 046 * ImageConversionDialog shows a message dialog requesting user input for 047 * converting files. 048 * 049 * @author Jordan T. Henderson 050 * @version 2.4 1/28/2016 051 */ 052public class ImageConversionDialog extends Dialog { 053 private Shell shell; 054 055 private Font curFont; 056 057 private String fileTypeFrom, fileTypeTo; 058 059 private Text srcFileField, dstFileField; 060 061 private boolean isConverted; 062 063 private boolean isConvertedFromImage; 064 065 private String convertedFile; 066 067 private String toFileExtension; 068 069 private List<FileFormat> fileList; 070 071 private String currentDir; 072 073 /** 074 * Constructs a FileConversionDialog 075 * 076 * @param parent 077 * The parent shell of the dialog. 078 * @param typeFrom 079 * source file type 080 * @param typeTo 081 * destination file type 082 * @param dir 083 * current file directory 084 * @param openFiles 085 * The list of currently open files 086 */ 087 public ImageConversionDialog(Shell parent, String typeFrom, String typeTo, 088 String dir, List<FileFormat> openFiles) { 089 super(parent, SWT.APPLICATION_MODAL); 090 091 try { 092 curFont = new Font( 093 Display.getCurrent(), 094 ViewProperties.getFontType(), 095 ViewProperties.getFontSize(), 096 SWT.NORMAL); 097 } 098 catch (Exception ex) { 099 curFont = null; 100 } 101 102 fileTypeFrom = typeFrom; 103 fileTypeTo = typeTo; 104 isConverted = false; 105 isConvertedFromImage = false; 106 fileList = openFiles; 107 toFileExtension = ""; 108 currentDir = dir; 109 } 110 111 /** 112 * Open the ImageConversionDialog for converting images. 113 */ 114 public void open() { 115 Shell parent = getParent(); 116 shell = new Shell(parent, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL); 117 shell.setFont(curFont); 118 shell.setText(parent.getText()); 119 shell.setImage(ViewProperties.getHdfIcon()); 120 shell.setLayout(new GridLayout(1, true)); 121 122 if (fileTypeTo.equals(FileFormat.FILE_TYPE_HDF5)) { 123 toFileExtension = ".h5"; 124 shell.setText("Convert Image to HDF5 ..."); 125 isConvertedFromImage = true; 126 } 127 else if (fileTypeTo.equals(FileFormat.FILE_TYPE_HDF4)) { 128 toFileExtension = ".hdf"; 129 shell.setText("Convert Image to HDF4 ..."); 130 isConvertedFromImage = true; 131 } 132 133 134 // Create content region 135 Composite contentComposite = new Composite(shell, SWT.NONE); 136 contentComposite.setLayout(new GridLayout(3, false)); 137 contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 138 139 Label label = new Label(contentComposite, SWT.RIGHT); 140 label.setFont(curFont); 141 label.setText("IMAGE File: "); 142 143 srcFileField = new Text(contentComposite, SWT.SINGLE | SWT.BORDER); 144 srcFileField.setFont(curFont); 145 GridData fieldData = new GridData(SWT.FILL, SWT.FILL, true, false); 146 fieldData.minimumWidth = 350; 147 srcFileField.setLayoutData(fieldData); 148 149 Button browseButton = new Button(contentComposite, SWT.PUSH); 150 browseButton.setFont(curFont); 151 browseButton.setText("Browse..."); 152 browseButton.addSelectionListener(new SelectionAdapter() { 153 public void widgetSelected(SelectionEvent e) { 154 FileDialog fChooser = new FileDialog(shell, SWT.OPEN); 155 fChooser.setFilterPath(currentDir); 156 157 if(isConvertedFromImage) { 158 DefaultFileFilter filter = DefaultFileFilter.getImageFileFilter(); 159 fChooser.setFilterExtensions(new String[] {"*", filter.getExtensions()}); 160 fChooser.setFilterNames(new String[] {"All Files", filter.getDescription()}); 161 fChooser.setFilterIndex(1); 162 } else { 163 fChooser.setFilterExtensions(new String[] {"*"}); 164 fChooser.setFilterNames(new String[] {"All Files"}); 165 fChooser.setFilterIndex(0); 166 } 167 168 String filename = fChooser.open(); 169 170 if(filename == null) { 171 return; 172 } 173 174 File chosenFile = new File(filename); 175 176 currentDir = chosenFile.getParent(); 177 srcFileField.setText(chosenFile.getAbsolutePath()); 178 dstFileField.setText(chosenFile.getAbsolutePath() + toFileExtension); 179 } 180 }); 181 182 label = new Label(contentComposite, SWT.RIGHT); 183 label.setFont(curFont); 184 label.setText("HDF File: "); 185 186 dstFileField = new Text(contentComposite, SWT.SINGLE | SWT.BORDER); 187 dstFileField.setFont(curFont); 188 dstFileField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); 189 190 browseButton = new Button(contentComposite, SWT.PUSH); 191 browseButton.setFont(curFont); 192 browseButton.setText("Browse..."); 193 browseButton.addSelectionListener(new SelectionAdapter() { 194 public void widgetSelected(SelectionEvent e) { 195 FileDialog fChooser = new FileDialog(shell, SWT.OPEN); 196 197 fChooser.setFilterExtensions(new String[] {"*"}); 198 fChooser.setFilterNames(new String[] {"All Files"}); 199 fChooser.setFilterIndex(0); 200 201 String filename = fChooser.open(); 202 203 if(filename == null) { 204 return; 205 } 206 207 dstFileField.setText(filename); 208 } 209 }); 210 211 // Dummy label to fill space as dialog is resized 212 new Label(shell, SWT.NONE).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 213 214 215 // Create Ok/Cancel button 216 Composite buttonComposite = new Composite(shell, SWT.NONE); 217 buttonComposite.setLayout(new GridLayout(2, true)); 218 buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); 219 220 Button okButton = new Button(buttonComposite, SWT.PUSH); 221 okButton.setFont(curFont); 222 okButton.setText(" &OK "); 223 okButton.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false)); 224 okButton.addSelectionListener(new SelectionAdapter() { 225 public void widgetSelected(SelectionEvent e) { 226 isConverted = convert(); 227 228 if (isConverted) { 229 shell.dispose(); 230 } 231 } 232 }); 233 234 Button cancelButton = new Button(buttonComposite, SWT.PUSH); 235 cancelButton.setFont(curFont); 236 cancelButton.setText(" &Cancel "); 237 cancelButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false)); 238 cancelButton.addSelectionListener(new SelectionAdapter() { 239 public void widgetSelected(SelectionEvent e) { 240 isConverted = false; 241 convertedFile = null; 242 shell.dispose(); 243 } 244 }); 245 246 247 shell.pack(); 248 249 shell.addDisposeListener(new DisposeListener() { 250 public void widgetDisposed(DisposeEvent e) { 251 if (curFont != null) curFont.dispose(); 252 } 253 }); 254 255 shell.setMinimumSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 256 257 Rectangle parentBounds = parent.getBounds(); 258 Point shellSize = shell.getSize(); 259 shell.setLocation((parentBounds.x + (parentBounds.width / 2)) - (shellSize.x / 2), 260 (parentBounds.y + (parentBounds.height / 2)) - (shellSize.y / 2)); 261 262 shell.open(); 263 264 Display display = parent.getDisplay(); 265 while(!shell.isDisposed()) { 266 if (!display.readAndDispatch()) 267 display.sleep(); 268 } 269 } 270 271 /** Convert file */ 272 private boolean convert() { 273 boolean converted = false; 274 String srcFile = srcFileField.getText(); 275 String dstFile = dstFileField.getText(); 276 277 if ((srcFile == null) || (dstFile == null)) { 278 return false; 279 } 280 281 srcFile = srcFile.trim(); 282 dstFile = dstFile.trim(); 283 if ((srcFile == null) || (srcFile.length() <= 0) || (dstFile == null) 284 || (dstFile.length() <= 0)) { 285 return false; 286 } 287 288 // verify the source file 289 File f = new File(srcFile); 290 if (!f.exists()) { 291 shell.getDisplay().beep(); 292 Tools.showError(shell, "Convert", "Source file does not exist."); 293 return false; 294 } 295 else if (f.isDirectory()) { 296 shell.getDisplay().beep(); 297 Tools.showError(shell, "Convert", "Source file is a directory."); 298 return false; 299 } 300 301 // verify target file 302 String srcPath = f.getParent(); 303 f = new File(dstFile); 304 File pfile = f.getParentFile(); 305 if (pfile == null) { 306 dstFile = srcPath + File.separator + dstFile; 307 f = new File(dstFile); 308 } 309 else if (!pfile.exists()) { 310 shell.getDisplay().beep(); 311 Tools.showError(shell, "Convert", "Destination file path does not exist at\n" 312 + pfile.getPath()); 313 return false; 314 } 315 316 // check if the file is in use 317 if (fileList != null) { 318 FileFormat theFile = null; 319 Iterator<FileFormat> iterator = fileList.iterator(); 320 while (iterator.hasNext()) { 321 theFile = (FileFormat) iterator.next(); 322 if (theFile.getFilePath().equals(dstFile)) { 323 shell.getDisplay().beep(); 324 Tools.showError(shell, "Convert", "The destination file is being used."); 325 return false; 326 } 327 } 328 } 329 330 if (f.exists()) { 331 if(!Tools.showConfirm(shell, "Convert", "Destination file exists. Do you want to replace it ?")) 332 return false; 333 } 334 335 try { 336 Tools.convertImageToHDF(srcFile, dstFile, fileTypeFrom, fileTypeTo); 337 convertedFile = dstFile; 338 converted = true; 339 } 340 catch (Exception ex) { 341 convertedFile = null; 342 converted = false; 343 shell.getDisplay().beep(); 344 Tools.showError(shell, "Convert", ex.getMessage()); 345 return false; 346 } 347 348 return converted; 349 } 350 351 /** 352 * if an image file has been converted. 353 * 354 * @return the state of conversion 355 */ 356 public boolean isFileConverted() { 357 return isConverted; 358 } 359 360 /** 361 * get the file of an image file that has been converted. 362 * 363 * @return the name of the converted file 364 */ 365 public String getConvertedFile() { 366 return convertedFile; 367 } 368}