|
11 | 11 | *******************************************************************************/ |
12 | 12 | package org.eclipse.tm4e.ui.internal.preferences; |
13 | 13 |
|
| 14 | +import java.util.Arrays; |
| 15 | + |
14 | 16 | import org.eclipse.jdt.annotation.Nullable; |
| 17 | +import org.eclipse.jface.text.Document; |
| 18 | +import org.eclipse.jface.text.IDocument; |
| 19 | +import org.eclipse.jface.text.presentation.IPresentationReconciler; |
| 20 | +import org.eclipse.jface.text.source.ISourceViewer; |
15 | 21 | import org.eclipse.jface.text.source.SourceViewer; |
| 22 | +import org.eclipse.jface.text.source.SourceViewerConfiguration; |
16 | 23 | import org.eclipse.jface.text.templates.Template; |
| 24 | +import org.eclipse.jface.viewers.IStructuredSelection; |
17 | 25 | import org.eclipse.jface.window.Window; |
| 26 | +import org.eclipse.swt.SWT; |
18 | 27 | import org.eclipse.swt.widgets.Composite; |
19 | 28 | import org.eclipse.swt.widgets.Shell; |
| 29 | +import org.eclipse.text.templates.TemplatePersistenceData; |
| 30 | +import org.eclipse.tm4e.core.grammar.IGrammar; |
| 31 | +import org.eclipse.tm4e.registry.IGrammarDefinition; |
| 32 | +import org.eclipse.tm4e.registry.ITMScope; |
| 33 | +import org.eclipse.tm4e.registry.TMEclipseRegistryPlugin; |
20 | 34 | import org.eclipse.tm4e.ui.TMUIPlugin; |
| 35 | +import org.eclipse.tm4e.ui.internal.model.TMDocumentModel; |
| 36 | +import org.eclipse.tm4e.ui.text.TMPresentationReconciler; |
21 | 37 | import org.eclipse.ui.texteditor.templates.TemplatePreferencePage; |
22 | 38 |
|
23 | 39 | public class CustomCodeTemplatePreferencePage extends TemplatePreferencePage { |
24 | 40 |
|
| 41 | + private @Nullable TMDocumentModel model; |
| 42 | + private @Nullable TMPresentationReconciler reconsiler; |
| 43 | + |
25 | 44 | public CustomCodeTemplatePreferencePage() { |
26 | 45 | final TMUIPlugin plugin = TMUIPlugin.getDefault(); |
27 | 46 | if (plugin == null) { |
@@ -70,18 +89,65 @@ protected String getFormatterPreferenceKey() { |
70 | 89 |
|
71 | 90 | @Override |
72 | 91 | protected SourceViewer createViewer(final @Nullable Composite parent) { |
73 | | - final SourceViewer sourceViewer = super.createViewer(parent); |
74 | | - |
75 | 92 | // TODO configure source viewer for syntax highlighting with TM4E (adapt highlighting depending on context type) |
76 | | -// sourceViewer.configure(new SourceViewerConfiguration() { |
77 | | -// @Override |
78 | | -// public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { |
79 | | -// // TODO check if we need special config for highlighting template variables |
80 | | -// return new TMPresentationReconciler(); |
81 | | -// } |
82 | | -// }); |
83 | | - |
84 | | - return sourceViewer; |
| 93 | + |
| 94 | + final SourceViewer viewer = new SourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); |
| 95 | + final SourceViewerConfiguration configuration = new SourceViewerConfiguration() { |
| 96 | + @Override |
| 97 | + public IPresentationReconciler getPresentationReconciler(@Nullable final ISourceViewer sourceViewer) { |
| 98 | + // TODO check if we need special config for highlighting template variables |
| 99 | + reconsiler = new TMPresentationReconciler(); |
| 100 | + return reconsiler; |
| 101 | + } |
| 102 | + }; |
| 103 | + viewer.configure(configuration); |
| 104 | + final IDocument document = new Document(); |
| 105 | + viewer.setDocument(document); |
| 106 | +// model = TMModelManager.INSTANCE.connect(document); |
| 107 | + getTableViewer().addSelectionChangedListener(e -> selectionChanged()); |
| 108 | + return viewer; |
| 109 | + } |
| 110 | + |
| 111 | + private void selectionChanged() { |
| 112 | + final Template selectedTemplate = getSelectedTemplate(); |
| 113 | + |
| 114 | + if (selectedTemplate != null /*&& model != null*/) { |
| 115 | + |
| 116 | + final String id = selectedTemplate.getContextTypeId(); |
| 117 | + |
| 118 | + final IGrammarDefinition[] grammarDefinitions = TMEclipseRegistryPlugin.getGrammarRegistryManager().getDefinitions(); |
| 119 | + final ITMScope scope = Arrays.stream(grammarDefinitions) |
| 120 | + .map(IGrammarDefinition::getScope) |
| 121 | + .filter(s -> id.endsWith(s.getQualifiedName())) |
| 122 | + .findFirst().orElse(null); |
| 123 | + |
| 124 | + if (scope != null) { |
| 125 | + final IGrammar languageGrammar = TMEclipseRegistryPlugin.getGrammarRegistryManager().getGrammarForScope(scope); |
| 126 | + if (languageGrammar != null && reconsiler != null) { |
| 127 | +// model.setGrammar(languageGrammar); |
| 128 | + reconsiler.setGrammar(languageGrammar); |
| 129 | + return; |
| 130 | + |
| 131 | +// getViewer().invalidateTextPresentation(); |
| 132 | + } |
| 133 | + |
| 134 | + } |
| 135 | + } |
| 136 | + if (reconsiler != null) { |
| 137 | + reconsiler.setGrammar(null); |
| 138 | + } |
| 139 | + } |
| 140 | + |
| 141 | + private @Nullable Template getSelectedTemplate() { |
| 142 | + final IStructuredSelection selection = getTableViewer().getStructuredSelection(); |
| 143 | + |
| 144 | + if (selection != null && selection.size() == 1) { |
| 145 | + final TemplatePersistenceData data = (TemplatePersistenceData) selection.getFirstElement(); |
| 146 | + if (data != null) { |
| 147 | + return data.getTemplate(); |
| 148 | + } |
| 149 | + } |
| 150 | + return null; |
85 | 151 | } |
86 | 152 |
|
87 | 153 | } |
0 commit comments