/*
* 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();
}
}
}