Skip to content

Commit 19a7791

Browse files
authored
Merge pull request #1157 from bohdan-harniuk/1156-fix-readme-md-template-is-not-working-for-project-lvl
1156: Fixed README.md template include is not working for project level
2 parents a1aef14 + 684d27c commit 19a7791

File tree

3 files changed

+211
-22
lines changed

3 files changed

+211
-22
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.context;
7+
8+
import com.intellij.openapi.actionSystem.AnAction;
9+
import com.intellij.openapi.actionSystem.AnActionEvent;
10+
import com.intellij.openapi.project.Project;
11+
import com.intellij.openapi.util.NlsActions;
12+
import com.intellij.psi.PsiDirectory;
13+
import com.intellij.psi.PsiFile;
14+
import com.magento.idea.magento2plugin.MagentoIcons;
15+
import com.magento.idea.magento2plugin.actions.context.util.GetTargetElementUtil;
16+
import com.magento.idea.magento2plugin.project.Settings;
17+
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
18+
import org.jetbrains.annotations.NotNull;
19+
import org.jetbrains.annotations.Nullable;
20+
21+
public abstract class CustomGeneratorContextAction extends AnAction {
22+
23+
private @Nullable GetMagentoModuleUtil.MagentoModuleData moduleData;
24+
private @Nullable PsiDirectory directory;
25+
private @Nullable PsiFile file;
26+
27+
/**
28+
* Abstract context action with custom generation constructor.
29+
*
30+
* @param text String
31+
* @param description String
32+
*/
33+
public CustomGeneratorContextAction(
34+
final @Nullable @NlsActions.ActionText String text,
35+
final @Nullable @NlsActions.ActionDescription String description
36+
) {
37+
super(text, description, MagentoIcons.MODULE);
38+
}
39+
40+
@Override
41+
public void update(final @NotNull AnActionEvent event) {
42+
setIsAvailableForEvent(event, false);
43+
final Project project = event.getProject();
44+
45+
if (project == null || !Settings.isEnabled(project)) {
46+
return;
47+
}
48+
final PsiDirectory targetDirectory = GetTargetElementUtil.getDirFromEvent(event);
49+
50+
if (targetDirectory == null) {
51+
return;
52+
}
53+
final GetMagentoModuleUtil.MagentoModuleData magentoModuleData = GetMagentoModuleUtil
54+
.getByContext(targetDirectory, project);
55+
final PsiFile targetFile = GetTargetElementUtil.getFileFromEvent(event);
56+
57+
if (magentoModuleData == null
58+
|| magentoModuleData.getName() == null
59+
|| !isVisible(magentoModuleData, targetDirectory, targetFile)) {
60+
return;
61+
}
62+
directory = targetDirectory;
63+
file = targetFile;
64+
moduleData = magentoModuleData;
65+
setIsAvailableForEvent(event, true);
66+
}
67+
68+
/**
69+
* Get clicked on module data object.
70+
*
71+
* @return GetMagentoModuleUtil.MagentoModuleData
72+
*/
73+
public @Nullable GetMagentoModuleUtil.MagentoModuleData getModuleData() {
74+
return moduleData;
75+
}
76+
77+
public @Nullable PsiDirectory getDirectory() {
78+
return directory;
79+
}
80+
81+
public @Nullable PsiFile getFile() {
82+
return file;
83+
}
84+
85+
/**
86+
* Implement check if an action should be shown in the context defined by the module,
87+
* target directory or target file.
88+
*
89+
* @param moduleData GetMagentoModuleUtil.MagentoModuleData
90+
* @param targetDirectory PsiDirectory
91+
* @param targetFile PsiFile
92+
*
93+
* @return boolean
94+
*/
95+
protected abstract boolean isVisible(
96+
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
97+
final PsiDirectory targetDirectory,
98+
final PsiFile targetFile
99+
);
100+
101+
/**
102+
* Set is action available for event.
103+
*
104+
* @param event AnActionEvent
105+
* @param isAvailable boolean
106+
*/
107+
private void setIsAvailableForEvent(
108+
final @NotNull AnActionEvent event,
109+
final boolean isAvailable
110+
) {
111+
event.getPresentation().setVisible(isAvailable);
112+
event.getPresentation().setEnabled(isAvailable);
113+
}
114+
}

src/com/magento/idea/magento2plugin/actions/context/md/NewReadmeMdAction.java

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,50 @@
55

66
package com.magento.idea.magento2plugin.actions.context.md;
77

8-
import com.intellij.ide.fileTemplates.actions.AttributesDefaults;
8+
import com.intellij.openapi.actionSystem.AnActionEvent;
99
import com.intellij.psi.PsiDirectory;
1010
import com.intellij.psi.PsiFile;
1111
import com.intellij.util.IncorrectOperationException;
12-
import com.magento.idea.magento2plugin.actions.context.AbstractContextAction;
12+
import com.magento.idea.magento2plugin.actions.context.CustomGeneratorContextAction;
13+
import com.magento.idea.magento2plugin.actions.generation.data.ModuleReadmeMdData;
14+
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleReadmeMdGenerator;
1315
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
1416
import com.magento.idea.magento2plugin.magento.files.ModuleReadmeMdFile;
1517
import com.magento.idea.magento2plugin.magento.packages.ComponentType;
1618
import com.magento.idea.magento2plugin.magento.packages.Package;
1719
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
1820
import org.jetbrains.annotations.NotNull;
1921

