in org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/dialogs/SpellcheckableMessageArea.java [166:355]
public SpellcheckableMessageArea(Composite parent, String initialText,
boolean readOnly, int styles) {
super(parent, styles);
setLayout(new FillLayout());
boolean useCommentHighlight = !readOnly;
AnnotationModel annotationModel = new AnnotationModel();
sourceViewer = new HyperlinkSourceViewer(this, null,
SWT.MULTI | getViewerStyles()) {
@Override
protected void handleJFacePreferencesChange(
PropertyChangeEvent event) {
if (JFaceResources.TEXT_FONT.equals(event.getProperty())) {
Font themeFont = UIUtils.getFont(
UIPreferences.THEME_CommitMessageEditorFont);
Font jFaceFont = JFaceResources.getTextFont();
if (themeFont.equals(jFaceFont)) {
setFont(jFaceFont);
}
} else {
super.handleJFacePreferencesChange(event);
}
}
};
getTextWidget().setAlwaysShowScrollBars(false);
getTextWidget().setFont(UIUtils
.getFont(UIPreferences.THEME_CommitMessageEditorFont));
sourceViewer.setDocument(new Document());
int endSpacing = 2;
int textWidth = (int) (getCharWidth() * MAX_LINE_WIDTH + endSpacing);
int textHeight = getLineHeight() * 7;
Point size = getTextWidget().computeSize(textWidth, textHeight);
getTextWidget().setSize(size);
computeBrokenBidiPlatformTextWidth(size.x);
getTextWidget().setEditable(!readOnly);
createMarginPainter();
configureHardWrap();
final IPropertyChangeListener propertyChangeListener = event -> {
if (UIPreferences.COMMIT_DIALOG_HARD_WRAP_MESSAGE
.equals(event.getProperty())) {
getDisplay().asyncExec(() -> {
if (!isDisposed()) {
configureHardWrap();
if (brokenBidiPlatformTextWidth != -1) {
layout();
}
}
});
}
};
Activator.getDefault().getPreferenceStore().addPropertyChangeListener(propertyChangeListener);
if (useCommentHighlight) {
ColorRegistry colors = PlatformUI.getWorkbench().getThemeManager()
.getCurrentTheme().getColorRegistry();
commentColoring = new Token(new TextAttribute(
colors.get(UIPreferences.THEME_CommitMessageCommentColor)));
}
final IPropertyChangeListener themeListener = event -> {
String property = event.getProperty();
if (IThemeManager.CHANGE_CURRENT_THEME.equals(property)
|| UIPreferences.THEME_CommitMessageEditorFont
.equals(property)
|| (commentColoring != null
&& UIPreferences.THEME_CommitMessageCommentColor
.equals(property))) {
Font themeFont = UIUtils
.getFont(UIPreferences.THEME_CommitMessageEditorFont);
ColorRegistry colors = PlatformUI.getWorkbench()
.getThemeManager().getCurrentTheme().getColorRegistry();
getDisplay().asyncExec(() -> {
if (!isDisposed()) {
sourceViewer.setFont(themeFont);
if (commentColoring != null) {
commentColoring.setData(new TextAttribute(colors
.get(UIPreferences.THEME_CommitMessageCommentColor)));
sourceViewer.invalidateTextPresentation();
}
}
});
}
};
PlatformUI.getWorkbench().getThemeManager()
.addPropertyChangeListener(themeListener);
final SourceViewerDecorationSupport support = configureAnnotationPreferences();
Document document = new Document(initialText);
configuration = new HyperlinkSourceViewer.Configuration(
EditorsUI.getPreferenceStore()) {
@Override
public int getHyperlinkStateMask(ISourceViewer targetViewer) {
if (!targetViewer.isEditable()) {
return SWT.NONE;
}
return super.getHyperlinkStateMask(targetViewer);
}
@Override
protected Map<String, IAdaptable> getHyperlinkDetectorTargets(
ISourceViewer targetViewer) {
return getHyperlinkTargets();
}
@Override
public IReconciler getReconciler(ISourceViewer viewer) {
if (!isEditable(viewer))
return null;
return super.getReconciler(sourceViewer);
}
@Override
public IContentAssistant getContentAssistant(ISourceViewer viewer) {
if (!viewer.isEditable())
return null;
IContentAssistant assistant = createContentAssistant(viewer);
// Add content assist proposal handler if assistant exists
if (assistant != null)
contentAssistAction = createContentAssistAction(
sourceViewer);
return assistant;
}
@Override
public String[] getConfiguredContentTypes(ISourceViewer viewer) {
if (!useCommentHighlight) {
return super.getConfiguredContentTypes(viewer);
}
return new String[] { IDocument.DEFAULT_CONTENT_TYPE,
COMMENT_CONTENT_TYPE };
}
@Override
public IPresentationReconciler getPresentationReconciler(
ISourceViewer viewer) {
PresentationReconciler reconciler = new PresentationReconciler();
reconciler.setDocumentPartitioning(
getConfiguredDocumentPartitioning(viewer));
DefaultDamagerRepairer hyperlinkDamagerRepairer = new DefaultDamagerRepairer(
new HyperlinkTokenScanner(this, viewer));
reconciler.setDamager(hyperlinkDamagerRepairer,
IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(hyperlinkDamagerRepairer,
IDocument.DEFAULT_CONTENT_TYPE);
if (useCommentHighlight) {
DefaultDamagerRepairer commentRepairer = new DefaultDamagerRepairer(
new HyperlinkTokenScanner(this, viewer,
commentColoring));
reconciler.setDamager(commentRepairer,
COMMENT_CONTENT_TYPE);
reconciler.setRepairer(commentRepairer,
COMMENT_CONTENT_TYPE);
}
return reconciler;
}
};
sourceViewer.configure(configuration);
if (useCommentHighlight) {
IDocumentPartitioner partitioner = new FastPartitioner(
new CommitPartitionTokenScanner(() -> commentChar,
() -> cleanupMode),
configuration.getConfiguredContentTypes(sourceViewer));
partitioner.connect(document);
document.setDocumentPartitioner(partitioner);
}
sourceViewer.setDocument(document, annotationModel);
configureContextMenu();
getTextWidget().addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent disposeEvent) {
support.uninstall();
Activator.getDefault().getPreferenceStore().removePropertyChangeListener(propertyChangeListener);
PlatformUI.getWorkbench().getThemeManager()
.removePropertyChangeListener(themeListener);
}
});
}