Eclipse-PlugIn

minzel

Grünschnabel
Hallo,

beschäftige mich jetzt seit geraumer Zeit mit Eclipse-PlugIns und meine erste Aufgabe dazu besteht darin eine Notizblock als View zu Programmieren. Tue mich leider noch etwas schwer mit den neuen dingen. Java Kenntnisse sind vorhanden.
Kann aber leider noch nichts fernünftiges vorweisen. Und im I-Net auch noch kein gutes tutorial gefunden was daraus hinaus läuft.
Vieleicht kann mir hier jemanden einen schubs in die richtige Richtung geben :/

danke schon mal im voraus
minzel
 
wenn du ein plugin-projekt erstellst, dann kannst du z.b. das code skelett eines views erzeugen lassen. die methode, mit der du die SWT controls erstellt, heisst #createPartControl(). ein einfacher text-view sieht dann so aus:

Code:
public class SampleView extends ViewPart {

	private Text t;

	public void createPartControl(Composite parent) {
		t= new Text( parent, SWT.MULTI );
		t.setText( "hello, world!" );
	}

	public void setFocus() {
		t.setFocus();
	}
	
}

kann halt noch nicht speichern etc.

zur einführung würde ich eher zu einem buch greifen ... jedenfalls möchte ich "contributing to eclipse" von gamma/beck nicht mehr missen, auch wenns für 2.1 geschrieben ist.
 
hallo,

ich danke dir schon mal für die antwort. war in der zeit nicht ganz untätig und hab doch schon ein paar kleine schritte erreich können.
Habe einen View erstellt und hab sogar schon eine Toolbar installiert.

Meine größten Probleme besteht in der Speicherung und lesen in Tabellen-Teile.
Habe in der createPartControl-Methode folgendes eingefügt:

Code:
...

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("Notizen");	c.setWidth(200);
		c = new TableColumn(table, SWT.NONE,1);
		c.setText("Datum");		c.setWidth(80);
		
		fViewer = new TableViewer(table);
...

Die funktionsweise für das Erstellen einer Tabelle ist einleuchtend. Und habe ich auch soweit verstanden. Mittels ToolKits öffnet sich ein JFrame mit einem TextArea und einem Button womit ich ja dann den Text irgendwo mittels ActionListener hinspeichern könnte. Wie könnte ich es schaffen es jetzt in die Tabelle zu bekommen?

Außerdem wurde ein Punkt erwähnt das ich das Datenmodell in einer XML-Struktur verwalten soll. Da bin ich doch noch etwas überfordert.

dank schon mal wieder im voraus.

PS:
In Anlehnung der Aufgabe habe ich mich hier im Forum an einem Tutorial gehalten
http://www.sigs.de/publications/os/2004/01/weinand_OS_01_04.pdf
Sehe selbst aber ab Seite 4 nicht mehr durch.
 
Zuletzt bearbeitet:
du brauchst eine Instanz der klasse IStructuredContentProvider. die setzt du dann mittels fViewer.setContentProvider(). ich habs leider grad net hinbekommen, mir fliegt eine unverständliche NullPointerException um die ohren.

XML ist baum-strukturiert, vielleicht ist ein TreeViewer passender?

JFrame? what? verwechselst du grade SWT mit Swing?
 
TreeViewer?

Wegen dem JFrame, also habe beim klicken auf ein ToolTip jetzt ein öffnendes JFrame. Ich weiß gar nicht ob man das bei der PlugIn-Entwicklung nehmen darf. Funktionieren tut es jedenfalls.

IStructuredContentProvider sagt mir jetzt gar nichts, bzw. wüßt ich auch nicht wie ich da anfangen soll. werde aber nacher daran weiter arbeiten ... :S
Irgendwie ganz schön kompliziert alles.
 
Hier mal ein Stand meines Entwurfs:

ViewPart.java
Code:
package notizblock;



import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

public class ViewPart extends org.eclipse.ui.part.ViewPart {

	private TableViewer fViewer;
	private Action action1;			// Einfügen
	private Action action2;			// Ändern
	
	private void fillLocalToolBar(IToolBarManager manager) {
		manager.add(action1);
		manager.add(action2);
	}
	
	private void contributeToActionBars() {
		IActionBars bars = getViewSite().getActionBars();
		fillLocalToolBar(bars.getToolBarManager());
	}
	
	private void makeActions() {
		action1 = new Action() {
			public void run() {
				showInsertDialog();
			}
		};
		action1.setText("Action 1");
		action1.setToolTipText("Action 1 tooltip");
		action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
			getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
		
		action2 = new Action() {
			public void run() {
				showInsertDialog();
			}
		};
		action2.setText("Action 2");
		action2.setToolTipText("Action 2 tooltip");
		action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
				getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
	}
	
	private void showInsertDialog () {
		
		Notiz n = new Notiz("nachricht","27.09.2005");
		n.getNotiz();
	}
	
	public ViewPart() {
		super();
		// TODO Auto-generated constructor stub
	}

	public void createPartControl(Composite parent) {
		
		makeActions();
		contributeToActionBars();
		
		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("Notizen");	c.setWidth(200);
		c = new TableColumn(table, SWT.NONE,1);
		c.setText("Datum");		c.setWidth(80);
		
		fViewer = new TableViewer(table);

		// fViewer.setContentProvider( );
		
	}
	
	
	
	public void setInput ( Object[] result ) {
		
		
	}
	
	

