blob: efd6ecfe8f64ec971a73494e9e560525b2f3a64d [file] [log] [blame]
package com.intellij.javadoc;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.editorActions.enter.EnterHandlerDelegateAdapter;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.CaretModel;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.util.text.CharArrayUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author Denis Zhdanov
* @since 5/30/11 2:08 PM
*/
public class EnterInJavadocParamDescriptionHandler extends EnterHandlerDelegateAdapter {
private final JavadocHelper myHelper = JavadocHelper.getInstance();
@Override
public Result postProcessEnter(@NotNull final PsiFile file, @NotNull Editor editor, @NotNull DataContext dataContext) {
if (!CodeInsightSettings.getInstance().SMART_INDENT_ON_ENTER
|| !CodeStyleSettingsManager.getSettings(file.getProject()).JD_ALIGN_PARAM_COMMENTS)
{
return Result.Continue;
}
final CaretModel caretModel = editor.getCaretModel();
final int caretOffset = caretModel.getOffset();
final Pair<JavadocHelper.JavadocParameterInfo,List<JavadocHelper.JavadocParameterInfo>> pair
= myHelper.parse(file, editor, caretOffset);
if (pair.first == null || pair.first.parameterDescriptionStartPosition == null) {
return Result.Continue;
}
final LogicalPosition caretPosition = caretModel.getLogicalPosition();
final LogicalPosition nameEndPosition = pair.first.parameterNameEndPosition;
if (nameEndPosition.line == caretPosition.line && caretPosition.column <= nameEndPosition.column) {
return Result.Continue;
}
final int descriptionStartColumn = pair.first.parameterDescriptionStartPosition.column;
final LogicalPosition desiredPosition = new LogicalPosition(caretPosition.line, descriptionStartColumn);
final Document document = editor.getDocument();
final CharSequence text = document.getCharsSequence();
final int offsetAfterLastWs = CharArrayUtil.shiftForward(text, caretOffset, " \t");
if (editor.offsetToLogicalPosition(offsetAfterLastWs).column < desiredPosition.column) {
final int lineStartOffset = document.getLineStartOffset(desiredPosition.line);
final String toInsert = StringUtil.repeat(" ", desiredPosition.column - (offsetAfterLastWs - lineStartOffset));
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
document.insertString(caretOffset, toInsert);
PsiDocumentManager.getInstance(file.getProject()).commitDocument(document);
}
});
}
myHelper.navigate(desiredPosition, editor, file.getProject());
return Result.Stop;
}
}