From 2a47a549d09be9790f9911afcfc612ce5e4e1933 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 26 Feb 2025 22:57:36 +0200 Subject: [PATCH 1/5] Enhance README table styling for improved presentation Updated the README contributor table with inline styles for better alignment, padding, and text formatting. Enhanced visual elements such as profile images, captions, and the "Support the Project" section to improve readability and user experience. --- README.md | 78 +++++++++++++++++++++++++++---------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) 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. + + - - + - - - - - - - - + - + + + + + + + From 5d9122e334651e3aed8d8b3e5be4e5873d548c0f Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 6 Mar 2025 21:23:06 +0200 Subject: [PATCH 2/5] 1263: Remove redundant field validation logic and enhance features. Refactored redundant `validateFormFields()` checks across multiple dialogs to streamline code execution and reduce duplication. Introduced Magento folder management via the project settings, added support for marking directories as Magento content roots, and updated icons and versioning. Enhanced workflow for plugin releases with GitHub Actions. --- .github/workflows/asset.yml | 36 +++++++ CHANGELOG.md | 2 +- gradle.properties | 4 +- .../idea/magento2plugin/MagentoIcons.java | 1 + .../MarkDirectoryAsMagentoContentRot.java | 85 ++++++++++++++++ .../UnmarkDirectoryAsMagentoContentRot.java | 83 ++++++++++++++++ .../actions/generation/NewModuleAction.java | 78 ++++++++------- .../generation/dialog/AbstractDialog.java | 4 +- .../dialog/CreateAPluginDialog.java | 40 ++++---- .../dialog/CreateAnObserverDialog.java | 35 ++++--- .../dialog/InjectAViewModelDialog.java | 6 -- .../dialog/NewArgumentInjectionDialog.java | 61 ++++++------ .../generation/dialog/NewBlockDialog.java | 7 +- .../dialog/NewCLICommandDialog.java | 10 +- .../dialog/NewControllerDialog.java | 7 +- .../generation/dialog/NewCronGroupDialog.java | 7 +- .../generation/dialog/NewCronjobDialog.java | 4 - .../generation/dialog/NewDataModelDialog.java | 14 ++- .../generation/dialog/NewDbSchemaDialog.java | 27 +++-- .../dialog/NewEmailTemplateDialog.java | 14 +-- .../generation/dialog/NewEntityDialog.java | 14 ++- .../dialog/NewGraphQlResolverDialog.java | 7 +- .../dialog/NewInterfaceForServiceDialog.java | 13 +-- .../dialog/NewLayoutTemplateDialog.java | 25 +++-- .../dialog/NewMessageQueueDialog.java | 21 ++-- .../generation/dialog/NewModelsDialog.java | 11 +-- .../generation/dialog/NewModuleDialog.java | 6 +- .../generation/dialog/NewObserverDialog.java | 76 +++++++------- .../dialog/NewSetupDataPatchDialog.java | 12 +-- .../dialog/NewUiComponentFormDialog.java | 18 ++-- .../dialog/NewUiComponentGridDialog.java | 21 ++-- .../generation/dialog/NewViewModelDialog.java | 7 +- .../dialog/NewWebApiDeclarationDialog.java | 10 +- .../OverrideClassByAPreferenceDialog.java | 5 - .../dialog/OverrideLayoutInThemeDialog.java | 10 +- .../dialog/OverrideTemplateInThemeDialog.java | 11 +-- .../eavattribute/EavAttributeDialog.java | 7 -- .../decorator/MagentoFolderDecorator.java | 39 ++++++++ .../generation/php/NewModuleForm.java | 2 +- .../magento2plugin/indexes/ModuleIndex.java | 39 +++----- .../idea/magento2plugin/project/Settings.java | 99 +++++++++++++++++-- .../magento2plugin/project/SettingsForm.java | 2 +- .../magento/IsFileInEditableModuleUtil.java | 49 +++++++-- .../util/magento/MagentoPathUrlUtil.java | 34 +++++++ src/main/resources/META-INF/plugin.xml | 12 ++- src/main/resources/icons/mark-as.svg | 3 + 46 files changed, 710 insertions(+), 368 deletions(-) create mode 100644 .github/workflows/asset.yml create mode 100644 src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java create mode 100644 src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java create mode 100644 src/main/java/com/magento/idea/magento2plugin/decorator/MagentoFolderDecorator.java create mode 100644 src/main/java/com/magento/idea/magento2plugin/util/magento/MagentoPathUrlUtil.java create mode 100644 src/main/resources/icons/mark-as.svg 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..ac0295967 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ 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 ### Fixed 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..9c84caa70 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(); + } } /** 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..1cbab91c1 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,47 @@ private IsFileInEditableModuleUtil() {} * @return boolean */ public static boolean execute(final PsiFile file) { - final String magentoPath = Settings.getMagentoPath(file.getProject()); - if (magentoPath == null) { + Project project = file.getProject(); + 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(Project project, VirtualFile virtualFile) { + Settings settings = Settings.getInstance(project); + List magentoToFolders = settings.getMagentoFolders(); + String magentoPathUrl = MagentoPathUrlUtil.execute(project); + if (magentoPathUrl != null) { + if (magentoToFolders == null) { + magentoToFolders = List.of( + magentoPathUrl + ); + } else { + magentoToFolders.add( + magentoPathUrl + ); + } + } + + + final String filePath = virtualFile.getUrl(); + + if (magentoToFolders == null) { return false; } - final String editablePath = magentoPath + File.separator + Package.packagesRoot; - final String filePath = file.getVirtualFile().getPath(); - return filePath.startsWith(editablePath); + for (String editablePath : magentoToFolders) { + if (filePath.startsWith(editablePath)) { + return true; + } + } + return false; } } 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 From 21972e7f8b4be011e8aaec9cb26875dc54f12f90 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 6 Mar 2025 21:30:45 +0200 Subject: [PATCH 3/5] 1263: CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac0295967..8f3dd4858 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0). ## 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 - Compatibility with PhpStorm/IntelliJ 2025.* [#2495](https://github.com/magento/magento2-phpstorm-plugin/pull/2495) From 82af1b29075b60fa737d84e75b81a6611df9ea71 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Fri, 7 Mar 2025 20:25:24 +0200 Subject: [PATCH 4/5] 1263: Refactor and enhance file path comparison logic Introduce helper method to normalize URLs for consistent comparison, ensuring accurate handling of schemes like "file://" or "temp://". Add `final` modifiers for variables to improve immutability and readability. --- .../magento/IsFileInEditableModuleUtil.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) 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 1cbab91c1..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 @@ -22,8 +22,8 @@ private IsFileInEditableModuleUtil() {} * @return boolean */ public static boolean execute(final PsiFile file) { - Project project = file.getProject(); - VirtualFile virtualFile = file.getVirtualFile(); + final Project project = file.getProject(); + final VirtualFile virtualFile = file.getVirtualFile(); return execute(project, virtualFile); } @@ -35,10 +35,10 @@ public static boolean execute(final PsiFile 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(Project project, VirtualFile virtualFile) { - Settings settings = Settings.getInstance(project); + public static boolean execute(final Project project, final VirtualFile virtualFile) { + final Settings settings = Settings.getInstance(project); List magentoToFolders = settings.getMagentoFolders(); - String magentoPathUrl = MagentoPathUrlUtil.execute(project); + final String magentoPathUrl = MagentoPathUrlUtil.execute(project); if (magentoPathUrl != null) { if (magentoToFolders == null) { magentoToFolders = List.of( @@ -52,17 +52,31 @@ public static boolean execute(Project project, VirtualFile virtualFile) { } - final String filePath = virtualFile.getUrl(); if (magentoToFolders == null) { return false; } - for (String editablePath : magentoToFolders) { - if (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; + } } From 5bd9238b8a85326b2cb1586e0cd4f1a54c782a5a Mon Sep 17 00:00:00 2001 From: vitaliy Date: Fri, 7 Mar 2025 20:35:44 +0200 Subject: [PATCH 5/5] 1263: Use `this` as the parent component for error dialogs Previously, null was passed as the parent component, which could cause dialog positioning issues. Using `this` ensures the dialog is properly tied to the current window. This improves the user interface consistency and behavior. --- .../actions/generation/dialog/AbstractDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9c84caa70..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 @@ -218,7 +218,7 @@ protected void showErrorMessage(final String errorMessage) { return; } JOptionPane.showMessageDialog( - null, + this, errorMessage, errorTitle, JOptionPane.ERROR_MESSAGE
+ PhpStorm IDE Plugin for a better Magento 2 development workflow.
- Version 2025.0.0 - Contributors +
+ Version 2025.0.0 - Contributors
- - Contributor 1 -
- Yevhen Zvieriev -
-
- - Contributor 2 -
- Mykola Silin -
-
- - Contributor 3 -
- Vitalii Boiko -
-
-

Support the Project

+
+ + Yevhen Zvieriev +
+ Yevhen Zvieriev +
+
+ + Mykola Silin +
+ Mykola Silin +
+
+ + Vitalii Boiko +
+ Vitalii Boiko +
+
+

Support the Project

If you find this plugin helpful and want to support its development, consider buying the contributors a coffee:

- - Buy Me a Coffee + + Buy Me 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