	public void setFocus() {
		// TODO Auto-generated method stub
	}
}

Notiz.java
Code:
package notizblock;

import java.io.Serializable;

public class Notiz implements Serializable {

	String notiz;
    String datum;
    Notiz next;
    
    Notiz () {
    }
    
    Notiz ( String notiz , String datum ) {
    	this.notiz = notiz;
    	this.datum = datum;
    }
    
    public void getNotiz() {
    	System.out.println(this.notiz + " " + this.datum);
    }
}

An der Stelle:
=> Notiz n = new Notiz("notiznotiznotiznotiz","27.09.2005");
=> n.getNotiz();
sollte diese notiz, in die tabelle eingetragen werden. Aber da komm ich momentan nicht weiter. Und nicht wundern, es sieht alles etwas störich aus, aber versuch erstmal das grundlegende hinzubekommen.

vieleicht weißt ja noch jemand rat.
 
Versuch mal hier mit:

Code:
          private void showInsertDialog () {
          
           Notiz n = new Notiz("nachricht","27.09.2005")
           n.printNotiz();

           TableItem item1 = new TableItem(table, SWT.NONE);
            item2.setText(0, n.getNotiz());

           TableItem item2 = new TableItem(table, SWT.NONE);
            item2.setText(1, n.getDatum());
	}

Die entsprechenden Methoden in Notiz:
Code:
   public class Notiz implements Serializable {

    String notiz;
    String datum;
    Notiz next;
    
    Notiz () {
    }
    
    Notiz ( String notiz , String datum ) {
    	this.notiz = notiz;
    	this.datum = datum;
    }
    
    public void printNotiz() {
    	System.out.println(this.notiz + " " + this.datum);
    }

   public String getNotiz() {
     return notiz;
   }

   public String getDatum() {
     return datum;
   }
}
 
dank dir, habe auch schon überlegt es dann so zu implementieren aber irgendwie bekomme ich es einfach nicht hin.

Ich habe den View :: Ein aufrufendes SWT :: und die Notiz-Klasse

Wenn ich ich das SWT aufrufe und mittels Listener das Objekt(Notiz und Datum) an die View-Klasse weiter geben will geht das nicht?! Auch der Umweg über die KlasseNotiz geht nicht.Bekomme entweder den fehler null oder den Fehler:

Code:
Unhandled event loop exception
Reason:
java.lang.NullPointerException

Das Objekt in der ViewKlasse überschreiben hab auch keinen erfolg.
Beim Aufruf der Getter-Methoden gibt es auch fehler. (Rückgabewert)

:eek:
 
Zuletzt bearbeitet:
also ich hab nu das puzzle gelöst :)

du brauchst einen content provider. der liefert die objekte für einzelne zeilen. völlig unverständlicherweise macht dann der label provider die aufspaltung in die einzelnen spalten.

Code:
public class SampleView extends ViewPart {
	private TableViewer fViewer;

	private static final Notiz[] CONTENT = new Notiz[] {
			new Notiz("erste notiz", "datum1"),
			new Notiz("zweite notiz", "datum2"),
			new Notiz("dritte notiz", "datum3"), };

	public void createPartControl(Composite parent) {
		fViewer = new TableViewer(parent);
		Table t = fViewer.getTable();
		t.setLinesVisible(true);
		t.setHeaderVisible(true);

		TableLayout layout = new TableLayout();
		for (int i = 1; i <= 2; i++)
			layout.addColumnData(new ColumnWeightData(100 / 2, true));
		t.setLayout(layout);

		TableColumn col = new TableColumn(t, SWT.CENTER);
		col.setText("notiz");
		col = new TableColumn(t, SWT.CENTER);
		col.setText("datum");

		fViewer.setContentProvider(new IStructuredContentProvider() {
			public Object[] getElements(Object inputElement) {
				return (Notiz[]) inputElement;
			}
			public void dispose() {	}
			public void inputChanged(Viewer viewer, Object oldInput,
					Object newInput) { }
		});
		fViewer.setLabelProvider( new ITableLabelProvider() {
			public Image getColumnImage(Object element, int columnIndex) {
				return null;
			}
			public String getColumnText(Object element, int columnIndex) {
				Notiz n = (Notiz) element;
				switch( columnIndex ) {
				case 0: return n.getNotiz();
				case 1: return n.getDatum();
				}
				return "invalid column index given " + columnIndex;
			}
			public void addListener(ILabelProviderListener listener) {	}
			public void dispose() {	}
			public boolean isLabelProperty(Object element, String property) {
				return false;
			}
			public void removeListener(ILabelProviderListener listener) {	}
		});
		fViewer.setInput(CONTENT);
	}

	public void setFocus() {
		fViewer.getTable().setFocus();
	}

}
 
Super, also echt, dank euch und doch einiger nicht endenwollenden stunden wo ich mir wie sonst was den kopf zerbrochen habe, hab ich es nun faßt geschafft.
Vor allem geschnallt wie man so ein plugin aufbaut, wobei ich immer noch ganz am anfang stehe.

Eine Frage steht aber noch im Raum. Wie kann ich den Inhalt jetzt, in dem TableViewer / Table speichern? Also so das beim neustart von Eclipse diese Daten da auch wieder erscheinen. Momentan sieht es so aus das nur zur einer Laufzeit die Notizen in der Tabelle erhalten bleiben.

Hoffe da kann mir noch kemand helfen :D
Und danke nochmal an alle!!
 
Zurück