Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change overwrite templates feature for action menu #1036

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
1026: Code refactoring
bohdan-harniuk committed Mar 18, 2022
commit 22ed1c24c338064f088d0183c0ef406724aecfa5
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

package com.magento.idea.magento2plugin.actions.generation;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.magento.idea.magento2plugin.magento.packages.ComponentType;
import com.magento.idea.magento2plugin.magento.packages.Package;
import com.magento.idea.magento2plugin.project.Settings;
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
import javax.swing.Icon;
import org.jetbrains.annotations.NotNull;

public abstract class OverrideFileInThemeAction extends AnAction {

protected PsiFile psiFile;

/**
* Override file in theme action constructor.
*
* @param actionName String
* @param actionDescription String
* @param module Icon
*/
public OverrideFileInThemeAction(
final String actionName,
final String actionDescription,
final Icon module
) {
super(actionName, actionDescription, module);
}

/**
* Action entry point.
*
* @param event AnActionEvent
*/
@Override
public void update(final @NotNull AnActionEvent event) {
setStatus(event, false);
final Project project = event.getData(PlatformDataKeys.PROJECT);
final PsiFile targetFile = event.getData(PlatformDataKeys.PSI_FILE);

if (project == null || targetFile == null) {
return;
}

if (Settings.isEnabled(project) && isOverrideAllowed(targetFile, project)) {
setStatus(event, true);
psiFile = targetFile;
}
}

/**
* Implement this method to specify if override allowed for particular file types.
*
* @param file PsiFile
* @param project Project
*
* @return boolean
*/
protected abstract boolean isOverrideAllowed(
final @NotNull PsiFile file,
final @NotNull Project project
);

/**
* Check if file has a path specific to the Magento 2 module or theme.
*
* @param file PsiFile
* @param project Project
*
* @return boolean
*/
protected boolean isFileInModuleOrTheme(
final @NotNull PsiFile file,
final @NotNull Project project
) {
final GetMagentoModuleUtil.MagentoModuleData moduleData =
GetMagentoModuleUtil.getByContext(file.getContainingDirectory(), project);

if (moduleData == null) {
return false;
}
final VirtualFile virtualFile = file.getVirtualFile();

if (moduleData.getType().equals(ComponentType.module)) {
return virtualFile.getPath().contains("/" + Package.moduleViewDir + "/");
} else {
return moduleData.getType().equals(ComponentType.theme);
}
}

private void setStatus(final AnActionEvent event, final boolean status) {
event.getPresentation().setVisible(status);
event.getPresentation().setEnabled(status);
}
}
Original file line number Diff line number Diff line change
@@ -5,91 +5,55 @@

package com.magento.idea.magento2plugin.actions.generation;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.magento.idea.magento2plugin.MagentoIcons;
import com.magento.idea.magento2plugin.actions.generation.dialog.OverrideLayoutInThemeDialog;
import com.magento.idea.magento2plugin.magento.files.LayoutXml;
import com.magento.idea.magento2plugin.magento.files.UiComponentGridXmlFile;
import com.magento.idea.magento2plugin.magento.packages.ComponentType;
import com.magento.idea.magento2plugin.magento.packages.Package;
import com.magento.idea.magento2plugin.project.Settings;
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
import org.jetbrains.annotations.NotNull;

