// Copyright (c) 2007-2008 by Leif Frenzel - see http://leiffrenzel.de
// This code is made available under the terms of the Eclipse Public License,
// version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html
package net.sf.eclipsefp.haskell.ui.internal.refactoring;
import net.sf.eclipsefp.haskell.ui.internal.util.UITexts;
import org.eclipse.core.runtime.IProgressMonitor;
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.TextFileChange;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.IConditionChecker;
import org.eclipse.ltk.core.refactoring.participants.ValidateEditChecker;
/** <p>delegate object that contains the logic used by the processor.</p>
*
* @author Leif Frenzel
*/
public class MakePointFreeDelegate extends RefDelegate {
private Change change;
public MakePointFreeDelegate( final RefInfo info ) {
super( info );
info.setAllowEmptySelection( false );
}
@Override
RefactoringStatus checkFinalConditions( final IProgressMonitor pm,
final CheckConditionsContext ctxt ) {
RefactoringStatus result = new RefactoringStatus();
try {
pm.beginTask( UITexts.refDelegate_checking, 100 );
if( ctxt != null ) {
IConditionChecker checker = ctxt.getChecker( ValidateEditChecker.class );
ValidateEditChecker editChecker = ( ValidateEditChecker )checker;
editChecker.addFile( info.getSourceFile() );
}
change = createRenameChange();
if( change == null ) {
result.addFatalError( UITexts.mkPointFreeDelegate_notApplicable );
}
} finally {
pm.done();
}
return result;
}
@Override
void createChange( final IProgressMonitor pm,
final CompositeChange rootChange ) {
try {
pm.beginTask( UITexts.mkPointFreeDelegate_collectingChanges, 100 );
if( change == null ) {
throw new IllegalStateException();
}
rootChange.add( change );
} finally {
pm.done();
}
}
// helping methods
//////////////////
private Change createRenameChange() {
TextFileChange result = null;
// TODO TtC replace by something not Cohatoe-based
/*
CohatoeServer server = CohatoeServer.getInstance();
Object fun = server.createFunction( IMakePointFree.class );
String replacement = null;
if( fun instanceof IMakePointFree ) {
IMakePointFree primeFun = ( IMakePointFree )fun;
replacement = primeFun.makePointFree( info.getText() );
}
if( replacement != null
&& !replacement.trim().equals( info.getText().trim() ) ) {
IFile file = info.getSourceFile();
result = new TextFileChange( file.getName(), file );
// a file change contains a tree of edits, first add the root of them
MultiTextEdit fileChangeRootEdit = new MultiTextEdit();
result.setEdit( fileChangeRootEdit );
// edit object for the text replacement in the file,
// this is the only child
ReplaceEdit edit = new ReplaceEdit( info.getOffset(),
info.getText().length(),
replacement );
fileChangeRootEdit.addChild( edit );
}
*/
return result;
}
}