I have Eclipse RCP application. My own IntroPart
extends org.eclipse.ui.part.IntroPart
.
Through inheritance I got this method:
@Override
public void saveState(IMemento memento) {
}
Here it is stated that when the workbench is shut down, the method saveState
is called on all open views. But this is true only if I close my whole application.
What should I do, to save the intro page state before if I close only this page, not the hole application?
Your link to the FAQ answers that:
Another mechanism for persisting view state is the JFace IDialogSettings facility. The advantage of dialog settings over the view save/init mechanism is that you can control when settings are persisted.
This is an example on how to use IDialogSettings to persist the state of an IntroPart when it is closed and how to restore it when it is created. MyIntroPart is an IntroPart that has a Text
widget. The displayed text is saved when the IntroPart is closed and restored when it is created.
To get the partClosed
event, MyIntroPart implements IPartListener2 and registers itself with the PartService.
private static final String MY_INTRO_SETTINGS = "my_intro_settings";
private static final String MY_INTRO_TEXT_KEY = "my_intro_text";
@Override
public void createPartControl(Composite parent) {
this.text = new Text(parent, SWT.BORDER);
// try to load the settings
IDialogSettings settings = Activator.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(MyIntroPart.MY_INTRO_SETTINGS);
if (section != null) {
// set the restored text string in the text widget
this.text.setText(section.get(MyIntroPart.MY_INTRO_TEXT_KEY));
}
// register the part listener
getIntroSite().getWorkbenchWindow().getPartService().addPartListener(this);
}
This will restore the text to the text widget.
MyIntroPart implements partClosed
of IPartListener2 to save dialog settings when the view is closed:
@Override
public void partClosed(IWorkbenchPartReference partRef) {
// remove part listener from part service
getIntroSite().getWorkbenchWindow().getPartService().removePartListener(this);
IDialogSettings settings = Activator.getDefault().getDialogSettings();
// get the section of the text
IDialogSettings section = settings.getSection(MyIntroPart.MY_INTRO_SETTINGS);
// if it doesn't exist, create it
if (section == null) {
section = settings.addNewSection(MyIntroPart.MY_INTRO_SETTINGS);
}
// put text from text field in section
section.put(MyIntroPart.MY_INTRO_TEXT_KEY, this.text.getText());
}
Thanks to fredrik for pointing out that no loading from or saving to a file is required here.