View Javadoc
1   package org.argeo.cms.ui.eclipse.forms.editor;
2   
3   import org.argeo.cms.ui.eclipse.forms.FormToolkit;
4   import org.eclipse.core.runtime.ListenerList;
5   import org.eclipse.jface.dialogs.IPageChangeProvider;
6   import org.eclipse.jface.dialogs.IPageChangedListener;
7   import org.eclipse.jface.dialogs.PageChangedEvent;
8   import org.eclipse.jface.util.SafeRunnable;
9   
10  /**
11   * This class forms a base of multi-page form editors that typically use one or
12   * more pages with forms and one page for raw source of the editor input.
13   * <p>
14   * Pages are added 'lazily' i.e. adding a page reserves a tab for it but does
15   * not cause the page control to be created. Page control is created when an
16   * attempt is made to select the page in question. This allows editors with
17   * several tabs and complex pages to open quickly.
18   * <p>
19   * Subclasses should extend this class and implement <code>addPages</code>
20   * method. One of the two <code>addPage</code> methods should be called to
21   * contribute pages to the editor. One adds complete (standalone) editors as
22   * nested tabs. These editors will be created right away and will be hooked so
23   * that key bindings, selection service etc. is compatible with the one for the
24   * standalone case. The other method adds classes that implement
25   * <code>IFormPage</code> interface. These pages will be created lazily and
26   * they will share the common key binding and selection service. Since 3.1,
27   * FormEditor is a page change provider. It allows listeners to attach to it and
28   * get notified when pages are changed. This new API in JFace allows dynamic
29   * help to update on page changes.
30   * 
31   * @since 1.0
32   */
33  // RAP [if] As RAP is still using workbench 3.4, the implementation of
34  // IPageChangeProvider is missing from MultiPageEditorPart. Remove this code
35  // with the adoption of workbench > 3.5
36  //public abstract class FormEditor extends MultiPageEditorPart  {
37  public abstract class FormEditor  implements
38          IPageChangeProvider {
39  	private FormToolkit formToolkit;
40  	
41  	
42  public FormToolkit getToolkit() {
43  		return formToolkit;
44  	}
45  
46  public void editorDirtyStateChanged() {
47  	
48  }
49  
50  public FormPage getActivePageInstance() {
51  	return null;
52  }
53  
54  	// RAP [if] As RAP is still using workbench 3.4, the implementation of
55  // IPageChangeProvider is missing from MultiPageEditorPart. Remove this code
56  // with the adoption of workbench > 3.5
57  	private ListenerList pageListeners = new ListenerList();
58  	
59      /*
60       * (non-Javadoc)
61       * 
62       * @see org.eclipse.jface.dialogs.IPageChangeProvider#addPageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener)
63       */
64      public void addPageChangedListener(IPageChangedListener listener) {
65          pageListeners.add(listener);
66      }
67  
68      /*
69       * (non-Javadoc)
70       * 
71       * @see org.eclipse.jface.dialogs.IPageChangeProvider#removePageChangedListener(org.eclipse.jface.dialogs.IPageChangedListener)
72       */
73      public void removePageChangedListener(IPageChangedListener listener) {
74          pageListeners.remove(listener);
75      }
76      
77  	private void firePageChanged(final PageChangedEvent event) {
78          Object[] listeners = pageListeners.getListeners();
79          for (int i = 0; i < listeners.length; ++i) {
80              final IPageChangedListener l = (IPageChangedListener) listeners[i];
81              SafeRunnable.run(new SafeRunnable() {
82                  public void run() {
83                      l.pageChanged(event);
84                  }
85              });
86          }
87      }
88  // RAPEND [if]
89  }