/******************************************************************************* * Copyright (c) 2007, 2015 Zend Technologies 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: * Zend Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.php.refactoring.core.organizeIncludes; import java.text.MessageFormat; import java.util.LinkedHashMap; import java.util.Map; import org.eclipse.ltk.core.refactoring.*; import org.eclipse.php.refactoring.core.PhpRefactoringCoreMessages; import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.MultiTextEdit; import org.eclipse.text.edits.TextEdit; class OrganizeIncludesChange extends TextFileChange { private OrganizeIncludesProcessorDelegate processorDelegate; private Map<String, TextEditChangeGroup> editGroups = new LinkedHashMap<String, TextEditChangeGroup>(); private int includeInsertionOffset; public OrganizeIncludesChange( OrganizeIncludesProcessorDelegate processorDelegate) { super( MessageFormat .format(PhpRefactoringCoreMessages .getString("OrganizeIncludesChange_In_File"), new Object[] { processorDelegate.getFile().getFullPath().toString() }), processorDelegate.getFile()); //$NON-NLS-1$ // 0. Initialize the change: setTextType("php"); //$NON-NLS-1$ setEdit(new MultiTextEdit()); this.processorDelegate = processorDelegate; } // public void addEdits(BucketMap<String, CodeData> existingIncludes, // BucketMap<PHPFileData, CodeData> missingHardIncludes, // BucketMap<PHPFileData, CodeData> missingSoftIncludes, // List<PHPIncludeFileData> unneededIncludes, List<PHPIncludeFileData> // unresolvedIncludes) { // // 1. Calculate insertion offset: // includeInsertionOffset = // OrganizeIncludesUtils.getFirstIncludeOffset(processorDelegate.fileData); // if (includeInsertionOffset < 0) // return; // // // 2. Add necessary edits: // addMissingIncludes(missingHardIncludes, true); // deleteUnneededIncludes(unresolvedIncludes, true); // // // 3. Add optional edits: // addMissingIncludes(missingSoftIncludes, false); // deleteUnneededIncludes(unneededIncludes, false); // moveExistingIncludes(existingIncludes); // // // 4. Commit the edits: // commitEditGroups(); // // } private void commitEditGroups() { for (TextEditChangeGroup editChangeGroup : editGroups.values()) { TextEdit[] edits = editChangeGroup.getTextEdits(); for (TextEdit edit : edits) { addEdit(edit); } addTextEditChangeGroup(editChangeGroup); } } // private DeleteEdit createDeleteIncludeEdit(PHPIncludeFileData include) { // int startOffset = include.getUserData().getStartPosition(); // int endOffset = include.getUserData().getEndPosition(); // // TextSequence currentStatement = // PHPTextSequenceUtilities.getStatement(endOffset, // processorDelegate.document.getRegionAtCharacterOffset(endOffset), false); // TextSequence nextStatement = currentStatement; // // find next statement: // for (; nextStatement != null && endOffset < // processorDelegate.document.getLength() && // currentStatement.getOriginalOffset(0) == // nextStatement.getOriginalOffset(0); ++endOffset) { // nextStatement = PHPTextSequenceUtilities.getStatement(endOffset, // processorDelegate.document.getRegionAtCharacterOffset(endOffset), false); // } // if (nextStatement != null) { // for (; endOffset < processorDelegate.document.getLength(); endOffset++) { // try { // if // (!Character.isWhitespace(processorDelegate.document.getChar(endOffset))) // { // break; // } // } catch (BadLocationException e) { // endOffset--; // } // } // } // // return new DeleteEdit(startOffset, endOffset - startOffset); // } // // private TextEditChangeGroup addIncludeRelocation(String insertionLabel, // String includeString, List<PHPIncludeFileData> existingIncludes) { // // create and add the edit: // List<TextEdit> allEdits = new ArrayList<TextEdit>(); // allEdits.add(createInsertIncludeEdit(includeString)); // for (PHPIncludeFileData include : existingIncludes) { // allEdits.add(createDeleteIncludeEdit(include)); // } // // add the group edit: // CategorizedTextEditGroup editGroup = new CategorizedTextEditGroup(insertionLabel, new GroupCategorySet(new GroupCategory("relocateIncludes", PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Movements"), PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Movements")))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // // return createChangeEditGroup(allEdits.toArray(new // TextEdit[allEdits.size()]), editGroup, false); // } // // private void moveExistingIncludes(BucketMap<String, CodeData> // existingIncludes) { // boolean changeNeeded = false; // if (existingIncludes.getAll().size() > 1) // changeNeeded = true; // PHPIncludeFileData[] includes = // processorDelegate.fileNode.getFile().getIncludeFiles(); // for (String existingInclude : existingIncludes.getKeys()) { // String includeLocation = // PHPModelUtil.getRelativeLocation(processorDelegate.getProject(), // existingInclude); // String editGroupName = OrganizeIncludesUtils.getEditGroupName(PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Move_Up"), includeLocation, existingIncludes.get(existingInclude)); //$NON-NLS-1$ // Collection<IPath> includePaths = // processorDelegate.fileNode.getIncludePaths(processorDelegate.network.getNode(processorDelegate.projectModel.getFileData(existingInclude))); // List<PHPIncludeFileData> identicalIncludes = new // ArrayList<PHPIncludeFileData>(); // String finalIncludeLocation = null; // if (includes.length > 1) // changeNeeded = true; // for (PHPIncludeFileData element : includes) { // for (IPath path : includePaths) { // String includeString = IncludeStringHack.unhack(path.toString()); // String firstSegment = path.segment(0); // if (finalIncludeLocation == null && !"||".equals(firstSegment) && !"|".equals(firstSegment)) // not relative //$NON-NLS-1$ //$NON-NLS-2$ // finalIncludeLocation = includeString; // if (new Path(element.getName()).equals(new Path(includeString))) // identicalIncludes.add(element); // } // } // if (!changeNeeded) // return; // if (finalIncludeLocation == null) // finalIncludeLocation = includeLocation; // TextEditChangeGroup editChangeGroup = addIncludeRelocation(editGroupName, // finalIncludeLocation, identicalIncludes); // editGroups.put(includeLocation, editChangeGroup); // } // } // // private void addMissingIncludes(BucketMap<PHPFileData, CodeData> // missingIncludes, boolean groupEnabled) { // for (PHPFileData missingInclude : missingIncludes.getKeys()) { // String includeLocation = // PHPModelUtil.getRelativeLocation(processorDelegate.getProject(), // missingInclude.getName()); // String editGroupName = OrganizeIncludesUtils.getEditGroupName(PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Add"), includeLocation, missingIncludes.get(missingInclude)); //$NON-NLS-1$ // TextEditChangeGroup editChangeGroup = // createIncludeAddition(editGroupName, includeLocation, groupEnabled); // editGroups.put(includeLocation, editChangeGroup); // } // } private TextEditChangeGroup createIncludeAddition(String insertionLabel, String includeString, boolean enabled) { InsertEdit edit = createInsertIncludeEdit(includeString); CategorizedTextEditGroup editGroup = new CategorizedTextEditGroup( insertionLabel, new GroupCategorySet( new GroupCategory( PhpRefactoringCoreMessages .getString("OrganizeIncludesChange_5"), PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Additions"), PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Additions")))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return createChangeEditGroup(new TextEdit[] { edit }, editGroup, enabled); } private TextEditChangeGroup createChangeEditGroup(TextEdit[] edits, CategorizedTextEditGroup editGroup, boolean enabled) { for (TextEdit element : edits) { editGroup.addTextEdit(element); } TextEditChangeGroup editChangeGroup = new TextEditChangeGroup(this, editGroup); editChangeGroup.setEnabled(enabled); return editChangeGroup; } private InsertEdit createInsertIncludeEdit(String includeString) { return new InsertEdit(includeInsertionOffset, MessageFormat.format( "require_once ''{0}'';{1}", new Object[] { //$NON-NLS-1$ includeString, processorDelegate.getDocument().getLineDelimiter() })); } // private void deleteUnneededIncludes(List<PHPIncludeFileData> // unneededIncludes, boolean unresolved) { // for (PHPIncludeFileData unneededInclude : unneededIncludes) { // String includeLocation = unneededInclude.getName(); // String editGroupName = OrganizeIncludesUtils.getEditGroupName( // PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Remove"), includeLocation, unresolved ? PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Unresolved") : PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Possibly_Unused")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // TextEditChangeGroup editChangeGroup = editGroups.get(includeLocation); // if (editChangeGroup == null) { // editChangeGroup = createIncludeDeletion(editGroupName, unneededInclude, // unresolved); // editGroups.put(includeLocation, editChangeGroup); // } else { // addIncludeDeletion(editChangeGroup, unneededInclude); // } // } // } // // private void addIncludeDeletion(TextEditChangeGroup editChangeGroup, // PHPIncludeFileData unneededInclude) { // // create and add the edit: // TextEdit edit = createDeleteIncludeEdit(unneededInclude); // // add the group edit: // addEditsToGroup(editChangeGroup, new TextEdit[] { edit }); // } // // private TextEditChangeGroup createIncludeDeletion(String insertionLabel, // PHPIncludeFileData unneededInclude, boolean groupEnabled) { // // create and add the edit: // TextEdit edit = createDeleteIncludeEdit(unneededInclude); // // add the group edit: // CategorizedTextEditGroup editGroup = new CategorizedTextEditGroup(insertionLabel, new GroupCategorySet(new GroupCategory("deleteIncludes", PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Deletions"), PhpRefactoringCoreMessages.getString("OrganizeIncludesChange_Deletions")))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // return createChangeEditGroup(new TextEdit[] { edit }, editGroup, // groupEnabled); // } private static void addEditsToGroup(TextEditChangeGroup editChangeGroup, TextEdit[] edits) { for (TextEdit element : edits) { editChangeGroup.getTextEditGroup().addTextEdit(element); } } }