private void initGUI() {
		try {
		
			// Menu bar e itens
			mainMenu = new Menu(shell, SWT.BAR);
			shell.setMenuBar(mainMenu);
				fileMenuItem = new MenuItem(mainMenu, SWT.CASCADE);
				fileMenuItem.setText("Arquivo");
				fileMenu = new Menu(fileMenuItem);
					openFileMenuItem = new MenuItem(fileMenu, SWT.CASCADE);
					openFileMenuItem.setText("Abrir");
					openFileMenuItem.addSelectionListener(new SelectionAdapter() {
						public void widgetSelected(SelectionEvent evt) {
							openFile();
						}
					});

					exitMenuItem = new MenuItem(fileMenu, SWT.CASCADE);
					exitMenuItem.setText("Sair");
					exitMenuItem.addSelectionListener(new SelectionAdapter() {
						public void widgetSelected(SelectionEvent evt) {
							shell.dispose();
						}
					});

				fileMenuItem.setMenu(fileMenu);	
				
				helpMenuItem = new MenuItem(mainMenu, SWT.CASCADE);
				helpMenuItem.setText("Ajuda");
					helpMenu = new Menu(helpMenuItem);
						contentsMenuItem = new MenuItem(helpMenu, SWT.CASCADE);
						contentsMenuItem.setText("Conteúdo");
						contentsMenuItem.addSelectionListener(new SelectionAdapter() {
							public void widgetSelected(SelectionEvent evt) {
								final Shell dialog = new Shell(shell);
							    dialog.setText("Conteúdo");
							    dialog.setSize(600, 150);
							    dialog.setLayout(new RowLayout(SWT.VERTICAL));
							    
							        new StyledText(dialog, SWT.PUSH).setText("Este trabalho foi desenvolvido p/ a disciplina de AA e abrange o escopo da teoria sobre grafos, \n" + 
							    		"contendo assim a implementação dos algoritmos de verificação de componentes conexas, \n" +
							    		"verificação da existência de ciclos, verificação de vértices e arestas de corte e \n" +
							    		"análise de bipartição para os grafos simples. Para dígrafos, os algoritmos implementados \n" +
							    		"verificação de componentes fortemente conexas, fecho transitivo e ordenação topológica.\n");
							    Button btnOk = new Button(dialog, SWT.PUSH);
								btnOk.setText("Ok");
								btnOk.addListener(SWT.Selection, new Listener() {
									public void handleEvent(Event event) {
										dialog.dispose();
									}
								});
								dialog.open();
							}
						});
						
						aboutMenuItem = new MenuItem(helpMenu, SWT.CASCADE);
						aboutMenuItem.setText("Sobre");
						aboutMenuItem.addSelectionListener(new SelectionAdapter() {
							public void widgetSelected(SelectionEvent evt) {
								final Shell dialog = new Shell(shell);
							    dialog.setText("Sobre");
							    dialog.setSize(350, 150);
							    dialog.setLayout(new RowLayout(SWT.VERTICAL));
							    new StyledText(dialog, SWT.PUSH).setText("Implementação da Teoria de Grafos 1.0 \n\n" + 
							    		"Alunos: \n\t Igor Henrique da Cruz (spym4n@gmail.com)\n\t Newtom Muchael (skeeterfoz@gmail.com)\n");
							    Button btnOk = new Button(dialog, SWT.PUSH);
								btnOk.setText("Ok");
								btnOk.addListener(SWT.Selection, new Listener() {
									public void handleEvent(Event event) {
										dialog.dispose();
									}
								});
							    dialog.open();
							}
						});
						
				helpMenuItem.setMenu(helpMenu);

						
			// Widget Composite principal da shell da swt	
			groupComposite = new Composite(shell, SWT.NONE);
			// Setando o layout desse composite
			groupComposite.setLayout(new FillLayout());
			
			// Widget Composite lado esquerdo, botões dos algoritmos
			Composite fakeComposite = new Composite(groupComposite, SWT.BEGINNING);
			// Setando o layout desse composite
			fakeComposite.setLayout(new RowLayout(SWT.BEGINNING));
			
			// Widget Group dos algoritmos para grafos
			Group groupGrafo = new Group(fakeComposite, SWT.BOTTOM);
			groupGrafo.setText("        Algoritmos Grafo       ");
			// Setando o layout desse composite
			groupGrafo.setLayout(new RowLayout(SWT.VERTICAL));
				
				btnComponente = new Button(groupGrafo, SWT.NONE);
				btnComponente.setText("Componentes Conexas");
				btnComponente.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Componentes Conexas
					public void handleEvent(Event event) {
						ArrayList<ArrayList<Integer>> compenentes = Operacoes.ComponentesConexas(graph);
						StringBuffer sb = new StringBuffer("Componentes Conexas: \n");
						for (ArrayList<Integer> i : compenentes)
							sb.append(i.toString() + "\n");
						JOptionPane.showMessageDialog(null, sb);
					}
				});
				
				btnCiclo = new Button(groupGrafo, SWT.NONE);
				btnCiclo.setText("Ciclo");
				btnCiclo.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Ciclo
					public void handleEvent(Event event) {
						replot(Operacoes.Ciclo(graph).getMatriz());
					}
				});
				
				btnVcorte = new Button(groupGrafo, SWT.NONE);
				btnVcorte.setText("Vértice de corte");
				btnVcorte.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Vértice de Corte
					public void handleEvent(Event event) {
						replot(Operacoes.VerticesDeCorte(graph).getMatriz());
					}
				});
				
				btnAcorte = new Button(groupGrafo, SWT.NONE);
				btnAcorte.setText("Aresta de corte");
				btnAcorte.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Aresta de Corte
					public void handleEvent(Event event) {
						replot(Operacoes.ArestasDeCorte(graph).getMatriz());	
					}
				});
				
				btnBipartido = new Button(groupGrafo, SWT.NONE);
				btnBipartido.setText("Bipartição");
				btnBipartido.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Bipartição
					public void handleEvent(Event event) {
						ArrayList<ArrayList<Integer>> compenentes = Operacoes.Biparticao(graph);
						if (compenentes != null) {
							StringBuffer sb = new StringBuffer("Bipartição: \n");
							for (ArrayList<Integer> i : compenentes)
								sb.append(i.toString() + "\n");
							JOptionPane.showMessageDialog(null, sb);
						} else {
							JOptionPane.showMessageDialog(null, "Bipartição inexistente");
						}
					}
				});
			
			// Widget Group para os algoritmos de dígrafo
			Group groupDigrafo = new Group(fakeComposite, SWT.SHADOW_IN);
			groupDigrafo.setText("        Algoritmos Dígrafo       ");
			
			// setando o layout do widget
			groupDigrafo.setLayout(new RowLayout(SWT.VERTICAL));
				
				btnFecho = new Button(groupDigrafo, SWT.NONE);
				btnFecho.setText("Fecho Transitivo");
				btnFecho.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Fecho Transitivo
					public void handleEvent(Event event) {
						replot(Operacoes.FechoTransitivo(graph).getMatriz());
					}
				});
				
				btnTopologica = new Button(groupDigrafo, SWT.NONE);
				btnTopologica.setText("Ordenação Topológica");
				btnTopologica.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Ordenação Topológica
					public void handleEvent(Event event) {
						StringBuffer sb = new StringBuffer("Ordenação topológica é dada pelos seguintes vértices: \n");
						for (int i=0; i < Operacoes.OrdenacaoTopologica(graph).size(); i++)
							sb.append(Operacoes.OrdenacaoTopologica(graph).get(i)+1 + " - ");
						JOptionPane.showMessageDialog(null, sb);
					}
				});
				
				btnComponenteF = new Button(groupDigrafo, SWT.NONE);
				btnComponenteF.setText("Componentes Fortemente Conexas");
				btnComponenteF.addListener(SWT.Selection, new Listener() {
					
					// evento do botão Componentes Fortemente Conexas
					public void handleEvent(Event event) {
						replot(Operacoes.ComponentesFortementeConexas(graph).getMatriz());
					}
				});

			// Setando todos os widgets de botões para falso para não poder 
			// usa-los quando não carregado nenhum grafo	
			this.btnAcorte.setEnabled(false);
			this.btnVcorte.setEnabled(false);
			this.btnBipartido.setEnabled(false);
			this.btnCiclo.setEnabled(false);
			this.btnComponente.setEnabled(false);
			this.btnFecho.setEnabled(false);
			this.btnTopologica.setEnabled(false);
			this.btnComponenteF.setEnabled(false);
			
			// Widget Composite para a visualização do grafo gerado pelo prefuse
			graphComposite = new Composite(shell, SWT.EMBEDDED);
			graphComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
			graphFrame = SWT_AWT.new_Frame(graphComposite);
			
		}catch (Exception e){
			System.out.println(e.getMessage());
		}
	}