public class OverrideLayoutInThemeAction extends AnAction {
public class OverrideLayoutInThemeAction extends OverrideFileInThemeAction {

public static final String ACTION_NAME = "Override this layout in a project theme";
public static final String ACTION_DESCRIPTION = "Override layout in project theme";
private PsiFile psiFile;

public OverrideLayoutInThemeAction() {
super(ACTION_NAME, ACTION_DESCRIPTION, MagentoIcons.MODULE);
}

/**
* Action entry point.
*
* @param event AnActionEvent
*/
@Override
public void update(final @NotNull AnActionEvent event) {
boolean status = false;
final Project project = event.getData(PlatformDataKeys.PROJECT);
psiFile = event.getData(PlatformDataKeys.PSI_FILE);
public void actionPerformed(final @NotNull AnActionEvent event) {
final Project project = event.getProject();

if (Settings.isEnabled(project)) {
try {
status = isOverrideAllowed(
psiFile.getVirtualFile(),
project
);
} catch (NullPointerException e) { //NOPMD
// Ignore
}
if (project == null || psiFile == null) {
return;
}

this.setStatus(event, status);
OverrideLayoutInThemeDialog.open(project, psiFile);
}

private boolean isOverrideAllowed(final VirtualFile file, final Project project) {
if (file.isDirectory()) {
return false;
}
@Override
protected boolean isOverrideAllowed(
final @NotNull PsiFile file,
final @NotNull Project project
) {
final VirtualFile virtualFile = file.getVirtualFile();

if (!UiComponentGridXmlFile.FILE_EXTENSION
.equals(psiFile.getVirtualFile().getExtension())) {
if (virtualFile == null || virtualFile.isDirectory()) {
return false;
}

if (!LayoutXml.PARENT_DIR.equals(psiFile.getContainingDirectory().getName())
&& !LayoutXml.PAGE_LAYOUT_DIR.equals(psiFile.getContainingDirectory().getName())) {
if (!(file instanceof XmlFile)) {
return false;
}
boolean isAllowed = false;
final GetMagentoModuleUtil.MagentoModuleData moduleData =
GetMagentoModuleUtil.getByContext(psiFile.getContainingDirectory(), project);

if (moduleData.getType().equals(ComponentType.module)) {
isAllowed = file.getPath().contains(Package.moduleViewDir);
} else if (moduleData.getType().equals(ComponentType.theme)) {
isAllowed = true;
if (!LayoutXml.PARENT_DIR.equals(file.getContainingDirectory().getName())
&& !LayoutXml.PAGE_LAYOUT_DIR.equals(file.getContainingDirectory().getName())) {
return false;
}

return isAllowed;
}

private void setStatus(final AnActionEvent event, final boolean status) {
event.getPresentation().setVisible(status);
event.getPresentation().setEnabled(status);
}

@Override
public void actionPerformed(final @NotNull AnActionEvent event) {
OverrideLayoutInThemeDialog.open(event.getProject(), this.psiFile);
return isFileInModuleOrTheme(file, project);
}
}
Original file line number Diff line number Diff line change
@@ -5,93 +5,53 @@

package com.magento.idea.magento2plugin.actions.generation;

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.magento.idea.magento2plugin.MagentoIcons;
import com.magento.idea.magento2plugin.actions.CopyMagentoPath;
import com.magento.idea.magento2plugin.actions.generation.dialog.OverrideTemplateInThemeDialog;
import com.magento.idea.magento2plugin.magento.packages.ComponentType;
import com.magento.idea.magento2plugin.magento.packages.Package;
import com.magento.idea.magento2plugin.project.Settings;
import com.magento.idea.magento2plugin.util.magento.GetMagentoModuleUtil;
import org.jetbrains.annotations.NotNull;

public class OverrideTemplateInThemeAction extends AnAction {
public class OverrideTemplateInThemeAction extends OverrideFileInThemeAction {

public static final String ACTION_NAME = "Override this in a project theme";
public static final String ACTION_NAME = "Override this file in a project theme";
public static final String ACTION_TEMPLATE_DESCRIPTION = "Override template in project theme";
public static final String ACTION_STYLES_DESCRIPTION = "Override styles in project theme";
public static final String LESS_FILE_EXTENSION = "less";
private PsiFile psiFile;

public OverrideTemplateInThemeAction() {
super(ACTION_NAME, ACTION_TEMPLATE_DESCRIPTION, MagentoIcons.MODULE);
}

/**
* Action entry point.
*
* @param event AnActionEvent
*/
@Override
public void update(final @NotNull AnActionEvent event) {
boolean status = false;
final Project project = event.getData(PlatformDataKeys.PROJECT);
psiFile = event.getData(PlatformDataKeys.PSI_FILE);
public void actionPerformed(final @NotNull AnActionEvent event) {
final Project project = event.getProject();

if (Settings.isEnabled(project)) {
try {
status = isOverrideAllowed(
psiFile.getVirtualFile(),
project
);
} catch (NullPointerException e) { //NOPMD
// Ignore
}
if (project == null || psiFile == null) {
return;
}

this.setStatus(event, status);
OverrideTemplateInThemeDialog.open(project, psiFile);
}

private boolean isOverrideAllowed(final VirtualFile file, final Project project) {
if (file.isDirectory()) {
@Override
protected boolean isOverrideAllowed(
final @NotNull PsiFile file,
final @NotNull Project project
) {
final VirtualFile virtualFile = file.getVirtualFile();

if (virtualFile == null || virtualFile.isDirectory()) {
return false;
}
final String fileExtension = psiFile.getVirtualFile().getExtension();
final String fileExtension = virtualFile.getExtension();

if (!CopyMagentoPath.PHTML_EXTENSION.equals(fileExtension)
&& !LESS_FILE_EXTENSION.equals(fileExtension)) {
return false;
}
boolean isAllowed = false;
final GetMagentoModuleUtil.MagentoModuleData moduleData =
GetMagentoModuleUtil.getByContext(psiFile.getContainingDirectory(), project);

if (moduleData.getType().equals(ComponentType.module)) {
isAllowed = file.getPath().contains(Package.moduleViewDir);
} else if (moduleData.getType().equals(ComponentType.theme)) {
isAllowed = true;
}

return isAllowed;
}

private void setStatus(final AnActionEvent event, final boolean status) {
event.getPresentation().setVisible(status);
event.getPresentation().setEnabled(status);
}

@Override
public void actionPerformed(final @NotNull AnActionEvent event) {
OverrideTemplateInThemeDialog.open(event.getProject(), this.psiFile);
}

@Override
public boolean isDumbAware() {
return false;
return isFileInModuleOrTheme(file, project);
}
}
Original file line number Diff line number Diff line change
@@ -33,14 +33,15 @@
import org.jetbrains.annotations.NotNull;

public class OverrideLayoutInThemeDialog extends AbstractDialog {
@NotNull
private final Project project;

private static final String THEME_NAME = "target theme";

private final @NotNull Project project;
private final PsiFile psiFile;
private JPanel contentPane;
private JButton buttonOK;
private JButton buttonCancel;
private JLabel selectTheme; //NOPMD
private static final String THEME_NAME = "target theme";

@FieldValidation(rule = RuleRegistry.NOT_EMPTY,
message = {NotEmptyRule.MESSAGE, THEME_NAME})
@@ -54,7 +55,10 @@ public class OverrideLayoutInThemeDialog extends AbstractDialog {
* @param project Project
* @param psiFile PsiFile
*/
public OverrideLayoutInThemeDialog(final @NotNull Project project, final PsiFile psiFile) {
public OverrideLayoutInThemeDialog(
final @NotNull Project project,
final @NotNull PsiFile psiFile
) {
super();

this.project = project;
@@ -89,51 +93,46 @@ public void windowClosing(final WindowEvent event) {
addComponentListener(new FocusOnAFieldListener(() -> theme.requestFocusInWindow()));
}

private void onOverride() {
this.radioButtonOverride.setSelected(true);
this.radioButtonExtend.setSelected(false);
}

private void onExtend() {
this.radioButtonOverride.setSelected(false);
this.radioButtonExtend.setSelected(true);
/**
* Open popup.
*
* @param project Project
* @param psiFile PsiFile
*/
public static void open(final @NotNull Project project, final @NotNull PsiFile psiFile) {
final OverrideLayoutInThemeDialog dialog =
new OverrideLayoutInThemeDialog(project, psiFile);
dialog.pack();
dialog.centerDialog(dialog);
dialog.setVisible(true);
}

private void onOK() {
if (validateFormFields()) {
final OverrideLayoutInThemeGenerator overrideLayoutInThemeGenerator =
new OverrideLayoutInThemeGenerator(project);

overrideLayoutInThemeGenerator.execute(psiFile, this.getTheme(), this.isOverride());
overrideLayoutInThemeGenerator.execute(psiFile, getTheme(), isOverride());
exit();
}
exit();
}

public String getTheme() {
private String getTheme() {
return this.theme.getSelectedItem().toString();
}

/**
* Is Override.
*
* @return boolean
*/
public boolean isOverride() {
private boolean isOverride() {
return this.radioButtonOverride.isSelected();
}

/**
* Open popup.
*
* @param project Project
* @param psiFile PsiFile
*/
public static void open(final @NotNull Project project, final PsiFile psiFile) {
final OverrideLayoutInThemeDialog dialog =
new OverrideLayoutInThemeDialog(project, psiFile);
dialog.pack();
dialog.centerDialog(dialog);
dialog.setVisible(true);
private void onOverride() {
this.radioButtonOverride.setSelected(true);
this.radioButtonExtend.setSelected(false);
}

private void onExtend() {
this.radioButtonOverride.setSelected(false);
this.radioButtonExtend.setSelected(true);
}

private void fillThemeOptions() {
@@ -158,6 +157,7 @@ private void fillThemeOptions() {
area = moduleData.getName().split(Package.V_FILE_SEPARATOR)[0];
}
final List<String> themeNames = new ModuleIndex(project).getEditableThemeNames();

for (final String themeName : themeNames) {
if (Areas.base.toString().equals(area)
|| themeName.split(Package.V_FILE_SEPARATOR)[0].equals(area)) {
Original file line number Diff line number Diff line change
@@ -33,14 +33,15 @@
import org.jetbrains.annotations.NotNull;

public class OverrideTemplateInThemeDialog extends AbstractDialog {
@NotNull
private final Project project;

private static final String THEME_NAME = "target theme";

private final @NotNull Project project;
private final PsiFile psiFile;
private JPanel contentPane;
private JButton buttonOK;
private JButton buttonCancel;
private JLabel selectTheme; //NOPMD
private static final String THEME_NAME = "target theme";

@FieldValidation(rule = RuleRegistry.NOT_EMPTY,
message = {NotEmptyRule.MESSAGE, THEME_NAME})
@@ -52,7 +53,10 @@ public class OverrideTemplateInThemeDialog extends AbstractDialog {
* @param project Project
* @param psiFile PsiFile
*/
public OverrideTemplateInThemeDialog(final @NotNull Project project, final PsiFile psiFile) {
public OverrideTemplateInThemeDialog(
final @NotNull Project project,
final @NotNull PsiFile psiFile
) {
super();

this.project = project;
@@ -89,34 +93,34 @@ public void windowClosing(final WindowEvent event) {
addComponentListener(new FocusOnAFieldListener(() -> theme.requestFocusInWindow()));
}

private void onOK() {
if (validateFormFields()) {
final OverrideTemplateInThemeGenerator overrideInThemeGenerator =
new OverrideTemplateInThemeGenerator(project);

overrideInThemeGenerator.execute(psiFile, this.getTheme());
}
exit();
}

public String getTheme() {
return this.theme.getSelectedItem().toString();
}

/**
* Open popup.
*
* @param project Project
* @param psiFile PsiFile
*/
public static void open(final @NotNull Project project, final PsiFile psiFile) {
public static void open(final @NotNull Project project, final @NotNull PsiFile psiFile) {
final OverrideTemplateInThemeDialog dialog =
new OverrideTemplateInThemeDialog(project, psiFile);
dialog.pack();
dialog.centerDialog(dialog);
dialog.setVisible(true);
}

private void onOK() {
if (validateFormFields()) {
final OverrideTemplateInThemeGenerator overrideInThemeGenerator =
new OverrideTemplateInThemeGenerator(project);

overrideInThemeGenerator.execute(psiFile, this.getTheme());
exit();
}
}

private String getTheme() {
return this.theme.getSelectedItem().toString();
}

private void fillThemeOptions() {
final GetMagentoModuleUtil.MagentoModuleData moduleData =
GetMagentoModuleUtil.getByContext(psiFile.getContainingDirectory(), project);
@@ -139,6 +143,7 @@ private void fillThemeOptions() {
area = moduleData.getName().split(Package.V_FILE_SEPARATOR)[0];
}
final List<String> themeNames = new ModuleIndex(project).getEditableThemeNames();

for (final String themeName : themeNames) {
if (Areas.base.toString().equals(area)
|| themeName.split(Package.V_FILE_SEPARATOR)[0].equals(area)) {
Original file line number Diff line number Diff line change
@@ -17,11 +17,10 @@
import java.util.List;
import java.util.regex.Pattern;

public class OverrideInThemeGenerator {
public abstract class OverrideInThemeGenerator {

public final ValidatorBundle validatorBundle;

public final Project project;
protected final Project project;
protected final ValidatorBundle validatorBundle;

/**
* OverrideInThemeGenerator constructor.
@@ -37,12 +36,12 @@ public OverrideInThemeGenerator(final Project project) {
* Get target directory.
*
* @param directory PsiDirectory
* @param pathComponents String[]
* @param pathComponents List[String]
*
* @return PsiDirectory
*/
public static PsiDirectory getTargetDirectory(
PsiDirectory directory, //NOPMD
protected PsiDirectory getTargetDirectory(
final PsiDirectory directory,
final List<String> pathComponents
) {
PsiDirectory result = directory;
@@ -62,13 +61,16 @@ public static PsiDirectory getTargetDirectory(
*
* @param file PsiFile
* @param componentName String
* @return String[]
*
* @return List[String]
*/
public static List<String> getModulePathComponents(
protected List<String> getModulePathComponents(
final PsiFile file,
final String componentName) {
final String componentName
) {
final List<String> pathComponents = new ArrayList<>();
PsiDirectory parent = file.getParent();

while (!parent.getName().equals(Areas.frontend.toString())
&& !parent.getName().equals(Areas.adminhtml.toString())
&& !parent.getName().equals(Areas.base.toString())
@@ -89,7 +91,7 @@ public static List<String> getModulePathComponents(
*
* @return String[]
*/
public static List<String> getThemePathComponents(final PsiFile file) {
protected List<String> getThemePathComponents(final PsiFile file) {
final List<String> pathComponents = new ArrayList<>();
final Pattern pattern = Pattern.compile(RegExUtil.Magento.MODULE_NAME);

Original file line number Diff line number Diff line change
@@ -41,15 +41,16 @@ public OverrideLayoutInThemeGenerator(final Project project) {
public void execute(
final PsiFile baseFile,
final String themeName,
final boolean isOverride) {
final boolean isOverride
) {
final GetMagentoModuleUtil.MagentoModuleData moduleData =
GetMagentoModuleUtil.getByContext(baseFile.getContainingDirectory(), project);

if (moduleData == null) {
return;
}

List<String> pathComponents;

if (moduleData.getType().equals(ComponentType.module)) {
pathComponents = getModulePathComponents(
baseFile,
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.SlowOperations;
import com.jetbrains.php.lang.psi.elements.ClassConstantReference;
import com.jetbrains.php.lang.psi.elements.MethodReference;
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
@@ -108,7 +109,10 @@ private static PsiFile getModuleRegistrationFile(

private static String parseParameterValue(final PsiElement valueHolder) {
if (valueHolder instanceof ClassConstantReference) {
final PsiElement resolved = ((ClassConstantReference) valueHolder).resolve();
final ClassConstantReference constantReference = (ClassConstantReference) valueHolder;
final PsiElement resolved = SlowOperations.allowSlowOperations(
constantReference::resolve
);

if (!(resolved instanceof ClassConstImpl)) {
return null;