Criando plug-in para o Eclipse

7 respostas
A

Olá pessoal!
Estou criando um plug-in para o eclipse com o objetivo e auxiliar o programador a criar arquivos de scripts de banco de dados.
Esses arquivos devem obedecer a uma nomenclatura específica para que Flyway (http://code.google.com/p/flyway/) possa executá-los corretamente.
Gostaria que o funcionamento fosse semelhante à criação de uma classe Java, ou seja, clica-se com o botão direito sobre a pasta desejada e depois abre-se uma janela para que sejam preenchidas algumas informações, como nome…
Já consegui colocar o menu e fazê-lo executar um “Hello World!!!”, mas não sei como chamar uma janela com os campos para criação do arquivo.
Anexei duas imagem com aquilo que já fiz.
Obrigado



7 Respostas

L

Tenho alguns projetos de plugins aki, é mto dificil achar ajuda sobre isso aki no guj, vou colocar um exemplo de criacao de campo qualquer duvida va perguntando ai.

FormToolkit	toolkit = new FormToolkit(parent.getDisplay());
			toolkit.setOrientation(SWT.CENTER);
			Composite composite = new Composite(parent, SWT.APPLICATION_MODAL);
			composite.setLayout(new FillLayout(SWT.CENTER));
			composite.setSize(50, 50);
			final ScrolledForm form = toolkit.createScrolledForm(composite);
			form.setLayoutData(new GridData(5, 5));
			form.setText("Exportar Projeto");

			form.getBody().setLayout(new GridLayout(2, false));
			toolkit.createLabel(form.getBody(), "Projeto: ", SWT.LEFT);
		toolkit.createLabel(form.getBody(), "Servidor Destino: ", SWT.LEFT);
		destinoCombo = new Combo(form.getBody(), SWT.READ_ONLY);
		destinoCombo
				.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));

		toolkit.createLabel(form.getBody(), "Servidor Origem: ", SWT.LEFT);
		origemCombo = new Combo(form.getBody(), SWT.READ_ONLY);
		origemCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
		toolkit.createLabel(form.getBody(), "Servidor Destino: ", SWT.LEFT);
		destinoCombo = new Combo(form.getBody(), SWT.READ_ONLY);
		destinoCombo
				.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
L

Uma otima referencia pra pesquisa >>> http://lubospeclipse.wordpress.com/eclipse-plugin-and-rcp-development-notes-2-2/

A

A grosso modo, você teria uma action ligada ao item de menu. Dessa forma você pode ligá-la a um atalho de teclado, a um botão na barra de ferramentas, etc.

Sugiro que você dê uma olhada no site do Lars Vogel, ele é uma referência em Eclipse.

http://www.vogella.com/articles/EclipseRCP/article.html

Apesar de esse artigo ser para criação de aplicações na plataforma, ele serve para criação de plugins, já que o processo é semelhante (a diferença é que na plataforma você configura algumas coisinhas a mais, mas as suas funcionalidades acabam virando plugins e features).

A

Valeu galera, mas meu problema é um pouco mais específico.
Gostaria de saber como criar uma janela e como chamá-la através do menu que criei.
Abaixo o meu arquivo plugin.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="popup:org.eclipse.jdt.ui.PackageExplorer">
         <command
               commandId="SamplerHandlerId"
               label="Novo script Flyway"
               style="push">
         </command>
      </menuContribution>
   </extension>
   
   <extension
         point="org.eclipse.ui.commands">
      <command
            defaultHandler="de.vogella.plugin.htmlconverter.handler.SamplerHandler"
            id="SamplerHandlerId"
            name="Sample">
      </command>
   </extension>

</plugin>
A
alissonmn:
Valeu galera, mas meu problema é um pouco mais específico. Gostaria de saber como criar uma janela e como chamá-la através do menu que criei. Abaixo o meu arquivo plugin.xml:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="popup:org.eclipse.jdt.ui.PackageExplorer">
         <command
               commandId="SamplerHandlerId"
               label="Novo script Flyway"
               style="push">
         </command>
      </menuContribution>
   </extension>
   
   <extension
         point="org.eclipse.ui.commands">
      <command
            defaultHandler="de.vogella.plugin.htmlconverter.handler.SamplerHandler"
            id="SamplerHandlerId"
            name="Sample">
      </command>
   </extension>

