|
Lines 22-34
Link Here
|
| 22 |
import org.eclipse.jface.resource.ResourceManager; |
22 |
import org.eclipse.jface.resource.ResourceManager; |
| 23 |
import org.eclipse.jface.util.Util; |
23 |
import org.eclipse.jface.util.Util; |
| 24 |
import org.eclipse.jface.viewers.ArrayContentProvider; |
24 |
import org.eclipse.jface.viewers.ArrayContentProvider; |
|
|
25 |
import org.eclipse.jface.viewers.IOpenListener; |
| 25 |
import org.eclipse.jface.viewers.LabelProvider; |
26 |
import org.eclipse.jface.viewers.LabelProvider; |
|
|
27 |
import org.eclipse.jface.viewers.OpenEvent; |
| 26 |
import org.eclipse.jface.viewers.TableViewer; |
28 |
import org.eclipse.jface.viewers.TableViewer; |
| 27 |
import org.eclipse.osgi.util.TextProcessor; |
29 |
import org.eclipse.osgi.util.TextProcessor; |
| 28 |
import org.eclipse.swt.SWT; |
30 |
import org.eclipse.swt.SWT; |
| 29 |
import org.eclipse.swt.graphics.Cursor; |
31 |
import org.eclipse.swt.graphics.Cursor; |
| 30 |
import org.eclipse.swt.graphics.Font; |
|
|
| 31 |
import org.eclipse.swt.graphics.Image; |
32 |
import org.eclipse.swt.graphics.Image; |
|
|
33 |
import org.eclipse.swt.layout.FillLayout; |
| 32 |
import org.eclipse.swt.layout.GridData; |
34 |
import org.eclipse.swt.layout.GridData; |
| 33 |
import org.eclipse.swt.layout.GridLayout; |
35 |
import org.eclipse.swt.layout.GridLayout; |
| 34 |
import org.eclipse.swt.widgets.Button; |
36 |
import org.eclipse.swt.widgets.Button; |
|
Lines 39-44
Link Here
|
| 39 |
import org.eclipse.swt.widgets.Label; |
41 |
import org.eclipse.swt.widgets.Label; |
| 40 |
import org.eclipse.swt.widgets.Listener; |
42 |
import org.eclipse.swt.widgets.Listener; |
| 41 |
import org.eclipse.swt.widgets.Shell; |
43 |
import org.eclipse.swt.widgets.Shell; |
|
|
44 |
import org.eclipse.swt.widgets.TabFolder; |
| 45 |
import org.eclipse.swt.widgets.TabItem; |
| 42 |
import org.eclipse.swt.widgets.Table; |
46 |
import org.eclipse.swt.widgets.Table; |
| 43 |
import org.eclipse.swt.widgets.TableItem; |
47 |
import org.eclipse.swt.widgets.TableItem; |
| 44 |
import org.eclipse.ui.IEditorDescriptor; |
48 |
import org.eclipse.ui.IEditorDescriptor; |
|
Lines 60-72
Link Here
|
| 60 |
public final class EditorSelectionDialog extends Dialog { |
64 |
public final class EditorSelectionDialog extends Dialog { |
| 61 |
private EditorDescriptor selectedEditor; |
65 |
private EditorDescriptor selectedEditor; |
| 62 |
|
66 |
|
| 63 |
private Button externalButton; |
67 |
/** |
|
|
68 |
* The tab folder that holds the tabs for the listing of internal and |
| 69 |
* external editors. |
| 70 |
*/ |
| 71 |
private TabFolder editorsFolder; |
| 64 |
|
72 |
|
| 65 |
private Table editorTable; |
73 |
/** |
|
|
74 |
* The table that renders the list of internal editors to the user. |
| 75 |
*/ |
| 76 |
private Table internalEditorsTable; |
| 66 |
|
77 |
|
| 67 |
private Button browseExternalEditorsButton; |
78 |
/** |
|
|
79 |
* The table that renders the list of external editors to the user. |
| 80 |
*/ |
| 81 |
private Table externalEditorsTable; |
| 68 |
|
82 |
|
| 69 |
private Button internalButton; |
83 |
/** |
|
|
84 |
* The button for browsing to an external application for opening a file. |
| 85 |
*/ |
| 86 |
private Button browseExternalEditorsButton; |
| 70 |
|
87 |
|
| 71 |
private Button okButton; |
88 |
private Button okButton; |
| 72 |
|
89 |
|
|
Lines 85-91
Link Here
|
| 85 |
|
102 |
|
| 86 |
private ResourceManager resourceManager; |
103 |
private ResourceManager resourceManager; |
| 87 |
|
104 |
|
| 88 |
private TableViewer editorTableViewer; |
105 |
private TableViewer internalEditorsTableViewer; |
|
|
106 |
|
| 107 |
private TableViewer externalEditorsTableViewer; |
| 108 |
|
| 109 |
private LabelProvider labelProvider; |
| 89 |
|
110 |
|
| 90 |
private static final String[] Executable_Filters; |
111 |
private static final String[] Executable_Filters; |
| 91 |
|
112 |
|
|
Lines 113-123
Link Here
|
| 113 |
/** |
134 |
/** |
| 114 |
* This method is called if a button has been pressed. |
135 |
* This method is called if a button has been pressed. |
| 115 |
*/ |
136 |
*/ |
| 116 |
protected void buttonPressed(int buttonId) { |
137 |
protected void okPressed() { |
| 117 |
if (buttonId == IDialogConstants.OK_ID) { |
138 |
saveWidgetValues(); |
| 118 |
saveWidgetValues(); |
139 |
super.okPressed(); |
| 119 |
} |
|
|
| 120 |
super.buttonPressed(buttonId); |
| 121 |
} |
140 |
} |
| 122 |
|
141 |
|
| 123 |
/** |
142 |
/** |
|
Lines 151-199
Link Here
|
| 151 |
* @return the dialog area control |
170 |
* @return the dialog area control |
| 152 |
*/ |
171 |
*/ |
| 153 |
protected Control createDialogArea(Composite parent) { |
172 |
protected Control createDialogArea(Composite parent) { |
| 154 |
Font font = parent.getFont(); |
|
|
| 155 |
// create main group |
173 |
// create main group |
| 156 |
Composite contents = (Composite) super.createDialogArea(parent); |
174 |
Composite contents = (Composite) super.createDialogArea(parent); |
| 157 |
((GridLayout) contents.getLayout()).numColumns = 2; |
|
|
| 158 |
|
175 |
|
| 159 |
// begin the layout |
176 |
// begin the layout |
| 160 |
Label textLabel = new Label(contents, SWT.NONE); |
177 |
Label textLabel = new Label(contents, SWT.NONE); |
| 161 |
textLabel.setText(message); |
178 |
textLabel.setText(message); |
| 162 |
GridData data = new GridData(); |
|
|
| 163 |
data.horizontalSpan = 2; |
| 164 |
textLabel.setLayoutData(data); |
| 165 |
textLabel.setFont(font); |
| 166 |
|
| 167 |
internalButton = new Button(contents, SWT.RADIO | SWT.LEFT); |
| 168 |
internalButton.setText(WorkbenchMessages.EditorSelection_internal); |
| 169 |
internalButton.addListener(SWT.Selection, listener); |
| 170 |
data = new GridData(); |
| 171 |
data.horizontalSpan = 1; |
| 172 |
internalButton.setLayoutData(data); |
| 173 |
internalButton.setFont(font); |
| 174 |
|
| 175 |
externalButton = new Button(contents, SWT.RADIO | SWT.LEFT); |
| 176 |
externalButton.setText(WorkbenchMessages.EditorSelection_external); |
| 177 |
externalButton.addListener(SWT.Selection, listener); |
| 178 |
data = new GridData(); |
| 179 |
data.horizontalSpan = 1; |
| 180 |
externalButton.setLayoutData(data); |
| 181 |
externalButton.setFont(font); |
| 182 |
|
179 |
|
| 183 |
editorTable = new Table(contents, SWT.SINGLE | SWT.BORDER); |
180 |
editorsFolder = new TabFolder(contents, SWT.TOP); |
| 184 |
data = new GridData(); |
181 |
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); |
| 185 |
data.widthHint = convertHorizontalDLUsToPixels(TABLE_WIDTH); |
182 |
data.widthHint = convertHorizontalDLUsToPixels(TABLE_WIDTH); |
| 186 |
data.horizontalAlignment = GridData.FILL; |
183 |
editorsFolder.setLayoutData(data); |
| 187 |
data.grabExcessHorizontalSpace = true; |
184 |
|
| 188 |
data.verticalAlignment = GridData.FILL; |
185 |
labelProvider = new LabelProvider() { |
| 189 |
data.grabExcessVerticalSpace = true; |
|
|
| 190 |
data.horizontalSpan = 2; |
| 191 |
editorTable.setLayoutData(data); |
| 192 |
editorTable.setFont(font); |
| 193 |
data.heightHint = editorTable.getItemHeight() * 12; |
| 194 |
editorTableViewer = new TableViewer(editorTable); |
| 195 |
editorTableViewer.setContentProvider(ArrayContentProvider.getInstance()); |
| 196 |
editorTableViewer.setLabelProvider(new LabelProvider() { |
| 197 |
public String getText(Object element) { |
186 |
public String getText(Object element) { |
| 198 |
IEditorDescriptor d = (IEditorDescriptor) element; |
187 |
IEditorDescriptor d = (IEditorDescriptor) element; |
| 199 |
return TextProcessor.process(d.getLabel(), "."); //$NON-NLS-1$ |
188 |
return TextProcessor.process(d.getLabel(), "."); //$NON-NLS-1$ |
|
Lines 203-238
Link Here
|
| 203 |
IEditorDescriptor d = (IEditorDescriptor) element; |
192 |
IEditorDescriptor d = (IEditorDescriptor) element; |
| 204 |
return (Image) resourceManager.get(d.getImageDescriptor()); |
193 |
return (Image) resourceManager.get(d.getImageDescriptor()); |
| 205 |
} |
194 |
} |
| 206 |
}); |
195 |
}; |
| 207 |
editorTable.addListener(SWT.Selection, listener); |
196 |
|
| 208 |
editorTable.addListener(SWT.DefaultSelection, listener); |
197 |
createInternalEditorsTable(); |
| 209 |
editorTable.addListener(SWT.MouseDoubleClick, listener); |
198 |
createExternalEditorsTable(); |
| 210 |
|
|
|
| 211 |
browseExternalEditorsButton = new Button(contents, SWT.PUSH); |
| 212 |
browseExternalEditorsButton |
| 213 |
.setText(WorkbenchMessages.EditorSelection_browse); |
| 214 |
browseExternalEditorsButton.addListener(SWT.Selection, listener); |
| 215 |
data = new GridData(); |
| 216 |
int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH); |
| 217 |
data.widthHint = Math.max(widthHint, browseExternalEditorsButton |
| 218 |
.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); |
| 219 |
browseExternalEditorsButton.setLayoutData(data); |
| 220 |
browseExternalEditorsButton.setFont(font); |
| 221 |
|
199 |
|
| 222 |
restoreWidgetValues(); // Place buttons to the appropriate state |
200 |
restoreWidgetValues(); // Place buttons to the appropriate state |
| 223 |
|
201 |
|
| 224 |
fillEditorTable(); |
202 |
internalEditorsTableViewer.setInput(getInternalEditors()); |
|
|
203 |
handleTabSelection(); |
| 204 |
|
| 205 |
editorsFolder.addListener(SWT.Selection, listener); |
| 206 |
editorsFolder.addListener(SWT.DefaultSelection, listener); |
| 225 |
|
207 |
|
| 226 |
updateEnableState(); |
208 |
Dialog.applyDialogFont(contents); |
|
|
209 |
|
| 210 |
((GridData) externalEditorsTable.getLayoutData()).heightHint = externalEditorsTable |
| 211 |
.getItemHeight() * 12; |
| 227 |
|
212 |
|
| 228 |
return contents; |
213 |
return contents; |
| 229 |
} |
214 |
} |
| 230 |
|
215 |
|
| 231 |
protected void fillEditorTable() { |
216 |
private void createInternalEditorsTable() { |
| 232 |
if (internalButton.getSelection()) { |
217 |
TabItem internalEditorsItem = new TabItem(editorsFolder, SWT.LEAD); |
| 233 |
editorTableViewer.setInput(getInternalEditors()); |
218 |
internalEditorsItem.setText(WorkbenchMessages.EditorSelection_internal); |
|
|
219 |
|
| 220 |
Composite internalComposite = new Composite(editorsFolder, SWT.NONE); |
| 221 |
internalComposite.setLayout(new FillLayout()); |
| 222 |
|
| 223 |
internalEditorsTable = new Table(internalComposite, SWT.SINGLE | SWT.BORDER); |
| 224 |
internalEditorsTable.addListener(SWT.Selection, listener); |
| 225 |
internalEditorsTable.addListener(SWT.DefaultSelection, listener); |
| 226 |
|
| 227 |
internalEditorsTableViewer = new TableViewer(internalEditorsTable); |
| 228 |
internalEditorsTableViewer.setContentProvider(ArrayContentProvider.getInstance()); |
| 229 |
internalEditorsTableViewer.setLabelProvider(labelProvider); |
| 230 |
internalEditorsTableViewer.addOpenListener(new IOpenListener() { |
| 231 |
public void open(OpenEvent event) { |
| 232 |
okPressed(); |
| 233 |
} |
| 234 |
}); |
| 235 |
|
| 236 |
internalEditorsItem.setControl(internalComposite); |
| 237 |
} |
| 238 |
|
| 239 |
private void createExternalEditorsTable() { |
| 240 |
Composite externalComposite = new Composite(editorsFolder, SWT.NONE); |
| 241 |
GridLayout layout = new GridLayout(1, false); |
| 242 |
layout.marginWidth = 0; |
| 243 |
layout.marginHeight = 0; |
| 244 |
externalComposite.setLayout(layout); |
| 245 |
|
| 246 |
TabItem externalEditorsItem = new TabItem(editorsFolder, SWT.LEAD); |
| 247 |
externalEditorsItem.setText(WorkbenchMessages.EditorSelection_external); |
| 248 |
|
| 249 |
externalEditorsTable = new Table(externalComposite, SWT.SINGLE | SWT.BORDER); |
| 250 |
externalEditorsTable.addListener(SWT.Selection, listener); |
| 251 |
externalEditorsTable.addListener(SWT.DefaultSelection, listener); |
| 252 |
externalEditorsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| 253 |
|
| 254 |
externalEditorsTableViewer = new TableViewer(externalEditorsTable); |
| 255 |
externalEditorsTableViewer.setContentProvider(ArrayContentProvider.getInstance()); |
| 256 |
externalEditorsTableViewer.setLabelProvider(labelProvider); |
| 257 |
externalEditorsTableViewer.addOpenListener(new IOpenListener() { |
| 258 |
public void open(OpenEvent event) { |
| 259 |
okPressed(); |
| 260 |
} |
| 261 |
}); |
| 262 |
|
| 263 |
browseExternalEditorsButton = new Button(externalComposite, SWT.PUSH); |
| 264 |
browseExternalEditorsButton.setText(WorkbenchMessages.EditorSelection_browse); |
| 265 |
browseExternalEditorsButton.addListener(SWT.Selection, listener); |
| 266 |
|
| 267 |
externalEditorsItem.setControl(externalComposite); |
| 268 |
} |
| 269 |
|
| 270 |
private void handleTabSelection() { |
| 271 |
if (editorsFolder.getSelectionIndex() == 0) { |
| 272 |
internalEditorsTable.setFocus(); |
| 234 |
} else { |
273 |
} else { |
| 235 |
editorTableViewer.setInput(getExternalEditors()); |
274 |
externalEditorsTableViewer.setInput(getExternalEditors()); |
|
|
275 |
externalEditorsTable.setFocus(); |
| 236 |
} |
276 |
} |
| 237 |
} |
277 |
} |
| 238 |
|
278 |
|
|
Lines 344-360
Link Here
|
| 344 |
if (result != null) { |
384 |
if (result != null) { |
| 345 |
EditorDescriptor editor = EditorDescriptor.createForProgram(result); |
385 |
EditorDescriptor editor = EditorDescriptor.createForProgram(result); |
| 346 |
// pretend we had obtained it from the list of os registered editors |
386 |
// pretend we had obtained it from the list of os registered editors |
| 347 |
TableItem ti = new TableItem(editorTable, SWT.NULL); |
387 |
TableItem ti = new TableItem(externalEditorsTable, SWT.NULL); |
| 348 |
ti.setData(editor); |
388 |
ti.setData(editor); |
| 349 |
ti.setText(editor.getLabel()); |
389 |
ti.setText(editor.getLabel()); |
| 350 |
Image image = editor.getImageDescriptor().createImage(); |
390 |
Image image = editor.getImageDescriptor().createImage(); |
| 351 |
ti.setImage(image); |
391 |
ti.setImage(image); |
| 352 |
|
392 |
|
| 353 |
// need to pass an array to setSelection -- 1FSKYVO: SWT:ALL - |
393 |
externalEditorsTable.setSelection(ti); |
| 354 |
// inconsistent setSelection api on Table |
394 |
externalEditorsTable.showSelection(); |
| 355 |
editorTable.setSelection(new TableItem[] { ti }); |
395 |
externalEditorsTable.setFocus(); |
| 356 |
editorTable.showSelection(); |
|
|
| 357 |
editorTable.setFocus(); |
| 358 |
selectedEditor = editor; |
396 |
selectedEditor = editor; |
| 359 |
|
397 |
|
| 360 |
/* |
398 |
/* |
|
Lines 370-390
Link Here
|
| 370 |
} |
408 |
} |
| 371 |
|
409 |
|
| 372 |
/** |
410 |
/** |
| 373 |
* Handle a double click event on the list |
|
|
| 374 |
*/ |
| 375 |
protected void handleDoubleClickEvent() { |
| 376 |
buttonPressed(IDialogConstants.OK_ID); |
| 377 |
} |
| 378 |
|
| 379 |
/** |
| 380 |
* Use the dialog store to restore widget values to the values that they |
411 |
* Use the dialog store to restore widget values to the values that they |
| 381 |
* held last time this wizard was used to completion |
412 |
* held last time this wizard was used to completion |
| 382 |
*/ |
413 |
*/ |
| 383 |
protected void restoreWidgetValues() { |
414 |
protected void restoreWidgetValues() { |
| 384 |
IDialogSettings settings = getDialogSettings(); |
415 |
IDialogSettings settings = getDialogSettings(); |
| 385 |
boolean wasExternal = settings.getBoolean(STORE_ID_INTERNAL_EXTERNAL); |
416 |
boolean wasExternal = settings.getBoolean(STORE_ID_INTERNAL_EXTERNAL); |
| 386 |
internalButton.setSelection(!wasExternal); |
417 |
editorsFolder.setSelection(wasExternal ? 1 : 0); |
| 387 |
externalButton.setSelection(wasExternal); |
|
|
| 388 |
} |
418 |
} |
| 389 |
|
419 |
|
| 390 |
/** |
420 |
/** |
|
Lines 394-401
Link Here
|
| 394 |
protected void saveWidgetValues() { |
424 |
protected void saveWidgetValues() { |
| 395 |
IDialogSettings settings = getDialogSettings(); |
425 |
IDialogSettings settings = getDialogSettings(); |
| 396 |
// record whether use was viewing internal or external editors |
426 |
// record whether use was viewing internal or external editors |
| 397 |
settings |
427 |
settings.put(STORE_ID_INTERNAL_EXTERNAL, editorsFolder.getSelectionIndex() == 1); |
| 398 |
.put(STORE_ID_INTERNAL_EXTERNAL, !internalButton.getSelection()); |
|
|
| 399 |
} |
428 |
} |
| 400 |
|
429 |
|
| 401 |
/** |
430 |
/** |
|
Lines 418-437
Link Here
|
| 418 |
editorsToFilter = editors; |
447 |
editorsToFilter = editors; |
| 419 |
} |
448 |
} |
| 420 |
|
449 |
|
| 421 |
/** |
|
|
| 422 |
* Update enabled state. |
| 423 |
*/ |
| 424 |
protected void updateEnableState() { |
| 425 |
boolean enableExternal = externalButton.getSelection(); |
| 426 |
browseExternalEditorsButton.setEnabled(enableExternal); |
| 427 |
updateOkButton(); |
| 428 |
} |
| 429 |
|
| 430 |
protected void createButtonsForButtonBar(Composite parent) { |
450 |
protected void createButtonsForButtonBar(Composite parent) { |
| 431 |
okButton = createButton(parent, IDialogConstants.OK_ID, |
451 |
super.createButtonsForButtonBar(parent); |
| 432 |
IDialogConstants.OK_LABEL, true); |
452 |
okButton = getButton(IDialogConstants.OK_ID); |
| 433 |
createButton(parent, IDialogConstants.CANCEL_ID, |
|
|
| 434 |
IDialogConstants.CANCEL_LABEL, false); |
| 435 |
// initially there is no selection so OK button should not be enabled |
453 |
// initially there is no selection so OK button should not be enabled |
| 436 |
okButton.setEnabled(false); |
454 |
okButton.setEnabled(false); |
| 437 |
|
455 |
|
|
Lines 442-457
Link Here
|
| 442 |
*/ |
460 |
*/ |
| 443 |
protected void updateOkButton() { |
461 |
protected void updateOkButton() { |
| 444 |
// Buttons are null during dialog creation |
462 |
// Buttons are null during dialog creation |
| 445 |
if (okButton == null) { |
463 |
if (okButton != null) { |
| 446 |
return; |
464 |
if (editorsFolder.getSelectionIndex() == 0) { |
| 447 |
} |
465 |
okButton.setEnabled(internalEditorsTable.getSelectionIndex() != -1); |
| 448 |
// If there is no selection, do not enable OK button |
466 |
} else { |
| 449 |
if (editorTable.getSelectionCount() == 0) { |
467 |
okButton.setEnabled(externalEditorsTable.getSelectionIndex() != -1); |
| 450 |
okButton.setEnabled(false); |
468 |
} |
| 451 |
return; |
|
|
| 452 |
} |
469 |
} |
| 453 |
// At this point, there is a selection |
|
|
| 454 |
okButton.setEnabled(selectedEditor != null); |
| 455 |
} |
470 |
} |
| 456 |
|
471 |
|
| 457 |
private class DialogListener implements Listener { |
472 |
private class DialogListener implements Listener { |
|
Lines 462-485
Link Here
|
| 462 |
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) |
477 |
* @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) |
| 463 |
*/ |
478 |
*/ |
| 464 |
public void handleEvent(Event event) { |
479 |
public void handleEvent(Event event) { |
| 465 |
if (event.type == SWT.MouseDoubleClick) { |
480 |
if (event.widget == editorsFolder) { |
| 466 |
handleDoubleClickEvent(); |
481 |
handleTabSelection(); |
| 467 |
return; |
|
|
| 468 |
} |
| 469 |
if (event.widget == externalButton) { |
| 470 |
fillEditorTable(); |
| 471 |
} else if (event.widget == browseExternalEditorsButton) { |
482 |
} else if (event.widget == browseExternalEditorsButton) { |
| 472 |
promptForExternalEditor(); |
483 |
promptForExternalEditor(); |
| 473 |
} else if (event.widget == editorTable) { |
484 |
} else if (event.widget == internalEditorsTable) { |
| 474 |
if (editorTable.getSelectionIndex() != -1) { |
485 |
if (internalEditorsTable.getSelectionIndex() != -1) { |
| 475 |
selectedEditor = (EditorDescriptor) editorTable |
486 |
selectedEditor = (EditorDescriptor) internalEditorsTable.getSelection()[0] |
| 476 |
.getSelection()[0].getData(); |
487 |
.getData(); |
|
|
488 |
} else { |
| 489 |
selectedEditor = null; |
| 490 |
} |
| 491 |
} else if (event.widget == externalEditorsTable) { |
| 492 |
if (externalEditorsTable.getSelectionIndex() != -1) { |
| 493 |
selectedEditor = (EditorDescriptor) externalEditorsTable.getSelection()[0] |
| 494 |
.getData(); |
| 477 |
} else { |
495 |
} else { |
| 478 |
selectedEditor = null; |
496 |
selectedEditor = null; |
| 479 |
okButton.setEnabled(false); |
|
|
| 480 |
} |
497 |
} |
| 481 |
} |
498 |
} |
| 482 |
updateEnableState(); |
499 |
updateOkButton(); |
| 483 |
} |
500 |
} |
| 484 |
|
501 |
|
| 485 |
} |
502 |
} |