20-
public class NewReadmeMdAction extends AbstractContextAction {
22+
public class NewReadmeMdAction extends CustomGeneratorContextAction {
2123

2224
public static final String ACTION_NAME = "Magento 2 README File";
2325
public static final String ACTION_DESCRIPTION = "Create a new Magento 2 README file";
2426

2527
public NewReadmeMdAction() {
26-
super(ACTION_NAME, ACTION_DESCRIPTION, new ModuleReadmeMdFile());
28+
super(ACTION_NAME, ACTION_DESCRIPTION);
29+
}
30+
31+
@Override
32+
public void actionPerformed(final @NotNull AnActionEvent event) {
33+
final GetMagentoModuleUtil.MagentoModuleData moduleData = getModuleData();
34+
35+
if (event.getProject() == null || moduleData == null || getDirectory() == null) {
36+
return;
37+
}
38+
final String[] templateData = moduleData.getName().split(Package.vendorModuleNameSeparator);
39+
40+
if (templateData.length != 2) { //NOPMD
41+
return;
42+
}
43+
final ModuleReadmeMdGenerator generator = new ModuleReadmeMdGenerator(
44+
new ModuleReadmeMdData(
45+
templateData[0],
46+
templateData[1],
47+
getDirectory()
48+
),
49+
event.getProject()
50+
);
51+
generator.generate(ACTION_NAME, true);
2752
}
2853

2954
@Override
@@ -37,27 +62,15 @@ protected boolean isVisible(
3762
}
3863
final PsiDirectory moduleDirectory = new ModuleIndex(targetDirectory.getProject())
3964
.getModuleDirectoryByModuleName(moduleData.getName());
40-
final String magentoModuleName = moduleData
41-
.getName()
42-
.split(Package.vendorModuleNameSeparator)[1];
4365

44-
return targetDirectory.getName().equals(magentoModuleName)
45-
&& targetDirectory.equals(moduleDirectory)
46-
&& this.isFileCanBeCreated(moduleDirectory);
47-
}
48-
49-
@Override
50-
protected AttributesDefaults getProperties(
51-
final @NotNull AttributesDefaults defaults,
52-
final @NotNull GetMagentoModuleUtil.MagentoModuleData moduleData,
53-
final PsiDirectory targetDirectory,
54-
final PsiFile targetFile
55-
) {
66+
if (moduleDirectory == null) {
67+
return false;
68+
}
5669
final String[] templateData = moduleData.getName().split(Package.vendorModuleNameSeparator);
57-
defaults.addPredefined("PACKAGE", templateData[0]);
58-
defaults.addPredefined("MODULE_NAME", templateData[1]);
5970

60-
return defaults;
71+
return templateData.length == 2
72+
&& targetDirectory.equals(moduleDirectory)
73+
&& isFileCanBeCreated(moduleDirectory);
6174
}
6275

6376
private @NotNull Boolean isFileCanBeCreated(
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.actions.context.util;
7+
8+
import com.intellij.openapi.actionSystem.AnActionEvent;
9+
import com.intellij.openapi.actionSystem.LangDataKeys;
10+
import com.intellij.psi.PsiDirectory;
11+
import com.intellij.psi.PsiElement;
12+
import com.intellij.psi.PsiFile;
13+
import org.jetbrains.annotations.NotNull;
14+
import org.jetbrains.annotations.Nullable;
15+
16+
public final class GetTargetElementUtil {
17+
18+
private GetTargetElementUtil() {}
19+
20+
/**
21+
* Get clicked on directory from the action event.
22+
*
23+
* @param event AnActionEvent
24+
*
25+
* @return PsiDirectory
26+
*/
27+
public static @Nullable PsiDirectory getDirFromEvent(final @NotNull AnActionEvent event) {
28+
final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(event.getDataContext());
29+
30+
if (targetElement == null) {
31+
return null;
32+
}
33+
PsiDirectory targetDirectory = null;
34+
PsiFile targetFile;
35+
36+
if (targetElement instanceof PsiDirectory) {
37+
targetDirectory = (PsiDirectory) targetElement;
38+
} else if (targetElement instanceof PsiFile) {
39+
targetFile = (PsiFile) targetElement;
40+
targetDirectory = targetFile.getContainingDirectory();
41+
}
42+
43+
return targetDirectory;
44+
}
45+
46+
/**
47+
* Get clicked on file from the action event.
48+
*
49+
* @param event AnActionEvent
50+
*
51+
* @return PsiDirectory
52+
*/
53+
public static @Nullable PsiFile getFileFromEvent(final @NotNull AnActionEvent event) {
54+
final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(event.getDataContext());
55+
56+
if (targetElement == null) {
57+
return null;
58+
}
59+
60+
return targetElement instanceof PsiFile ? (PsiFile) targetElement : null;
61+
}
62+
}

0 commit comments

Comments
 (0)