</plugin>

Entendo que seu problema é específico, mas é bem básico e por isso sugerimos alguns links pra você dar uma vasulhada. O Eclipse possui uma plataforma com conceitos muito bem definidos e conhecer esses conceitos é a chave pra se trabalhar com a plataforma.

Você já tem alguma experiência construindo plugins pro Eclipse? Já tentou olhar a wiki (http://wiki.eclipse.org/index.php/Menu_Contributions)? O tutorial de commands do Vogel (http://www.vogella.com/articles/EclipseCommands/article.html)? O tutorial de plugins dele (http://www.vogella.com/articles/EclipsePlugIn/article.html)?

No tutorial de plugins ele faz uso da plataforma 4.x, mas dê uma procurada na página que talvez tenha o tutorial da 3.x.

L

Isso é simples cara cria uma action e é só chamar um shell veja:

public void run(IAction action) {
		try {
			GridLayout layout = new GridLayout();
			layout.numColumns = 1;
			layout.marginWidth = 2;
			layout.marginHeight = 2;

			Shell shell = new Shell();
			shell.setLayout(layout);

			SashForm form = new SashForm(shell, SWT.HORIZONTAL);
			form.setLayout(layout);
			shell.setText("Selecione um Servidor");
			Composite child1 = new Composite(form, SWT.NONE);
			child1.setLayout(layout);
			createCombo(child1);
			createButon(child1, shell);
			shell.pack();
			shell.open();

			/*
			 * InputDialog serverPath = new InputDialog(sh,
			 * "Leandrus Log Reader", "Informe o path do log seu Imbecil:",
			 * "\\\\goioere\\JbossLog\\console.log", null); serverPath.open();
			 */

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
A

Valeu galera. É isso mesmo que eu precisava!
Consegui implementar a tela e fazê-la criar um arquivo “.sql”, mas o eclipse não reconhece o arquivo e, ao invés de abri-lo no editor, pergunta-me com qual programa eu quero abri-lo.
Encontrei uma possível solução (http://stackoverflow.com/questions/1624054/eclipse-plugin-create-a-new-file).
Tenho que criar o arquivo usando IFile e não um FileWriter como estou fazendo. Minha dúvida é: Para criar um arquivo IFile, tenho que passar um InputStream. Para buscar o InputStream devo usar o comando “Activator.getDefault().getBundle().getEntry([color=red]caminho_arquivo[/color]).openStream()”. Percebam que o parâmetro para buscar o input é o caminho do arquivo. Como passar esse caminho se o arquivo ainda não existe? Quando faço isso, dá NullPointerException.

IProject currentProject = getCurrentSelectedProject();					
IFile file = currentProject.getFile(caminho_arquivo);
InputStream input = Activator.getDefault().getBundle().getEntry(caminho_arquivo).openStream();
...
file.create(input, false, null);

Alterei meu código para não buscar o inputStream de um bundle, mas criei um ByteArrayInputStream.
Agora, ao criar o arquivo, é gerado um erro dizendo que o resource não existe: [color=red]Resource ‘/teste/Users/joao/workspace/runtime-EclipseApplication/teste/src/migrations/1.4.0’ does not exist[/color]
Debugando o código, meu IPath loc está assim: [color=darkred]C:/Users/joao/workspace/runtime-EclipseApplication/teste/src/migrations/1.4.0/teste.sql[/color]

IPath loc = ((IFolder) selecionado).getLocation();
loc = loc.append("/teste.sql");

try {
    IProject currentProject = getCurrentSelectedProject();
    IFile ifile = currentProject.getFile(loc);
    String contents = "Whatever";
    InputStream input = new ByteArrayInputStream(contents.getBytes());
    ifile.create(input, false, null);
} catch (CoreException e) {
    MessageDialog.openError(shell, "Erro", "Erro ao criar o arquivo. ERRO: "+e.getMessage());
}
Criado 31 de agosto de 2012
Ultima resposta 4 de set. de 2012
Respostas 7
Participantes 3