blob: abf90bb4f0b769a38ffbb4b06fd9d9bf8b98e35e [file] [log] [blame]
/*
* Copyright 2000-2014 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.find;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.messages.Topic;
import org.intellij.lang.annotations.MagicConstant;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Allows to invoke and control Find, Replace and Find Usages operations.
*/
public abstract class FindManager {
public static final Topic<FindModelListener> FIND_MODEL_TOPIC = new Topic<FindModelListener>("FindManager's model changes", FindModelListener.class);
public abstract FindModel createReplaceInFileModel();
@Nullable
public abstract FindModel getPreviousFindModel();
public abstract void setPreviousFindModel(FindModel previousFindModel);
public abstract void showSettingsAndFindUsages(@NotNull NavigationItem[] targets);
/**
* Returns the find manager instance for the specified project.
*
* @param project the project for which the manager is requested.
* @return the manager instance.
*/
public static FindManager getInstance(Project project) {
return ServiceManager.getService(project, FindManager.class);
}
/**
* Shows the Find, Replace or Find Usages dialog initializing it from the specified
* model and saves the settings entered by the user into the same model. Does not
* perform the actual find or replace operation.
*
* @param model the model containing the settings of a find or replace operation.
* @param okHandler Will be executed after doOkAction
*/
public abstract void showFindDialog(@NotNull FindModel model, @NotNull Runnable okHandler);
/**
* Shows a replace prompt dialog for the specified replace operation.
*
* @param model the model containing the settings of the replace operation.
* @param title the title of the dialog to show.
* @return the exit code of the dialog, as defined by the {@link com.intellij.find.FindManager.PromptResult}
* interface.
*/
@PromptResultValue
public abstract int showPromptDialog(@NotNull FindModel model, String title);
/**
* Returns the settings of the last performed Find in File operation, or the
* default Find in File settings if no such operation was performed by the user.
*
* @return the last Find in File settings.
*/
@NotNull
public abstract FindModel getFindInFileModel();
/**
* Returns the settings of the last performed Find in Project operation, or the
* default Find in Project settings if no such operation was performed by the user.
*
* @return the last Find in Project settings.
*/
@NotNull
public abstract FindModel getFindInProjectModel();
/**
* Searches for the specified substring in the specified character sequence,
* using the specified find settings. Supports case sensitive and insensitive
* searches, forward and backward searches, regular expression searches and
* searches for whole words.
*
* @param text the text in which the search is performed.
* @param offset the start offset for the search.
* @param model the settings for the search, including the string to find.
* @return the result of the search.
*/
@NotNull
public abstract FindResult findString(@NotNull CharSequence text, int offset, @NotNull FindModel model);
/**
* Searches for the specified substring in the specified character sequence,
* using the specified find settings. Supports case sensitive and insensitive
* searches, forward and backward searches, regular expression searches and
* searches for whole words.
*
* @param text the text in which the search is performed.
* @param offset the start offset for the search.
* @param model the settings for the search, including the string to find.
* @return the result of the search.
*/
@NotNull
public abstract FindResult findString(@NotNull CharSequence text, int offset, @NotNull FindModel model,
@Nullable VirtualFile findContextFile);
/**
* Shows a replace prompt dialog for the bad replace operation.
*
* @param model the model containing the settings of the replace operation.
* @param title the title of the dialog to show.
* @param exception exception from {@link FindManager#getStringToReplace}
* @return the exit code of the dialog, as defined by the {@link PromptResult}
* interface. May be only {@link PromptResult#CANCEL} or {@link PromptResult#SKIP} for bad replace operation
*/
@PromptResultValue
public abstract int showMalformedReplacementPrompt(@NotNull FindModel model, String title, MalformedReplacementStringException exception);
public static class MalformedReplacementStringException extends Exception {
public MalformedReplacementStringException(String s) {
super(s); //To change body of overridden methods use File | Settings | File Templates.
}
public MalformedReplacementStringException(String s, Throwable throwable) {
super(s, throwable); //To change body of overridden methods use File | Settings | File Templates.
}
}
/**
* Gets the string to replace with, given the specified found string and find/replace
* settings. Supports case-preserving and regular expression replaces.
*
* @param foundString the found string.
* @param model the search and replace settings, including the replace string.
* @return the string to replace the specified found string.
*/
public abstract String getStringToReplace(@NotNull String foundString, @NotNull FindModel model) throws MalformedReplacementStringException;
public abstract String getStringToReplace(@NotNull String foundString, @NotNull FindModel model,
int startOffset, @NotNull CharSequence documentText) throws MalformedReplacementStringException;
/**
* Gets the flag indicating whether the "Find Next" and "Find Previous" actions are
* available to continue a previously started search operation. (The operations are
* available if at least one search was performed in the current IDEA session.)
*
* @return true if the actions are available, false if there is no previous search
* operation to continue.
*/
public abstract boolean findWasPerformed();
/**
* Sets the flag indicating that the "Find Next" and "Find Previous" actions are
* available to continue a previously started search operation.
*/
public abstract void setFindWasPerformed();
/**
* Gets the flag indicating that 'Add Selection for Next Occurrence' action was performed recently,
* so "Find Next" and "Find Previous" actions should work in its context.
*/
public abstract boolean selectNextOccurrenceWasPerformed();
/**
* Sets the flag indicating that 'Add Selection for Next Occurrence' action was performed recently,
* so "Find Next" and "Find Previous" actions should work in its context.
*/
public abstract void setSelectNextOccurrenceWasPerformed();
/**
* Explicitly tell FindManager that "Find Next" and "Find Previous" actions should not use
* find usages previous results.
*/
public abstract void clearFindingNextUsageInFile();
/**
* Sets the model containing the search settings to use for "Find Next" and
* "Find Previous" operations.
*
* @param model the model to use for the operations.
*/
public abstract void setFindNextModel(FindModel model);
/**
* Gets the model containing the search settings to use for "Find Next" and
* "Find Previous" operations.
*
* @return the model to use for the operations.
*/
public abstract FindModel getFindNextModel();
/**
* Gets the model containing the search settings to use for "Find Next" and
* "Find Previous" operations specific for the editor given. It may be different than {@link #getFindNextModel()}
* if there is find bar currently shown for the editor.
*
* @param editor editor, for which find model shall be retreived for
* @return the model to use for the operations.
*/
public abstract FindModel getFindNextModel(@NotNull Editor editor);
/**
* Checks if the Find Usages action is available for the specified element.
*
* @param element the element to check the availability for.
* @return true if Find Usages is available, false otherwise.
* @see com.intellij.lang.findUsages.FindUsagesProvider#canFindUsagesFor(com.intellij.psi.PsiElement)
*/
public abstract boolean canFindUsages(@NotNull PsiElement element);
/**
* Performs the Find Usages operation for the specified element.
*
* @param element the element to find the usages for.
*/
public abstract void findUsages(@NotNull PsiElement element);
public abstract void findUsagesInScope(@NotNull PsiElement element, @NotNull SearchScope searchScope);
/**
* Shows the Find Usages dialog (if {@code showDialog} is true} and performs the Find Usages operation for the
* specified element.
*
* @param element the element to find the usages for.
* @param showDialog true if find usages settings dialog needs to be shown.
* @since idea 12
*/
public abstract void findUsages(@NotNull PsiElement element, boolean showDialog);
/**
* Performs a "Find Usages in File" operation for the specified element.
*
* @param element the element for which the find is performed.
* @param editor the editor in which the find is performed.
*/
public abstract void findUsagesInEditor(@NotNull PsiElement element, @NotNull FileEditor editor);
/**
* Performs a "Find Next" operation after "Find Usages in File" or
* "Highlight Usages in File".
*
* @param editor the editor in which the find is performed.
* @return true if the operation was performed (not necessarily found anything),
* false if an error occurred during the operation.
*/
public abstract boolean findNextUsageInEditor(@NotNull FileEditor editor);
/**
* Performs a "Find Previous" operation after "Find Usages in File" or
* "Highlight Usages in File".
*
* @param editor the editor in which the find is performed.
* @return true if the operation was performed (not necessarily found anything),
* false if an error occurred during the operation.
*/
public abstract boolean findPreviousUsageInEditor(@NotNull FileEditor editor);
@MagicConstant(valuesFromClass = FindManager.PromptResult.class)
public @interface PromptResultValue {}
/**
* Possible return values for the {@link FindManager#showPromptDialog(FindModel, String)} method.
*
* @since 5.0.2
*/
public interface PromptResult {
int OK = 0;
int CANCEL = 1;
int SKIP = 2;
int ALL = 3;
int ALL_IN_THIS_FILE = 4;
int ALL_FILES = 5;
}
}