/* * Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved. * * This program and the accompanying materials are made available * under the terms of the Eclipse Public License, Version 1.0, * which accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html * */ package net.rim.ejde.internal.util; import java.io.File; import java.lang.reflect.InvocationTargetException; import net.rim.ejde.internal.model.preferences.WarningsPreferences; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; public class BrowseSearchDialog extends MessageDialog { private final String _fileName; private String _chosenFilePath; private Shell _parentShell; // these constants must correspond with order buttons are added in // constructor private static final int SEARCH_INDEX = 0; private static final int BROWSE_INDEX = 1; private static final int CANCEL_INDEX = 2; private static final int DONT_ASK_INDEX = 3; private static final int SUCCESS_INDEX = 0; private static final int FAILURE_INDEX = -1; private boolean _dontAskAgain = false; private boolean _doCancel = false; private static final Logger log = Logger.getLogger( BrowseSearchDialog.class ); /** * Constructs the dialog. * * @param parentShell * The parent shell * @param fileName * The debug file name */ public BrowseSearchDialog( Shell parentShell, String fileName ) { super( parentShell, Messages.BrowseSearchDialog_browseTitle, null, NLS.bind( Messages.BrowseSearchDialog_message, fileName ), WARNING, new String[] { Messages.BrowseSearchDialog_searchLabel, Messages.BrowseSearchDialog_browseLabel, IDialogConstants.CANCEL_LABEL, Messages.BrowseSearchDialog_dontAskLabel }, 0 ); _fileName = fileName; _chosenFilePath = null; _parentShell = parentShell; } /** * Gets the debug file path. * * @return The debug file path */ public String getFilePath() { return _chosenFilePath; } /** * Returns if user selected don't ask again button * * @return <code>true</code> if yes; otherwise <code>false</code> */ public boolean isDontAskAgain() { return _dontAskAgain; } /** * Returns if the Cancel button is clicked. * * @return <code>true</code> if yes; otherwise <code>false</code> */ public boolean isCancel() { return _doCancel; } @Override protected void buttonPressed( int buttonId ) { close(); switch( buttonId ) { case SEARCH_INDEX: { search(); break; } case BROWSE_INDEX: { browse(); break; } case CANCEL_INDEX: { cancel(); break; } case DONT_ASK_INDEX: { dontAsk(); break; } } } private void dontAsk() { _dontAskAgain = true; WarningsPreferences.setPromptForMissingDebugFiles( false ); } private void cancel() { _doCancel = true; } private int browse() { FileDialog dialog = new FileDialog( _parentShell, SWT.OPEN ); dialog.setFilterExtensions( new String[] { "*.debug" } ); //$NON-NLS-1$ dialog.setFileName( _fileName ); _chosenFilePath = dialog.open(); // When user press Cancel button in the FileChooser if( _chosenFilePath == null ) { return FAILURE_INDEX; } // make sure the user is choosing the right file and that file exists in // that specific directory. File debugFile = new File( _chosenFilePath ); if( debugFile.exists() && debugFile.getName().equals( _fileName ) ) { return SUCCESS_INDEX; } _chosenFilePath = null; return FAILURE_INDEX; } private int search() { DirectoryDialog dialog = new DirectoryDialog( _parentShell, SWT.OPEN ); String chosenDir = dialog.open(); _chosenFilePath = null; if( chosenDir == null ) { return FAILURE_INDEX; } File dir = new File( chosenDir ); if( !dir.isDirectory() ) { log.error( "Did not get expected directory " + chosenDir ); //$NON-NLS-1$ return FAILURE_INDEX; } RecursiveSearchOp op = new RecursiveSearchOp( dir, _fileName ); try { PlatformUI.getWorkbench().getProgressService().busyCursorWhile( op ); } catch( InvocationTargetException e ) { ErrorHandler.handleOperationException( getShell(), Messages.BrowseSearchDialog_searchExceptionMsg, e ); return FAILURE_INDEX; } catch( InterruptedException e ) { ErrorHandler.handleOperationException( getShell(), Messages.BrowseSearchDialog_searchExceptionMsg, e ); return FAILURE_INDEX; } if( op.getFile() == null ) { return FAILURE_INDEX; } _chosenFilePath = op.getFile().getAbsolutePath(); return SUCCESS_INDEX; } /** * Search for a file in a given directory and its subdirectories */ private static class RecursiveSearchOp implements IRunnableWithProgress { private File _dir; private String _name; private File _file; public RecursiveSearchOp( File dir, String name ) { _dir = dir; _name = name; } File getFile() { return _file; } public void run( final IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException { RecursiveSearchTask.ISearchDialog dialog = new RecursiveSearchTask.ISearchDialog() { public boolean isCanceled() { return monitor.isCanceled(); } public void updateProgress( String dirName ) { monitor.subTask( Messages.BrowseSearchDialog_searchingLabel + dirName ); } }; RecursiveSearchTask task = new RecursiveSearchTask( dialog, _dir, _name ); task.run(); _file = task.getFile(); } } }