PageRenderTime 50ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/eclipse_SDK-3.7.1/plugins/org.eclipse.jdt.ui.source_3.7.1.r371_v20110824-0800/org/eclipse/jdt/internal/ui/preferences/CodeTemplateBlock.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 667 lines | 529 code | 102 blank | 36 comment | 152 complexity | 2cbc04604b729a0b38d3c2536493288e MD5 | raw file
  1. /*******************************************************************************
  2. * Copyright (c) 2000, 2011 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * IBM Corporation - initial API and implementation
  10. * John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
  11. *******************************************************************************/
  12. package org.eclipse.jdt.internal.ui.preferences;
  13. import java.io.BufferedInputStream;
  14. import java.io.BufferedOutputStream;
  15. import java.io.File;
  16. import java.io.FileInputStream;
  17. import java.io.FileNotFoundException;
  18. import java.io.FileOutputStream;
  19. import java.io.IOException;
  20. import java.io.InputStream;
  21. import java.io.OutputStream;
  22. import java.util.ArrayList;
  23. import java.util.Arrays;
  24. import java.util.HashSet;
  25. import java.util.List;
  26. import java.util.Set;
  27. import org.eclipse.swt.SWT;
  28. import org.eclipse.swt.events.KeyEvent;
  29. 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.layout.GridData;
  33. import org.eclipse.swt.layout.GridLayout;
  34. import org.eclipse.swt.widgets.Composite;
  35. import org.eclipse.swt.widgets.Control;
  36. import org.eclipse.swt.widgets.FileDialog;
  37. import org.eclipse.swt.widgets.Label;
  38. import org.eclipse.core.resources.IProject;
  39. import org.eclipse.jface.dialogs.MessageDialog;
  40. import org.eclipse.jface.layout.PixelConverter;
  41. import org.eclipse.jface.preference.IPreferenceStore;
  42. import org.eclipse.jface.resource.JFaceResources;
  43. import org.eclipse.jface.viewers.LabelProvider;
  44. import org.eclipse.jface.viewers.StructuredSelection;
  45. import org.eclipse.jface.viewers.ViewerComparator;
  46. import org.eclipse.jface.window.Window;
  47. import org.eclipse.jface.text.Document;
  48. import org.eclipse.jface.text.IDocument;
  49. import org.eclipse.jface.text.source.SourceViewer;
  50. import org.eclipse.jface.text.templates.Template;
  51. import org.eclipse.jface.text.templates.TemplateContextType;
  52. import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
  53. import org.eclipse.jface.text.templates.persistence.TemplateReaderWriter;
  54. import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
  55. import org.eclipse.jdt.internal.corext.template.java.CodeTemplateContextType;
  56. import org.eclipse.jdt.internal.corext.util.Messages;
  57. import org.eclipse.jdt.ui.PreferenceConstants;
  58. import org.eclipse.jdt.ui.text.IJavaPartitions;
  59. import org.eclipse.jdt.ui.text.JavaTextTools;
  60. import org.eclipse.jdt.internal.ui.JavaPlugin;
  61. import org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer;
  62. import org.eclipse.jdt.internal.ui.text.template.preferences.TemplateVariableProcessor;
  63. import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels;
  64. import org.eclipse.jdt.internal.ui.viewsupport.ProjectTemplateStore;
  65. import org.eclipse.jdt.internal.ui.wizards.IStatusChangeListener;
  66. import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
  67. import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
  68. import org.eclipse.jdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
  69. import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
  70. import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
  71. import org.eclipse.jdt.internal.ui.wizards.dialogfields.TreeListDialogField;
  72. public class CodeTemplateBlock extends OptionsConfigurationBlock {
  73. private class CodeTemplateAdapter extends ViewerComparator implements ITreeListAdapter<String>, IDialogFieldListener {
  74. private final Object[] NO_CHILDREN= new Object[0];
  75. public void customButtonPressed(TreeListDialogField<String> field, int index) {
  76. doButtonPressed(index, field.getSelectedElements());
  77. }
  78. public void selectionChanged(TreeListDialogField<String> field) {
  79. List<Object> selected= field.getSelectedElements();
  80. field.enableButton(IDX_EDIT, canEdit(selected));
  81. field.enableButton(IDX_EXPORT, !selected.isEmpty());
  82. updateSourceViewerInput(selected);
  83. }
  84. public void doubleClicked(TreeListDialogField<String> field) {
  85. List<Object> selected= field.getSelectedElements();
  86. if (canEdit(selected)) {
  87. doButtonPressed(IDX_EDIT, selected);
  88. }
  89. }
  90. public Object[] getChildren(TreeListDialogField<String> field, Object element) {
  91. if (element == COMMENT_NODE || element == CODE_NODE) {
  92. return getTemplateOfCategory(element == COMMENT_NODE);
  93. }
  94. return NO_CHILDREN;
  95. }
  96. public Object getParent(TreeListDialogField<String> field, Object element) {
  97. if (element instanceof TemplatePersistenceData) {
  98. TemplatePersistenceData data= (TemplatePersistenceData) element;
  99. if (data.getTemplate().getName().endsWith(CodeTemplateContextType.COMMENT_SUFFIX)) {
  100. return COMMENT_NODE;
  101. }
  102. return CODE_NODE;
  103. }
  104. return null;
  105. }
  106. public boolean hasChildren(TreeListDialogField<String> field, Object element) {
  107. return (element == COMMENT_NODE || element == CODE_NODE);
  108. }
  109. public void dialogFieldChanged(DialogField field) {
  110. if (field == fGenerateComments) {
  111. setValue(PREF_GENERATE_COMMENTS, fGenerateComments.isSelected());
  112. }
  113. }
  114. public void keyPressed(TreeListDialogField<String> field, KeyEvent event) {
  115. }
  116. /* (non-Javadoc)
  117. * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object)
  118. */
  119. @Override
  120. public int category(Object element) {
  121. if (element == COMMENT_NODE) {
  122. return 1;
  123. } else if (element == CODE_NODE) {
  124. return 2;
  125. }
  126. TemplatePersistenceData data= (TemplatePersistenceData) element;
  127. String id= data.getId();
  128. if (CodeTemplateContextType.NEWTYPE_ID.equals(id)) {
  129. return 101;
  130. } else if (CodeTemplateContextType.CLASSBODY_ID.equals(id)) {
  131. return 102;
  132. } else if (CodeTemplateContextType.INTERFACEBODY_ID.equals(id)) {
  133. return 103;
  134. } else if (CodeTemplateContextType.ENUMBODY_ID.equals(id)) {
  135. return 104;
  136. } else if (CodeTemplateContextType.ANNOTATIONBODY_ID.equals(id)) {
  137. return 105;
  138. } else if (CodeTemplateContextType.METHODSTUB_ID.equals(id)) {
  139. return 106;
  140. } else if (CodeTemplateContextType.CONSTRUCTORSTUB_ID.equals(id)) {
  141. return 107;
  142. } else if (CodeTemplateContextType.GETTERSTUB_ID.equals(id)) {
  143. return 108;
  144. } else if (CodeTemplateContextType.SETTERSTUB_ID.equals(id)) {
  145. return 109;
  146. } else if (CodeTemplateContextType.CATCHBLOCK_ID.equals(id)) {
  147. return 110;
  148. } else if (CodeTemplateContextType.FILECOMMENT_ID.equals(id)) {
  149. return 1;
  150. } else if (CodeTemplateContextType.TYPECOMMENT_ID.equals(id)) {
  151. return 2;
  152. } else if (CodeTemplateContextType.FIELDCOMMENT_ID.equals(id)) {
  153. return 3;
  154. } else if (CodeTemplateContextType.CONSTRUCTORCOMMENT_ID.equals(id)) {
  155. return 4;
  156. } else if (CodeTemplateContextType.METHODCOMMENT_ID.equals(id)) {
  157. return 5;
  158. } else if (CodeTemplateContextType.OVERRIDECOMMENT_ID.equals(id)) {
  159. return 6;
  160. } else if (CodeTemplateContextType.DELEGATECOMMENT_ID.equals(id)) {
  161. return 7;
  162. } else if (CodeTemplateContextType.GETTERCOMMENT_ID.equals(id)) {
  163. return 8;
  164. } else if (CodeTemplateContextType.SETTERCOMMENT_ID.equals(id)) {
  165. return 9;
  166. }
  167. return 1000;
  168. }
  169. }
  170. private static class CodeTemplateLabelProvider extends LabelProvider {
  171. /* (non-Javadoc)
  172. * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
  173. */
  174. @Override
  175. public Image getImage(Object element) {
  176. return null;
  177. }
  178. /* (non-Javadoc)
  179. * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
  180. */
  181. @Override
  182. public String getText(Object element) {
  183. if (element == COMMENT_NODE || element == CODE_NODE) {
  184. return (String) element;
  185. }
  186. TemplatePersistenceData data= (TemplatePersistenceData) element;
  187. String id=data.getId();
  188. if (CodeTemplateContextType.CATCHBLOCK_ID.equals(id)) {
  189. return PreferencesMessages.CodeTemplateBlock_catchblock_label;
  190. } else if (CodeTemplateContextType.METHODSTUB_ID.equals(id)) {
  191. return PreferencesMessages.CodeTemplateBlock_methodstub_label;
  192. } else if (CodeTemplateContextType.CONSTRUCTORSTUB_ID.equals(id)) {
  193. return PreferencesMessages.CodeTemplateBlock_constructorstub_label;
  194. } else if (CodeTemplateContextType.GETTERSTUB_ID.equals(id)) {
  195. return PreferencesMessages.CodeTemplateBlock_getterstub_label;
  196. } else if (CodeTemplateContextType.SETTERSTUB_ID.equals(id)) {
  197. return PreferencesMessages.CodeTemplateBlock_setterstub_label;
  198. } else if (CodeTemplateContextType.NEWTYPE_ID.equals(id)) {
  199. return PreferencesMessages.CodeTemplateBlock_newtype_label;
  200. } else if (CodeTemplateContextType.CLASSBODY_ID.equals(id)) {
  201. return PreferencesMessages.CodeTemplateBlock_classbody_label;
  202. } else if (CodeTemplateContextType.INTERFACEBODY_ID.equals(id)) {
  203. return PreferencesMessages.CodeTemplateBlock_interfacebody_label;
  204. } else if (CodeTemplateContextType.ENUMBODY_ID.equals(id)) {
  205. return PreferencesMessages.CodeTemplateBlock_enumbody_label;
  206. } else if (CodeTemplateContextType.ANNOTATIONBODY_ID.equals(id)) {
  207. return PreferencesMessages.CodeTemplateBlock_annotationbody_label;
  208. } else if (CodeTemplateContextType.FILECOMMENT_ID.equals(id)) {
  209. return PreferencesMessages.CodeTemplateBlock_filecomment_label;
  210. } else if (CodeTemplateContextType.TYPECOMMENT_ID.equals(id)) {
  211. return PreferencesMessages.CodeTemplateBlock_typecomment_label;
  212. } else if (CodeTemplateContextType.FIELDCOMMENT_ID.equals(id)) {
  213. return PreferencesMessages.CodeTemplateBlock_fieldcomment_label;
  214. } else if (CodeTemplateContextType.METHODCOMMENT_ID.equals(id)) {
  215. return PreferencesMessages.CodeTemplateBlock_methodcomment_label;
  216. } else if (CodeTemplateContextType.OVERRIDECOMMENT_ID.equals(id)) {
  217. return PreferencesMessages.CodeTemplateBlock_overridecomment_label;
  218. } else if (CodeTemplateContextType.DELEGATECOMMENT_ID.equals(id)) {
  219. return PreferencesMessages.CodeTemplateBlock_delegatecomment_label;
  220. } else if (CodeTemplateContextType.CONSTRUCTORCOMMENT_ID.equals(id)) {
  221. return PreferencesMessages.CodeTemplateBlock_constructorcomment_label;
  222. } else if (CodeTemplateContextType.GETTERCOMMENT_ID.equals(id)) {
  223. return PreferencesMessages.CodeTemplateBlock_gettercomment_label;
  224. } else if (CodeTemplateContextType.SETTERCOMMENT_ID.equals(id)) {
  225. return PreferencesMessages.CodeTemplateBlock_settercomment_label;
  226. }
  227. return data.getTemplate().getDescription();
  228. }
  229. }
  230. private static final Key PREF_GENERATE_COMMENTS= getJDTUIKey(PreferenceConstants.CODEGEN_ADD_COMMENTS);
  231. private static Key[] getAllKeys() {
  232. return new Key[] {
  233. PREF_GENERATE_COMMENTS
  234. };
  235. }
  236. private final static int IDX_EDIT= 0;
  237. private final static int IDX_IMPORT= 2;
  238. private final static int IDX_EXPORT= 3;
  239. private final static int IDX_EXPORTALL= 4;
  240. protected final static String COMMENT_NODE= PreferencesMessages.CodeTemplateBlock_templates_comment_node;
  241. protected final static String CODE_NODE= PreferencesMessages.CodeTemplateBlock_templates_code_node;
  242. private TreeListDialogField<String> fCodeTemplateTree;
  243. private SelectionButtonDialogField fGenerateComments;
  244. protected ProjectTemplateStore fTemplateStore;
  245. private PixelConverter fPixelConverter;
  246. private SourceViewer fPatternViewer;
  247. private TemplateVariableProcessor fTemplateProcessor;
  248. public CodeTemplateBlock(IStatusChangeListener context, IProject project, IWorkbenchPreferenceContainer container) {
  249. super(context, project, getAllKeys(), container);
  250. fTemplateStore= new ProjectTemplateStore(project);
  251. try {
  252. fTemplateStore.load();
  253. } catch (IOException e) {
  254. JavaPlugin.log(e);
  255. }
  256. fTemplateProcessor= new TemplateVariableProcessor();
  257. CodeTemplateAdapter adapter= new CodeTemplateAdapter();
  258. String[] buttonLabels= new String[] {
  259. PreferencesMessages.CodeTemplateBlock_templates_edit_button,
  260. /* */ null,
  261. PreferencesMessages.CodeTemplateBlock_templates_import_button,
  262. PreferencesMessages.CodeTemplateBlock_templates_export_button,
  263. PreferencesMessages.CodeTemplateBlock_templates_exportall_button
  264. };
  265. fCodeTemplateTree= new TreeListDialogField<String>(adapter, buttonLabels, new CodeTemplateLabelProvider());
  266. fCodeTemplateTree.setDialogFieldListener(adapter);
  267. fCodeTemplateTree.setLabelText(PreferencesMessages.CodeTemplateBlock_templates_label);
  268. fCodeTemplateTree.setViewerComparator(adapter);
  269. fCodeTemplateTree.enableButton(IDX_EXPORT, false);
  270. fCodeTemplateTree.enableButton(IDX_EDIT, false);
  271. fCodeTemplateTree.addElement(COMMENT_NODE);
  272. fCodeTemplateTree.addElement(CODE_NODE);
  273. fCodeTemplateTree.selectFirstElement();
  274. fGenerateComments= new SelectionButtonDialogField(SWT.CHECK | SWT.WRAP);
  275. fGenerateComments.setDialogFieldListener(adapter);
  276. fGenerateComments.setLabelText(PreferencesMessages.CodeTemplateBlock_createcomment_label);
  277. updateControls();
  278. }
  279. public void postSetSelection(Object element) {
  280. fCodeTemplateTree.postSetSelection(new StructuredSelection(element));
  281. }
  282. @Override
  283. public boolean hasProjectSpecificOptions(IProject project) {
  284. if (super.hasProjectSpecificOptions(project))
  285. return true;
  286. if (project != null) {
  287. return ProjectTemplateStore.hasProjectSpecificTempates(project);
  288. }
  289. return false;
  290. }
  291. /*
  292. * @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#useProjectSpecificSettings(boolean)
  293. * @since 3.5
  294. */
  295. @Override
  296. public void useProjectSpecificSettings(boolean enable) {
  297. fCodeTemplateTree.setEnabled(enable); // need to set because super implementation only updates controls
  298. super.useProjectSpecificSettings(enable);
  299. }
  300. @Override
  301. protected Control createContents(Composite parent) {
  302. fPixelConverter= new PixelConverter(parent);
  303. setShell(parent.getShell());
  304. Composite composite= new Composite(parent, SWT.NONE);
  305. composite.setFont(parent.getFont());
  306. GridLayout layout= new GridLayout();
  307. layout.marginHeight= 0;
  308. layout.marginWidth= 0;
  309. layout.numColumns= 2;
  310. composite.setLayout(layout);
  311. fCodeTemplateTree.doFillIntoGrid(composite, 3);
  312. LayoutUtil.setHorizontalSpan(fCodeTemplateTree.getLabelControl(null), 2);
  313. LayoutUtil.setHorizontalGrabbing(fCodeTemplateTree.getTreeControl(null));
  314. fPatternViewer= createViewer(composite, 2);
  315. fGenerateComments.doFillIntoGrid(composite, 2);
  316. return composite;
  317. }
  318. /* (non-Javadoc)
  319. * @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#updateControls()
  320. */
  321. @Override
  322. protected void updateControls() {
  323. fGenerateComments.setSelection(getBooleanValue(PREF_GENERATE_COMMENTS));
  324. }
  325. private SourceViewer createViewer(Composite parent, int nColumns) {
  326. Label label= new Label(parent, SWT.NONE);
  327. label.setText(PreferencesMessages.CodeTemplateBlock_preview);
  328. GridData data= new GridData();
  329. data.horizontalSpan= nColumns;
  330. label.setLayoutData(data);
  331. IDocument document= new Document();
  332. JavaTextTools tools= JavaPlugin.getDefault().getJavaTextTools();
  333. tools.setupJavaDocumentPartitioner(document, IJavaPartitions.JAVA_PARTITIONING);
  334. IPreferenceStore store= JavaPlugin.getDefault().getCombinedPreferenceStore();
  335. SourceViewer viewer= new JavaSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store);
  336. CodeTemplateSourceViewerConfiguration configuration= new CodeTemplateSourceViewerConfiguration(tools.getColorManager(), store, null, fTemplateProcessor);
  337. viewer.configure(configuration);
  338. viewer.setEditable(false);
  339. Cursor arrowCursor= viewer.getTextWidget().getDisplay().getSystemCursor(SWT.CURSOR_ARROW);
  340. viewer.getTextWidget().setCursor(arrowCursor);
  341. // Don't set caret to 'null' as this causes https://bugs.eclipse.org/293263
  342. // viewer.getTextWidget().setCaret(null);
  343. viewer.setDocument(document);
  344. Font font= JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT);
  345. viewer.getTextWidget().setFont(font);
  346. new JavaSourcePreviewerUpdater(viewer, configuration, store);
  347. Control control= viewer.getControl();
  348. data= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.FILL_VERTICAL);
  349. data.horizontalSpan= nColumns;
  350. data.heightHint= fPixelConverter.convertHeightInCharsToPixels(5);
  351. control.setLayoutData(data);
  352. return viewer;
  353. }
  354. protected TemplatePersistenceData[] getTemplateOfCategory(boolean isComment) {
  355. ArrayList<TemplatePersistenceData> res= new ArrayList<TemplatePersistenceData>();
  356. TemplatePersistenceData[] templates= fTemplateStore.getTemplateData();
  357. for (int i= 0; i < templates.length; i++) {
  358. TemplatePersistenceData curr= templates[i];
  359. if (isComment == curr.getTemplate().getName().endsWith(CodeTemplateContextType.COMMENT_SUFFIX)) {
  360. res.add(curr);
  361. }
  362. }
  363. return res.toArray(new TemplatePersistenceData[res.size()]);
  364. }
  365. protected static boolean canEdit(List<Object> selected) {
  366. return selected.size() == 1 && (selected.get(0) instanceof TemplatePersistenceData);
  367. }
  368. protected void updateSourceViewerInput(List<Object> selection) {
  369. if (fPatternViewer == null || fPatternViewer.getTextWidget().isDisposed()) {
  370. return;
  371. }
  372. if (selection.size() == 1 && selection.get(0) instanceof TemplatePersistenceData) {
  373. TemplatePersistenceData data= (TemplatePersistenceData) selection.get(0);
  374. Template template= data.getTemplate();
  375. TemplateContextType type= JavaPlugin.getDefault().getCodeTemplateContextRegistry().getContextType(template.getContextTypeId());
  376. fTemplateProcessor.setContextType(type);
  377. fPatternViewer.getDocument().set(template.getPattern());
  378. } else {
  379. fPatternViewer.getDocument().set(""); //$NON-NLS-1$
  380. }
  381. }
  382. protected void doButtonPressed(int buttonIndex, List<Object> selected) {
  383. if (buttonIndex == IDX_EDIT) {
  384. edit((TemplatePersistenceData) selected.get(0));
  385. } else if (buttonIndex == IDX_EXPORT) {
  386. export(selected);
  387. } else if (buttonIndex == IDX_EXPORTALL) {
  388. exportAll();
  389. } else if (buttonIndex == IDX_IMPORT) {
  390. import_();
  391. }
  392. }
  393. private void edit(TemplatePersistenceData data) {
  394. Template newTemplate= new Template(data.getTemplate());
  395. EditTemplateDialog dialog= new EditTemplateDialog(getShell(), newTemplate, true, false, JavaPlugin.getDefault().getCodeTemplateContextRegistry());
  396. if (dialog.open() == Window.OK) {
  397. // changed
  398. data.setTemplate(dialog.getTemplate());
  399. fCodeTemplateTree.refresh(data);
  400. fCodeTemplateTree.selectElements(new StructuredSelection(data));
  401. }
  402. }
  403. private void import_() {
  404. FileDialog dialog= new FileDialog(getShell());
  405. dialog.setText(PreferencesMessages.CodeTemplateBlock_import_title);
  406. dialog.setFilterExtensions(new String[] {PreferencesMessages.CodeTemplateBlock_import_extension});
  407. String path= dialog.open();
  408. if (path == null)
  409. return;
  410. try {
  411. TemplateReaderWriter reader= new TemplateReaderWriter();
  412. File file= new File(path);
  413. if (file.exists()) {
  414. InputStream input= new BufferedInputStream(new FileInputStream(file));
  415. try {
  416. TemplatePersistenceData[] datas= reader.read(input, null);
  417. for (int i= 0; i < datas.length; i++) {
  418. updateTemplate(datas[i]);
  419. }
  420. } finally {
  421. try {
  422. input.close();
  423. } catch (IOException x) {
  424. }
  425. }
  426. }
  427. fCodeTemplateTree.refresh();
  428. updateSourceViewerInput(fCodeTemplateTree.getSelectedElements());
  429. } catch (FileNotFoundException e) {
  430. openReadErrorDialog(e);
  431. } catch (IOException e) {
  432. openReadErrorDialog(e);
  433. }
  434. }
  435. private void updateTemplate(TemplatePersistenceData data) {
  436. TemplatePersistenceData[] datas= fTemplateStore.getTemplateData();
  437. for (int i= 0; i < datas.length; i++) {
  438. String id= datas[i].getId();
  439. if (id != null && id.equals(data.getId())) {
  440. datas[i].setTemplate(data.getTemplate());
  441. break;
  442. }
  443. }
  444. }
  445. private void exportAll() {
  446. export(fTemplateStore.getTemplateData());
  447. }
  448. private void export(List<Object> selected) {
  449. Set<Object> datas= new HashSet<Object>();
  450. for (int i= 0; i < selected.size(); i++) {
  451. Object curr= selected.get(i);
  452. if (curr instanceof TemplatePersistenceData) {
  453. datas.add(curr);
  454. } else {
  455. TemplatePersistenceData[] cat= getTemplateOfCategory(curr == COMMENT_NODE);
  456. datas.addAll(Arrays.asList(cat));
  457. }
  458. }
  459. export(datas.toArray(new TemplatePersistenceData[datas.size()]));
  460. }
  461. private void export(TemplatePersistenceData[] templates) {
  462. FileDialog dialog= new FileDialog(getShell(), SWT.SAVE);
  463. String text= templates.length == 1 ? PreferencesMessages.CodeTemplateBlock_export_title_singular : Messages.format(PreferencesMessages.CodeTemplateBlock_export_title_plural, String
  464. .valueOf(templates.length));
  465. dialog.setText(text);
  466. dialog.setFilterExtensions(new String[] {PreferencesMessages.CodeTemplateBlock_export_extension});
  467. dialog.setFileName(PreferencesMessages.CodeTemplateBlock_export_filename);
  468. String path= dialog.open();
  469. if (path == null)
  470. return;
  471. File file= new File(path);
  472. if (file.isHidden()) {
  473. String title= PreferencesMessages.CodeTemplateBlock_export_error_title;
  474. String message= Messages.format(PreferencesMessages.CodeTemplateBlock_export_error_hidden, BasicElementLabels.getPathLabel(file));
  475. MessageDialog.openError(getShell(), title, message);
  476. return;
  477. }
  478. if (file.exists() && !file.canWrite()) {
  479. String title= PreferencesMessages.CodeTemplateBlock_export_error_title;
  480. String message= Messages.format(PreferencesMessages.CodeTemplateBlock_export_error_canNotWrite, BasicElementLabels.getPathLabel(file));
  481. MessageDialog.openError(getShell(), title, message);
  482. return;
  483. }
  484. if (!file.exists() || confirmOverwrite(file)) {
  485. OutputStream output= null;
  486. try {
  487. output= new BufferedOutputStream(new FileOutputStream(file));
  488. TemplateReaderWriter writer= new TemplateReaderWriter();
  489. writer.save(templates, output);
  490. output.close();
  491. } catch (IOException e) {
  492. if (output != null) {
  493. try {
  494. output.close();
  495. } catch (IOException e2) {
  496. // ignore
  497. }
  498. }
  499. openWriteErrorDialog();
  500. }
  501. }
  502. }
  503. private boolean confirmOverwrite(File file) {
  504. return MessageDialog.openQuestion(getShell(),
  505. PreferencesMessages.CodeTemplateBlock_export_exists_title,
  506. Messages.format(PreferencesMessages.CodeTemplateBlock_export_exists_message, BasicElementLabels.getPathLabel(file)));
  507. }
  508. @Override
  509. public void performDefaults() {
  510. fTemplateStore.restoreDefaults();
  511. // refresh
  512. fCodeTemplateTree.refresh();
  513. super.performDefaults();
  514. }
  515. public boolean performOk(boolean enabled) {
  516. boolean res= super.performOk();
  517. if (!res)
  518. return false;
  519. if (fProject != null) {
  520. TemplatePersistenceData[] templateData= fTemplateStore.getTemplateData();
  521. for (int i= 0; i < templateData.length; i++) {
  522. fTemplateStore.setProjectSpecific(templateData[i].getId(), enabled);
  523. }
  524. }
  525. try {
  526. fTemplateStore.save();
  527. } catch (IOException e) {
  528. JavaPlugin.log(e);
  529. openWriteErrorDialog();
  530. }
  531. return true;
  532. }
  533. public void performCancel() {
  534. try {
  535. fTemplateStore.revertChanges();
  536. } catch (IOException e) {
  537. openReadErrorDialog(e);
  538. }
  539. }
  540. private void openReadErrorDialog(Exception e) {
  541. String title= PreferencesMessages.CodeTemplateBlock_error_read_title;
  542. String message= e.getLocalizedMessage();
  543. if (message != null)
  544. message= Messages.format(PreferencesMessages.CodeTemplateBlock_error_parse_message, message);
  545. else
  546. message= PreferencesMessages.CodeTemplateBlock_error_read_message;
  547. MessageDialog.openError(getShell(), title, message);
  548. }
  549. private void openWriteErrorDialog() {
  550. String title= PreferencesMessages.CodeTemplateBlock_error_write_title;
  551. String message= PreferencesMessages.CodeTemplateBlock_error_write_message;
  552. MessageDialog.openError(getShell(), title, message);
  553. }
  554. @Override
  555. protected String[] getFullBuildDialogStrings(boolean workspaceSettings) {
  556. return null;
  557. }
  558. /* (non-Javadoc)
  559. * @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#validateSettings(java.lang.String, java.lang.String)
  560. */
  561. @Override
  562. protected void validateSettings(Key changedKey, String oldValue, String newValue) {
  563. // no validation here
  564. }
  565. }