Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 87659 Details for
Bug 208881
[api] enable document setup participants to customize behaviour based on resource being opened
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
catches up with HEAD
comments_Jan23_1.txt (text/plain), 370.54 KB, created by
Andrew Ferguson
on 2008-01-23 10:43:05 EST
(
hide
)
Description:
catches up with HEAD
Filename:
MIME Type:
Creator:
Andrew Ferguson
Created:
2008-01-23 10:43:05 EST
Size:
370.54 KB
patch
obsolete
>### 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 @@ >+<?xml version="1.0" encoding="UTF-8"?> >+<?eclipse version="3.2"?> >+<!-- >+ - >+ - Register IDocumentSetupParticipants against names and extensions that won't interfere with >+ - normal operation. >+ - >+ --> >+<plugin> >+<!-- IDocumentSetupParticipant --> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP1" >+ extensions="111foo"> >+ </participant> >+ </extension> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP2" >+ fileNames="111fooname,111fooname.111foo"> >+ </participant> >+ </extension> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP3" >+ extensions="111foo" >+ fileNames="111fooname,111fooname.111foo"> >+ </participant> >+ </extension> >+ >+ <!-- IDocumentSetupParticipantExtension ignoring hint --> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP4" >+ extensions="222foo"> >+ </participant> >+ </extension> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP5" >+ fileNames="222fooname,222fooname.222foo"> >+ </participant> >+ </extension> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP6" >+ extensions="222foo" >+ fileNames="222fooname,222fooname.222foo"> >+ </participant> >+ </extension> >+ >+ <!-- IDocumentSetupPartcipantExtension selectively picking up hint --> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP7" >+ extensions="333foo" >+ fileNames="333fooname,333fooname.333foo"> >+ </participant> >+ </extension> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP8" >+ extensions="444foo" >+ fileNames="444fooname,444fooname.444foo"> >+ </participant> >+ </extension> >+ <extension point="org.eclipse.core.filebuffers.documentSetup"> >+ <participant >+ class="org.eclipse.core.filebuffers.tests.MockDocumentSetupParticipants$TestDSP9" >+ extensions="555foo" >+ fileNames="555fooname,555fooname.555foo"> >+ </participant> >+ </extension> >+</plugin> >+ >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; i<lks.length; i++) { >+ IDocument document= fManager.createEmptyDocument(new Path(path), lks[i]); >+ String content= document.get(); >+ Set expectedDSPs= new HashSet(Arrays.asList(toString(expectedDSPsArray))); >+ Set actualDSPs= new HashSet(Arrays.asList(content.split("\n"))); >+ assertEquals(expectedDSPs, actualDSPs); >+ } >+ } >+ >+ abstract protected LocationKind[] getSupportLocationKinds(); >+ >+ protected void assertDocumentContent(String expectedContent, String path, LocationKind locKind) { >+ assertEquals(expectedContent, fManager.createEmptyDocument(new Path(path), locKind).get()); >+ } >+ >+ private static String[] toString(Class[] clss) { >+ String[] result= new String[clss.length]; >+ for(int i=0; i<result.length; i++) { >+ String s= null; >+ if(clss[i]!=null) { >+ s= clss[i].toString(); >+ if(IDocumentSetupParticipantExtension.class.isAssignableFrom(clss[i])) { >+ s+= "%%EXTENSION"; >+ } >+ } >+ result[i]= s; >+ } >+ return result; >+ } >+} >#P org.eclipse.cdt.core >Index: src/org/eclipse/cdt/core/ICDescriptor.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICDescriptor.java,v >retrieving revision 1.11 >diff -u -r1.11 ICDescriptor.java >--- src/org/eclipse/cdt/core/ICDescriptor.java 14 Jun 2007 18:03:59 -0000 1.11 >+++ src/org/eclipse/cdt/core/ICDescriptor.java 23 Jan 2008 15:41:41 -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 >@@ -15,9 +15,16 @@ > import org.eclipse.core.runtime.CoreException; > import org.w3c.dom.Element; > >+/** >+ * Models meta-data stored with a CDT project >+ */ > public interface ICDescriptor { > public ICOwnerInfo getProjectOwner(); > public String getPlatform(); >+ >+ /** >+ * @return the associated project >+ */ > public IProject getProject(); > > public ICExtensionReference[] get(String extensionPoint); >@@ -27,7 +34,18 @@ > public void remove(ICExtensionReference extension) throws CoreException; > public void remove(String extensionPoint) throws CoreException; > >+ /** >+ * @param id an identifier that uniquely identifies the client >+ * @return a non-null {@link Element} to which client specific meta-data may be attached >+ * @throws CoreException >+ */ > public Element getProjectData(String id) throws CoreException; >+ >+ /** >+ * Saves any changes made to {@link Element} objects obtained from {@link #getProjectData(String)} >+ * to a CDT defined project meta-data file. >+ * @throws CoreException >+ */ > public void saveProjectData() throws CoreException; > > ICConfigurationDescription getConfigurationDescription(); >#P org.eclipse.cdt.ui >Index: src/org/eclipse/cdt/internal/ui/text/SingleTokenCScanner.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/SingleTokenCScanner.java,v >retrieving revision 1.4 >diff -u -r1.4 SingleTokenCScanner.java >--- src/org/eclipse/cdt/internal/ui/text/SingleTokenCScanner.java 22 Jul 2005 03:32:00 -0000 1.4 >+++ src/org/eclipse/cdt/internal/ui/text/SingleTokenCScanner.java 23 Jan 2008 15:41:43 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2000 2005 IBM Corporation and others. >+ * Copyright (c) 2000, 2005, 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,28 +8,31 @@ > * Contributors: > * IBM Corporation - initial API and implementation > * QNX Software System >+ * Andrew Ferguson (Symbian) > *******************************************************************************/ > package org.eclipse.cdt.internal.ui.text; > > import java.util.List; >-import org.eclipse.jface.preference.IPreferenceStore; >+ > import org.eclipse.jface.text.IDocument; > import org.eclipse.jface.text.rules.IToken; > import org.eclipse.jface.text.rules.Token; > >+import org.eclipse.cdt.ui.text.ITokenStoreFactory; >+ > > /** > * > */ >-public final class SingleTokenCScanner extends AbstractCScanner{ >+public final class SingleTokenCScanner extends AbstractCScanner { > > protected IToken fDefaultReturnToken; > private String[] fProperty; > >- public SingleTokenCScanner(IColorManager manager, IPreferenceStore store, String property) { >- super(manager, store, 20); >+ public SingleTokenCScanner(ITokenStoreFactory factory, String property) { >+ super(factory.createTokenStore(new String[] {property}), 20); > fProperty= new String[] { property }; >- initialize(); >+ setRules(createRules()); > } > > /* >Index: src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java,v >retrieving revision 1.15 >diff -u -r1.15 CCodeScanner.java >--- src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java 16 Mar 2007 10:00:38 -0000 1.15 >+++ src/org/eclipse/cdt/internal/ui/text/CCodeScanner.java 23 Jan 2008 15:41:43 -0000 >@@ -9,19 +9,19 @@ > * IBM Corporation - initial API and implementation > * QNX Software System > * Anton Leherbauer (Wind River Systems) >+ * 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.Token; >+import org.eclipse.jface.text.rules.IToken; > import org.eclipse.jface.text.rules.WhitespaceRule; > import org.eclipse.jface.text.rules.WordRule; >-import org.eclipse.jface.util.PropertyChangeEvent; > > 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,31 +45,22 @@ > > /** > * Creates a C/C++ code scanner. >- * >- * @param manager the color manager >- * @param store the reference store >+ * @param factory > * @param keywords the keywords defined by the language dialect > */ >- public CCodeScanner(IColorManager manager, IPreferenceStore store, ICLanguageKeywords keywords) { >- super(manager, store); >+ public CCodeScanner(ITokenStoreFactory factory, ICLanguageKeywords keywords) { >+ super(factory.createTokenStore(fgTokenProperties)); > fKeywords= keywords; >- initialize(); >+ setRules(createRules()); > } >- >- /* >- * @see AbstractCScanner#getTokenProperties() >- */ >- protected String[] getTokenProperties() { >- return fgTokenProperties; >- } >- >+ > /* > * @see AbstractCScanner#createRules() > */ > protected List createRules() { > > List rules= new ArrayList(); >- Token token; >+ IToken token; > > // Add generic white space rule. > rules.add(new WhitespaceRule(new CWhitespaceDetector())); >@@ -105,13 +96,4 @@ > setDefaultReturnToken(getToken(ICColorConstants.C_DEFAULT)); > 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/text/CTextTools.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CTextTools.java,v >retrieving revision 1.21 >diff -u -r1.21 CTextTools.java >--- src/org/eclipse/cdt/internal/ui/text/CTextTools.java 12 Dec 2007 14:57:50 -0000 1.21 >+++ src/org/eclipse/cdt/internal/ui/text/CTextTools.java 23 Jan 2008 15:41:43 -0000 >@@ -9,9 +9,14 @@ > * IBM Corporation - initial API and implementation > * QNX Software System > * Anton Leherbauer (Wind River Systems) >+ * Andrew Ferguson (Symbian) > *******************************************************************************/ > package org.eclipse.cdt.internal.ui.text; > >+import org.eclipse.core.filebuffers.LocationKind; >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.ResourcesPlugin; >+import org.eclipse.core.runtime.IPath; > import org.eclipse.core.runtime.Preferences; > import org.eclipse.jface.preference.IPreferenceStore; > import org.eclipse.jface.text.IDocument; >@@ -26,7 +31,11 @@ > import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; > import org.eclipse.cdt.ui.CUIPlugin; > 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.ui.text.doctools.IDocCommentOwner; > >+import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; > import org.eclipse.cdt.internal.ui.text.util.CColorManager; > > >@@ -35,14 +44,14 @@ > * its clients. > */ > public class CTextTools { >- >+ > private class PreferenceListener implements IPropertyChangeListener, Preferences.IPropertyChangeListener { > public void propertyChange(PropertyChangeEvent event) { > adaptToPreferenceChange(event); > } >- public void propertyChange(Preferences.PropertyChangeEvent event) { >- adaptToPreferenceChange(new PropertyChangeEvent(event.getSource(), event.getProperty(), event.getOldValue(), event.getNewValue())); >- } >+ public void propertyChange(Preferences.PropertyChangeEvent event) { >+ adaptToPreferenceChange(new PropertyChangeEvent(event.getSource(), event.getProperty(), event.getOldValue(), event.getNewValue())); >+ } > } > > /** The color manager */ >@@ -64,57 +73,60 @@ > > /** The preference store */ > private IPreferenceStore fPreferenceStore; >- /** The core preference store */ >- private Preferences fCorePreferenceStore; >+ /** The core preference store */ >+ private Preferences fCorePreferenceStore; > /** The preference change listener */ > private PreferenceListener fPreferenceListener= new PreferenceListener(); > /** The document partitioning used for the C partitioner */ > private String fDocumentPartitioning = ICPartitions.C_PARTITIONING; >- >+ >+ /** >+ * Creates a new C text tools collection and eagerly creates >+ * and initializes all members of this collection. >+ */ >+ public CTextTools(IPreferenceStore store) { >+ this(store, null, true); >+ } >+ > /** > * Creates a new C text tools collection and eagerly creates > * and initializes all members of this collection. > */ >- public CTextTools(IPreferenceStore store) { >- this(store, null, true); >- } >- >+ public CTextTools(IPreferenceStore store, Preferences coreStore) { >+ this(store, coreStore, true); >+ } >+ > /** > * Creates a new C text tools collection and eagerly creates > * and initializes all members of this collection. > */ >- public CTextTools(IPreferenceStore store, Preferences coreStore) { >- this(store, coreStore, true); >- } >- >- /** >- * Creates a new C text tools collection and eagerly creates >- * and initializes all members of this collection. >- */ > public CTextTools(IPreferenceStore store, Preferences coreStore, boolean autoDisposeOnDisplayDispose) { >- if(store == null) { >- store = CUIPlugin.getDefault().getPreferenceStore(); >- } >+ fPreferenceStore = store != null ? store : CUIPlugin.getDefault().getPreferenceStore(); > fColorManager= new CColorManager(autoDisposeOnDisplayDispose); >- fCodeScanner= new CCodeScanner(fColorManager, store, GCCLanguage.getDefault()); >- fCppCodeScanner= new CCodeScanner(fColorManager, store, GPPLanguage.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); >- fCPreprocessorScanner= new CPreprocessorScanner(fColorManager, store, GCCLanguage.getDefault()); >- fCppPreprocessorScanner= new CPreprocessorScanner(fColorManager, store, GPPLanguage.getDefault()); > >- fPreferenceStore = store; >+ ITokenStoreFactory factory= new ITokenStoreFactory() { >+ public ITokenStore createTokenStore(String[] propertyColorNames) { >+ return new TokenStore(getColorManager(), fPreferenceStore, propertyColorNames); >+ } >+ }; >+ >+ fMultilineCommentScanner= new CCommentScanner(factory, coreStore, ICColorConstants.C_MULTI_LINE_COMMENT); >+ fSinglelineCommentScanner= new CCommentScanner(factory, coreStore, ICColorConstants.C_SINGLE_LINE_COMMENT); >+ fCodeScanner= new CCodeScanner(factory, GCCLanguage.getDefault()); >+ fCppCodeScanner= new CCodeScanner(factory, GPPLanguage.getDefault()); >+ >+ fStringScanner= new SingleTokenCScanner(factory, ICColorConstants.C_STRING); >+ fCPreprocessorScanner= new CPreprocessorScanner(factory, GCCLanguage.getDefault()); >+ fCppPreprocessorScanner= new CPreprocessorScanner(factory, GPPLanguage.getDefault()); >+ > fPreferenceStore.addPropertyChangeListener(fPreferenceListener); >- >- fCorePreferenceStore= coreStore; >- if (fCorePreferenceStore != null) { >- fCorePreferenceStore.addPropertyChangeListener(fPreferenceListener); >- } >- >+ >+ fCorePreferenceStore= coreStore; >+ if (fCorePreferenceStore != null) { >+ fCorePreferenceStore.addPropertyChangeListener(fPreferenceListener); >+ } > } >- >+ > /** > * Creates a new C text tools collection and eagerly creates > * and initializes all members of this collection. >@@ -122,83 +134,75 @@ > public CTextTools() { > this((IPreferenceStore)null); > } >- >+ > /** > * Disposes all members of this tools collection. > */ > public void dispose() { >- >+ > fCodeScanner= null; > fMultilineCommentScanner= null; > fSinglelineCommentScanner= null; > fStringScanner= null; >- >+ > if (fColorManager != null) { > fColorManager.dispose(); > fColorManager= null; > } >- >+ > if (fPreferenceStore != null) { > fPreferenceStore.removePropertyChangeListener(fPreferenceListener); > fPreferenceStore= null; >- >- if (fCorePreferenceStore != null) { >- fCorePreferenceStore.removePropertyChangeListener(fPreferenceListener); >- fCorePreferenceStore= null; >- } >- >+ >+ if (fCorePreferenceStore != null) { >+ fCorePreferenceStore.removePropertyChangeListener(fPreferenceListener); >+ fCorePreferenceStore= null; >+ } >+ > fPreferenceListener= null; > } > } >- >+ > /** > * Gets the color manager. > */ > public CColorManager getColorManager() { > return fColorManager; > } >- >+ > /** > * Gets the code scanner used. > */ > public RuleBasedScanner getCCodeScanner() { > return fCodeScanner; > } >- >+ > /** > * Gets the code scanner used. > */ > public RuleBasedScanner getCppCodeScanner() { > return fCppCodeScanner; > } >- >+ > /** > * Returns a scanner which is configured to scan > * C-specific partitions, which are multi-line comments, > * and regular C source code. > * >+ * @param owner may be null > * @return a C partition scanner > */ >- public IPartitionTokenScanner getPartitionScanner() { >- return new FastCPartitionScanner(); >+ public IPartitionTokenScanner getPartitionScanner(IDocCommentOwner owner) { >+ return new FastCPartitionScanner(owner); > } >- >+ > /** > * Gets the document provider used. > */ >- public IDocumentPartitioner createDocumentPartitioner() { >- >- String[] types= new String[] { >- ICPartitions.C_MULTI_LINE_COMMENT, >- ICPartitions.C_SINGLE_LINE_COMMENT, >- ICPartitions.C_STRING, >- ICPartitions.C_CHARACTER, >- ICPartitions.C_PREPROCESSOR >- }; >- >- return new FastCPartitioner(getPartitionScanner(), types); >+ public IDocumentPartitioner createDocumentPartitioner(IDocCommentOwner owner) { >+ return new FastCPartitioner(getPartitionScanner(owner), ICPartitions.ALL_CPARTITIONS); > } >- >+ > /** > * Returns a scanner which is configured to scan C multiline comments. > * >@@ -216,7 +220,7 @@ > public RuleBasedScanner getSinglelineCommentScanner() { > return fSinglelineCommentScanner; > } >- >+ > /** > * Returns a scanner which is configured to scan C strings. > * >@@ -243,7 +247,7 @@ > public RuleBasedScanner getCppPreprocessorScanner() { > return fCppPreprocessorScanner; > } >- >+ > /** > * Determines whether the preference change encoded by the given event > * changes the behavior of one its contained components. >@@ -253,13 +257,13 @@ > */ > public boolean affectsBehavior(PropertyChangeEvent event) { > return fCodeScanner.affectsBehavior(event) || >- fCppCodeScanner.affectsBehavior(event) || >- fMultilineCommentScanner.affectsBehavior(event) || >- fSinglelineCommentScanner.affectsBehavior(event) || >- fStringScanner.affectsBehavior(event) || >- fCPreprocessorScanner.affectsBehavior(event); >+ fCppCodeScanner.affectsBehavior(event) || >+ fMultilineCommentScanner.affectsBehavior(event) || >+ fSinglelineCommentScanner.affectsBehavior(event) || >+ fStringScanner.affectsBehavior(event) || >+ fCPreprocessorScanner.affectsBehavior(event); > } >- >+ > /** > * Adapts the behavior of the contained components to the change > * encoded in the given event. >@@ -286,12 +290,13 @@ > /** > * Sets up the document partitioner for the given document for the given partitioning. > * >- * @param document the document to be set up >- * @param partitioning the document partitioning >- * @since 3.0 >+ * @param document >+ * @param partitioning >+ * @param owner may be null >+ * @since 5.0 > */ >- public void setupCDocumentPartitioner(IDocument document, String partitioning) { >- IDocumentPartitioner partitioner= createDocumentPartitioner(); >+ public void setupCDocumentPartitioner(IDocument document, String partitioning, IDocCommentOwner owner) { >+ IDocumentPartitioner partitioner= createDocumentPartitioner(owner); > if (document instanceof IDocumentExtension3) { > IDocumentExtension3 extension3= (IDocumentExtension3) document; > extension3.setDocumentPartitioner(partitioning, partitioner); >@@ -300,7 +305,20 @@ > } > partitioner.connect(document); > } >- >+ >+ /** >+ * Sets up the given document for the default partitioning. >+ * >+ * @param document the document to be set up >+ * @param location the path of the resource backing the document. May be null. >+ * @param locationKind the type of path specified above. May be null. >+ * @since 3.0 >+ */ >+ public void setupCDocument(IDocument document, IPath location, LocationKind locationKind) { >+ IDocCommentOwner owner= getDocumentationCommentOwner(location, locationKind); >+ setupCDocumentPartitioner(document, fDocumentPartitioning, owner); >+ } >+ > /** > * Sets up the given document for the default partitioning. > * >@@ -308,7 +326,7 @@ > * @since 3.0 > */ > public void setupCDocument(IDocument document) { >- setupCDocumentPartitioner(document, fDocumentPartitioning); >+ setupCDocumentPartitioner(document, fDocumentPartitioning, null); > } > > /** >@@ -329,5 +347,19 @@ > public void setDocumentPartitioning(String documentPartitioning) { > fDocumentPartitioning = documentPartitioning; > } >- >+ >+ /** >+ * @param location >+ * @param locationKind >+ * @return the documentation comment owner mapped to the specified location. If there is >+ * no mapping, or the <code>location</code>/<code>locationKind</code> 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. >- * <p> >- * This scanner stores the color defined by the color preference key into >- * the color manager under the same key. >- * </p> >- * <p> >- * Preference color key + {@link PreferenceConstants#EDITOR_BOLD_SUFFIX} are used >- * to retrieve whether the token is rendered in bold. >- * </p> >- * <p> >- * Preference color key + {@link PreferenceConstants#EDITOR_ITALIC_SUFFIX} are used >- * to retrieve whether the token is rendered in italic. >- * </p> >- * <p> >- * Preference color key + {@link PreferenceConstants#EDITOR_STRIKETHROUGH_SUFFIX} are used >- * to retrieve whether the token is rendered in strikethrough. >- * </p> >- * <p> >- * Preference color key + {@link PreferenceConstants#EDITOR_UNDERLINE_SUFFIX} are used >- * to retrieve whether the token is rendered in underline. >- * </p> >+ * 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 <code>true</code>, >- * iff the corresponding token should be rendered bold. >- */ >- private String[] fPropertyNamesBold; >- /** >- * Preference keys for boolean preferences which are <code>true</code>, >- * iff the corresponding token should be rendered italic. >- * >- * @since 4.0 >- */ >- private String[] fPropertyNamesItalic; >- /** >- * Preference keys for boolean preferences which are <code>true</code>, >- * iff the corresponding token should be rendered strikethrough. >- * >- * @since 4.0 >- */ >- private String[] fPropertyNamesStrikethrough; >- /** >- * Preference keys for boolean preferences which are <code>true</code>, >- * 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. >- * <p> >- * The preference key is used access the color in the preference >- * store and in the color manager. >- * </p> >- * <p> >- * Preference key + {@link PreferenceConstants#EDITOR_BOLD_SUFFIX} is used >- * to retrieve whether the token is rendered in bold. >- * </p> >- * <p> >- * Preference key + {@link PreferenceConstants#EDITOR_ITALIC_SUFFIX} is used >- * to retrieve whether the token is rendered in italic. >- * </p> >- * <p> >- * Preference key + {@link PreferenceConstants#EDITOR_UNDERLINE_SUFFIX} is used >- * to retrieve whether the token is rendered underlined. >- * </p> >- * <p> >- * Preference key + {@link PreferenceConstants#EDITOR_STRIKETHROUGH_SUFFIX} is used >- * to retrieve whether the token is rendered stricken out. >- * </p> >- */ >- 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/*<IPropertyChangeParticipant*/ pcps; >+ final protected ITokenStore fTokenStore; > >- protected String getBoldKey(String colorKey) { >- return colorKey + PreferenceConstants.EDITOR_BOLD_SUFFIX; >- } >- >- protected String getItalicKey(String colorKey) { >- return colorKey + PreferenceConstants.EDITOR_ITALIC_SUFFIX; >+ public AbstractCScanner(ITokenStore tokenStore, int size) { >+ this(tokenStore); >+ setBufferSize(size); > } > >- protected String getStrikethroughKey(String colorKey) { >- return colorKey + PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX; >+ public AbstractCScanner(ITokenStore tokenStore) { >+ fTokenStore= tokenStore; >+ pcps= new ArrayList/*<IPropertyChangeParticipant*/(); > } > >- protected String getUnderlineKey(String colorKey) { >- return colorKey + PreferenceConstants.EDITOR_UNDERLINE_SUFFIX; >+ protected void addPropertyChangeParticipant(IPropertyChangeParticipant participant) { >+ pcps.add(participant); > } > >- public IToken nextToken() { >- if (fNeedsLazyColorLoading) >- resolveProxyAttributes(); >- return super.nextToken(); >- } >- >- private void resolveProxyAttributes() { >- if (fNeedsLazyColorLoading && Display.getCurrent() != null) { >- for (int i= 0; i < fPropertyNamesColor.length; i++) { >- addToken(fPropertyNamesColor[i], fPropertyNamesBold[i], fPropertyNamesItalic[i], fPropertyNamesStrikethrough[i], fPropertyNamesUnderline[i]); >- } >- fNeedsLazyColorLoading= false; >- } >- } >- >- private void addTokenWithProxyAttribute(String colorKey, String boldKey, String italicKey, String strikethroughKey, String underlineKey) { >- fTokenMap.put(colorKey, new Token(createTextAttribute(null, boldKey, italicKey, strikethroughKey, underlineKey))); >- } >- >- private void addToken(String colorKey, String boldKey, String italicKey, String strikethroughKey, String underlineKey) { >- if (fColorManager != null && colorKey != null && fColorManager.getColor(colorKey) == null) { >- RGB rgb= PreferenceConverter.getColor(fPreferenceStore, colorKey); >- if (fColorManager instanceof IColorManagerExtension) { >- IColorManagerExtension ext= (IColorManagerExtension) fColorManager; >- ext.unbindColor(colorKey); >- ext.bindColor(colorKey, rgb); >- } >- } >- >- if (!fNeedsLazyColorLoading) >- fTokenMap.put(colorKey, new Token(createTextAttribute(colorKey, boldKey, italicKey, strikethroughKey, underlineKey))); >- else { >- Token token= ((Token)fTokenMap.get(colorKey)); >- if (token != null) >- token.setData(createTextAttribute(colorKey, boldKey, italicKey, strikethroughKey, underlineKey)); >- } >- } >- > /** >- * Create a text attribute based on the given color, bold, italic, strikethrough and underline preference keys. >- * >- * @param colorKey the color preference key >- * @param boldKey the bold preference key >- * @param italicKey the italic preference key >- * @param strikethroughKey the strikethrough preference key >- * @param underlineKey the italic preference key >- * @return the created text attribute >- * @since 3.0 >- */ >- private TextAttribute createTextAttribute(String colorKey, String boldKey, String italicKey, String strikethroughKey, String underlineKey) { >- Color color= null; >- if (colorKey != null) >- color= fColorManager.getColor(colorKey); >- >- int style= fPreferenceStore.getBoolean(boldKey) ? SWT.BOLD : SWT.NORMAL; >- if (fPreferenceStore.getBoolean(italicKey)) >- style |= SWT.ITALIC; >- >- if (fPreferenceStore.getBoolean(strikethroughKey)) >- style |= TextAttribute.STRIKETHROUGH; >- >- if (fPreferenceStore.getBoolean(underlineKey)) >- style |= TextAttribute.UNDERLINE; >- >- return new TextAttribute(color, null, style); >- } >- >- protected Token getToken(String key) { >- if (fNeedsLazyColorLoading) >- resolveProxyAttributes(); >- return (Token) fTokenMap.get(key); >- } >- >- private void initializeRules() { >- List rules= createRules(); >- if (rules != null) { >+ * Convenience method for setting the scanner rules with a list rather >+ * than an array. >+ * @param rules >+ */ >+ public final void setRules(List/*<IRule>*/ 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 <a href="org.eclipse.ui.preferencePages.GeneralTextEditor">Text Editors</a> preference page. >+CEditorPreferencePage_link=C/C++ Editor Preferences. General preferences may be set via <a href="org.eclipse.ui.preferencePages.GeneralTextEditor">Text Editors</a>. > 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 @@ > <extension-point id="ConfigManager" name="%ConfigManager" schema="schema/ConfigManager.exsd"/> > <extension-point id="HelpInfo" name="%HelpInfo" schema="schema/HelpInfo.exsd"/> > <extension-point id="quickFixProcessors" name="%quickFixProcessorExtensionPoint" schema="schema/quickFixProcessors.exsd"/> >+ <extension-point id="DocCommentOwner" name="%extension-point.name.0" schema="schema/DocCommentOwner.exsd"/> > > <extension > point="org.eclipse.core.runtime.adapters"> >@@ -770,6 +771,16 @@ > class="org.eclipse.cdt.internal.ui.preferences.WorkInProgressPreferencePage" > id="org.eclipse.cdt.ui.preferneces.WorkInProgressPreferencePage"> > </page--> >+ <page >+ class="org.eclipse.cdt.ui.templateengine.pages.TemplatePreferencePage" >+ name="%TemplatePreferencePage.name" >+ category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage" >+ id="org.eclipse.cdt.core.templateengine.shareddefaults"/> >+ <page >+ category="org.eclipse.cdt.ui.preferences.CEditorPreferencePage" >+ class="org.eclipse.cdt.ui.text.doctools.DocToolsPreferencePage" >+ id="org.eclipse.cdt.ui.text.doctools.prefpage" >+ name="Doc. Comments"/> > </extension> > <extension > point="org.eclipse.ui.editorActions"> >@@ -2434,16 +2445,6 @@ > name="%exportWizard.CDTCategory.name"> > </category> > </extension> >- >- <extension >- point="org.eclipse.ui.preferencePages"> >- <page >- class="org.eclipse.cdt.ui.templateengine.pages.TemplatePreferencePage" >- name="%TemplatePreferencePage.name" >- category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage" >- id="org.eclipse.cdt.core.templateengine.shareddefaults"/> >- </extension> >- > <extension > id="TemplateEngineWizard" > name="%Template.Engine.Wizard" >@@ -2463,11 +2464,54 @@ > </updater> > </extension> > <extension >+ id="id1" >+ point="org.eclipse.cdt.ui.completionProposalComputer"> >+ <completionProposalComputer >+ activate="true" >+ categoryId="org.eclipse.cdt.ui.parserProposalCategory" >+ class="org.eclipse.cdt.internal.ui.text.doctools.DocCommentMultilineProposalComputer"> >+ <partition >+ type="__c_multiline_doc_comment"> >+ </partition> >+ </completionProposalComputer> >+ </extension> >+ <extension >+ id="id2" >+ point="org.eclipse.cdt.ui.completionProposalComputer"> >+ <completionProposalComputer >+ activate="true" >+ categoryId="org.eclipse.cdt.ui.parserProposalCategory" >+ class="org.eclipse.cdt.internal.ui.text.doctools.DocCommentSinglelineProposalComputer"> >+ <partition >+ type="__c_singleline_doc_comment"> >+ </partition> >+ </completionProposalComputer> >+ </extension> >+ <extension > point="org.eclipse.cdt.ui.CHelpProvider"> > <provider > class="org.eclipse.cdt.internal.ui.help.CHelpProvider" > id="org.eclipse.cdt.ui.provider1"> > </provider> > </extension> >- >+ >+ <!-- --> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.eclipse.cdt.ui.doxygen" >+ name="Doxygen" >+ multiline="org.eclipse.cdt.internal.ui.text.doctools.doxygen.DoxygenMultilineConfiguration" >+ singleline="org.eclipse.cdt.internal.ui.text.doctools.doxygen.DoxygenSingleConfiguration"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.eclipse.cdt.ui.docpp" >+ name="Doc++" >+ multiline="org.eclipse.cdt.internal.ui.text.doctools.docpp.DocppMultilineConfiguration" >+ singleline="org.eclipse.cdt.internal.ui.text.doctools.docpp.DocppSingleConfiguration"> >+ </owner> >+ </extension> > </plugin> >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 @@ > </enumeration> > <enumeration value="__c_preprocessor"> > </enumeration> >+ <enumeration value="__c_multiline_doc_comment"> >+ </enumeration> >+ <enumeration value="__c_singleline_doc_comment"> >+ </enumeration> > </restriction> > </simpleType> > </attribute> >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<tagMarkers.length; i++) >+ if(c == tagMarkers[i]) >+ return true; >+ return false; >+ } >+ >+ >+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) { >+ IDocument doc= context.getDocument(); >+ int ivcOffset= context.getInvocationOffset(); >+ try { >+ ITypedRegion tr= TextUtilities.getPartition(doc, ICPartitions.C_PARTITIONING, ivcOffset, false); >+ int firstNonWS= ivcOffset; >+ while(firstNonWS-1> 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; i<tags.length; i++) { >+ String tag= tags[i].getTagName(); >+ if(tag.toLowerCase().startsWith(prefix.substring(1).toLowerCase())) { >+ CCompletionProposal proposal= new CCompletionProposal(tagMarker+tag, ivcOffset-prefix.length(), prefix.length(), null, tagMarker+tag, 1, context.getViewer()); >+ String description= tags[i].getTagDescription(); >+ if(description!=null && !description.equals("")) { //$NON-NLS-1$ >+ proposal.setAdditionalProposalInfo(description); >+ } >+ proposals.add(proposal); >+ } >+ } >+ return proposals; >+ } >+ } catch(BadLocationException ble) { >+ // offset is zero, ignore >+ } >+ return new ArrayList(); >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer#computeContextInformation(org.eclipse.cdt.ui.text.contentassist.ContentAssistInvocationContext, org.eclipse.core.runtime.IProgressMonitor) >+ */ >+ public List computeContextInformation(ContentAssistInvocationContext context, IProgressMonitor monitor) { >+ return Collections.EMPTY_LIST; >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer#getErrorMessage() >+ */ >+ public String getErrorMessage() { >+ return null; >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer#sessionEnded() >+ */ >+ public void sessionEnded() {} >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer#sessionStarted() >+ */ >+ public void sessionStarted() {} >+} >Index: src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java >diff -N src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/doctools/DefaultMultilineCommentAutoEditStrategy.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,381 @@ >+/******************************************************************************* >+ * 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 java.io.BufferedReader; >+import java.io.IOException; >+import java.io.StringReader; >+ >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.jface.text.BadLocationException; >+import org.eclipse.jface.text.DocumentCommand; >+import org.eclipse.jface.text.DocumentRewriteSession; >+import org.eclipse.jface.text.DocumentRewriteSessionType; >+import org.eclipse.jface.text.IAutoEditStrategy; >+import org.eclipse.jface.text.IDocument; >+import org.eclipse.jface.text.IDocumentExtension4; >+import org.eclipse.jface.text.IRegion; >+import org.eclipse.jface.text.ITypedRegion; >+import org.eclipse.jface.text.Region; >+import org.eclipse.jface.text.TextUtilities; >+import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IWorkbenchPage; >+import org.eclipse.ui.IWorkbenchWindow; >+import org.eclipse.ui.PlatformUI; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.ASTVisitor; >+import org.eclipse.cdt.core.dom.ast.IASTDeclaration; >+import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; >+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; >+import org.eclipse.cdt.core.model.CModelException; >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.cdt.ui.CUIPlugin; >+import org.eclipse.cdt.ui.IWorkingCopyManager; >+import org.eclipse.cdt.ui.text.ICPartitions; >+ >+/** >+ * This class provides default behaviours for multi-line comment auto-editing. >+ * >+ * This class is intended to be sub-classed. >+ * >+ * @since 5.0 >+ */ >+public class DefaultMultilineCommentAutoEditStrategy implements IAutoEditStrategy { >+ protected static final String MULTILINE_START = "/*"; //$NON-NLS-1$# >+ protected static final String MULTILINE_MID = " * "; //$NON-NLS-1$ >+ protected static final String MULTILINE_END = "*/"; //$NON-NLS-1$ >+ >+ public DefaultMultilineCommentAutoEditStrategy() { >+ } >+ >+ /** >+ * @see org.eclipse.jface.text.IAutoEditStrategy#customizeDocumentCommand(org.eclipse.jface.text.IDocument, org.eclipse.jface.text.DocumentCommand) >+ */ >+ public void customizeDocumentCommand(IDocument doc, DocumentCommand cmd) { >+ if(doc instanceof IDocumentExtension4) { >+ IDocumentExtension4 ext4= (IDocumentExtension4) doc; >+ DocumentRewriteSession drs= ext4.startRewriteSession(DocumentRewriteSessionType.UNRESTRICTED_SMALL); >+ try { >+ if (cmd.length == 0 && cmd.text != null && endsWithDelimiter(doc, cmd.text)) >+ customizeDocumentAfterNewLine(doc, cmd); >+ else if ("/".equals(cmd.text)) { //$NON-NLS-1$ >+ customizeDocumentForMultilineCommentEnd(doc, cmd); >+ } >+ } finally { >+ ext4.stopRewriteSession(drs); >+ } >+ } >+ } >+ >+ /** >+ * This implements a rule that when in a multiline comment context typing a forward slash with >+ * one white space after the "*" will move eliminate the whitespace. >+ * @param doc >+ * @param command >+ */ >+ protected void customizeDocumentForMultilineCommentEnd(IDocument doc, DocumentCommand command) { >+ if (command.offset < 2 || doc.getLength() == 0) { >+ return; >+ } >+ try { >+ if ("* ".equals(doc.get(command.offset - 2, 2))) { //$NON-NLS-1$ >+ // modify document command >+ command.length++; >+ command.offset--; >+ } >+ } catch (BadLocationException excp) { >+ // stop work >+ } >+ } >+ >+ /** >+ * Copies the indentation of the previous line and adds a star. >+ * If the comment just started on this line adds also a blank. >+ * >+ * @param doc the document to work on >+ * @param c the command to deal with >+ */ >+ public void customizeDocumentAfterNewLine(IDocument doc, final DocumentCommand c) { >+ int offset= c.offset; >+ if (offset == -1 || doc.getLength() == 0) >+ return; >+ >+ final StringBuffer buf= new StringBuffer(c.text); >+ try { >+ // find start of line >+ IRegion line= doc.getLineInformationOfOffset(c.offset); >+ int lineStart= line.getOffset(); >+ int firstNonWS= findEndOfWhiteSpaceAt(doc, lineStart, c.offset); >+ >+ IRegion prefix= findPrefixRange(doc, line); >+ String indentation= doc.get(prefix.getOffset(), prefix.getLength()); >+ int lengthToAdd= Math.min(offset - prefix.getOffset(), prefix.getLength()); >+ buf.append(indentation.substring(0, lengthToAdd)); >+ >+ boolean commentAtStart= firstNonWS < c.offset && doc.getChar(firstNonWS) == '/'; >+ if (commentAtStart) { >+ // comment started on this line >+ buf.append(MULTILINE_MID); >+ } >+ >+ c.shiftsCaret= false; >+ c.caretOffset= c.offset + buf.length(); >+ >+ if(commentAtStart && shouldCloseMultiline(doc, c.offset)) { >+ try { >+ doc.replace(c.offset, 0, indentation+" "+MULTILINE_END); // close the comment in order to parse //$NON-NLS-1$ >+ buf.append("\n"); //$NON-NLS-1$ >+ >+ // as we are autoclosing, the comment becomes eligable for auto-doc'ing >+ IASTDeclaration dec= findFollowingDeclaration(getAST(), offset); >+ if(dec!=null) { >+ ITypedRegion partition= TextUtilities.getPartition(doc, ICPartitions.C_PARTITIONING /* this! */, offset, false); >+ StringBuffer content= customizeAfterNewLineForDeclaration(doc, dec, partition); >+ buf.append(indent(content, indentation + MULTILINE_MID)); >+ } >+ >+ } catch(BadLocationException ble) { >+ ble.printStackTrace(); >+ } >+ } >+ >+ c.text= buf.toString(); >+ >+ } catch (BadLocationException excp) { >+ // stop work >+ } >+ } >+ >+ protected StringBuffer customizeAfterNewLineForDeclaration(IDocument doc, IASTDeclaration dec, ITypedRegion region) { >+ return new StringBuffer(); >+ } >+ >+ /* >+ * Utilities >+ */ >+ >+ /** >+ * Locates the {@link IASTDeclaration} most immediately following the specified offset >+ * @param unit the translation unit, or null (in which case the result will also be null) >+ * @param offset the offset to begin the search from >+ * @return the {@link IASTDeclaration} most immediately following the specified offset, or null if there >+ * is no {@link IASTDeclaration} >+ */ >+ public static IASTDeclaration findFollowingDeclaration(IASTTranslationUnit unit, final int offset) { >+ final IASTDeclaration[] dec= new IASTDeclaration[1]; >+ final ASTVisitor av= new ASTVisitor() { >+ { >+ shouldVisitTranslationUnit= true; >+ shouldVisitDeclarations= true; >+ } >+ >+ /** >+ * Holds the >+ */ >+ IASTDeclaration stopWhenLeaving; >+ >+ public int visit(IASTDeclaration declaration) { >+ IASTNodeLocation[] locs= declaration.getNodeLocations(); >+ if(locs.length>0) { >+ for(int i=0; i<locs.length; i++) { >+ IASTNodeLocation loc= locs[i]; >+ >+ int candidateOffset= loc.getNodeOffset(); >+ int candidateEndOffset= candidateOffset+loc.getNodeLength(); >+ >+ if(offset <= candidateOffset) { >+ dec[0]= declaration; >+ return PROCESS_ABORT; >+ } >+ >+ boolean candidateEnclosesOffset= (offset >= 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 <code>true</code> if the comment should be closed, <code>false</code> 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 >+ * <code>document</code>. The prefix greedily matches the following regex >+ * pattern: <code>\w*\*\w*</code>, that is, any number of whitespace >+ * characters, followed by an asterix ('*'), followed by any number of >+ * whitespace characters. >+ * >+ * @param document the document to which <code>line</code> refers >+ * @param line the line from which to extract the prefix range >+ * @return an <code>IRegion</code> 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<decls.length; i++) { >+ IASTDeclarator dtor= decls[i].getDeclarator(); >+ result.append(PARAM+dtor.getName()+"\n"); //$NON-NLS-1$ >+ } >+ return result; >+ } >+ >+ protected StringBuffer returnTag() { >+ return new StringBuffer(RETURN); >+ } >+ >+ protected IASTParameterDeclaration[] getParameterDecls(IASTFunctionDefinition def) { >+ IASTParameterDeclaration[] result; >+ IASTFunctionDeclarator decl= def.getDeclarator(); >+ if (decl instanceof IASTStandardFunctionDeclarator) { >+ IASTStandardFunctionDeclarator standardFunctionDecl= (IASTStandardFunctionDeclarator)decl; >+ result= standardFunctionDecl.getParameters(); >+ } else /*if (def instanceof ICASTKnRFunctionDeclarator) { >+ ICASTKnRFunctionDeclarator knrDeclarator= (ICASTKnRFunctionDeclarator)decl; >+ result= knrDeclarator.getParameterDeclarations(); >+ } else */{ >+ result= new IASTParameterDeclaration[0]; >+ } >+ return result; >+ } >+ >+ public StringBuffer customizeAfterNewLineForDeclaration(IDocument doc, IASTDeclaration dec, ITypedRegion partition) { >+ StringBuffer result= new StringBuffer(); >+ >+ while(dec instanceof ICPPASTTemplateDeclaration) /* if? */ >+ dec= ((ICPPASTTemplateDeclaration)dec).getDeclaration(); >+ >+ if(dec instanceof IASTFunctionDefinition) { >+ IASTFunctionDefinition fd= (IASTFunctionDefinition) dec; >+ result.append(paramTags(getParameterDecls(fd))); >+ >+ IASTDeclSpecifier ds= fd.getDeclSpecifier(); >+ boolean hasReturn= true; >+ if(ds instanceof IASTSimpleDeclSpecifier) { >+ IASTSimpleDeclSpecifier sds= (IASTSimpleDeclSpecifier) ds; >+ if(sds.getType()==IASTSimpleDeclSpecifier.t_void) { >+ hasReturn= false; >+ } >+ } >+ if(hasReturn) { >+ result.append(returnTag()); >+ } >+ >+ return result; >+ } >+ >+ return new StringBuffer(); >+ } >+} >Index: src/org/eclipse/cdt/ui/text/doctools/IDocCommentSimpleDictionary.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/doctools/IDocCommentSimpleDictionary.java >diff -N src/org/eclipse/cdt/ui/text/doctools/IDocCommentSimpleDictionary.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/doctools/IDocCommentSimpleDictionary.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,23 @@ >+/******************************************************************************* >+ * 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 simplified means of obtaining spelling support. >+ * @since 5.0 >+ */ >+public interface IDocCommentSimpleDictionary extends IDocCommentDictionary { >+ /** >+ * @return an array of words that should be regarded as correct. These >+ * words will be considered in addition to those provided by existing dictionaries. >+ */ >+ public String[] getAdditionalWords(); >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/Messages.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/Messages.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/Messages.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/Messages.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,29 @@ >+/******************************************************************************* >+ * 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.osgi.util.NLS; >+ >+public class Messages extends NLS { >+ private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.ui.text.doctools.messages"; //$NON-NLS-1$ >+ public static String EditorReopener_ReopenJobComplete; >+ public static String EditorReopener_ReopenJobStart; >+ public static String EditorReopener_ShouldSave_Message; >+ public static String EditorReopener_ShouldSave_Title; >+ public static String NullDocCommentOwner_Name; >+ static { >+ // initialize resource bundle >+ NLS.initializeMessages(BUNDLE_NAME, Messages.class); >+ } >+ >+ private Messages() { >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenSingleConfiguration.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenSingleConfiguration.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenSingleConfiguration.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenSingleConfiguration.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,34 @@ >+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.cdt.ui.text.doctools.generic.GenericDocTag; >+ >+import org.eclipse.jface.text.BadLocationException; >+import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy; >+import org.eclipse.jface.text.IAutoEditStrategy; >+import org.eclipse.jface.text.IDocument; >+ >+public class DoxygenSingleConfiguration extends AbstractGenericTagDocCommentViewerConfiguration { >+ GenericDocTag[] tags; >+ >+ public DoxygenSingleConfiguration() { >+ super(DoxygenHelper.getDoxygenTags(), new char[] {'@','\\'}, DoxygenHelper.DOXYGEN_SINGLE_TOKEN, DoxygenHelper.DOXYGEN_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); >+ return c == '/' || c == '!'; >+ } >+ } catch(BadLocationException ble) { >+ CUIPlugin.getDefault().log(ble); >+ } >+ return false; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentOwnerManager.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,250 @@ >+/******************************************************************************* >+ * 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 java.util.ArrayList; >+import java.util.HashMap; >+import java.util.Iterator; >+import java.util.List; >+import java.util.Map; >+ >+import org.eclipse.core.resources.IContainer; >+import org.eclipse.core.resources.IProject; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.resources.ResourcesPlugin; >+import org.eclipse.core.runtime.Assert; >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.core.runtime.IConfigurationElement; >+import org.eclipse.core.runtime.IExtension; >+import org.eclipse.core.runtime.IExtensionPoint; >+import org.eclipse.core.runtime.IExtensionRegistry; >+import org.eclipse.core.runtime.Platform; >+import org.eclipse.core.runtime.preferences.InstanceScope; >+import org.osgi.service.prefs.Preferences; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.ui.CUIPlugin; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwnershipListener; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; >+ >+/** >+ * This class manages which IDocCommentOwner's are available in the run-time, and how they map to resources >+ * in projects. >+ */ >+public class DocCommentOwnerManager { >+ /** Constants for attributes/elements from the DocCommentOwner extension point */ >+ private static final String ELEMENT_OWNER = "owner"; //$NON-NLS-1$ >+ private static final String ATTRKEY_OWNER_ID = "id"; //$NON-NLS-1$ >+ private static final String ATTRKEY_OWNER_NAME = "name"; //$NON-NLS-1$ >+ private static final String ATTRKEY_OWNER_SINGLELINE = "singleline"; //$NON-NLS-1$ >+ private static final String ATTRKEY_OWNER_MULTILINE = "multiline"; //$NON-NLS-1$ >+ >+ private static final String QUALIFIER= CCorePlugin.PLUGIN_ID; >+ private static final String WORKSPACE_DOC_TOOL_NODE= "doctool"; //$NON-NLS-1$ >+ private static final String PREFKEY_WORKSPACE_DEFAULT= "workspace.default"; //$NON-NLS-1$ >+ >+ private static DocCommentOwnerManager singleton; >+ >+ public static DocCommentOwnerManager getInstance() { >+ return singleton==null ? singleton= new DocCommentOwnerManager() : singleton; >+ } >+ >+ private Map/*<String, IDocCommentOwner>*/ 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. <em>This is currently unimplemented.</em> >+ */ >+ /* >+ * 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<extensions.length; i++) { >+ IExtension extension = extensions[i]; >+ try { >+ IConfigurationElement[] ce = extension.getConfigurationElements(); >+ for(int j=0; j<ce.length; j++) { >+ if(ce[j].getName().equals(ELEMENT_OWNER)) { >+ IDocCommentViewerConfiguration multi = (IDocCommentViewerConfiguration) ce[j].createExecutableExtension(ATTRKEY_OWNER_MULTILINE); >+ IDocCommentViewerConfiguration single = (IDocCommentViewerConfiguration) ce[j].createExecutableExtension(ATTRKEY_OWNER_SINGLELINE); >+ String id= ce[j].getAttribute(ATTRKEY_OWNER_ID); >+ String name= ce[j].getAttribute(ATTRKEY_OWNER_NAME); >+ result.put(id, new DocCommentOwner(id, name, multi, single)); >+ } >+ } >+ } catch(CoreException ce) { >+ CCorePlugin.log(ce); >+ } >+ } >+ >+ return result; >+ } >+ >+ private void fireOwnershipChanged(IResource resource, boolean recursive, IDocCommentOwner old, IDocCommentOwner n3w) { >+ for(Iterator i= fListeners.iterator(); i.hasNext();) { >+ ((IDocCommentOwnershipListener)i.next()).ownershipChanged(resource, recursive, old, n3w); >+ } >+ } >+ >+ private void fireWorkspaceOwnershipChanged(IDocCommentOwner old, IDocCommentOwner n3w) { >+ for(Iterator i= fListeners.iterator(); i.hasNext();) { >+ ((IDocCommentOwnershipListener)i.next()).workspaceOwnershipChanged(old, n3w); >+ } >+ } >+} >Index: src/org/eclipse/cdt/ui/text/ITokenStore.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/ITokenStore.java >diff -N src/org/eclipse/cdt/ui/text/ITokenStore.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/ITokenStore.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,67 @@ >+/******************************************************************************* >+ * 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.preference.IPreferenceStore; >+import org.eclipse.jface.text.rules.IToken; >+ >+import org.eclipse.cdt.ui.IPropertyChangeParticipant; >+import org.eclipse.cdt.ui.PreferenceConstants; >+ >+/** >+ * An ITokenStore manages a set of tokens for a specified set of color property identifiers. Responsibilities include >+ * <ul> >+ * <li> Reacting to changes to preferences in a specified {@link IPreferenceStore} >+ * <li> Managing whether further styles (bold, italic, strikethrough, underline) should be applied >+ * <li> Coping with >+ * </ul> >+ * >+ * ITokenStore assumes style preferences are stored under the following names >+ * <p> >+ * Preference color key + {@link PreferenceConstants#EDITOR_BOLD_SUFFIX} are used >+ * to retrieve whether the token is rendered in bold. >+ * </p> >+ * <p> >+ * Preference color key + {@link PreferenceConstants#EDITOR_ITALIC_SUFFIX} are used >+ * to retrieve whether the token is rendered in italic. >+ * </p> >+ * <p> >+ * Preference color key + {@link PreferenceConstants#EDITOR_STRIKETHROUGH_SUFFIX} are used >+ * to retrieve whether the token is rendered in strikethrough. >+ * </p> >+ * <p> >+ * Preference color key + {@link PreferenceConstants#EDITOR_UNDERLINE_SUFFIX} are used >+ * to retrieve whether the token is rendered in underline. >+ * </p> >+ * >+ * @see ITokenStoreFactory >+ * @since 5.0 >+ */ >+public interface ITokenStore extends IPropertyChangeParticipant { >+ /** >+ * Ensures any IToken objects that will be <em>or have been</em> 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<fTags.length; i++) { >+ String wd= fTags[i].getTagName(); >+ for(int j=0; j<fTagMarkers.length; j++) { >+ wr.addWord(fTagMarkers[j]+wd, fTokenStore.getToken(fTagToken)); >+ } >+ } >+ result.add(wr); >+ >+ // Add rule for Task Tags. >+ String taskWords= TaskTagRule.getTaskWords(fTokenStore.getPreferenceStore(), fCorePreferenceStore); >+ fTaskTagRule= new TaskTagRule(fTokenStore.getToken(PreferenceConstants.EDITOR_TASK_TAG_COLOR), taskWords); >+ result.add(fTaskTagRule); >+ >+ setDefaultReturnToken(fTokenStore.getToken(fDefaultTokenProperty)); >+ >+ return (IRule[]) result.toArray(new IRule[result.size()]); >+ } >+ >+ /* >+ * @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#affectsBehavior(org.eclipse.jface.util.PropertyChangeEvent) >+ */ >+ public boolean affectsBehavior(PropertyChangeEvent event) { >+ return fTaskTagRule.affectsBehavior(event) || fTokenStore.affectsBehavior(event); >+ } >+ >+ /* >+ * @see org.eclipse.cdt.internal.ui.text.AbstractJavaScanner#adaptToPreferenceChange(org.eclipse.jface.util.PropertyChangeEvent) >+ */ >+ public void adaptToPreferenceChange(PropertyChangeEvent event) { >+ if (fTokenStore.affectsBehavior(event)) { >+ fTokenStore.adaptToPreferenceChange(event); >+ } >+ fTaskTagRule.adaptToPreferenceChange(event); >+ } >+} >Index: src/org/eclipse/cdt/ui/text/doctools/generic/GenericDocTag.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/doctools/generic/GenericDocTag.java >diff -N src/org/eclipse/cdt/ui/text/doctools/generic/GenericDocTag.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/doctools/generic/GenericDocTag.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.generic; >+ >+/** >+ * Record class for a generic documentation tool tag >+ */ >+public class GenericDocTag { >+ private final String name, description; >+ >+ /** >+ * Create a tag >+ * @param name >+ * @param description >+ */ >+ public GenericDocTag(String name, String description) { >+ this.name= name; >+ this.description= description; >+ } >+ >+ /** >+ * @return the tag name (without any prefix i.e. no at or backslash) >+ */ >+ public String getTagName() { >+ return name; >+ } >+ >+ /** >+ * @return a human readable description of the tag. May be null. >+ */ >+ public String getTagDescription() { >+ return description; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/AbstractDocCommentProposalComputer.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/AbstractDocCommentProposalComputer.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/AbstractDocCommentProposalComputer.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/AbstractDocCommentProposalComputer.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,88 @@ >+/******************************************************************************* >+ * 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 java.util.List; >+ >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.runtime.IProgressMonitor; >+import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IWorkbenchPage; >+import org.eclipse.ui.IWorkbenchWindow; >+import org.eclipse.ui.PlatformUI; >+ >+import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.cdt.ui.CUIPlugin; >+import org.eclipse.cdt.ui.IWorkingCopyManager; >+import org.eclipse.cdt.ui.text.contentassist.ContentAssistInvocationContext; >+import org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; >+ >+ >+abstract class AbstractDocCommentProposalComputer implements ICompletionProposalComputer { >+ >+ protected abstract IDocCommentViewerConfiguration getConfiguration(IDocCommentOwner owner); >+ >+ protected final IDocCommentViewerConfiguration getConfiguration() { >+ IResource resource= getResource(); >+ IDocCommentOwner owner= DocCommentOwnerManager.getInstance().getCommentOwner(resource); >+ return getConfiguration(owner); >+ } >+ >+ public List computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) { >+ return getConfiguration().createProposalComputer().computeCompletionProposals(context, monitor); >+ } >+ >+ public List computeContextInformation( >+ ContentAssistInvocationContext context, IProgressMonitor monitor) { >+ return getConfiguration().createProposalComputer().computeContextInformation(context, monitor); >+ } >+ >+ public String getErrorMessage() { >+ return getConfiguration().createProposalComputer().getErrorMessage(); >+ } >+ >+ public void sessionEnded() { >+ // XXX >+ } >+ >+ public void sessionStarted() { >+ // XXX >+ } >+ >+ >+ private static IResource getResource() { >+ ITranslationUnit tu= getTranslationUnit(); >+ return tu.getResource(); >+ } >+ >+ private 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; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/ProjectMap.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/ProjectMap.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/ProjectMap.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/ProjectMap.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,178 @@ >+/******************************************************************************* >+ * 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 java.util.HashMap; >+import java.util.Iterator; >+import java.util.Map; >+ >+import org.eclipse.core.resources.IProject; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.resources.ResourcesPlugin; >+import org.eclipse.core.runtime.Assert; >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.core.runtime.IPath; >+import org.eclipse.core.runtime.Path; >+import org.w3c.dom.Element; >+import org.w3c.dom.Node; >+import org.w3c.dom.NodeList; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.ICDescriptor; >+import org.eclipse.cdt.ui.CUIPlugin; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; >+ >+/** >+ * A ProjectMap is an internal abstraction which >+ * <ul> >+ * <li>Maintains mappings from project relative paths to comment-owner ID's >+ * <li>Manages persistence of these mappings to the .cproject file. >+ * </ul> >+ * 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/*<IPath, String>*/ 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 <code>null</code> 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; i<commentOwners.getLength(); i++) { >+ Element node= (Element) commentOwners.item(i); >+ Node commentOwnerIDNode= node.getAttributes().getNamedItem(ATTRKEY_DCO_ID); >+ >+ if(commentOwnerIDNode != null) { >+ String commentOwnerID= commentOwnerIDNode.getNodeValue(); >+ >+ NodeList paths= node.getElementsByTagName(ELEMENT_PATH); >+ for(int j=0; j<paths.getLength(); j++) { >+ Node path= paths.item(i); >+ Node pathValue= path.getAttributes().getNamedItem(ATTRKEY_PATH_VALUE); >+ if(pathValue != null) { >+ result.put(Path.fromPortableString(pathValue.getNodeValue()), commentOwnerID); >+ } >+ } >+ } >+ } >+ } >+ return result; >+ } >+ >+ /** >+ * Write the map to the .cproject file >+ */ >+ public void save() throws CoreException { >+ ICDescriptor pd= CCorePlugin.getDefault().getCProjectDescription(fProject, true); >+ >+ // remove current associations >+ Element data= pd.getProjectData(ATTRVAL_STORAGEID); >+ NodeList nl= data.getChildNodes(); >+ for(int i=0; i<nl.getLength(); i++) { >+ Node node= nl.item(i); >+ if(node.getNodeType()== Node.ELEMENT_NODE) { >+ data.removeChild(node); >+ } >+ } >+ >+ // invert and persist associations >+ for(Iterator i= fMap.values().iterator(); i.hasNext();) { >+ String cid= (String) i.next(); >+ Element commentNode= data.getOwnerDocument().createElement(ELEMENT_DOC_COMMENT_OWNER); >+ commentNode.setAttribute(ATTRKEY_DCO_ID, cid); >+ for(Iterator j= fMap.keySet().iterator(); j.hasNext(); ) { >+ IPath path= (IPath) j.next(); >+ String ccid= (String) fMap.get(path); >+ if(cid.equals(ccid)) { >+ Element pathNode= data.getOwnerDocument().createElement(ELEMENT_PATH); >+ pathNode.setAttribute(ATTRKEY_PATH_VALUE, path.toPortableString()); >+ commentNode.appendChild(pathNode); >+ } >+ } >+ data.appendChild(commentNode); >+ } >+ pd.saveProjectData(); >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/tags.csv >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/tags.csv >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/tags.csv >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/tags.csv 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,116 @@ >+a,, >+addindex,, >+addtogroup,, >+anchor,, >+arg,, >+attention,, >+author,, >+b,, >+brief,, >+bug,, >+c,, >+callgraph,, >+callergraph,, >+category,, >+class,, >+code,, >+cond,, >+copydoc,, >+date,, >+def,, >+defgroup,, >+deprecated,, >+details,, >+dir,, >+dontinclude,, >+dot,, >+dotfile,, >+e,, >+else,, >+elseif,, >+em,, >+endcode,, >+endcond,, >+enddot,, >+endhtmlonly,, >+endif,, >+endlatexonly,, >+endlink,, >+endmanonly,, >+endmsc,, >+endverbatim,, >+endxmlonly,, >+enum,, >+example,, >+exception,, >+f$,, >+f[,, >+f],, >+file,, >+fn,, >+hideinitializer,, >+htmlinclude,, >+htmlonly,, >+if,, >+ifnot,, >+image,, >+include,, >+includelineno,, >+ingroup,, >+internal,, >+invariant,, >+interface,, >+latexonly,, >+li,, >+line,, >+link,, >+mainpage,, >+manonly,, >+msc,, >+n,, >+name,, >+namespace,, >+nosubgrouping,, >+note,, >+overload,, >+p,, >+package,, >+page,, >+par,, >+paragraph,, >+param,, >+post,, >+pre,, >+property,, >+protocol,, >+ref,, >+relates,, >+relatesalso,, >+remarks,, >+return,, >+retval,, >+sa,, >+section,, >+see,, >+showinitializer,, >+since,, >+skip,, >+skipline,, >+struct,, >+subpage,, >+subsection,, >+subsubsection,, >+test,, >+throw,, >+todo,, >+typedef,, >+union,, >+until,, >+var,, >+verbatim,, >+verbinclude,, >+version,, >+warning,, >+weakgroup,, >+xmlonly,, >+xrefitem,, >Index: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagDoubleClickStrategy.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagDoubleClickStrategy.java >diff -N src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagDoubleClickStrategy.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/doctools/generic/GenericTagDoubleClickStrategy.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,254 @@ >+/******************************************************************************* >+ * 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 com.ibm.icu.text.BreakIterator; >+import java.text.CharacterIterator; >+ >+import org.eclipse.jface.text.BadLocationException; >+import org.eclipse.jface.text.IDocument; >+import org.eclipse.jface.text.IRegion; >+import org.eclipse.jface.text.ITextDoubleClickStrategy; >+import org.eclipse.jface.text.ITextViewer; >+import org.eclipse.jface.text.Region; >+ >+/** >+ * Cloned and tweaked from JDT's javadoc double click strategy >+ */ >+public class GenericTagDoubleClickStrategy implements ITextDoubleClickStrategy { >+ protected final char[] fTagMarkers; >+ >+ /** >+ * A double-click strategy that additionally understands tag markers form part of a >+ * selectable word. >+ * @param tagMarkers the set of characters to additionally consider part of a word >+ */ >+ public GenericTagDoubleClickStrategy(char[] tagMarkers) { >+ fTagMarkers= new char[tagMarkers.length]; >+ System.arraycopy(tagMarkers, 0, fTagMarkers, 0, tagMarkers.length); >+ } >+ >+ /** >+ * Implements a character iterator that works directly on >+ * instances of <code>IDocument</code>. 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 <code>position</code>. >+ * >+ * @param document the document >+ * @param position the offset around which to return the word >+ * @return the word's region, or <code>null</code> 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<fTagMarkers.length; i++) { >+ if(c == fTagMarkers[i]) >+ return true; >+ } >+ return false; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineConfiguration.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineConfiguration.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineConfiguration.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppMultilineConfiguration.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,37 @@ >+package org.eclipse.cdt.internal.ui.text.doctools.docpp; >+ >+import org.eclipse.jface.text.BadLocationException; >+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; >+ >+public class DocppMultilineConfiguration extends AbstractGenericTagDocCommentViewerConfiguration { >+ >+ public DocppMultilineConfiguration() { >+ super(DocppHelper.getDocPPTags(), new char[] {'@','\\'}, DocppHelper.DOCPP_MULTI_TOKEN, DocppHelper.DOCPP_TAG_RECOGNIZED); >+ } >+ >+ public IAutoEditStrategy createAutoEditStrategy() { >+ return new DocppMultilineAutoEditStrategy(); >+ } >+ >+ 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/ui/text/doctools/IDocCommentViewerConfiguration.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/doctools/IDocCommentViewerConfiguration.java >diff -N src/org/eclipse/cdt/ui/text/doctools/IDocCommentViewerConfiguration.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/doctools/IDocCommentViewerConfiguration.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,67 @@ >+/******************************************************************************* >+ * 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.jface.text.IAutoEditStrategy; >+import org.eclipse.jface.text.IDocument; >+import org.eclipse.jface.text.ITextDoubleClickStrategy; >+ >+import org.eclipse.cdt.ui.text.ICPartitions; >+import org.eclipse.cdt.ui.text.ICTokenScanner; >+import org.eclipse.cdt.ui.text.ITokenStoreFactory; >+import org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer; >+ >+/** >+ * An IDocCommentViewerConfiguration aggregates a collection of editor tools that can be contributed to >+ * the CDT editor. The tools will be active for CEditor partitions of type {@link ICPartitions#C_MULTI_LINE_DOC_COMMENT} or >+ * {@link ICPartitions#C_SINGLE_LINE_DOC_COMMENT} when the {@link IDocCommentOwner} this instance originated from is active. >+ * >+ * @see org.eclipse.jface.text.source.SourceViewerConfiguration (in analogy to) >+ * @since 5.0 >+ */ >+public interface IDocCommentViewerConfiguration { >+ /** >+ * @param doc the document to examine >+ * @param offset the offset of the start of the region (inclusive) >+ * @param length the length of the region to examine >+ * @return whether the region specified is a documentation comment handled by this viewer configuration >+ */ >+ boolean isDocumentationComment(IDocument doc, int offset, int length); >+ >+ /** >+ * @return a ICTokenScanner for tokenising/coloring the appropriate comment region. May return null. >+ */ >+ ICTokenScanner createCommentScanner(ITokenStoreFactory tokenStoreFactory); >+ >+ /** >+ * @return an auto edit strategy suitable for the appropriate comment region. May return null >+ * in the case where no auto-edit-strategy is required. >+ */ >+ IAutoEditStrategy createAutoEditStrategy(); >+ >+ /** >+ * @return a double click strategy suitable for the associated comment-region. May return null in >+ * the case where no double-click-strategy is required. >+ */ >+ ITextDoubleClickStrategy createDoubleClickStrategy(); >+ >+ /** >+ * @return a completion proposal computer suitable for the associated comment-region. May return null in >+ * the case where no proposal-computer is required. >+ */ >+ ICompletionProposalComputer createProposalComputer(); >+ >+ /** >+ * @return a {@link IDocCommentDictionary} suitable for spell-checking. May return null >+ * in the case where no additional dictionary is required. >+ */ >+ IDocCommentDictionary getSpellingDictionary(); >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/doxygen/DoxygenMultilineAutoEditStrategy.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,158 @@ >+package org.eclipse.cdt.internal.ui.text.doctools.doxygen; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.jface.text.BadLocationException; >+import org.eclipse.jface.text.IAutoEditStrategy; >+import org.eclipse.jface.text.IDocument; >+import org.eclipse.jface.text.IRegion; >+import org.eclipse.jface.text.ITypedRegion; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; >+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.IASTEnumerationSpecifier; >+import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; >+import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; >+import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; >+import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; >+import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; >+import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; >+import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator; >+import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; >+import org.eclipse.cdt.ui.text.doctools.DefaultMultilineCommentAutoEditStrategy; >+ >+/** >+ * {@link IAutoEditStrategy} for adding Doxygen tags for comments. >+ */ >+public class DoxygenMultilineAutoEditStrategy extends DefaultMultilineCommentAutoEditStrategy { >+ private static final String SINGLELINE_COMMENT_PRECEDING = "//!< "; //$NON-NLS-1$ >+ 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<decls.length; i++) { >+ IASTDeclarator dtor= decls[i].getDeclarator(); >+ result.append(PARAM+dtor.getName()+"\n"); //$NON-NLS-1$ >+ } >+ return result; >+ } >+ >+ protected StringBuffer returnTag() { >+ return new StringBuffer(RETURN); >+ } >+ >+ protected IASTParameterDeclaration[] getParameterDecls(IASTFunctionDefinition def) { >+ IASTParameterDeclaration[] result; >+ IASTFunctionDeclarator decl= def.getDeclarator(); >+ if (decl instanceof IASTStandardFunctionDeclarator) { >+ IASTStandardFunctionDeclarator standardFunctionDecl= (IASTStandardFunctionDeclarator)decl; >+ result= standardFunctionDecl.getParameters(); >+ } else /*if (def instanceof ICASTKnRFunctionDeclarator) { >+ ICASTKnRFunctionDeclarator knrDeclarator= (ICASTKnRFunctionDeclarator)decl; >+ result= knrDeclarator.getParameterDeclarations(); >+ } else */{ >+ result= new IASTParameterDeclaration[0]; >+ } >+ return result; >+ } >+ >+ public StringBuffer customizeAfterNewLineForDeclaration(IDocument doc, IASTDeclaration dec, ITypedRegion partition) { >+ StringBuffer result= new StringBuffer(); >+ >+ while(dec instanceof ICPPASTTemplateDeclaration) /* if? */ >+ dec= ((ICPPASTTemplateDeclaration)dec).getDeclaration(); >+ >+ if(dec instanceof IASTFunctionDefinition) { >+ IASTFunctionDefinition fd= (IASTFunctionDefinition) dec; >+ result.append(paramTags(getParameterDecls(fd))); >+ >+ IASTDeclSpecifier ds= fd.getDeclSpecifier(); >+ boolean hasReturn= true; >+ if(ds instanceof IASTSimpleDeclSpecifier) { >+ IASTSimpleDeclSpecifier sds= (IASTSimpleDeclSpecifier) ds; >+ if(sds.getType()==IASTSimpleDeclSpecifier.t_void) { >+ hasReturn= false; >+ } >+ } >+ if(hasReturn) { >+ result.append(returnTag()); >+ } >+ >+ return result; >+ } >+ >+ if(dec instanceof IASTSimpleDeclaration && ((IASTSimpleDeclaration)dec).getDeclSpecifier() instanceof IASTCompositeTypeSpecifier) { >+ // result.append("@publishedAll"); >+ return result; >+ } >+ >+ >+ try { >+ alterDoc(doc, dec); >+ } catch(BadLocationException ble) {} >+ >+ return new StringBuffer(); >+ } >+ >+ /* >+ * Prototype code for adding post-declaration comments to enumerators, after initialiting a doc-comment >+ * on an enumeration >+ */ >+ private void alterDoc(IDocument doc, IASTDeclaration dec) throws BadLocationException { >+ if(dec instanceof IASTSimpleDeclaration && ((IASTSimpleDeclaration)dec).getDeclSpecifier() instanceof IASTEnumerationSpecifier) { >+ IASTEnumerationSpecifier spc= (IASTEnumerationSpecifier) ((IASTSimpleDeclaration)dec).getDeclSpecifier(); >+ IASTEnumerator[] enms= spc.getEnumerators(); >+ >+ class Entry { >+ final int offset, length; >+ String comment; >+ Entry(int offset, int length, String comment) { >+ this.offset= offset; >+ this.length= length; >+ this.comment= comment; >+ } >+ } >+ >+ List entries= new ArrayList(); >+ for(int i=0; i<enms.length; i++) { >+ IASTNodeLocation[] locs= (enms[i].getName().getNodeLocations()); >+ if(locs.length==1) { >+ int offset2= locs[0].getNodeOffset()+locs[0].getNodeLength(); >+ System.out.println(offset2); >+ String cmt= SINGLELINE_COMMENT_PRECEDING+enms[i].getName(); >+ IRegion region= doc.getLineInformationOfOffset(offset2); >+ entries.add(new Entry(region.getOffset(),region.getLength(), cmt)); >+ } else { >+ // TODO >+ CCorePlugin.log("TODO"); //$NON-NLS-1$ >+ } >+ } >+ >+ int max= Integer.MIN_VALUE; >+ for(int i=0; i<entries.size(); i++) { >+ Entry e= (Entry) entries.get(i); >+ if(e.length > max) >+ max= e.length; >+ } >+ >+ >+ int addedLength2=0; >+ for(int i=0; i<entries.size(); i++) { >+ Entry e= (Entry) entries.get(i); >+ // pad with whitespace >+ int toAdd= max-e.length; >+ for(int j=0; j<toAdd; j++) { >+ e.comment= " "+e.comment; //$NON-NLS-1$ >+ } >+ doc.replace(e.offset+e.length+addedLength2, 0, e.comment); >+ addedLength2+= e.comment.length(); >+ } >+ } >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/TokenStore.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/TokenStore.java >diff -N src/org/eclipse/cdt/internal/ui/text/TokenStore.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/TokenStore.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,275 @@ >+/******************************************************************************* >+ * Copyright (c) 2000, 2006, 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 >+ * QNX Software System >+ * Andrew Ferguson (Symbian) - refactored to TokenStore (previously part of AbstractCScanner) >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.ui.text; >+ >+ >+import java.util.HashMap; >+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.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.text.ITokenStore; >+ >+ >+/** >+ * Maintains a pool of tokens identified by a String ID. >+ * Supports styles per token. >+ * Updates token instances on property changes. >+ */ >+ >+public class TokenStore implements ITokenStore { >+ private IColorManager fColorManager; >+ private IPreferenceStore fPreferenceStore; >+ >+ private Map fTokenMap= new HashMap(); >+ private String[] fPropertyNamesColor; >+ >+ private boolean fNeedsLazyColorLoading; >+ >+ /** >+ * Maintains tokens for a specified set of property keys. Automatically also >+ * copes with bold, italic, strikethrough and underlined versions of the key. >+ * @param manager the IColorManager to retrieve token colors from >+ * @param store the {@link IPreferenceStore} to fetch property preferences from >+ */ >+ public TokenStore(IColorManager manager, IPreferenceStore store, String[] propertyNamesColor) { >+ fColorManager= manager; >+ fPreferenceStore= store; >+ >+ fPropertyNamesColor= propertyNamesColor; >+ >+ fNeedsLazyColorLoading= Display.getCurrent() == null; >+ for (int i= 0; i < fPropertyNamesColor.length; i++) { >+ if(fPropertyNamesColor[i].endsWith(PreferenceConstants.EDITOR_BOLD_SUFFIX) >+ || fPropertyNamesColor[i].endsWith(PreferenceConstants.EDITOR_ITALIC_SUFFIX) >+ || fPropertyNamesColor[i].endsWith(PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX) >+ || fPropertyNamesColor[i].endsWith(PreferenceConstants.EDITOR_UNDERLINE_SUFFIX)) { >+ throw new IllegalArgumentException(); // XXX >+ } >+ if (fNeedsLazyColorLoading) >+ addTokenWithProxyAttribute(fPropertyNamesColor[i]); >+ else >+ addToken(fPropertyNamesColor[i]); >+ } >+ } >+ >+ /** >+ * In the case where at the time of IToken construction, the Display was not >+ * ready to construct colors. >+ */ >+ public void ensureTokensInitialised() { >+ if (fNeedsLazyColorLoading && Display.getCurrent() != null) { >+ for (int i= 0; i < fPropertyNamesColor.length; i++) { >+ addToken(fPropertyNamesColor[i]); >+ } >+ fNeedsLazyColorLoading= false; >+ } >+ } >+ >+ private void addTokenWithProxyAttribute(String colorKey) { >+ fTokenMap.put(colorKey, new Token(createTextAttribute(colorKey, true))); >+ } >+ >+ private void addToken(String colorKey) { >+ if (fColorManager != null && colorKey != null && fColorManager.getColor(colorKey) == null) { >+ RGB rgb= PreferenceConverter.getColor(fPreferenceStore, colorKey); >+ if (fColorManager instanceof IColorManagerExtension) { >+ IColorManagerExtension ext= (IColorManagerExtension) fColorManager; >+ ext.unbindColor(colorKey); >+ ext.bindColor(colorKey, rgb); >+ } >+ } >+ >+ if (!fNeedsLazyColorLoading) >+ fTokenMap.put(colorKey, new Token(createTextAttribute(colorKey, false))); >+ else { >+ Token token= ((Token)fTokenMap.get(colorKey)); >+ if (token != null) >+ token.setData(createTextAttribute(colorKey, false)); >+ } >+ } >+ >+ /** >+ * Create a text attribute based on the given color, bold, italic, strikethrough and underline preference keys. >+ * >+ * @param colorKey the color preference key >+ * @param boldKey the bold preference key >+ * @param italicKey the italic preference key >+ * @param strikethroughKey the strikethrough preference key >+ * @param underlineKey the italic preference key >+ * @return the created text attribute >+ * @since 3.0 >+ */ >+ private TextAttribute createTextAttribute(String colorKey, boolean isNull) { >+ Color color= null; >+ if (!isNull) >+ color= fColorManager.getColor(colorKey); >+ >+ String boldKey= colorKey + PreferenceConstants.EDITOR_BOLD_SUFFIX; >+ String italicKey= colorKey + PreferenceConstants.EDITOR_ITALIC_SUFFIX; >+ String strikethroughKey= colorKey + PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX; >+ String underlineKey= colorKey + PreferenceConstants.EDITOR_UNDERLINE_SUFFIX; >+ >+ int style= fPreferenceStore.getBoolean(boldKey) ? SWT.BOLD : SWT.NORMAL; >+ if (fPreferenceStore.getBoolean(italicKey)) >+ style |= SWT.ITALIC; >+ >+ if (fPreferenceStore.getBoolean(strikethroughKey)) >+ style |= TextAttribute.STRIKETHROUGH; >+ >+ if (fPreferenceStore.getBoolean(underlineKey)) >+ style |= TextAttribute.UNDERLINE; >+ >+ return new TextAttribute(color, null, style); >+ } >+ >+ /* >+ * (non-Javadoc) >+ * @see org.eclipse.cdt.ui.text.ITokenStore#getToken(java.lang.String) >+ */ >+ public IToken getToken(String key) { >+ return getTokenInner(key); >+ } >+ >+ private Token getTokenInner(String key) { >+ ensureTokensInitialised(); >+ return (Token) fTokenMap.get(key); >+ } >+ >+ private int indexOf(String property) { >+ if (property != null) { >+ int length= fPropertyNamesColor.length; >+ for (int i= 0; i < length; i++) { >+ if (property.startsWith(fPropertyNamesColor[i])) { >+ int pLength= property.length(); >+ if(fPropertyNamesColor[i].length() < pLength) { >+ String end= property.substring(fPropertyNamesColor[i].length()); >+ if (end.equals(PreferenceConstants.EDITOR_BOLD_SUFFIX) >+ || end.equals(PreferenceConstants.EDITOR_ITALIC_SUFFIX) >+ || end.equals(PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX) >+ || end.equals(PreferenceConstants.EDITOR_UNDERLINE_SUFFIX)) { >+ return i; >+ } >+ } else if (fPropertyNamesColor[i].equals(property)) { >+ return i; >+ } >+ } >+ } >+ } >+ return -1; >+ } >+ >+ /* >+ * (non-Javadoc) >+ * @see org.eclipse.cdt.ui.IPropertyChangeParticipant#affectsBehavior(org.eclipse.jface.util.PropertyChangeEvent) >+ */ >+ public boolean affectsBehavior(PropertyChangeEvent event) { >+ return indexOf(event.getProperty()) >= 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<values.length; i+=2) { >+ temp.add(new GenericDocTag(values[i], values[i+1])); >+ } >+ tags= (GenericDocTag[]) temp.toArray(new GenericDocTag[temp.size()]); >+ } catch(IOException ioe) { >+ >+ } >+ >+ } >+ return tags; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/EditorReopener.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/EditorReopener.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/EditorReopener.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/EditorReopener.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,179 @@ >+/******************************************************************************* >+ * 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 java.util.ArrayList; >+import java.util.List; >+ >+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.IProgressMonitor; >+import org.eclipse.core.runtime.IStatus; >+import org.eclipse.core.runtime.NullProgressMonitor; >+import org.eclipse.core.runtime.Status; >+import org.eclipse.jface.dialogs.MessageDialog; >+import org.eclipse.swt.widgets.Shell; >+import org.eclipse.ui.IEditorInput; >+import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IEditorReference; >+import org.eclipse.ui.IFileEditorInput; >+import org.eclipse.ui.IWorkbenchWindow; >+import org.eclipse.ui.PartInitException; >+import org.eclipse.ui.PlatformUI; >+import org.eclipse.ui.progress.WorkbenchJob; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.model.CModelException; >+import org.eclipse.cdt.core.model.CoreModel; >+import org.eclipse.cdt.core.model.ICElement; >+import org.eclipse.cdt.ui.CUIPlugin; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwnershipListener; >+ >+import org.eclipse.cdt.internal.ui.editor.ITranslationUnitEditorInput; >+import org.eclipse.cdt.internal.ui.util.EditorUtility; >+import org.eclipse.cdt.internal.ui.util.ExternalEditorInput; >+ >+/** >+ * Listens to change in doc-comment ownership and reinitializes >+ * the editors (or a safe superset of) that need reopening. >+ */ >+public class EditorReopener implements IDocCommentOwnershipListener { >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.doctools.IDocCommentOwnershipListener#ownershipChanged(org.eclipse.core.resources.IResource, boolean, org.eclipse.cdt.ui.text.doctools.IDocCommentOwner, org.eclipse.cdt.ui.text.doctools.IDocCommentOwner) >+ */ >+ public void ownershipChanged(IResource resource, boolean recursive, >+ IDocCommentOwner old, IDocCommentOwner newOwner) { >+ IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); >+ if(window!=null) { >+ try { >+ IEditorPart[] parts= getEditorsToRepon(window, resource); >+ if(queryIfNeeded(window.getShell(), parts)) { >+ reopenEditors(window, parts); >+ } >+ } catch(CoreException ce) { >+ CCorePlugin.log(ce); >+ } >+ } >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.doctools.IDocCommentOwnershipListener#workspaceOwnershipChanged(org.eclipse.cdt.ui.text.doctools.IDocCommentOwner, org.eclipse.cdt.ui.text.doctools.IDocCommentOwner) >+ */ >+ public void workspaceOwnershipChanged(IDocCommentOwner old, IDocCommentOwner newOwner) { >+ IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); >+ if(window!=null) { >+ try { >+ IEditorPart[] parts= getEditorsToRepon(window, null); >+ if(queryIfNeeded(window.getShell(), parts)) { >+ reopenEditors(window, parts); >+ } >+ } catch(CoreException ce) { >+ CCorePlugin.log(ce); >+ } >+ } >+ } >+ >+ /** >+ * @param window >+ * @param resource may be null to indicate all CDT editors should be reopened >+ * @return an array of {@link IEditorPart} objects that might need to be reinitialized >+ * based on doc-comment ownership of the specified resource changing >+ */ >+ /* >+ * This could be smarter in determining smaller sets of editors to re-open >+ */ >+ private IEditorPart[] getEditorsToRepon(IWorkbenchWindow window, IResource resource) { >+ List needReopening= new ArrayList(); >+ if(window.getActivePage()!=null) { >+ IEditorReference[] es= window.getActivePage().getEditorReferences(); >+ for(int i=0; i<es.length; i++) { >+ IEditorPart part= es[i].getEditor(false); >+ if(part!=null) { >+ IEditorInput iei= part.getEditorInput(); >+ if(resource!=null) { >+ if(iei instanceof IFileEditorInput) { >+ IFile file= ((IFileEditorInput) iei).getFile(); >+ IProject project= resource.getProject(); >+ if(file.getProject().equals(project) && CoreModel.hasCNature(project)) { >+ needReopening.add(part); >+ } >+ } >+ } else { >+ if(iei instanceof ITranslationUnitEditorInput) { >+ needReopening.add(part); >+ } >+ } >+ } >+ } >+ } >+ return (IEditorPart[]) needReopening.toArray(new IEditorPart[needReopening.size()]); >+ } >+ >+ private boolean queryIfNeeded(Shell shell, IEditorPart[] editorParts) throws CoreException { >+ boolean anyUnsaved= false; >+ for(int j=0; j<editorParts.length; j++) >+ if(editorParts[j].isSaveOnCloseNeeded()) >+ anyUnsaved= true; >+ >+ boolean saveAndReopen= !anyUnsaved; >+ if(anyUnsaved) { >+ String title= Messages.EditorReopener_ShouldSave_Title; >+ String msg= Messages.EditorReopener_ShouldSave_Message; >+ >+ if (MessageDialog.openQuestion(shell, title, msg)) >+ saveAndReopen= true; >+ } >+ return saveAndReopen; >+ } >+ >+ private void reopenEditors(final IWorkbenchWindow window, final IEditorPart[] editorParts) throws CoreException { >+ WorkbenchJob job= new WorkbenchJob(Messages.EditorReopener_ReopenJobStart) { >+ public IStatus runInUIThread(IProgressMonitor monitor) { >+ IEditorPart oldActive= window.getActivePage().getActiveEditor(); >+ IEditorPart newActive= null; >+ >+ for(int j=0; j<editorParts.length; j++) { >+ IEditorPart oldPart= editorParts[j]; >+ oldPart.doSave(new NullProgressMonitor()); >+ window.getActivePage().closeEditor(oldPart, false); >+ IEditorInput oldInput= oldPart.getEditorInput(); >+ >+ try { >+ IEditorPart newPart= null; >+ if(oldInput instanceof IFileEditorInput) { >+ newPart= EditorUtility.openInEditor(((IFileEditorInput)oldInput).getFile()); >+ } else if(oldInput instanceof ExternalEditorInput) { >+ ExternalEditorInput eei= (ExternalEditorInput) oldInput; >+ ICElement element= CoreModel.getDefault().create(eei.getMarkerResource()); >+ newPart= EditorUtility.openInEditor(eei.getPath(null), element); >+ } >+ if(oldPart == oldActive) >+ newActive= newPart; >+ } catch(PartInitException pie) { >+ CCorePlugin.log(pie); >+ } catch(CModelException cme) { >+ CCorePlugin.log(cme); >+ } >+ } >+ >+ if(newActive != null) { >+ window.getActivePage().activate(newActive); >+ } >+ return new Status(IStatus.OK, CUIPlugin.PLUGIN_ID, Messages.EditorReopener_ReopenJobComplete); >+ } >+ }; >+ job.schedule(); >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/tags.csv >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/tags.csv >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/docpp/tags.csv >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/docpp/tags.csv 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,19 @@ >+args,, >+author,, >+deprecated,, >+doc,, >+exception,, >+field,, >+friends,, >+invariant,, >+memo,, >+name,, >+param,, >+postcondition,, >+precondition,, >+return,, >+see,, >+since,, >+type,, >+version,, >+ >Index: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppHelper.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppHelper.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppHelper.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/docpp/DocppHelper.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,65 @@ >+package org.eclipse.cdt.internal.ui.text.doctools.docpp; >+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 DocppHelper { >+ /* >+ * TODO - This is a temporary location >+ */ >+ private static final IPath TAGS_CSV= new Path("src/org/eclipse/cdt/internal/ui/text/doctools/docpp/tags.csv"); //$NON-NLS-1$ >+ >+ static { >+ // TODO - I'll find a legitimate place to do this >+ IPreferenceStore cuis= CUIPlugin.getDefault().getPreferenceStore(); >+ PreferenceConverter.setDefault(cuis, DocppHelper.DOCPP_MULTI_TOKEN, new RGB(63, 95, 191)); >+ PreferenceConverter.setDefault(cuis, DocppHelper.DOCPP_SINGLE_TOKEN, new RGB(63, 95, 191)); >+ PreferenceConverter.setDefault(cuis, DocppHelper.DOCPP_TAG_RECOGNIZED, new RGB(127, 159, 191)); >+ } >+ >+ >+ private static GenericDocTag[] tags; >+ public static final String DOCPP_TAG_RECOGNIZED= "org.eclipse.cdt.internal.ui.text.doctools.doxygen.recognizedTag"; //$NON-NLS-1$ >+ public static final String DOCPP_SINGLE_TOKEN= "org.eclipse.cdt.internal.ui.text.doctools.doxygen.single"; //$NON-NLS-1$ >+ public static final String DOCPP_MULTI_TOKEN= "org.eclipse.cdt.internal.ui.text.doctools.doxygen.multi"; //$NON-NLS-1$ >+ >+ public static GenericDocTag[] getDocPPTags() { >+ 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<values.length; i+=2) { >+ temp.add(new GenericDocTag(values[i], values[i+1])); >+ } >+ tags= (GenericDocTag[]) temp.toArray(new GenericDocTag[temp.size()]); >+ } catch(IOException ioe) { >+ >+ } >+ >+ } >+ return tags; >+ } >+} >Index: schema/DocCommentOwner.exsd >=================================================================== >RCS file: schema/DocCommentOwner.exsd >diff -N schema/DocCommentOwner.exsd >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ schema/DocCommentOwner.exsd 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,124 @@ >+<?xml version='1.0' encoding='UTF-8'?> >+<!-- Schema file written by PDE --> >+<schema targetNamespace="org.eclipse.cdt.ui"> >+<annotation> >+ <appInfo> >+ <meta.schema plugin="org.eclipse.cdt.ui" id="DocCommentOwner" name="DocCommentOwner"/> >+ </appInfo> >+ <documentation> >+ [Enter description of this extension point.] >+ </documentation> >+ </annotation> >+ >+ <element name="extension"> >+ <complexType> >+ <choice> >+ <element ref="owner"/> >+ </choice> >+ <attribute name="point" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="id" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <element name="owner"> >+ <complexType> >+ <attribute name="id" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ </annotation> >+ </attribute> >+ <attribute name="name" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute translatable="true"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="multiline" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn=":org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ <attribute name="singleline" type="string" use="required"> >+ <annotation> >+ <documentation> >+ >+ </documentation> >+ <appInfo> >+ <meta.attribute kind="java" basedOn=":org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration"/> >+ </appInfo> >+ </annotation> >+ </attribute> >+ </complexType> >+ </element> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="since"/> >+ </appInfo> >+ <documentation> >+ 5.0 >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="examples"/> >+ </appInfo> >+ <documentation> >+ [Enter extension point usage example here.] >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="apiInfo"/> >+ </appInfo> >+ <documentation> >+ [Enter API information here.] >+ </documentation> >+ </annotation> >+ >+ <annotation> >+ <appInfo> >+ <meta.section type="implementation"/> >+ </appInfo> >+ <documentation> >+ [Enter information about supplied implementation of this extension point.] >+ </documentation> >+ </annotation> >+ >+ >+</schema> >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<tags.length; j++) { >+ fTags[j]= tags[j].getTagName(); >+ } >+ } >+ >+ /** >+ * >+ */ >+ public String[] getAdditionalWords() { >+ return fTags; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/messages.properties >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/messages.properties >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/messages.properties >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/messages.properties 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,5 @@ >+EditorReopener_ReopenJobComplete=Re-initializing editors complete >+EditorReopener_ReopenJobStart=Re-initializing editors >+EditorReopener_ShouldSave_Message=To react to this change, its necessary to reinitialize some unsaved editors. If you continue they will be saved automatically and reopened. Continue? >+EditorReopener_ShouldSave_Title=Unsaved editors need reopening >+NullDocCommentOwner_Name=None >Index: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSpellDictionary.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSpellDictionary.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSpellDictionary.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentSpellDictionary.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,56 @@ >+/******************************************************************************* >+ * 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 java.net.URL; >+ >+import org.eclipse.core.runtime.Assert; >+ >+import org.eclipse.cdt.ui.text.doctools.IDocCommentSimpleDictionary; >+ >+import org.eclipse.cdt.internal.ui.text.spelling.engine.AbstractSpellDictionary; >+import org.eclipse.cdt.internal.ui.text.spelling.engine.ISpellDictionary; >+ >+/** >+ * Adapter from interim public {@link IDocCommentSimpleDictionary} to internal {@link ISpellDictionary} >+ */ >+public class DocCommentSpellDictionary extends AbstractSpellDictionary { >+ >+ protected IDocCommentSimpleDictionary fDict; >+ >+ /** >+ * @param dict >+ */ >+ public DocCommentSpellDictionary(IDocCommentSimpleDictionary dict) { >+ Assert.isNotNull(dict); >+ fDict= dict; >+ } >+ >+ /* >+ * @see org.eclipse.cdt.internal.ui.text.spelling.engine.AbstractSpellDictionary#getName() >+ */ >+ protected final URL getURL() { >+ return null; >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.spelling.engine.AbstractSpellDictionary#load(java.net.URL) >+ */ >+ protected synchronized boolean load(final URL url) { >+ unload(); >+ >+ String[] words= fDict.getAdditionalWords(); >+ for(int i=0; i<words.length; i++) >+ hashWord(words[i]); >+ >+ return false; >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentViewerConfiguration.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentViewerConfiguration.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentViewerConfiguration.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/NullDocCommentViewerConfiguration.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,52 @@ >+/******************************************************************************* >+ * 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.jface.text.IAutoEditStrategy; >+import org.eclipse.jface.text.IDocument; >+import org.eclipse.jface.text.ITextDoubleClickStrategy; >+ >+import org.eclipse.cdt.ui.text.ICTokenScanner; >+import org.eclipse.cdt.ui.text.ITokenStoreFactory; >+import org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentDictionary; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; >+ >+public class NullDocCommentViewerConfiguration implements IDocCommentViewerConfiguration { >+ public static final IDocCommentViewerConfiguration INSTANCE= new NullDocCommentViewerConfiguration(); >+ >+ public NullDocCommentViewerConfiguration() { >+ } >+ >+ public IAutoEditStrategy createAutoEditStrategy() { >+ return null; >+ } >+ >+ public ICTokenScanner createCommentScanner(ITokenStoreFactory tokenStoreFactory) { >+ return null; >+ } >+ >+ public ITextDoubleClickStrategy createDoubleClickStrategy() { >+ return null; >+ } >+ >+ public ICompletionProposalComputer createProposalComputer() { >+ return null; >+ } >+ >+ public boolean isDocumentationComment(IDocument doc, int offset, int length) { >+ return false; >+ } >+ >+ public IDocCommentDictionary getSpellingDictionary() { >+ return null; >+ } >+} >Index: src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java >diff -N src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerBlock.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,115 @@ >+/******************************************************************************* >+ * 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.core.resources.IProject; >+import org.eclipse.core.runtime.CoreException; >+import org.eclipse.core.runtime.IProgressMonitor; >+import org.eclipse.jface.layout.GridDataFactory; >+import org.eclipse.swt.SWT; >+import org.eclipse.swt.events.SelectionAdapter; >+import org.eclipse.swt.events.SelectionEvent; >+import org.eclipse.swt.layout.GridData; >+import org.eclipse.swt.layout.GridLayout; >+import org.eclipse.swt.widgets.Button; >+import org.eclipse.swt.widgets.Composite; >+import org.eclipse.swt.widgets.Link; >+import org.eclipse.ui.dialogs.PreferencesUtil; >+ >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; >+import org.eclipse.cdt.utils.ui.controls.ControlFactory; >+ >+import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; >+ >+/** >+ * Project property page for setting documentation comment owner. >+ */ >+public class DocCommentOwnerBlock extends AbstractCOptionPage { >+ private static String EDITOR_PREF_PAGE_ID= "org.eclipse.cdt.ui.preferences.CEditorPreferencePage"; //$NON-NLS-1$ >+ DocCommentOwnerComposite fDocComboComposite; >+ DocCommentOwnerManager fManager; >+ >+ Button fCheckbox; >+ Link fLink; >+ >+ public DocCommentOwnerBlock() { >+ fManager= DocCommentOwnerManager.getInstance(); >+ } >+ >+ void handleCheckBox() { >+ fDocComboComposite.setEnabled(fCheckbox.getSelection()); >+ fLink.setVisible(!fCheckbox.getSelection()); >+ } >+ >+ public void createControl(final Composite parent) { >+ Composite pane= new Composite(parent, SWT.NONE); >+ pane.setLayout(new GridLayout(2, true)); >+ pane.setLayoutData(GridDataFactory.fillDefaults().grab(true,false).span(2, 1).create()); >+ >+ setControl(pane); >+ >+ fCheckbox= ControlFactory.createCheckBox(pane, DialogsMessages.DocCommentOwnerBlock_EnableProjectSpecificSettings); >+ fCheckbox.setLayoutData(GridDataFactory.fillDefaults().grab(true,false).create()); >+ fCheckbox.addSelectionListener(new SelectionAdapter(){ >+ public void widgetSelected(SelectionEvent e) { >+ handleCheckBox(); >+ } >+ }); >+ >+ fLink= new Link(pane, SWT.NONE); >+ fLink.setText(DialogsMessages.PreferenceScopeBlock_preferenceLink); >+ fLink.setLayoutData(GridDataFactory.fillDefaults().align(GridData.CENTER, GridData.BEGINNING).grab(true,false).create()); >+ fLink.addSelectionListener(new SelectionAdapter() { >+ public void widgetSelected(SelectionEvent e) { >+ PreferencesUtil.createPreferenceDialogOn(parent.getShell(), EDITOR_PREF_PAGE_ID, null, null).open(); >+ } >+ }); >+ >+ String dsc= DialogsMessages.DocCommentOwnerBlock_SelectDocToolDescription; >+ String msg= DialogsMessages.DocCommentOwnerBlock_DocToolLabel; >+ >+ IDocCommentOwner prjOwner= DocCommentOwnerManager.getInstance().getCommentOwner(getProject()); >+ fDocComboComposite= new DocCommentOwnerComposite(pane, prjOwner, dsc, msg); >+ fDocComboComposite.setLayoutData(GridDataFactory.fillDefaults().grab(true,false).span(2, 1).create()); >+ >+ fCheckbox.setSelection(fManager.projectDefinesOwnership(getProject())); >+ handleCheckBox(); >+ } >+ >+ public void performApply(IProgressMonitor monitor) throws CoreException { >+ if(!fCheckbox.getSelection()) >+ fManager.setCommentOwner(getProject(), null, true); >+ else { >+ IDocCommentOwner newOwner= fDocComboComposite.getSelectedDocCommentOwner(); >+ IProject p= getProject(); >+ fManager.setCommentOwner(p, newOwner, true); >+ } >+ } >+ >+ public IProject getProject() { >+ ICOptionContainer container = getContainer(); >+ if (container != null){ >+ if (container instanceof ICOptionContainerExtension) { >+ try { >+ return ((ICOptionContainerExtension) container).getProjectHandle(); >+ } >+ catch (Exception e) { >+ return null; >+ } >+ } >+ return container.getProject(); >+ } >+ return null; >+ } >+ >+ public void performDefaults() { >+ } >+} >Index: src/org/eclipse/cdt/ui/text/doctools/generic/AbstractGenericTagDocCommentViewerConfiguration.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/text/doctools/generic/AbstractGenericTagDocCommentViewerConfiguration.java >diff -N src/org/eclipse/cdt/ui/text/doctools/generic/AbstractGenericTagDocCommentViewerConfiguration.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/text/doctools/generic/AbstractGenericTagDocCommentViewerConfiguration.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,79 @@ >+/******************************************************************************* >+ * 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.jface.text.ITextDoubleClickStrategy; >+ >+import org.eclipse.cdt.ui.text.ICTokenScanner; >+import org.eclipse.cdt.ui.text.ITokenStoreFactory; >+import org.eclipse.cdt.ui.text.contentassist.ICompletionProposalComputer; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentDictionary; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentSimpleDictionary; >+import org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration; >+ >+/** >+ * An abstract base-class for documentation tool contributions using the 'generic tag' framework >+ */ >+public abstract class AbstractGenericTagDocCommentViewerConfiguration implements IDocCommentViewerConfiguration { >+ protected GenericDocTag[] fTags; >+ protected char[] fTagMarkers; >+ >+ protected ITextDoubleClickStrategy fDCStrategy; >+ protected ICompletionProposalComputer fCPComputer; >+ protected String fDefaultToken; >+ protected String fTagToken; >+ protected IDocCommentSimpleDictionary fDictionary; >+ >+ /** >+ * >+ * @param tags a non-null array of tags this configuration should recognize >+ * @param tagMarkers a non-null array of characters used to prefix the tags (e.g. @ or \) >+ * @param defaultToken the default scanner token id >+ * @param tagToken the scanner token to use to mark used by this configuration >+ */ >+ public AbstractGenericTagDocCommentViewerConfiguration(GenericDocTag[] tags, char[] tagMarkers, String defaultToken, String tagToken) { >+ fTags= tags; >+ fTagMarkers= tagMarkers; >+ fDCStrategy= new GenericTagDoubleClickStrategy(tagMarkers); >+ fCPComputer= new GenericTagCompletionProposalComputer(fTags); >+ fDefaultToken= defaultToken; >+ fTagToken= tagToken; >+ fDictionary= new GenericTagSimpleDictionary(fTagMarkers, fTags); >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration#createCommentScanner(org.eclipse.cdt.ui.text.ITokenStoreFactory, java.lang.String) >+ */ >+ public ICTokenScanner createCommentScanner(ITokenStoreFactory tokenStoreFactory) { >+ return new GenericTagCommentScanner(tokenStoreFactory, fDefaultToken, fTagToken, fTags, fTagMarkers); >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration#createDoubleClickStrategy() >+ */ >+ public ITextDoubleClickStrategy createDoubleClickStrategy() { >+ return fDCStrategy; >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration#createProposalComputer() >+ */ >+ public ICompletionProposalComputer createProposalComputer() { >+ return fCPComputer; >+ } >+ >+ /* >+ * @see org.eclipse.cdt.ui.text.doctools.IDocCommentViewerConfiguration#getSpellingDictionary() >+ */ >+ public IDocCommentDictionary getSpellingDictionary() { >+ return fDictionary; >+ } >+} >Index: src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java >=================================================================== >RCS file: src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java >diff -N src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/ui/dialogs/DocCommentOwnerCombo.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,83 @@ >+/******************************************************************************* >+ * 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 java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.swt.layout.GridLayout; >+import org.eclipse.swt.widgets.Combo; >+import org.eclipse.swt.widgets.Composite; >+ >+import org.eclipse.cdt.ui.text.doctools.IDocCommentOwner; >+import org.eclipse.cdt.utils.ui.controls.ControlFactory; >+ >+import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; >+import org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentOwner; >+ >+/** >+ * Manages the population and selection of the doc-comment {@link Combo} box >+ */ >+public class DocCommentOwnerCombo extends Composite { >+ protected Combo fCombo; >+ protected IDocCommentOwner fOwners[], fInitialOwner; >+ >+ public DocCommentOwnerCombo(Composite parent, int style, IDocCommentOwner initialOwner) { >+ super(parent, style); >+ setLayout(new GridLayout()); >+ fInitialOwner= initialOwner; >+ fOwners= getNontestOwners(); >+ createControl(this); >+ } >+ >+ public IDocCommentOwner getSelectedDocCommentOwner() { >+ int index= fCombo.getSelectionIndex(); >+ return index == 0 ? NullDocCommentOwner.INSTANCE : fOwners[index-1]; >+ } >+ >+ /** >+ * @return the list of registered doc-comment owners, filtering out those from the >+ * test plug-in. >+ */ >+ private static IDocCommentOwner[] getNontestOwners() { >+ IDocCommentOwner[] prefilter= DocCommentOwnerManager.getInstance().getRegisteredOwners(); >+ List result= new ArrayList(); >+ for(int i=0; i<prefilter.length; i++) { >+ if(prefilter[i].getID().indexOf(".test.")==-1) //$NON-NLS-1$ >+ result.add(prefilter[i]); >+ } >+ return (IDocCommentOwner[]) result.toArray(new IDocCommentOwner[result.size()]); >+ } >+ >+ public void createControl(Composite parent) { >+ String[] items= new String[fOwners.length+1]; >+ items[0]= DialogsMessages.DocCommentOwnerCombo_None; >+ for(int i=0; i<fOwners.length; i++) { >+ items[i+1]= fOwners[i].getName(); >+ } >+ fCombo = ControlFactory.createSelectCombo(parent, items, DialogsMessages.DocCommentOwnerCombo_None); >+ selectInCombo(fInitialOwner); >+ } >+ >+ public void selectInCombo(IDocCommentOwner owner) { >+ for(int i=0; i<fOwners.length; i++) { >+ if(fOwners[i].getID().equals(owner.getID())) { >+ fCombo.select(i+1); >+ return; >+ } >+ } >+ fCombo.select(0); >+ } >+ >+ public void setEnabled(boolean enabled) { >+ fCombo.setEnabled(enabled); >+ } >+} >Index: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentMultilineProposalComputer.java >=================================================================== >RCS file: src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentMultilineProposalComputer.java >diff -N src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentMultilineProposalComputer.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/cdt/internal/ui/text/doctools/DocCommentMultilineProposalComputer.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 DocCommentMultilineProposalComputer extends AbstractDocCommentProposalComputer { >+ protected IDocCommentViewerConfiguration getConfiguration(IDocCommentOwner owner) { >+ return owner.getMultilineConfiguration(); >+ } >+} >#P org.eclipse.core.filebuffers >Index: src/org/eclipse/core/internal/filebuffers/TextFileBufferManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.core.filebuffers/src/org/eclipse/core/internal/filebuffers/TextFileBufferManager.java,v >retrieving revision 1.45 >diff -u -r1.45 TextFileBufferManager.java >--- src/org/eclipse/core/internal/filebuffers/TextFileBufferManager.java 22 Feb 2007 15:25:10 -0000 1.45 >+++ src/org/eclipse/core/internal/filebuffers/TextFileBufferManager.java 23 Jan 2008 15:41:46 -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.internal.filebuffers; > >@@ -18,11 +19,21 @@ > import java.util.List; > import java.util.Map; > >+import org.eclipse.core.filebuffers.IAnnotationModelFactory; >+import org.eclipse.core.filebuffers.IDocumentFactory; >+import org.eclipse.core.filebuffers.IDocumentSetupParticipant; >+import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; >+import org.eclipse.core.filebuffers.IFileBuffer; >+import org.eclipse.core.filebuffers.IFileBufferListener; >+import org.eclipse.core.filebuffers.IFileBufferStatusCodes; >+import org.eclipse.core.filebuffers.ISynchronizationContext; >+import org.eclipse.core.filebuffers.ITextFileBuffer; >+import org.eclipse.core.filebuffers.ITextFileBufferManager; >+import org.eclipse.core.filebuffers.LocationKind; > import org.eclipse.core.filesystem.EFS; > import org.eclipse.core.filesystem.IFileInfo; > import org.eclipse.core.filesystem.IFileStore; > import org.eclipse.core.filesystem.URIUtil; >- > import org.eclipse.core.runtime.Assert; > import org.eclipse.core.runtime.CoreException; > import org.eclipse.core.runtime.IPath; >@@ -35,18 +46,6 @@ > import org.eclipse.core.runtime.content.IContentDescription; > import org.eclipse.core.runtime.content.IContentType; > import org.eclipse.core.runtime.content.IContentTypeManager; >- >-import org.eclipse.core.filebuffers.IAnnotationModelFactory; >-import org.eclipse.core.filebuffers.IDocumentFactory; >-import org.eclipse.core.filebuffers.IDocumentSetupParticipant; >-import org.eclipse.core.filebuffers.IFileBuffer; >-import org.eclipse.core.filebuffers.IFileBufferListener; >-import org.eclipse.core.filebuffers.IFileBufferStatusCodes; >-import org.eclipse.core.filebuffers.ISynchronizationContext; >-import org.eclipse.core.filebuffers.ITextFileBuffer; >-import org.eclipse.core.filebuffers.ITextFileBufferManager; >-import org.eclipse.core.filebuffers.LocationKind; >- > import org.eclipse.jface.text.IDocument; > import org.eclipse.jface.text.IDocumentExtension4; > import org.eclipse.jface.text.source.IAnnotationModel; >@@ -432,7 +431,7 @@ > * @see org.eclipse.core.filebuffers.ITextFileBufferManager#createEmptyDocument(org.eclipse.core.runtime.IPath, org.eclipse.core.filebuffers.LocationKind) > * @since 3.3 > */ >- public IDocument createEmptyDocument(IPath location, LocationKind locationKind) { >+ public IDocument createEmptyDocument(final IPath location, final LocationKind locationKind) { > final IDocument[] runnableResult= new IDocument[1]; > if (location != null) { > final IDocumentFactory factory= fRegistry.getDocumentFactory(location, locationKind); >@@ -473,7 +472,12 @@ > final IDocumentSetupParticipant participant= participants[i]; > ISafeRunnable runnable= new ISafeRunnable() { > public void run() throws Exception { >- participant.setup(document); >+ if(participant instanceof IDocumentSetupParticipantExtension) { >+ IDocumentSetupParticipantExtension extParticipant= (IDocumentSetupParticipantExtension) participant; >+ extParticipant.setup(document, location, locationKind); >+ } else { >+ participant.setup(document); >+ } > if (document.getDocumentPartitioner() != null) { > String message= NLSUtility.format(FileBuffersMessages.TextFileBufferManager_warning_documentSetupInstallsDefaultPartitioner, participant.getClass()); > IStatus status= new Status(IStatus.WARNING, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, message, null); >Index: src/org/eclipse/core/internal/filebuffers/ResourceTextFileBufferManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.core.filebuffers/src/org/eclipse/core/internal/filebuffers/ResourceTextFileBufferManager.java,v >retrieving revision 1.2 >diff -u -r1.2 ResourceTextFileBufferManager.java >--- src/org/eclipse/core/internal/filebuffers/ResourceTextFileBufferManager.java 20 Feb 2007 12:40:25 -0000 1.2 >+++ src/org/eclipse/core/internal/filebuffers/ResourceTextFileBufferManager.java 23 Jan 2008 15:41:45 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007 IBM Corporation and others. >+ * Copyright (c) 2007, 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,11 +7,27 @@ > * > * Contributors: > * IBM Corporation - initial API and implementation >+ * Andrew Ferguson (Symbian) > *******************************************************************************/ > package org.eclipse.core.internal.filebuffers; > > import java.util.ArrayList; > >+import org.eclipse.core.filebuffers.FileBuffers; >+import org.eclipse.core.filebuffers.IAnnotationModelFactory; >+import org.eclipse.core.filebuffers.IDocumentFactory; >+import org.eclipse.core.filebuffers.IDocumentSetupParticipant; >+import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; >+import org.eclipse.core.filebuffers.IFileBuffer; >+import org.eclipse.core.filebuffers.IStateValidationSupport; >+import org.eclipse.core.filebuffers.LocationKind; >+import org.eclipse.core.resources.IFile; >+import org.eclipse.core.resources.IResource; >+import org.eclipse.core.resources.IResourceRuleFactory; >+import org.eclipse.core.resources.IWorkspace; >+import org.eclipse.core.resources.IWorkspaceRunnable; >+import org.eclipse.core.resources.ProjectScope; >+import org.eclipse.core.resources.ResourcesPlugin; > import org.eclipse.core.runtime.Assert; > import org.eclipse.core.runtime.CoreException; > import org.eclipse.core.runtime.IPath; >@@ -27,23 +43,6 @@ > import org.eclipse.core.runtime.jobs.ISchedulingRule; > import org.eclipse.core.runtime.preferences.IScopeContext; > import org.eclipse.core.runtime.preferences.InstanceScope; >- >-import org.eclipse.core.resources.IFile; >-import org.eclipse.core.resources.IResource; >-import org.eclipse.core.resources.IResourceRuleFactory; >-import org.eclipse.core.resources.IWorkspace; >-import org.eclipse.core.resources.IWorkspaceRunnable; >-import org.eclipse.core.resources.ProjectScope; >-import org.eclipse.core.resources.ResourcesPlugin; >- >-import org.eclipse.core.filebuffers.FileBuffers; >-import org.eclipse.core.filebuffers.IAnnotationModelFactory; >-import org.eclipse.core.filebuffers.IDocumentFactory; >-import org.eclipse.core.filebuffers.IDocumentSetupParticipant; >-import org.eclipse.core.filebuffers.IFileBuffer; >-import org.eclipse.core.filebuffers.IStateValidationSupport; >-import org.eclipse.core.filebuffers.LocationKind; >- > import org.eclipse.jface.text.IDocument; > import org.eclipse.jface.text.IDocumentExtension4; > import org.eclipse.jface.text.source.IAnnotationModel; >@@ -125,7 +124,7 @@ > return null; > } > >- IDocument createEmptyDocument(IFile file) { >+ public IDocument createEmptyDocument(final IFile file) { > final IDocument[] runnableResult= new IDocument[1]; > final IDocumentFactory factory= ((ResourceExtensionRegistry)fRegistry).getDocumentFactory(file); > if (factory != null) { >@@ -162,7 +161,13 @@ > final IDocumentSetupParticipant participant= participants[i]; > ISafeRunnable runnable= new ISafeRunnable() { > public void run() throws Exception { >- participant.setup(document); >+ if(participant instanceof IDocumentSetupParticipantExtension) { >+ IDocumentSetupParticipantExtension ext= (IDocumentSetupParticipantExtension) participant; >+ IPath path= file == null ? null : file.getFullPath(); >+ ext.setup(document, path, LocationKind.IFILE); >+ } else { >+ participant.setup(document); >+ } > if (document.getDocumentPartitioner() != null) { > String message= NLSUtility.format(FileBuffersMessages.TextFileBufferManager_warning_documentSetupInstallsDefaultPartitioner, participant.getClass()); > IStatus status= new Status(IStatus.WARNING, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, message, null); >Index: src/org/eclipse/core/filebuffers/IDocumentSetupParticipant.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.core.filebuffers/src/org/eclipse/core/filebuffers/IDocumentSetupParticipant.java,v >retrieving revision 1.12 >diff -u -r1.12 IDocumentSetupParticipant.java >--- src/org/eclipse/core/filebuffers/IDocumentSetupParticipant.java 28 Mar 2006 16:28:56 -0000 1.12 >+++ src/org/eclipse/core/filebuffers/IDocumentSetupParticipant.java 23 Jan 2008 15:41:45 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2000, 2006 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 >@@ -29,6 +29,7 @@ > * > * @since 3.0 > * @see org.eclipse.jface.text.IDocumentExtension3 >+ * @see org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension > */ > public interface IDocumentSetupParticipant { > >Index: src/org/eclipse/core/filebuffers/IDocumentSetupParticipantExtension.java >=================================================================== >RCS file: src/org/eclipse/core/filebuffers/IDocumentSetupParticipantExtension.java >diff -N src/org/eclipse/core/filebuffers/IDocumentSetupParticipantExtension.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/org/eclipse/core/filebuffers/IDocumentSetupParticipantExtension.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,38 @@ >+/******************************************************************************* >+ * 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; >+ >+import org.eclipse.core.runtime.IPath; >+import org.eclipse.jface.text.IDocument; >+ >+/** >+ * Extension interface for {@link org.eclipse.core.filebuffers.IDocumentSetupParticipant}.<p> >+ * >+ * 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.<p> >+ * >+ * 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 @@ > <perspectiveExtension > targetID="org.eclipse.ui.resourcePerspective"> > <view >+ id="org.eclipse.cdt.ui.tests.DOMAST.DOMAST" > ratio="0.5" >- relative="org.eclipse.ui.views.TaskList" > relationship="right" >- id="org.eclipse.cdt.ui.tests.DOMAST.DOMAST"> >+ relative="org.eclipse.ui.views.TaskList"> > </view> > </perspectiveExtension> > </extension> >@@ -115,5 +115,87 @@ > projectType="org.eclipse.cdt.build.core.buildArtefactType.exe"> > </template> > </extension> >- >+ >+ >+ <!-- documentation tool comment test owners --> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner id="org.cdt.test.DCOM1" >+ name="Test comment owner1" >+ singleline="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentViewerConfiguration" >+ multiline="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentViewerConfiguration" >+ /> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner id="org.cdt.test.DCOM2" >+ name="Test comment owner1" >+ singleline="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentViewerConfiguration" >+ multiline="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentViewerConfiguration" >+ /> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.DCOM3" >+ multiline="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentViewerConfiguration" >+ name="Test comment owner1" >+ singleline="org.eclipse.cdt.internal.ui.text.doctools.NullDocCommentViewerConfiguration"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.ownerA" >+ multiline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$A" >+ name="name_A" >+ singleline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$A"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.ownerB" >+ multiline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$B" >+ name="name_B" >+ singleline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$B"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.ownerC" >+ multiline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$C" >+ name="name_C" >+ singleline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$C"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.ownerABC" >+ multiline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$ABC" >+ name="name_ABC" >+ singleline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$ABC"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.ownerBDFG" >+ multiline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$BDFG" >+ name="name_BDFG" >+ singleline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$BDFG"> >+ </owner> >+ </extension> >+ <extension >+ point="org.eclipse.cdt.ui.DocCommentOwner"> >+ <owner >+ id="org.cdt.test.ownerPUNC" >+ multiline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$PUNC" >+ name="name_PUNC" >+ singleline="org.eclipse.cdt.ui.tests.text.doctools.TestGenericTagConfiguration$PUNC"> >+ </owner> >+ </extension> >+ > </plugin> >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<tagNames.length; i++) { >+ tags[i]= new GenericDocTag(tagNames[i], "no description"); >+ } >+ return tags; >+ } >+ >+ public boolean isDocumentationComment(IDocument doc, int offset, int length) { >+ try { >+ if(offset+2 < doc.getLength()) { >+ char c= doc.getChar(offset+2); >+ for(int i=0; i<fCommentMarkers.length; i++) >+ if(c == fCommentMarkers[i]) >+ return true; >+ return false; >+ } >+ } catch(BadLocationException ble) { >+ CUIPlugin.getDefault().log(ble); >+ } >+ return false; >+ } >+ >+ public static class A extends TestGenericTagConfiguration { >+ public A() {super("A", "", "@", "test.token.A.default", "test.token.A.tag");} >+ } >+ >+ public static class B extends TestGenericTagConfiguration { >+ public B() {super("B", "", "@", "test.token.B.default", "test.token.B.tag");} >+ } >+ >+ public static class C extends TestGenericTagConfiguration { >+ public C() {super("C", "", "@", "test.token.C.default", "test.token.C.tag");} >+ } >+ >+ public static class ABC extends TestGenericTagConfiguration { >+ public ABC() {super("ABC", "", "@", "test.token.ABC.default", "test.token.ABC.tag");} >+ } >+ >+ public static class BDFG extends TestGenericTagConfiguration { >+ public BDFG() {super("BDFG", "", "@", "test.token.BDFG.default", "test.token.BDFG.tag");} >+ } >+ >+ public static class PUNC extends TestGenericTagConfiguration { >+ public PUNC() {super("!*#", "", "@", "test.token.BDFG.default", "test.token.BDFG.tag");} >+ } >+} >Index: ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentHighlightingTest.java >=================================================================== >RCS file: ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentHighlightingTest.java >diff -N ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentHighlightingTest.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ ui/org/eclipse/cdt/ui/tests/text/doctools/DocCommentHighlightingTest.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,191 @@ >+/******************************************************************************* >+ * 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 java.util.ArrayList; >+import java.util.List; >+ >+import junit.framework.Assert; >+import junit.framework.Test; >+import junit.framework.TestSuite; >+ >+import org.eclipse.jface.text.BadLocationException; >+import org.eclipse.jface.text.Position; >+import org.eclipse.jface.text.TextViewer; >+import org.eclipse.jface.text.source.ISourceViewer; >+import org.eclipse.jface.text.source.SourceViewer; >+import org.eclipse.swt.custom.StyleRange; >+import org.eclipse.swt.custom.StyledText; >+import org.eclipse.swt.graphics.RGB; >+import org.eclipse.ui.IEditorPart; >+import org.eclipse.ui.IEditorReference; >+import org.eclipse.ui.IWorkbenchWindow; >+import org.eclipse.ui.PlatformUI; >+import org.eclipse.ui.texteditor.AbstractTextEditor; >+ >+import org.eclipse.cdt.core.model.ICProject; >+import org.eclipse.cdt.core.testplugin.CProjectHelper; >+import org.eclipse.cdt.ui.tests.BaseUITestCase; >+import org.eclipse.cdt.ui.tests.text.Accessor; >+import org.eclipse.cdt.ui.tests.text.EditorTestHelper; >+import org.eclipse.cdt.ui.tests.text.ResourceTestHelper; >+ >+import org.eclipse.cdt.internal.ui.editor.CEditor; >+import org.eclipse.cdt.internal.ui.text.doctools.DocCommentOwnerManager; >+ >+/** >+ * >+ * @author andrewferguson >+ */ >+public class DocCommentHighlightingTest extends BaseUITestCase { >+ private static final DocCommentOwnerManager DCMAN= DocCommentOwnerManager.getInstance(); >+ private static final String LINKED_FOLDER= "resources/docComments"; >+ private static final String PROJECT= "DocCommentTests"; >+ >+ // ordered by occurrence >+ private static final int[] normal0= {114, 13}; >+ private static final int[] comment1= {129, 18}; >+ private static final int[] comment2= {149, 17}; >+ private static final int[] comment3= {168, 16}; >+ private static final int[] comment4= {184, 18}; >+ private static final int[] comment5= {204, 19}; >+ private static final int[] comment6= {223, 16}; >+ private static final int[] comment7= {241, 17}; >+ private static final int[] comment8= {258, 16}; >+ private static final int[] comment9= {274, 17}; >+ private static final int[] comment10= {293, 18}; >+ private static final int[] snormal0= {315, 13}; >+ private static final int[] scomment1= {328, 17}; >+ private static final int[] scomment2= {345, 16}; >+ private static final int[] scomment3= {361, 17}; >+ private static final int[] scomment4= {378, 16}; >+ private static final int[] scomment5= {394, 18}; >+ private static final int[] comment11= {414, 18}; >+ private static final int[] scomment6= {433, 16}; >+ private static final int[] comment12= {449, 19}; >+ private static final int[] scomment7= {469, 17}; >+ >+ >+ private ICProject fCProject; >+ private final String fTestFilename= "/"+PROJECT+"/src/this.cpp"; >+ >+ private static SourceViewer fSourceViewer; >+ >+ public static Test suite() { >+ return new TestSuite(DocCommentHighlightingTest.class); >+ } >+ >+ public DocCommentHighlightingTest(String name) { >+ super(name); >+ } >+ >+ protected void setUp() throws Exception { >+ super.setUp(); >+ fCProject= EditorTestHelper.createCProject(PROJECT, LINKED_FOLDER); >+ >+ AbstractTextEditor fEditor= (CEditor) EditorTestHelper.openInEditor(ResourceTestHelper.findFile(fTestFilename), true); >+ fSourceViewer= EditorTestHelper.getSourceViewer(fEditor); >+ assertTrue(EditorTestHelper.joinReconciler(fSourceViewer, 0, 10000, 100)); >+ } >+ >+ protected void tearDown () throws Exception { >+ EditorTestHelper.closeAllEditors(); >+ >+ if (fCProject != null) >+ CProjectHelper.delete(fCProject); >+ >+ super.tearDown(); >+ } >+ >+ protected List/*<Position>*/ 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<rgs.length; i++) { >+ if(rgs[i].foreground != null && rgs[i].foreground.getRGB().equals(rgb)) { >+ System.out.println(rgs[i].start +", "+ rgs[i].length); >+ result.add(new Position(rgs[i].start, rgs[i].length)); >+ } >+ } >+ return result; >+ } >+ >+ protected IEditorPart get(){ >+ IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow(); >+ if(window!=null) { >+ if(window.getActivePage()!=null) { >+ IEditorReference[] es= window.getActivePage().getEditorReferences(); >+ for(int i=0; i<es.length; i++) { >+ IEditorPart part= es[i].getEditor(false); >+ if(part != null) >+ return part; >+ } >+ } >+ } >+ return null; >+ } >+ >+ private List/*<Position>*/ mkPositions(int[][] raw) { >+ List result= new ArrayList(); >+ for(int i=0; i<raw.length; i++) { >+ Assert.assertEquals(2, raw[i].length); >+ result.add(new Position(raw[i][0], raw[i][1])); >+ } >+ return result; >+ } >+ >+ public void testDCOM_A() throws BadLocationException, InterruptedException { >+ DCMAN.setCommentOwner(fCProject.getProject(), DCMAN.getOwner("org.cdt.test.ownerA"), true); >+ runEventQueue(1000); >+ List/*<Position>*/ 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/*<Position>*/ 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/*<Position>*/ 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/*<Position>*/ 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/*<Position>*/ 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/*<Position>*/ 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 <code>null</code> 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 <code>this</code> 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 >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 208881
:
84301
|
87647
|
87659