|
What this is
Other links
The source code/******************************************************************************* * Copyright (c) 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 *******************************************************************************/ package org.eclipse.jdt.ui.examples; import java.util.HashMap; import java.util.Iterator; import java.util.regex.Pattern; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IType; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.TextChange; import org.eclipse.ltk.core.refactoring.TextFileChange; import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; import org.eclipse.ltk.core.refactoring.participants.RenameParticipant; import org.eclipse.search.core.text.TextSearchEngine; import org.eclipse.search.core.text.TextSearchMatchAccess; import org.eclipse.search.core.text.TextSearchRequestor; import org.eclipse.search.ui.text.FileTextSearchScope; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.ReplaceEdit; import org.eclipse.text.edits.TextEditGroup; /* A rename participant that updates type references in '*.special' files. <extension point="org.eclipse.ltk.core.refactoring.renameParticipants"> <renameParticipant id="org.eclipse.jdt.ui.examples.MyRenameTypeParticipant" name="Rename participant for *.special files" class="org.eclipse.jdt.ui.examples.MyRenameTypeParticipant"> <enablement> <with variable="affectedNatures"> <iterate operator="or"> <equals value="org.eclipse.jdt.core.javanature"/> </iterate> </with> <with variable="element"> <instanceof value="org.eclipse.jdt.core.IType"/> </with> </enablement> </renameParticipant> </extension> */ public class MyRenameTypeParticipant extends RenameParticipant { private IType fType; /* (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object) */ protected boolean initialize(Object element) { fType= (IType) element; return true; } /* (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName() */ public String getName() { return "My special file participant"; //$NON-NLS-1$ } /* (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext) */ public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) { return new RefactoringStatus(); } /* (non-Javadoc) * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor) */ public Change createChange(IProgressMonitor pm) throws CoreException { final HashMap changes= new HashMap(); final String newName= getArguments().getNewName(); // use the text search engine to find matches in my special files // in a real world implementation, clients would use their own, more precise search engine IResource[] roots= { fType.getJavaProject().getProject() }; // limit to the current project String[] fileNamePatterns= { "*.special" }; //$NON-NLS-1$ // all files with file suffix 'special' FileTextSearchScope scope= FileTextSearchScope.newSearchScope(roots , fileNamePatterns, false); Pattern pattern= Pattern.compile(fType.getElementName()); // only find the simple name of the type TextSearchRequestor collector= new TextSearchRequestor() { public boolean acceptPatternMatch(TextSearchMatchAccess matchAccess) throws CoreException { IFile file= matchAccess.getFile(); TextFileChange change= (TextFileChange) changes.get(file); if (change == null) { TextChange textChange= getTextChange(file); // an other participant already modified that file? if (textChange != null) { return false; // don't try to merge changes } change= new TextFileChange(file.getName(), file); change.setEdit(new MultiTextEdit()); changes.put(file, change); } ReplaceEdit edit= new ReplaceEdit(matchAccess.getMatchOffset(), matchAccess.getMatchLength(), newName); change.addEdit(edit); change.addTextEditGroup(new TextEditGroup("Update type reference", edit)); //$NON-NLS-1$ return true; } }; TextSearchEngine.create().search(scope, collector, pattern, pm); if (changes.isEmpty()) return null; CompositeChange result= new CompositeChange("My special file updates"); //$NON-NLS-1$ for (Iterator iter= changes.values().iterator(); iter.hasNext();) { result.add((Change) iter.next()); } return result; } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.