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 public void open() { 112 Shell parent = getParent(); 113 shell = new Shell(parent, SWT.SHELL_TRIM | SWT.APPLICATION_MODAL); 114 shell.setFont(curFont); 115 shell.setText(parent.getText()); 116 shell.setImage(ViewProperties.getHdfIcon()); 117 shell.setLayout(new GridLayout(1, true)); 118 119 if (fileTypeTo.equals(FileFormat.FILE_TYPE_HDF5)) { 120 toFileExtension = ".h5"; 121 shell.setText("Convert Image to HDF5 ..."); 122 isConvertedFromImage = true; 123 } 124 else if (fileTypeTo.equals(FileFormat.FILE_TYPE_HDF4)) { 125 toFileExtension = ".hdf"; 126 shell.setText("Convert Image to HDF4 ..."); 127 isConvertedFromImage = true; 128 } 129 130 131 // Create content region 132 Composite contentComposite = new Composite(shell, SWT.NONE); 133 contentComposite.setLayout(new GridLayout(3, false)); 134 contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 135 136 Label label = new Label(contentComposite, SWT.RIGHT); 137 label.setFont(curFont); 138 label.setText("IMAGE File: "); 139 140 srcFileField = new Text(contentComposite, SWT.SINGLE | SWT.BORDER); 141 srcFileField.setFont(curFont); 142 GridData fieldData = new GridData(SWT.FILL, SWT.FILL, true, false); 143 fieldData.minimumWidth = 350; 144 srcFileField.setLayoutData(fieldData); 145 146 Button browseButton = new Button(contentComposite, SWT.PUSH); 147 browseButton.setFont(curFont); 148 browseButton.setText("Browse..."); 149 browseButton.addSelectionListener(new SelectionAdapter() { 150 public void widgetSelected(SelectionEvent e) { 151 FileDialog fChooser = new FileDialog(shell, SWT.OPEN); 152 fChooser.setFilterPath(currentDir); 153 154 if(isConvertedFromImage) { 155 DefaultFileFilter filter = DefaultFileFilter.getImageFileFilter(); 156 fChooser.setFilterExtensions(new String[] {"*", filter.getExtensions()}); 157 fChooser.setFilterNames(new String[] {"All Files", filter.getDescription()}); 158 fChooser.setFilterIndex(1); 159 } else { 160 fChooser.setFilterExtensions(new String[] {"*"}); 161 fChooser.setFilterNames(new String[] {"All Files"}); 162 fChooser.setFilterIndex(0); 163 } 164 165 String filename = fChooser.open(); 166 167 if(filename == null) { 168 return; 169 } 170 171 File chosenFile = new File(filename); 172 173 currentDir = chosenFile.getParent(); 174 srcFileField.setText(chosenFile.getAbsolutePath()); 175 dstFileField.setText(chosenFile.getAbsolutePath() + toFileExtension); 176 } 177 }); 178 179 label = new Label(contentComposite, SWT.RIGHT); 180 label.setFont(curFont); 181 label.setText("HDF File: "); 182 183 dstFileField = new Text(contentComposite, SWT.SINGLE | SWT.BORDER); 184 dstFileField.setFont(curFont); 185 dstFileField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); 186 187 browseButton = new Button(contentComposite, SWT.PUSH); 188 browseButton.setFont(curFont); 189 browseButton.setText("Browse..."); 190 browseButton.addSelectionListener(new SelectionAdapter() { 191 public void widgetSelected(SelectionEvent e) { 192 FileDialog fChooser = new FileDialog(shell, SWT.OPEN); 193 194 fChooser.setFilterExtensions(new String[] {"*"}); 195 fChooser.setFilterNames(new String[] {"All Files"}); 196 fChooser.setFilterIndex(0); 197 198 String filename = fChooser.open(); 199 200 if(filename == null) { 201 return; 202 } 203 204 dstFileField.setText(filename); 205 } 206 }); 207 208 // Dummy label to fill space as dialog is resized 209 new Label(shell, SWT.NONE).setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 210 211 212 // Create Ok/Cancel button 213 Composite buttonComposite = new Composite(shell, SWT.NONE); 214 buttonComposite.setLayout(new GridLayout(2, true)); 215 buttonComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); 216 217 Button okButton = new Button(buttonComposite, SWT.PUSH); 218 okButton.setFont(curFont); 219 okButton.setText(" &OK "); 220 okButton.setLayoutData(new GridData(SWT.END, SWT.FILL, true, false)); 221 okButton.addSelectionListener(new SelectionAdapter() { 222 public void widgetSelected(SelectionEvent e) { 223 isConverted = convert(); 224 225 if (isConverted) { 226 shell.dispose(); 227 } 228 } 229 }); 230 231 Button cancelButton = new Button(buttonComposite, SWT.PUSH); 232 cancelButton.setFont(curFont); 233 cancelButton.setText(" &Cancel "); 234 cancelButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.FILL, true, false)); 235 cancelButton.addSelectionListener(new SelectionAdapter() { 236 public void widgetSelected(SelectionEvent e) { 237 isConverted = false; 238 convertedFile = null; 239 shell.dispose(); 240 } 241 }); 242 243 244 shell.pack(); 245 246 shell.addDisposeListener(new DisposeListener() { 247 public void widgetDisposed(DisposeEvent e) { 248 if (curFont != null) curFont.dispose(); 249 } 250 }); 251 252 shell.setMinimumSize(shell.computeSize(SWT.DEFAULT, SWT.DEFAULT)); 253 254 Rectangle parentBounds = parent.getBounds(); 255 Point shellSize = shell.getSize(); 256 shell.setLocation((parentBounds.x + (parentBounds.width / 2)) - (shellSize.x / 2), 257 (parentBounds.y + (parentBounds.height / 2)) - (shellSize.y / 2)); 258 259 shell.open(); 260 261 Display display = parent.getDisplay(); 262 while(!shell.isDisposed()) { 263 if (!display.readAndDispatch()) 264 display.sleep(); 265 } 266 } 267 268 /** Convert file */ 269 private boolean convert() { 270 boolean converted = false; 271 String srcFile = srcFileField.getText(); 272 String dstFile = dstFileField.getText(); 273 274 if ((srcFile == null) || (dstFile == null)) { 275 return false; 276 } 277 278 srcFile = srcFile.trim(); 279 dstFile = dstFile.trim(); 280 if ((srcFile == null) || (srcFile.length() <= 0) || (dstFile == null) 281 || (dstFile.length() <= 0)) { 282 return false; 283 } 284 285 // verify the source file 286 File f = new File(srcFile); 287 if (!f.exists()) { 288 shell.getDisplay().beep(); 289 Tools.showError(shell, "Convert", "Source file does not exist."); 290 return false; 291 } 292 else if (f.isDirectory()) { 293 shell.getDisplay().beep(); 294 Tools.showError(shell, "Convert", "Source file is a directory."); 295 return false; 296 } 297 298 // verify target file 299 String srcPath = f.getParent(); 300 f = new File(dstFile); 301 File pfile = f.getParentFile(); 302 if (pfile == null) { 303 dstFile = srcPath + File.separator + dstFile; 304 f = new File(dstFile); 305 } 306 else if (!pfile.exists()) { 307 shell.getDisplay().beep(); 308 Tools.showError(shell, "Convert", "Destination file path does not exist at\n" 309 + pfile.getPath()); 310 return false; 311 } 312 313 // check if the file is in use 314 if (fileList != null) { 315 FileFormat theFile = null; 316 Iterator<FileFormat> iterator = fileList.iterator(); 317 while (iterator.hasNext()) { 318 theFile = (FileFormat) iterator.next(); 319 if (theFile.getFilePath().equals(dstFile)) { 320 shell.getDisplay().beep(); 321 Tools.showError(shell, "Convert", "The destination file is being used."); 322 return false; 323 } 324 } 325 } 326 327 if (f.exists()) { 328 if(!Tools.showConfirm(shell, "Convert", "Destination file exists. Do you want to replace it ?")) 329 return false; 330 } 331 332 try { 333 Tools.convertImageToHDF(srcFile, dstFile, fileTypeFrom, fileTypeTo); 334 convertedFile = dstFile; 335 converted = true; 336 } 337 catch (Exception ex) { 338 convertedFile = null; 339 converted = false; 340 shell.getDisplay().beep(); 341 Tools.showError(shell, "Convert", ex.getMessage()); 342 return false; 343 } 344 345 return converted; 346 } 347 348 public boolean isFileConverted() { 349 return isConverted; 350 } 351 352 public String getConvertedFile() { 353 return convertedFile; 354 } 355}