diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/doctools/doxygen/DoxygenCCommentAutoEditStrategyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/doctools/doxygen/DoxygenCCommentAutoEditStrategyTest.java index 0747586e9bf..6e9fcd3932e 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/doctools/doxygen/DoxygenCCommentAutoEditStrategyTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/doctools/doxygen/DoxygenCCommentAutoEditStrategyTest.java @@ -16,6 +16,7 @@ package org.eclipse.cdt.ui.tests.text.doctools.doxygen; import java.util.HashMap; +import java.util.Optional; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CoreModel; @@ -26,6 +27,7 @@ import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.model.TranslationUnit; import org.eclipse.cdt.internal.ui.text.CAutoIndentStrategy; import org.eclipse.cdt.internal.ui.text.CTextTools; +import org.eclipse.cdt.internal.ui.text.doctools.DoxygenPreferences; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.tests.text.AbstractAutoEditTest; import org.eclipse.cdt.ui.text.ICPartitions; @@ -62,6 +64,16 @@ public class DoxygenCCommentAutoEditStrategyTest extends AbstractAutoEditTest { super.setUp(); fOptions = CCorePlugin.getOptions(); fCProject = CProjectHelper.createCCProject("test" + System.currentTimeMillis(), null); + DoxygenPreferences pref = new DoxygenPreferences(Optional.empty()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, DoxygenPreferences.DEF_DOXYGEN_USE_BRIEF_TAG); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_NEW_LINE_AFTER_BRIEF, + DoxygenPreferences.DEF_DOXYGEN_NEW_LINE_AFTER_BRIEF); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_PRE_POST_TAGS, + DoxygenPreferences.DEF_DOXYGEN_USE_PRE_POST_TAGS); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_JAVADOC_TAGS, + DoxygenPreferences.DEF_DOXYGEN_USE_JAVADOC_TAGS); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_STRUCTURAL_COMMANDS, + DoxygenPreferences.DEF_DOXYGEN_USE_STRUCTURED_COMMANDS); } /* @@ -674,6 +686,79 @@ public class DoxygenCCommentAutoEditStrategyTest extends AbstractAutoEditTest { assertAutoEditBehaviour(); } + ///**X + //void foo() {} + + ///** + // * X@brief ${whitespace_eol} + // * ${whitespace_eol} + // */ + //void foo() {} + public void testAutoDocCommentBrief() throws CoreException { + DoxygenPreferences pref = new DoxygenPreferences(Optional.empty()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, true); + assertAutoEditBehaviour(); + } + + ///**X + //void foo() {} + + ///** + // * X@brief ${whitespace_eol} + // */ + //void foo() {} + public void testAutoDocCommentBriefNoNewLine() throws CoreException { + DoxygenPreferences pref = new DoxygenPreferences(Optional.empty()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, true); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_NEW_LINE_AFTER_BRIEF, false); + assertAutoEditBehaviour(); + } + + ///**X + //void foo() {} + + ///** + // * X@fn void foo() + // */ + //void foo() {} + public void testAutoDocCommentStructured() throws CoreException { + DoxygenPreferences pref = new DoxygenPreferences(Optional.empty()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_STRUCTURAL_COMMANDS, true); + assertAutoEditBehaviour(); + } + + ///**X + //void foo() {} + + ///** + // * X\brief ${whitespace_eol} + // * ${whitespace_eol} + // */ + //void foo() {} + public void testAutoDocCommentNoJavadoc() throws CoreException { + DoxygenPreferences pref = new DoxygenPreferences(Optional.empty()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, true); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_JAVADOC_TAGS, false); + assertAutoEditBehaviour(); + } + + ///**X + //void foo() {} + + ///** + // * X@brief ${whitespace_eol} + // * ${whitespace_eol} + // * @pre ${whitespace_eol} + // * @post ${whitespace_eol} + // */ + //void foo() {} + public void testAutoDocCommentPrePostTags() throws CoreException { + DoxygenPreferences pref = new DoxygenPreferences(Optional.empty()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, true); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_PRE_POST_TAGS, true); + assertAutoEditBehaviour(); + } + protected void assertAutoEditBehaviour() throws CoreException { CTextTools textTools = CUIPlugin.getDefault().getTextTools(); final IDocument doc = new Document(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java index cf2f1132b27..f8195ade9b0 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java @@ -363,12 +363,14 @@ public class CEditorPreferencePage extends AbstractPreferencePage { fAppearanceColorList.select(0); handleAppearanceColorListSelection(); }); + fDocCommentOwnerComposite.loadValues(); } @Override public boolean performOk() { DocCommentOwnerManager.getInstance() .setWorkspaceCommentOwner(fDocCommentOwnerComposite.getSelectedDocCommentOwner()); + fDocCommentOwnerComposite.performOk(); return super.performOk(); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java index 4919f6ca576..8e24c7cb57d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java @@ -60,6 +60,11 @@ public class DocCommentOwnerManager { private static final String QUALIFIER = CCorePlugin.PLUGIN_ID; private static final String WORKSPACE_DOC_TOOL_NODE = "doctool"; //$NON-NLS-1$ private static final String PREFKEY_WORKSPACE_DEFAULT = "workspace.default"; //$NON-NLS-1$ + /** + * Default id for built-in CDT doxygen ui comment owner. + * @since 6.7 + */ + public static final String DOXYGEN_CDT_DOC_ONWER_ID = "org.eclipse.cdt.ui.doxygen"; //$NON-NLS-1$ private static DocCommentOwnerManager singleton; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DoxygenPreferences.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DoxygenPreferences.java new file mode 100644 index 00000000000..7cfdb77b3ac --- /dev/null +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/doctools/DoxygenPreferences.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * Copyright (c) 2020 Marco Stornelli + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Marco Stornelli - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.text.doctools; + +import java.util.Optional; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.osgi.service.prefs.Preferences; + +public class DoxygenPreferences { + /** + * Use always brief tag in auto-generation of doxygen comment + * @since 6.7 + */ + public static final String DOXYGEN_USE_BRIEF_TAG = "doxygen_use_brief_tag"; //$NON-NLS-1$ + /** + * Use always structured commands in auto-generation of doxygen comment + * @since 6.7 + */ + public static final String DOXYGEN_USE_STRUCTURAL_COMMANDS = "doxygen_use_structural_commands"; //$NON-NLS-1$ + /** + * Use always javadoc tag style in auto-generation of doxygen comment + * @since 6.7 + */ + public static final String DOXYGEN_USE_JAVADOC_TAGS = "doxygen_use_javadoc_tags"; //$NON-NLS-1$ + /** + * Use always a new line after brief tag in auto-generation of doxygen comment + * @since 6.7 + */ + public static final String DOXYGEN_NEW_LINE_AFTER_BRIEF = "doxygen_new_line_after_brief"; //$NON-NLS-1$ + /** + * Use always a pre tag in auto-generation of doxygen comment + * @since 6.7 + */ + public static final String DOXYGEN_USE_PRE_POST_TAGS = "doxygen_use_pre_tag"; //$NON-NLS-1$ + + /** + * Default use always brief tag in auto-generation of doxygen comment + * @since 6.7 + */ + public static final boolean DEF_DOXYGEN_USE_BRIEF_TAG = false; + /** + * Default use always structured commands in auto-generation of doxygen comment + * @since 6.7 + */ + public static final boolean DEF_DOXYGEN_USE_STRUCTURED_COMMANDS = false; + /** + * Default use always javadoc tag style in auto-generation of doxygen comment + * @since 6.7 + */ + public static final boolean DEF_DOXYGEN_USE_JAVADOC_TAGS = true; + /** + * Default use always a new line after brief tag in auto-generation of doxygen comment + * @since 6.7 + */ + public static final boolean DEF_DOXYGEN_NEW_LINE_AFTER_BRIEF = true; + /** + * Default use always a pre tag in auto-generation of doxygen comment + * @since 6.7 + */ + public static final boolean DEF_DOXYGEN_USE_PRE_POST_TAGS = false; + + private static final String QUALIFIER = CCorePlugin.PLUGIN_ID; + private static final String WORKSPACE_DOXYGEN_NODE = "doxygen"; //$NON-NLS-1$ + + private Optional project; + + public DoxygenPreferences(Optional project) { + this.project = project; + } + + /** + * Get boolean preferences + * @param key A preference key + * @param defaultValue A default value + * @return The preference value + */ + public boolean getBooleanPref(String key, boolean defaultValue) { + Preferences prefs = project.isPresent() + ? new ProjectScope(project.get()).getNode(QUALIFIER).node(WORKSPACE_DOXYGEN_NODE) + : InstanceScope.INSTANCE.getNode(QUALIFIER).node(WORKSPACE_DOXYGEN_NODE); + return prefs.getBoolean(key, defaultValue); + } + + /** + * Put boolean preferences + * @param key A preference key + * @param defaultValue A default value + */ + public void putBooleanPref(String key, boolean value) { + Preferences prefs = project.isPresent() + ? new ProjectScope(project.get()).getNode(QUALIFIER).node(WORKSPACE_DOXYGEN_NODE) + : InstanceScope.INSTANCE.getNode(QUALIFIER).node(WORKSPACE_DOXYGEN_NODE); + prefs.putBoolean(key, value); + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java index 090ab133387..db851635cda 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java @@ -54,6 +54,11 @@ class DialogsMessages extends NLS { public static String DocCommentOwnerBlock_SelectDocToolDescription; public static String DocCommentOwnerCombo_None; public static String DocCommentOwnerComposite_DocumentationToolGroupTitle; + public static String DocCommentOwnerComposite_UseBriefTagTitle; + public static String DocCommentOwnerComposite_UseStructuralCommandsTitle; + public static String DocCommentOwnerComposite_UseTagJavadocStyleTitle; + public static String DocCommentOwnerComposite_NewLineAfterBriefTitle; + public static String DocCommentOwnerComposite_AddPrePostTagsTitle; public static String RegexErrorParserOptionPage_ConsumeNo; public static String RegexErrorParserOptionPage_ConsumeYes; public static String RegexErrorParserOptionPage_DescriptionColumn; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties index 392029aa4df..a11adca6966 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties @@ -44,6 +44,11 @@ DocCommentOwnerBlock_EnableProjectSpecificSettings=Enable project specific setti DocCommentOwnerBlock_SelectDocToolDescription=Select the documentation tool to be used to determine editor behaviors in this project DocCommentOwnerCombo_None=None DocCommentOwnerComposite_DocumentationToolGroupTitle=Documentation tool comments +DocCommentOwnerComposite_UseBriefTagTitle=Use brief tag +DocCommentOwnerComposite_UseStructuralCommandsTitle=Use structural commands +DocCommentOwnerComposite_UseTagJavadocStyleTitle=Use javadoc style for tags +DocCommentOwnerComposite_NewLineAfterBriefTitle=Add new line after brief tag +DocCommentOwnerComposite_AddPrePostTagsTitle=Add pre/post tags to functions IndexerBlock_fixedBuildConfig=Use a fixed build configuration IndexerBlock_indexerOptions=Indexer options IndexerBlock_buildConfigGroup=Build configuration for the indexer diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java index 8102a1eaa41..5fd003b2e16 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java @@ -92,18 +92,20 @@ public class DocCommentOwnerBlock extends AbstractCOptionPage { fDocComboComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).span(2, 1).create()); fCheckbox.setSelection(fManager.projectDefinesOwnership(getProject())); + fDocComboComposite.loadValues(getProject()); handleCheckBox(); } @Override public void performApply(IProgressMonitor monitor) throws CoreException { + IProject project = getProject(); if (!fCheckbox.getSelection()) - fManager.setCommentOwner(getProject(), null, true); + fManager.setCommentOwner(project, null, true); else { IDocCommentOwner newOwner = fDocComboComposite.getSelectedDocCommentOwner(); - IProject p = getProject(); - fManager.setCommentOwner(p, newOwner, true); + fManager.setCommentOwner(project, newOwner, true); } + fDocComboComposite.performOk(project); } public IProject getProject() { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java index 5ca135269fe..2a55e27c79f 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java @@ -20,6 +20,7 @@ import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; import org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner; import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; import org.eclipse.cdt.utils.ui.controls.ControlFactory; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; @@ -85,4 +86,18 @@ public class DocCommentOwnerCombo extends Composite { public void setEnabled(boolean enabled) { fCombo.setEnabled(enabled); } + + /** + * @since 6.7 + */ + public void addSelectionListener(SelectionListener listener) { + fCombo.addSelectionListener(listener); + } + + /** + * @since 6.7 + */ + public void removeSelectionListener(SelectionListener listener) { + fCombo.removeSelectionListener(listener); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java index 044491a05df..c11436872a6 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java @@ -13,12 +13,20 @@ *******************************************************************************/ package org.eclipse.cdt.ui.dialogs; +import java.util.Optional; + +import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; +import org.eclipse.cdt.internal.ui.text.doctools.DoxygenPreferences; import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; import org.eclipse.cdt.utils.ui.controls.ControlFactory; +import org.eclipse.core.resources.IProject; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; @@ -29,10 +37,30 @@ import org.eclipse.swt.widgets.Label; * @noextend This class is not intended to be subclassed by clients. * @noinstantiate This class is not intended to be instantiated by clients. */ -public class DocCommentOwnerComposite extends Composite { +public class DocCommentOwnerComposite extends Composite implements SelectionListener { protected DocCommentOwnerCombo fDocCombo; protected Label desc, comboLabel; protected Group group; + /** + * @since 6.7 + */ + protected Button useBriefTag; + /** + * @since 6.7 + */ + protected Button useStructuralCommands; + /** + * @since 6.7 + */ + protected Button useJavadocStyle; + /** + * @since 6.7 + */ + protected Button newLineAfterBrief; + /** + * @since 6.7 + */ + protected Button usePrePostTag; public DocCommentOwnerComposite(Composite parent, IDocCommentOwner initialOwner, String description, String label) { super(parent, SWT.NONE); @@ -57,17 +85,120 @@ public class DocCommentOwnerComposite extends Composite { }; gd = GridDataFactory.fillDefaults().grab(true, false).create(); fDocCombo.setLayoutData(gd); + fDocCombo.addSelectionListener(this); + useBriefTag = addCheckBox(group, DialogsMessages.DocCommentOwnerComposite_UseBriefTagTitle); + useStructuralCommands = addCheckBox(group, DialogsMessages.DocCommentOwnerComposite_UseStructuralCommandsTitle); + useJavadocStyle = addCheckBox(group, DialogsMessages.DocCommentOwnerComposite_UseTagJavadocStyleTitle); + newLineAfterBrief = addCheckBox(group, DialogsMessages.DocCommentOwnerComposite_NewLineAfterBriefTitle); + usePrePostTag = addCheckBox(group, DialogsMessages.DocCommentOwnerComposite_AddPrePostTagsTitle); + } + + private Button addCheckBox(Composite parent, String label) { + Button checkBox = new Button(parent, SWT.CHECK); + checkBox.setText(label); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalIndent = 0; + gd.horizontalSpan = 2; + checkBox.setLayoutData(gd); + return checkBox; } public IDocCommentOwner getSelectedDocCommentOwner() { return fDocCombo.getSelectedDocCommentOwner(); } + private void initialize(Button button, DoxygenPreferences pref, String key, boolean defaultValue) { + button.setSelection(pref.getBooleanPref(key, defaultValue)); + } + + /** + * @since 6.7 + */ + public void loadValues(IProject project) { + DoxygenPreferences pref = new DoxygenPreferences(Optional.ofNullable(project)); + initialize(newLineAfterBrief, pref, DoxygenPreferences.DOXYGEN_NEW_LINE_AFTER_BRIEF, + DoxygenPreferences.DEF_DOXYGEN_NEW_LINE_AFTER_BRIEF); + initialize(useBriefTag, pref, DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, + DoxygenPreferences.DEF_DOXYGEN_USE_BRIEF_TAG); + initialize(useJavadocStyle, pref, DoxygenPreferences.DOXYGEN_USE_JAVADOC_TAGS, + DoxygenPreferences.DEF_DOXYGEN_USE_JAVADOC_TAGS); + initialize(usePrePostTag, pref, DoxygenPreferences.DOXYGEN_USE_PRE_POST_TAGS, + DoxygenPreferences.DEF_DOXYGEN_USE_PRE_POST_TAGS); + initialize(useStructuralCommands, pref, DoxygenPreferences.DOXYGEN_USE_STRUCTURAL_COMMANDS, + DoxygenPreferences.DEF_DOXYGEN_USE_STRUCTURED_COMMANDS); + } + + /** + * @since 6.7 + */ + public void loadValues() { + loadValues(null); + } + + /** + * @since 6.7 + */ + public void performOk(IProject project) { + DoxygenPreferences pref = new DoxygenPreferences(Optional.ofNullable(project)); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_NEW_LINE_AFTER_BRIEF, newLineAfterBrief.getSelection()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, useBriefTag.getSelection()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_JAVADOC_TAGS, useJavadocStyle.getSelection()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_PRE_POST_TAGS, usePrePostTag.getSelection()); + pref.putBooleanPref(DoxygenPreferences.DOXYGEN_USE_STRUCTURAL_COMMANDS, useStructuralCommands.getSelection()); + } + + /** + * @since 6.7 + */ + public void performOk() { + performOk(null); + } + @Override public void setEnabled(boolean enabled) { desc.setEnabled(enabled); comboLabel.setEnabled(enabled); fDocCombo.setEnabled(enabled); group.setEnabled(enabled); + if (fDocCombo.isEnabled() && DocCommentOwnerManager.DOXYGEN_CDT_DOC_ONWER_ID + .equals(fDocCombo.getSelectedDocCommentOwner().getID())) { + useBriefTag.setEnabled(true); + useStructuralCommands.setEnabled(true); + useJavadocStyle.setEnabled(true); + newLineAfterBrief.setEnabled(true); + usePrePostTag.setEnabled(true); + } else { + useBriefTag.setEnabled(false); + useStructuralCommands.setEnabled(false); + useJavadocStyle.setEnabled(false); + newLineAfterBrief.setEnabled(false); + usePrePostTag.setEnabled(false); + } + } + + @Override + public void widgetSelected(SelectionEvent e) { + if (DocCommentOwnerManager.DOXYGEN_CDT_DOC_ONWER_ID.equals(fDocCombo.getSelectedDocCommentOwner().getID())) { + useBriefTag.setEnabled(true); + useStructuralCommands.setEnabled(true); + useJavadocStyle.setEnabled(true); + newLineAfterBrief.setEnabled(true); + usePrePostTag.setEnabled(true); + } else { + useBriefTag.setEnabled(false); + useStructuralCommands.setEnabled(false); + useJavadocStyle.setEnabled(false); + newLineAfterBrief.setEnabled(false); + usePrePostTag.setEnabled(false); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + useBriefTag.setEnabled(false); + useStructuralCommands.setEnabled(false); + useJavadocStyle.setEnabled(false); + newLineAfterBrief.setEnabled(false); + usePrePostTag.setEnabled(false); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java index d7e3796c3e5..b952004adee 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java @@ -17,6 +17,7 @@ package org.eclipse.cdt.ui.text.doctools; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; +import java.util.Optional; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTVisitor; @@ -35,6 +36,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.IWorkingCopyManager; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DocumentCommand; @@ -85,6 +87,17 @@ public class DefaultMultilineCommentAutoEditStrategy implements IAutoEditStrateg fProject = project; } + /** + * Return the project (if any) associated with this strategy + * @return A project or empty optional if no project is associated + * @since 6.7 + */ + protected Optional getProject() { + if (fProject != null) + return Optional.of(fProject.getProject()); + return Optional.empty(); + } + /** * Check if edit strategy is enabled * @return True if enabled, false otherwise diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java index f99986be07f..a5120496373 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java @@ -15,6 +15,7 @@ package org.eclipse.cdt.ui.text.doctools.doxygen; import java.util.LinkedHashSet; +import java.util.Optional; import org.eclipse.cdt.core.dom.ast.ExpansionOverlapsBoundaryException; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; @@ -47,7 +48,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypeId; import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.model.ASTStringUtil; +import org.eclipse.cdt.internal.ui.text.doctools.DoxygenPreferences; import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; +import org.eclipse.core.resources.IProject; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IAutoEditStrategy; import org.eclipse.jface.text.IDocument; @@ -70,6 +73,8 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut private static final String STRUCT = "struct "; //$NON-NLS-1$ private static final String UNION = "union "; //$NON-NLS-1$ private static final String BRIEF = "brief "; //$NON-NLS-1$ + private static final String PRE = "pre "; //$NON-NLS-1$ + private static final String POST = "post "; //$NON-NLS-1$ private static final String PARAM = "param "; //$NON-NLS-1$ private static final String FUNC = "fn "; //$NON-NLS-1$ private static final String TPARAM = "tparam "; //$NON-NLS-1$ @@ -82,17 +87,53 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut protected boolean documentPureVirtuals = true; protected boolean documentDeclarations = true; - private boolean javadocStyle = true; - private boolean useStructuralCommands = false; - private boolean useBriefTag = false; - private String fLineDelimiter; + private boolean useBriefTag; + private boolean useStructuralCommands; + private boolean useJavadocStyle; + private boolean newLineAfterBrief; + private boolean usePrePostTag; public DoxygenMultilineAutoEditStrategy() { } + private void refreshPreferences() { + Optional project = getProject(); + DoxygenPreferences pref = new DoxygenPreferences(project); + newLineAfterBrief = pref.getBooleanPref(DoxygenPreferences.DOXYGEN_NEW_LINE_AFTER_BRIEF, + DoxygenPreferences.DEF_DOXYGEN_NEW_LINE_AFTER_BRIEF); + useBriefTag = pref.getBooleanPref(DoxygenPreferences.DOXYGEN_USE_BRIEF_TAG, + DoxygenPreferences.DEF_DOXYGEN_USE_BRIEF_TAG); + useJavadocStyle = pref.getBooleanPref(DoxygenPreferences.DOXYGEN_USE_JAVADOC_TAGS, + DoxygenPreferences.DEF_DOXYGEN_USE_JAVADOC_TAGS); + usePrePostTag = pref.getBooleanPref(DoxygenPreferences.DOXYGEN_USE_PRE_POST_TAGS, + DoxygenPreferences.DEF_DOXYGEN_USE_PRE_POST_TAGS); + useStructuralCommands = pref.getBooleanPref(DoxygenPreferences.DOXYGEN_USE_STRUCTURAL_COMMANDS, + DoxygenPreferences.DEF_DOXYGEN_USE_STRUCTURED_COMMANDS); + } + private String getPrefix() { - return javadocStyle ? PREFIX_JAVADOC : PREFIX_NO_JAVADOC; + return useJavadocStyle ? PREFIX_JAVADOC : PREFIX_NO_JAVADOC; + } + + private StringBuilder getBriefTag() { + StringBuilder result = new StringBuilder(); + if (useBriefTag) { + result.append(getPrefix()).append(BRIEF).append(getLineDelimiter()); + if (newLineAfterBrief) { + result.append(getLineDelimiter()); + } + } + return result; + } + + private StringBuilder getPrePostTag() { + StringBuilder result = new StringBuilder(); + if (usePrePostTag) { + result.append(getPrefix()).append(PRE).append(getLineDelimiter()).append(getPrefix()).append(POST) + .append(getLineDelimiter()); + } + return result; } /** @@ -129,9 +170,7 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut break; } } - if (useBriefTag) - result.append(getPrefix()).append(BRIEF).append(getLineDelimiter()).append(getLineDelimiter()) - .append(getLineDelimiter()).append(documentTemplateParameters(templateParams)); + result.append(getBriefTag()).append(documentTemplateParameters(templateParams)); return result; } @@ -148,13 +187,11 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut StringBuilder result = new StringBuilder(); if (useStructuralCommands) { - result.append(getPrefix()).append(FUNC).append(ASTStringUtil.getSignatureString(ds, decl)) - .append(getLineDelimiter()); - } - if (useBriefTag) { - result.append(getPrefix()).append(BRIEF).append(getLineDelimiter()).append(getLineDelimiter()) - .append(getLineDelimiter()).append(documentTemplateParameters(templateParams)); + result.append(getPrefix()).append(FUNC).append(ASTStringUtil.getSignatureString(ds, null)).append(" ") //$NON-NLS-1$ + .append(ASTStringUtil.getSimpleName(decl.getName())) + .append(ASTStringUtil.getSignatureString(null, decl)).append(getLineDelimiter()); } + result.append(getBriefTag()).append(getPrePostTag()).append(documentTemplateParameters(templateParams)); result.append(documentTemplateParameters(templateParams)); result.append(documentFunctionParameters(getParameterDecls(decl))); @@ -283,6 +320,7 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut @Override public StringBuilder customizeForDeclaration(IDocument doc, IASTNode declToDocument, ITypedRegion partition, CustomizeOptions options) { + refreshPreferences(); fLineDelimiter = TextUtilities.getDefaultLineDelimiter(doc); if (declToDocument instanceof ICPPASTLinkageSpecification) { @@ -385,10 +423,7 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut if (useStructuralCommands) result.append(getPrefix()).append(DEF).append(new String(dec.getName().getSimpleID())) .append(getLineDelimiter()); - if (useBriefTag) - result.append(getPrefix()).append(BRIEF).append(getLineDelimiter()).append(getLineDelimiter()) - .append(getLineDelimiter()); - return result; + return result.append(getBriefTag()); } /** @@ -402,10 +437,7 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut if (useStructuralCommands) result.append(getPrefix()).append(NAMESPACE).append(new String(dec.getName().getSimpleID())) .append(getLineDelimiter()); - if (useBriefTag) - result.append(getPrefix()).append(BRIEF).append(getLineDelimiter()).append(getLineDelimiter()) - .append(getLineDelimiter()); - return result; + return result.append(getBriefTag()); } /** @@ -419,10 +451,7 @@ public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAut if (useStructuralCommands) result.append(getPrefix()).append(ENUM).append(new String(dec.getName().getSimpleID())) .append(getLineDelimiter()); - if (useBriefTag) - result.append(getPrefix()).append(BRIEF).append(getLineDelimiter()).append(getLineDelimiter()) - .append(getLineDelimiter()); - return result; + return result.append(getBriefTag()); } /**