ISelectionProvider und eigene Selections

Status
Nicht offen für weitere Antworten.

Clip

Bekanntes Mitglied
Hallo,

ich habe eine RCP Applikation.
In dieser benutze ich einen eigenen Editor. In diesem Editor stelle ich in einer 10 x 10 Matrix 100 Composites dar. Jedes Composite hat ein Label mit einem Bild. Zudem repäsentiert jedes Composite ein Object aus meinem Model.
Dafür habe ich eine Klasse geschriben, die Composite erbt. Als Interface habe ich ISelectionProvider angegeben. Bei einem Mausklick auf ein Bild führe ich folgendes aus:
Code:
public void mouseDown(MouseEvent e) {
  selection = new StructuredSelection(sample);
  setSelection(selection);
}
Ein sample Object wird hier der Auswahl übergeben.

In setSelection wird
Code:
firePostSelectionChanged(new SelectionChangedEvent(this, selection));
ausgeführt.

Hier die Klasse.
Code:
	protected void firePostSelectionChanged(final SelectionChangedEvent event) {
		Object[] listeners = postSelectionChangedListeners.getListeners();
		for (int i = 0; i < listeners.length; ++i) {
			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
			SafeRunnable.run(new SafeRunnable() {
				public void run() {
					l.selectionChanged(event);
				}
			});
		}
	}

In meinem Editor hate ich einen Listener angemeldet :
Code:
entry.addPostSelectionChangedListener(new ISelectionChangedListener(){
  public void selectionChanged(SelectionChangedEvent event) {
    // ???						
  }					
});

entry ist dabei ein Composite. Es gibt also genau 100 listener, für jedes Composite einen.

Soweit funktioniert auch alles. Im Event wird als selection das sample Objekt mitgeliefert.

Jetzt ist es ja so, dass z.B. bei einem TableViewer mittels der Methode
Code:
getSite().setSelectionProvider(tableViewer);
der Viewer zu einem Auswahlbereitsteler wird.
Eclipse kann dann , z.B. in seinen Actions global auf solch ein Event zugreifen und Aktionen ausführen.

Klicke ich beispielsweise in einem TableViewer einen Eintrag an, der ebenfalls ein sample Objekt repräsentiert, so wird die SampleAction durch diesen Code in der Sample Action sichtbar.:
Code:
public void selectionChanged(IWorkbenchPart part, ISelection incoming) {
	if (incoming instanceof IStructuredSelection) {
		selection = (IStructuredSelection) incoming;
		setEnabled(selection.getFirstElement() instanceof Sample);
	} else {
		setEnabled(false);
	}
}

Wobei die Aktion in der Toolbar "liegt" und in ApplicationActionBarAdvisor deklariert wurde.

ZUrück zu meinen 100 Composites :)
Bei einem Mausklick auf ein Bild, werden zwar alle Events geworfen und abgehört, inklusieve werde die richtigen Objekte in den events verschickt. Nur leider wird die selectionChanged() Methode der Action nicht angesprungen.
Ich vermute, dass man Eclipse irgentwie mitteilen muss, dass eine Auswahl getroffen wurde. Nur wie?
Code:
getSite().setSelectionProvider(entry);
zur Erstellung eines Compoiste entry führt leider zu Fehlern.

weiß das jemend was ich machen muss?

Danke & Gruß

Ps: sorry für den Roman :)
 

Clip

Bekanntes Mitglied
Hallo,

ich habe es inzwischen herausbekommen.
Erstmal, der Schlüssel ist folgender Artikel.

Lösung:
1. Das Composite (VisualSample) welches als SelectionProvider dienen soll muss meinen RackEditor sagen können, dass es ausgewählt wurde. Dazu hab eich zunächste ein IVisualSampleListener geschrieben:
Code:
public interface IVisualSampleListener {
	public void visualSampleSelected(VisualSample visualSample);
}

2. In meinem VisualSample gibt es nur ein Label mit einem Bild. Durch einen Mausklick soll das Objekt welches repräsentiert wird ausgewählt werden. Daher muss ein Mauslistener auf das Label definiert werden:
Code:
	private class VisualSampleMouseListener implements MouseListener{		
		public void mouseDoubleClick(MouseEvent e) {
		}

		public void mouseDown(MouseEvent e) {
			fireVisualSampleSelected(VisualSample.this);
		}

		public void mouseUp(MouseEvent e) {			
		}	
	}
