IDEA插件开发-第二阶段(进阶)
一、文件编辑监听事件
1、实现FileEditorManagerListener接口
@Override
public void fileOpenedSync(@NotNull FileEditorManager source, @NotNull VirtualFile file, @NotNull Pair<FileEditor[], FileEditorProvider[]> editors) {
}
@Override
public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
}
@Override
public void selectionChanged(@NotNull FileEditorManagerEvent event) {
}
@Override
public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
FileEditor[] editors = source.getAllEditors();
}
2、注册事件
public class MyComponent implements ProjectComponent {
public MyComponent(@NotNull Project project) {
MyListenr array = new MyListenr();
project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, array);
}
}
plugin.xml
<project-components>
<component>
<implementation-class>core.MyComponent</implementation-class>
</component>
</project-components>
二、获取文件编辑器的面板
1、获取监听事件的文件编辑对象
public class TestAction implements FileEditorManagerListener {
@Override
public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
FileEditor[] editors = source.getAllEditors();
for(int var5 = 0; var5 < editors.length; ++var5) {
FileEditor editor = editors[var5];
Intrinsics.checkExpressionValueIsNotNull(editor, "editor");
inject(editor);
}
}
2、从编辑对象中获取编辑面板
private final JPanel getPanel(FileEditor editor) {
if (!(editor instanceof TextEditor)) {
// this.logger.debug("I01: Injection failed, only text editors are supported currently.");
return null;
} else {
try {
JComponent component = editor.getComponent();
if (component == null) {
throw new TypeCastException("null cannot be cast to non-null type javax.swing.JPanel");
} else {
JPanel outerPanel = (JPanel)component;
LayoutManager layoutManager = outerPanel.getLayout();
if (layoutManager == null) {
throw new TypeCastException("null cannot be cast to non-null type java.awt.BorderLayout");
} else {
BorderLayout outerLayout = (BorderLayout)layoutManager;
Component layoutComponent = outerLayout.getLayoutComponent("Center");
if (layoutComponent instanceof JBSplitter) {
component = ((JBSplitter)layoutComponent).getFirstComponent();
if (component == null) {
throw new TypeCastException("null cannot be cast to non-null type javax.swing.JPanel");
}
JPanel editorComp = (JPanel)component;
layoutManager = editorComp.getLayout();
if (layoutManager == null) {
throw new TypeCastException("null cannot be cast to non-null type java.awt.BorderLayout");
}
layoutComponent = ((BorderLayout)layoutManager).getLayoutComponent("Center");
}
if (layoutComponent == null) {
throw new TypeCastException("null cannot be cast to non-null type javax.swing.JLayeredPane");
} else {
JLayeredPane pane = (JLayeredPane)layoutComponent;
Component component1;
JPanel jpanel;
if (pane.getComponentCount() > 1) {
component1 = pane.getComponent(1);
if (component1 == null) {
throw new TypeCastException("null cannot be cast to non-null type javax.swing.JPanel");
}
jpanel = (JPanel)component1;
} else {
component1 = pane.getComponent(0);
if (component1 == null) {
throw new TypeCastException("null cannot be cast to non-null type javax.swing.JPanel");
}
jpanel = (JPanel)component1;
}
JPanel panel = jpanel;
layoutManager = panel.getLayout();
if (layoutManager == null) {
throw new TypeCastException("null cannot be cast to non-null type java.awt.BorderLayout");
} else {
return panel;
}
}
}
}
} catch (ClassCastException var7) {
Throwable throwable = var7;
if (throwable == null) {
return null;
// throw new TypeCastException("null cannot be cast to non-null type java.lang.Throwable");
} else {
throwable.printStackTrace();
return null;
}
}
}
}
三、事件集合
1、选择事件:SelectionListener
SelectionListener selectionListener = (new SelectionListener() {
@Override
public final void selectionChanged(SelectionEvent it) {
Messages.showInfoMessage("1111", "3333");
}
});
2、文件监听事件:DocumentListener
DocumentListener documentAdapter= new DocumentAdapter() {
@Override
public void documentChanged(@Nullable DocumentEvent documentEvent) {
Messages.showInfoMessage("1111", "3333");
}
@Override
public void beforeDocumentChange(@NotNull DocumentEvent event) {
}
};
JTextField textField2=null;
textField2.getDocument().addDocumentListener(new javax.swing.event.DocumentListener() {
@Override
public void insertUpdate(javax.swing.event.DocumentEvent e) {
}
@Override
public void removeUpdate(javax.swing.event.DocumentEvent e) {
}
@Override
public void changedUpdate(javax.swing.event.DocumentEvent e) {
}
});
3、组件监听事件:ComponentListener
ComponentListener componentListener = new ComponentAdapter() {
@Override
public void componentResized(@Nullable ComponentEvent componentEvent) {
Messages.showInfoMessage("1111", "3333");
}
};
new JPanel().addComponentListener(componentListener);
4、鼠标点击监听器:MouseListener
5、鼠标移动事件:MouseMotionListener
6、鼠标滚轮事件:MouseWheelListener
7、文件编辑事件监听器:FileEditorManagerListener
8、编辑器视图监听器VisibleAreaListener
public class TestAction implements FileEditorManagerListener {
@Override
public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
FileEditor[] editors = source.getAllEditors();
for(int var5 = 0; var5 < editors.length; ++var5) {
FileEditor fileEditor = editors[var5];
Editor editor = ((TextEditor) fileEditor).getEditor();
VisibleAreaListener visibleAreaListener = new VisibleAreaListener() {
@Override
public void visibleAreaChanged(@NotNull VisibleAreaEvent visibleAreaEvent) {
}
};
editor.getScrollingModel().addVisibleAreaListener(visibleAreaListener);
}
四、文本编辑器滚动到指定位置
public class TestAction implements FileEditorManagerListener {
@Override
public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
FileEditor[] editors = source.getAllEditors();
for(int var5 = 0; var5 < editors.length; ++var5) {
FileEditor fileEditor = editors[var5];
Editor editor = ((TextEditor) fileEditor).getEditor();
// 滚动到第20字符的位置
editor.getScrollingModel().scrollVertically(20);
}
五、启用/禁用编辑器动画
public class TestAction implements FileEditorManagerListener { @Override public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { FileEditor[] editors = source.getAllEditors(); for(int var5 = 0; var5 < editors.length; ++var5) { FileEditor fileEditor = editors[var5]; Editor editor = ((TextEditor) fileEditor).getEditor(); // 滚动到第20字符的位置 editor.getScrollingModel().scrollVertically(20); editor.getScrollingModel().disableAnimation(); editor.getScrollingModel().enableAnimation();
五、改变鼠标形状
JPanel jpanel = new JPanel(new BorderLayout());
jpanel.setPreferredSize(new Dimension(800, 1000));
jpanel.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
if (e.getX() < 200) {
jpanel.setCursor(new Cursor(10));
} else if (e.getX() < 400) {
jpanel.setCursor(new Cursor(Cursor.HAND_CURSOR));
} else {
jpanel.setCursor(new Cursor(0));
}
}
});
六、获取语法的高亮颜色
public class TestAction implements FileEditorManagerListener {
private Project project;
@Override
public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) {
FileEditor[] editors = source.getAllEditors();
for(int var5 = 0; var5 < editors.length; ++var5) {
FileEditor fileEditor = editors[var5];
getColor(fileEditor);
}
private final int getColor(FileEditor fileEditor) {
Editor editor = ((TextEditor) fileEditor).getEditor();
EditorColorsScheme colorScheme = editor.getColorsScheme();
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
final SyntaxHighlighter hl = SyntaxHighlighterFactory.getSyntaxHighlighter(file.getLanguage(), this.project, file.getVirtualFile());
Lexer lexer = hl.getHighlightingLexer();
final String text = editor.getDocument().getText();
lexer.start(text);
for(IElementType tokenType = lexer.getTokenType(); tokenType != null; tokenType = lexer.getTokenType()) {
int color = colorScheme.getDefaultForeground().getRGB();
TextAttributesKey[] attributes = hl.getTokenHighlights(tokenType);
for(int var8 = 0; var8 < attributes.length; ++var8) {
TextAttributesKey attribute = attributes[var8];
TextAttributes attr = colorScheme.getAttributes(attribute);
if (attr != null) {
Color tmp = attr.getForegroundColor();
if (tmp != null) {
color = tmp.getRGB();
return color;
}
}
}
BufferedImage bufferedImage = new BufferedImage();
int[] array = new int[]{
(color & 16711680) >> 16, (color & '\uff00') >> 8, color & 255, (int) (0 * (float) 255)
};
bufferedImage.getRaster().setPixel(x, y, array);
}
return 0;
}
七、鼠标悬停时获取鼠标所在的的元素
实现接口DocumentationProviderEx
public class TranTest extends DocumentationProviderEx {
/**
* 在鼠标位置显示字符
*/
@Nullable
@Override
public String generateDoc(PsiElement element, @Nullable PsiElement originalElement) {
return "originalDoc";
}
}
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<lang.documentationProvider
language="JAVA" order="first"
implementationClass="core.TranTest"/>
</extensions>
八、在浏览器打开
Desktop.getDesktop().browse(uri);
九:java swing事件监听
registerKeyboardAction
getRootPane().registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AboutDialog.this.dispose();
}
}, KeyStroke.getKeyStroke(27, 0), 2);
addActionListener
buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
AboutDialog.this.onOK();
}
});
addHyperlinkListener
private class BrowseHyperlinkListener implements HyperlinkListener {
private BrowseHyperlinkListener() {
}
public void hyperlinkUpdate(HyperlinkEvent e) {
if (e.getEventType() == EventType.ACTIVATED && Desktop.isDesktopSupported()) {
try {
Desktop.getDesktop().browse(e.getURL().toURI());
} catch (IOException var3) {
AboutDialog.this.logger.warn("Exception browsing to " + e.getURL().toExternalForm() + " : " + var3);
} catch (URISyntaxException var4) {
AboutDialog.this.logger.warn("Incorrect URI syntax " + e.getURL().toExternalForm() + " : " + var4);
}
}
}
}
addAncestorListener
this.toolWindow.getComponent().addAncestorListener(this.plantUmlAncestorListener);
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.plantuml.idea.toolwindow.listener;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import org.plantuml.idea.lang.settings.PlantUmlSettings;
import org.plantuml.idea.rendering.LazyApplicationPoolExecutor.Delay;
import org.plantuml.idea.rendering.RenderCommand.Reason;
import org.plantuml.idea.toolwindow.PlantUmlToolWindow;
public class PlantUmlAncestorListener implements AncestorListener {
private static Logger logger = Logger.getInstance(PlantUmlAncestorListener.class);
private final PlantUmlSettings settings;
private PlantUmlToolWindow plantUmlToolWindow;
private Project project;
public PlantUmlAncestorListener(PlantUmlToolWindow plantUmlToolWindow, Project project) {
this.plantUmlToolWindow = plantUmlToolWindow;
this.project = project;
this.settings = PlantUmlSettings.getInstance();
}
public void ancestorAdded(AncestorEvent ancestorEvent) {
logger.debug("ancestorAdded ", new Object[]{this.project.getName()});
if (this.settings.isAutoRender()) {
this.plantUmlToolWindow.renderLater(Delay.POST_DELAY, Reason.FILE_SWITCHED);
}
}
public void ancestorRemoved(AncestorEvent event) {
}
public void ancestorMoved(AncestorEvent event) {
}
}
addAdjustmentListener
scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent adjustmentEvent) {
if (!adjustmentEvent.getValueIsAdjusting()) {
RenderCacheItem displayedItem = PlantUmlToolWindow.this.getDisplayedItem();
if (displayedItem != null && !displayedItem.getRenderResult().hasError()) {
PlantUmlToolWindow.this.lastValidVerticalScrollValue = adjustmentEvent.getValue();
}
}
}
});
scrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent adjustmentEvent) {
if (!adjustmentEvent.getValueIsAdjusting()) {
RenderCacheItem displayedItem = PlantUmlToolWindow.this.getDisplayedItem();
if (displayedItem != null && !displayedItem.getRenderResult().hasError()) {
PlantUmlToolWindow.this.lastValidHorizontalScrollValue = adjustmentEvent.getValue();
}
}
}
});
addMouseWheelListener
panel.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
if (e.isControlDown()) {
PlantUmlToolWindow.this.setZoom(Math.max(PlantUmlToolWindow.this.zoom - e.getWheelRotation() * 10, 1));
} else {
e.setSource(PlantUmlToolWindow.this.scrollPane);
PlantUmlToolWindow.this.scrollPane.dispatchEvent(e);
}
}
有志之士,共同学习
浙公网安备 33010602011771号