package org.argeo.cms.ui.eclipse.forms.editor; import org.argeo.cms.ui.eclipse.forms.FormToolkit; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.dialogs.IPageChangeProvider; import org.eclipse.jface.dialogs.IPageChangedListener; import org.eclipse.jface.dialogs.PageChangedEvent; import org.eclipse.jface.util.SafeRunnable; /** * This class forms a base of multi-page form editors that typically use one or * more pages with forms and one page for raw source of the editor input. *

* Pages are added 'lazily' i.e. adding a page reserves a tab for it but does * not cause the page control to be created. Page control is created when an * attempt is made to select the page in question. This allows editors with * several tabs and complex pages to open quickly. *

* Subclasses should extend this class and implement addPages * method. One of the two addPage methods should be called to * contribute pages to the editor. One adds complete (standalone) editors as * nested tabs. These editors will be created right away and will be hooked so * that key bindings, selection service etc. is compatible with the one for the * standalone case. The other method adds classes that implement * IFormPage interface. These pages will be created lazily and * they will share the common key binding and selection service. Since 3.1, * FormEditor is a page change provider. It allows listeners to attach to it and * get notified when pages are changed. This new API in JFace allows dynamic * help to update on page changes. * * @since 1.0 */ // RAP [if] As RAP is still using workbench 3.4, the implementation of // IPageChangeProvider is missing from MultiPageEditorPart. Remove this code // with the adoption of workbench > 3.5 //public abstract class FormEditor extends MultiPageEditorPart { public abstract class FormEditor implements IPageChangeProvider { private FormToolkit formToolkit; public FormToolkit getToolkit() { return formToolkit; } public void editorDirtyStateChanged() { } public FormPage getActivePageInstance() { return null; } // RAP [if] As RAP is still using workbench 3.4, the implementation of // IPageChangeProvider is missing from MultiPageEditorPart. Remove this code // with the adoption of workbench > 3.5 private ListenerList pageListeners = new ListenerList(); /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.IPageChangeProvider#addPageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener) */ public void addPageChangedListener(IPageChangedListener listener) { pageListeners.add(listener); } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.IPageChangeProvider#removePageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener) */ public void removePageChangedListener(IPageChangedListener listener) { pageListeners.remove(listener); } private void firePageChanged(final PageChangedEvent event) { Object[] listeners = pageListeners.getListeners(); for (int i = 0; i < listeners.length; ++i) { final IPageChangedListener l = (IPageChangedListener) listeners[i]; SafeRunnable.run(new SafeRunnable() { public void run() { l.pageChanged(event); } }); } } // RAPEND [if] }