# speichern funktion aktivieren



## Spot84 (26. Mai 2009)

Hallo!
Hab schon wieder ein neues Problem.. 
ich habe eine Eclipse RCP-Applikation geschrieben die 2 UML-Diagramme einliest und diese miteinander vergleicht.
Die Modelle können mit hilfe eines Editors auch miteinander gemischt werden. 
Umgesetzt habe ich es so das ich einen neuen  command erstelle, der einen FileDialog aufruft um die 2 Modelldateien einzulesen. Wenn die Dateien dann eingelesen wurden, rufe ich den Verglieichseditor über die folgenden Zeilen auf:

```
ModelCompareEditorInput input = new ModelCompareEditorInput(
					snapshot);
CompareUI.openCompareEditor(input);
```

Der Filedialog und der aufruf des Vergleichseditors sind beide in ein und der selben Klasse die von AbstractHandler erbt. 

Mein Problem ist jetzt das ich die Modelle die gemischt werden können, auch gerne abspeichern möchte. 
Ich hab dafür gelesen das meine View das Interface ISaveablePart implementieren muss, damit die save-action merkt, wenn etwas geändert wurde. Nur wie mach ich das in meinem Fall? Ich hab nicht einmal eine View definiert, da ich den Vergleichseditor einfach über die Klasse aufrufe. 

Hat da villeicht einer eine Idee?


----------



## Spot84 (31. Mai 2009)

Kann mir denn villeicht wer sagen wie ich allgemein ein Plugin was einen Editor enthält dazu bringe es mit der Speicheraktion zu verknüpfen? Oder ist es möglich die Speicherfunktion für eine gerade aktive IWorkbenchpage zu aktivieren?

Die Api für den Comparisoneditor hab ich unter 

http://help.eclipse.org/help32/inde...erence/api/org/eclipse/compare/CompareUI.html 

gefunden, und hier gibt es die Methode openCompareEditorOnPage(CompareEditorInput input, IWorkbenchPage page).

Möglich sein muss das ganze ja da das EmfComparePlugin ebenfalls diesen Editor nutzt und Modelle speichern kann.
Hab jetzt auch schon in der EclipseRCP-Newsgroups nachgefragt, aber da konnte mir auch niemand helfen..


----------



## Wildcard (31. Mai 2009)

Warum erweiterst du den EMF Compare Editor nicht? Der Editor ist eigentlich selbst dafür zuständig solche global actions zu verarbeiten.


----------



## Spot84 (1. Jun 2009)

Hallo Wildcard!
ja, ich wolte auch schon probieren den Editor anzupassen. Allerdings wusste ich nicht genau wie ich das machen solte. Die Methode CompareUI.openCompareEditor(input); ruft die gleichnamige Methode in der Klasse CompareUIPlugin.class auf:

```
/**
	 * Performs the comparison described by the given input and opens a
	 * compare editor on the result.
	 *
	 * @param input the input on which to open the compare editor
	 * @param page the workbench page on which to create a new compare editor
	 * @param editor if not null the input is opened in this editor
	 * @see CompareEditorInput
	 */
	public void openCompareEditor(final CompareEditorInput input, 
final IWorkbenchPage page, final IReusableEditor editor) {
		CompareConfiguration configuration = input.getCompareConfiguration();
		if (configuration != null) {
			IPreferenceStore ps= configuration.getPreferenceStore();
			if (ps != null)
				configuration.setProperty(
						CompareConfiguration.USE_OUTLINE_VIEW, 
						Boolean.valueOf(
ps.getBoolean(ComparePreferencePage.USE_OUTLINE_VIEW)));
		}
		if (input.canRunAsJob()) {
			openEditorInBackground(input, page, editor);
		} else {
			if (compareResultOK(input, null)) {
				internalOpenEditor(input, page, editor);
			}
		}
	}
```

diese wiederum enthält die 2 privaten Methoden openEditorInBackground und internalOpenEditor die so aussehen:

```
private void openEditorInBackground(final CompareEditorInput input,
			final IWorkbenchPage page, final IReusableEditor editor) {
		internalOpenEditor(input, page, editor);
	}

	private void internalOpenEditor(final CompareEditorInput input,
			final IWorkbenchPage wp, final IReusableEditor editor) {
		Runnable runnable = new Runnable() {
			public void run() {
				if (editor != null && !editor.getSite().getShell().isDisposed()) {// reuse the given editor
					editor.setInput(input);
					return;
				}
				
				IWorkbenchPage page = wp;
				if (page == null)
					page= getActivePage();
				if (page != null) {
					// open new CompareEditor on page
					try {
						page.openEditor(input, COMPARE_EDITOR);
					} catch (PartInitException e) {
MessageDialog.openError(getShell(), Utilities.getString("CompareUIPlugin.openEditorError"), e.getMessage()); 
					}		
				} else {
					MessageDialog.openError(getShell(),
							Utilities.getString("CompareUIPlugin.openEditorError"), 
							Utilities.getString("CompareUIPlugin.noActiveWorkbenchPage")); 
				}
			}
		};
		syncExec(runnable);
	}
```

das hat mich allerdings nicht weitergebracht, da ich in den Funktionen nicht sehe wie ich sie anpassen könnte.Was ich im Netz gefunden hab um die Speicherfunktion in RCP-Applikationen zu aktivieren, ist immer nur das die eigene View ISaveablePart implementieren soll.


----------