Dieser muss natürlich auch zugewiesen werden:
Code:
label.addMouseListener(new VisualSampleMouseListener());

3. Im Rack Editor muss die Schnittstelle ISelectionProvider eingebunden werden.
Die durch das Interface vorgeschriebenen Methoden sehen in meinem Fall so aus:
Code:
	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		selectionChangedListeners.add(listener);		
	}

	public ISelection getSelection() {
		return selection;
	}

	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
		selectionChangedListeners.remove(listener);
	}

	public void setSelection(ISelection selection) {
		fireSelectionChanged(new SelectionChangedEvent(this, selection));			
	}

selectionChangedListeners wurde als private Instanz der Klasse deklariert:
Code:
private ListenerList selectionChangedListeners = new ListenerList();

selection wurde als private Instanz der Klasse deklariert:
Code:
private StructuredSelection selection = new StructuredSelection(new Object[0]);
Dies muss mit new Object[0] erfolgen. Geschieht dies nicht, kann es fürchterliche Fehler geben da in getSelection() eben dieses selection Objekt zurückgegeben wird. Dies passiert u.a. schon direkt nach der Erzeugung des Editors...

Dann müssen noch alle Listeners benachrichtigt werden. Dies erfolgt durch die Methode fireSelectionChanged.
Code:
	protected void fireSelectionChanged(final SelectionChangedEvent event) {		
		Object[] listeners = selectionChangedListeners.getListeners();
		for (int i = 0; i < listeners.length; ++i) {
			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
			SafeRunnable.run(new SafeRunnable() {
				public void run() {
					l.selectionChanged(event);
				}
			});
		}
	}

Bleibt noch den Editor als SelectionProvider im System anzumelden. Dies geschieht in der Methode createPartControl
Code:
getSite().setSelectionProvider(this);


4. Im RackEditor in dem die VisualSamples ja dargestellt werden, muss der IVisualSampleListener eingebunden werden:
Code:
				VisualSample entry = new VisualSample(composite,sample, this, i, j,SWT.NONE );	
				entry.addVisualSampleListener(new IVisualSampleListener(){
					public void visualSampleSelected(VisualSample visualSample) {		
						Sample sample = visualSample.getSample();
						if (sample != null)
							selection = new StructuredSelection(sample);
						else
							selection = new StructuredSelection(new Object[0]);
						setSelection(selection);						
					}					
				});
"entry " ist dabei ein Composite (das ganze liegt bei mir in einer Schleife, das ist aber hier egal...).


5.
Die eigene Selection ist somit fertig. Z.B. kann in einer entsprechenden SampleAction darauf eingegangen werden:
Code:
public class SampleAction extends Action implements ISelectionListener{

	private final IWorkbenchWindow window;

	public final static String ID = "sample";
	
	private IStructuredSelection selection;	

	
	public SampleAction(IWorkbenchWindow window) {
		this.window = window;
		setId(ID);
		setActionDefinitionId(ID);
		setText("&Edit Sample");
		setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(Application.PLUGIN_ID, IImageKeys.SAMPLE));
		window.getSelectionService().addSelectionListener(this);
	}

	
	// Hier wird die Selection verarbeitet! Ist sie vom Typ Sample wird die Aktion aktiviert.

	public void selectionChanged(IWorkbenchPart part, ISelection incoming) {
		if (incoming instanceof IStructuredSelection) {
			selection = (IStructuredSelection) incoming;
			setEnabled(selection.getFirstElement() instanceof Sample);
		} else {
			setEnabled(false);
		}
	}
	
	public void run() {
		Object[] items = selection.toArray();
		Sample[] samples = new Sample[items.length];
		for (int i = 0; i < items.length; i++){
			samples[i] = (Sample)items[i];
		}
		SampleDialog sampleDialog = new SampleDialog(window.getShell(), samples);;
		int code = sampleDialog.open();
		if (code == Window.OK){			
		}	
	}	
}

Das hat jetzt verdammt viel Zeit gekostet..... Obwohls im Nachhinein betrachtet alles so logisch und einfach aussieht... :autsch:
 

Wildcard

Top Contributor
Clip hat gesagt.:
Das hat jetzt verdammt viel Zeit gekostet..... Obwohls im Nachhinein betrachtet alles so logisch und einfach aussieht... :autsch:
Das ist leider immer so bei der Eclipse API :?
Aber schön das du die Lösung so ausführlich gepostet hast, jetzt haben auch noch andere was davon :toll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben