How to display a warning at a specific line - intellij-idea

Quick Intellij plugin Development question.
Can somebody show me a snippet of code on how to display a warning at a specific line?
I want to display a yellow bulb and be able to alt enter.
I don't know if the yellow bulb is part of a warning or just a hint but i would very much appreciate if somebody would show me how to do it.
I tried to find it on idea plugin development but didn't have any luck
private List<PsiFile> psiFiles = new ArrayList<PsiFile>();
public void actionPerformed(AnActionEvent e) {
PsiManager psiManager=PsiManager.getInstance(e.getProject());
Project project = e.getProject();
VirtualFile srcFile;
if(e.getProject().getBaseDir().findChild("src") == null)
return;
else
{
srcFile = e.getProject().getBaseDir().findChild("src");
}
//using the buildFilesList i get all the .java files
buildFilesList(psiManager,srcFile);
for(PsiFile file : psiFiles)
//here i would want for a psiFile a warning to be displayed at a specific line
System.out.println(file);
}

What you need to write is an inspection. You don't need to enumerate the files in the project; IntelliJ IDEA will take care of calling your API at the correct moment. You can find a simple example of a plugin that implements an inspection here.

Related

Intellij Plugin - How to color project view files background?

As seen in the picture. Color Notification is colored. This is done by creating a scope and adding that file in that scope.
However I want to mark files according to my need. For example I will click that color notification and mark that file green or yellow.
I only need to know how I can reach this project view and alter background color programmatically.
I know there arent so many intellij plugin creators but still I will try my luck.
From my investigation there are FileColorManager, ProjectView, UIManager etc but I couldnt find which one is responsible for these color handling changes...
Just a guess. Have you tried to implement the com.intellij.ide.projectView.ProjectViewNodeDecorator extension point? It seems like this lets you decorate the nodes in the project view.
As we found out, setting the background-color is not easily possible. But you can add a string (like a checkmark) at the end of each node that you want to highlight. Here is an example:
public class ProvectViewColorer implements ProjectViewNodeDecorator {
#Override
public void decorate(ProjectViewNode node, PresentationData data) {
final VirtualFile virtualFile = node.getVirtualFile();
if (virtualFile != null && virtualFile.getFileType().equals(MathematicaFileType.INSTANCE)) {
data.setLocationString("✓");
}
}
#Override
public void decorate(PackageDependenciesNode node, ColoredTreeCellRenderer cellRenderer) {
}
}

intellij plugin using TreeClassChooserFactory not show recommended class?

I'm writing a intellij plugin to let people choose a class, I find the code the move method in intellij open source code.
The move method picture is like this which will show all project class.
but when I using the following code the pic is this
There is no recommend class, after I type some text, still nothing.
TreeClassChooser chooser = TreeClassChooserFactory.getInstance(myProject).createWithInnerClassesScopeChooser(
"choose serviceClass", GlobalSearchScope.projectScope(myProject), new ClassFilter() {
public boolean isAccepted(PsiClass aClass) {
return aClass.getParent() instanceof PsiFile && !aClass.isInterface();
}
}, srcClass);
chooser.selectDirectory(pojoClass.getContainingFile().getContainingDirectory());
chooser.showDialog();
That seems to be a bug in the IDE, fixed in the upcoming 2017.2 release.

JavaFX 8: How to automatically input a file on start-up?

