mirror of
https://github.com/JetBrains/intellij-sdk-code-samples.git
synced 2025-07-28 01:07:49 +08:00
[md] highlighting
This commit is contained in:
parent
94a94add85
commit
9a8fb93810
@ -43,11 +43,13 @@ it will be available from the context menu when the focus is located in the edit
|
||||
To determine conditions by which the action will be visible and available for being executed we need to override it's
|
||||
*public void update(final AnActionEvent e)* method.
|
||||
|
||||
public class EditorIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorIllustration extends AnAction {
|
||||
@Override
|
||||
public void update(final AnActionEvent e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If we want to work with a selected part of the text, it's reasonable to make the action available only when the following requirements are met:
|
||||
|
||||
@ -61,7 +63,8 @@ Further steps will show how to check these conditions through obtaining instance
|
||||
A reference to an instance of the Editor can be obtained by calling ```CommonDataKeys.EDITOR```,
|
||||
obtaining a project reference is performed the same way ```CommonDataKeys.PROJECT```.
|
||||
|
||||
public class EditorIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorIllustration extends AnAction {
|
||||
@Override
|
||||
public void update(final AnActionEvent e) {
|
||||
//Get required data keys
|
||||
@ -70,7 +73,8 @@ obtaining a project reference is performed the same way ```CommonDataKeys.PROJEC
|
||||
//Set visibility only in case of existing project and editor
|
||||
e.getPresentation().setVisible((project != null && editor != null));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
------------------
|
||||
|
||||
@ -90,7 +94,8 @@ After making sure we have a project open and an instance of the Editor we need t
|
||||
[SelectionModel] () got from the Editor allows to do it by calling it's ```hasSelection()``` method.
|
||||
Here's how our ```update(final AnActionEvent e)``` method should look like at the end:
|
||||
|
||||
public class EditorIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorIllustration extends AnAction {
|
||||
@Override
|
||||
public void update(final AnActionEvent e) {
|
||||
//Get required data keys
|
||||
@ -100,7 +105,8 @@ Here's how our ```update(final AnActionEvent e)``` method should look like at th
|
||||
e.getPresentation().setVisible((project != null && editor != null
|
||||
&& editor.getSelectionModel().hasSelection()));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
------------
|
||||
|
||||
@ -123,7 +129,8 @@ package and include:
|
||||
The action is visible and available now. In order to make it do something we need to override it's
|
||||
```public void actionPerformed(final AnActionEvent anActionEvent)``` method.
|
||||
|
||||
public class EditorIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorIllustration extends AnAction {
|
||||
@Override
|
||||
public void update(final AnActionEvent e) {
|
||||
//code here
|
||||
@ -131,7 +138,8 @@ The action is visible and available now. In order to make it do something we nee
|
||||
@Override
|
||||
public void actionPerformed(final AnActionEvent anActionEvent) {
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
To modify the text an instance of the
|
||||
[Document] (https://github.com/JetBrains/intellij-community/blob/master/platform/core-api/src/com/intellij/openapi/editor/Document.java)
|
||||
@ -139,8 +147,9 @@ needs to be accessed. Document represents the contents of a text file loaded int
|
||||
The instance of a Document will be use later when a text replacement is performed.
|
||||
We also need to figure out where the selected part of the text is located.
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final AnActionEvent anActionEvent) {
|
||||
```java
|
||||
@Override
|
||||
public void actionPerformed(final AnActionEvent anActionEvent) {
|
||||
//Get all the required data from data keys
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
final Project project = anActionEvent.getRequiredData(CommonDataKeys.PROJECT);
|
||||
@ -149,7 +158,8 @@ We also need to figure out where the selected part of the text is located.
|
||||
final SelectionModel selectionModel = editor.getSelectionModel();
|
||||
final int start = selectionModel.getSelectionStart();
|
||||
final int end = selectionModel.getSelectionEnd();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##Modifying text
|
||||
Generally replacement can be done by calling
|
||||
@ -160,8 +170,9 @@ See
|
||||
[Threading Issues](https://confluence.jetbrains.com/display/IDEADEV/IntelliJ+IDEA+Architectural+Overview#IntelliJIDEAArchitecturalOverview-Threading)
|
||||
section to know more about synchronization issues and changes safety in IntelliJ.
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final AnActionEvent anActionEvent) {
|
||||
```java
|
||||
@Override
|
||||
public void actionPerformed(final AnActionEvent anActionEvent) {
|
||||
//Get all the required data from data keys
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
final Project project = anActionEvent.getRequiredData(CommonDataKeys.PROJECT);
|
||||
@ -181,7 +192,8 @@ section to know more about synchronization issues and changes safety in IntelliJ
|
||||
//Making the replacement
|
||||
WriteCommandAction.runWriteCommandAction(project, runnable);
|
||||
selectionModel.removeSelection();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
-----------
|
||||
|
||||
@ -206,37 +218,39 @@ Access to the Editor is performed through an action.
|
||||
##Accessing caret positions
|
||||
To get an access to caret positions an instance of CaretModel should be obtained.
|
||||
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
CaretModel caretModel = editor.getCaretModel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##Logical position
|
||||
[LogicalPosition.java] (https://github.com/JetBrains/intellij-community/blob/master/platform/editor-ui-api/src/com/intellij/openapi/editor/LogicalPosition.java)
|
||||
represents a line and a column of the current logical position of the caret. Logical positions ignore folding -
|
||||
for example, if the top 10 lines of the document are folded, the 10th line in the document will have the line number 10 in its logical position.
|
||||
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
CaretModel caretModel = editor.getCaretModel();
|
||||
LogicalPosition logicalPosition = caretModel.getLogicalPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Logical position may store additional parameters that define its mapping to
|
||||
[VisualPosition.java] (https://github.com/JetBrains/intellij-community/blob/master/platform/editor-ui-api/src/com/intellij/openapi/editor/VisualPosition.java).
|
||||
@ -250,7 +264,8 @@ represent a visual position and may very from the corresponding logical position
|
||||
Visual positions take folding into account - for example,
|
||||
if the top 10 lines of the document are folded, the 10th line in the document will have the line number 1 in its visual position.
|
||||
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
@ -258,17 +273,18 @@ if the top 10 lines of the document are folded, the 10th line in the document wi
|
||||
LogicalPosition logicalPosition = caretModel.getLogicalPosition();
|
||||
VisualPosition visualPosition = caretModel.getVisualPosition();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##Offset
|
||||
An absolute offset for a given caret position is accessible through CaretModel as well
|
||||
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
@ -277,18 +293,19 @@ An absolute offset for a given caret position is accessible through CaretModel a
|
||||
VisualPosition visualPosition = caretModel.getVisualPosition();
|
||||
int offset = caretModel.getOffset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##Displaying position values
|
||||
To display the actual values of logical anf visual positions we add an
|
||||
```Messages.showInfoMessage()``` call that will show them in form of notification after the action is performed.
|
||||
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorAreaIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
@ -300,12 +317,12 @@ To display the actual values of logical anf visual positions we add an
|
||||
visualPosition.toString() + "\n" +
|
||||
"Offset: " + offset, "Caret Parameters Inside The Editor");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(AnActionEvent e) {
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Check out, compile, and run the
|
||||
[Editor Basics Plugin] (https://github.com/JetBrains/intellij-sdk/tree/master/code_samples/editor_basics),
|
||||
@ -332,18 +349,21 @@ Series of steps below shows how to change standard behaviour of the editor and m
|
||||
First we need to implement an instance of
|
||||
[TypedActionHandler]():
|
||||
|
||||
public class MyTypedHandler implements TypedActionHandler {
|
||||
```java
|
||||
public class MyTypedHandler implements TypedActionHandler {
|
||||
@Override
|
||||
public void execute(@NotNull Editor editor, char c, @NotNull DataContext dataContext) {
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
###Implementing logic for handling keystrokes
|
||||
```public void execute(@NotNull Editor editor, char c, @NotNull DataContext dataContext);```
|
||||
method should contain the main logical part for handling keystrokes. It will be called every time a key is pressed.
|
||||
In the following example our typed handler is meant insert a string at the zero offset in the editor after a keystroke occurs:
|
||||
|
||||
public class MyTypedHandler implements TypedActionHandler {
|
||||
```java
|
||||
public class MyTypedHandler implements TypedActionHandler {
|
||||
@Override
|
||||
public void execute(@NotNull Editor editor, char c, @NotNull DataContext dataContext) {
|
||||
final Document document = editor.getDocument();
|
||||
@ -356,7 +376,8 @@ In the following example our typed handler is meant insert a string at the zero
|
||||
};
|
||||
WriteCommandAction.runWriteCommandAction(project, runnable);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
###Setting up *TypedActionHandler*
|
||||
|
||||
@ -365,13 +386,15 @@ To enable a custom implementation of *TypedActionHandler* in the plugin we need
|
||||
[TypedAction]()
|
||||
class. By doing it we replace the typing handler with the specified handler.
|
||||
|
||||
public class EditorIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorIllustration extends AnAction {
|
||||
static {
|
||||
final EditorActionManager actionManager = EditorActionManager.getInstance();
|
||||
final TypedAction typedAction = actionManager.getTypedAction();
|
||||
typedAction.setupHandler(new MyTypedHandler());
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
After compiling and running the code snippet above typing in the editor will be handled with inserting an extra string at the 0 position.
|
||||
|
||||
@ -385,30 +408,35 @@ In this example we will use *EditorActionHandler* to insert one extra caret abov
|
||||
###Prerequirements
|
||||
Create an action:
|
||||
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
|
||||
}
|
||||
@Override
|
||||
public void update(@NotNull final AnActionEvent anActionEvent) {
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Register action in
|
||||
[plugin.xml]():
|
||||
|
||||
<actions>
|
||||
```xml
|
||||
<actions>
|
||||
<action id="EditorBasics.EditorHandlerIllustration" class="org.jetbrains.tutorials.editor.basics.EditorHandlerIllustration" text="Editor Handler"
|
||||
description="Illustrates how to plug an action in">
|
||||
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
|
||||
</action>
|
||||
</action>
|
||||
</action>
|
||||
```
|
||||
|
||||
###Setting visibility
|
||||
Our action should be visible only in case if the following conditions are met:
|
||||
there's a project open, there's an editor available, and there's at least one caret active in the editor:
|
||||
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
|
||||
}
|
||||
@ -418,7 +446,8 @@ there's a project open, there's an editor available, and there's at least one ca
|
||||
final Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
|
||||
anActionEvent.getPresentation().setVisible((project != null && editor != null && !editor.getCaretModel().getAllCarets().isEmpty()));
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
###Obtaining *EditorActionHandler*
|
||||
|
||||
@ -427,25 +456,27 @@ an instance of
|
||||
[EditorActionHandler]() for the action we'd like to work with. Ih this case it will be an instance of
|
||||
[CloneCaretActionHandler]().
|
||||
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
EditorActionManager actionManager = EditorActionManager.getInstance();
|
||||
EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_CLONE_CARET_BELOW);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(@NotNull final AnActionEvent anActionEvent) {
|
||||
//...
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
###Making *EditorActionHandler* execute actions
|
||||
To execute an action we need to call the ```public final void execute(@NotNull Editor editor, @Nullable final Caret contextCaret, final DataContext dataContext);```
|
||||
method of a corresponding *EditorActionHandler*
|
||||
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
```java
|
||||
public class EditorHandlerIllustration extends AnAction {
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent anActionEvent) {
|
||||
final Editor editor = anActionEvent.getRequiredData(CommonDataKeys.EDITOR);
|
||||
@ -457,7 +488,8 @@ method of a corresponding *EditorActionHandler*
|
||||
public void update(@NotNull final AnActionEvent anActionEvent) {
|
||||
//
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
After compiling and running the following code sample, one extra caret will be placed in the editor below the current active caret.
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user