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. + + - - + - - - - - - - - + - + + + + + + + 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
+ 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