package fr.adrienbrault.idea.symfony2plugin; import com.intellij.ide.actions.ShowSettingsUtilImpl; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import fr.adrienbrault.idea.symfony2plugin.stubs.util.IndexUtil; import fr.adrienbrault.idea.symfony2plugin.util.IdeHelper; import fr.adrienbrault.idea.symfony2plugin.webDeployment.WebDeploymentUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class SettingsForm implements Configurable { private Project project; private JPanel panel1; private JButton pathToUrlGeneratorTextFieldReset; private JCheckBox symfonyContainerTypeProvider; private JCheckBox objectRepositoryTypeProvider; private JCheckBox objectRepositoryResultTypeProvider; private JCheckBox objectManagerFindTypeProvider; private TextFieldWithBrowseButton pathToUrlGeneratorTextField; private JLabel typesLabel; private JCheckBox twigAnnotateRoute; private JCheckBox twigAnnotateTemplate; private JCheckBox twigAnnotateAsset; private JCheckBox twigAnnotateAssetTags; private JCheckBox phpAnnotateTemplate; private JCheckBox phpAnnotateService; private JCheckBox phpAnnotateRoute; private JCheckBox phpAnnotateTemplateAnnotation; private JCheckBox pluginEnabled; private JCheckBox yamlAnnotateServiceConfig; private JButton directoryToWebReset; private JLabel directoryToWebLabel; private TextFieldWithBrowseButton directoryToWeb; private JButton directoryToAppReset; private JLabel directoryToAppLabel; private TextFieldWithBrowseButton directoryToApp; private JButton pathToTranslationRootTextFieldReset; private TextFieldWithBrowseButton pathToTranslationRootTextField; private JButton buttonHelp; private JCheckBox highlightServices; private JCheckBox phpAnnotateTranslation; private JCheckBox codeFoldingPhpRoute; private JCheckBox codeFoldingPhpModel; private JCheckBox codeFoldingTwigRoute; private JCheckBox codeFoldingPhpTemplate; private JCheckBox codeFoldingTwigTemplate; private JCheckBox codeFoldingTwigConstant; private JButton buttonReindex; private JCheckBox enableSchedulerCheckBox; public SettingsForm(@NotNull final Project project) { this.project = project; buttonHelp.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); IdeHelper.openUrl(Symfony2ProjectComponent.HELP_URL); } }); } @Nls @Override public String getDisplayName() { return "Symfony Plugin"; } @Nullable @Override public String getHelpTopic() { return null; } public JComponent createComponent() { pathToUrlGeneratorTextField.getButton().addMouseListener(createPathButtonMouseListener(pathToUrlGeneratorTextField.getTextField(), FileChooserDescriptorFactory.createSingleFileDescriptor(FileTypeManager.getInstance().getStdFileType("PHP")))); pathToUrlGeneratorTextFieldReset.addMouseListener(createResetPathButtonMouseListener(pathToUrlGeneratorTextField.getTextField(), Settings.DEFAULT_URL_GENERATOR_PATH)); pathToTranslationRootTextField.getButton().addMouseListener(createPathButtonMouseListener(pathToTranslationRootTextField.getTextField(), FileChooserDescriptorFactory.createSingleFolderDescriptor())); pathToTranslationRootTextFieldReset.addMouseListener(createResetPathButtonMouseListener(pathToTranslationRootTextField.getTextField(), Settings.DEFAULT_TRANSLATION_PATH)); directoryToApp.getButton().addMouseListener(createPathButtonMouseListener(directoryToApp.getTextField(), FileChooserDescriptorFactory.createSingleFolderDescriptor())); directoryToAppReset.addMouseListener(createResetPathButtonMouseListener(directoryToApp.getTextField(), Settings.DEFAULT_APP_DIRECTORY)); directoryToWeb.getButton().addMouseListener(createPathButtonMouseListener(directoryToWeb.getTextField(), FileChooserDescriptorFactory.createSingleFolderDescriptor())); directoryToWebReset.addMouseListener(createResetPathButtonMouseListener(directoryToWeb.getTextField(), Settings.DEFAULT_WEB_DIRECTORY)); enableSchedulerCheckBox.setEnabled(WebDeploymentUtil.isEnabled(project)); buttonReindex.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { IndexUtil.forceReindex(); super.mouseClicked(e); } }); return panel1; } @Override public boolean isModified() { return !pluginEnabled.isSelected() == getSettings().pluginEnabled || !pathToUrlGeneratorTextField.getText().equals(getSettings().pathToUrlGenerator) || !pathToTranslationRootTextField.getText().equals(getSettings().pathToTranslation) || !enableSchedulerCheckBox.isSelected() == getSettings().remoteDevFileScheduler || !symfonyContainerTypeProvider.isSelected() == getSettings().symfonyContainerTypeProvider || !objectRepositoryTypeProvider.isSelected() == getSettings().objectRepositoryTypeProvider || !objectRepositoryResultTypeProvider.isSelected() == getSettings().objectRepositoryResultTypeProvider || !objectManagerFindTypeProvider.isSelected() == getSettings().objectManagerFindTypeProvider || !twigAnnotateRoute.isSelected() == getSettings().twigAnnotateRoute || !twigAnnotateTemplate.isSelected() == getSettings().twigAnnotateTemplate || !twigAnnotateAsset.isSelected() == getSettings().twigAnnotateAsset || !twigAnnotateAssetTags.isSelected() == getSettings().twigAnnotateAssetTags || !phpAnnotateTemplate.isSelected() == getSettings().phpAnnotateTemplate || !phpAnnotateService.isSelected() == getSettings().phpAnnotateService || !phpAnnotateRoute.isSelected() == getSettings().phpAnnotateRoute || !phpAnnotateTemplateAnnotation.isSelected() == getSettings().phpAnnotateTemplateAnnotation || !phpAnnotateTranslation.isSelected() == getSettings().phpAnnotateTranslation || !highlightServices.isSelected() == getSettings().phpHighlightServices || !codeFoldingPhpRoute.isSelected() == getSettings().codeFoldingPhpRoute || !codeFoldingPhpModel.isSelected() == getSettings().codeFoldingPhpModel || !codeFoldingPhpTemplate.isSelected() == getSettings().codeFoldingPhpTemplate || !codeFoldingTwigRoute.isSelected() == getSettings().codeFoldingTwigRoute || !codeFoldingTwigTemplate.isSelected() == getSettings().codeFoldingTwigTemplate || !codeFoldingTwigConstant.isSelected() == getSettings().codeFoldingTwigConstant || !yamlAnnotateServiceConfig.isSelected() == getSettings().yamlAnnotateServiceConfig || !directoryToApp.getText().equals(getSettings().directoryToApp) || !directoryToWeb.getText().equals(getSettings().directoryToWeb) ; } @Override public void apply() throws ConfigurationException { getSettings().pluginEnabled = pluginEnabled.isSelected(); getSettings().pathToUrlGenerator = pathToUrlGeneratorTextField.getText(); getSettings().pathToTranslation = pathToTranslationRootTextField.getText(); getSettings().remoteDevFileScheduler = enableSchedulerCheckBox.isSelected(); getSettings().symfonyContainerTypeProvider = symfonyContainerTypeProvider.isSelected(); getSettings().objectRepositoryTypeProvider = objectRepositoryTypeProvider.isSelected(); getSettings().objectRepositoryResultTypeProvider = objectRepositoryResultTypeProvider.isSelected(); getSettings().objectManagerFindTypeProvider = objectManagerFindTypeProvider.isSelected(); getSettings().twigAnnotateRoute = twigAnnotateRoute.isSelected(); getSettings().twigAnnotateTemplate = twigAnnotateTemplate.isSelected(); getSettings().twigAnnotateAsset = twigAnnotateAsset.isSelected(); getSettings().twigAnnotateAssetTags = twigAnnotateAssetTags.isSelected(); getSettings().phpAnnotateTemplate = phpAnnotateTemplate.isSelected(); getSettings().phpAnnotateService = phpAnnotateService.isSelected(); getSettings().phpAnnotateRoute = phpAnnotateRoute.isSelected(); getSettings().phpAnnotateTemplateAnnotation = phpAnnotateTemplateAnnotation.isSelected(); getSettings().phpAnnotateTranslation = phpAnnotateTranslation.isSelected(); getSettings().phpHighlightServices = highlightServices.isSelected(); getSettings().codeFoldingPhpRoute = codeFoldingPhpRoute.isSelected(); getSettings().codeFoldingPhpModel = codeFoldingPhpModel.isSelected(); getSettings().codeFoldingPhpTemplate = codeFoldingPhpTemplate.isSelected(); getSettings().codeFoldingTwigRoute = codeFoldingTwigRoute.isSelected(); getSettings().codeFoldingTwigTemplate = codeFoldingTwigTemplate.isSelected(); getSettings().codeFoldingTwigConstant = codeFoldingTwigConstant.isSelected(); getSettings().yamlAnnotateServiceConfig = yamlAnnotateServiceConfig.isSelected(); getSettings().directoryToApp = directoryToApp.getText(); getSettings().directoryToWeb = directoryToWeb.getText(); } @Override public void reset() { updateUIFromSettings(); } @Override public void disposeUIResources() { } private Settings getSettings() { return Settings.getInstance(project); } private void updateUIFromSettings() { pluginEnabled.setSelected(getSettings().pluginEnabled); pathToUrlGeneratorTextField.setText(getSettings().pathToUrlGenerator); pathToTranslationRootTextField.setText(getSettings().pathToTranslation); enableSchedulerCheckBox.setSelected(getSettings().remoteDevFileScheduler); symfonyContainerTypeProvider.setSelected(getSettings().symfonyContainerTypeProvider); objectRepositoryTypeProvider.setSelected(getSettings().objectRepositoryTypeProvider); objectRepositoryResultTypeProvider.setSelected(getSettings().objectRepositoryResultTypeProvider); objectManagerFindTypeProvider.setSelected(getSettings().objectManagerFindTypeProvider); twigAnnotateRoute.setSelected(getSettings().twigAnnotateRoute); twigAnnotateTemplate.setSelected(getSettings().twigAnnotateTemplate); twigAnnotateAsset.setSelected(getSettings().twigAnnotateAsset); twigAnnotateAssetTags.setSelected(getSettings().twigAnnotateAssetTags); phpAnnotateTemplate.setSelected(getSettings().phpAnnotateTemplate); phpAnnotateService.setSelected(getSettings().phpAnnotateService); phpAnnotateRoute.setSelected(getSettings().phpAnnotateRoute); phpAnnotateTemplateAnnotation.setSelected(getSettings().phpAnnotateTemplateAnnotation); phpAnnotateTranslation.setSelected(getSettings().phpAnnotateTranslation); highlightServices.setSelected(getSettings().phpHighlightServices); codeFoldingPhpRoute.setSelected(getSettings().codeFoldingPhpRoute); codeFoldingPhpModel.setSelected(getSettings().codeFoldingPhpModel); codeFoldingPhpTemplate.setSelected(getSettings().codeFoldingPhpTemplate); codeFoldingTwigRoute.setSelected(getSettings().codeFoldingTwigRoute); codeFoldingTwigTemplate.setSelected(getSettings().codeFoldingTwigTemplate); codeFoldingTwigConstant.setSelected(getSettings().codeFoldingTwigConstant); yamlAnnotateServiceConfig.setSelected(getSettings().yamlAnnotateServiceConfig); directoryToApp.setText(getSettings().directoryToApp); directoryToWeb.setText(getSettings().directoryToWeb); } private MouseListener createPathButtonMouseListener(final JTextField textField) { return createPathButtonMouseListener(textField, FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor()); } private MouseListener createPathButtonMouseListener(final JTextField textField, final FileChooserDescriptor fileChooserDescriptor) { return new MouseListener() { @Override public void mouseClicked(MouseEvent mouseEvent) { } @Override public void mousePressed(MouseEvent mouseEvent) { VirtualFile projectDirectory = project.getBaseDir(); VirtualFile selectedFile = FileChooser.chooseFile( fileChooserDescriptor, project, VfsUtil.findRelativeFile(textField.getText(), projectDirectory) ); if (null == selectedFile) { return; // Ignore but keep the previous path } String path = VfsUtil.getRelativePath(selectedFile, projectDirectory, '/'); if (null == path) { path = selectedFile.getPath(); } textField.setText(path); } @Override public void mouseReleased(MouseEvent mouseEvent) { } @Override public void mouseEntered(MouseEvent mouseEvent) { } @Override public void mouseExited(MouseEvent mouseEvent) { } }; } private MouseListener createResetPathButtonMouseListener(final JTextField textField, final String defaultValue) { return new MouseListener() { @Override public void mouseClicked(MouseEvent mouseEvent) { } @Override public void mousePressed(MouseEvent mouseEvent) { textField.setText(defaultValue); } @Override public void mouseReleased(MouseEvent mouseEvent) { } @Override public void mouseEntered(MouseEvent mouseEvent) { } @Override public void mouseExited(MouseEvent mouseEvent) { } }; } public static void show(@NotNull Project project) { ShowSettingsUtilImpl.showSettingsDialog(project, "Symfony2.SettingsForm", null); } }