# ICompilationUnit



## Swingman (4. Februar 2005)

Hallo, 
ich versuche gerade, dass ein Plugin zu schreiben. Dabei kommen einige Fehler wie: 
"ICompilationUnit cannot be resolved or is not a type" 
"The method getCompilationUnit() is undefined for the type NumberOfLinesAction" 
"The method getNumberOfLines() is undefined for the type DocumentBuilder" 
Hat einer eine Ahnung, woran das liegen könnte? 

Mein Ziel ist es, diese zusätzliche Funktionalität in Eclipse einzubauen. Wenn z.B. bei einer Properties-Datei, die Rechte Maustaste gedrückt wird, soll eine Auswahlmöglichkeit für meine Funktionalität auch erscheinen. 
D.h. was muss ich verwenden damit .properties-Dateien berücksichtigt werden? 

Die auswahlmöglichkeit für eine Java-Datei ist mir bekannt. Das wird mit 
org.eclipse.jdt.core.ICompilationUnit erreicht. Aber wie sieht es denn für eine Properties-Datei aus? 

Danke im voraus für Ihre Untertützung. 

swingman


----------



## Thomas Darimont (4. Februar 2005)

Hallo!

Ganz einfach:
New Plugin Project:
Name: de.tutorials.superpropertiesengine
-> Finish

Plugin.xml:
-> Dependencies:
org.eclipse.ui
org.eclipse.core.runtime
org.eclipse.core.resources
org.eclipse.platform


Extensions:
org.eclipse.ui.popupMenus
-> New Contribution -> Object Contribution:
Id: de.tutorials.superpropertiesengine.action.PropertiesAction
objectClass: org.eclipse.core.resources.IFile
nameFilter: *.properties
adaptable: true

-> objectContribution -> new Menu:
id: de.tutorials.superpropertiesengine.superpropertiesmenu
label: SuperProperties
path: additions

->SuperProperties(Menu) -> new GroupMarker:
name: group

-> objectContribution -> new Action:
id: de.tutorials.superpropertiesengine.action.SuperPropertiesAction
label: SuperPropertiesAction
class: de.tutorials.superpropertiesengine.action.SuperPropertiesAction
tooltip: The megabrutal SuperPropertiesAction
menubarPath: de.tutorials.superpropertiesengine.superpropertiesmenu/group

Neue Klasse erstellen:

```
/*
 * Created on 04.02.2005@10:12:45
 *
 * TODO Licence info
 */
package de.tutorials.superpropertiesengine.action;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

/**
 * @author Darimont
 *
 * TODO explain me
 */
public class SuperPropertiesAction implements IObjectActionDelegate {

    private IFile file;

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction,
     *      org.eclipse.ui.IWorkbenchPart)
     */
    public void setActivePart(IAction action, IWorkbenchPart targetPart) {
        // TODO Auto-generated method stub

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run(IAction action) {
        // TODO Auto-generated method stub
        if (this.file == null) {
            System.out.println("No .properties file selected");
        } else {
            System.out.println("File: " + this.file.getName() + " selected.");
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
     *      org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IAction action, ISelection selection) {
        if (selection instanceof IStructuredSelection) {
            IStructuredSelection iss = (IStructuredSelection) selection;
            Object o = iss.getFirstElement();
            if (o instanceof IFile) {
                this.file = (IFile) o;
            } else {
                this.file = null;
            }
        }
    }

}
```

fertig!

Plguin.xml wie's generiert wurde:

```
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin
   id="de.tutorials.superpropertiesengine"
   name="Superpropertiesengine Plug-in"
   version="1.0.0"
   provider-name="tutorials.de"
   class="de.tutorials.superpropertiesengine.SuperpropertiesenginePlugin">

   <runtime>
      <library name="superpropertiesengine.jar">
         <export name="*"/>
      </library>
   </runtime>

   <requires>
      <import plugin="org.eclipse.ui"/>
      <import plugin="org.eclipse.core.runtime"/>
      <import plugin="org.eclipse.core.resources"/>
      <import plugin="org.eclipse.platform"/>
   </requires>
   <extension
         point="org.eclipse.ui.popupMenus">
      <objectContribution
            adaptable="true"
            objectClass="org.eclipse.core.resources.IFile"
            nameFilter="*.properties"
            id="de.tutorials.superpropertiesengine.action.PropertiesAction">
         <menu
               label="SuperProperties"
               path="additions"
               id="de.tutorials.superpropertiesengine.superpropertiesmenu">
            <groupMarker name="group"/>
         </menu>
         <action
               label="SuperPropertiesAction"
               tooltip="The megabrutal SuperPropertiesAction"
               class="de.tutorials.superpropertiesengine.action.SuperPropertiesAction"
               menubarPath="de.tutorials.superpropertiesengine.superpropertiesmenu/group"
               id="de.tutorials.superpropertiesengine.action.SuperPropertiesAction"/>
      </objectContribution>
   </extension>

</plugin>
```

