2014-10-13 5 views
1

Я пытаюсь изменить ответ that для своих нужд и сделать монитор прогресса соответствующим образом отражать ход. Мой подход до сих пор:Скопируйте файлы из файловой системы в проект и правильно управляйте монитором прогресса

import org.eclipse.core.runtime.SubProgressMonitor; 

private void configureProject(IProgressMonitor monitor) 
    throws CoreException, IOException 
{ 
    try 
    { 
     URL templatesURL = Activator.getDefault().getBundle().getEntry(TEMPLATES); 
     File templatesFolder = new File(FileLocator.toFileURL(templatesURL).getPath()); 
     int fileCount = getElementsCount(templatesFolder); 

     monitor.beginTask("Creating file structure for new project...", fileCount + 5); 

     project.getFolder(P_SRC).delete(true, new SubProgressMonitor(monitor, 1)); 
     project.getFolder(P_BIN).delete(true, new SubProgressMonitor(monitor, 1)); 

     copyFiles(templatesFolder, project, new SubProgressMonitor(monitor, fileCount)); 
     project.getFile(P_TOUCH).delete(true, new SubProgressMonitor(monitor, 1)); 

     IClasspathEntry[] newEntries = new IClasspathEntry[3]; 
     newEntries[0] = JavaCore.newSourceEntry(getCreatedElement().getPath().append(SRC_MAIN)); 
     newEntries[1] = JavaCore.newSourceEntry(getCreatedElement().getPath().append(SRC_RES), 
               EXCLUDE_ALL); 
     newEntries[2] = JavaCore.newSourceEntry(getCreatedElement().getPath().append(SRC_TEST)); 
     javaProject.setRawClasspath(newEntries, new SubProgressMonitor(monitor, 2)); 
    } 
    finally 
    { 
     if (!monitor.isCanceled()) 
      monitor.done(); 
    } 
} 


private int getElementsCount(File file) 
{ 
    // return number of files and folders in the file 
} 

Как вы видите, у меня есть 3 тика для операций удаления и 2 для установки пути к классам. Это 5 плюс количество файлов в исходной папке, если я говорю: 1 тик на файл или папку. Теперь у меня проблема с методом copyFiles. Я изменил соответствующий код для работы с IProgressMonitor:

private void copyFiles(File srcFolder, IContainer destFolder, IProgressMonitor monitor) 
    throws CoreException, IOException 
{ 
    for (File f : srcFolder.listFiles()) 
    { 
     if (f.isDirectory()) 
     { 
      IFolder newFolder = destFolder.getFolder(new Path(f.getName())); 
      newFolder.create(true, true, new SubProgressMonitor(monitor, 1)); 
      copyFiles(f, newFolder, monitor); 
     } 
     else 
     { 
      newFile.create(new FileInputStream(f), true, new SubProgressMonitor(monitor, 1)); 
     } 
    } 
} 

Как только один из методов create(...) называется (либо на IFile или на IFolder) прогресс бар должен быть перемещен на 1 тик. Но это совсем не движется. Что может быть причиной и как решить проблему?

обн: Я модифицировал метод configureProject следующим образом:

SubProgressMonitor copyFilesMonitor = new SubProgressMonitor(monitor, fileCount); 
copyFilesMonitor.beginTask("Copying files...", fileCount); 
copyFiles(templatesFolder, project, copyFilesMonitor); 
copyFilesMonitor.done(); 

Теперь проблема заключается в том, что после вызова create() (либо на IFolder или на IFile) прогрессбар установлен на 2/3 - 2 тика. 2/3 предназначен для всего метода configureProject(), и последние 2 тика должны быть сделаны еще setRawClasspath(...).

До:

enter image description here

После:

enter image description here

+0

Вы вызываете 'copyFiles' рекурсивно, поэтому вы вызываете' done' слишком рано –

+0

Вы правы, спасибо за этот намек. Однако это не решение проблемы. 'done' не вызывается в' copyFiles', а в 'create'. Он должен применяться к «SubProgressMonitor», но, по-видимому, он применяется к родительскому монитору. –

ответ

1

Вам нужно позвонить beginTaskdone) на new SubProgressMonitor(monitor, fileCount), что вы создаете для метода copyFiles.

Если вы не звоните beginTask, звонки worked игнорируются.

+0

См. Обновленный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^