diff --git a/.github/workflows/asset.yml b/.github/workflows/asset.yml
new file mode 100644
index 000000000..73549919d
--- /dev/null
+++ b/.github/workflows/asset.yml
@@ -0,0 +1,36 @@
+# This workflow will build a package using Gradle and then save it to Assets
+
+name: Build Asset
+
+on:
+ release:
+ types: [created]
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up JDK 17
+ uses: actions/setup-java@v3
+ with:
+ java-version: 17
+ distribution: 'temurin'
+ cache: gradle
+ - name: Gradle wrapper
+ run: gradle wrapper
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+
+ - name: Build Plugin
+ run: ./gradlew buildPlugin
+
+ - name: Upload Plugin to Release Assets
+ uses: actions/upload-release-asset@v1
+ with:
+ upload_url: ${{ github.event.release.upload_url }}
+ asset_path: ./build/distributions/PhpStorm Magento 2 Plugin-${{ github.event.release.tag_name }}.zip
+ asset_name: PhpStorm Magento 2 Plugin-${{ github.event.release.tag_name }}.zip
+ asset_content_type: application/zip-archive
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 36edcc350..8f3dd4858 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,11 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0).
-## 2025.0.1
+## 2025.1.0
+
+### Added
+
+- Possibility to add additional code source directories using content root feature [#2504](https://github.com/magento/magento2-phpstorm-plugin/pull/2504)
### Fixed
diff --git a/README.md b/README.md
index 20e56b464..85a5ae4ef 100644
--- a/README.md
+++ b/README.md
@@ -7,53 +7,53 @@
# PhpStorm Magento 2 Plugin
-
-
-This is a PhpStorm IDE plugin for a better Magento 2 development workflow.
+
+
+ PhpStorm IDE Plugin for a better Magento 2 development workflow.
-
-
- Version 2025.0.0 - Contributors
+ |
+
+ Version 2025.0.0 - Contributors
|
-
-
-
-
-
-
- Yevhen Zvieriev
-
- |
-
-
-
-
- Mykola Silin
-
- |
-
-
-
-
- Vitalii Boiko
-
- |
-
-
-
+
-
- Support the Project
+ |
+
+
+
+ Yevhen Zvieriev
+
+ |
+
+
+
+
+ Mykola Silin
+
+ |
+
+
+
+
+ Vitalii Boiko
+
+ |
+
+
+
+
+
+ Support the Project
If you find this plugin helpful and want to support its development, consider buying the contributors a coffee:
-
-
+
+
- Thank you to our sponsors—your support means everything:
- Lucas van Staden
- Ivan Chepurnyi
+ Thank you to our sponsors—your support means everything:
+ Lucas van Staden
+ Ivan Chepurnyi
|
diff --git a/gradle.properties b/gradle.properties
index 8597e8be4..42f4a4657 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,8 @@
pluginGroup = com.magento.idea.magento2plugin
pluginName = Magento PhpStorm
pluginRepositoryUrl = https://github.com/magento/magento2-phpstorm-plugin
-pluginVersion = 2025.0.1
-pluginSinceBuild = 233
+pluginVersion = 2025.1.0
+pluginSinceBuild = 243.3
pluginUntilBuild = 258.*
platformType = PS
platformVersion = 2024.3
diff --git a/src/main/java/com/magento/idea/magento2plugin/MagentoIcons.java b/src/main/java/com/magento/idea/magento2plugin/MagentoIcons.java
index a360d9b18..5e0b4a059 100644
--- a/src/main/java/com/magento/idea/magento2plugin/MagentoIcons.java
+++ b/src/main/java/com/magento/idea/magento2plugin/MagentoIcons.java
@@ -18,4 +18,5 @@ public class MagentoIcons {
public static final Icon PLUGIN_ICON_MEDIUM =
IconLoader.getIcon("/icons/pluginIcon64x64.svg", MagentoIcons.class);
public static final Icon GRAPHQL = IconLoader.getIcon("/icons/graphql.svg", MagentoIcons.class);
+ public static final Icon MARK_AS = IconLoader.getIcon("/icons/mark-as.svg", MagentoIcons.class);
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java
new file mode 100644
index 000000000..4ca1c305e
--- /dev/null
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.content.root;
+
+import com.intellij.ide.projectView.ProjectView;
+import com.intellij.ide.projectView.actions.MarkRootActionBase;
+import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ContentEntry;
+import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiElement;
+import com.magento.idea.magento2plugin.MagentoIcons;
+import com.magento.idea.magento2plugin.project.Settings;
+import com.magento.idea.magento2plugin.util.magento.MagentoPathUrlUtil;
+import org.jetbrains.annotations.NotNull;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class MarkDirectoryAsMagentoContentRot extends MarkRootActionBase {
+ private Project project;
+
+ public MarkDirectoryAsMagentoContentRot() {
+ super();
+ final Presentation presentation = this.getTemplatePresentation();
+ presentation.setIcon(MagentoIcons.MARK_AS);
+ }
+
+ @Override
+ protected void modifyRoots(final VirtualFile virtualFile, ContentEntry contentEntry) {
+ if (project != null) {
+ final Settings settings = Settings.getInstance(project);
+ Settings.getInstance(project).addMagentoFolder(virtualFile.getUrl());
+ if (settings.getMagentoFolders() != null) {
+ settings.getMagentoFolders().removeIf(folder -> {
+ final VirtualFile file;
+ try {
+ file = VfsUtil.findFileByURL(new URL(folder));
+ } catch (MalformedURLException e) {
+ return false;
+ }
+ return file == null || !file.exists();
+ });
+ }
+
+ ProjectView.getInstance(project).refresh();
+ }
+ }
+
+ @Override
+ public void update(@NotNull final AnActionEvent event) {
+ final DataContext context = event.getDataContext();
+ final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(context);
+ final Module module = event.getData(PlatformCoreDataKeys.MODULE);
+ if (module != null) {
+ project = module.getProject();
+ }
+
+ if (targetElement instanceof PsiDirectory) {
+ final Settings settings = Settings.getInstance(project);
+ final String magentoPathUrl = MagentoPathUrlUtil.execute(project);
+ final String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl();
+ if (magentoPathUrl != null && magentoPathUrl.equals(directoryUrl)) {
+ event.getPresentation().setEnabledAndVisible(false);
+ return;
+ }
+ if (!settings.containsMagentoFolder(directoryUrl)) {
+ event.getPresentation().setEnabledAndVisible(true);
+ return;
+ }
+ }
+
+ event.getPresentation().setEnabledAndVisible(false);
+ }
+
+ @Override
+ protected boolean isEnabled(@NotNull RootsSelection rootsSelection, @NotNull Module module) {
+ return false;
+ }
+}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java
new file mode 100644
index 000000000..67216c2df
--- /dev/null
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.actions.content.root;
+
+import com.intellij.ide.projectView.ProjectView;
+import com.intellij.ide.projectView.actions.MarkRootActionBase;
+import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ContentEntry;
+import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiElement;
+import com.magento.idea.magento2plugin.project.Settings;
+import com.magento.idea.magento2plugin.util.magento.MagentoPathUrlUtil;
+import org.jetbrains.annotations.NotNull;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class UnmarkDirectoryAsMagentoContentRot extends MarkRootActionBase {
+ private Project project;
+
+ public UnmarkDirectoryAsMagentoContentRot() {
+ super();
+ }
+
+ @Override
+ protected void modifyRoots(VirtualFile virtualFile, ContentEntry contentEntry) {
+ if (project != null) {
+ Settings settings = Settings.getInstance(project);
+ Settings.getInstance(project).removeMagentoFolder(virtualFile.getUrl());
+ if (settings.getMagentoFolders() != null) {
+ settings.getMagentoFolders().removeIf(folder -> {
+ VirtualFile file = null;
+ try {
+ file = VfsUtil.findFileByURL(new URL(folder));
+ } catch (MalformedURLException e) {
+ return false;
+ }
+ return file == null || !file.exists();
+ });
+ }
+
+ ProjectView.getInstance(project).refresh();
+ }
+ }
+
+ @Override
+ public void update(@NotNull AnActionEvent event) {
+ final DataContext context = event.getDataContext();
+ final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(context);
+ Module module = event.getData(PlatformCoreDataKeys.MODULE);
+ if (module != null) {
+ project = module.getProject();
+ }
+
+ if (targetElement instanceof PsiDirectory) {
+ Settings settings = Settings.getInstance(project);
+ String magentoPathUrl = MagentoPathUrlUtil.execute(project);
+ String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl();
+ if (magentoPathUrl != null && magentoPathUrl.equals(directoryUrl)) {
+ event.getPresentation().setEnabledAndVisible(false);
+ return;
+ }
+
+ if (settings.containsMagentoFolder(directoryUrl)) {
+ event.getPresentation().setEnabledAndVisible(true);
+ return;
+ }
+ }
+
+ event.getPresentation().setEnabledAndVisible(false);
+ }
+
+ @Override
+ protected boolean isEnabled(@NotNull RootsSelection rootsSelection, @NotNull Module module) {
+ return false;
+ }
+}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/NewModuleAction.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/NewModuleAction.java
index ada004716..daa51c868 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/NewModuleAction.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/NewModuleAction.java
@@ -20,6 +20,7 @@
import com.magento.idea.magento2plugin.actions.generation.util.IsClickedDirectoryInsideProject;
import com.magento.idea.magento2plugin.project.Settings;
import com.magento.idea.magento2plugin.util.magento.GetModuleNameByDirectoryUtil;
+import com.magento.idea.magento2plugin.util.magento.IsFileInEditableModuleUtil;
import com.magento.idea.magento2plugin.util.magento.MagentoBasePathUtil;
import org.jetbrains.annotations.NotNull;
@@ -72,45 +73,56 @@ public void update(final AnActionEvent event) {
return;
}
- if (Settings.isEnabled(project)) {
- final String magentoPath = Settings.getMagentoPath(project);
- if (magentoPath == null) {
- event.getPresentation().setVisible(false);
- return;
- }
- final PsiElement psiElement = event.getData(PlatformDataKeys.PSI_ELEMENT);
- if (!(psiElement instanceof PsiDirectory)) {
- event.getPresentation().setVisible(false);
- return;
- }
-
- if (!IsClickedDirectoryInsideProject.getInstance().execute(
- project,
- (PsiDirectory) psiElement)
- ) {
- event.getPresentation().setVisible(false);
- return;
- }
+ if (!Settings.isEnabled(project)) {
+ event.getPresentation().setVisible(false);
+ }
+ final String magentoPath = Settings.getMagentoPath(project);
+ if (magentoPath == null) {
+ event.getPresentation().setVisible(false);
+ return;
+ }
+ final PsiElement psiElement = event.getData(PlatformDataKeys.PSI_ELEMENT);
+ if (!(psiElement instanceof PsiDirectory)) {
+ event.getPresentation().setVisible(false);
+ return;
+ }
- final String moduleName = GetModuleNameByDirectoryUtil
- .execute((PsiDirectory) psiElement, project);
- if (moduleName == null) {
- final String sourceDirPath = ((PsiDirectory) psiElement).getVirtualFile().getPath();
- final boolean isCustomCodeSourceDirValid =
- MagentoBasePathUtil.isCustomCodeSourceDirValid(sourceDirPath);
- final boolean isCustomVendorDirValid =
- MagentoBasePathUtil.isCustomVendorDirValid(sourceDirPath);
+ if (!IsClickedDirectoryInsideProject.getInstance().execute(
+ project,
+ (PsiDirectory) psiElement)
+ ) {
+ event.getPresentation().setVisible(false);
+ return;
+ }
- if (!isCustomCodeSourceDirValid && !isCustomVendorDirValid) { //NOPMD
- event.getPresentation().setVisible(false);
- return;
- }
- event.getPresentation().setVisible(true);
+ final String moduleName = GetModuleNameByDirectoryUtil
+ .execute((PsiDirectory) psiElement, project);
+ if (moduleName == null) {
+ if (showAction(project, (PsiDirectory) psiElement)) {
+ event.getPresentation().setVisible(false);
return;
}
+ event.getPresentation().setVisible(true);
}
+ }
+
+ /**
+ * Determines whether the "Show Action" operation should be displayed
+ *
+ * @param project the current project
+ * @param psiElement the directory
+ * @return true if the action can be displayed; false otherwise
+ */
+ private static boolean showAction(final Project project, final PsiDirectory psiElement) {
+ final String sourceDirPath = psiElement.getVirtualFile().getPath();
+ final boolean isCustomCodeSourceDirValid =
+ MagentoBasePathUtil.isCustomCodeSourceDirValid(sourceDirPath);
+ final boolean isCustomVendorDirValid =
+ MagentoBasePathUtil.isCustomVendorDirValid(sourceDirPath);
- event.getPresentation().setVisible(false);
+ return !isCustomCodeSourceDirValid
+ && !isCustomVendorDirValid
+ && !IsFileInEditableModuleUtil.execute(project, psiElement.getVirtualFile());
}
@Override
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/AbstractDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/AbstractDialog.java
index eea0070c8..b2a9af39b 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/AbstractDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/AbstractDialog.java
@@ -97,7 +97,9 @@ protected final void executeOnOk() {
* Hook executed when the OK button is pressed.
*/
protected final void onOK() {
- executeOnOk();
+ if (validateFormFields()) {
+ executeOnOk();
+ }
}
/**
@@ -216,7 +218,7 @@ protected void showErrorMessage(final String errorMessage) {
return;
}
JOptionPane.showMessageDialog(
- null,
+ this,
errorMessage,
errorTitle,
JOptionPane.ERROR_MESSAGE
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.java
index b532c0f70..c727712c8 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.java
@@ -175,27 +175,25 @@ protected void onWriteActionOK() {
if (targetMethod == null) {
targetMethod = getSelectedTargetMethod();
}
- if (validateFormFields()) {
- new PluginClassGenerator(new PluginFileData(
- getPluginDirectory(),
- getPluginClassName(),
- getPluginType(),
- getPluginModule(),
- targetClass,
- targetMethod,
- getPluginClassFqn(),
- getNamespace()
- ), project).generate(CreateAPluginAction.ACTION_NAME, true);
-
- new PluginDiXmlGenerator(new PluginDiXmlData(
- getPluginArea(),
- getPluginModule(),
- targetClass,
- getPluginSortOrder(),
- getPluginName(),
- getPluginClassFqn()
- ), project).generate(CreateAPluginAction.ACTION_NAME);
- }
+ new PluginClassGenerator(new PluginFileData(
+ getPluginDirectory(),
+ getPluginClassName(),
+ getPluginType(),
+ getPluginModule(),
+ targetClass,
+ targetMethod,
+ getPluginClassFqn(),
+ getNamespace()
+ ), project).generate(CreateAPluginAction.ACTION_NAME, true);
+
+ new PluginDiXmlGenerator(new PluginDiXmlData(
+ getPluginArea(),
+ getPluginModule(),
+ targetClass,
+ getPluginSortOrder(),
+ getPluginName(),
+ getPluginClassFqn()
+ ), project).generate(CreateAPluginAction.ACTION_NAME);
exit();
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAnObserverDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAnObserverDialog.java
index 9a25ece3c..63c06470d 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAnObserverDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAnObserverDialog.java
@@ -150,24 +150,23 @@ private void fillTargetAreaOptions() {
* Perform code generation using input data.
*/
protected void onWriteActionOK() {
- if (validateFormFields()) {
- new ObserverClassGenerator(new ObserverFileData(
- getObserverDirectory(),
- getObserverClassName(),
- getObserverModule(),
- targetEvent,
- getObserverClassFqn(),
- getNamespace()
- ), project).generate(CreateAnObserverAction.ACTION_NAME, true);
-
- new ObserverEventsXmlGenerator(new ObserverEventsXmlData(
- getObserverArea(),
- getObserverModule(),
- targetEvent,
- getObserverName(),
- getObserverClassFqn()
- ), project).generate(CreateAPluginAction.ACTION_NAME);
- }
+ new ObserverClassGenerator(new ObserverFileData(
+ getObserverDirectory(),
+ getObserverClassName(),
+ getObserverModule(),
+ targetEvent,
+ getObserverClassFqn(),
+ getNamespace()
+ ), project).generate(CreateAnObserverAction.ACTION_NAME, true);
+
+ new ObserverEventsXmlGenerator(new ObserverEventsXmlData(
+ getObserverArea(),
+ getObserverModule(),
+ targetEvent,
+ getObserverName(),
+ getObserverClassFqn()
+ ), project).generate(CreateAPluginAction.ACTION_NAME);
+
exit();
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/InjectAViewModelDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/InjectAViewModelDialog.java
index 234550bb9..316b6c8c7 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/InjectAViewModelDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/InjectAViewModelDialog.java
@@ -137,12 +137,6 @@ protected void updateArgumentText() {
}
protected void onWriteActionOK() {
-
- if (!validateFormFields()) {
- exit();
- return;
- }
-
if (targetBlockTag.getContainingFile() == null
|| targetBlockTag.getContainingFile().getParent() == null) {
return;
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewArgumentInjectionDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewArgumentInjectionDialog.java
index adc60b35b..7599dce4f 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewArgumentInjectionDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewArgumentInjectionDialog.java
@@ -364,43 +364,40 @@ public static void open(
* Fire generation process if all fields are valid.
*/
protected void onWriteActionOK() {
+ final DiArgumentData data = getDialogDataObject();
- if (validateFormFields()) {
- final DiArgumentData data = getDialogDataObject();
-
- if (data == null) {
- return;
- }
- final ArgumentInjectionGenerator generator = new ArgumentInjectionGenerator(
- data,
- project
- );
+ if (data == null) {
+ return;
+ }
+ final ArgumentInjectionGenerator generator = new ArgumentInjectionGenerator(
+ data,
+ project
+ );
- final PsiFile generatedFile = generator.generate(
- InjectConstructorArgumentAction.ACTION_NAME,
- true
- );
+ final PsiFile generatedFile = generator.generate(
+ InjectConstructorArgumentAction.ACTION_NAME,
+ true
+ );
- if (generatedFile == null) {
- if (generator.getGenerationErrorMessage() == null) {
- showErrorMessage(
- new ValidatorBundle().message(
- "validator.file.cantBeCreated",
- "DI XML file"
- )
- );
- } else {
- showErrorMessage(
- new ValidatorBundle().message(
- "validator.file.cantBeCreatedWithException",
- "DI XML file",
- generator.getGenerationErrorMessage()
- )
- );
- }
+ if (generatedFile == null) {
+ if (generator.getGenerationErrorMessage() == null) {
+ showErrorMessage(
+ new ValidatorBundle().message(
+ "validator.file.cantBeCreated",
+ "DI XML file"
+ )
+ );
+ } else {
+ showErrorMessage(
+ new ValidatorBundle().message(
+ "validator.file.cantBeCreatedWithException",
+ "DI XML file",
+ generator.getGenerationErrorMessage()
+ )
+ );
}
- exit();
}
+ exit();
}
/**
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewBlockDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewBlockDialog.java
index 3dac3f064..bde6a9a4a 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewBlockDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewBlockDialog.java
@@ -112,11 +112,8 @@ public static void open(final Project project, final PsiDirectory directory) {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateFile();
- exit();
- }
+ generateFile();
+ exit();
}
private void generateFile() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCLICommandDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCLICommandDialog.java
index c2e4c513b..b90199442 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCLICommandDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCLICommandDialog.java
@@ -191,11 +191,13 @@ public String getCLICommandClassFqn() {
}
protected void onWriteActionOK() {
+ this.generate();
+ exit();
+ }
- if (validateFormFields() && isPHPClassValid()) {
- this.generate();
- exit();
- }
+ @Override
+ protected boolean validateFormFields() {
+ return super.validateFormFields() && isPHPClassValid();
}
private Boolean isPHPClassValid() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewControllerDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewControllerDialog.java
index 79f67c63a..19a562284 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewControllerDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewControllerDialog.java
@@ -199,11 +199,8 @@ public static void open(final Project project, final PsiDirectory directory) {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateFile();
- exit();
- }
+ generateFile();
+ exit();
}
/**
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronGroupDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronGroupDialog.java
index 37dddae97..1a90b96f0 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronGroupDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronGroupDialog.java
@@ -142,11 +142,8 @@ public static void open(final Project project, final PsiDirectory directory) {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateFile();
- exit();
- }
+ generateFile();
+ exit();
}
private void generateFile() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronjobDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronjobDialog.java
index b8080691d..f2db9e980 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronjobDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewCronjobDialog.java
@@ -290,10 +290,6 @@ private String suggestCronjobName(final String cronjobClassname) {
* When new cronjob dialog is filled, validate the input data and generate a new cronjob.
*/
protected void onWriteActionOK() {
-
- if (!validateFormFields()) {
- return;
- }
final NamespaceBuilder namespaceBuilder = new NamespaceBuilder(
this.getCronjobModule(),
this.getCronjobClassName(),
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDataModelDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDataModelDialog.java
index 718a1337c..932aaa277 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDataModelDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDataModelDialog.java
@@ -149,16 +149,14 @@ protected void onWriteActionOK() {
propertyTable.getCellEditor().stopCellEditing();
}
- if (validateFormFields()) {
- formatProperties();
- generateDataModelFile();
+ formatProperties();
+ generateDataModelFile();
- if (createInterface.isSelected()) {
- generateDataModelInterfaceFile();
- generatePreferenceForInterface();
- }
- exit();
+ if (createInterface.isSelected()) {
+ generateDataModelInterfaceFile();
+ generatePreferenceForInterface();
}
+ exit();
}
@Override
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDbSchemaDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDbSchemaDialog.java
index fa946e778..bb048e498 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDbSchemaDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewDbSchemaDialog.java
@@ -134,27 +134,24 @@ public void windowClosing(final WindowEvent event) {
* On buttonOK action listener.
*/
protected void onWriteActionOK() {
-
if (columnsTable.isEditing()) {
columnsTable.getCellEditor().stopCellEditing();
}
- if (validateFormFields()) {
- final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData(
- getTableName(),
- getTableResource(),
- getTableEngine(),
- getTableComment(),
- getColumns()
- );
- final PsiFile dbSchemaXmlFile = generateDbSchemaXmlFile(dbSchemaXmlData);
+ final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData(
+ getTableName(),
+ getTableResource(),
+ getTableEngine(),
+ getTableComment(),
+ getColumns()
+ );
+ final PsiFile dbSchemaXmlFile = generateDbSchemaXmlFile(dbSchemaXmlData);
- if (dbSchemaXmlFile == null) {
- return;
- }
- generateWhitelistJsonFile(dbSchemaXmlData);
- exit();
+ if (dbSchemaXmlFile == null) {
+ return;
}
+ generateWhitelistJsonFile(dbSchemaXmlData);
+ exit();
}
/**
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEmailTemplateDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEmailTemplateDialog.java
index 70ba3bdfa..8ff41ca92 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEmailTemplateDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEmailTemplateDialog.java
@@ -213,16 +213,18 @@ private String getModuleName() {
}
protected void onWriteActionOK() {
-
- final boolean emailTemplateCanBeDeclared = !this.validator.validate(this);
-
- if (!validateFormFields() || emailTemplateCanBeDeclared) {
- return;
- }
generateFile();
exit();
}
+ @Override
+ protected boolean validateFormFields() {
+ if (!this.validator.validate(this)) {
+ return false;
+ }
+ return super.validateFormFields();
+ }
+
private void generateFile() {
final ModuleEmailTemplateHtmlGenerator moduleEmailTemplateHtmlGenerator;
moduleEmailTemplateHtmlGenerator = new ModuleEmailTemplateHtmlGenerator(
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEntityDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEntityDialog.java
index 1c78bdb2c..6a068732b 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEntityDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewEntityDialog.java
@@ -394,11 +394,6 @@ private void generateNewEntityFiles(final @NotNull ActionEvent event) {
* Perform code generation using input data.
*/
protected void onWriteActionOK() {
-
- if (!validateFormFields()) {
- onOkActionFired.setInProgress(false);
- return;
- }
setCursor(new Cursor(Cursor.WAIT_CURSOR));
formatProperties();
@@ -427,6 +422,15 @@ protected void onWriteActionOK() {
onOkActionFired.setFinished(true);
}
+ @Override
+ protected boolean validateFormFields() {
+ if (!super.validateFormFields()) {
+ onOkActionFired.setInProgress(false);
+ return false;
+ }
+ return true;
+ }
+
/**
* Release dialog buttons and hide.
*/
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewGraphQlResolverDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewGraphQlResolverDialog.java
index 59e2c088b..13f467c98 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewGraphQlResolverDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewGraphQlResolverDialog.java
@@ -122,11 +122,8 @@ public static void open(final Project project, final PsiDirectory directory) {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateFile();
- exit();
- }
+ generateFile();
+ exit();
}
private void generateFile() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewInterfaceForServiceDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewInterfaceForServiceDialog.java
index 4c7c43314..a3275cc69 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewInterfaceForServiceDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewInterfaceForServiceDialog.java
@@ -170,15 +170,12 @@ private void fillPredefinedValuesAndDisableInputs() {
* Fire generation process if all fields are valid.
*/
protected void onWriteActionOK() {
+ final WebApiInterfaceData data = getDialogDataObject();
- if (validateFormFields()) {
- final WebApiInterfaceData data = getDialogDataObject();
-
- new WebApiInterfaceGenerator(
- data,
- project
- ).generate(NewWebApiInterfaceAction.ACTION_NAME, true);
- }
+ new WebApiInterfaceGenerator(
+ data,
+ project
+ ).generate(NewWebApiInterfaceAction.ACTION_NAME, true);
exit();
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewLayoutTemplateDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewLayoutTemplateDialog.java
index a8c72c375..8f76987b5 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewLayoutTemplateDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewLayoutTemplateDialog.java
@@ -122,20 +122,17 @@ public static void open(final Project project, final PsiDirectory directory) {
* Handles the action performed when the OK button is clicked in the dialog.
*/
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- final String[] layoutNameParts = getLayoutNameParts();
- final LayoutXmlData layoutXmlData = new LayoutXmlData(
- getArea(),
- layoutNameParts[0],
- moduleName,
- layoutNameParts[1],
- layoutNameParts[2]
- );
- new LayoutXmlTemplateGenerator(layoutXmlData, project)
- .generate(NewLayoutXmlAction.ACTION_NAME, true);
- exit();
- }
+ final String[] layoutNameParts = getLayoutNameParts();
+ final LayoutXmlData layoutXmlData = new LayoutXmlData(
+ getArea(),
+ layoutNameParts[0],
+ moduleName,
+ layoutNameParts[1],
+ layoutNameParts[2]
+ );
+ new LayoutXmlTemplateGenerator(layoutXmlData, project)
+ .generate(NewLayoutXmlAction.ACTION_NAME, true);
+ exit();
}
@SuppressWarnings({"PMD.UnusedPrivateMethod", "PMD.AvoidInstantiatingObjectsInLoops"})
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewMessageQueueDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewMessageQueueDialog.java
index d2d651989..99569c28c 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewMessageQueueDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewMessageQueueDialog.java
@@ -256,19 +256,16 @@ public static void open(
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateCommunication();
- generateConsumer();
- generateTopology();
- generatePublisher();
- generateHandlerClass();
-
- if (getConnectionName().equals(MessageQueueConnections.DB.getType())) {
- generateConsumerClass();
- }
- exit();
+ generateCommunication();
+ generateConsumer();
+ generateTopology();
+ generatePublisher();
+ generateHandlerClass();
+
+ if (getConnectionName().equals(MessageQueueConnections.DB.getType())) {
+ generateConsumerClass();
}
+ exit();
}
private void generateCommunication() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java
index b4f41c25c..b30c084a2 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModelsDialog.java
@@ -173,13 +173,10 @@ public static void open(
* Process generation.
*/
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateModelFile();
- generateResourceModelFile();
- generateCollectionFile();
- exit();
- }
+ generateModelFile();
+ generateResourceModelFile();
+ generateCollectionFile();
+ exit();
}
/**
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java
index 1ed2bd046..c4bf662b6 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java
@@ -179,11 +179,7 @@ private void detectPackageName(final @NotNull PsiDirectory initialBaseDir) {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateFiles();
- }
- exit();
+ generateFiles();
}
private void generateFiles() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewObserverDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewObserverDialog.java
index 533e6ef30..0c0fce903 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewObserverDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewObserverDialog.java
@@ -199,48 +199,46 @@ public String getDirectoryStructure() {
}
protected void onWriteActionOK() {
+ PsiDirectory observerDirectory = baseDir;
- if (validateFields()) {
- PsiDirectory observerDirectory = baseDir;
-
- if (!getDirectoryStructure().isEmpty()) {
- observerDirectory = DirectoryGenerator.getInstance().findOrCreateSubdirectories(
- baseDir,
- getDirectoryStructure()
- );
- }
- new ModuleObserverGenerator(
- new ModuleObserverData(
- modulePackage,
- moduleName,
- getObserverClassFqn(),
- getEventName(),
- observerDirectory,
- ModuleObserverFile.resolveClassNameFromInput(getClassName())
- ),
- project
- ).generate(NewObserverAction.ACTION_NAME, true);
-
- new ObserverEventsXmlGenerator(
- new ObserverEventsXmlData(
- getObserverArea(),
- getModuleName().replace(
- Package.fqnSeparator,
- Package.vendorModuleNameSeparator
- ),
- getEventName(),
- getObserverName(),
- getObserverClassFqn().concat(Package.fqnSeparator).concat(
- ModuleObserverFile.resolveClassNameFromInput(getClassName())
- )
- ),
- project
- ).generate(NewObserverAction.ACTION_NAME);
- exit();
+ if (!getDirectoryStructure().isEmpty()) {
+ observerDirectory = DirectoryGenerator.getInstance().findOrCreateSubdirectories(
+ baseDir,
+ getDirectoryStructure()
+ );
}
+ new ModuleObserverGenerator(
+ new ModuleObserverData(
+ modulePackage,
+ moduleName,
+ getObserverClassFqn(),
+ getEventName(),
+ observerDirectory,
+ ModuleObserverFile.resolveClassNameFromInput(getClassName())
+ ),
+ project
+ ).generate(NewObserverAction.ACTION_NAME, true);
+
+ new ObserverEventsXmlGenerator(
+ new ObserverEventsXmlData(
+ getObserverArea(),
+ getModuleName().replace(
+ Package.fqnSeparator,
+ Package.vendorModuleNameSeparator
+ ),
+ getEventName(),
+ getObserverName(),
+ getObserverClassFqn().concat(Package.fqnSeparator).concat(
+ ModuleObserverFile.resolveClassNameFromInput(getClassName())
+ )
+ ),
+ project
+ ).generate(NewObserverAction.ACTION_NAME);
+ exit();
}
- private boolean validateFields() {
+ @Override
+ protected boolean validateFormFields() {
final PsiFile[] directoryFiles = getDirectoryFiles(baseDir);
final Field classNameField = GetReflectionFieldUtil.getByName("className", this.getClass());
@@ -276,7 +274,7 @@ private boolean validateFields() {
return false;
}
- return validateFormFields();
+ return super.validateFormFields();
}
private PsiFile[] getDirectoryFiles(final PsiDirectory targetDirectory) {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewSetupDataPatchDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewSetupDataPatchDialog.java
index 4c751cc7e..9af505a39 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewSetupDataPatchDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewSetupDataPatchDialog.java
@@ -124,11 +124,8 @@ public static void open(
* Fire generation process if all fields are valid.
*/
protected void onWriteActionOK() {
-
- if (validateFields()) {
- generateFile();
- exit();
- }
+ generateFile();
+ exit();
}
private void generateFile() {
@@ -155,7 +152,8 @@ public String getClassName() {
return className.getText().trim();
}
- private boolean validateFields() {
+ @Override
+ protected boolean validateFormFields() {
final PsiDirectory patchDirectory = baseDir
.findSubdirectory(NewSetupDataPatchAction.PATCH_DIRECTORY);
PsiDirectory directory = null;
@@ -179,6 +177,6 @@ private boolean validateFields() {
}
}
- return validateFormFields();
+ return super.validateFormFields();
}
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentFormDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentFormDialog.java
index 5417a00e7..7327446ca 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentFormDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentFormDialog.java
@@ -437,16 +437,14 @@ protected void onWriteActionOK() {
fields.getCellEditor().stopCellEditing();
}
- if (validateFormFields()) {
- generateRoutesXmlFile();
- generateViewControllerFile();
- generateSubmitControllerFile();
- generateDataProviderFile();
- generateLayoutFile();
- generateFormFile();
- generateAclXmlFile();
- exit();
- }
+ generateRoutesXmlFile();
+ generateViewControllerFile();
+ generateSubmitControllerFile();
+ generateDataProviderFile();
+ generateLayoutFile();
+ generateFormFile();
+ generateAclXmlFile();
+ exit();
}
/**
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentGridDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentGridDialog.java
index 568870bc9..c4059f1ee 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentGridDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewUiComponentGridDialog.java
@@ -322,18 +322,15 @@ protected void onCancel() {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateViewControllerFile();
- generateLayoutFile();
- generateMenuFile();
- generateAclXmlFile();
- generateRoutesXmlFile();
- generateDataProviderClass();
- generateDataProviderDeclaration();
- generateUiComponentFile();
- exit();
- }
+ generateViewControllerFile();
+ generateLayoutFile();
+ generateMenuFile();
+ generateAclXmlFile();
+ generateRoutesXmlFile();
+ generateDataProviderClass();
+ generateDataProviderDeclaration();
+ generateUiComponentFile();
+ exit();
}
private void setDefaultValues() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewViewModelDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewViewModelDialog.java
index 02c0e3365..7072a4df3 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewViewModelDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewViewModelDialog.java
@@ -121,11 +121,8 @@ public static void open(final Project project, final PsiDirectory directory) {
}
protected void onWriteActionOK() {
-
- if (validateFormFields()) {
- generateFile();
- exit();
- }
+ generateFile();
+ exit();
}
private void generateFile() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewWebApiDeclarationDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewWebApiDeclarationDialog.java
index 6544a8fa5..cf3bd8a36 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewWebApiDeclarationDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewWebApiDeclarationDialog.java
@@ -141,13 +141,11 @@ public static void open(
* Fire generation process if all fields are valid.
*/
protected void onWriteActionOK() {
+ new WebApiDeclarationGenerator(
+ getDialogDataObject(),
+ project
+ ).generate(NewWebApiDeclarationAction.ACTION_NAME, true);
- if (validateFormFields()) {
- new WebApiDeclarationGenerator(
- getDialogDataObject(),
- project
- ).generate(NewWebApiDeclarationAction.ACTION_NAME, true);
- }
exit();
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideClassByAPreferenceDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideClassByAPreferenceDialog.java
index 157f3b65a..55af630a2 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideClassByAPreferenceDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideClassByAPreferenceDialog.java
@@ -167,11 +167,6 @@ private void fillTargetAreaOptions() {
}
protected void onWriteActionOK() {
-
- if (!validateFormFields()) {
- exit();
- return;
- }
final PsiFile diXml = new PreferenceDiXmlGenerator(new PreferenceDiXmFileData(
getPreferenceModule(),
targetClass.getPresentableFQN(),
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideLayoutInThemeDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideLayoutInThemeDialog.java
index 9144a0d5e..a69b60586 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideLayoutInThemeDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideLayoutInThemeDialog.java
@@ -108,13 +108,11 @@ public static void open(final @NotNull Project project, final @NotNull PsiFile p
}
protected void onWriteActionOK() {
- if (validateFormFields()) {
- final OverrideLayoutInThemeGenerator overrideLayoutInThemeGenerator =
- new OverrideLayoutInThemeGenerator(project);
+ final OverrideLayoutInThemeGenerator overrideLayoutInThemeGenerator =
+ new OverrideLayoutInThemeGenerator(project);
- overrideLayoutInThemeGenerator.execute(psiFile, getTheme(), isOverride());
- exit();
- }
+ overrideLayoutInThemeGenerator.execute(psiFile, getTheme(), isOverride());
+ exit();
}
private String getTheme() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideTemplateInThemeDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideTemplateInThemeDialog.java
index 2a178b668..ef067ba34 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideTemplateInThemeDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/OverrideTemplateInThemeDialog.java
@@ -111,14 +111,11 @@ public static void open(final @NotNull Project project, final @NotNull PsiFile p
}
protected void onWriteActionOK() {
+ final OverrideTemplateInThemeGenerator overrideInThemeGenerator =
+ new OverrideTemplateInThemeGenerator(project);
- if (validateFormFields()) {
- final OverrideTemplateInThemeGenerator overrideInThemeGenerator =
- new OverrideTemplateInThemeGenerator(project);
-
- overrideInThemeGenerator.execute(psiFile, this.getTheme());
- exit();
- }
+ overrideInThemeGenerator.execute(psiFile, this.getTheme());
+ exit();
}
private String getTheme() {
diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/eavattribute/EavAttributeDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/eavattribute/EavAttributeDialog.java
index a9711b5f5..ff6d4b899 100644
--- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/eavattribute/EavAttributeDialog.java
+++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/eavattribute/EavAttributeDialog.java
@@ -256,15 +256,8 @@ protected void addActionListenersForOkCancel(final JButton cancelButton) {
}
protected void onWriteActionOK() {
-
stopOptionsTableEditing(getOptionsTable());
-
- if (!validateFormFields()) {
- return;
- }
-
generateExtraFilesBeforeDataPatchGeneration();
-
final EavEntityDataInterface eavEntityDataInterface = getEavEntityData();
generateDataPatchFile(eavEntityDataInterface);
generateExtraFilesAfterDataPatchGeneration(eavEntityDataInterface);
diff --git a/src/main/java/com/magento/idea/magento2plugin/decorator/MagentoFolderDecorator.java b/src/main/java/com/magento/idea/magento2plugin/decorator/MagentoFolderDecorator.java
new file mode 100644
index 000000000..f374f3b29
--- /dev/null
+++ b/src/main/java/com/magento/idea/magento2plugin/decorator/MagentoFolderDecorator.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+package com.magento.idea.magento2plugin.decorator;
+
+import com.intellij.ide.projectView.PresentationData;
+import com.intellij.ide.projectView.ProjectViewNode;
+import com.intellij.ide.projectView.ProjectViewNodeDecorator;
+import com.intellij.openapi.project.Project;
+ import com.intellij.psi.PsiDirectory;
+import com.magento.idea.magento2plugin.MagentoIcons;
+import com.magento.idea.magento2plugin.project.Settings;
+import com.magento.idea.magento2plugin.util.magento.MagentoPathUrlUtil;
+
+public class MagentoFolderDecorator implements ProjectViewNodeDecorator {
+ @Override
+ public void decorate(
+ final ProjectViewNode> projectViewNode,
+ final PresentationData presentationData
+ ) {
+ final Project project = projectViewNode.getProject();
+ if (project == null) {
+ return;
+ }
+ final Settings settings = Settings.getInstance(project);
+
+ final Object value = projectViewNode.getValue();
+ if (value instanceof PsiDirectory virtualFile) {
+ final String directoryUrl = virtualFile.getVirtualFile().getUrl();
+ final String magentoPathUrl = MagentoPathUrlUtil.execute(project);
+ if (settings.containsMagentoFolder(directoryUrl) ||
+ directoryUrl.equals(magentoPathUrl)) {
+ presentationData.setIcon(MagentoIcons.MARK_AS);
+ }
+ }
+ }
+}
+
diff --git a/src/main/java/com/magento/idea/magento2plugin/generation/php/NewModuleForm.java b/src/main/java/com/magento/idea/magento2plugin/generation/php/NewModuleForm.java
index 9148328aa..41d76b053 100644
--- a/src/main/java/com/magento/idea/magento2plugin/generation/php/NewModuleForm.java
+++ b/src/main/java/com/magento/idea/magento2plugin/generation/php/NewModuleForm.java
@@ -114,7 +114,7 @@ public MagentoProjectGeneratorSettings getSettings() {
final Settings.State state = new Settings.State();
state.setPluginEnabled(true);
state.setMftfSupportEnabled(true);
- state.setDefaultLicenseName(Settings.defaultLicense);
+ state.setDefaultLicenseName(Settings.DEFAULT_LICENSE);
state.setMagentoPathAndUpdateLastUsed(this.magentoPath.getTextField().getText().trim());
return new MagentoProjectGeneratorSettings(
diff --git a/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java b/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java
index f3dfe5021..2f6361f2e 100644
--- a/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java
+++ b/src/main/java/com/magento/idea/magento2plugin/indexes/ModuleIndex.java
@@ -7,23 +7,19 @@
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.indexing.FileBasedIndex;
import com.jetbrains.php.lang.PhpFileType;
-import com.magento.idea.magento2plugin.magento.packages.Package;
-import com.magento.idea.magento2plugin.project.util.GetProjectBasePath;
import com.magento.idea.magento2plugin.stubs.indexes.ModuleNameIndex;
import com.magento.idea.magento2plugin.util.RegExUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import com.magento.idea.magento2plugin.util.magento.IsFileInEditableModuleUtil;
import org.jetbrains.annotations.Nullable;
public final class ModuleIndex {
@@ -40,41 +36,38 @@ public ModuleIndex(final Project project) {
}
public List getEditableModuleNames() {
- return getModuleNames(Package.vendor, true);
+ return getModuleNames(true);
}
public List getEditableThemeNames() {
- return getThemeNames("/" + Package.vendor + "/magento/|/tests/|/test/", true);
+ return getThemeNames(true);
}
public List getModuleNames() {
- return getModuleNames("/tests/|/test/", false);
+ return getModuleNames(false);
}
/**
* Returns Module Names.
*
- * @param filterPattern String
* @param withinProject boolean
* @return List
*/
- public List getModuleNames(final String filterPattern, final boolean withinProject) {
- return getNames(filterPattern, withinProject, RegExUtil.Magento.MODULE_NAME);
+ public List getModuleNames(final boolean withinProject) {
+ return getNames(withinProject, RegExUtil.Magento.MODULE_NAME);
}
/**
* Returns Theme Names.
*
- * @param filterPattern String
* @param withinProject boolean
* @return List
*/
- public List getThemeNames(final String filterPattern, final boolean withinProject) {
- return getNames(filterPattern, withinProject, RegExUtil.Magento.THEME_NAME);
+ public List getThemeNames(final boolean withinProject) {
+ return getNames(withinProject, RegExUtil.Magento.THEME_NAME);
}
private List getNames(
- final String filterPattern,
final boolean withinProject,
final String pattern
) {
@@ -82,7 +75,6 @@ private List getNames(
.getInstance();
final List allModulesList = new ArrayList<>();
final Collection allModules = index.getAllKeys(ModuleNameIndex.KEY, project);
- final Pattern compiled = Pattern.compile(filterPattern);
for (final String moduleName : allModules) {
if (!moduleName.matches(pattern)) {
continue;
@@ -96,17 +88,14 @@ private List getNames(
if (files.isEmpty()) {
continue;
}
- final VirtualFile virtualFile = files.iterator().next();
- if (withinProject && !VfsUtilCore
- .isAncestor(GetProjectBasePath.execute(project), virtualFile, false)) {
- continue;
- }
+ for (final VirtualFile virtualFile : files) {
+ if (withinProject && !IsFileInEditableModuleUtil.execute(project, virtualFile)) {
+ continue;
+ }
- final Matcher matcher = compiled.matcher(virtualFile.getPath());
- if (matcher.find()) {
- continue;
+ allModulesList.add(moduleName);
+ break;
}
- allModulesList.add(moduleName);
}
Collections.sort(allModulesList);
return allModulesList;
diff --git a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java
index 14b39689e..a3ad1d46a 100644
--- a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java
+++ b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java
@@ -13,9 +13,12 @@
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.EventDispatcher;
+import com.intellij.util.SmartList;
import com.intellij.util.xmlb.annotations.Attribute;
import com.intellij.util.xmlb.annotations.Tag;
import java.util.EventListener;
+import java.util.List;
+import java.util.Objects;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -29,12 +32,14 @@ public class Settings implements PersistentStateComponent {
private final EventDispatcher myEventDispatcher
= EventDispatcher.create(MagentoModuleDataListener.class);
public boolean pluginEnabled;
- public static String defaultLicense = "Proprietary";
+ public String defaultLicense;
+ public static final String DEFAULT_LICENSE = "Proprietary";
public String magentoPath;
public boolean mftfSupportEnabled;
public boolean myDoNotAskContentConfigAgain;
public String magentoVersion;
public String magentoEdition;
+ public List myMagentoFolders;
@Override
@Nullable
@@ -42,11 +47,12 @@ public Settings.State getState() {
return new State(
this.pluginEnabled,
this.magentoPath,
- defaultLicense,
+ this.defaultLicense,
this.mftfSupportEnabled,
this.myDoNotAskContentConfigAgain,
this.magentoVersion,
- this.magentoEdition
+ this.magentoEdition,
+ this.myMagentoFolders
);
}
@@ -61,6 +67,55 @@ public void setState(final State state) {
this.notifyListeners(state, oldState);
}
+ /**
+ * Adds a Magento folder to the settings.
+ *
+ * @param folder Magento folder to add.
+ */
+ public void addMagentoFolder(@NotNull final String folder) {
+ if (this.myMagentoFolders == null) {
+ this.myMagentoFolders = new SmartList<>();
+ }
+
+ if (!this.myMagentoFolders.contains(folder)) {
+ final State oldState = this.getState();
+ this.myMagentoFolders.add(folder);
+ this.notifyListeners(Objects.requireNonNull(this.getState()), oldState);
+ }
+ }
+
+ /**
+ * Removes a Magento folder from the settings.
+ *
+ * @param folder Magento folder to remove.
+ */
+ public void removeMagentoFolder(@NotNull final String folder) {
+ if (this.myMagentoFolders != null && this.myMagentoFolders.contains(folder)) {
+ final State oldState = this.getState();
+ this.myMagentoFolders.remove(folder);
+ this.notifyListeners(Objects.requireNonNull(this.getState()), oldState);
+ }
+ }
+
+ /**
+ * Checks if a Magento folder exists in the settings.
+ *
+ * @param folder Magento folder to check.
+ * @return true if the folder exists, false otherwise.
+ */
+ public boolean containsMagentoFolder(@NotNull final String folder) {
+ return this.myMagentoFolders != null && this.myMagentoFolders.contains(folder);
+ }
+
+ /**
+ * Retrieves the list of Magento folders currently configured in the settings.
+ *
+ * @return a list of strings representing the paths of Magento folders.
+ */
+ public @Nullable List getMagentoFolders() {
+ return this.myMagentoFolders;
+ }
+
@Override
public void loadState(final @NotNull Settings.State state) {
this.pluginEnabled = state.isPluginEnabled();
@@ -70,6 +125,7 @@ public void loadState(final @NotNull Settings.State state) {
this.myDoNotAskContentConfigAgain = state.isDoNotAskContentConfigAgain();
this.magentoVersion = state.getMagentoVersion();
this.magentoEdition = state.getMagentoEdition();
+ this.myMagentoFolders = state.getMagentoFolders();
}
public void addListener(final MagentoModuleDataListener listener) {
@@ -132,6 +188,7 @@ public static class State {
public boolean myDoNotAskContentConfigAgain;
public String magentoVersion;
public String magentoEdition;
+ public List myMagentoFolders;
public State() {//NOPMD
}
@@ -146,6 +203,7 @@ public State() {//NOPMD
* @param myDoNotAskContentConfigAgain boolean
* @param magentoVersion String
* @param magentoEdition String
+ * @param myMagentoFolders List
*/
public State(
final boolean pluginEnabled,
@@ -154,7 +212,8 @@ public State(
final boolean mftfSupportEnabled,
final boolean myDoNotAskContentConfigAgain,
final String magentoVersion,
- final String magentoEdition
+ final String magentoEdition,
+ final List myMagentoFolders
) {
this.pluginEnabled = pluginEnabled;
this.magentoPath = magentoPath;
@@ -163,6 +222,7 @@ public State(
this.myDoNotAskContentConfigAgain = myDoNotAskContentConfigAgain;
this.magentoVersion = magentoVersion;
this.magentoEdition = magentoEdition;
+ this.myMagentoFolders = myMagentoFolders;
}
@Attribute("enabled")
@@ -201,6 +261,24 @@ public void setMagentoEdition(final String magentoEdition) {
this.magentoEdition = magentoEdition;
}
+ public List getMagentoFolders() {
+ return this.myMagentoFolders;
+ }
+
+ @Tag("magentoFolders")
+ public void addMagentoFolder(final String magentoFolders) {
+ if (this.myMagentoFolders == null) {
+ this.myMagentoFolders = new SmartList<>();
+ }
+ this.myMagentoFolders.add(magentoFolders);
+ }
+
+ public void removeMagentoFolder(final String magentoFolders) {
+ if (this.myMagentoFolders != null) {
+ this.myMagentoFolders.remove(magentoFolders);
+ }
+ }
+
/**
* Last Used Magento Path setter.
*
@@ -234,7 +312,11 @@ public void setMftfSupportEnabled(final boolean mftfSupportEnabled) {
this.mftfSupportEnabled = mftfSupportEnabled;
}
- @SuppressWarnings({"PMD.ConfusingTernary"})
+ @SuppressWarnings({
+ "PMD.ConfusingTernary",
+ "PMD.CognitiveComplexity",
+ "PMD.CyclomaticComplexity"
+ })
@Override
public boolean equals(final Object objectToCompare) {
if (this == objectToCompare) {
@@ -249,6 +331,8 @@ public boolean equals(final Object objectToCompare) {
this.isDoNotAskContentConfigAgain() != state.isDoNotAskContentConfigAgain()
) {
return false;
+ } else if (!Objects.equals(this.myMagentoFolders, state.myMagentoFolders)) {
+ return false;
} else {
if (this.magentoPath != null) {
return this.magentoPath.equals(state.magentoPath);
@@ -272,8 +356,9 @@ public int hashCode() {
result = 31 * result + (this.isMftfSupportEnabled() ? 1 : 0);
result = 31 * result + (this.isDoNotAskContentConfigAgain() ? 1 : 0);
result = 31 * result + (
- this.defaultLicenseName != null ? this.defaultLicenseName.hashCode() : 0
- );
+ this.defaultLicenseName != null ? this.defaultLicenseName.hashCode() : 0
+ );
+ result = 31 * result + (this.myMagentoFolders != null ? this.myMagentoFolders.hashCode() : 0);
return result;
}
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java
index eb1d5d33e..2427acaf4 100644
--- a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java
+++ b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java
@@ -121,7 +121,7 @@ protected void reindex() {
@Override
public boolean isModified() {
final boolean licenseChanged = !moduleDefaultLicenseName.getText().equals(
- Settings.defaultLicense
+ getSettings().defaultLicense
);
final boolean versionChanged = !magentoVersion.getText().equals(
getSettings().magentoVersion
diff --git a/src/main/java/com/magento/idea/magento2plugin/util/magento/IsFileInEditableModuleUtil.java b/src/main/java/com/magento/idea/magento2plugin/util/magento/IsFileInEditableModuleUtil.java
index dd485e815..a9f789fef 100644
--- a/src/main/java/com/magento/idea/magento2plugin/util/magento/IsFileInEditableModuleUtil.java
+++ b/src/main/java/com/magento/idea/magento2plugin/util/magento/IsFileInEditableModuleUtil.java
@@ -5,10 +5,11 @@
package com.magento.idea.magento2plugin.util.magento;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
-import com.magento.idea.magento2plugin.magento.packages.File;
-import com.magento.idea.magento2plugin.magento.packages.Package;
import com.magento.idea.magento2plugin.project.Settings;
+import java.util.List;
public final class IsFileInEditableModuleUtil {
@@ -21,13 +22,61 @@ private IsFileInEditableModuleUtil() {}
* @return boolean
*/
public static boolean execute(final PsiFile file) {
- final String magentoPath = Settings.getMagentoPath(file.getProject());
- if (magentoPath == null) {
+ final Project project = file.getProject();
+ final VirtualFile virtualFile = file.getVirtualFile();
+
+ return execute(project, virtualFile);
+ }
+
+ /**
+ * Validates if a given virtual file is located within editable paths defined by Magento project structure.
+ *
+ * @param project the current project containing the virtual file
+ * @param virtualFile the file to check against editable module directories
+ * @return true if the file is in an editable module directory, false otherwise
+ */
+ public static boolean execute(final Project project, final VirtualFile virtualFile) {
+ final Settings settings = Settings.getInstance(project);
+ List magentoToFolders = settings.getMagentoFolders();
+ final String magentoPathUrl = MagentoPathUrlUtil.execute(project);
+ if (magentoPathUrl != null) {
+ if (magentoToFolders == null) {
+ magentoToFolders = List.of(
+ magentoPathUrl
+ );
+ } else {
+ magentoToFolders.add(
+ magentoPathUrl
+ );
+ }
+ }
+
+
+
+ if (magentoToFolders == null) {
return false;
}
- final String editablePath = magentoPath + File.separator + Package.packagesRoot;
- final String filePath = file.getVirtualFile().getPath();
- return filePath.startsWith(editablePath);
+ final String filePath = virtualFile.getUrl();
+ for (final String editablePath : magentoToFolders) {
+ if (normalizeUrl(filePath).startsWith(normalizeUrl(editablePath))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Normalizes a URL by removing the scheme (e.g., temp://, file://) to allow proper comparisons.
+ *
+ * @param url the URL to normalize
+ * @return the normalized URL as a String
+ */
+ private static String normalizeUrl(final String url) {
+ final int schemeSeparatorIndex = url.indexOf("://");
+ if (schemeSeparatorIndex != -1) {
+ return url.substring(schemeSeparatorIndex + 3);
+ }
+ return url;
}
}
diff --git a/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoPathUrlUtil.java b/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoPathUrlUtil.java
new file mode 100644
index 000000000..bc808c2c2
--- /dev/null
+++ b/src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoPathUrlUtil.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+package com.magento.idea.magento2plugin.util.magento;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFileManager;
+import com.magento.idea.magento2plugin.magento.packages.File;
+import com.magento.idea.magento2plugin.magento.packages.Package;
+import com.magento.idea.magento2plugin.project.Settings;
+
+public class MagentoPathUrlUtil {
+ /**
+ * Constructs a file URL for the Magento packages root, based on the project settings.
+ *
+ * @param project the project instance
+ * @return the constructed file URL
+ */
+ public static String execute(Project project) {
+ String magentoPath = Settings.getMagentoPath(project);
+ if (magentoPath != null) {
+ return VirtualFileManager.constructUrl(
+ "file",
+ magentoPath
+ + File.separator
+ + Package.packagesRoot
+ );
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 52c63530e..ac35da6e7 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -7,7 +7,7 @@
com.magento.idea.magento2plugin
Magento PhpStorm
- 2025.0.1
+ 2025.1.0
Magento Inc.
com.intellij.css
com.intellij.modules.platform
com.intellij.platform.images
+ com.intellij.modules.json
com.intellij.copyright
com.intellij.lang.jsgraphql
@@ -173,6 +174,13 @@
+
+
+
+
+
+
+
@@ -692,6 +700,8 @@
+
+
diff --git a/src/main/resources/icons/mark-as.svg b/src/main/resources/icons/mark-as.svg
new file mode 100644
index 000000000..1eff856c1
--- /dev/null
+++ b/src/main/resources/icons/mark-as.svg
@@ -0,0 +1,3 @@
+
\ No newline at end of file