Problemas com barra de progresso - SWT

Bom dia,

Possuo uma interface que irá disparar uma operação que poderá levar alguns minutos.

Para indicar ao usuário que o sistema esta ocupado optei por utilizar o Progress Bar. Esse progress bar foi adicionado em uma janela modal que é aberta assim que a operação é iniciada.

A primeira vista esta funcionando conforme eu queria, porém após alguns segundos (enquanto a operação é feita e a barra esta sendo incrementada), a primeira janela fica disponível para clique, possibilitando ao usuário clicar no X e fechar o sistema no meio da operação.

Isso é um bug da API ou estou utilizando o Progress bar de maneira errada?

public class Operation {
	
	private int cont = 0;
	
	//Imagine aqui um método que realiza uma operação longa
	//e que durante sua execução serão feitos os incrementos 
	//na barra de progresso
	public void operation(ProgressBar bar){
		while(cont < 100){			
			try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//incrementa a barra de progresso
			bar.setSelection(cont);
			cont ++;
			System.out.println(cont);
		}
	}
}
public class TesteUI {

	private Button btnPrint;
	private Display display;
	private Shell shell;
		
	public static void main(String[] args){
		new TesteUI().createUI();
	}
	
	public Display getDisplay() {
		return display;
	}

	public void setDisplay(Display display) {
		this.display = display;
	}

	public void createUI() {

		display = new Display();
		shell = new Shell();
		shell.setText("Teste Barra de Progresso");
		Composite mainComposite = new Composite(shell, SWT.NULL);
		GridLayout mainLayout = new GridLayout(2,true);
		GridData mainGrid = new GridData();
		mainGrid.widthHint = 600;
		mainGrid.heightHint = 400;
		mainComposite.setLayoutData(mainGrid);
		mainComposite.setLayout(mainLayout);
		
		btnPrint = new Button(mainComposite, SWT.None);
		btnPrint.setText("Imprimir");
		btnPrint.addSelectionListener(new SelectionListener() {			
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				display.asyncExec(new VerifyProgressBar(new Operation()));
			}
			@Override
			public void widgetDefaultSelected(SelectionEvent arg0) {
				display.asyncExec(new VerifyProgressBar(new Operation()));
			}
		});
				
		mainComposite.pack();
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	
}
public class VerifyProgressBar implements Runnable {

	private Operation operation;

	public VerifyProgressBar(Operation operation) {
		super();
		this.operation = operation;
	}

	@Override
	public void run() {

		Shell shell = new Shell(Display.getCurrent(), SWT.BORDER | SWT.TITLE
				| SWT.SYSTEM_MODAL);
		
		shell.setText("Barra de Progresso");
		
		Composite mainComposite = new Composite(shell, SWT.NULL);
		GridLayout mainLayout = new GridLayout(1,true);
		mainComposite.setLayout(mainLayout);		
		ProgressBar importProgressBar = new ProgressBar(mainComposite, SWT.SMOOTH);
		importProgressBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		importProgressBar.setMaximum(100);
		importProgressBar.setMinimum(0);
		mainComposite.pack();
		shell.open();		
		operation.operation(importProgressBar);
		shell.close();

	}
}