diff --git a/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF b/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF index 67bb08fb6ca..31d4aeefd56 100644 --- a/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF +++ b/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF @@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: CDT Qt Support Core Bundle-SymbolicName: org.eclipse.cdt.qt.core;singleton:=true Bundle-Version: 1.0.0.qualifier -Bundle-Activator: org.eclipse.cdt.qt.core.Activator +Bundle-Activator: org.eclipse.cdt.qt.core.QtPlugin Bundle-Vendor: Eclipse CDT Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.resources, diff --git a/qt/org.eclipse.cdt.qt.core/plugin.xml b/qt/org.eclipse.cdt.qt.core/plugin.xml index 959e78450a5..d31e961af1d 100644 --- a/qt/org.eclipse.cdt.qt.core/plugin.xml +++ b/qt/org.eclipse.cdt.qt.core/plugin.xml @@ -50,4 +50,20 @@ + + + + + + + + + + + diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/Activator.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/Activator.java deleted file mode 100644 index 2e3a4ecd3a4..00000000000 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/Activator.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.eclipse.cdt.qt.core; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -public class Activator implements BundleActivator { - - private static BundleContext context; - - static BundleContext getContext() { - return context; - } - - /* - * (non-Javadoc) - * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) - */ - public void start(BundleContext bundleContext) throws Exception { - Activator.context = bundleContext; - } - - /* - * (non-Javadoc) - * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) - */ - public void stop(BundleContext bundleContext) throws Exception { - Activator.context = null; - } - -} diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtKeywords.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtKeywords.java index 36b2112585d..381655ef025 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtKeywords.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtKeywords.java @@ -17,4 +17,10 @@ public class QtKeywords public static final String Q_SLOTS = "Q_SLOTS"; public static final String SIGNALS = "signals"; public static final String SLOTS = "slots"; + + public static final String SIGNAL = "SIGNAL"; + public static final String SLOT = "SLOT"; + + public static final String QOBJECT = "QObject"; + public static final String CONNECT = "connect"; } diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java new file mode 100644 index 00000000000..825b5614cc7 --- /dev/null +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtPlugin.java @@ -0,0 +1,38 @@ +package org.eclipse.cdt.qt.core; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +public class QtPlugin implements BundleActivator { + + public static final String ID = "org.eclipse.cdt.qt.core"; + public static final String SIGNAL_SLOT_TAGGER_ID = ID + ".signalslot.tagger"; + + public static final int SignalSlot_Mask_signal = 1; + public static final int SignalSlot_Mask_slot = 2; + + private static BundleContext context; + + static BundleContext getContext() { + return context; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext) + */ + @Override + public void start(BundleContext bundleContext) throws Exception { + QtPlugin.context = bundleContext; + } + + /* + * (non-Javadoc) + * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext) + */ + @Override + public void stop(BundleContext bundleContext) throws Exception { + QtPlugin.context = null; + } + +} diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/internal/core/QtSignalSlotTagger.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/internal/core/QtSignalSlotTagger.java new file mode 100644 index 00000000000..a82b3c15547 --- /dev/null +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/internal/core/QtSignalSlotTagger.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2013 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 + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.eclipse.cdt.qt.internal.core; + +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; +import org.eclipse.cdt.core.dom.ast.IASTMacroExpansionLocation; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; +import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroExpansion; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.tag.IBindingTagger; +import org.eclipse.cdt.core.dom.ast.tag.ITag; +import org.eclipse.cdt.core.dom.ast.tag.ITagWriter; +import org.eclipse.cdt.core.dom.ast.tag.IWritableTag; +import org.eclipse.cdt.qt.core.QtKeywords; +import org.eclipse.cdt.qt.core.QtPlugin; + +public class QtSignalSlotTagger implements IBindingTagger +{ + private static ICPPASTVisibilityLabel findVisibilityLabel( ICPPMethod method, IASTNode ast ) + { + // the visibility cannot be found without an ast + if( ast == null ) + return null; + + IASTNode methodDecl = ast; + ICPPASTCompositeTypeSpecifier classType = null; + while( methodDecl != null + && classType == null ) + { + IASTNode parent = methodDecl.getParent(); + if( parent instanceof ICPPASTCompositeTypeSpecifier ) + classType = (ICPPASTCompositeTypeSpecifier)parent; + else + methodDecl = parent; + } + + if( methodDecl == null + || classType == null ) + return null; + + ICPPASTVisibilityLabel lastLabel = null; + for( IASTDeclaration decl : classType.getMembers() ) + { + if( decl instanceof ICPPASTVisibilityLabel ) + lastLabel = (ICPPASTVisibilityLabel)decl; + else if( decl == methodDecl ) + return lastLabel; + } + + return null; + } + + @Override + public ITag process( ITagWriter tagWriter, IBinding binding, IASTName ast ) + { + // only methods a be signals or slots + if( ! ( binding instanceof ICPPMethod ) ) + return null; + + // a visibility label is required in order to decide whether the method is a signal/slot + ICPPMethod method = (ICPPMethod)binding; + ICPPASTVisibilityLabel v = findVisibilityLabel( method, ast ); + if( v == null ) + return null; + + byte bitset = 0; + for( IASTNodeLocation loc : v.getNodeLocations() ) + if( loc instanceof IASTMacroExpansionLocation ) + { + IASTMacroExpansionLocation macroExpansion = (IASTMacroExpansionLocation)loc; + IASTPreprocessorMacroExpansion exp = macroExpansion.getExpansion(); + String macro = exp.getMacroReference().toString(); + + if( QtKeywords.SIGNALS.equals( macro ) || QtKeywords.Q_SIGNALS.equals( macro ) ) + bitset |= QtPlugin.SignalSlot_Mask_signal; + else if( QtKeywords.SLOTS.equals( macro ) || QtKeywords.Q_SLOTS.equals( macro ) ) + bitset |= QtPlugin.SignalSlot_Mask_slot; + } + + if( bitset != 0 ) + { + IWritableTag tag = tagWriter.createTag( QtPlugin.SIGNAL_SLOT_TAGGER_ID, 1 ); + if( tag != null + && tag.putByte( 0, bitset ) ) + return tag; + } + + return null; + } +} diff --git a/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF b/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF index 0e024d23ae1..856b83c6f2a 100644 --- a/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF +++ b/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF @@ -3,13 +3,15 @@ Bundle-ManifestVersion: 2 Bundle-Name: CDT Qt Support UI Bundle-SymbolicName: org.eclipse.cdt.qt.ui;singleton:=true Bundle-Version: 1.0.0.qualifier -Bundle-Activator: org.eclipse.cdt.qt.ui.Activator +Bundle-Activator: org.eclipse.cdt.qt.ui.QtUIPlugin Bundle-Vendor: Eclipse CDT Bundle-Localization: plugin Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.cdt.ui, org.eclipse.cdt.core, - org.eclipse.cdt.qt.core + org.eclipse.cdt.qt.core, + org.eclipse.jface.text, + org.eclipse.core.resources Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy diff --git a/qt/org.eclipse.cdt.qt.ui/plugin.xml b/qt/org.eclipse.cdt.qt.ui/plugin.xml index 7d86d31f7c4..e03dd26e7ab 100644 --- a/qt/org.eclipse.cdt.qt.ui/plugin.xml +++ b/qt/org.eclipse.cdt.qt.ui/plugin.xml @@ -23,4 +23,16 @@ + + + + + + diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/internal/ui/QtCompletionProposalComputer.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/internal/ui/QtCompletionProposalComputer.java new file mode 100644 index 00000000000..733e08857ab --- /dev/null +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/internal/ui/QtCompletionProposalComputer.java @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2013 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 + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.eclipse.cdt.qt.internal.ui; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; +import org.eclipse.cdt.core.dom.ast.IASTCompletionContext; +import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; +import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; +import org.eclipse.cdt.core.dom.ast.IASTIdExpression; +import org.eclipse.cdt.core.dom.ast.IASTInitializerClause; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IPointerType; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; +import org.eclipse.cdt.core.dom.ast.tag.ITag; +import org.eclipse.cdt.core.dom.ast.tag.ITagReader; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; +import org.eclipse.cdt.internal.ui.text.contentassist.CCompletionProposal; +import org.eclipse.cdt.internal.ui.text.contentassist.CContentAssistInvocationContext; +import org.eclipse.cdt.internal.ui.text.contentassist.ParsingBasedProposalComputer; +import org.eclipse.cdt.internal.ui.text.contentassist.RelevanceConstants; +import org.eclipse.cdt.qt.core.QtKeywords; +import org.eclipse.cdt.qt.core.QtNature; +import org.eclipse.cdt.qt.core.QtPlugin; +import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.contentassist.ICompletionProposal; + +@SuppressWarnings( "restriction" ) +public class QtCompletionProposalComputer extends ParsingBasedProposalComputer +{ + private boolean isApplicable( CContentAssistInvocationContext context ) + { + ITranslationUnit tu = context.getTranslationUnit(); + if( tu == null ) + return false; + + ICProject cProject = tu.getCProject(); + if( cProject == null ) + return false; + + IProject project = cProject.getProject(); + if( project == null ) + return false; + + try + { + return project.hasNature( QtNature.ID ); + } + catch( CoreException e ) + { + CUIPlugin.log( e ); + return false; + } + } + + private static boolean is_QObject_connect( CContentAssistInvocationContext context, IASTCompletionContext astContext, IASTName name ) + { + IASTName connectName = name.getLastName(); + if( ! QtKeywords.CONNECT.equals( new String( connectName.getSimpleID() ) ) ) + return false; + + IBinding[] funcBindings = astContext.findBindings( connectName, ! context.isContextInformationStyle() ); + for( IBinding funcBinding : funcBindings ) + if( funcBinding instanceof ICPPFunction ) + { + IBinding ownerBinding = ( (ICPPFunction)funcBinding ).getOwner(); + if( ownerBinding != null && QtKeywords.QOBJECT.equals( ownerBinding.getName() ) ) + return true; + } + + return false; + } + + private static class Completion + { + private final String replacement; + private final String display; + private final int cursorOffset; + + public static final Completion SIGNAL = new Completion( "SIGNAL()", "SIGNAL(a)", -1 ); + public static final Completion SLOT = new Completion( "SLOT()", "SLOT(a)", -1 ); + + public Completion( String replacement ) + { + this( replacement, replacement, 0 ); + } + + public Completion( String replacement, String display, int cursorOffset ) + { + this.replacement = replacement; + this.display = display; + this.cursorOffset = cursorOffset; + } + + public ICompletionProposal createProposal( CContentAssistInvocationContext context ) + { + int repLength = replacement.length(); + int repOffset = context.getInvocationOffset(); + CCompletionProposal p = new CCompletionProposal( replacement, repOffset, repLength, null, display, RelevanceConstants.DEFAULT_TYPE_RELEVANCE, context.getViewer() ); + p.setCursorPosition( repLength + cursorOffset ); + return p; + } + + @Override + public String toString() + { + if( replacement == null ) + return super.toString(); + return replacement + '@' + cursorOffset; + } + } + + private static interface MethodFilter + { + public boolean keep( ICPPMethod method ); + + public static class Qt + { + public static final MethodFilter Signal = new MethodFilter() + { + @Override + public boolean keep( ICPPMethod method ) + { + ITagReader tagReader = CCorePlugin.getTagService().findTagReader( method ); + if( tagReader == null ) + return false; + + ITag tag = tagReader.getTag( QtPlugin.SIGNAL_SLOT_TAGGER_ID ); + if( tag == null ) + return false; + + int result = tag.getByte( 0 ); + return result != ITag.Fail + && ( ( result & QtPlugin.SignalSlot_Mask_signal ) == QtPlugin.SignalSlot_Mask_signal ); + } + }; + + public static final MethodFilter Slot = new MethodFilter() + { + @Override + public boolean keep( ICPPMethod method ) + { + ITagReader tagReader = CCorePlugin.getTagService().findTagReader( method ); + if( tagReader == null ) + return false; + + ITag tag = tagReader.getTag( QtPlugin.SIGNAL_SLOT_TAGGER_ID ); + if( tag == null ) + return false; + + int result = tag.getByte( 0 ); + return result != ITag.Fail + && ( ( result & QtPlugin.SignalSlot_Mask_slot ) == QtPlugin.SignalSlot_Mask_slot ); + } + }; + } + } + + private static Iterable filterMethods( final ICPPClassType cls, final MethodFilter filter ) + { + return new Iterable() + { + @Override + public Iterator iterator() + { + return new Iterator() + { + private int index = 0; + private final ICPPMethod[] methods = cls.getMethods(); + + @Override + public boolean hasNext() + { + for( ; index < methods.length; ++index ) + if( filter.keep( methods[index] ) ) + return true; + return false; + } + + @Override public ICPPMethod next() { return methods[index++]; } + @Override public void remove() { } + }; + } + }; + } + + private static String getSignature( ICPPMethod method ) + { + StringBuilder signature = new StringBuilder(); + + signature.append( method.getName() ); + signature.append( '(' ); + boolean first = true; + for( ICPPParameter param : method.getParameters() ) + { + if( first ) + first = false; + else + signature.append( ", " ); + signature.append( ASTTypeUtil.getType( param.getType() ) ); + } + + signature.append( ')' ); + return signature.toString(); + } + + private static void addCompletionsFor( Collection completions, IASTInitializerClause init, MethodFilter filter ) + { + if( !( init instanceof ICPPASTInitializerClause ) ) + return; + + ICPPEvaluation eval = ( (ICPPASTInitializerClause)init ).getEvaluation(); + if( eval == null ) + return; + + IType type = eval.getTypeOrFunctionSet( init ); + while( type instanceof IPointerType ) + type = ( (IPointerType)type ).getType(); + + if( type instanceof ICPPClassType ) + for( ICPPMethod signal : filterMethods( (ICPPClassType)type, filter ) ) + completions.add( new Completion( getSignature( signal ) ) ); + } + + // Copied from org.eclipse.cdt.internal.ui.text.CParameterListValidator + private static int indexOfClosingPeer(String code, char left, char right, int pos) { + int level= 0; + final int length= code.length(); + while (pos < length) { + char ch= code.charAt(pos); + if (ch == left) { + ++level; + } else if (ch == right) { + if (--level == 0) { + return pos; + } + } + ++pos; + } + return -1; + } + + // Copied from org.eclipse.cdt.internal.ui.text.CParameterListValidator + private static int[] computeCommaPositions(String code) { + final int length= code.length(); + int pos= 0; + List positions= new ArrayList(); + positions.add(new Integer(-1)); + while (pos < length && pos != -1) { + char ch= code.charAt(pos); + switch (ch) { + case ',': + positions.add(new Integer(pos)); + break; + case '(': + pos= indexOfClosingPeer(code, '(', ')', pos); + break; + case '<': + pos= indexOfClosingPeer(code, '<', '>', pos); + break; + case '[': + pos= indexOfClosingPeer(code, '[', ']', pos); + break; + default: + break; + } + if (pos != -1) + pos++; + } + positions.add(new Integer(length)); + + int[] fields= new int[positions.size()]; + for (int i= 0; i < fields.length; i++) + fields[i]= positions.get(i).intValue(); + return fields; + } + + + private void addConnectParameterCompletions( List proposals, CContentAssistInvocationContext context, IASTCompletionNode completionNode, String prefix ) + { + IASTName[] names = completionNode.getNames(); + List completions = new LinkedList(); + + for( IASTName name : names ) + { + // The node isn't properly hooked up, must have backtracked out of this node + if( name.getTranslationUnit() == null ) + continue; + + IASTCompletionContext astContext = name.getCompletionContext(); + if( astContext == null || ! ( astContext instanceof IASTNode ) ) + continue; + IASTNode astNode = (IASTNode)astContext; + + if( is_QObject_connect( context, astContext, name ) ) + { + int parseOffset = context.getParseOffset(); + int invocationOffset = context.getInvocationOffset(); + + String unparsed = ""; + try { unparsed = context.getDocument().get( parseOffset, invocationOffset - parseOffset ); } + catch( BadLocationException e ) { CCorePlugin.log( e ); } + + if( unparsed.length() > 0 && unparsed.charAt( 0 ) == '(' ) + unparsed = unparsed.substring( 1 ); + + int[] commas = computeCommaPositions( unparsed ); + switch( commas.length ) + { + case 3: + completions.add( Completion.SIGNAL ); + break; + case 5: + completions.add( Completion.SLOT ); + break; + } + } + else if( astNode.getPropertyInParent() == IASTFunctionCallExpression.ARGUMENT ) + { + IASTNode parent = astNode.getParent(); + if( ! ( parent instanceof IASTFunctionCallExpression ) ) + continue; + IASTFunctionCallExpression call = (IASTFunctionCallExpression)parent; + IASTExpression nameExpr = call.getFunctionNameExpression(); + if( !( nameExpr instanceof IASTIdExpression ) ) + continue; + IASTIdExpression funcNameIdExpr = (IASTIdExpression)nameExpr; + IASTName funcName = funcNameIdExpr.getName(); + + if( !is_QObject_connect( context, astContext, funcName ) ) + continue; + + IASTInitializerClause[] args = call.getArguments(); + switch( args.length ) + { + case 2: + //if( QtKeywords.SIGNAL.equals( prefix ) ) + addCompletionsFor( completions, args[0], MethodFilter.Qt.Signal ); + break; + case 4: + if( QtKeywords.SLOT.equals( prefix ) ) + addCompletionsFor( completions, args[2], MethodFilter.Qt.Slot ); + break; + } + } + } + + for( Completion completion : completions ) + { + ICompletionProposal proposal = completion.createProposal( context ); + if( proposal != null ) + proposals.add( proposal ); + } + } + + @Override + protected List computeCompletionProposals( CContentAssistInvocationContext context, IASTCompletionNode completionNode, String prefix ) throws CoreException + { + if( !isApplicable( context ) ) + return Collections.emptyList(); + + List proposals = new ArrayList(); + addConnectParameterCompletions( proposals, context, completionNode, prefix ); + return proposals; + } +} diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/ui/Activator.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/ui/QtUIPlugin.java similarity index 85% rename from qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/ui/Activator.java rename to qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/ui/QtUIPlugin.java index 5d1039b2ae0..d4b781e9e8b 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/ui/Activator.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/qt/ui/QtUIPlugin.java @@ -6,18 +6,18 @@ import org.osgi.framework.BundleContext; /** * The activator class controls the plug-in life cycle */ -public class Activator extends AbstractUIPlugin { +public class QtUIPlugin extends AbstractUIPlugin { // The plug-in ID public static final String PLUGIN_ID = "org.eclipse.cdt.qt.ui"; //$NON-NLS-1$ // The shared instance - private static Activator plugin; + private static QtUIPlugin plugin; /** * The constructor */ - public Activator() { + public QtUIPlugin() { } /* @@ -43,7 +43,7 @@ public class Activator extends AbstractUIPlugin { * * @return the shared instance */ - public static Activator getDefault() { + public static QtUIPlugin getDefault() { return plugin; }