Gruß Tom


----------



## Swingman (4. Februar 2005)

Hallo Tom,
ich versuche bezogen auf den Artikel "ECLIPSE PLUG-INS –
ENTWICKELN UND PUBLIZIEREN" einen eigenen PlugIn für meinen Programm zu schreiben, weil es im Prinzip fast genauso funktionieren muss. Unter uns gesagt hab ich den Artikel durch Deinen link gefunden. 

http://www.sigs.de/publications/os/2004/01/weinand_OS_01_04.pdf

D.h. wenn z.B. bei einer Propertie-Datei die Rechte-Taste im Eclipse gedrückt wird, soll die Auswahl meines Programms kommen. Problem dabei ist, das ich wirklich absolut keine Ahnung von PlugIn-Entwicklung habe. Deshalb versuche ich mit dem oben erwähnten Artikel mir eine Überblick zu verschaffen und durchzuhangeln. 

Probleme dabei sind, was bei meinem PlugIn anders sein muss:
- in dem Artikel wird die Funktionalität für Java-Dateien zur Verfügung gestellt. Aber ich brauche die Funktionalität für Properties

- ich weiß nicht genau wie ich die Verbindung meines Programms zum PlugIn aufbauen kann. Mein Programm stellt irgendwelche selektionen in abhängigkeit danach an, wo sich die Propertie-Datei im Workspace befindet. Anschließend gibt es ein zweidimensionales Objekt von Typ ArrayList zurück, in dem die Daten gespeichert sind. Das ist im Prinzip genau das selbe, aber bei mir werden einige Methoden nicht erkannt. Wie:  setText(string) oder der Konstruktor von TableColumn(Table, int, int)

```
Table table= new Table(parent, SWT.SINGLE |
SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER |
SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn c= new TableColumn(table, SWT.NONE,0);
c.setText(“Metric”); c.setWidth(150);
c= new TableColumn(table, SWT.NONE, 1);
c.setText(“Value”); c.setWidth(100);
c.setAlignment(SWT.RIGHT);
column = new TableColumn(table, SWT.NONE, 2);
column.setText(“Resource”); column.setWidth(300);
```

- außerdem sollten die Selektionen im meinem Programm abhängig von der Position im Workspace erfolgen. D.h. ich müsste die Position bekommen nachdem ein Benutzer mein Programm aktiviert hat von wo es im Workspace aufgerufen wird. 
Z.B. objektspektrum.plugin.plugInProperties.internationalStrings auf die Art. Um entsprechende Selektionen durchzuführen.

Mein Programm macht dabei nichts weiter als das es schaut ob und wieviele lokale Properties zu der angegeben existieren. Anschließend werden die Keys der Properties in der ersten Spalte und die Values angefangen vom default in die weiteren Spalten eingefügt.





```
package objektspektrum.plugin
public class MetricsResultView extends ViewPart {
private TableViewer fViewer;
// new method
public void setInput(ArrayList results) {
fViewer.setInput(results);
}
// overridden ViewPart.createPartControl
public void createPartControl(Composite parent) {
Table table= new Table(parent, SWT.SINGLE |
SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER |
SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn c= new TableColumn(table, SWT.NONE,0);
c.setText(“Metric”); c.setWidth(150);
c= new TableColumn(table, SWT.NONE, 1);
c.setText(“Value”); c.setWidth(100);
c.setAlignment(SWT.RIGHT);
column = new TableColumn(table, SWT.NONE, 2);
column.setText(“Resource”); column.setWidth(300);
fViewer= new TableViewer(table);
fViewer.setContentProvider(
new MetricsResultContentProvider());
fViewer.setLabelProvider(
new MetricsResultLabelProvider());
}
}
```


----------



## Thomas Darimont (4. Februar 2005)

Hallo!

Hab im moment keine Zeit mir das alles anzusehen.
Jedoch bezieht sich der von dir genannte Artikel auf die Pluginentwicklung unter Eclipse 2.X diese unterscheidet sich in einigen Punkten von der unter Eclipse 3.X ...
In der Eclipse Hilfe findest du einen Wunderbaren Leitfaden mit dem sich alles machen lässt.

Gruß Tom


----------

