### Eclipse Workspace Patch 1.0 #P org.eclipse.core.filebuffers.tests Index: src/org/eclipse/core/filebuffers/tests/FileBuffersTestSuite.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.filebuffers.tests/src/org/eclipse/core/filebuffers/tests/FileBuffersTestSuite.java,v retrieving revision 1.7 diff -u -r1.7 FileBuffersTestSuite.java --- src/org/eclipse/core/filebuffers/tests/FileBuffersTestSuite.java 29 May 2007 16:38:49 -0000 1.7 +++ src/org/eclipse/core/filebuffers/tests/FileBuffersTestSuite.java 23 Jan 2008 15:41:40 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2007 IBM Corporation and others. + * Copyright (c) 2000, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.core.filebuffers.tests; @@ -38,6 +39,9 @@ suite.addTestSuite(FileStoreFileBuffersForExternalFiles.class); suite.addTestSuite(FileStoreFileBuffersForNonExistingExternalFiles.class); suite.addTestSuite(FileStoreFileBuffersForNonExistingWorkspaceFiles.class); + + suite.addTestSuite(TextFileManagerDocCreationTests.class); + suite.addTestSuite(ResourceTextFileManagerDocCreationTests.class); //$JUnit-END$ return suite; } Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.filebuffers.tests/META-INF/MANIFEST.MF,v retrieving revision 1.3 diff -u -r1.3 MANIFEST.MF --- META-INF/MANIFEST.MF 23 Jan 2008 08:47:31 -0000 1.3 +++ META-INF/MANIFEST.MF 23 Jan 2008 15:41:40 -0000 @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name -Bundle-SymbolicName: org.eclipse.core.filebuffers.tests +Bundle-SymbolicName: org.eclipse.core.filebuffers.tests;singleton:=true Bundle-Version: 3.4.0.qualifier Bundle-ClassPath: filebufferstests.jar Bundle-Activator: org.eclipse.core.filebuffers.tests.FileBuffersTestPlugin Index: build.properties =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.core.filebuffers.tests/build.properties,v retrieving revision 1.5 diff -u -r1.5 build.properties --- build.properties 29 Jun 2007 15:29:33 -0000 1.5 +++ build.properties 23 Jan 2008 15:41:40 -0000 @@ -13,7 +13,8 @@ about.html,\ testResources/,\ *.jar,\ - META-INF/ + META-INF/,\ + plugin.xml src.includes = about.html Index: src/org/eclipse/core/filebuffers/tests/ResourceTextFileManagerDocCreationTests.java =================================================================== RCS file: src/org/eclipse/core/filebuffers/tests/ResourceTextFileManagerDocCreationTests.java diff -N src/org/eclipse/core/filebuffers/tests/ResourceTextFileManagerDocCreationTests.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/filebuffers/tests/ResourceTextFileManagerDocCreationTests.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.core.filebuffers.tests; + +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.internal.filebuffers.ResourceTextFileBufferManager; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.Path; + +public class ResourceTextFileManagerDocCreationTests extends AbstractFileBufferDocCreationTests { + protected void setUp() throws Exception { + fManager= new ResourceTextFileBufferManager(); + } + + protected void assertDocumentContent(String expectedContent, String fullPath, LocationKind locKind) { + assertEquals(expectedContent, fManager.createEmptyDocument(new Path(fullPath), locKind).get()); + if(locKind.equals(LocationKind.IFILE)) { + IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fullPath)); + assertEquals(expectedContent, ((ResourceTextFileBufferManager)fManager).createEmptyDocument(file).get()); + } + } + + protected LocationKind[] getSupportLocationKinds() { + return new LocationKind[] {LocationKind.IFILE, LocationKind.LOCATION, LocationKind.NORMALIZE}; + } +} Index: plugin.xml =================================================================== RCS file: plugin.xml diff -N plugin.xml --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ plugin.xml 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/org/eclipse/core/filebuffers/tests/TextFileManagerDocCreationTests.java =================================================================== RCS file: src/org/eclipse/core/filebuffers/tests/TextFileManagerDocCreationTests.java diff -N src/org/eclipse/core/filebuffers/tests/TextFileManagerDocCreationTests.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/filebuffers/tests/TextFileManagerDocCreationTests.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.core.filebuffers.tests; + +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.internal.filebuffers.TextFileBufferManager; + +public class TextFileManagerDocCreationTests extends AbstractFileBufferDocCreationTests { + protected void setUp() throws Exception { + fManager= new TextFileBufferManager(); + } + + protected void assertDocumentContent(String expectedContent, String path, + LocationKind locKind) { + if(!locKind.equals(LocationKind.IFILE)) { + /** {@link TextFileBufferManager} does not deal with {@link LocationKind#IFILE} */ + super.assertDocumentContent(expectedContent, path, locKind); + } + } + + protected LocationKind[] getSupportLocationKinds() { + return new LocationKind[] {LocationKind.LOCATION, LocationKind.NORMALIZE}; + } +} Index: src/org/eclipse/core/filebuffers/tests/MockDocumentSetupParticipants.java =================================================================== RCS file: src/org/eclipse/core/filebuffers/tests/MockDocumentSetupParticipants.java diff -N src/org/eclipse/core/filebuffers/tests/MockDocumentSetupParticipants.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/filebuffers/tests/MockDocumentSetupParticipants.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,87 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.core.filebuffers.tests; + +import org.eclipse.core.filebuffers.IDocumentSetupParticipant; +import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; + +/** + * Holds {@link IDocumentSetupParticipant}'s for registering against fictional + * document extensions for test purposes. + */ +public class MockDocumentSetupParticipants { + /** + * An {@link IDocumentSetupParticipant} which stamps its name + * into the document being setup for integration test purposes. + */ + static abstract class AbstractTestDSP implements IDocumentSetupParticipant { + /* + * @see org.eclipse.core.filebuffers.IDocumentSetupParticipant#setup(org.eclipse.jface.text.IDocument) + */ + public void setup(IDocument document) { + append(document, getClass()+"\n"); + } + } + + static abstract class AbstractTestDSPExtension extends AbstractTestDSP implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension { + /* + * @see org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension#setup(org.eclipse.jface.text.IDocument, org.eclipse.core.runtime.IPath, org.eclipse.core.filebuffers.LocationKind) + */ + public void setup(IDocument document, IPath location, LocationKind locationKind) { + append(document, getClass()+"%%EXTENSION\n"); + } + } + + public static class TestDSP1 extends AbstractTestDSP {} + public static class TestDSP2 extends AbstractTestDSP {} + public static class TestDSP3 extends AbstractTestDSP {} + + public static class TestDSP4 extends AbstractTestDSPExtension {} + public static class TestDSP5 extends AbstractTestDSPExtension {} + public static class TestDSP6 extends AbstractTestDSPExtension {} + + public static class TestDSP7 extends AbstractTestDSPExtension { + public void setup(IDocument document, IPath location, LocationKind locationKind) { + if(location!=null && LocationKind.IFILE.equals(locationKind)) { + append(document, new StringBuffer(location.toPortableString()).reverse().toString()); + } + } + } + + public static class TestDSP8 extends AbstractTestDSPExtension { + public void setup(IDocument document, IPath location, LocationKind locationKind) { + if(location!=null && LocationKind.LOCATION.equals(locationKind)) { + append(document, new StringBuffer(location.toPortableString()).reverse().toString()); + } + } + } + + public static class TestDSP9 extends AbstractTestDSPExtension { + public void setup(IDocument document, IPath location, LocationKind locationKind) { + if(location!=null && LocationKind.NORMALIZE.equals(locationKind)) { + append(document, new StringBuffer(location.toPortableString()).reverse().toString()); + } + } + } + + private static void append(IDocument document, String string) { + try { + document.replace(document.getLength(), 0, string); + } catch(BadLocationException ble) { + Assert.isTrue(false); + } + } +} Index: src/org/eclipse/core/filebuffers/tests/AbstractFileBufferDocCreationTests.java =================================================================== RCS file: src/org/eclipse/core/filebuffers/tests/AbstractFileBufferDocCreationTests.java diff -N src/org/eclipse/core/filebuffers/tests/AbstractFileBufferDocCreationTests.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/core/filebuffers/tests/AbstractFileBufferDocCreationTests.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,134 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.core.filebuffers.tests; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import junit.framework.TestCase; + +import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; +import org.eclipse.core.filebuffers.ITextFileBufferManager; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants.TestDSP1; +import org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants.TestDSP2; +import org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants.TestDSP3; +import org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants.TestDSP4; +import org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants.TestDSP5; +import org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants.TestDSP6; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.text.IDocument; + +public abstract class AbstractFileBufferDocCreationTests extends TestCase { + protected ITextFileBufferManager fManager; + + + public void testCreateDocumentPartipants_FileExt() { + assertParticipantsInvoked("anything.111foo", new Class[] {TestDSP1.class, TestDSP3.class}); + } + + public void testCreateDocumentPartipants_Name() { + assertParticipantsInvoked("111fooname", new Class[] {TestDSP2.class, TestDSP3.class}); + } + + public void testCreateDocumentPartipants_FileExt_Name() { + assertParticipantsInvoked("111fooname.111foo", new Class[] {TestDSP1.class, TestDSP2.class, TestDSP3.class}); + } + + public void testCreateDocumentPartipants_FileExt_Extension() { + assertParticipantsInvoked("anything.222foo", new Class[] {TestDSP4.class, TestDSP6.class}); + } + + public void testCreateDocumentPartipants_Name_Extension() { + assertParticipantsInvoked("222fooname", new Class[] {TestDSP5.class, TestDSP6.class}); + } + + public void testCreateDocumentPartipants_FileExt_Name_Extension() { + assertParticipantsInvoked("222fooname.222foo", new Class[] {TestDSP4.class, TestDSP5.class, TestDSP6.class}); + } + + public void testDocumentSetupParticipantExtension_1() { + assertDocumentContent("emanoof333/p/", "/p/333fooname", LocationKind.IFILE); + assertDocumentContent("oof333.emanoof333/p/", "/p/333fooname.333foo", LocationKind.IFILE); + assertDocumentContent("oof333.gnihtyna/p/", "/p/anything.333foo", LocationKind.IFILE); + + assertDocumentContent("", "333fooname", LocationKind.LOCATION); + assertDocumentContent("", "333fooname.333foo", LocationKind.LOCATION); + assertDocumentContent("", "anything.333foo", LocationKind.LOCATION); + + assertDocumentContent("", "333fooname", LocationKind.NORMALIZE); + assertDocumentContent("", "333fooname.333foo", LocationKind.NORMALIZE); + assertDocumentContent("", "anything.333foo", LocationKind.NORMALIZE); + } + + public void testDocumentSetupParticipantExtension_2() { + assertDocumentContent("", "/p/444fooname", LocationKind.IFILE); + assertDocumentContent("", "/p/444fooname.444foo", LocationKind.IFILE); + assertDocumentContent("", "/p/anything.444foo", LocationKind.IFILE); + + assertDocumentContent("emanoof444", "444fooname", LocationKind.LOCATION); + assertDocumentContent("oof444.emanoof444", "444fooname.444foo", LocationKind.LOCATION); + assertDocumentContent("oof444.gnihtyna", "anything.444foo", LocationKind.LOCATION); + + assertDocumentContent("", "444fooname", LocationKind.NORMALIZE); + assertDocumentContent("", "444fooname.444foo", LocationKind.NORMALIZE); + assertDocumentContent("", "anything.444foo", LocationKind.NORMALIZE); + } + + public void testDocumentSetupParticipantExtension_3() { + assertDocumentContent("", "/p/555fooname", LocationKind.IFILE); + assertDocumentContent("", "/p/555fooname.555foo", LocationKind.IFILE); + assertDocumentContent("", "/p/anything.555foo", LocationKind.IFILE); + + assertDocumentContent("", "555fooname", LocationKind.LOCATION); + assertDocumentContent("", "555fooname.555foo", LocationKind.LOCATION); + assertDocumentContent("", "anything.555foo", LocationKind.LOCATION); + + assertDocumentContent("emanoof555", "555fooname", LocationKind.NORMALIZE); + assertDocumentContent("oof555.emanoof555", "555fooname.555foo", LocationKind.NORMALIZE); + assertDocumentContent("oof555.gnihtyna", "anything.555foo", LocationKind.NORMALIZE); + } + + /* Utilities */ + + private void assertParticipantsInvoked(String path, Class[] expectedDSPsArray) { + LocationKind[] lks= getSupportLocationKinds(); + for(int i=0; ilocation/locationKind is not available, the + * workspace default is returned. + */ + private IDocCommentOwner getDocumentationCommentOwner(IPath location, LocationKind locationKind) { + if(location!=null && LocationKind.IFILE.equals(locationKind)) { + IFile file= ResourcesPlugin.getWorkspace().getRoot().getFile(location); + return DocCommentOwnerManager.getInstance().getCommentOwner(file); + } + return DocCommentOwnerManager.getInstance().getWorkspaceCommentOwner(); + } } Index: src/org/eclipse/cdt/internal/ui/text/CCommentAutoIndentStrategy.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/CCommentAutoIndentStrategy.java diff -N src/org/eclipse/cdt/internal/ui/text/CCommentAutoIndentStrategy.java --- src/org/eclipse/cdt/internal/ui/text/CCommentAutoIndentStrategy.java 3 Jul 2006 13:01:44 -0000 1.4 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,122 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2006 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM Corporation - initial API and implementation - * QNX Software System - * Anton Leherbauer (Wind River Systems) - Fixed bug 48339 - *******************************************************************************/ -package org.eclipse.cdt.internal.ui.text; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy; -import org.eclipse.jface.text.DocumentCommand; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; - -/** - * Auto indent strategy for C/C++ multiline comments - */ -public class CCommentAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy { - - public CCommentAutoIndentStrategy() { - } - - /** - * Returns whether the text ends with one of the given search strings. - */ - private boolean endsWithDelimiter(IDocument d, String txt) { - String[] delimiters= d.getLegalLineDelimiters(); - - for (int i= 0; i < delimiters.length; i++) { - if (txt.endsWith(delimiters[i])) - return true; - } - - return false; - } - - /** - * Copies the indentation of the previous line and adds a star. - * If the comment just started on this line adds also a blank. - * - * @param d the document to work on - * @param c the command to deal with - */ - static void commentIndentAfterNewLine(IDocument d, DocumentCommand c) { - - if (c.offset == -1 || d.getLength() == 0) - return; - - try { - // find start of line - IRegion info= d.getLineInformationOfOffset(c.offset); - int start= info.getOffset(); - - // find white spaces - int end= findEndOfWhiteSpaceAt(d, start, c.offset); - - StringBuffer buf= new StringBuffer(c.text); - if (end >= start) { // 1GEYL1R: ITPJUI:ALL - java doc edit smartness not work for class comments - // append to input - buf.append(d.get(start, end - start)); - if (end < c.offset) { - if (d.getChar(end) == '/') { - // comment started on this line - buf.append(" * "); //$NON-NLS-1$ - } else if (d.getChar(end) == '*') { - buf.append("* "); //$NON-NLS-1$ - } - } - } - - - c.text= buf.toString(); - - } catch (BadLocationException excp) { - // stop work - } - } - - static int findEndOfWhiteSpaceAt(IDocument document, int offset, int end) throws BadLocationException { - while (offset < end) { - char c= document.getChar(offset); - if (c != ' ' && c != '\t') { - return offset; - } - offset++; - } - return end; - } - - static void commentIndentForCommentEnd(IDocument d, DocumentCommand c) { - if (c.offset < 2 || d.getLength() == 0) { - return; - } - try { - if ("* ".equals(d.get(c.offset - 2, 2))) { //$NON-NLS-1$ - // modify document command - c.length++; - c.offset--; - } - } catch (BadLocationException excp) { - // stop work - } - } - - /* - * @see IAutoIndentStrategy#customizeDocumentCommand - */ - public void customizeDocumentCommand(IDocument d, DocumentCommand c) { - if (c.length == 0 && c.text != null && endsWithDelimiter(d, c.text)) - commentIndentAfterNewLine(d, c); - else if ("/".equals(c.text)) { //$NON-NLS-1$ - commentIndentForCommentEnd(d, c); - } - } -} - Index: src/org/eclipse/cdt/internal/ui/text/CCommentScanner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCommentScanner.java,v retrieving revision 1.10 diff -u -r1.10 CCommentScanner.java --- src/org/eclipse/cdt/internal/ui/text/CCommentScanner.java 30 May 2007 11:08:06 -0000 1.10 +++ src/org/eclipse/cdt/internal/ui/text/CCommentScanner.java 23 Jan 2008 15:41:43 -0000 @@ -8,152 +8,49 @@ * Contributors: * IBM Corporation - initial API and implementation * Anton Leherbauer (Wind River Systems) + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text; - -import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.StringTokenizer; -import org.eclipse.cdt.core.CCorePreferenceConstants; import org.eclipse.core.runtime.Preferences; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.IWordDetector; -import org.eclipse.jface.text.rules.Token; -import org.eclipse.jface.text.rules.WordRule; -import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.cdt.ui.PreferenceConstants; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; +import org.eclipse.cdt.ui.text.TaskTagRule; /** - * CCommentScanner.java + * Default token-scanner used for plain (non-documentation-comment) single and multi-line comments, with awareness of + * task tags. */ -public class CCommentScanner extends AbstractCScanner -{ - private static class TaskTagDetector implements IWordDetector { - - public boolean isWordStart(char c) { - return Character.isLetter(c); - } - - public boolean isWordPart(char c) { - return Character.isLetter(c); - } - } - - private class TaskTagRule extends WordRule { - - private IToken fToken; - - public TaskTagRule(IToken token) { - super(new TaskTagDetector(), Token.UNDEFINED); - fToken= token; - } - - public void clearTaskTags() { - fWords.clear(); - } - - public void addTaskTags(String value) { - String[] tasks= split(value, ","); //$NON-NLS-1$ - for (int i= 0; i < tasks.length; i++) { - if (tasks[i].length() > 0) { - addWord(tasks[i], fToken); - } - } - } - - private String[] split(String value, String delimiters) { - StringTokenizer tokenizer= new StringTokenizer(value, delimiters); - int size= tokenizer.countTokens(); - String[] tokens= new String[size]; - for (int i = 0; i < size; i++) - tokens[i] = tokenizer.nextToken(); - return tokens; - } - } - - private static final String TODO_TASK_TAGS= CCorePreferenceConstants.TODO_TASK_TAGS; - protected static final String TASK_TAG= ICColorConstants.TASK_TAG; - - private TaskTagRule fTaskTagRule; - private Preferences fCorePreferenceStore; - private String fDefaultTokenProperty; - private String[] fTokenProperties; - - public CCommentScanner(IColorManager manager, IPreferenceStore store, String defaultTokenProperty) { - this(manager, store, null, defaultTokenProperty, new String[] { defaultTokenProperty, TASK_TAG }); - } - - public CCommentScanner(IColorManager manager, IPreferenceStore store, Preferences coreStore, String defaultTokenProperty) { - this(manager, store, coreStore, defaultTokenProperty, new String[] { defaultTokenProperty, TASK_TAG }); - } - - public CCommentScanner(IColorManager manager, IPreferenceStore store, Preferences coreStore, String defaultTokenProperty, String[] tokenProperties) { - super(manager, store); - - fCorePreferenceStore= coreStore; - fDefaultTokenProperty= defaultTokenProperty; - fTokenProperties= tokenProperties; - - initialize(); - } - - /* - * @see AbstractCScanner#createRules() - */ - protected List createRules() { - List list= new ArrayList(); - - String tasks= null; - if (getPreferenceStore().contains(TODO_TASK_TAGS)) { - tasks= getPreferenceStore().getString(TODO_TASK_TAGS); - } else if (fCorePreferenceStore != null) { - tasks= fCorePreferenceStore.getString(TODO_TASK_TAGS); - } - - if (tasks != null) { - // Add rule for Task Tags. - fTaskTagRule= new TaskTagRule(getToken(TASK_TAG)); - fTaskTagRule.addTaskTags(tasks); - list.add(fTaskTagRule); - } - - setDefaultReturnToken(getToken(fDefaultTokenProperty)); - - return list; - } - - /* - * @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#affectsBehavior(org.eclipse.jface.util.PropertyChangeEvent) - */ - public boolean affectsBehavior(PropertyChangeEvent event) { - return event.getProperty().equals(TODO_TASK_TAGS) || super.affectsBehavior(event); - } - - /* - * @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#adaptToPreferenceChange(org.eclipse.jface.util.PropertyChangeEvent) - */ - public void adaptToPreferenceChange(PropertyChangeEvent event) { - if (fTaskTagRule != null && event.getProperty().equals(TODO_TASK_TAGS)) { - Object value= event.getNewValue(); - - if (value instanceof String) { - fTaskTagRule.clearTaskTags(); - fTaskTagRule.addTaskTags((String) value); - } - - } else if (super.affectsBehavior(event)) { - super.adaptToPreferenceChange(event); - } - } - - /* - * @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#getTokenProperties() - */ - protected String[] getTokenProperties() { - return fTokenProperties; - } - +public class CCommentScanner extends AbstractCScanner { + private static String TASK_TAG_KEY= PreferenceConstants.EDITOR_TASK_TAG_COLOR; + private Preferences fCorePreferenceStore; + + public CCommentScanner(ITokenStoreFactory tokenStoreFactory, String defaultTokenProperty) { + this(tokenStoreFactory, null, defaultTokenProperty, new String[] { defaultTokenProperty, TASK_TAG_KEY }); + } + + public CCommentScanner(ITokenStoreFactory tokenStoreFactory, Preferences coreStore, String defaultTokenProperty) { + this(tokenStoreFactory, coreStore, defaultTokenProperty, new String[] { defaultTokenProperty, TASK_TAG_KEY }); + } + + private CCommentScanner(ITokenStoreFactory tokenStoreFactory, Preferences coreStore, String defaultTokenProperty, String[] tokenProperties) { + super(tokenStoreFactory.createTokenStore(tokenProperties)); + fCorePreferenceStore= coreStore; + setRules(createRules(defaultTokenProperty)); + } + + protected List createRules(String defaultTokenProperty) { + setDefaultReturnToken(getToken(defaultTokenProperty)); + + IPreferenceStore store= fTokenStore.getPreferenceStore(); + String taskWords= TaskTagRule.getTaskWords(store, fCorePreferenceStore); + TaskTagRule taskTagRule= new TaskTagRule(getToken(TASK_TAG_KEY), taskWords); + addPropertyChangeParticipant(taskTagRule); + return Collections.singletonList(taskTagRule); + } } Index: src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java,v retrieving revision 1.70 diff -u -r1.70 CSourceViewerConfiguration.java --- src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java 18 Jan 2008 15:54:17 -0000 1.70 +++ src/org/eclipse/cdt/internal/ui/text/CSourceViewerConfiguration.java 23 Jan 2008 15:41:43 -0000 @@ -11,12 +11,15 @@ * Anton Leherbauer (Wind River Systems) * Sergey Prigogin (Google) * Markus Schorn (Wind River Systems) + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text; import java.util.Arrays; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; @@ -77,6 +80,12 @@ import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.ILanguageUI; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.ICTokenScanner; +import org.eclipse.cdt.ui.text.ITokenStore; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; +import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; +import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; import org.eclipse.cdt.internal.corext.util.CodeFormatterUtil; @@ -90,6 +99,7 @@ import org.eclipse.cdt.internal.ui.text.contentassist.CContentAssistProcessor; import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference; import org.eclipse.cdt.internal.ui.text.correction.CCorrectionAssistant; +import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; import org.eclipse.cdt.internal.ui.typehierarchy.THInformationControl; import org.eclipse.cdt.internal.ui.typehierarchy.THInformationProvider; @@ -111,11 +121,11 @@ /** * The C multi-line comment scanner. */ - private AbstractCScanner fMultilineCommentScanner; + private ICTokenScanner fMultilineDocCommentScanner; /** * The C single-line comment scanner. */ - private AbstractCScanner fSinglelineCommentScanner; + private ICTokenScanner fSinglelineDocCommentScanner; /** * The C string scanner. */ @@ -147,24 +157,6 @@ } /** - * Returns the C multi-line comment scanner for this configuration. - * - * @return the C multi-line comment scanner - */ - protected RuleBasedScanner getMultilineCommentScanner() { - return fMultilineCommentScanner; - } - - /** - * Returns the C single-line comment scanner for this configuration. - * - * @return the C single-line comment scanner - */ - protected RuleBasedScanner getSinglelineCommentScanner() { - return fSinglelineCommentScanner; - } - - /** * Returns the C string scanner for this configuration. * * @return the C string scanner @@ -184,10 +176,10 @@ } AbstractCScanner scanner= null; if (language instanceof ICLanguageKeywords) { - scanner= new CPreprocessorScanner(getColorManager(), fPreferenceStore, (ICLanguageKeywords)language); + scanner= new CPreprocessorScanner(getTokenStoreFactory(), (ICLanguageKeywords)language); } if (scanner == null) { - scanner= new CPreprocessorScanner(getColorManager(), fPreferenceStore, GPPLanguage.getDefault()); + scanner= new CPreprocessorScanner(getTokenStoreFactory(), GPPLanguage.getDefault()); } fPreprocessorScanner= scanner; return fPreprocessorScanner; @@ -250,14 +242,12 @@ presenter.setSizeConstraints(50, 20, true, false); return presenter; } - + /** * Initializes the scanners. */ private void initializeScanners() { - fMultilineCommentScanner= new CCommentScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_MULTI_LINE_COMMENT); - fSinglelineCommentScanner= new CCommentScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_SINGLE_LINE_COMMENT); - fStringScanner= new SingleTokenCScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_STRING); + fStringScanner= new SingleTokenCScanner(getTokenStoreFactory(), ICColorConstants.C_STRING); } /** @@ -274,17 +264,29 @@ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); - - //TextAttribute attr = new TextAttribute(manager.getColor(ICColorConstants.C_DEFAULT)); - dr= new DefaultDamagerRepairer(getSinglelineCommentScanner()); + dr= new DefaultDamagerRepairer(new CCommentScanner(getTokenStoreFactory(), ICColorConstants.C_SINGLE_LINE_COMMENT)); reconciler.setDamager(dr, ICPartitions.C_SINGLE_LINE_COMMENT); reconciler.setRepairer(dr, ICPartitions.C_SINGLE_LINE_COMMENT); - - dr= new DefaultDamagerRepairer(getMultilineCommentScanner()); + + dr= new DefaultDamagerRepairer(new CCommentScanner(getTokenStoreFactory(), ICColorConstants.C_MULTI_LINE_COMMENT)); reconciler.setDamager(dr, ICPartitions.C_MULTI_LINE_COMMENT); reconciler.setRepairer(dr, ICPartitions.C_MULTI_LINE_COMMENT); - + + ICTokenScanner docCommentSingleScanner= getSinglelineDocCommentScanner(getProject()); + if(docCommentSingleScanner!=null) { + dr= new DefaultDamagerRepairer(docCommentSingleScanner); + reconciler.setDamager(dr, ICPartitions.C_SINGLE_LINE_DOC_COMMENT); + reconciler.setRepairer(dr, ICPartitions.C_SINGLE_LINE_DOC_COMMENT); + } + + ICTokenScanner docCommentMultiScanner= getMultilineDocCommentScanner(getProject()); + if(docCommentMultiScanner!=null) { + dr= new DefaultDamagerRepairer(docCommentMultiScanner); + reconciler.setDamager(dr, ICPartitions.C_MULTI_LINE_DOC_COMMENT); + reconciler.setRepairer(dr, ICPartitions.C_MULTI_LINE_DOC_COMMENT); + } + dr= new DefaultDamagerRepairer(getStringScanner()); reconciler.setDamager(dr, ICPartitions.C_STRING); reconciler.setRepairer(dr, ICPartitions.C_STRING); @@ -299,8 +301,34 @@ return reconciler; } + + /** + * Returns the C multi-line comment scanner for this configuration. + * + * @return the C multi-line comment scanner + */ + protected ICTokenScanner getMultilineDocCommentScanner(IResource resource) { + if (fMultilineDocCommentScanner == null) { + IDocCommentViewerConfiguration owner= DocCommentOwnerManager.getInstance().getCommentOwner(resource).getMultilineConfiguration(); + fMultilineDocCommentScanner= owner.createCommentScanner(getTokenStoreFactory()); + } + return fMultilineDocCommentScanner; + } /** + * Returns the C single-line comment scanner for this configuration. + * + * @return the C single-line comment scanner + */ + protected ICTokenScanner getSinglelineDocCommentScanner(IResource resource) { + if (fSinglelineDocCommentScanner == null) { + IDocCommentViewerConfiguration owner= DocCommentOwnerManager.getInstance().getCommentOwner(resource).getSinglelineConfiguration(); + fSinglelineDocCommentScanner= owner.createCommentScanner(getTokenStoreFactory()); + } + return fSinglelineDocCommentScanner; + } + + /** * @return the code scanner for the given language */ protected RuleBasedScanner getCodeScanner(ILanguage language) { @@ -310,14 +338,14 @@ RuleBasedScanner scanner= null; if (language instanceof ICLanguageKeywords) { ICLanguageKeywords cLang= (ICLanguageKeywords)language; - scanner = new CCodeScanner(getColorManager(), fPreferenceStore, cLang); + scanner = new CCodeScanner(getTokenStoreFactory(), cLang); } else if (language != null) { ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); if (languageUI != null) scanner = languageUI.getCodeScanner(); } if (scanner == null) { - scanner = new CCodeScanner(getColorManager(), fPreferenceStore, GPPLanguage.getDefault()); + scanner = new CCodeScanner(getTokenStoreFactory(), GPPLanguage.getDefault()); } if (scanner instanceof AbstractCScanner) { fCodeScanner= (AbstractCScanner)scanner; @@ -347,6 +375,12 @@ processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_SINGLE_LINE_COMMENT); assistant.setContentAssistProcessor(processor, ICPartitions.C_SINGLE_LINE_COMMENT); + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_MULTI_LINE_DOC_COMMENT); + assistant.setContentAssistProcessor(processor, ICPartitions.C_MULTI_LINE_DOC_COMMENT); + + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_SINGLE_LINE_DOC_COMMENT); + assistant.setContentAssistProcessor(processor, ICPartitions.C_SINGLE_LINE_DOC_COMMENT); + processor = new CContentAssistProcessor(getEditor(), sourceViewer, assistant, ICPartitions.C_STRING); assistant.setContentAssistProcessor(processor, ICPartitions.C_STRING); @@ -410,26 +444,46 @@ */ public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) { String partitioning= getConfiguredDocumentPartitioning(sourceViewer); + + IDocCommentOwner owner= DocCommentOwnerManager.getInstance().getCommentOwner(getProject()); + IAutoEditStrategy single= owner.getSinglelineConfiguration().createAutoEditStrategy(); + IAutoEditStrategy multi= owner.getMultilineConfiguration().createAutoEditStrategy(); + + IAutoEditStrategy[] NONE= new IAutoEditStrategy[0]; + if (ICPartitions.C_MULTI_LINE_COMMENT.equals(contentType)) - return new IAutoEditStrategy[] { new CCommentAutoIndentStrategy() }; + return new IAutoEditStrategy[] { new DefaultMultilineCommentAutoEditStrategy() }; + if (ICPartitions.C_SINGLE_LINE_DOC_COMMENT.equals(contentType)) + return single!=null ? new IAutoEditStrategy[] {single} : NONE; + else if (ICPartitions.C_MULTI_LINE_DOC_COMMENT.equals(contentType)) + return multi!=null? new IAutoEditStrategy[] {multi} : NONE; else if (ICPartitions.C_STRING.equals(contentType)) - return new IAutoEditStrategy[] { /*new SmartSemicolonAutoEditStrategy(partitioning),*/ new CStringAutoIndentStrategy(partitioning, getProject()) }; + return new IAutoEditStrategy[] { /*new SmartSemicolonAutoEditStrategy(partitioning),*/ new CStringAutoIndentStrategy(partitioning, getCProject()) }; else - return new IAutoEditStrategy[] { new CAutoIndentStrategy(partitioning, getProject()) }; + return new IAutoEditStrategy[] { new CAutoIndentStrategy(partitioning, getCProject()) }; } - + /** * @see SourceViewerConfiguration#getDoubleClickStrategy(ISourceViewer, String) */ public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) { if (ICPartitions.C_MULTI_LINE_COMMENT.equals(contentType) || - ICPartitions.C_SINGLE_LINE_COMMENT.equals(contentType)) + ICPartitions.C_SINGLE_LINE_COMMENT.equals(contentType)) { return new DefaultTextDoubleClickStrategy(); - else if (ICPartitions.C_STRING.equals(contentType) || - ICPartitions.C_CHARACTER.equals(contentType)) + } else if (ICPartitions.C_SINGLE_LINE_DOC_COMMENT.equals(contentType)) { + IDocCommentOwner owner= DocCommentOwnerManager.getInstance().getCommentOwner(getProject()); + ITextDoubleClickStrategy single= owner.getSinglelineConfiguration().createDoubleClickStrategy(); + return single != null ? single : new DefaultTextDoubleClickStrategy(); + } else if(ICPartitions.C_MULTI_LINE_DOC_COMMENT.equals(contentType)) { + IDocCommentOwner owner= DocCommentOwnerManager.getInstance().getCommentOwner(getProject()); + ITextDoubleClickStrategy multi= owner.getMultilineConfiguration().createDoubleClickStrategy(); + return multi!=null ? multi : new DefaultTextDoubleClickStrategy(); + } else if (ICPartitions.C_STRING.equals(contentType) || + ICPartitions.C_CHARACTER.equals(contentType)) { return new CStringDoubleClickSelector(getConfiguredDocumentPartitioning(sourceViewer)); - else if (ICPartitions.C_PREPROCESSOR.equals(contentType)) + } else if (ICPartitions.C_PREPROCESSOR.equals(contentType)) { return new CStringDoubleClickSelector(getConfiguredDocumentPartitioning(sourceViewer), new CDoubleClickSelector()); + } return new CDoubleClickSelector(); } @@ -444,7 +498,7 @@ * @see SourceViewerConfiguration#getIndentPrefixes(ISourceViewer, String) */ public String[] getIndentPrefixes(ISourceViewer sourceViewer, String contentType) { - ICProject project= getProject(); + ICProject project= getCProject(); final int tabWidth= CodeFormatterUtil.getTabWidth(project); final int indentWidth= CodeFormatterUtil.getIndentWidth(project); boolean allowTabs= tabWidth <= indentWidth; @@ -504,7 +558,12 @@ return new String(spaceChars); } - private ICProject getProject() { + /** + * Returns the ICProject associated with this CSourceViewerConfiguration, or null if + * no ICProject could be determined + * @return + */ + private ICProject getCProject() { ITextEditor editor= getEditor(); if (editor == null) return null; @@ -527,7 +586,7 @@ * @see SourceViewerConfiguration#getTabWidth(ISourceViewer) */ public int getTabWidth(ISourceViewer sourceViewer) { - return CodeFormatterUtil.getTabWidth(getProject()); + return CodeFormatterUtil.getTabWidth(getCProject()); } /** @@ -603,7 +662,10 @@ ICPartitions.C_SINGLE_LINE_COMMENT, ICPartitions.C_STRING, ICPartitions.C_CHARACTER, - ICPartitions.C_PREPROCESSOR}; + ICPartitions.C_PREPROCESSOR, + ICPartitions.C_SINGLE_LINE_DOC_COMMENT, + ICPartitions.C_MULTI_LINE_DOC_COMMENT + }; } /** @@ -620,8 +682,8 @@ } public boolean affectsBehavior(PropertyChangeEvent event) { - if (fMultilineCommentScanner.affectsBehavior(event) - || fSinglelineCommentScanner.affectsBehavior(event) + if ((fMultilineDocCommentScanner != null && fMultilineDocCommentScanner.affectsBehavior(event)) + || (fSinglelineDocCommentScanner != null && fSinglelineDocCommentScanner.affectsBehavior(event)) || fStringScanner.affectsBehavior(event)) { return true; } @@ -714,10 +776,10 @@ public void handlePropertyChangeEvent(PropertyChangeEvent event) { if (fCodeScanner != null && fCodeScanner.affectsBehavior(event)) fCodeScanner.adaptToPreferenceChange(event); - if (fMultilineCommentScanner.affectsBehavior(event)) - fMultilineCommentScanner.adaptToPreferenceChange(event); - if (fSinglelineCommentScanner.affectsBehavior(event)) - fSinglelineCommentScanner.adaptToPreferenceChange(event); + if (fMultilineDocCommentScanner!=null && fMultilineDocCommentScanner.affectsBehavior(event)) + fMultilineDocCommentScanner.adaptToPreferenceChange(event); + if (fSinglelineDocCommentScanner!=null && fSinglelineDocCommentScanner.affectsBehavior(event)) + fSinglelineDocCommentScanner.adaptToPreferenceChange(event); if (fStringScanner.affectsBehavior(event)) fStringScanner.adaptToPreferenceChange(event); if (fPreprocessorScanner != null && fPreprocessorScanner.affectsBehavior(event)) @@ -833,9 +895,11 @@ */ public void resetScanners() { fCodeScanner= null; + fMultilineDocCommentScanner= null; + fSinglelineDocCommentScanner= null; fPreprocessorScanner= null; } - + /** * Creates macro exploration presenter. * @param sourceViewer @@ -873,6 +937,20 @@ }; return conrolCreator; } + + private IProject getProject() { + ICProject cproject= getCProject(); + if(cproject!=null) { + return cproject.getProject(); + } + return null; + } - -} + private ITokenStoreFactory getTokenStoreFactory() { + return new ITokenStoreFactory() { + public ITokenStore createTokenStore(String[] propertyColorNames) { + return new TokenStore(getColorManager(), fPreferenceStore, propertyColorNames); + } + }; + } +} \ No newline at end of file Index: src/org/eclipse/cdt/internal/ui/text/CPreprocessorScanner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CPreprocessorScanner.java,v retrieving revision 1.5 diff -u -r1.5 CPreprocessorScanner.java --- src/org/eclipse/cdt/internal/ui/text/CPreprocessorScanner.java 21 Jan 2008 13:58:32 -0000 1.5 +++ src/org/eclipse/cdt/internal/ui/text/CPreprocessorScanner.java 23 Jan 2008 15:41:43 -0000 @@ -7,20 +7,21 @@ * * Contributors: * Anton Leherbauer (Wind River Systems) - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text; import java.util.ArrayList; import java.util.List; -import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.PatternRule; -import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; import org.eclipse.cdt.core.model.ICLanguageKeywords; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; import org.eclipse.cdt.internal.ui.text.util.CWhitespaceDetector; import org.eclipse.cdt.internal.ui.text.util.CWordDetector; @@ -45,15 +46,12 @@ /** * Creates a C/C++ preprocessor scanner. - * - * @param manager the color manager - * @param store the preference store * @param keywords the keywords defined by the language dialect */ - public CPreprocessorScanner(IColorManager manager, IPreferenceStore store, ICLanguageKeywords keywords) { - super(manager, store); + public CPreprocessorScanner(ITokenStoreFactory factory, ICLanguageKeywords keywords) { + super(factory.createTokenStore(fgTokenProperties)); fKeywords= keywords; - initialize(); + setRules(createRules()); } /* @@ -61,10 +59,10 @@ */ protected List createRules() { - Token defaultToken= getToken(ICColorConstants.PP_DEFAULT); + IToken defaultToken= getToken(ICColorConstants.PP_DEFAULT); List rules= new ArrayList(); - Token token; + IToken token; // Add generic white space rule. rules.add(new WhitespaceRule(new CWhitespaceDetector())); @@ -110,12 +108,4 @@ setDefaultReturnToken(defaultToken); return rules; } - - /* - * @see org.eclipse.cdt.internal.ui.text.AbstractCScanner#getTokenProperties() - */ - protected String[] getTokenProperties() { - return fgTokenProperties; - } - } Index: src/org/eclipse/cdt/internal/ui/text/CAutoIndentStrategy.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CAutoIndentStrategy.java,v retrieving revision 1.19 diff -u -r1.19 CAutoIndentStrategy.java --- src/org/eclipse/cdt/internal/ui/text/CAutoIndentStrategy.java 15 Jan 2008 13:10:05 -0000 1.19 +++ src/org/eclipse/cdt/internal/ui/text/CAutoIndentStrategy.java 23 Jan 2008 15:41:43 -0000 @@ -44,7 +44,6 @@ * Auto indent strategy sensitive to brackets. */ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy { - private static final String MULTILINE_COMMENT_CLOSE = "*/"; //$NON-NLS-1$ /** The line comment introducer. Value is "{@value}" */ private static final String LINE_COMMENT= "//"; //$NON-NLS-1$ // private static final GCCScannerExtensionConfiguration C_GNU_SCANNER_EXTENSION = new GCCScannerExtensionConfiguration(); @@ -1120,43 +1119,20 @@ super.customizeDocumentCommand(d, c); return; } - - if (c.length == 0 && c.text != null && isLineDelimiter(d, c.text)) { - if (isAppendToOpenMultilineComment(d, c)) { - // special case: multi-line comment at end of document (bug 48339) - CCommentAutoIndentStrategy.commentIndentAfterNewLine(d, c); - } else { - smartIndentAfterNewLine(d, c); - } - } else if ("/".equals(c.text) && isAppendToOpenMultilineComment(d, c)) { //$NON-NLS-1$ - // special case: multi-line comment at end of document (bug 48339) - CCommentAutoIndentStrategy.commentIndentForCommentEnd(d, c); + + /* + * I removed the workaround for 48339 as I believe the recent changes to + * FastCPartitioner are enough to fix this. + */ + boolean isNewLine= c.length == 0 && c.text != null && isLineDelimiter(d, c.text); + if (isNewLine) { + smartIndentAfterNewLine(d, c); } else if (c.text.length() == 1) { smartIndentOnKeypress(d, c); } else if (c.text.length() > 1 && getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SMART_PASTE)) { smartPaste(d, c); // no smart backspace for paste } } - - /** - * Check, if the command appends to an open multi-line comment. - * @param d the document - * @param c the document command - * @return true, if the command appends to an open multi-line comment. - */ - private boolean isAppendToOpenMultilineComment(IDocument d, DocumentCommand c) { - if (d.getLength() >= 2 && c.offset == d.getLength()) { - try { - String contentType = TextUtilities.getContentType(d, fPartitioning, c.offset - 1, false); - if (ICPartitions.C_MULTI_LINE_COMMENT.equals(contentType)) { - return !d.get(c.offset - 2, 2).equals(MULTILINE_COMMENT_CLOSE); - } - } catch (BadLocationException exc) { - // see below - } - } - return false; - } private static IPreferenceStore getPreferenceStore() { return CUIPlugin.getDefault().getCombinedPreferenceStore(); Index: src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java,v retrieving revision 1.11 diff -u -r1.11 FastCPartitionScanner.java --- src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java 21 Jan 2008 13:58:32 -0000 1.11 +++ src/org/eclipse/cdt/internal/ui/text/FastCPartitionScanner.java 23 Jan 2008 15:41:43 -0000 @@ -21,6 +21,7 @@ import org.eclipse.jface.text.rules.Token; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; /** @@ -38,6 +39,8 @@ private static final int PREPROCESSOR= 5; private static final int PREPROCESSOR_MULTI_LINE_COMMENT= 6; private static final int PREPROCESSOR_STRING= 7; + private static final int SINGLE_LINE_DOC_COMMENT= 8; + private static final int MULTI_LINE_DOC_COMMENT= 9; // beginning of prefixes and postfixes private static final int NONE= 0; @@ -65,11 +68,14 @@ private int fPrefixLength; /** Indicate whether current char is first non-whitespace char on the line*/ private boolean fFirstCharOnLine= true; - + /** An optional (possibly null) comment owner for detecting documentation-comments **/ + private IDocCommentOwner fOwner; + // emulate CPartitionScanner private final boolean fEmulate; private int fCCodeOffset; private int fCCodeLength; + private IDocument fDocument; private final IToken[] fTokens= new IToken[] { new Token(null), @@ -80,14 +86,21 @@ new Token(C_PREPROCESSOR), new Token(C_MULTI_LINE_COMMENT), new Token(C_PREPROCESSOR), + new Token(C_SINGLE_LINE_DOC_COMMENT), + new Token(C_MULTI_LINE_DOC_COMMENT) }; - public FastCPartitionScanner(boolean emulate) { + public FastCPartitionScanner(boolean emulate, IDocCommentOwner owner) { fEmulate= emulate; + fOwner= owner; } + public FastCPartitionScanner(IDocCommentOwner owner) { + this(false, owner); + } + public FastCPartitionScanner() { - this(false); + this(false, null); } /* @@ -533,14 +546,20 @@ } private final IToken postFix(int state) { + return postFix(state, CCODE); + } + + private final IToken postFix(int state, int newState) { fTokenLength++; fLast= NONE; - fState= CCODE; + fState= newState; fPrefixLength= 0; - return fTokens[state]; + return fTokens[interceptTokenState(state)]; } + private final IToken preFix(int state, int newState, int last, int prefixLength) { + // emulate CPartitionScanner if (fEmulate && state == CCODE && (fTokenLength - getLastLength(fLast) > 0)) { fTokenLength -= getLastLength(fLast); @@ -550,15 +569,14 @@ fState= newState; fPrefixLength= prefixLength; fLast= last; - return fTokens[state]; + return fTokens[interceptTokenState(state)]; } else { fTokenLength -= getLastLength(fLast); fLast= last; fPrefixLength= prefixLength; - IToken token= fTokens[state]; fState= newState; - return token; + return fTokens[interceptTokenState(state)]; } } @@ -581,7 +599,13 @@ else if (contentType.equals(C_PREPROCESSOR)) return PREPROCESSOR; - + + else if (contentType.equals(C_SINGLE_LINE_DOC_COMMENT)) + return SINGLE_LINE_COMMENT; // intentionally non-doc state: the state machine is doc-comment unaware + + else if (contentType.equals(C_MULTI_LINE_DOC_COMMENT)) + return MULTI_LINE_COMMENT; // intentionally non-doc state: the state machine is doc-comment unaware + else return CCODE; } @@ -590,7 +614,7 @@ * @see IPartitionTokenScanner#setPartialRange(IDocument, int, int, String, int) */ public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) { - + fDocument= document; fScanner.setRange(document, offset, length); fTokenOffset= partitionOffset; fTokenLength= 0; @@ -622,7 +646,7 @@ * @see ITokenScanner#setRange(IDocument, int, int) */ public void setRange(IDocument document, int offset, int length) { - + fDocument= document; fScanner.setRange(document, offset, length); fTokenOffset= offset; fTokenLength= 0; @@ -658,4 +682,30 @@ return fTokenOffset; } + private int interceptTokenState(int proposedTokenState) { + if(fOwner!=null) { + switch(proposedTokenState) { + case MULTI_LINE_COMMENT: + if(fOwner.getMultilineConfiguration().isDocumentationComment(fDocument, fTokenOffset, fTokenLength)) + return MULTI_LINE_DOC_COMMENT; + break; + + case SINGLE_LINE_COMMENT: + if(fOwner.getSinglelineConfiguration().isDocumentationComment(fDocument, fTokenOffset, fTokenLength)) + return SINGLE_LINE_DOC_COMMENT; + break; + + } + } + return proposedTokenState; + } + + /** + * @return the DocCommentOwner associated with this partition scanner, or null + * if there is no owner. + * @since 5.0 + */ + public IDocCommentOwner getDocCommentOwner() { + return fOwner; + } } Index: src/org/eclipse/cdt/internal/ui/text/FastCPartitioner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/FastCPartitioner.java,v retrieving revision 1.2 diff -u -r1.2 FastCPartitioner.java --- src/org/eclipse/cdt/internal/ui/text/FastCPartitioner.java 16 Oct 2007 11:38:54 -0000 1.2 +++ src/org/eclipse/cdt/internal/ui/text/FastCPartitioner.java 23 Jan 2008 15:41:43 -0000 @@ -16,6 +16,7 @@ import org.eclipse.jface.text.rules.IPartitionTokenScanner; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; /** * A slightly adapted FastPartitioner. @@ -44,10 +45,30 @@ if (fDocument.getChar(offset - 1) != '\n') { return region; } + } else if (ICPartitions.C_MULTI_LINE_DOC_COMMENT.equals(region.getType())) { + if (!fDocument.get(offset - 2, 2).equals("*/")) { //$NON-NLS-1$ + return region; + } + } else if (ICPartitions.C_SINGLE_LINE_DOC_COMMENT.equals(region .getType())) { + if (fDocument.getChar(offset - 1) != '\n') { + return region; + } } } catch (BadLocationException exc) { } } return super.getPartition(offset, preferOpenPartitions); } + + /** + * @return the DocCommentOwner associated with this partition scanner, or null + * if there is no owner. + * @since 5.0 + */ + public IDocCommentOwner getDocCommentOwner() { + if(fScanner instanceof FastCPartitionScanner) { + return ((FastCPartitionScanner)fScanner).getDocCommentOwner(); + } + return null; + } } Index: src/org/eclipse/cdt/internal/ui/text/AbstractCScanner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/AbstractCScanner.java,v retrieving revision 1.6 diff -u -r1.6 AbstractCScanner.java --- src/org/eclipse/cdt/internal/ui/text/AbstractCScanner.java 27 Sep 2006 14:38:33 -0000 1.6 +++ src/org/eclipse/cdt/internal/ui/text/AbstractCScanner.java 23 Jan 2008 15:41:43 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2006 IBM Corporation and others. + * Copyright (c) 2000, 2007 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -8,358 +8,99 @@ * Contributors: * IBM Corporation - initial API and implementation * QNX Software System + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.text; - -import java.util.HashMap; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -import java.util.Map; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.preference.PreferenceConverter; -import org.eclipse.jface.resource.StringConverter; -import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.BufferedRuleBasedScanner; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.util.PropertyChangeEvent; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.widgets.Display; - -import org.eclipse.cdt.ui.PreferenceConstants; +import org.eclipse.cdt.ui.IPropertyChangeParticipant; +import org.eclipse.cdt.ui.text.ICTokenScanner; +import org.eclipse.cdt.ui.text.ITokenStore; /** - * Initialized with a color manager and a preference store, its subclasses are - * only responsible for providing a list of preference keys for based on which tokens - * are generated and to use this tokens to define the rules controlling this scanner. - *

