Javafx: New FXML file template (IDEA-106502)

This commit is contained in:
Pavel Dolgov
2016-12-21 14:50:31 +03:00
parent da5b0e05d8
commit 9a0cd86ff2
6 changed files with 134 additions and 3 deletions
@@ -33,6 +33,7 @@ import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.FilenameIndex;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
@@ -93,7 +94,7 @@ public class CreateModuleInfoAction extends CreateFromTemplateActionBase {
}
@Override
protected Map<String, String> getLiveTemplateDefaults(@NotNull DataContext ctx) {
protected Map<String, String> getLiveTemplateDefaults(@NotNull DataContext ctx, @NotNull PsiFile file) {
Module module = LangDataKeys.MODULE.getData(ctx);
return Collections.singletonMap("MODULE_NAME", module != null ? StringUtil.sanitizeJavaIdentifier(module.getName()) : "module_name");
}
@@ -71,7 +71,7 @@ public abstract class CreateFromTemplateActionBase extends AnAction {
elementCreated(dialog, createdElement);
view.selectElement(createdElement);
if (selectedTemplate.isLiveTemplateEnabled() && createdElement instanceof PsiFile) {
Map<String, String> defaultValues = getLiveTemplateDefaults(dataContext);
Map<String, String> defaultValues = getLiveTemplateDefaults(dataContext, ((PsiFile)createdElement));
startLiveTemplate((PsiFile)createdElement, notNull(defaultValues, Collections.emptyMap()));
}
}
@@ -129,7 +129,7 @@ public abstract class CreateFromTemplateActionBase extends AnAction {
protected void elementCreated(CreateFromTemplateDialog dialog, PsiElement createdElement) { }
@Nullable
protected Map<String, String> getLiveTemplateDefaults(DataContext dataContext) {
protected Map<String, String> getLiveTemplateDefaults(DataContext dataContext, @NotNull PsiFile file) {
return null;
}
}
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="#[[$CONTROLLER_NAME$]]#"
prefHeight="400.0" prefWidth="600.0" >
</AnchorPane>
@@ -0,0 +1,5 @@
<html>
<body>
This is a built-in template for FXML file.
</body>
</html>
@@ -79,5 +79,8 @@
<add-to-group group-id="EditorTabPopupMenu" anchor="last"/>
<add-to-group group-id="ProjectViewPopupMenu" anchor="last"/>
</action>
<action class="org.jetbrains.plugins.javaFX.actions.CreateFxmlFileAction" id="NewFxmlFile">
<add-to-group group-id="NewGroup" anchor="after" relative-to-action="NewDir"/>
</action>
</actions>
</idea-plugin>
@@ -0,0 +1,108 @@
/*
* Copyright 2000-2016 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 org.jetbrains.plugins.javaFX.actions;
import com.intellij.icons.AllIcons;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory;
import java.util.Collections;
import java.util.Map;
/**
* @author pdolgov
*/
public class CreateFxmlFileAction extends CreateFromTemplateActionBase {
private static final String INTERNAL_TEMPLATE_NAME = "FxmlFile.fxml";
public CreateFxmlFileAction() {
super("FXML File", "Create New FXML File", AllIcons.FileTypes.Xml);
}
@Override
protected FileTemplate getTemplate(Project project, PsiDirectory dir) {
return FileTemplateManager.getInstance(project).getInternalTemplate(INTERNAL_TEMPLATE_NAME);
}
@Nullable
@Override
protected Map<String, String> getLiveTemplateDefaults(DataContext dataContext, @NotNull PsiFile file) {
String packageName = ApplicationManager.getApplication().runReadAction((Computable<String>)() -> {
PsiDirectory psiDirectory = file.getContainingDirectory();
if (psiDirectory != null) {
VirtualFile vDirectory = psiDirectory.getVirtualFile();
ProjectFileIndex index = ProjectRootManager.getInstance(file.getProject()).getFileIndex();
if (index.isInSourceContent(vDirectory)) {
return index.getPackageNameByDirectory(vDirectory);
}
}
return null;
});
@NonNls String name = file.getName();
name = PathUtil.getFileName(name);
if (JavaFxFileTypeFactory.FXML_EXTENSION.equals(PathUtil.getFileExtension(name))) {
name = name.substring(0, name.length() - JavaFxFileTypeFactory.FXML_EXTENSION.length() - 1);
}
name = toClassName(name);
name = !StringUtil.isEmpty(packageName) ? packageName + "." + name : name;
return Collections.singletonMap("CONTROLLER_NAME", name);
}
private static String toClassName(String name) {
int start;
for (start = 0; start < name.length(); start++) {
char c = name.charAt(start);
if (Character.isJavaIdentifierStart(c) && c != '_' && c != '$') {
break;
}
}
StringBuilder className = new StringBuilder();
boolean skip = true;
for (int i = start; i < name.length(); i++) {
char c = name.charAt(i);
if (!Character.isJavaIdentifierPart(c) || c == '_' || c == '$') {
skip = true;
continue;
}
if (skip) {
skip = false;
className.append(Character.toUpperCase(c));
}
else {
className.append(c);
}
}
return className.toString();
}
}