I’m using JavaFX 8 and JDK 1.8.0_77 in IntelliJ with SceneBuilder. I created a basic pixel editor app. I have two windows(stages). One is a 32x128 matrix of Circle Objects placed in a Grid Pane and the other is a Message Center in Main.
You can see the Message Center window at: https://virtualartsite.wordpress.com/message-center/
I want to save messages using the Message Center app and scroll them on an RGB LED matrix that’s also 32x128. I save the messages in ArrayList<> of Message Objects and I write the ArrayList’s Message’s to a serialized file. I write the file calling writeObjArrayList () and input the file calling readObjArrayList().
I am able to write and read the file successfully and .add all the Message objects to the ArrayList on start-up so the user can edit or delete any message from the viewMessages ComboBox. BUT so far, I can only do so if I use a button event to call readObjArrayList(). This is the problem.
I want to read the file “behind the scenes”, when the app starts. I want to automatically read the file when the program starts up; the user shouldn’t have to click on a button.
My best idea was to use the following code which compiles but doesn’t appear to execute any code:
public void windowEvents(WindowEvent event){
if(event.getSource() == viewMessages) readObjArrayList();
}
I thought a WindowEvent would be fired with windowEvents=#OnShow for the ComboBox, viewMessages(FX:ID).
Please advise.
Thanks for your help.
According to the javadoc, the WindowEvent is related to Window showing/hiding actions. As Node classes aren't Windows, installing a WindowEvent handler on it won't have any effect.
Since you are using SceneBuilder, I assume that you must have an FXML file that has a fx:controller class defined. In any controller class, you can add a non-arg initialize() method which will be called right after the FXML file has been processed.
public class YourController {
#FXML
ComboBox viewMessages;
public void initialize() {
readObjArrayList();
}
private void readObjArrayList() {
...
}
}

Can't find system.out.println()

I created a project, it asked me to select JDK version and finish.
I couldn't find system namespace in autocomplete.
I typed it manually but IDEA told me that system doesn't exist.
It's System (with a cap)
Some very useful shortcuts:
soutm (+TAB) ==> System.out.println("Class.And.Method.Name")
soutv (+TAB) ==> System.out.println("Last variable used = " + value);
sout (+TAB) ==> System.out.println();
I really love IntelliJ. Glad I moved to it from Eclipse a couple of years ago ;)
Just type sout.
public class Main {
public static void main(String[] args) {
int data = 1;
System.out.println(); ===>sout
System.out.println("Main.main"); ===>soutm
System.out.println("args = [" + args + "]"); ===>soutp
System.out.println("data = " + data); ===>soutv
}
}
sout - just print System.out.println()
soutm - added Class name & method name
soutp - added parameter
soutv - added last variable name
We can change the auto complete settings to to ignore case. Go to:
File -> Settings... -> IDE Settings -> Editor -> Code Completion
and change 'Case sensitive completion' to 'None'.
I came from eclipse and was using the syso shortcut, so I have just added it to my live template. Here is a templete:
System.out.println($END$);
Here is a screenshot:
Don't forget to add Java as applicable context (at the bottom of the window).
Now it will appear as a hint while you typing syso here is a screenshot:
Hope it helps
This can also happen because user has not created any main function or trying to test this directly in class without any function

Dynamic label of a popup action in eclipse plugin development

I want to create a simple eclipse plugin, which does: When you right click a java project, it will show a popup menu which has a item has label "N java files found in this project", where "N" is the file count.
I have an idea that I can update the label in "selectionChanged":
public class CountAction implements IObjectActionDelegate {
public void selectionChanged(IAction action, ISelection selection) {
action.setText(countJavaFiles());
}
}
But it doesn't work if I don't click that menu item, since the CountAction has not been loaded, that selectionChanged won't be invoked when you right-click on the project.
I have spent a lot of time on this, but not solved. Please help me.
An alternative to the article suggested by #kett_chup, is to use IElementUpdater. Simply
your handler must implement IElementUpdater
the handler.updateElement((UIElement element, Map parameters) must set the wanted text using element.setText("new text") - this new text will show up in menus and toolbars
whenever you need/want to update the command text use ICommandService.refreshElements(String commandId, Map filter) with your particular command ID - the global command service usually is just fine
The IElementUpdater interface can also be used to change the checked state - for commands with style=toggle - as well as the icons and the tool tip.
At last, I found a very easy way to implement this:
I don't need to change my code(the sample code in question), but I need to add a small startup class:
import org.eclipse.ui.IStartup;
public class MyStartUp implements IStartup {
#Override
public void earlyStartup() {
// Initial the action
new CountAction();
}
}
And add following to plugin.xml:
<extension
point="org.eclipse.ui.startup">
<startup
class="myplugin.MyStartUp">
</startup>
This MyStartUp will load an instance of that action at startup, then selectionChanged will be invoked each time when I right-click the projects or files.