blob: 2bdfe7b06a1061bb9e59c6f36beda7f50efafbe9 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.refactoring;
import com.intellij.openapi.util.Ref;
import com.intellij.usageView.UsageInfo;
/**
* Represents refactoring of IntelliJ IDEA.<br>
* @author dsl
*/
public interface Refactoring {
/**
* Controls whether refactoring shows a preview.<br>
* If there are modifications that should be performed in non-java files or not in code,
* preview will be shown regardless of this setting
*/
void setPreviewUsages(boolean value);
/**
* Returns value of <code>previewUsages</code> property.
* If there are modifications that should be performed in non-java files or not in code,
* preview will be shown regardless of this setting.
*/
boolean isPreviewUsages();
/**
* Controls whether this refactoring is interactive: whether it should show conflicts dialog
* and other dialogs. <br>
* If <code>prepareSuccessfulCallback</code> is not <code>null</code>, refactoring is interactive, and
* the callback is executed if user did not cancel the refactoring operation, right after
* <code>preprocessUsages</code> has finished.<br>
* If <code>prepareSuccessfulCallback</code> is <code>null</code>, user is not presented with
* conflicts etc., but the preview may still be shown.<br>
*
* <b>Note:</b> the callback is executed in dispatch thread. <br>
*
* Refactorings are interactive by default, with empty runnable as a callback.
* @param prepareSuccessfulCallback
*/
void setInteractive(Runnable prepareSuccessfulCallback);
/**
* Returns whether refactoring is interactive.
* @see #setInteractive(java.lang.Runnable)
*/
boolean isInteractive();
/**
* Searches for places in code that refactoring will change. <br>
* This method should be best invoked in the process with progress and it does
* all the lengthy code analysis operations.
*/
UsageInfo[] findUsages();
/**
* Analyses usages (presumably obtained from {@link #findUsages()} for possible conflicts
* and (if refactoring is interactive) presents user with appropriate conflicts dialog.
* @see #setInteractive(java.lang.Runnable)
*/
boolean preprocessUsages(Ref<UsageInfo[]> usages);
/**
* Checks whether usages need to be shown
* @see #setPreviewUsages(boolean)
* @see #isPreviewUsages()
*/
boolean shouldPreviewUsages(UsageInfo[] usages);
/**
* Performs all changes in code that are neccessary. <br>
* Does NOT require command or write action, but should be invoked n dispatch thread.
*/
void doRefactoring(UsageInfo[] usages);
/**
* Runs the whole refactoring. The logic of this method is as follows:
* <p/>
* <ol>
* <li> execute {@link #findUsages()} (with progress dialog and all)
* <li> execute {@link #preprocessUsages(com.intellij.openapi.util.Ref)}
* <li> if refactoring was not cancelled, check whether we {@link #shouldPreviewUsages(com.intellij.usageView.UsageInfo[])} , and show the preview
* <li> execute {@link #doRefactoring(com.intellij.usageView.UsageInfo[])} if appropiate (if either the preview
* was not shown, or 'Do Refactor' button have been pressed)
* </ol>
*/
void run();
}