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

Criando plug-in para o Eclipse
7 Respostas
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));
Uma otima referencia pra pesquisa >>> http://lubospeclipse.wordpress.com/eclipse-plugin-and-rcp-development-notes-2-2/
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).
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>
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.
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();
}
}
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());
}