- * This scanner stores the color defined by the color preference key into - * the color manager under the same key. - *

- *

- * Preference color key + {@link PreferenceConstants#EDITOR_BOLD_SUFFIX} are used - * to retrieve whether the token is rendered in bold. - *

- *

- * Preference color key + {@link PreferenceConstants#EDITOR_ITALIC_SUFFIX} are used - * to retrieve whether the token is rendered in italic. - *

- *

- * Preference color key + {@link PreferenceConstants#EDITOR_STRIKETHROUGH_SUFFIX} are used - * to retrieve whether the token is rendered in strikethrough. - *

- *

- * Preference color key + {@link PreferenceConstants#EDITOR_UNDERLINE_SUFFIX} are used - * to retrieve whether the token is rendered in underline. - *

+ * Convenience implementation. */ -public abstract class AbstractCScanner extends BufferedRuleBasedScanner { - - - private IColorManager fColorManager; - private IPreferenceStore fPreferenceStore; - - private Map fTokenMap= new HashMap(); - private String[] fPropertyNamesColor; - /** - * Preference keys for boolean preferences which are true, - * iff the corresponding token should be rendered bold. - */ - private String[] fPropertyNamesBold; - /** - * Preference keys for boolean preferences which are true, - * iff the corresponding token should be rendered italic. - * - * @since 4.0 - */ - private String[] fPropertyNamesItalic; - /** - * Preference keys for boolean preferences which are true, - * iff the corresponding token should be rendered strikethrough. - * - * @since 4.0 - */ - private String[] fPropertyNamesStrikethrough; - /** - * Preference keys for boolean preferences which are true, - * iff the corresponding token should be rendered underline. - * - * @since 4.0 - */ - private String[] fPropertyNamesUnderline; - - - private boolean fNeedsLazyColorLoading; - - /** - * Returns an array of preference keys which define the tokens - * used in the rules of this scanner. - *

- * The preference key is used access the color in the preference - * store and in the color manager. - *

- *

- * Preference key + {@link PreferenceConstants#EDITOR_BOLD_SUFFIX} is used - * to retrieve whether the token is rendered in bold. - *

- *

- * Preference key + {@link PreferenceConstants#EDITOR_ITALIC_SUFFIX} is used - * to retrieve whether the token is rendered in italic. - *

- *

- * Preference key + {@link PreferenceConstants#EDITOR_UNDERLINE_SUFFIX} is used - * to retrieve whether the token is rendered underlined. - *

- *

- * Preference key + {@link PreferenceConstants#EDITOR_STRIKETHROUGH_SUFFIX} is used - * to retrieve whether the token is rendered stricken out. - *

- */ - abstract protected String[] getTokenProperties(); - - /** - * Creates the list of rules controlling this scanner. - */ - abstract protected List createRules(); - - - /** - * Creates an abstract C scanner. - */ - public AbstractCScanner(IColorManager manager, IPreferenceStore store) { - super(); - fColorManager= manager; - fPreferenceStore= store; - } - - /** - * Creates an abstract C scanner. - */ - public AbstractCScanner(IColorManager manager, IPreferenceStore store, int bufsize) { - super(bufsize); - fColorManager= manager; - fPreferenceStore= store; - } - - /** - * Must be called after the constructor has been called. - */ - public final void initialize() { - - fPropertyNamesColor= getTokenProperties(); - int length= fPropertyNamesColor.length; - fPropertyNamesBold= new String[length]; - fPropertyNamesItalic= new String[length]; - fPropertyNamesStrikethrough= new String[length]; - fPropertyNamesUnderline= new String[length]; - - for (int i= 0; i < length; i++) { - fPropertyNamesBold[i]= getBoldKey(fPropertyNamesColor[i]); - fPropertyNamesItalic[i]= getItalicKey(fPropertyNamesColor[i]); - fPropertyNamesStrikethrough[i]= getStrikethroughKey(fPropertyNamesColor[i]); - fPropertyNamesUnderline[i]= getUnderlineKey(fPropertyNamesColor[i]); - } - - fNeedsLazyColorLoading= Display.getCurrent() == null; - for (int i= 0; i < length; i++) { - if (fNeedsLazyColorLoading) - addTokenWithProxyAttribute(fPropertyNamesColor[i], fPropertyNamesBold[i], fPropertyNamesItalic[i], fPropertyNamesStrikethrough[i], fPropertyNamesUnderline[i]); - else - addToken(fPropertyNamesColor[i], fPropertyNamesBold[i], fPropertyNamesItalic[i], fPropertyNamesStrikethrough[i], fPropertyNamesUnderline[i]); - } - - initializeRules(); - } +public abstract class AbstractCScanner extends BufferedRuleBasedScanner implements ICTokenScanner { + private List/**/ rules) { + if(rules==null) { + setRules((IRule[])null); + } else { IRule[] result= new IRule[rules.size()]; rules.toArray(result); - setRules(result); + setRules(result); } } - private int indexOf(String property) { - if (property != null) { - int length= fPropertyNamesColor.length; - for (int i= 0; i < length; i++) { - if (property.equals(fPropertyNamesColor[i]) || property.equals(fPropertyNamesBold[i]) || property.equals(fPropertyNamesItalic[i]) || property.equals(fPropertyNamesStrikethrough[i]) || property.equals(fPropertyNamesUnderline[i])) - return i; - } - } - return -1; + /* + * (non-Javadoc) + * @see org.eclipse.jface.text.rules.RuleBasedScanner#nextToken() + */ + public IToken nextToken() { + fTokenStore.ensureTokensInitialised(); + return super.nextToken(); } - - public boolean affectsBehavior(PropertyChangeEvent event) { - return indexOf(event.getProperty()) >= 0; + + public IToken getToken(String key) { + return fTokenStore.getToken(key); } - - public void adaptToPreferenceChange(PropertyChangeEvent event) { - String p= event.getProperty(); - int index= indexOf(p); - Token token= getToken(fPropertyNamesColor[index]); - if (fPropertyNamesColor[index].equals(p)) - adaptToColorChange(token, event); - else if (fPropertyNamesBold[index].equals(p)) - adaptToStyleChange(token, event, SWT.BOLD); - else if (fPropertyNamesItalic[index].equals(p)) - adaptToStyleChange(token, event, SWT.ITALIC); - else if (fPropertyNamesStrikethrough[index].equals(p)) - adaptToStyleChange(token, event, TextAttribute.STRIKETHROUGH); - else if (fPropertyNamesUnderline[index].equals(p)) - adaptToStyleChange(token, event, TextAttribute.UNDERLINE); + + public IPreferenceStore getPreferenceStore() { + return fTokenStore.getPreferenceStore(); } - private void adaptToColorChange(Token token, PropertyChangeEvent event) { - RGB rgb= null; - - Object value= event.getNewValue(); - if (value instanceof RGB) - rgb= (RGB) value; - else if (value instanceof String) - rgb= StringConverter.asRGB((String) value); - - if (rgb != null) { - - String property= event.getProperty(); - Color color= fColorManager.getColor(property); - - if ((color == null || !rgb.equals(color.getRGB())) && fColorManager instanceof IColorManagerExtension) { - IColorManagerExtension ext= (IColorManagerExtension) fColorManager; - - ext.unbindColor(property); - ext.bindColor(property, rgb); - - color= fColorManager.getColor(property); - } - - Object data= token.getData(); - if (data instanceof TextAttribute) { - TextAttribute oldAttr= (TextAttribute) data; - token.setData(new TextAttribute(color, oldAttr.getBackground(), oldAttr.getStyle())); - } + /* + * (non-Javadoc) + * @see org.eclipse.cdt.ui.IPropertyChangeParticipant#adaptToPreferenceChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void adaptToPreferenceChange(PropertyChangeEvent event) { + if(fTokenStore.affectsBehavior(event)) { + fTokenStore.adaptToPreferenceChange(event); } - } - - private void adaptToStyleChange(Token token, PropertyChangeEvent event, int styleAttribute) { - boolean eventValue= false; - Object value= event.getNewValue(); - if (value instanceof Boolean) - eventValue= ((Boolean) value).booleanValue(); - else if (IPreferenceStore.TRUE.equals(value)) - eventValue= true; - - Object data= token.getData(); - if (data instanceof TextAttribute) { - TextAttribute oldAttr= (TextAttribute) data; - boolean activeValue= (oldAttr.getStyle() & styleAttribute) == styleAttribute; - if (activeValue != eventValue) - token.setData(new TextAttribute(oldAttr.getForeground(), oldAttr.getBackground(), eventValue ? oldAttr.getStyle() | styleAttribute : oldAttr.getStyle() & ~styleAttribute)); + for(Iterator i= pcps.iterator(); i.hasNext(); ) { + ((IPropertyChangeParticipant)i.next()).adaptToPreferenceChange(event); } } - /** - * Returns the preference store. - * - * @return the preference store. - * - * @since 3.0 + + /* + * (non-Javadoc) + * @see org.eclipse.cdt.ui.IPropertyChangeParticipant#affectsBehavior(org.eclipse.jface.util.PropertyChangeEvent) */ - protected IPreferenceStore getPreferenceStore() { - return fPreferenceStore; + public boolean affectsBehavior(PropertyChangeEvent event) { + boolean result= fTokenStore.affectsBehavior(event); + for(Iterator i= pcps.iterator(); !result && i.hasNext(); ) { + result |= ((IPropertyChangeParticipant)i.next()).affectsBehavior(event); + } + return result; } -} +} \ No newline at end of file Index: src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties,v retrieving revision 1.69 diff -u -r1.69 PreferencesMessages.properties --- src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties 16 Jan 2008 09:50:35 -0000 1.69 +++ src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties 23 Jan 2008 15:41:43 -0000 @@ -12,7 +12,7 @@ # Sergey Prigogin (Google) ############################################################################### -CEditorPreferencePage_link=C/C++ Editor Preferences. Note that some preferences may be set on the Text Editors preference page. +CEditorPreferencePage_link=C/C++ Editor Preferences. General preferences may be set via Text Editors. CEditorPreferencePage_link_tooltip=Show the shared text editor preferences CEditorPreferencePage_colors=Synta&x @@ -191,9 +191,12 @@ CEditorPreferencePage_closeBraces={B&races} CEditorPreferencePage_wrapStrings=&Wrap automatically CEditorPreferencePage_escapeStrings=Escape text w&hen pasting into a string literal +CEditorPreferencePage_GeneralAppearanceGroupTitle=General appearance +CEditorPreferencePage_SelectDocToolDescription=Select the documentation tool to be used to determine editor behaviors when no project preference overrides exist CEditorPreferencePage_smartPaste=Adjust &indentation CEditorPreferencePage_typing_smartTab= &Tab key indents the current line +CEditorPreferencePage_WorkspaceDefaultLabel=Workspace default: # Code Formatting CodeFormatterPreferencePage_title=Code Style Index: src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java,v retrieving revision 1.27 diff -u -r1.27 PreferencesMessages.java --- src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java 16 Jan 2008 09:50:35 -0000 1.27 +++ src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.java 23 Jan 2008 15:41:43 -0000 @@ -181,9 +181,12 @@ public static String CEditorPreferencePage_closeBraces; public static String CEditorPreferencePage_wrapStrings; public static String CEditorPreferencePage_escapeStrings; + public static String CEditorPreferencePage_GeneralAppearanceGroupTitle; + public static String CEditorPreferencePage_SelectDocToolDescription; public static String CEditorPreferencePage_smartPaste; public static String CEditorPreferencePage_typing_smartTab; + public static String CEditorPreferencePage_WorkspaceDefaultLabel; public static String SmartTypingConfigurationBlock_autoclose_title; public static String SmartTypingConfigurationBlock_tabs_title; Index: src/org/eclipse/cdt/internal/ui/preferences/CEditorColoringConfigurationBlock.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorColoringConfigurationBlock.java,v retrieving revision 1.12 diff -u -r1.12 CEditorColoringConfigurationBlock.java --- src/org/eclipse/cdt/internal/ui/preferences/CEditorColoringConfigurationBlock.java 31 Oct 2007 14:40:35 -0000 1.12 +++ src/org/eclipse/cdt/internal/ui/preferences/CEditorColoringConfigurationBlock.java 23 Jan 2008 15:41:42 -0000 @@ -801,7 +801,7 @@ String content= loadPreviewContentFromFile("ColorSettingPreviewCode.txt"); //$NON-NLS-1$ IDocument document= new Document(content); - CUIPlugin.getDefault().getTextTools().setupCDocumentPartitioner(document, ICPartitions.C_PARTITIONING); + CUIPlugin.getDefault().getTextTools().setupCDocumentPartitioner(document, ICPartitions.C_PARTITIONING, null); fPreviewViewer.setDocument(document); installSemanticHighlighting(); Index: src/org/eclipse/cdt/internal/ui/preferences/CodeTemplateBlock.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CodeTemplateBlock.java,v retrieving revision 1.1 diff -u -r1.1 CodeTemplateBlock.java --- src/org/eclipse/cdt/internal/ui/preferences/CodeTemplateBlock.java 3 Dec 2007 14:04:05 -0000 1.1 +++ src/org/eclipse/cdt/internal/ui/preferences/CodeTemplateBlock.java 23 Jan 2008 15:41:43 -0000 @@ -409,7 +409,7 @@ IDocument document= new Document(); CTextTools tools= CUIPlugin.getDefault().getTextTools(); - tools.setupCDocumentPartitioner(document, ICPartitions.C_PARTITIONING); + tools.setupCDocumentPartitioner(document, ICPartitions.C_PARTITIONING, null); IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore(); SourceViewer viewer= new CSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store); CodeTemplateSourceViewerConfiguration configuration= new CodeTemplateSourceViewerConfiguration(tools.getColorManager(), store, null, fTemplateProcessor); Index: src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java,v retrieving revision 1.15 diff -u -r1.15 EditTemplateDialog.java --- src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java 3 Dec 2007 14:04:05 -0000 1.15 +++ src/org/eclipse/cdt/internal/ui/preferences/EditTemplateDialog.java 23 Jan 2008 15:41:43 -0000 @@ -413,7 +413,7 @@ String prefix= getPrefix(); IDocument document= new Document(prefix + fTemplate.getPattern()); CTextTools tools= CUIPlugin.getDefault().getTextTools(); - tools.setupCDocumentPartitioner(document, ICPartitions.C_PARTITIONING); + tools.setupCDocumentPartitioner(document, ICPartitions.C_PARTITIONING, null); IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore(); SourceViewer viewer= new CSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, store); CodeTemplateSourceViewerConfiguration configuration= new CodeTemplateSourceViewerConfiguration(tools.getColorManager(), store, null, fTemplateProcessor); Index: src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java,v retrieving revision 1.70 diff -u -r1.70 CEditorPreferencePage.java --- src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java 12 Dec 2007 13:34:28 -0000 1.70 +++ src/org/eclipse/cdt/internal/ui/preferences/CEditorPreferencePage.java 23 Jan 2008 15:41:43 -0000 @@ -14,6 +14,7 @@ import java.util.ArrayList; +import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.preference.ColorSelector; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; @@ -37,10 +38,14 @@ import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.cdt.ui.PreferenceConstants; +import org.eclipse.cdt.ui.dialogs.DocCommentOwnerComposite; +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; +import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.cdt.internal.ui.ICHelpContextIds; import org.eclipse.cdt.internal.ui.editor.CEditor; import org.eclipse.cdt.internal.ui.text.contentassist.ContentAssistPreference; +import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; /* * The page for setting the editor options. @@ -60,8 +65,8 @@ private List fAppearanceColorList; private ColorSelector fAppearanceColorEditor; private Button fAppearanceColorDefault; - - + private DocCommentOwnerComposite fDocCommentOwnerComposite; + public CEditorPreferencePage() { super(); } @@ -117,8 +122,9 @@ } private Control createAppearancePage(Composite parent) { - - Composite behaviorComposite = new Composite(parent, SWT.NONE); + Composite behaviorComposite= ControlFactory.createGroup(parent, PreferencesMessages.CEditorPreferencePage_GeneralAppearanceGroupTitle, 1); + + // Composite behaviorComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; behaviorComposite.setLayout(layout); @@ -216,6 +222,7 @@ PreferenceConverter.setValue(fOverlayStore, key, fAppearanceColorEditor.getColorValue()); } }); + return behaviorComposite; } @@ -269,8 +276,17 @@ createHeader(parent); + ControlFactory.createEmptySpace(parent, 2); createAppearancePage(parent); + ControlFactory.createEmptySpace(parent, 2); + + String dsc= PreferencesMessages.CEditorPreferencePage_SelectDocToolDescription; + String msg= PreferencesMessages.CEditorPreferencePage_WorkspaceDefaultLabel; + IDocCommentOwner workspaceOwner= DocCommentOwnerManager.getInstance().getWorkspaceCommentOwner(); + fDocCommentOwnerComposite= new DocCommentOwnerComposite(parent, workspaceOwner, dsc, msg); + fDocCommentOwnerComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true,false).create()); + initialize(); return parent; @@ -291,6 +307,14 @@ }); } + /* + * @see org.eclipse.cdt.internal.ui.preferences.AbstractPreferencePage#performOk() + */ + public boolean performOk() { + DocCommentOwnerManager.getInstance().setWorkspaceCommentOwner(fDocCommentOwnerComposite.getSelectedDocCommentOwner()); + return super.performOk(); + } + /** * Initializes the default colors. */ Index: src/org/eclipse/cdt/internal/ui/compare/CStructureCreator.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/compare/CStructureCreator.java,v retrieving revision 1.18 diff -u -r1.18 CStructureCreator.java --- src/org/eclipse/cdt/internal/ui/compare/CStructureCreator.java 11 Oct 2007 09:41:46 -0000 1.18 +++ src/org/eclipse/cdt/internal/ui/compare/CStructureCreator.java 23 Jan 2008 15:41:42 -0000 @@ -157,7 +157,7 @@ * @see org.eclipse.compare.structuremergeviewer.StructureCreator#getDocumentPartitioner() */ protected IDocumentPartitioner getDocumentPartitioner() { - return CUIPlugin.getDefault().getTextTools().createDocumentPartitioner(); + return CUIPlugin.getDefault().getTextTools().createDocumentPartitioner(null); } private static String readString(IStreamContentAccessor sa) throws CoreException { Index: src/org/eclipse/cdt/internal/ui/compare/AbstractMergeViewer.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/compare/AbstractMergeViewer.java,v retrieving revision 1.1 diff -u -r1.1 AbstractMergeViewer.java --- src/org/eclipse/cdt/internal/ui/compare/AbstractMergeViewer.java 13 Jul 2007 11:21:57 -0000 1.1 +++ src/org/eclipse/cdt/internal/ui/compare/AbstractMergeViewer.java 23 Jan 2008 15:41:42 -0000 @@ -134,7 +134,7 @@ } protected IDocumentPartitioner getDocumentPartitioner() { - return CUIPlugin.getDefault().getTextTools().createDocumentPartitioner(); + return CUIPlugin.getDefault().getTextTools().createDocumentPartitioner(null); } protected void configureTextViewer(TextViewer textViewer) { Index: META-INF/MANIFEST.MF =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/META-INF/MANIFEST.MF,v retrieving revision 1.32 diff -u -r1.32 MANIFEST.MF --- META-INF/MANIFEST.MF 22 Jan 2008 09:35:37 -0000 1.32 +++ META-INF/MANIFEST.MF 23 Jan 2008 15:41:42 -0000 @@ -34,6 +34,8 @@ org.eclipse.cdt.internal.ui.text.asm;x-internal:=true, org.eclipse.cdt.internal.ui.text.c.hover;x-internal:=true, org.eclipse.cdt.internal.ui.text.contentassist;x-internal:=true, + org.eclipse.cdt.internal.ui.text.doctools;x-internal:=true, + org.eclipse.cdt.internal.ui.text.doctools.doxygen;x-internal:=true, org.eclipse.cdt.internal.ui.text.folding;x-internal:=true, org.eclipse.cdt.internal.ui.text.template;x-internal:=true, org.eclipse.cdt.internal.ui.text.util;x-internal:=true, @@ -59,6 +61,8 @@ org.eclipse.cdt.ui.text, org.eclipse.cdt.ui.text.c.hover, org.eclipse.cdt.ui.text.contentassist, + org.eclipse.cdt.ui.text.doctools, + org.eclipse.cdt.ui.text.doctools.generic, org.eclipse.cdt.ui.text.folding, org.eclipse.cdt.ui.wizards, org.eclipse.cdt.ui.wizards.conversion, Index: src/org/eclipse/cdt/internal/ui/editor/asm/AsmCodeScanner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/asm/AsmCodeScanner.java,v retrieving revision 1.10 diff -u -r1.10 AsmCodeScanner.java --- src/org/eclipse/cdt/internal/ui/editor/asm/AsmCodeScanner.java 8 Nov 2007 15:26:10 -0000 1.10 +++ src/org/eclipse/cdt/internal/ui/editor/asm/AsmCodeScanner.java 23 Jan 2008 15:41:42 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -9,30 +9,29 @@ * IBM Corporation - initial API and implementation * QNX Software System * Anton Leherbauer (Wind River Systems) + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.editor.asm; import java.util.ArrayList; import java.util.List; -import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordPatternRule; import org.eclipse.jface.text.rules.WordRule; -import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.cdt.core.model.IAsmLanguage; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; import org.eclipse.cdt.internal.ui.text.AbstractCScanner; import org.eclipse.cdt.internal.ui.text.ICColorConstants; -import org.eclipse.cdt.internal.ui.text.IColorManager; import org.eclipse.cdt.internal.ui.text.util.CWhitespaceDetector; -/** +/* * An assembly code scanner. */ public final class AsmCodeScanner extends AbstractCScanner { @@ -50,17 +49,10 @@ /** * Creates an assembly code scanner. */ - public AsmCodeScanner(IColorManager manager, IPreferenceStore store, IAsmLanguage asmLanguage) { - super(manager, store); + public AsmCodeScanner(ITokenStoreFactory factory, IAsmLanguage asmLanguage) { + super(factory.createTokenStore(fgTokenProperties)); fAsmLanguage= asmLanguage; - initialize(); - } - - /* - * @see AbstractCScanner#getTokenProperties() - */ - protected String[] getTokenProperties() { - return fgTokenProperties; + setRules(createRules()); } /* @@ -70,7 +62,7 @@ List rules= new ArrayList(); - Token token; + IToken token; // Add rule(s) for single line comments token= getToken(ICColorConstants.C_SINGLE_LINE_COMMENT); @@ -82,7 +74,7 @@ // Add generic whitespace rule. rules.add(new WhitespaceRule(new CWhitespaceDetector())); - final Token other= getToken(ICColorConstants.C_DEFAULT); + final IToken other= getToken(ICColorConstants.C_DEFAULT); // Add rule for labels token= getToken(ICColorConstants.ASM_LABEL); @@ -105,13 +97,4 @@ setDefaultReturnToken(other); return rules; } - - /* - * @see AbstractCScanner#adaptToPreferenceChange(PropertyChangeEvent) - */ - public void adaptToPreferenceChange(PropertyChangeEvent event) { - if (super.affectsBehavior(event)) { - super.adaptToPreferenceChange(event); - } - } } \ No newline at end of file Index: src/org/eclipse/cdt/internal/ui/editor/asm/AsmTextTools.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/asm/AsmTextTools.java,v retrieving revision 1.14 diff -u -r1.14 AsmTextTools.java --- src/org/eclipse/cdt/internal/ui/editor/asm/AsmTextTools.java 31 Oct 2007 14:40:35 -0000 1.14 +++ src/org/eclipse/cdt/internal/ui/editor/asm/AsmTextTools.java 23 Jan 2008 15:41:42 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 IBM Corporation and others. + * Copyright (c) 2005, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -9,6 +9,7 @@ * IBM Corporation - initial API and implementation * QNX Software System * Wind River Systems, Inc. + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.editor.asm; @@ -20,11 +21,13 @@ import org.eclipse.cdt.core.model.AssemblyLanguage; import org.eclipse.cdt.ui.CUIPlugin; - +import org.eclipse.cdt.ui.text.ITokenStore; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; import org.eclipse.cdt.internal.ui.text.CCommentScanner; import org.eclipse.cdt.internal.ui.text.ICColorConstants; import org.eclipse.cdt.internal.ui.text.SingleTokenCScanner; +import org.eclipse.cdt.internal.ui.text.TokenStore; import org.eclipse.cdt.internal.ui.text.util.CColorManager; @@ -77,20 +80,23 @@ * and initializes all members of this collection. */ public AsmTextTools(IPreferenceStore store, Preferences coreStore) { - if(store == null) { - store = CUIPlugin.getDefault().getPreferenceStore(); - } - - fColorManager= new CColorManager(); - fCodeScanner= new AsmCodeScanner(fColorManager, store, AssemblyLanguage.getDefault()); - fPreprocessorScanner= new AsmPreprocessorScanner(fColorManager, store, AssemblyLanguage.getDefault()); - - fMultilineCommentScanner= new CCommentScanner(fColorManager, store, coreStore, ICColorConstants.C_MULTI_LINE_COMMENT); - fSinglelineCommentScanner= new CCommentScanner(fColorManager, store, coreStore, ICColorConstants.C_SINGLE_LINE_COMMENT); - fStringScanner= new SingleTokenCScanner(fColorManager, store, ICColorConstants.C_STRING); + fPreferenceStore = store != null ? store : CUIPlugin.getDefault().getPreferenceStore(); + fColorManager= new CColorManager(); + + ITokenStoreFactory factory= new ITokenStoreFactory() { + public ITokenStore createTokenStore(String[] propertyColorNames) { + return new TokenStore(fColorManager, fPreferenceStore, propertyColorNames); + } + }; + + fCodeScanner= new AsmCodeScanner(factory, AssemblyLanguage.getDefault()); + fPreprocessorScanner= new AsmPreprocessorScanner(factory, AssemblyLanguage.getDefault()); + fMultilineCommentScanner= new CCommentScanner(factory, coreStore, ICColorConstants.C_MULTI_LINE_COMMENT); + fSinglelineCommentScanner= new CCommentScanner(factory, coreStore, ICColorConstants.C_SINGLE_LINE_COMMENT); + fStringScanner= new SingleTokenCScanner(factory, ICColorConstants.C_STRING); - fPreferenceStore = store; - store.addPropertyChangeListener(fPreferenceListener); + // listener must be registered after initializing scanners + fPreferenceStore.addPropertyChangeListener(fPreferenceListener); fCorePreferenceStore= coreStore; if (fCorePreferenceStore != null) { Index: src/org/eclipse/cdt/internal/ui/editor/asm/AsmPreprocessorScanner.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/asm/AsmPreprocessorScanner.java,v retrieving revision 1.2 diff -u -r1.2 AsmPreprocessorScanner.java --- src/org/eclipse/cdt/internal/ui/editor/asm/AsmPreprocessorScanner.java 31 Oct 2007 14:40:35 -0000 1.2 +++ src/org/eclipse/cdt/internal/ui/editor/asm/AsmPreprocessorScanner.java 23 Jan 2008 15:41:42 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2008 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,7 @@ * * Contributors: * Anton Leherbauer (Wind River Systems) - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.internal.ui.editor.asm; @@ -14,18 +15,17 @@ import java.util.List; import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.cdt.core.model.IAsmLanguage; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; import org.eclipse.cdt.internal.ui.text.AbstractCScanner; import org.eclipse.cdt.internal.ui.text.CHeaderRule; import org.eclipse.cdt.internal.ui.text.ICColorConstants; -import org.eclipse.cdt.internal.ui.text.IColorManager; import org.eclipse.cdt.internal.ui.text.PreprocessorRule; import org.eclipse.cdt.internal.ui.text.util.CWhitespaceDetector; import org.eclipse.cdt.internal.ui.text.util.CWordDetector; @@ -50,27 +50,24 @@ /** * Create a preprocessor directive scanner. - * - * @param colorManager - * @param store - * @param asmLanguage + * @param factory + * @param asmLanguage */ - public AsmPreprocessorScanner(IColorManager colorManager, IPreferenceStore store, IAsmLanguage asmLanguage) { - super(colorManager, store); + public AsmPreprocessorScanner(ITokenStoreFactory factory, IAsmLanguage asmLanguage) { + super(factory.createTokenStore(fgTokenProperties)); Assert.isNotNull(asmLanguage); fAsmLanguage= asmLanguage; - initialize(); + setRules(createRules()); } - /* - * @see org.eclipse.cdt.internal.ui.text.AbstractCScanner#createRules() + /** + * Creates rules used in this RulesBasedScanner */ protected List createRules() { - - Token defaultToken= getToken(ICColorConstants.PP_DEFAULT); + IToken defaultToken= getToken(ICColorConstants.PP_DEFAULT); List rules= new ArrayList(); - Token token; + IToken token; // Add generic white space rule. rules.add(new WhitespaceRule(new CWhitespaceDetector())); @@ -103,12 +100,4 @@ setDefaultReturnToken(defaultToken); return rules; } - - /* - * @see org.eclipse.cdt.internal.ui.text.AbstractCScanner#getTokenProperties() - */ - protected String[] getTokenProperties() { - return fgTokenProperties; - } - } Index: src/org/eclipse/cdt/internal/ui/editor/asm/AsmSourceViewerConfiguration.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/asm/AsmSourceViewerConfiguration.java,v retrieving revision 1.18 diff -u -r1.18 AsmSourceViewerConfiguration.java --- src/org/eclipse/cdt/internal/ui/editor/asm/AsmSourceViewerConfiguration.java 31 Oct 2007 14:40:35 -0000 1.18 +++ src/org/eclipse/cdt/internal/ui/editor/asm/AsmSourceViewerConfiguration.java 23 Jan 2008 15:41:42 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2007 QNX Software Systems and others. + * Copyright (c) 2000, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -44,6 +44,8 @@ import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.ILanguageUI; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.ITokenStore; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; import org.eclipse.cdt.internal.ui.text.AbstractCScanner; import org.eclipse.cdt.internal.ui.text.CCommentScanner; @@ -52,6 +54,7 @@ import org.eclipse.cdt.internal.ui.text.IColorManager; import org.eclipse.cdt.internal.ui.text.PartitionDamager; import org.eclipse.cdt.internal.ui.text.SingleTokenCScanner; +import org.eclipse.cdt.internal.ui.text.TokenStore; public class AsmSourceViewerConfiguration extends TextSourceViewerConfiguration { @@ -123,9 +126,9 @@ * Initializes the scanners. */ private void initializeScanners() { - fMultilineCommentScanner= new CCommentScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_MULTI_LINE_COMMENT); - fSinglelineCommentScanner= new CCommentScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_SINGLE_LINE_COMMENT); - fStringScanner= new SingleTokenCScanner(getColorManager(), fPreferenceStore, ICColorConstants.C_STRING); + fMultilineCommentScanner= new CCommentScanner(getTokenStoreFactory(), ICColorConstants.C_MULTI_LINE_COMMENT); + fSinglelineCommentScanner= new CCommentScanner(getTokenStoreFactory(), ICColorConstants.C_SINGLE_LINE_COMMENT); + fStringScanner= new SingleTokenCScanner(getTokenStoreFactory(), ICColorConstants.C_STRING); } /** @@ -167,10 +170,10 @@ } AbstractCScanner scanner= null; if (language instanceof IAsmLanguage) { - scanner= new AsmPreprocessorScanner(getColorManager(), fPreferenceStore, (IAsmLanguage)language); + scanner= new AsmPreprocessorScanner(getTokenStoreFactory(), (IAsmLanguage)language); } if (scanner == null) { - scanner= new AsmPreprocessorScanner(getColorManager(), fPreferenceStore, AssemblyLanguage.getDefault()); + scanner= new AsmPreprocessorScanner(getTokenStoreFactory(), AssemblyLanguage.getDefault()); } fPreprocessorScanner= scanner; return fPreprocessorScanner; @@ -187,14 +190,14 @@ RuleBasedScanner scanner= null; if (language instanceof IAsmLanguage) { IAsmLanguage asmLang= (IAsmLanguage)language; - scanner = new AsmCodeScanner(getColorManager(), fPreferenceStore, asmLang); + scanner = new AsmCodeScanner(getTokenStoreFactory(), asmLang); } else if (language != null) { ILanguageUI languageUI = (ILanguageUI)language.getAdapter(ILanguageUI.class); if (languageUI != null) scanner = languageUI.getCodeScanner(); } if (scanner == null) { - scanner = new AsmCodeScanner(getColorManager(), fPreferenceStore, AssemblyLanguage.getDefault()); + scanner = new AsmCodeScanner(getTokenStoreFactory(), AssemblyLanguage.getDefault()); } if (scanner instanceof AbstractCScanner) { fCodeScanner= (AbstractCScanner)scanner; @@ -373,6 +376,13 @@ fPreprocessorScanner= null; } + private ITokenStoreFactory getTokenStoreFactory() { + return new ITokenStoreFactory() { + public ITokenStore createTokenStore(String[] propertyColorNames) { + return new TokenStore(getColorManager(), fPreferenceStore, propertyColorNames); + } + }; + } } Index: src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties,v retrieving revision 1.6 diff -u -r1.6 DialogsMessages.properties --- src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties 17 May 2007 13:25:13 -0000 1.6 +++ src/org/eclipse/cdt/ui/dialogs/DialogsMessages.properties 23 Jan 2008 15:41:43 -0000 @@ -22,6 +22,11 @@ CacheSizeBlock_absoluteLimit=Absolute Limit: CacheSizeBlock_MB=MB CacheSizeBlock_headerFileCache=Header file cache (used by full indexer and refactoring): +DocCommentOwnerBlock_DocToolLabel=Documentation tool: +DocCommentOwnerBlock_EnableProjectSpecificSettings=Enable project specific settings +DocCommentOwnerBlock_SelectDocToolDescription=Select the documentation tool to be used to determine editor behaviors in this project +DocCommentOwnerCombo_None=None +DocCommentOwnerComposite_DocumentationToolGroupTitle=Documentation tool comments IndexerStrategyBlock_strategyGroup=Indexing strategy IndexerStrategyBlock_autoUpdate=Automatically update the index IndexerBlock_fixedBuildConfig=Use a fixed build configuration Index: src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java,v retrieving revision 1.6 diff -u -r1.6 DialogsMessages.java --- src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java 17 May 2007 13:25:13 -0000 1.6 +++ src/org/eclipse/cdt/ui/dialogs/DialogsMessages.java 23 Jan 2008 15:41:43 -0000 @@ -37,6 +37,12 @@ public static String CacheSizeBlock_indexDatabaseCache; public static String CacheSizeBlock_limitRelativeToMaxHeapSize; + public static String DocCommentOwnerBlock_DocToolLabel; + public static String DocCommentOwnerBlock_EnableProjectSpecificSettings; + public static String DocCommentOwnerBlock_SelectDocToolDescription; + public static String DocCommentOwnerCombo_None; + public static String DocCommentOwnerComposite_DocumentationToolGroupTitle; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, DialogsMessages.class); Index: plugin.xml =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/plugin.xml,v retrieving revision 1.311 diff -u -r1.311 plugin.xml --- plugin.xml 22 Jan 2008 09:35:37 -0000 1.311 +++ plugin.xml 23 Jan 2008 15:41:42 -0000 @@ -23,6 +23,7 @@ + @@ -770,6 +771,16 @@ class="org.eclipse.cdt.internal.ui.preferences.WorkInProgressPreferencePage" id="org.eclipse.cdt.ui.preferneces.WorkInProgressPreferencePage"> + + @@ -2434,16 +2445,6 @@ name="%exportWizard.CDTCategory.name"> - - - - - + + + + + + + + + + + + - + + + + + + + + + + Index: plugin.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/plugin.properties,v retrieving revision 1.155 diff -u -r1.155 plugin.properties --- plugin.properties 18 Jan 2008 15:54:16 -0000 1.155 +++ plugin.properties 23 Jan 2008 15:41:42 -0000 @@ -447,3 +447,5 @@ toggleMarkOccurrences.description= Toggles mark occurrences in C/C++ editors OccurrenceAnnotation.label= C/C++ Occurrences + +extension-point.name.0 = DocCommentOwner \ No newline at end of file Index: src/org/eclipse/cdt/internal/ui/text/spelling/CSpellingEngine.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/spelling/CSpellingEngine.java,v retrieving revision 1.1 diff -u -r1.1 CSpellingEngine.java --- src/org/eclipse/cdt/internal/ui/text/spelling/CSpellingEngine.java 3 Dec 2007 00:09:18 -0000 1.1 +++ src/org/eclipse/cdt/internal/ui/text/spelling/CSpellingEngine.java 23 Jan 2008 15:41:43 -0000 @@ -15,6 +15,8 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IDocumentExtension3; +import org.eclipse.jface.text.IDocumentPartitioner; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITypedRegion; import org.eclipse.jface.text.TextUtilities; @@ -25,9 +27,15 @@ import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.doctools.IDocCommentDictionary; +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; +import org.eclipse.cdt.ui.text.doctools.IDocCommentSimpleDictionary; import org.eclipse.cdt.internal.ui.text.CTextTools; +import org.eclipse.cdt.internal.ui.text.FastCPartitioner; +import org.eclipse.cdt.internal.ui.text.doctools.DocCommentSpellDictionary; import org.eclipse.cdt.internal.ui.text.spelling.engine.ISpellChecker; +import org.eclipse.cdt.internal.ui.text.spelling.engine.ISpellDictionary; import org.eclipse.cdt.internal.ui.text.spelling.engine.ISpellEventListener; /** @@ -40,8 +48,19 @@ protected void check(IDocument document, IRegion[] regions, ISpellChecker checker, ISpellingProblemCollector collector, IProgressMonitor monitor) { ISpellEventListener listener= new SpellEventListener(collector, document); boolean isIgnoringStringLiterals= SpellingPreferences.isIgnoreStringLiterals(); + + ISpellDictionary toRemove= null; try { checker.addListener(listener); + + IDocCommentOwner owner= null; + if(document instanceof IDocumentExtension3) { + IDocumentPartitioner partitioner= ((IDocumentExtension3)document).getDocumentPartitioner(ICPartitions.C_PARTITIONING); + if(partitioner instanceof FastCPartitioner) { + owner= ((FastCPartitioner)partitioner).getDocCommentOwner(); + } + } + try { for (int i= 0; i < regions.length; i++) { IRegion region= regions[i]; @@ -57,6 +76,22 @@ if (isIgnoringStringLiterals && type.equals(ICPartitions.C_STRING)) continue; + if(owner!=null) { + IDocCommentDictionary dict= null; + + if (type.equals(ICPartitions.C_MULTI_LINE_DOC_COMMENT)) { + dict= owner.getMultilineConfiguration().getSpellingDictionary(); + } else if (type.equals(ICPartitions.C_SINGLE_LINE_DOC_COMMENT)) { + dict= owner.getSinglelineConfiguration().getSpellingDictionary(); + } + + if(dict instanceof IDocCommentSimpleDictionary) { + ISpellDictionary sd= new DocCommentSpellDictionary((IDocCommentSimpleDictionary)dict); + checker.addDictionary(sd); + toRemove= sd; + } + } + if (type.equals(ICPartitions.C_PREPROCESSOR)) { CTextTools textTools = CUIPlugin.getDefault().getTextTools(); RuleBasedScanner scanner = textTools.getCppPreprocessorScanner(); @@ -101,12 +136,19 @@ !type.equals(ICPartitions.C_CHARACTER)) { checker.execute(new SpellCheckIterator(document, partition, checker.getLocale())); } + + if(toRemove != null) { + checker.removeDictionary(toRemove); + toRemove= null; + } } } } catch (BadLocationException x) { CUIPlugin.getDefault().log(x); } } finally { + if(toRemove!=null) + checker.removeDictionary(toRemove); checker.removeListener(listener); } } Index: src/org/eclipse/cdt/internal/ui/editor/CDocumentSetupParticipant.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentSetupParticipant.java,v retrieving revision 1.4 diff -u -r1.4 CDocumentSetupParticipant.java --- src/org/eclipse/cdt/internal/ui/editor/CDocumentSetupParticipant.java 23 Jun 2006 17:52:11 -0000 1.4 +++ src/org/eclipse/cdt/internal/ui/editor/CDocumentSetupParticipant.java 23 Jan 2008 15:41:42 -0000 @@ -11,15 +11,20 @@ package org.eclipse.cdt.internal.ui.editor; -import org.eclipse.cdt.internal.ui.text.CTextTools; -import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.core.filebuffers.IDocumentSetupParticipant; +import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.runtime.IPath; import org.eclipse.jface.text.IDocument; +import org.eclipse.cdt.ui.CUIPlugin; + +import org.eclipse.cdt.internal.ui.text.CTextTools; + /** * CDocumentSetupParticipant */ -public class CDocumentSetupParticipant implements IDocumentSetupParticipant { +public class CDocumentSetupParticipant implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension { /** * */ @@ -30,8 +35,14 @@ * @see org.eclipse.core.filebuffers.IDocumentSetupParticipant#setup(org.eclipse.jface.text.IDocument) */ public void setup(IDocument document) { + setup(document, null, null); + } + + /* + * @see org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension#setup(org.eclipse.jface.text.IDocument, org.eclipse.core.runtime.IPath, org.eclipse.core.filebuffers.LocationKind) + */ + public void setup(IDocument document, IPath location, LocationKind locationKind) { CTextTools tools= CUIPlugin.getDefault().getTextTools(); - tools.setupCDocument(document); + tools.setupCDocument(document, location, locationKind); } - } Index: src/org/eclipse/cdt/internal/ui/preferences/formatter/CPreview.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/CPreview.java,v retrieving revision 1.4 diff -u -r1.4 CPreview.java --- src/org/eclipse/cdt/internal/ui/preferences/formatter/CPreview.java 18 Dec 2006 15:21:32 -0000 1.4 +++ src/org/eclipse/cdt/internal/ui/preferences/formatter/CPreview.java 23 Jan 2008 15:41:43 -0000 @@ -110,7 +110,7 @@ CTextTools tools= CUIPlugin.getDefault().getTextTools(); fPreviewDocument= new Document(); fWorkingValues= workingValues; - tools.setupCDocumentPartitioner( fPreviewDocument, ICPartitions.C_PARTITIONING); + tools.setupCDocumentPartitioner(fPreviewDocument, ICPartitions.C_PARTITIONING, null); PreferenceStore prioritizedSettings= new PreferenceStore(); Index: src/org/eclipse/cdt/ui/CUIPlugin.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CUIPlugin.java,v retrieving revision 1.74 diff -u -r1.74 CUIPlugin.java --- src/org/eclipse/cdt/ui/CUIPlugin.java 8 Jan 2008 11:27:57 -0000 1.74 +++ src/org/eclipse/cdt/ui/CUIPlugin.java 23 Jan 2008 15:41:43 -0000 @@ -88,6 +88,8 @@ import org.eclipse.cdt.internal.ui.text.CTextTools; import org.eclipse.cdt.internal.ui.text.PreferencesAdapter; import org.eclipse.cdt.internal.ui.text.c.hover.CEditorTextHoverDescriptor; +import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; +import org.eclipse.cdt.internal.ui.text.doctools.EditorReopener; import org.eclipse.cdt.internal.ui.text.folding.CFoldingStructureProviderRegistry; import org.eclipse.cdt.internal.ui.util.ImageDescriptorRegistry; import org.eclipse.cdt.internal.ui.util.ProblemMarkerManager; @@ -102,6 +104,8 @@ public static final String CVIEW_ID = PLUGIN_ID + ".CView"; //$NON-NLS-1$ public static final String C_PROBLEMMARKER = PLUGIN_CORE_ID + ".problem"; //$NON-NLS-1$ + public static final String ID_COMMENT_OWNER= PLUGIN_ID+".DocCommentOwner"; //$NON-NLS-1$ + public static final String ID_INCLUDE_BROWSER= PLUGIN_ID + ".includeBrowser"; //$NON-NLS-1$ public static final String ID_CALL_HIERARCHY= PLUGIN_ID + ".callHierarchy"; //$NON-NLS-1$ public static final String ID_TYPE_HIERARCHY = PLUGIN_ID + ".typeHierarchy"; //$NON-NLS-1$ @@ -475,6 +479,8 @@ getASTProvider(); CDTContextActivator.getInstance().install(); + DocCommentOwnerManager.getInstance().addListener(new EditorReopener()); + // start make-ui plugin, such that it can check for project conversions. Job job= new Job(Messages.CUIPlugin_jobStartMakeUI) { protected IStatus run(IProgressMonitor monitor) { Index: src/org/eclipse/cdt/ui/text/ICPartitions.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/text/ICPartitions.java,v retrieving revision 1.3 diff -u -r1.3 ICPartitions.java --- src/org/eclipse/cdt/ui/text/ICPartitions.java 29 Sep 2006 15:36:06 -0000 1.3 +++ src/org/eclipse/cdt/ui/text/ICPartitions.java 23 Jan 2008 15:41:43 -0000 @@ -23,7 +23,7 @@ String C_PARTITIONING= "___c_partitioning"; //$NON-NLS-1$ /** - * The identifier of the single-line end comment partition content type. + * The identifier of the single-line comment partition content type. */ String C_SINGLE_LINE_COMMENT= "__c_singleline_comment"; //$NON-NLS-1$ @@ -46,4 +46,28 @@ * The identifier of the C preprocessor partition content type. */ String C_PREPROCESSOR= "__c_preprocessor"; //$NON-NLS-1$ + + /** + * The identifier of the single-line documentation tool comment partition content type. + */ + String C_SINGLE_LINE_DOC_COMMENT= "__c_singleline_doc_comment"; //$NON-NLS-1$ + + /** + * The identifier multi-line comment documentation tool partition content type. + */ + String C_MULTI_LINE_DOC_COMMENT= "__c_multiline_doc_comment"; //$NON-NLS-1$ + + /** + * + * @since 5.0 + */ + String[] ALL_CPARTITIONS= { + ICPartitions.C_MULTI_LINE_COMMENT, + ICPartitions.C_SINGLE_LINE_COMMENT, + ICPartitions.C_STRING, + ICPartitions.C_CHARACTER, + ICPartitions.C_PREPROCESSOR, + ICPartitions.C_SINGLE_LINE_DOC_COMMENT, + ICPartitions.C_MULTI_LINE_DOC_COMMENT + }; } Index: src/org/eclipse/cdt/ui/newui/Page_head_general.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/Page_head_general.java,v retrieving revision 1.2 diff -u -r1.2 Page_head_general.java --- src/org/eclipse/cdt/ui/newui/Page_head_general.java 14 Jun 2007 19:36:57 -0000 1.2 +++ src/org/eclipse/cdt/ui/newui/Page_head_general.java 23 Jan 2008 15:41:43 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2007 Intel Corporation and others + * Copyright (c) 2005, 2008 Intel Corporation and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,16 +7,71 @@ * * Contributors: * Intel Corporation - initial API and implementation + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.ui.newui; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Preferences; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.dialogs.PropertyPage; -public class Page_head_general extends PropertyPage { +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.ui.dialogs.DocCommentOwnerBlock; +import org.eclipse.cdt.ui.dialogs.ICOptionContainer; + +public class Page_head_general extends PropertyPage implements ICOptionContainer { + private DocCommentOwnerBlock fDocBlock; + private boolean isProjectLevel; + protected Control createContents(Composite parent) { + isProjectLevel= getElement() instanceof IProject; + if(isProjectLevel) { + fDocBlock= new DocCommentOwnerBlock(); + fDocBlock.setContainer(this); + fDocBlock.createControl(parent); + } noDefaultAndApplyButton(); return parent; } + + protected void performDefaults() { + if(isProjectLevel) { + fDocBlock.performDefaults(); + } + super.performDefaults(); + } + + public boolean performOk() { + if(isProjectLevel) { + try { + fDocBlock.performApply(new NullProgressMonitor()); + } catch(CoreException ce) { + CCorePlugin.log(ce); + } + } + return true; + } + + public IProject getProject(){ + IProject project= null; + IAdaptable elem = getElement(); + if (elem instanceof IProject) { + project= (IProject) elem; + } else if (elem != null) { + project= (IProject) elem.getAdapter(IProject.class); + } + return project; + } + + public Preferences getPreferences() { + throw new UnsupportedOperationException(); + } + + public void updateContainer() { + } } Index: schema/completionProposalComputer.exsd =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/schema/completionProposalComputer.exsd,v retrieving revision 1.1 diff -u -r1.1 completionProposalComputer.exsd --- schema/completionProposalComputer.exsd 24 Jan 2007 16:11:48 -0000 1.1 +++ schema/completionProposalComputer.exsd 23 Jan 2008 15:41:42 -0000 @@ -115,6 +115,10 @@ + + + + Index: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCompletionProposalComputer.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCompletionProposalComputer.java diff -N src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCompletionProposalComputer.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCompletionProposalComputer.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,104 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text.doctools.generic; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITypedRegion; +import org.eclipse.jface.text.TextUtilities; + +import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.contentassist.ContentAssistInvocationContext; +import org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer; + +import org.eclipse.cdt.internal.ui.text.contentassist.CCompletionProposal; + +/** + * CompletionProposalComputer based on a specified set of GenericTag objects. + */ +public class GenericTagCompletionProposalComputer implements ICompletionProposalComputer { + char[] tagMarkers; + + GenericDocTag[] tags; + + public GenericTagCompletionProposalComputer(GenericDocTag[] tags) { + this.tags= tags; + this.tagMarkers= new char[] {'@','\\'}; + } + + protected boolean isTagMarker(char c) { + for(int i=0; i tr.getOffset() && !Character.isWhitespace(doc.get(firstNonWS-1, 1).charAt(0))) + firstNonWS--; + String prefix= doc.get(firstNonWS, ivcOffset-firstNonWS); + if(prefix.length()>0 && isTagMarker(prefix.charAt(0))) { + List proposals= new ArrayList(); + char tagMarker= prefix.charAt(0); + for(int i=0; i0) { + for(int i=0; i= candidateOffset) && (offset < candidateEndOffset); + if(candidateEnclosesOffset) { + stopWhenLeaving= declaration; + } + } + } + return PROCESS_CONTINUE; + } + public int leave(IASTDeclaration declaration) { + if(declaration==stopWhenLeaving) + return PROCESS_ABORT; + return PROCESS_CONTINUE; + } + }; + + if(unit!=null) { + unit.accept(av); + } + return dec[0]; + } + + /** + * @return the ast unit for the active editor, or null if there is no active editor, or + * the ast could not be obtained. + */ + public static IASTTranslationUnit getAST() { + final ITranslationUnit unit= getTranslationUnit(); + try { + if(unit!=null) { + IASTTranslationUnit ast= unit.getAST(null, ITranslationUnit.AST_SKIP_ALL_HEADERS); + return ast; + } + } catch(CModelException ce) { + CCorePlugin.log(ce); + } catch(CoreException ce) { + CCorePlugin.log(ce); + } + return null; + } + + /** + * Assuming the offset is within a multi-line comment, returns a guess as to + * whether the enclosing multi-line comment is a new comment. The result is undefined if + * the offset does not occur within a multi-line comment. + * + * @param document the document + * @param offset the offset + * @return true if the comment should be closed, false if not + */ + /* + * Adapted from JDT + */ + public boolean shouldCloseMultiline(IDocument document, int offset) { + try { + IRegion line= document.getLineInformationOfOffset(offset); + ITypedRegion partition= TextUtilities.getPartition(document, ICPartitions.C_PARTITIONING, offset, false); + int partitionEnd= partition.getOffset() + partition.getLength(); + if (line.getOffset() >= partitionEnd) + return false; + + String comment= document.get(partition.getOffset(), partition.getLength()); + if (comment.indexOf(MULTILINE_START, offset - partition.getOffset()) != -1) + return true; // enclosed another comment -> probably a new comment + + if (document.getLength() == partitionEnd) { + return !comment.endsWith(MULTILINE_END); + } + + return false; + + } catch (BadLocationException e) { + return false; + } + } + + /** + * @return the ITranslationUnit for the active editor, or null if no active + * editor could be found. + */ + /* + * Cloned from JDT + */ + protected static ITranslationUnit getTranslationUnit() { + IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window == null) + return null; + + IWorkbenchPage page= window.getActivePage(); + if (page == null) + return null; + + IEditorPart editor= page.getActiveEditor(); + if (editor == null) + return null; + + IWorkingCopyManager manager= CUIPlugin.getDefault().getWorkingCopyManager(); + ITranslationUnit unit= manager.getWorkingCopy(editor.getEditorInput()); + if (unit == null) + return null; + + return unit; + } + + /** + * Returns a new buffer with the specified indent string inserted at the beginning + * of each line in the specified input buffer + * @param buffer + * @param indent + */ + protected static final StringBuffer indent(StringBuffer buffer, String indent) { + StringBuffer result= new StringBuffer(); + BufferedReader br= new BufferedReader(new StringReader(buffer.toString())); + try { + for(String line= br.readLine(); line!=null; line= br.readLine()) { + result.append(indent + line + "\n"); //$NON-NLS-1$ + } + } catch(IOException ioe) { + throw new AssertionError(); // we can't get IO errors from a string backed reader + } + return result; + } + + /** + * Returns the offset of the first non-whitespace character in the specified document, searching + * right/downward from the specified start offset up to the specified end offset. If there is + * no nonwhitespace then the end offset is returned. + * @param document + * @param offset + * @param end + * @throws BadLocationException + */ + protected static int findEndOfWhiteSpaceAt(IDocument document, int offset, int end) throws BadLocationException { + while (offset < end) { + char c= document.getChar(offset); + if (c != ' ' && c != '\t') { + return offset; + } + offset++; + } + return end; + } + + /** + * Returns the range of the Javadoc prefix on the given line in + * document. The prefix greedily matches the following regex + * pattern: \w*\*\w*, that is, any number of whitespace + * characters, followed by an asterix ('*'), followed by any number of + * whitespace characters. + * + * @param document the document to which line refers + * @param line the line from which to extract the prefix range + * @return an IRegion describing the range of the prefix on + * the given line + * @throws BadLocationException if accessing the document fails + */ + protected static IRegion findPrefixRange(IDocument document, IRegion line) throws BadLocationException { + int lineOffset= line.getOffset(); + int lineEnd= lineOffset + line.getLength(); + int indentEnd= findEndOfWhiteSpaceAt(document, lineOffset, lineEnd); + if (indentEnd < lineEnd && document.getChar(indentEnd) == '*') { + indentEnd++; + while (indentEnd < lineEnd && document.getChar(indentEnd) != ' ') + indentEnd++; + while (indentEnd < lineEnd && document.getChar(indentEnd) == ' ') + indentEnd++; + } + return new Region(lineOffset, indentEnd - lineOffset); + } + + /** + * Returns whether the text ends with one of the specified IDocument object's + * legal line delimiters. + */ + protected static boolean endsWithDelimiter(IDocument d, String txt) { + String[] delimiters= d.getLegalLineDelimiters(); + for (int i= 0; i < delimiters.length; i++) { + if (txt.endsWith(delimiters[i])) + return true; + } + return false; + } +} Index: src/org/eclipse/cdt/ui/text/ICTokenScanner.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/ICTokenScanner.java diff -N src/org/eclipse/cdt/ui/text/ICTokenScanner.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/ICTokenScanner.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text; + +import org.eclipse.jface.text.rules.ITokenScanner; +import org.eclipse.cdt.ui.IPropertyChangeParticipant; + +/** + * Interface for CDT Scanners. Scanners used in CDT must additionally be + * IPropertyChangeParticipant's. + * + * @since 5.0 + */ +public interface ICTokenScanner extends ITokenScanner, IPropertyChangeParticipant { +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppSingleConfiguration.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppSingleConfiguration.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppSingleConfiguration.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppSingleConfiguration.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,40 @@ +package org.eclipse.cdt.internal.ui.text.doctools.docpp; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy; +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; + +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.text.doctools.generic.AbstractGenericTagDocCommentViewerConfiguration; +import org.eclipse.cdt.ui.text.doctools.generic.GenericDocTag; + +public class DocppSingleConfiguration extends AbstractGenericTagDocCommentViewerConfiguration { + GenericDocTag[] tags; + + public DocppSingleConfiguration() { + super(DocppHelper.getDocPPTags(), new char[] {'@','\\'}, DocppHelper.DOCPP_SINGLE_TOKEN, DocppHelper.DOCPP_TAG_RECOGNIZED); + } + + public IAutoEditStrategy createAutoEditStrategy() { + return new DefaultIndentLineAutoEditStrategy(); + } + + public boolean isDocumentationComment(IDocument doc, int offset, int length) { + try { + if(offset+2 < doc.getLength()) { + char c= doc.getChar(offset+2); + if(c == '@') { + if(offset + 3 < doc.getLength()) { + char d= doc.getChar(offset+3); + return d == '{' || d == '}'; + } + } + return c == '/'; + } + } catch(BadLocationException ble) { + CUIPlugin.getDefault().log(ble); + } + return false; + } +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineConfiguration.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineConfiguration.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineConfiguration.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineConfiguration.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,31 @@ +package org.eclipse.cdt.internal.ui.text.doctools.doxygen; + +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.text.doctools.generic.AbstractGenericTagDocCommentViewerConfiguration; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; + +public class DoxygenMultilineConfiguration extends AbstractGenericTagDocCommentViewerConfiguration { + + public DoxygenMultilineConfiguration() { + super(DoxygenHelper.getDoxygenTags(), new char[] {'@','\\'}, DoxygenHelper.DOXYGEN_MULTI_TOKEN, DoxygenHelper.DOXYGEN_TAG_RECOGNIZED); + } + + public IAutoEditStrategy createAutoEditStrategy() { + return new DoxygenMultilineAutoEditStrategy(); + } + + public boolean isDocumentationComment(IDocument doc, int offset, int length) { + try { + if(offset+2 < doc.getLength()) { + char c= doc.getChar(offset+2); + return c == '*' || c == '!'; + } + } catch(BadLocationException ble) { + CUIPlugin.getDefault().log(ble); + } + return false; + } +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentOwner.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentOwner.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentOwner.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentOwner.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.text.doctools; + +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; + +public final class NullDocCommentOwner extends DocCommentOwner { + private static final String ID = "org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner"; //$NON-NLS-1$ + public static final IDocCommentOwner INSTANCE= new NullDocCommentOwner(); + private NullDocCommentOwner() { + super( + ID, + Messages.NullDocCommentOwner_Name, + NullDocCommentViewerConfiguration.INSTANCE, + NullDocCommentViewerConfiguration.INSTANCE + ); + } +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSinglelineProposalComputer.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSinglelineProposalComputer.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSinglelineProposalComputer.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSinglelineProposalComputer.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.text.doctools; + +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; +import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; + + +public class DocCommentSinglelineProposalComputer extends AbstractDocCommentProposalComputer { + protected IDocCommentViewerConfiguration getConfiguration(IDocCommentOwner owner) { + return owner.getSinglelineConfiguration(); + } +} Index: src/org/eclipse/cdt/ui/text/ITokenStoreFactory.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/ITokenStoreFactory.java diff -N src/org/eclipse/cdt/ui/text/ITokenStoreFactory.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/ITokenStoreFactory.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text; + +/** + * A means of obtaining ITokenStore objects + * @since 5.0 + */ +public interface ITokenStoreFactory { + /** + * @param propertyColorNames + * @return a token store object initialized with the specified propertyColorNames + */ + public ITokenStore createTokenStore(String[] propertyColorNames); +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineAutoEditStrategy.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineAutoEditStrategy.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineAutoEditStrategy.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineAutoEditStrategy.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,80 @@ +package org.eclipse.cdt.internal.ui.text.doctools.docpp; + +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITypedRegion; + +import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; +import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; + +/** + * {@link IAutoEditStrategy} for adding Docpp tags for comments. + */ +public class DocppMultilineAutoEditStrategy extends DefaultMultilineCommentAutoEditStrategy { + private static final String PARAM = "@param "; //$NON-NLS-1$ + private static final String RETURN = "@return\n"; //$NON-NLS-1$ + + protected StringBuffer paramTags(IASTParameterDeclaration[] decls) { + StringBuffer result= new StringBuffer(); + for(int i=0; i*/ fOwners; + private IDocCommentOwner fWorkspaceOwner; + private Map prj2map= new HashMap(); + private static List fListeners; + + private DocCommentOwnerManager() { + fOwners= getCommentOwnerExtensions(); + fListeners= new ArrayList(); + + Preferences prefs= new InstanceScope().getNode(QUALIFIER).node(WORKSPACE_DOC_TOOL_NODE); + String id= prefs.get(PREFKEY_WORKSPACE_DEFAULT, NullDocCommentOwner.INSTANCE.getID()); + fWorkspaceOwner= getOwner(id); + if(fWorkspaceOwner == null) { + // this could occur if a plug-in is no longer available + fWorkspaceOwner= NullDocCommentOwner.INSTANCE; + } + } + + /** + * @param project a non-null project + * @return whether the specified project defines any documentation owner association + */ + public boolean projectDefinesOwnership(IProject project) { + return !getProjectMap(project).isEmpty(); + } + + /** + * @param owner the non-null doc-comment owner + */ + public void setWorkspaceCommentOwner(IDocCommentOwner owner) { + if(owner == null) + throw new IllegalArgumentException(); + IDocCommentOwner old= fWorkspaceOwner; + fWorkspaceOwner= owner; + + Preferences prefs= new InstanceScope().getNode(QUALIFIER).node(WORKSPACE_DOC_TOOL_NODE); + prefs.put(PREFKEY_WORKSPACE_DEFAULT, owner.getID()); + + fireWorkspaceOwnershipChanged(old, fWorkspaceOwner); + } + + /** + * @return the doc comment owner associated with the workspace. If non + * is set, the {@link NullDocCommentOwner} is returned. + */ + public IDocCommentOwner getWorkspaceCommentOwner() { + return fWorkspaceOwner; + } + + /** + * + * @param resource May be null. + * @return a non-null IDocCommentOwner. If the resource was null, the {@link NullDocCommentOwner} is returned. + */ + public IDocCommentOwner getCommentOwner(IResource resource) { + if(resource==null) + return NullDocCommentOwner.INSTANCE; + + if(ResourcesPlugin.getWorkspace().getRoot().equals(resource)) + return getWorkspaceCommentOwner(); + + ProjectMap pm= getProjectMap(resource); + String ownerID= pm.getOwnerID(resource); + IDocCommentOwner result= getOwner(ownerID); + return result == null ? fWorkspaceOwner : result; + } + + /** + * @param id + * @return the {@link IDocCommentOwner} with the specified id, or null + */ + public IDocCommentOwner getOwner(String id) { + if(NullDocCommentOwner.INSTANCE.getID().equals(id)) { + return NullDocCommentOwner.INSTANCE; + } + return (IDocCommentOwner) fOwners.get(id); + } + + /** + * @param resource a non-null resource to map a comment owner to + * @param owner the new owner to assign, or null to inherit the parent's mapping + * @param removeSubMappings if the resource is an {@link IContainer}, then remove any mappings + * children have. This is currently unimplemented. + */ + /* + * Note - this implementation currently ignores removeSubMappings. + */ + public void setCommentOwner(IResource resource, IDocCommentOwner owner, boolean removeSubMappings) { + Assert.isNotNull(resource); + + if(ResourcesPlugin.getWorkspace().getRoot().equals(resource)) { + setWorkspaceCommentOwner(owner); + return; + } + + ProjectMap pm= getProjectMap(resource); + IDocCommentOwner old= getCommentOwner(resource); + pm.setCommentOwner(resource, owner); + IDocCommentOwner n3w= getCommentOwner(resource); + fireOwnershipChanged(resource, removeSubMappings, old, n3w); + } + + /** + * @return any comment owners registered against the extension point. This does not include + * the null comment processor. + */ + public IDocCommentOwner[] getRegisteredOwners() { + return (IDocCommentOwner[]) fOwners.values().toArray(new IDocCommentOwner[fOwners.values().size()]); + } + + + /** + * @param listener registers a listener for doc-comment ownership events + */ + public void addListener(IDocCommentOwnershipListener listener) { + if(!fListeners.contains(listener)) { + fListeners.add(listener); + } + } + + /** + * @param listener removes a listener from those registered for doc-comment ownership events + */ + public void removeListener(IDocCommentOwnershipListener listener) { + fListeners.add(listener); + } + + /* + * Utilities + */ + + /** + * @param resource a non-null resource + * @return the cached (or newly obtained) ProjectMap for the resources + * associated project. + */ + private ProjectMap getProjectMap(IResource resource) { + Assert.isNotNull(resource); + IProject project= resource.getProject(); + + if(!prj2map.containsKey(project)) { + prj2map.put(project, new ProjectMap(project)); + } + + return (ProjectMap) prj2map.get(project); + } + + /** + * @return a map of ID to {@link IDocCommentOwner} for comment owners registered + * via the DocCommentOwner extension point + */ + private static Map getCommentOwnerExtensions() { + Map result= new HashMap(); + + IExtensionRegistry registry = Platform.getExtensionRegistry(); + IExtensionPoint indexProviders = registry.getExtensionPoint(CUIPlugin.ID_COMMENT_OWNER); + IExtension[] extensions = indexProviders.getExtensions(); + for(int i=0; i + *
  • Reacting to changes to preferences in a specified {@link IPreferenceStore} + *
  • Managing whether further styles (bold, italic, strikethrough, underline) should be applied + *
  • Coping with + * + * + * ITokenStore assumes style preferences are stored under the following names + *

    + * Preference color key + {@link PreferenceConstants#EDITOR_BOLD_SUFFIX} are used + * to retrieve whether the token is rendered in bold. + *

    + *

    + * Preference color key + {@link PreferenceConstants#EDITOR_ITALIC_SUFFIX} are used + * to retrieve whether the token is rendered in italic. + *

    + *

    + * Preference color key + {@link PreferenceConstants#EDITOR_STRIKETHROUGH_SUFFIX} are used + * to retrieve whether the token is rendered in strikethrough. + *

    + *

    + * Preference color key + {@link PreferenceConstants#EDITOR_UNDERLINE_SUFFIX} are used + * to retrieve whether the token is rendered in underline. + *

    + * + * @see ITokenStoreFactory + * @since 5.0 + */ +public interface ITokenStore extends IPropertyChangeParticipant { + /** + * Ensures any IToken objects that will be or have been returned are + * initialized for display. + */ + void ensureTokensInitialised(); + + /** + * @param property + * @return a token for the specified property. The Token may not be suitable for use if the + * current Display is null. Clients should call ITokenStoreFactory#ensureTokensInitialised() at the + * point of token use. // TODO - I've not yet determined when this is necessary + */ + IToken getToken(String property); + + /** + * @return The preference store used to read token styling preferences from. + */ + IPreferenceStore getPreferenceStore(); +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwner.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwner.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwner.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwner.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,61 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.ui.text.doctools; + +import org.eclipse.core.runtime.Assert; + +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; +import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; + +/** + * Internal implementation of IDocCommentOwner + */ +public class DocCommentOwner implements IDocCommentOwner { + private final String id; + private final String name; + private final IDocCommentViewerConfiguration multi, single; + + public DocCommentOwner(String id, String name, IDocCommentViewerConfiguration multi, IDocCommentViewerConfiguration single) { + Assert.isNotNull(id); Assert.isNotNull(name); Assert.isNotNull(multi); Assert.isNotNull(single); + this.id= id; + this.name= name; + this.multi= multi; + this.single= single; + } + + /* + * @see org.eclipse.cdt.ui.text.ICCommentOwner#getID() + */ + public String getID() { + return id; + } + + /* + * @see org.eclipse.cdt.ui.text.ICCommentOwner#getName() + */ + public String getName() { + return name; + } + + /* + * @see org.eclipse.cdt.ui.text.ICCommentOwner#getMultilineConfiguration() + */ + public IDocCommentViewerConfiguration getMultilineConfiguration() { + return multi; + } + + /* + * @see org.eclipse.cdt.ui.text.ICCommentOwner#getSinglelineConfiguration() + */ + public IDocCommentViewerConfiguration getSinglelineConfiguration() { + return single; + } +} Index: src/org/eclipse/cdt/ui/IPropertyChangeParticipant.java =================================================================== RCS file: src/org/eclipse/cdt/ui/IPropertyChangeParticipant.java diff -N src/org/eclipse/cdt/ui/IPropertyChangeParticipant.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/IPropertyChangeParticipant.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial Implementation + *******************************************************************************/ +package org.eclipse.cdt.ui; + +import org.eclipse.jface.util.PropertyChangeEvent; + +/** + * Implemented by classes which can optionally participate in property + * change events, and report whether an event would affect them without + * adapting to it. + * + * @since 5.0 + */ +public interface IPropertyChangeParticipant { + /** + * @param event + * @return true if the specified event will affect the participant's + * behaviour in a way it determines potential clients could act upon. + */ + public boolean affectsBehavior(PropertyChangeEvent event); + + /** + * Performs any necessary to adapt the participant to the specified event. + * @param event + */ + public void adaptToPreferenceChange(PropertyChangeEvent event); +} Index: src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwner.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwner.java diff -N src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwner.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwner.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text.doctools; + +/** + * A comment owner provides {@link IDocCommentViewerConfiguration} ov + * the CDT c/c++ editor. + * + * This interface is not intended to be implemented externally to CDT. + * @since 5.0 + */ +public interface IDocCommentOwner { + /** + * @return the non-null unique identifier for this comment owner. If contributed via the + * extension point, the ID corresponds to that in plugin.xml. + */ + String getID(); + + /** + * @return a non-null human-readable name for this comment owner. If contributed via plugin.xml + * this name can be localized using the plug-in externalization mechanism. + */ + String getName(); + + /** + * @return a non-null {@link IDocCommentViewerConfiguration} suitable for a multi-line comment context + */ + IDocCommentViewerConfiguration getMultilineConfiguration(); + + /** + * @return a non-null {@link IDocCommentViewerConfiguration} suitable for a single-line comment context + */ + IDocCommentViewerConfiguration getSinglelineConfiguration(); +} Index: src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwnershipListener.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwnershipListener.java diff -N src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwnershipListener.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/doctools/IDocCommentOwnershipListener.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text.doctools; + +import org.eclipse.core.resources.IResource; + + +/** + * Implemented by clients interested in documentation comment ownership change events. These are generated + * when the association between resource or workspace and documentation comment owner is set. + * @since 5.0 + */ +public interface IDocCommentOwnershipListener { + /** + * Called when document comment ownership has changed. + * @param resource + * @param submappingsRemoved + * @param old + * @param newOwner + */ + public void ownershipChanged(IResource resource, boolean submappingsRemoved, IDocCommentOwner old, IDocCommentOwner newOwner); + + /** + * TODO + * @param old + * @param newOwner + */ + public void workspaceOwnershipChanged(IDocCommentOwner old, IDocCommentOwner newOwner); +} Index: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCommentScanner.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCommentScanner.java diff -N src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCommentScanner.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagCommentScanner.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text.doctools.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.Preferences; +import org.eclipse.jface.text.rules.BufferedRuleBasedScanner; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.IWordDetector; +import org.eclipse.jface.text.rules.WordRule; +import org.eclipse.jface.util.PropertyChangeEvent; + +import org.eclipse.cdt.ui.PreferenceConstants; +import org.eclipse.cdt.ui.text.ICTokenScanner; +import org.eclipse.cdt.ui.text.ITokenStore; +import org.eclipse.cdt.ui.text.ITokenStoreFactory; +import org.eclipse.cdt.ui.text.TaskTagRule; + +/** + * ICTokenScanner which recognizes a specified set of tags, starting with a specified name + */ +public class GenericTagCommentScanner extends BufferedRuleBasedScanner implements ICTokenScanner { + private TaskTagRule fTaskTagRule; + private Preferences fCorePreferenceStore; + private String fDefaultTokenProperty; + private String fTagToken; + + private GenericDocTag[] fTags; + private char[] fTagMarkers; + private ITokenStore fTokenStore; + + private static String[] mkArray(String defaultTokenProperty, String tagToken) { + return new String[] { defaultTokenProperty, tagToken, PreferenceConstants.EDITOR_TASK_TAG_COLOR }; + } + + /** + * @param tokenStoreFactory + * @param docToken + * @param tagToken + * @param tags + * @param tagMarkers + */ + public GenericTagCommentScanner(ITokenStoreFactory tokenStoreFactory, String docToken, String tagToken, GenericDocTag[] tags, char[] tagMarkers) { + Assert.isNotNull(tags); + fTags= tags; + fTagMarkers= tagMarkers; + fTagToken= tagToken; + + fTokenStore= tokenStoreFactory.createTokenStore(mkArray(docToken, tagToken)); + fCorePreferenceStore= null; // TODO + fDefaultTokenProperty= docToken; + + setRules(createRules()); + } + + public IToken nextToken() { + fTokenStore.ensureTokensInitialised(); + return super.nextToken(); + } + + protected IRule[] createRules() { + List result= new ArrayList(); + + class TagDetector implements IWordDetector { + public boolean isWordStart(char c) { + return c == '@' || c == '\\'; + } + public boolean isWordPart(char c) { + return c == '.' || Character.isJavaIdentifierPart(c); + } + } + + WordRule wr= new WordRule(new TagDetector(), fTokenStore.getToken(fDefaultTokenProperty)); + for(int i=0; i + *
  • Maintains mappings from project relative paths to comment-owner ID's + *
  • Manages persistence of these mappings to the .cproject file. + * + * for a particular {@link IProject} + * + * @since 5.0 + */ +class ProjectMap { + /** .cproject xml element/attribute names **/ + private static final String ATTRVAL_STORAGEID= "org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"; //$NON-NLS-1$ + private static final String ELEMENT_DOC_COMMENT_OWNER = "doc-comment-owner"; //$NON-NLS-1$ + private static final String ATTRKEY_DCO_ID = "id"; //$NON-NLS-1$ + private static final String ELEMENT_PATH = "path"; //$NON-NLS-1$ + private static final String ATTRKEY_PATH_VALUE = "value"; //$NON-NLS-1$ + + private IProject fProject; + private Map/**/ fMap; + + /** + * Loads the project map + * @param project + */ + public ProjectMap(IProject project) { + try { + fMap= load(project); + } catch(CoreException ce) { + CUIPlugin.getDefault().log(ce); + fMap= new HashMap(); + } + fProject= project; + } + + /** + * Returns the id of the doc comment owner mapped to the resource specified, or null + * if no owner is mapped within this project. Ownership is inherited from parents and + * may be overridden. + * @param resource + * @return possibly null + */ + public String getOwnerID(IResource resource) { + String id= null; + if(resource!=null) { + for(IPath p= resource.getProjectRelativePath(); ; p= p.removeLastSegments(1)) { + if(fMap.containsKey(p)) { + id= (String) fMap.get(p); + break; + } + if(p.isEmpty()) + break; + } + } + return id; + } + + /** + * Creates a new (or updates the existing) mapping associating the specified + * {@link IDocCommentOwner} with the specified {@link IResource} + * @param resource the non-null resource to create an association for + * @param owner the owner to associate the resource with, or null to ensure there + * is no association. + */ + public void setCommentOwner(IResource resource, IDocCommentOwner owner) { + Assert.isNotNull(resource); + if(ResourcesPlugin.getWorkspace().getRoot().equals(resource)) + throw new IllegalStateException(); + if(owner!=null) { + fMap.put(resource.getProjectRelativePath(), owner.getID()); + } else { + fMap.remove(resource.getProjectRelativePath()); + } + try { + save(); + } catch(CoreException ce) { + CUIPlugin.getDefault().log(ce); + } + } + + public boolean isEmpty() { + return fMap.isEmpty(); + } + + private static Map load(IProject project) throws CoreException { + Map result= new HashMap(); + ICDescriptor pd= CCorePlugin.getDefault().getCProjectDescription(project, true); + Element e= pd.getProjectData(ATTRVAL_STORAGEID); + if(e.hasChildNodes()) { + NodeList commentOwners= e.getElementsByTagName(ELEMENT_DOC_COMMENT_OWNER); + for(int i=0; iIDocument. Used to collaborate with + * the break iterator. + * + * @see IDocument + * @since 2.0 + */ + static class DocumentCharacterIterator implements CharacterIterator { + + /** Document to iterate over. */ + private IDocument fDocument; + /** Start offset of iteration. */ + private int fOffset= -1; + /** End offset of iteration. */ + private int fEndOffset= -1; + /** Current offset of iteration. */ + private int fIndex= -1; + + /** Creates a new document iterator. */ + public DocumentCharacterIterator() { + } + + /** + * Configures this document iterator with the document section to be visited. + * + * @param document the document to be iterated + * @param iteratorRange the range in the document to be iterated + */ + public void setDocument(IDocument document, IRegion iteratorRange) { + fDocument= document; + fOffset= iteratorRange.getOffset(); + fEndOffset= fOffset + iteratorRange.getLength(); + } + + /* + * @see CharacterIterator#first() + */ + public char first() { + fIndex= fOffset; + return current(); + } + + /* + * @see CharacterIterator#last() + */ + public char last() { + fIndex= fOffset < fEndOffset ? fEndOffset -1 : fEndOffset; + return current(); + } + + /* + * @see CharacterIterator#current() + */ + public char current() { + if (fOffset <= fIndex && fIndex < fEndOffset) { + try { + return fDocument.getChar(fIndex); + } catch (BadLocationException x) { + } + } + return DONE; + } + + /* + * @see CharacterIterator#next() + */ + public char next() { + ++fIndex; + int end= getEndIndex(); + if (fIndex >= end) { + fIndex= end; + return DONE; + } + return current(); + } + + /* + * @see CharacterIterator#previous() + */ + public char previous() { + if (fIndex == fOffset) + return DONE; + + if (fIndex > fOffset) + -- fIndex; + + return current(); + } + + /* + * @see CharacterIterator#setIndex(int) + */ + public char setIndex(int index) { + fIndex= index; + return current(); + } + + /* + * @see CharacterIterator#getBeginIndex() + */ + public int getBeginIndex() { + return fOffset; + } + + /* + * @see CharacterIterator#getEndIndex() + */ + public int getEndIndex() { + return fEndOffset; + } + + /* + * @see CharacterIterator#getIndex() + */ + public int getIndex() { + return fIndex; + } + + /* + * @see CharacterIterator#clone() + */ + public Object clone() { + DocumentCharacterIterator i= new DocumentCharacterIterator(); + i.fDocument= fDocument; + i.fIndex= fIndex; + i.fOffset= fOffset; + i.fEndOffset= fEndOffset; + return i; + } + } + + + /** + * The document character iterator used by this strategy. + * @since 2.0 + */ + private DocumentCharacterIterator fDocIter= new DocumentCharacterIterator(); + + /* + * @see org.eclipse.jface.text.ITextDoubleClickStrategy#doubleClicked(org.eclipse.jface.text.ITextViewer) + */ + public void doubleClicked(ITextViewer text) { + + int position= text.getSelectedRange().x; + + if (position < 0) + return; + + IRegion word= getWordRegion(text.getDocument(), position); + + if (word != null) + text.setSelectedRange(word.getOffset(), word.getLength()); + } + + /** + * Returns a region describing the word around position. + * + * @param document the document + * @param position the offset around which to return the word + * @return the word's region, or null for no selection + */ + private IRegion getWordRegion(IDocument document, int position) { + try { + + IRegion line= document.getLineInformationOfOffset(position); + if (position == line.getOffset() + line.getLength()) + return null; + + fDocIter.setDocument(document, line); + + BreakIterator breakIter= BreakIterator.getWordInstance(); + breakIter.setText(fDocIter); + + int start= breakIter.preceding(position); + if (start == BreakIterator.DONE) + start= line.getOffset(); + + int end= breakIter.following(position); + if (end == BreakIterator.DONE) + end= line.getOffset() + line.getLength(); + + if (breakIter.isBoundary(position)) { + if (end - position > position- start) + start= position; + else + end= position; + } + + if (start > 0 && isTagMarker(document.getChar(start - 1)) && Character.isJavaIdentifierPart(document.getChar(start)) + && (start == 1 || Character.isWhitespace(document.getChar(start - 2)) || document.getChar(start - 2) == '{')) { + // double click after @ident + start--; + } else if (end == position && end == start + 1 && end < line.getOffset() + line.getLength() && document.getChar(end) == '@') { + // double click before " @ident" + return getWordRegion(document, position + 1); + } + + if (start == end) + return null; + return new Region(start, end - start); + + } catch (BadLocationException x) { + return null; + } + } + + + protected boolean isTagMarker(char c) { + for(int i=0; i max) + max= e.length; + } + + + int addedLength2=0; + for(int i=0; i= 0; + } + + /* + * (non-Javadoc) + * @see org.eclipse.cdt.ui.IPropertyChangeParticipant#adaptToPreferenceChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void adaptToPreferenceChange(PropertyChangeEvent event) { + String property= event.getProperty(); + int i= indexOf(property); + if (property.startsWith(fPropertyNamesColor[i])) { + Token token= getTokenInner(fPropertyNamesColor[i]); + if(property.length() == fPropertyNamesColor[i].length()) { + adaptToColorChange(token, event); + } else { + String end= property.substring(fPropertyNamesColor[i].length()); + if (end.equals(PreferenceConstants.EDITOR_BOLD_SUFFIX)) { + adaptToStyleChange(token, event, SWT.BOLD); + } else if (end.equals(PreferenceConstants.EDITOR_ITALIC_SUFFIX)) { + adaptToStyleChange(token, event, SWT.ITALIC); + } else if (end.equals(PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX)) { + adaptToStyleChange(token, event, TextAttribute.STRIKETHROUGH); + } else if (end.equals(PreferenceConstants.EDITOR_UNDERLINE_SUFFIX)) { + adaptToStyleChange(token, event, TextAttribute.UNDERLINE); + } + } + } + } + + private void adaptToColorChange(Token token, PropertyChangeEvent event) { + RGB rgb= null; + + Object value= event.getNewValue(); + if (value instanceof RGB) + rgb= (RGB) value; + else if (value instanceof String) + rgb= StringConverter.asRGB((String) value); + + if (rgb != null) { + + String property= event.getProperty(); + Color color= fColorManager.getColor(property); + + if ((color == null || !rgb.equals(color.getRGB())) && fColorManager instanceof IColorManagerExtension) { + IColorManagerExtension ext= (IColorManagerExtension) fColorManager; + + ext.unbindColor(property); + ext.bindColor(property, rgb); + + color= fColorManager.getColor(property); + } + + Object data= token.getData(); + if (data instanceof TextAttribute) { + TextAttribute oldAttr= (TextAttribute) data; + token.setData(new TextAttribute(color, oldAttr.getBackground(), oldAttr.getStyle())); + } + } + } + + private void adaptToStyleChange(Token token, PropertyChangeEvent event, int styleAttribute) { + boolean eventValue= false; + Object value= event.getNewValue(); + if (value instanceof Boolean) + eventValue= ((Boolean) value).booleanValue(); + else if (IPreferenceStore.TRUE.equals(value)) + eventValue= true; + + Object data= token.getData(); + if (data instanceof TextAttribute) { + TextAttribute oldAttr= (TextAttribute) data; + boolean activeValue= (oldAttr.getStyle() & styleAttribute) == styleAttribute; + if (activeValue != eventValue) + token.setData(new TextAttribute(oldAttr.getForeground(), oldAttr.getBackground(), eventValue ? oldAttr.getStyle() | styleAttribute : oldAttr.getStyle() & ~styleAttribute)); + } + } + + /** + * Returns the preference store. + * + * @return the preference store. + * + * @since 3.0 + */ + public IPreferenceStore getPreferenceStore() { + return fPreferenceStore; + } +} Index: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenHelper.java =================================================================== RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenHelper.java diff -N src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenHelper.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenHelper.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,65 @@ +package org.eclipse.cdt.internal.ui.text.doctools.doxygen; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; +import org.eclipse.swt.graphics.RGB; + +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.text.doctools.generic.GenericDocTag; + +/** + * Controls the life-cycle of the Doxygen comment editor support + */ +public class DoxygenHelper { + /* + * TODO - This is a temporary location + */ + private static final IPath TAGS_CSV= new Path("src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/tags.csv"); //$NON-NLS-1$ + + static { + // TODO - I'll find a legitimate place to do this + IPreferenceStore cuis= CUIPlugin.getDefault().getPreferenceStore(); + PreferenceConverter.setDefault(cuis, DoxygenHelper.DOXYGEN_MULTI_TOKEN, new RGB(63, 95, 191)); + PreferenceConverter.setDefault(cuis, DoxygenHelper.DOXYGEN_SINGLE_TOKEN, new RGB(63, 95, 191)); + PreferenceConverter.setDefault(cuis, DoxygenHelper.DOXYGEN_TAG_RECOGNIZED, new RGB(127, 159, 191)); + } + + + private static GenericDocTag[] tags; + public static final String DOXYGEN_TAG_RECOGNIZED= "org.eclipse.cdt.internal.ui.text.doctools.doxygen.recognizedTag"; //$NON-NLS-1$ + public static final String DOXYGEN_SINGLE_TOKEN= "org.eclipse.cdt.internal.ui.text.doctools.doxygen.single"; //$NON-NLS-1$ + public static final String DOXYGEN_MULTI_TOKEN= "org.eclipse.cdt.internal.ui.text.doctools.doxygen.multi"; //$NON-NLS-1$ + + public static GenericDocTag[] getDoxygenTags() { + if(tags==null) { + try { + List temp= new ArrayList(); + InputStream is= FileLocator.openStream(CUIPlugin.getDefault().getBundle(), TAGS_CSV, false); + BufferedReader br= new BufferedReader(new InputStreamReader(is)); + StringBuffer content= new StringBuffer(); + for(String line= br.readLine(); line!=null; line= br.readLine()) { + content.append(line+"\n"); //$NON-NLS-1$ + } + String[] values= content.toString().split("(\\s)*,(\\s)*"); //$NON-NLS-1$ + + for(int i=0; i+1 + + + + + + + + [Enter description of this extension point.] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.0 + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + Index: src/org/eclipse/cdt/ui/text/doctools/IDocCommentDictionary.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/doctools/IDocCommentDictionary.java diff -N src/org/eclipse/cdt/ui/text/doctools/IDocCommentDictionary.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/doctools/IDocCommentDictionary.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text.doctools; + +/** + * This interface is a place-holder for the future. Clients should implement the most + * appropriate sub-interface (provided by CDT). Currently {@link IDocCommentSimpleDictionary} is + * the only provided sub-interface, but it is expected a more subtle way of integrating spell-checking + * will be available in the future. + * @since 5.0 + */ +public interface IDocCommentDictionary {} Index: src/org/eclipse/cdt/ui/text/TaskTagRule.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/TaskTagRule.java diff -N src/org/eclipse/cdt/ui/text/TaskTagRule.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/TaskTagRule.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Anton Leherbauer (Wind River Systems) + * Sergey Prigogin (Google) + * Andrew Ferguson (Symbian) + *******************************************************************************/ +package org.eclipse.cdt.ui.text; + +import org.eclipse.core.runtime.Preferences; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.IWordDetector; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.jface.text.rules.WordRule; +import org.eclipse.jface.util.PropertyChangeEvent; + +import org.eclipse.cdt.core.CCorePreferenceConstants; +import org.eclipse.cdt.ui.IPropertyChangeParticipant; + +/** + * + * Which words should be recognized as task tags is specified under {@link CCorePreferenceConstants#TODO_TASK_TAGS} as a + * comma delimited list. + * + * @see CCorePreferenceConstants#TODO_TASK_TAGS + * @since 5.0 + */ +public final class TaskTagRule extends WordRule implements IPropertyChangeParticipant { + private static class TaskTagDetector implements IWordDetector { + public boolean isWordStart(char c) { + return Character.isLetter(c); + } + public boolean isWordPart(char c) { + return Character.isLetter(c); + } + } + + /** + * Convenience method for extracting a list of words that should be recognized as + * task labels from an {@link IPreferenceStore} and a backup {@link Preferences} + * @param preferenceStore + * @param corePreferences + * @return a list of words that should be recognized as task labels in the format + * expected by TaskTagRule + */ + public static String getTaskWords(IPreferenceStore preferenceStore, Preferences corePreferences) { + String result= null; + if (preferenceStore.contains(CCorePreferenceConstants.TODO_TASK_TAGS)) { + result= preferenceStore.getString(CCorePreferenceConstants.TODO_TASK_TAGS); + } else if (corePreferences != null) { + result= corePreferences.getString(CCorePreferenceConstants.TODO_TASK_TAGS); + } + return result; + } + + private IToken fToken; + + /** + * Creates a new task tag rule + * @param token the token to return for words recognized as task tags + * @param taskWords a comma delimited list of words to recognize as task tags + */ + public TaskTagRule(IToken token, String taskWords) { + super(new TaskTagDetector(), Token.UNDEFINED); + fToken= token; + if( taskWords!= null) { + addTaskTags(taskWords); + } + } + + /** + * Removes the current list of words that should be + * recognized as task tags. + */ + public void clearTaskTags() { + fWords.clear(); + } + + /** + * Adds tags from the specified string as task tags. + * @param value a comma delimited list of words to recognize as task tags + */ + public void addTaskTags(String value) { + String[] tasks= value.split(","); //$NON-NLS-1$ + for (int i= 0; i < tasks.length; i++) { + if (tasks[i].length() > 0) { + addWord(tasks[i], fToken); + } + } + } + + /* + * @see org.eclipse.cdt.ui.IPropertyChangeParticipant#affectsBehavior(org.eclipse.jface.util.PropertyChangeEvent) + */ + public boolean affectsBehavior(PropertyChangeEvent event) { + return event.getProperty().equals(CCorePreferenceConstants.TODO_TASK_TAGS); + } + + /* + * @see org.eclipse.cdt.ui.IPropertyChangeParticipant#adaptToPreferenceChange(org.eclipse.jface.util.PropertyChangeEvent) + */ + public void adaptToPreferenceChange(PropertyChangeEvent event) { + if (event.getProperty().equals(CCorePreferenceConstants.TODO_TASK_TAGS)) { + Object value= event.getNewValue(); + + if (value instanceof String) { + clearTaskTags(); + addTaskTags((String) value); + } + } + } +} Index: src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java =================================================================== RCS file: src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java diff -N src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerComposite.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.dialogs; + +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Group; +import org.eclipse.swt.widgets.Label; + +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; +import org.eclipse.cdt.utils.ui.controls.ControlFactory; + +public class DocCommentOwnerComposite extends Composite { + protected DocCommentOwnerCombo fDocCombo; + protected Label desc, comboLabel; + protected Group group; + + public DocCommentOwnerComposite(Composite parent, IDocCommentOwner initialOwner, String description, String label) { + super(parent, SWT.NONE); + GridLayout gl= new GridLayout(); + gl.marginHeight= gl.marginWidth= 0; + setLayout(gl); + + group = ControlFactory.createGroup(this, DialogsMessages.DocCommentOwnerComposite_DocumentationToolGroupTitle, 2); + group.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create()); + + desc= new Label(group, SWT.WRAP); + GridData gd = GridDataFactory.fillDefaults().grab(false, false).span(2, 1).create(); + gd.widthHint= 150; + desc.setText(description); + desc.setLayoutData(gd); + + comboLabel= new Label(group, SWT.NONE); + comboLabel.setText(label); + + fDocCombo= new DocCommentOwnerCombo(group, SWT.NONE, initialOwner) {}; + gd = GridDataFactory.fillDefaults().grab(true, false).create(); + fDocCombo.setLayoutData(gd); + } + + public IDocCommentOwner getSelectedDocCommentOwner() { + return fDocCombo.getSelectedDocCommentOwner(); + } + + public void setEnabled(boolean enabled) { + desc.setEnabled(enabled); + comboLabel.setEnabled(enabled); + fDocCombo.setEnabled(enabled); + group.setEnabled(enabled); + } +} Index: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagSimpleDictionary.java =================================================================== RCS file: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagSimpleDictionary.java diff -N src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagSimpleDictionary.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagSimpleDictionary.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.text.doctools.generic; + +import org.eclipse.cdt.ui.text.doctools.IDocCommentSimpleDictionary; + +/** + * An implementation of a trivial dictionary + */ +public class GenericTagSimpleDictionary implements IDocCommentSimpleDictionary { + protected String[] fTags; + + /** + * @param tagMarkers the characters that may delimit the start of a tag + * @param tags the tags that should be recognised as correct + */ + public GenericTagSimpleDictionary(char[] tagMarkers, GenericDocTag[] tags) { + fTags= new String[tags.length]; + + for(int j=0; j + * + * This interface is additionally implemented by {@link IDocumentSetupParticipant}'s which + * would like to alter their behavior based on the location of the file being opened.

    + * + * Note that when participants implement this interface, the original method from + * {@link IDocumentSetupParticipant} will never be called. + * + * @see org.eclipse.core.filebuffers.IDocumentSetupParticipant + * @since 3.4 + */ +public interface IDocumentSetupParticipantExtension { + + /** + * Sets up the document to be ready for use by a text file buffer. + * + * @param document the document to be set up + * @param location a path of the resource backing the new document. May be null. + * @param locationKind the LocationKind of the location specified. May be null. + */ + void setup(IDocument document, IPath location, LocationKind locationKind); +} #P org.eclipse.cdt.core.tests Index: suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java,v retrieving revision 1.16 diff -u -r1.16 TestSourceReader.java --- suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java 7 Dec 2007 10:33:25 -0000 1.16 +++ suite/org/eclipse/cdt/core/testplugin/util/TestSourceReader.java 23 Jan 2008 15:41:47 -0000 @@ -51,6 +51,9 @@ import org.eclipse.core.runtime.Path; import org.osgi.framework.Bundle; +/** + * Utilities for reading test source code from plug-in .java sources + */ public class TestSourceReader { /** @@ -85,7 +88,7 @@ List contents = new ArrayList(); StringBuffer content = new StringBuffer(); for(String line = br.readLine(); line!=null; line = br.readLine()) { - line = line.trim(); + line = line.replaceFirst("^\\s*", ""); // replace leading whitespace, preserve trailing if(line.startsWith("//")) { content.append(line.substring(2)+"\n"); } else { @@ -113,7 +116,7 @@ * @param lookfor string to be searched for * @param fullPath full path of the workspace file * @return the offset or -1 - * @throws CoreException + * @throws Exception * @throws UnsupportedEncodingException * @since 4.0 */ #P org.eclipse.cdt.ui.tests Index: ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java,v retrieving revision 1.17 diff -u -r1.17 TextTestSuite.java --- ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java 11 Jan 2008 15:54:42 -0000 1.17 +++ ui/org/eclipse/cdt/ui/tests/text/TextTestSuite.java 23 Jan 2008 15:41:48 -0000 @@ -13,6 +13,8 @@ import junit.framework.TestSuite; +import org.eclipse.cdt.ui.tests.text.doctools.DocCommentTestSuite; + public class TextTestSuite extends TestSuite { public static TestSuite suite() { @@ -22,6 +24,9 @@ public TextTestSuite() { super(TextTestSuite.class.getName()); + // documentation tool extension tests + addTest(DocCommentTestSuite.suite()); + // partitioning tests addTest(PartitionTokenScannerTest.suite()); addTest(CPartitionerTest.suite()); Index: ui/org/eclipse/cdt/ui/tests/text/CAutoIndentTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CAutoIndentTest.java,v retrieving revision 1.15 diff -u -r1.15 CAutoIndentTest.java --- ui/org/eclipse/cdt/ui/tests/text/CAutoIndentTest.java 15 Jan 2008 13:10:06 -0000 1.15 +++ ui/org/eclipse/cdt/ui/tests/text/CAutoIndentTest.java 23 Jan 2008 15:41:47 -0000 @@ -8,6 +8,7 @@ * Contributors: * Anton Leherbauer (Wind River Systems) - initial API and implementation * Sergey Prigogin, Google + * Andrew Ferguson (Symbian) *******************************************************************************/ package org.eclipse.cdt.ui.tests.text; @@ -16,7 +17,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Map; import junit.framework.Test; import junit.framework.TestSuite; @@ -26,214 +26,22 @@ import org.eclipse.core.runtime.Plugin; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; -import org.eclipse.jface.text.DocumentCommand; -import org.eclipse.jface.text.IAutoEditStrategy; import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.TextUtilities; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; import org.eclipse.cdt.internal.formatter.DefaultCodeFormatterOptions; import org.eclipse.cdt.internal.ui.text.CAutoIndentStrategy; -import org.eclipse.cdt.internal.ui.text.CCommentAutoIndentStrategy; import org.eclipse.cdt.internal.ui.text.CTextTools; /** * Testing the auto indent strategies. */ -public class CAutoIndentTest extends BaseTestCase { - - /** - * Helper class to test the auto-edit strategies on a document. - */ - static class AutoEditTester { - - private Map fStrategyMap = new HashMap(); - private IDocument fDoc; - private String fPartitioning; - private int fCaretOffset; - - public AutoEditTester(IDocument doc, String partitioning) { - super(); - fDoc = doc; - fPartitioning = partitioning; - } - - public void setAutoEditStrategy(String contentType, IAutoEditStrategy aes) { - fStrategyMap.put(contentType, aes); - } - - public IAutoEditStrategy getAutoEditStrategy(String contentType) { - return (IAutoEditStrategy)fStrategyMap.get(contentType); - } - - /** - * Empties the document, and returns the caret to the origin (0,0) - */ - public void reset() { - try { - goTo(0,0); - fDoc.set(""); - } catch(BadLocationException ble) { - fail(ble.getMessage()); - } - } - - public void type(String text) throws BadLocationException { - for (int i = 0; i < text.length(); ++i) { - type(text.charAt(i)); - } - } - - public void type(char c) throws BadLocationException { - TestDocumentCommand command = new TestDocumentCommand(fCaretOffset, 0, new String(new char[] { c })); - customizeDocumentCommand(command); - fCaretOffset = command.exec(fDoc); - } - - private void customizeDocumentCommand(TestDocumentCommand command) throws BadLocationException { - IAutoEditStrategy aes = getAutoEditStrategy(getContentType()); - if (aes != null) { - aes.customizeDocumentCommand(fDoc, command); - } - } - - public void type(int offset, String text) throws BadLocationException { - fCaretOffset = offset; - type(text); - } - - public void type(int offset, char c) throws BadLocationException { - fCaretOffset = offset; - type(c); - } - - public void paste(String text) throws BadLocationException { - TestDocumentCommand command = new TestDocumentCommand(fCaretOffset, 0, text); - customizeDocumentCommand(command); - fCaretOffset = command.exec(fDoc); - } - - public void paste(int offset, String text) throws BadLocationException { - fCaretOffset = offset; - paste(text); - } - - public void backspace(int n) throws BadLocationException { - for (int i = 0; i < n; ++i) { - backspace(); - } - } - - public void backspace() throws BadLocationException { - TestDocumentCommand command = new TestDocumentCommand(fCaretOffset - 1, 1, ""); //$NON-NLS-1$ - customizeDocumentCommand(command); - fCaretOffset = command.exec(fDoc); - } - - public int getCaretOffset() { - return fCaretOffset; - } - - public int setCaretOffset(int offset) { - fCaretOffset = offset; - if (fCaretOffset < 0) - fCaretOffset = 0; - else if (fCaretOffset > fDoc.getLength()) - fCaretOffset = fDoc.getLength(); - return fCaretOffset; - } - - /** - * Moves caret right or left by the given number of characters. - * - * @param shift Move distance. - * @return New caret offset. - */ - public int moveCaret(int shift) { - return setCaretOffset(fCaretOffset + shift); - } - - public int goTo(int line) throws BadLocationException { - fCaretOffset = fDoc.getLineOffset(line); - return fCaretOffset; - } - - public int goTo(int line, int column) throws BadLocationException { - if (column < 0 || column > fDoc.getLineLength(line)) { - throw new BadLocationException("No column " + column + " in line " + line); //$NON-NLS-1$ $NON-NLS-2$ - } - fCaretOffset = fDoc.getLineOffset(line) + column; - return fCaretOffset; - } - - public int getCaretLine() throws BadLocationException { - return fDoc.getLineOfOffset(fCaretOffset); - } - - public int getCaretColumn() throws BadLocationException { - IRegion region = fDoc.getLineInformationOfOffset(fCaretOffset); - return fCaretOffset - region.getOffset(); - } - - public char getChar() throws BadLocationException { - return getChar(0); - } - - public char getChar(int i) throws BadLocationException { - return fDoc.getChar(fCaretOffset+i); - } - - public String getLine() throws BadLocationException { - return getLine(0); - } - - public String getLine(int i) throws BadLocationException { - IRegion region = fDoc.getLineInformation(getCaretLine() + i); - return fDoc.get(region.getOffset(), region.getLength()); - } - - public String getContentType() throws BadLocationException { - return getContentType(0); - } - - public String getContentType(int i) throws BadLocationException { - return TextUtilities.getContentType(fDoc, fPartitioning, fCaretOffset + i, false); - } - } - - /** - * A DocumentCommand with public constructor and exec method. - */ - static class TestDocumentCommand extends DocumentCommand { - - public TestDocumentCommand(int offset, int length, String text) { - super(); - doit = true; - this.text = text; - - this.offset = offset; - this.length = length; - - owner = null; - caretOffset = -1; - } - - /** - * Returns new caret position. - */ - public int exec(IDocument doc) throws BadLocationException { - doc.replace(offset, length, text); - return caretOffset != -1 ? - caretOffset : - offset + (text == null ? 0 : text.length()); - } - } +public class CAutoIndentTest extends AbstractAutoEditTest { private HashMap fOptions; private List fStatusLog; @@ -289,8 +97,9 @@ IDocument doc = new Document(); textTools.setupCDocument(doc); AutoEditTester tester = new AutoEditTester(doc, ICPartitions.C_PARTITIONING); + tester.setAutoEditStrategy(IDocument.DEFAULT_CONTENT_TYPE, new CAutoIndentStrategy(ICPartitions.C_PARTITIONING, null)); - tester.setAutoEditStrategy(ICPartitions.C_MULTI_LINE_COMMENT, new CCommentAutoIndentStrategy()); + tester.setAutoEditStrategy(ICPartitions.C_MULTI_LINE_COMMENT, new DefaultMultilineCommentAutoEditStrategy()); tester.setAutoEditStrategy(ICPartitions.C_PREPROCESSOR, new CAutoIndentStrategy(ICPartitions.C_PARTITIONING, null)); return tester; } @@ -385,7 +194,7 @@ public void testCCommentAutoIndent() throws BadLocationException { AutoEditTester tester = createAutoEditTester(); //$NON-NLS-1$ tester.type("/*\n"); //$NON-NLS-1$ - assertEquals(ICPartitions.C_MULTI_LINE_COMMENT, tester.getContentType(-1)); + assertEquals(ICPartitions.C_MULTI_LINE_COMMENT, tester.getContentType(tester.getCaretOffset()-1)); assertEquals(1, tester.getCaretLine()); assertEquals(3, tester.getCaretColumn()); assertEquals(" * ", tester.getLine()); //$NON-NLS-1$ Index: ui/org/eclipse/cdt/ui/tests/text/PartitionTokenScannerTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/PartitionTokenScannerTest.java,v retrieving revision 1.4 diff -u -r1.4 PartitionTokenScannerTest.java --- ui/org/eclipse/cdt/ui/tests/text/PartitionTokenScannerTest.java 14 Jun 2007 20:10:15 -0000 1.4 +++ ui/org/eclipse/cdt/ui/tests/text/PartitionTokenScannerTest.java 23 Jan 2008 15:41:48 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2006 QNX Software Systems and others. + * Copyright (c) 2005, 2008 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -41,7 +41,7 @@ protected void setUp() { fReference= new CPartitionScanner(); - fTestee= new FastCPartitionScanner(true); + fTestee= new FastCPartitionScanner(true, null); } // read sample C file Index: ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java,v retrieving revision 1.3 diff -u -r1.3 CPartitionerTest.java --- ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java 21 Jan 2008 13:58:34 -0000 1.3 +++ ui/org/eclipse/cdt/ui/tests/text/CPartitionerTest.java 23 Jan 2008 15:41:47 -0000 @@ -49,7 +49,7 @@ fTextTools= new CTextTools(new PreferenceStore()); fDocument= new Document(); - IDocumentPartitioner partitioner= fTextTools.createDocumentPartitioner(); + IDocumentPartitioner partitioner= fTextTools.createDocumentPartitioner(null); partitioner.connect(fDocument); fDocument.setDocumentPartitioner(partitioner); fDocument.set("xxx\n/*xxx*/\nxxx\n/**xxx*/\nxxx\n/**/\nxxx\n/***/\nxxx"); Index: ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java,v retrieving revision 1.12 diff -u -r1.12 CodeFormatterTest.java --- ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java 7 Jan 2008 16:06:20 -0000 1.12 +++ ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java 23 Jan 2008 15:41:48 -0000 @@ -209,7 +209,7 @@ //int verylooooooooooooooooooooooooooooooooooongname = 0000000000000000000000000000000; - //int verylooooooooooooooooooooooooooooooooooongname = + //int verylooooooooooooooooooooooooooooooooooongname = // 0000000000000000000000000000000; public void testLineWrappingOfInitializerExpression_Bug200961() throws Exception { assertFormatterResult(); Index: plugin.xml =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui.tests/plugin.xml,v retrieving revision 1.40 diff -u -r1.40 plugin.xml --- plugin.xml 25 Oct 2007 14:45:39 -0000 1.40 +++ plugin.xml 23 Jan 2008 15:41:47 -0000 @@ -32,10 +32,10 @@ + relative="org.eclipse.ui.views.TaskList"> @@ -115,5 +115,87 @@ projectType="org.eclipse.cdt.build.core.buildArtefactType.exe"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentTestSuite.java =================================================================== RCS file: ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentTestSuite.java diff -N ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentTestSuite.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentTestSuite.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.text.doctools; + +import junit.framework.TestSuite; + +public class DocCommentTestSuite extends TestSuite { + + public static TestSuite suite() { + return new DocCommentTestSuite(); + } + + public DocCommentTestSuite() { + super(DocCommentTestSuite.class.getName()); + + // partitioning tests + addTest(CommentOwnerManagerTests.suite()); + addTest(DocCommentHighlightingTest.suite()); + } +} Index: ui/org/eclipse/cdt/ui/tests/text/doctools/TestGenericTagConfiguration.java =================================================================== RCS file: ui/org/eclipse/cdt/ui/tests/text/doctools/TestGenericTagConfiguration.java diff -N ui/org/eclipse/cdt/ui/tests/text/doctools/TestGenericTagConfiguration.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/cdt/ui/tests/text/doctools/TestGenericTagConfiguration.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.text.doctools; + +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.preference.PreferenceConverter; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; +import org.eclipse.swt.graphics.RGB; + +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.text.doctools.generic.AbstractGenericTagDocCommentViewerConfiguration; +import org.eclipse.cdt.ui.text.doctools.generic.GenericDocTag; + +import org.eclipse.cdt.internal.ui.text.doctools.docpp.DocppHelper; + +public class TestGenericTagConfiguration extends AbstractGenericTagDocCommentViewerConfiguration { + public static final RGB DEFAULTRGB= new RGB(63, 95, 191); + + protected char[] fCommentMarkers; + + public TestGenericTagConfiguration(String commentMarkers, String tags, String tagMarkers, String defaultToken, String tagToken) { + super(mkTags(tags.split("(\\s)*,(\\s)*")), tagMarkers.toCharArray(), defaultToken, tagToken); + IPreferenceStore cuis= CUIPlugin.getDefault().getPreferenceStore(); + PreferenceConverter.setDefault(cuis, defaultToken, DEFAULTRGB); + PreferenceConverter.setDefault(cuis, tagToken, new RGB(127, 159, 191)); + fCommentMarkers= commentMarkers.toCharArray(); + } + + public IAutoEditStrategy createAutoEditStrategy() { + return null; + } + + private static GenericDocTag[] mkTags(String[] tagNames) { + GenericDocTag[] tags= new GenericDocTag[tagNames.length]; + for(int i=0; i*/ findRangesColored(RGB rgb) { + List result= new ArrayList(); + System.out.println("-------------"); + IEditorPart p= get(); + ISourceViewer vw= ((CEditor)p).getViewer(); + Accessor a= new Accessor(vw, TextViewer.class); + StyledText st= (StyledText) a.get("fTextWidget"); + StyleRange[] rgs= st.getStyleRanges(); + for(int i=0; i*/ mkPositions(int[][] raw) { + List result= new ArrayList(); + for(int i=0; i*/ expected= mkPositions(new int[][] {comment1, scomment1}); + assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB)); + } + + public void testDCOM_B() throws BadLocationException, InterruptedException { + DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerB"), true); + runEventQueue(1000); + List/**/ expected= mkPositions(new int[][] {comment2, scomment2}); + assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB)); + } + + public void testDCOM_C() throws BadLocationException, InterruptedException { + DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerC"), true); + runEventQueue(1000); + List/**/ expected= mkPositions(new int[][] {comment3, scomment3}); + assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB)); + } + + public void testDCOM_ABC() throws BadLocationException, InterruptedException { + DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerABC"), true); + runEventQueue(1000); + List/**/ expected= mkPositions(new int[][] {comment1, comment2, comment3, scomment1, scomment2, scomment3}); + assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB)); + } + + public void testDCOM_BDFG() throws BadLocationException, InterruptedException { + DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerBDFG"), true); + runEventQueue(1000); + List/**/ expected= mkPositions(new int[][] {comment2, comment4, comment6, comment7, comment8, scomment2}); + assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB)); + } + + public void testDCOM_PUNC() throws BadLocationException, InterruptedException { + DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerPUNC"), true); + runEventQueue(1000); + List/**/ expected= mkPositions(new int[][] {comment9, comment10, scomment4, scomment5, comment11, comment12, scomment7}); + assertEquals(expected, findRangesColored(TestGenericTagConfiguration.DEFAULTRGB)); + } +} Index: ui/org/eclipse/cdt/ui/tests/text/DefaultCCommentAutoEditStrategyTest.java =================================================================== RCS file: ui/org/eclipse/cdt/ui/tests/text/DefaultCCommentAutoEditStrategyTest.java diff -N ui/org/eclipse/cdt/ui/tests/text/DefaultCCommentAutoEditStrategyTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/cdt/ui/tests/text/DefaultCCommentAutoEditStrategyTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,629 @@ +/******************************************************************************* + * Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Anton Leherbauer (Wind River Systems) - initial API and implementation + * Sergey Prigogin, Google + * Andrew Ferguson (Symbian) + *******************************************************************************/ + +package org.eclipse.cdt.ui.tests.text; + +import java.io.IOException; +import java.util.HashMap; + +import junit.framework.Test; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.Document; +import org.eclipse.jface.text.IDocument; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.testplugin.CProjectHelper; +import org.eclipse.cdt.core.testplugin.util.TestSourceReader; +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.ui.testplugin.CTestPlugin; +import org.eclipse.cdt.ui.text.ICPartitions; +import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; + +import org.eclipse.cdt.internal.ui.text.CAutoIndentStrategy; +import org.eclipse.cdt.internal.ui.text.CTextTools; + + +/** + * Testing the auto indent strategies. + */ +public class DefaultCCommentAutoEditStrategyTest extends AbstractAutoEditTest { + private HashMap fOptions; + + /** + * @param name + */ + public DefaultCCommentAutoEditStrategyTest(String name) { + super(name); + } + + public static Test suite() { + return suite(DefaultCCommentAutoEditStrategyTest.class); + } + + protected void setUp() throws Exception { + super.setUp(); +// Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); +// shell.forceActive(); +// shell.forceFocus(); + fOptions= CCorePlugin.getOptions(); + } + + /* + * @see junit.framework.TestCase#tearDown() + */ + protected void tearDown() throws Exception { + CCorePlugin.setOptions(fOptions); + super.tearDown(); + } + + private AutoEditTester createAutoEditTester() { + CTextTools textTools = CUIPlugin.getDefault().getTextTools(); + IDocument doc = new Document(); + textTools.setupCDocument(doc); + AutoEditTester tester = new AutoEditTester(doc, ICPartitions.C_PARTITIONING); + + + tester.setAutoEditStrategy(IDocument.DEFAULT_CONTENT_TYPE, new CAutoIndentStrategy(ICPartitions.C_PARTITIONING, null)); + tester.setAutoEditStrategy(ICPartitions.C_MULTI_LINE_COMMENT, new DefaultMultilineCommentAutoEditStrategy()); + tester.setAutoEditStrategy(ICPartitions.C_PREPROCESSOR, new CAutoIndentStrategy(ICPartitions.C_PARTITIONING, null)); + return tester; + } + + public void testIsMultilineNew() throws BadLocationException { + DefaultMultilineCommentAutoEditStrategy ds= new DefaultMultilineCommentAutoEditStrategy(); + CTextTools textTools = CUIPlugin.getDefault().getTextTools(); + IDocument doc = new Document(); + textTools.setupCDocument(doc); + + doc.set(" /* "); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + doc.set(" /* \n"); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + assertTrue(ds.shouldCloseMultiline(doc, 5)); + doc.set(" /* \n "); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + assertTrue(ds.shouldCloseMultiline(doc, 6)); + doc.set(" /* */"); + assertFalse(ds.shouldCloseMultiline(doc, 5)); + doc.set(" /* */ "); + assertFalse(ds.shouldCloseMultiline(doc, 5)); + doc.set(" /* \n\n */ "); + assertFalse(ds.shouldCloseMultiline(doc, 5)); + doc.set(" /* \n\n */ \n /*"); + assertTrue(ds.shouldCloseMultiline(doc, 14)); + doc.set(" /* \n\n */ \n /* "); + assertTrue(ds.shouldCloseMultiline(doc, 14)); + doc.set(" /* \n\n */ \n /* \n"); + assertTrue(ds.shouldCloseMultiline(doc, 14)); + doc.set(" /* /* \n\n */ \n /* \n"); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + doc.set(" /* \n/* \n\n */ \n /* \n"); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + doc.set(" /* \n\n/* \n\n */ \n /* \n"); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + doc.set(" /* \n\n/* \n\n */ \n /* \n"); + assertTrue(ds.shouldCloseMultiline(doc, 3)); + doc.set(" /* \n\n */ /* \n\n */ \n /* \n"); + assertFalse(ds.shouldCloseMultiline(doc, 3)); + doc.set(" /*\n /*\n * \n * \n */\n"); + assertFalse(ds.shouldCloseMultiline(doc, 8)); + } + + // /*X + + // /* + // * X + // */ + public void testInsertNewLine1() { + assertNewLineBehaviour(); + } + + // /*X + + // /* + // * X + // */ + public void testInsertNewLine2() { + assertNewLineBehaviour(); + } + + // class A {}; /*X + + // class A {}; /* + // X + public void testInsertNewLine3() { + assertNewLineBehaviour(); + } + + // class A { + // /*X + // }; + + // class A { + // /* + // * X + // */ + // }; + public void testInsertNewLine4() { + assertNewLineBehaviour(); + } + + // class A { + // /* X + // }; + + // class A { + // /* + // * X + // */ + // }; + public void testInsertNewLine5() { + assertNewLineBehaviour(); + } + + + + // class A { + // /*X + // * + // */ + // }; + + // class A { + // /* + // * X + // * + // */ + // }; + public void testInsertNewLine6() { + assertNewLineBehaviour(); + } + + // class A { + // /* + // *X + // */ + // }; + + // class A { + // /* + // * + // *X + // */ + // }; + public void testInsertNewLine7() { + assertNewLineBehaviour(); + } + + // class A { + // /* + // *X + // */ + // }; + + // class A { + // /* + // * + // *X + // */ + // }; + public void testInsertNewLine8() { + assertNewLineBehaviour(); + } + + // class A { + // /* + // * abcd def ghiX + // */ + // }; + + // class A { + // /* + // * abcd def ghi + // * X + // */ + // }; + public void testInsertNewLine9() { + assertNewLineBehaviour(); + } + + // class A { + // /* + // * abcd deXf ghi + // */ + // }; + + // class A { + // /* + // * abcd de + // * Xf ghi + // */ + // }; + public void testInsertNewLine10() { + assertNewLineBehaviour(); + } + + // class A { + // /* + // * + // */X + // }; + + // class A { + // /* + // * + // */ + // X + // }; + public void _testInsertNewLine11() { // this is correct - we're not in a dccaes partition + assertNewLineBehaviour(); + } + + // /*X*/ + + // /* + // * X + // */ + public void _testInsertNewLine12() { + assertNewLineBehaviour(); + } + + // class A { + // /*Xfoo + // }; + + // class A { + // /* + // * X + // */foo + // }; + public void testInsertNewLine13() { + assertNewLineBehaviour(); + } + + // class A { + // /*fooX + // }; + + // class A { + // /*foo + // * X + // */ + // }; + public void testInsertNewLine14() { + assertNewLineBehaviour(); + } + + + // /* + // * + // *X + + // /* + // * + // * + // *X + public void testInsertNewLine15() { + assertNewLineBehaviour(); + } + + // /* + // * + // *Xxx + + // /* + // * + // * + // *Xxx + public void testInsertNewLine16() { + assertNewLineBehaviour(); + } + + // /* + // X + + // /* + // + // X + public void testInsertNewLine17() { + assertNewLineBehaviour(); + } + + // /* + // X + // */ + + // /* + // + // X + // */ + public void testInsertNewLine18() { + assertNewLineBehaviour(); + } + + // /* + // * + // */ /*X + + // /* + // * + // */ /* + // * X + // */ + public void _testInsertNewLine19() { + assertNewLineBehaviour(); + } + + // /* + // /*X + // * + // */ + + // /* + // /* + // * X + // * + // */ + public void testInsertNewLine20() { + assertNewLineBehaviour(); + } + + + // + // X + // + // void foo() {} + public void testFollowingDeclaration1() { + assertDeclarationFollowingX("void foo() {}"); + } + + // X + // + // void foo() {} + // void bar() {} + public void testFollowingDeclaration1b() { + assertDeclarationFollowingX("void foo() {}"); + } + + + // + // X + // class C { + // void foo() {} + // }; + public void testFollowingDeclaration2() { + assertDeclarationFollowingX("class C {\n void foo() {}\n };"); + } + + // class C { + // X + // void foo() {} + // }; + public void testFollowingDeclaration3() { + assertDeclarationFollowingX("void foo() {}"); + } + + // class C { + // void foo() {X} + // void bar(int x); + // }; + public void testFollowingDeclaration4() { + assertDeclarationFollowingX(null); + } + + // class C { + // void foo() {} X + // void bar(int x); + // }; + public void testFollowingDeclaration4a() { + assertDeclarationFollowingX("void bar(int x);"); + } + + // class C { + // void foo()X{} + // void bar(int x); + // }; + public void _testFollowingDeclaration4b() { // XXX - this is likely invalid anyhow + assertDeclarationFollowingX("void foo(){}"); // (X is just the cursor position) + } + + // class C { + // void foo() + // X + // { + // int x; + // } + // void bar(int x); + // }; + public void _testFollowingDeclaration4c() { // XXX - this is likely invalid anyhow + assertDeclarationFollowingX("void foo()\n {\n int x;\n }\n"); // (X is just the cursor position) + } + + // namespace n1 { X + // namespace n2 { + // void foo() {} + // void bar(int x) {} + // class C { + // int y; + // void baz(int x) {} + // }; + // } + // } + public void _testFollowingDeclaration5() { + assertDeclarationFollowingX("namespace n2 {\n void foo() {}\n void bar(int x) {}\n class C {\n int y;\n void baz(int x) {}\n };\n }"); + } + + // namespace n1 { + // namespace n2 {X + // void foo() {} + // void bar(int x) {} + // class C { + // int y; + // void baz(int x) {} + // }; + // } + // } + public void testFollowingDeclaration6() { + assertDeclarationFollowingX("void foo() {}"); + } + + // namespace n1 { + // namespace n2 { + // void foo() {}X + // void bar(int x) {} + // class C { + // int y; + // void baz(int x) {} + // }; + // } + // } + public void testFollowingDeclaration7() { + assertDeclarationFollowingX("void bar(int x) {}"); + } + + // namespace n1 { + // namespace n2 { + // void foo() {} + // void bar(int x) {} + // class C {X + // int y; + // void baz(int x) {} + // }; + // } + // } + public void testFollowingDeclaration8() { + assertDeclarationFollowingX("int y;"); + } + + // namespace n1 { + // namespace n2 { + // void foo() {} + // void bar(int x) {} + // class C { + // int y;X + // void baz(int x) {} + // }; + // } + // } + public void testFollowingDeclaration9() { + assertDeclarationFollowingX("void baz(int x) {}"); + } + + // #define MM void foo() + // X + // MM {} + public void testFollowingDeclaration10() { + assertDeclarationFollowingX("MM {}"); + } + + // #define NAME foo + // #define MM(V) void V(int y) + // X + // MM(NAME) {} + public void testFollowingDeclaration11() { + assertDeclarationFollowingX("MM(NAME) {}"); + } + + // #define MAKEFUNC(V) void V() + // #define B(V) V + // #define C(V) foo ## x + // X + // MAKEFUNC(B(C(y))) {} + public void testFollowingDeclaration12() { + assertDeclarationFollowingX("MAKEFUNC(B(C(y))) {}"); + } + + /** + * @param rs - the raw signature of the declaration that should be returned + * or null if no declaration should be returned. + */ + protected void assertDeclarationFollowingX(String rs) { + try { + ICProject cproject= CProjectHelper.createCCProject("test"+System.currentTimeMillis(), "bin"); + try { + String init= getTestContents1()[0].toString(); + int caretInit= init.indexOf('X'); + init= init.replaceFirst("X", ""); + IFile file= TestSourceReader.createFile(cproject.getProject(), "this.cpp", init); + IASTTranslationUnit ast= TestSourceReader.createIndexBasedAST(null, cproject, file); + assertNotNull(ast); + IASTDeclaration decl= DefaultMultilineCommentAutoEditStrategy.findFollowingDeclaration(ast, caretInit); + if(rs!=null) { + assertNotNull(decl); + assertEquals(rs, decl.getRawSignature()); + } else { + assertNull(decl); + } + } finally { + if(cproject!=null) { + cproject.getProject().delete(true, NPM); + } + } + } catch(CoreException ce) { + fail(ce.getMessage()); + } + } + + protected void assertNewLineBehaviour() { + DefaultMultilineCommentAutoEditStrategy ds= new DefaultMultilineCommentAutoEditStrategy(); + CTextTools textTools = CUIPlugin.getDefault().getTextTools(); + IDocument doc = new Document(); + textTools.setupCDocument(doc); + + StringBuffer[] raw= getTestContents(); + String init= raw[0].toString(), expected= raw[1].toString(); + + int caretInit= init.indexOf('X'); + init= init.replaceFirst("X", ""); + + int caretExpected= expected.indexOf('X'); + expected= expected.replaceFirst("X", ""); + + doc.set(init); + int caretActual= -1; + try { + TestDocumentCommand dc= new TestDocumentCommand(caretInit, 0, "\n"); + ds.customizeDocumentCommand(doc, dc); + caretActual= dc.exec(doc); + } catch(BadLocationException ble) { + fail(ble.getMessage()); + } + String actual= doc.get(); + assertEquals(expected, actual); + assertEquals(caretExpected, caretActual); + } + + protected StringBuffer[] getTestContents() { + try { + return TestSourceReader.getContentsForTest(CTestPlugin.getDefault().getBundle(), "ui", this.getClass(), getName(), 2); + } catch(IOException ioe) { + fail(ioe.getMessage()); + } + return null; + } + + protected StringBuffer[] getTestContents1() { + try { + return TestSourceReader.getContentsForTest(CTestPlugin.getDefault().getBundle(), "ui", this.getClass(), getName(), 1); + } catch(IOException ioe) { + fail(ioe.getMessage()); + } + return null; + } +} Index: resources/docComments/this.cpp =================================================================== RCS file: resources/docComments/this.cpp diff -N resources/docComments/this.cpp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ resources/docComments/this.cpp 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,24 @@ +// N.B: Character positions in this file are hard-coded into expected results in +// DocCommentHightlightTest. + +/* normal0 */ +/*A comment1___ */ +/*B comment2__ */ +/*C comment3_ *//*D comment4___ */ +/*E comment5____ *//*F comment6_ */ +/*G comment7 +*//*F comment8_ *//*! __comment9 */ +/** +comment10 +*/ + +// snormal0 +//A scomment1__ +//B scomment2_ +//C scomment3__ +//! _scomment4 +//* scomment5___ + +/*# comment11_ #*/ // scomment6__ +/*# comment12__ #*/ //# __scomment7 + Index: ui/org/eclipse/cdt/ui/tests/text/AbstractAutoEditTest.java =================================================================== RCS file: ui/org/eclipse/cdt/ui/tests/text/AbstractAutoEditTest.java diff -N ui/org/eclipse/cdt/ui/tests/text/AbstractAutoEditTest.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/cdt/ui/tests/text/AbstractAutoEditTest.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,223 @@ +/******************************************************************************* + * Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Anton Leherbauer (Wind River Systems) - initial API and implementation + * Sergey Prigogin, Google + * Andrew Ferguson (Symbian) + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.text; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.DocumentCommand; +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.TextUtilities; + +import org.eclipse.cdt.core.testplugin.util.BaseTestCase; + +/** + * IAutoEditStrategy related tests + */ +public class AbstractAutoEditTest extends BaseTestCase { + + AbstractAutoEditTest(String name) { + super(name); + } + + /** + * Helper class to test the auto-edit strategies on a document. + * Split out from CAutoIndentTest. + */ + static class AutoEditTester { + + private Map fStrategyMap = new HashMap(); + IDocument fDoc; + private String fPartitioning; + private int fCaretOffset; + + public AutoEditTester(IDocument doc, String partitioning) { + super(); + fDoc = doc; + fPartitioning = partitioning; + } + + public void setAutoEditStrategy(String contentType, IAutoEditStrategy aes) { + fStrategyMap.put(contentType, aes); + } + + public IAutoEditStrategy getAutoEditStrategy(String contentType) { + return (IAutoEditStrategy)fStrategyMap.get(contentType); + } + + /** + * Empties the document, and returns the caret to the origin (0,0) + * @return this for method chaining + */ + public AutoEditTester reset() { + try { + goTo(0,0); + fDoc.set(""); + } catch(BadLocationException ble) { + fail(ble.getMessage()); + } + return this; + } + + public void type(String text) throws BadLocationException { + for (int i = 0; i < text.length(); ++i) { + type(text.charAt(i)); + } + } + + public void type(char c) throws BadLocationException { + TestDocumentCommand command = new TestDocumentCommand(fCaretOffset, 0, new String(new char[] { c })); + customizeDocumentCommand(command); + fCaretOffset = command.exec(fDoc); + } + + private void customizeDocumentCommand(TestDocumentCommand command) throws BadLocationException { + IAutoEditStrategy aes = getAutoEditStrategy(getContentType(command.offset)); + if (aes != null) { + aes.customizeDocumentCommand(fDoc, command); + } + } + + public void type(int offset, String text) throws BadLocationException { + fCaretOffset = offset; + type(text); + } + + public void type(int offset, char c) throws BadLocationException { + fCaretOffset = offset; + type(c); + } + + public void paste(String text) throws BadLocationException { + TestDocumentCommand command = new TestDocumentCommand(fCaretOffset, 0, text); + customizeDocumentCommand(command); + fCaretOffset = command.exec(fDoc); + } + + public void paste(int offset, String text) throws BadLocationException { + fCaretOffset = offset; + paste(text); + } + + public void backspace(int n) throws BadLocationException { + for (int i = 0; i < n; ++i) { + backspace(); + } + } + + public void backspace() throws BadLocationException { + TestDocumentCommand command = new TestDocumentCommand(fCaretOffset - 1, 1, ""); //$NON-NLS-1$ + customizeDocumentCommand(command); + fCaretOffset = command.exec(fDoc); + } + + public int getCaretOffset() { + return fCaretOffset; + } + + public int setCaretOffset(int offset) { + fCaretOffset = offset; + if (fCaretOffset < 0) + fCaretOffset = 0; + else if (fCaretOffset > fDoc.getLength()) + fCaretOffset = fDoc.getLength(); + return fCaretOffset; + } + + /** + * Moves caret right or left by the given number of characters. + * + * @param shift Move distance. + * @return New caret offset. + */ + public int moveCaret(int shift) { + return setCaretOffset(fCaretOffset + shift); + } + + public int goTo(int line) throws BadLocationException { + fCaretOffset = fDoc.getLineOffset(line); + return fCaretOffset; + } + + public int goTo(int line, int column) throws BadLocationException { + if (column < 0 || column > fDoc.getLineLength(line)) { + throw new BadLocationException("No column " + column + " in line " + line); //$NON-NLS-1$ $NON-NLS-2$ + } + fCaretOffset = fDoc.getLineOffset(line) + column; + return fCaretOffset; + } + + public int getCaretLine() throws BadLocationException { + return fDoc.getLineOfOffset(fCaretOffset); + } + + public int getCaretColumn() throws BadLocationException { + IRegion region = fDoc.getLineInformationOfOffset(fCaretOffset); + return fCaretOffset - region.getOffset(); + } + + public char getChar() throws BadLocationException { + return getChar(0); + } + + public char getChar(int i) throws BadLocationException { + return fDoc.getChar(fCaretOffset+i); + } + + public String getLine() throws BadLocationException { + return getLine(0); + } + + public String getLine(int i) throws BadLocationException { + IRegion region = fDoc.getLineInformation(getCaretLine() + i); + return fDoc.get(region.getOffset(), region.getLength()); + } + + public String getContentType(int offset) throws BadLocationException { + return TextUtilities.getContentType(fDoc, fPartitioning, offset, true); + } + } + + /** + * A DocumentCommand with public constructor and exec method. + */ + static class TestDocumentCommand extends DocumentCommand { + + public TestDocumentCommand(int offset, int length, String text) { + super(); + doit = true; + this.text = text; + + this.offset = offset; + this.length = length; + + owner = null; + caretOffset = -1; + } + + /** + * @param doc + * @return the new caret position. + * @throws BadLocationException + */ + public int exec(IDocument doc) throws BadLocationException { + doc.replace(offset, length, text); + return caretOffset != -1 ? + caretOffset : + offset + (text == null ? 0 : text.length()); + } + } +} Index: ui/org/eclipse/cdt/ui/tests/text/doctools/CommentOwnerManagerTests.java =================================================================== RCS file: ui/org/eclipse/cdt/ui/tests/text/doctools/CommentOwnerManagerTests.java diff -N ui/org/eclipse/cdt/ui/tests/text/doctools/CommentOwnerManagerTests.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ ui/org/eclipse/cdt/ui/tests/text/doctools/CommentOwnerManagerTests.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,126 @@ +/******************************************************************************* + * Copyright (c) 2008 Symbian Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.ui.tests.text.doctools; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.testplugin.CProjectHelper; +import org.eclipse.cdt.core.testplugin.util.BaseTestCase; +import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; + +import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; +import org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner; + +/** + * Test comment ownership mapping + */ +public class CommentOwnerManagerTests extends BaseTestCase { + IDocCommentOwner OWNER_1; + IDocCommentOwner OWNER_2; + IDocCommentOwner OWNER_3; + DocCommentOwnerManager manager; + + ICProject projectA, projectB, projectC; + + protected void setUp() throws Exception { + manager= DocCommentOwnerManager.getInstance(); + + projectA= CProjectHelper.createCCProject("projectA", null); + projectB= CProjectHelper.createCCProject("projectB", null); + projectC= CProjectHelper.createCCProject("projectC", null); + + IDocCommentOwner[] owners= manager.getRegisteredOwners(); + OWNER_1= manager.getOwner("org.cdt.test.DCOM1"); + OWNER_2= manager.getOwner("org.cdt.test.DCOM2"); + OWNER_3= manager.getOwner("org.cdt.test.DCOM3"); + } + + protected void tearDown() throws Exception { + if(projectA != null) { + CProjectHelper.delete(projectA); + } + if(projectB != null) { + CProjectHelper.delete(projectB); + } + if(projectC != null) { + CProjectHelper.delete(projectC); + } + } + + public static Test suite() { + return new TestSuite(CommentOwnerManagerTests.class); + } + + public void testProjectLevel() throws Exception { + manager.setCommentOwner(projectA.getProject(), OWNER_3, true); + manager.setCommentOwner(projectB.getProject(), OWNER_2, true); + manager.setCommentOwner(projectC.getProject(), OWNER_1, true); + + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectA.getProject()).getID()); + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectA.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectA.getProject().getFolder("foo/bar")).getID()); + + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectB.getProject()).getID()); + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectB.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectB.getProject().getFolder("foo/bar")).getID()); + + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectC.getProject()).getID()); + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectC.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectC.getProject().getFolder("foo/bar")).getID()); + + manager.setCommentOwner(projectA.getProject(), OWNER_2, true); + manager.setCommentOwner(projectB.getProject(), OWNER_1, true); + manager.setCommentOwner(projectC.getProject(), OWNER_3, true); + + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectA.getProject()).getID()); + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectA.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectA.getProject().getFolder("foo/bar")).getID()); + + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectB.getProject()).getID()); + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectB.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectB.getProject().getFolder("foo/bar")).getID()); + + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectC.getProject()).getID()); + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectC.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectC.getProject().getFolder("foo/bar")).getID()); + + projectA.getProject().close(NPM); + projectB.getProject().close(NPM); + projectC.getProject().close(NPM); + + projectA.getProject().open(NPM); + projectB.getProject().open(NPM); + projectC.getProject().open(NPM); + + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectA.getProject()).getID()); + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectA.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_2.getID(), manager.getCommentOwner(projectA.getProject().getFolder("foo/bar")).getID()); + + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectB.getProject()).getID()); + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectB.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_1.getID(), manager.getCommentOwner(projectB.getProject().getFolder("foo/bar")).getID()); + + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectC.getProject()).getID()); + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectC.getProject().getFile("foo/bar/baz")).getID()); + assertEquals(OWNER_3.getID(), manager.getCommentOwner(projectC.getProject().getFolder("foo/bar")).getID()); + } + + public void testBoundaryConditions() throws Exception { + DocCommentOwnerManager manager= DocCommentOwnerManager.getInstance(); + assertEquals(NullDocCommentOwner.INSTANCE.getID(), manager.getCommentOwner(null).getID()); + } + + public void testWorkspaceRootLevel() throws Exception { + // TODO + } +}