Initialize
[sdk/ide/product.git] / org.eclipse.jst.pagedesigner / src / org / eclipse / jst / pagedesigner / properties / BaseCustomSection.java
1 /*******************************************************************************\r
2  * Copyright (c) 2006 Sybase, Inc. and others.\r
3  *\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     Sybase, Inc. - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.eclipse.jst.pagedesigner.properties;\r
13 \r
14 import org.eclipse.core.resources.IFile;\r
15 import org.eclipse.core.resources.IProject;\r
16 import org.eclipse.core.runtime.IStatus;\r
17 import org.eclipse.core.runtime.Status;\r
18 import org.eclipse.jface.action.IStatusLineManager;\r
19 import org.eclipse.jface.viewers.ISelection;\r
20 import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StatusUtil;\r
21 import org.eclipse.jst.pagedesigner.PDPlugin;\r
22 import org.eclipse.swt.widgets.Composite;\r
23 import org.eclipse.ui.IActionBars;\r
24 import org.eclipse.ui.IEditorInput;\r
25 import org.eclipse.ui.IFileEditorInput;\r
26 import org.eclipse.ui.IWorkbenchPart;\r
27 import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;\r
28 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;\r
29 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;\r
30 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;\r
31 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;\r
32 import org.w3c.dom.Node;\r
33 \r
34 /**\r
35  * @author mengbo\r
36  */\r
37 public abstract class BaseCustomSection extends AbstractPropertySection {\r
38 \r
39         /**\r
40          * Status that all is OK\r
41          */\r
42         protected static final Status OKSTATUS = new Status(IStatus.OK, PDPlugin\r
43                         .getPluginId(), 0, "", null); //$NON-NLS-1$\r
44 \r
45         private WPETabbedPropertySheetPage _propertySheetPage;\r
46 \r
47         private boolean _visible = false;\r
48 \r
49         /**\r
50          * the tag IDOMElement\r
51          */\r
52         protected IDOMElement _element;\r
53 \r
54         /**\r
55          * the INodeAdapter used to receive notifications of model updates\r
56          */\r
57         protected INodeAdapter _adapter = new INodeAdapter() {\r
58                 public boolean isAdapterForType(Object type) {\r
59                         return false;\r
60                 }\r
61 \r
62                 public void notifyChanged(INodeNotifier notifier, int eventType,\r
63                                 Object changedFeature, Object oldValue, Object newValue, int pos) {\r
64                         BaseCustomSection.this.notifyChanged(notifier, eventType,\r
65                                         changedFeature, oldValue, newValue, pos);\r
66                 }\r
67         };\r
68 \r
69         public void setInput(IWorkbenchPart part, ISelection selection) {\r
70                 super.setInput(part, selection);\r
71                 IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(\r
72                                 part, selection);\r
73                 if (_element != newEle) {\r
74                         if (_element != null) {\r
75                                 _element.removeAdapter(_adapter);\r
76                         }\r
77                         _element = newEle;\r
78                         if (_element != null) {\r
79                                 _element.addAdapter(_adapter);\r
80                         }\r
81                 }\r
82         }\r
83 \r
84         /**\r
85          * Method adapter will call when element has changed\r
86          * \r
87          * @param notifier\r
88          * @param eventType\r
89          * @param changedFeature\r
90          * @param oldValue\r
91          * @param newValue\r
92          * @param pos\r
93          */\r
94         protected abstract void notifyChanged(INodeNotifier notifier,\r
95                         int eventType, Object changedFeature, Object oldValue,\r
96                         Object newValue, int pos);\r
97 \r
98         public void createControls(Composite parent,\r
99                         TabbedPropertySheetPage aTabbedPropertySheetPage) {\r
100                 super.createControls(parent, aTabbedPropertySheetPage);\r
101                 _propertySheetPage = (WPETabbedPropertySheetPage) aTabbedPropertySheetPage;\r
102         }\r
103 \r
104         /**\r
105          * for certain action performed in the section, may result big change in the\r
106          * model. e.g: change tag name will result in editpart recreate. In this\r
107          * case, we need do a total refresh.\r
108          * \r
109          */\r
110         protected void refreshPropertySheetPage() {\r
111                 if (_propertySheetPage != null) {\r
112                         IWorkbenchPart part = getPart();\r
113                         if (part != null) {\r
114                                 ISelection sel = part.getSite().getSelectionProvider()\r
115                                                 .getSelection();\r
116                                 _propertySheetPage.selectionChanged(part, sel);\r
117                         } else {\r
118                                 // XXX: will else happen?\r
119                                 System.out.println("AbstractCustomSection --> What to do?"); //$NON-NLS-1$\r
120                         }\r
121                 }\r
122         }\r
123 \r
124         /**\r
125          * Change selection\r
126          * @param node\r
127          */\r
128         protected void gotoNode(Node node) {\r
129                 _propertySheetPage.internalChangeSelection(node, node);\r
130         }\r
131 \r
132         /**\r
133          * @return IStatusLineManager to use for the property sheet page\r
134          */\r
135         protected IStatusLineManager getStatusLineManager() {\r
136                 if (_propertySheetPage != null) {\r
137                         IActionBars bar = _propertySheetPage.getSite().getActionBars();\r
138                         if (bar != null) {\r
139                                 return bar.getStatusLineManager();\r
140                         }\r
141                 }\r
142                 return null;\r
143         }\r
144 \r
145         /**\r
146          * @param status to display on status line\r
147          */\r
148         protected void applyStatus(IStatus[] status) {\r
149                 if (!_visible) {\r
150                         return;\r
151                 }\r
152 \r
153                 IStatusLineManager statusLine = getStatusLineManager();\r
154                 if (statusLine == null) {\r
155                         return;\r
156                 }\r
157 \r
158                 IStatus s;\r
159                 if (status == null || status.length == 0) {\r
160                         s = null;\r
161                 } else {\r
162                         s = StatusUtil.getMostSevere(status);\r
163                 }\r
164 \r
165                 if (s == null || s.getSeverity() != IStatus.ERROR) {\r
166                         statusLine.setErrorMessage(null);\r
167                 } else {\r
168                         statusLine.setErrorMessage(s.getMessage());\r
169                 }\r
170         }\r
171 \r
172         /**\r
173          * @param message\r
174          */\r
175         protected void setErrorMessage(String message) {\r
176                 IStatusLineManager s = getStatusLineManager();\r
177                 if (s != null) {\r
178                         s.setErrorMessage(message);\r
179                 }\r
180         }\r
181 \r
182         /**\r
183          * @param message\r
184          * @return Status\r
185          */\r
186         protected Status createErrorStatus(String message) {\r
187                 return new Status(IStatus.ERROR, PDPlugin.getPluginId(), 0, message,\r
188                                 null);\r
189         }\r
190 \r
191         public void aboutToBeHidden() {\r
192                 applyStatus(null);\r
193                 _visible = false;\r
194 //              IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(\r
195 //                              part, selection);\r
196 //              if (_element != newEle) {\r
197                         if (_element != null) {\r
198                                 _element.removeAdapter(_adapter);\r
199                         }\r
200 //                      _element = newEle;\r
201 //                      if (_element != null) {\r
202 //                              _element.addAdapter(_adapter);\r
203 //                      }\r
204 //              }\r
205                 super.aboutToBeHidden();\r
206         }\r
207 \r
208         public void aboutToBeShown() {\r
209                 super.aboutToBeShown();\r
210 //              IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(\r
211 //                              part, selection);\r
212 //              if (_element != newEle) {\r
213 //                      if (_element != null) {\r
214 //                              _element.removeAdapter(_adapter);\r
215 //                      }\r
216 //                      _element = newEle;\r
217                         if (_element != null) {\r
218                                 _element.addAdapter(_adapter);\r
219                         }\r
220 //              }\r
221                 _visible = true;\r
222         }\r
223 \r
224         /**\r
225          * @return IProject for the WPE editing instance\r
226          */\r
227         protected IProject getProject() {\r
228                 if (_propertySheetPage != null) {\r
229                         IEditorInput input = _propertySheetPage.getEditor()\r
230                                         .getEditorInput();\r
231                         if (input instanceof IFileEditorInput) {\r
232                                 return ((IFileEditorInput) input).getFile().getProject();\r
233                         }\r
234                 }\r
235                 return null;\r
236         }\r
237 \r
238         public void dispose() {\r
239                 super.dispose();\r
240                 if (_element != null) {\r
241                         _element.removeAdapter(_adapter);\r
242                 }\r
243         }\r
244 \r
245         /**\r
246          * @return IFile for WPE editing instance\r
247          */\r
248         protected IFile getFile() {\r
249                 if (_propertySheetPage != null) {\r
250                         IEditorInput input = _propertySheetPage.getEditor()\r
251                                         .getEditorInput();\r
252                         if (input instanceof IFileEditorInput) {\r
253                                 return ((IFileEditorInput) input).getFile();\r
254                         }\r
255                 }\r
256                 return null;\r
257         }\r
258 }\r