package com.yiistorm; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.ui.JBColor; import com.yiistorm.elements.ConfigParser; import com.yiistorm.helpers.CommonHelper; import com.yiistorm.helpers.MigrationsCondition; import org.jetbrains.annotations.Nls; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.File; public class YiiStormSettingsPage implements Configurable { private JCheckBox enableYiiStorm; private JTextField themeNameField; private JTextField langField; private JTextField yiicFileField; private JTextField yiiConfigPath; private JTextField yiiLitePath; private JCheckBox useMigrationsCheckbox; private JCheckBox useYiiCompleter; private PropertiesComponent properties; private JPanel panel; Project project; public YiiStormSettingsPage(Project project) { this.project = project; } @Nls @Override public String getDisplayName() { return "YiiStorm"; } @Override public JComponent createComponent() { properties = PropertiesComponent.getInstance(project); panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); JPanel panel1 = new JPanel(); panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); enableYiiStorm = new JCheckBox("Enable Yii Storm for this project"); panel1.add(enableYiiStorm); panel1.add(Box.createHorizontalGlue()); panel.add(panel1); //chbox migrations JPanel panel12 = new JPanel(); panel12.setLayout(new BoxLayout(panel12, BoxLayout.X_AXIS)); useMigrationsCheckbox = new JCheckBox("Use migrations"); useMigrationsCheckbox.setSelected(properties.getBoolean("useYiiMigrations", true)); panel12.add(useMigrationsCheckbox); panel12.add(Box.createHorizontalGlue()); panel.add(panel12); //strut panel.add(Box.createVerticalStrut(8)); JPanel panel2 = new JPanel(); panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS)); panel.add(panel2); //default lang name JPanel themePanellang = new JPanel(); themePanellang.setLayout(new BorderLayout()); themePanellang.setMaximumSize(new Dimension(5000, 25)); JLabel langLabel = new JLabel("Default lang abbr:"); langLabel.setSize(new Dimension(200, 20)); langField = new JTextField(15); langLabel.setLabelFor(langField); langField.setMaximumSize(new Dimension(500, 20)); JPanel themeLabelPanel1 = new JPanel(); themeLabelPanel1.setPreferredSize(new Dimension(135, 25)); themeLabelPanel1.setAlignmentX(JPanel.RIGHT_ALIGNMENT); themeLabelPanel1.add(langLabel); themePanellang.add(themeLabelPanel1, BorderLayout.WEST); themePanellang.add(langField, BorderLayout.CENTER); panel.add(Box.createVerticalStrut(8)); panel.add(themePanellang); //theme name JPanel themePanel = new JPanel(); themePanel.setLayout(new BorderLayout()); themePanel.setMaximumSize(new Dimension(5000, 25)); JLabel themeNameLabel = new JLabel("Project theme name:"); themeNameLabel.setAlignmentX(JLabel.RIGHT_ALIGNMENT); themeNameLabel.setSize(new Dimension(200, 20)); themeNameField = new JTextField(15); themeNameLabel.setLabelFor(themeNameField); themeNameField.setMaximumSize(new Dimension(500, 20)); JPanel themeLabelPanel = new JPanel(); themeLabelPanel.setPreferredSize(new Dimension(135, 25)); themeLabelPanel.add(themeNameLabel); themePanel.add(themeLabelPanel, BorderLayout.WEST); themePanel.add(themeNameField, BorderLayout.CENTER); panel.add(Box.createVerticalStrut(8)); panel.add(themePanel); enableYiiStorm.setSelected(properties.getBoolean("enableYiiStorm", true)); themeNameField.setText(properties.getValue("themeName", DefaultSettings.themeName)); langField.setText(properties.getValue("langName", DefaultSettings.langName)); initYiicPath(); //initYiiAppPanel(); panel.add(Box.createVerticalGlue()); return panel; } public void initYiiAppPanel() { KeyListener toggleListener = new KeyListener() { @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { useYiiCompleterDisabledToggle(); } }; JPanel panelYiiApp = new JPanel(); panelYiiApp.setLayout(new BoxLayout(panelYiiApp, BoxLayout.Y_AXIS)); panelYiiApp.setBorder(BorderFactory.createTitledBorder("Yii application completing")); //chbox migrations JPanel panelUseYiiiCompleter = new JPanel(); panelUseYiiiCompleter.setLayout(new BoxLayout(panelUseYiiiCompleter, BoxLayout.X_AXIS)); useYiiCompleter = new JCheckBox("Use Yii::app() completer"); useYiiCompleter.setSelected(properties.getBoolean("useYiiCompleter", false)); panelUseYiiiCompleter.add(useYiiCompleter); panelUseYiiiCompleter.add(Box.createHorizontalGlue()); panelYiiApp.add(panelUseYiiiCompleter); //YiiLite SELECT JPanel yiicPanel = new JPanel(); yiicPanel.setLayout(new BorderLayout()); yiicPanel.setMaximumSize(new Dimension(5000, 25)); JLabel label = new JLabel("YiiLite.php file path:"); label.setAlignmentX(JLabel.RIGHT_ALIGNMENT); label.setSize(new Dimension(200, 20)); yiiLitePath = new JTextField(15); label.setLabelFor(yiiLitePath); yiiLitePath.setMaximumSize(new Dimension(500, 20)); yiiLitePath.addKeyListener(toggleListener); JButton yiiLitePathSelect = new JButton("Select file"); JPanel lpan = new JPanel(); lpan.setPreferredSize(new Dimension(130, 25)); lpan.add(label); yiicPanel.add(lpan, BorderLayout.WEST); yiicPanel.add(yiiLitePath, BorderLayout.CENTER); yiicPanel.add(yiiLitePathSelect, BorderLayout.EAST); panelYiiApp.add(Box.createVerticalStrut(4)); panelYiiApp.add(yiicPanel); String yiicFile = properties.getValue("yiiLitePath"); if (yiicFile != null) { yiiLitePath.setText(yiicFile); } yiiLitePathSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(); VirtualFile baseDir = project.getBaseDir(); if (baseDir != null) { fileChooser.setCurrentDirectory(new File(baseDir.getPath())); int ret = fileChooser.showDialog(null, "Открыть файл"); if (ret == JFileChooser.APPROVE_OPTION) { yiiLitePath.setText(fileChooser.getSelectedFile().getAbsolutePath()); useYiiCompleterDisabledToggle(); } } } }); //CONFIG SELECT JPanel yiicConfigPanel = new JPanel(); yiicConfigPanel.setLayout(new BorderLayout()); yiicConfigPanel.setMaximumSize(new Dimension(5000, 25)); JLabel ConfigLabel = new JLabel("Yii current config path:"); ConfigLabel.setAlignmentX(JLabel.RIGHT_ALIGNMENT); yiiConfigPath = new JTextField(15); yiiConfigPath.addKeyListener(toggleListener); ConfigLabel.setLabelFor(yiiConfigPath); yiiConfigPath.setMaximumSize(new Dimension(500, 20)); JButton yiiConfigPathSelect = new JButton("Select file"); JPanel ConfigLabelpan = new JPanel(); ConfigLabelpan.setPreferredSize(new Dimension(130, 25)); ConfigLabelpan.add(ConfigLabel); yiicConfigPanel.add(ConfigLabelpan, BorderLayout.WEST); yiicConfigPanel.add(yiiConfigPath, BorderLayout.CENTER); yiicConfigPanel.add(yiiConfigPathSelect, BorderLayout.EAST); panelYiiApp.add(Box.createVerticalStrut(4)); panelYiiApp.add(yiicConfigPanel); String yiicConfigFile = properties.getValue("yiiConfigPath"); if (yiicConfigFile != null) { yiiConfigPath.setText(yiicConfigFile); } yiiConfigPathSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(); VirtualFile baseDir = project.getBaseDir(); if (baseDir != null) { fileChooser.setCurrentDirectory(new File(baseDir.getPath())); int ret = fileChooser.showDialog(null, "Открыть файл"); if (ret == JFileChooser.APPROVE_OPTION) { yiiConfigPath.setText(fileChooser.getSelectedFile().getAbsolutePath()); useYiiCompleterDisabledToggle(); } } } }); boolean empty = properties.getValue("yiiLitePath") == null || properties.getValue("yiiConfigPath") == null; if (!empty) { empty = properties.getValue("yiiLitePath").isEmpty() || properties.getValue("yiiConfigPath").isEmpty(); } if (empty) { useYiiCompleter.setEnabled(false); } else { useYiiCompleterDisabledToggle(); } panel.add(panelYiiApp); } public void useYiiCompleterDisabledToggle() { if (yiiLitePath.getText().length() > 0) { checkYiiAppParams(); } boolean filled = !yiiLitePath.getText().isEmpty() && !yiiConfigPath.getText().isEmpty(); if (filled) { filled = yiiLitePath.getBackground().equals(JBColor.GREEN) && yiiConfigPath.getBackground().equals(JBColor.GREEN); } useYiiCompleter.setEnabled(filled); if (!filled) { useYiiCompleter.setSelected(false); } } public void initYiicPath() { JPanel yiicPanel = new JPanel(); yiicPanel.setLayout(new BorderLayout()); yiicPanel.setMaximumSize(new Dimension(5000, 25)); JLabel yiicFileFieldLabel = new JLabel("Yiic.php path:"); yiicFileFieldLabel.setAlignmentX(JLabel.RIGHT_ALIGNMENT); yiicFileFieldLabel.setSize(new Dimension(200, 20)); yiicFileField = new JTextField(15); yiicFileFieldLabel.setLabelFor(yiicFileField); JPanel labelPanel = new JPanel(); labelPanel.setPreferredSize(new Dimension(135, 25)); labelPanel.add(yiicFileFieldLabel); JButton yiicPathSelect = new JButton("Select file"); yiicFileField.setMaximumSize(new Dimension(500, 20)); yiicPanel.add(labelPanel, BorderLayout.WEST); yiicPanel.add(yiicFileField, BorderLayout.CENTER); yiicPanel.add(yiicPathSelect, BorderLayout.EAST); panel.add(Box.createVerticalStrut(4)); panel.add(yiicPanel); String yiicFile = properties.getValue("yiicFile"); if (yiicFile != null) { yiicFileField.setText(yiicFile); } yiicPathSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fileChooser = new JFileChooser(); VirtualFile baseDir = project.getBaseDir(); if (baseDir != null) { fileChooser.setCurrentDirectory(new File(baseDir.getPath())); FileNameExtensionFilter fn; if (CommonHelper.isWindows()) { fileChooser.setFileFilter(new FileNameExtensionFilter("Yiic.bat file", "bat")); fileChooser.setName("yiic.bat"); } else { fileChooser.setFileFilter(new FileNameExtensionFilter("Yiic.php file", "php")); fileChooser.setName("yiic.php"); } fileChooser.setAcceptAllFileFilterUsed(false); int ret = fileChooser.showDialog(null, "Открыть файл"); if (ret == JFileChooser.APPROVE_OPTION) { yiicFileField.setText(fileChooser.getSelectedFile().getAbsolutePath()); } } } }); } public void checkYiiAppParams() { ConfigParser parser = new ConfigParser(YiiStormProjectComponent.getInstance(project)); if (yiiLitePath.getText().length() > 0) { if (parser.testYiiLitePath(yiiLitePath.getText())) { yiiLitePath.setBackground(JBColor.GREEN); if (yiiConfigPath.getText().length() > 0) { if (parser.testYiiConfigPath(yiiConfigPath.getText())) { yiiConfigPath.setBackground(JBColor.GREEN); } else { yiiConfigPath.setBackground(JBColor.PINK); } } else { yiiConfigPath.setBackground(JBColor.background()); } } else { yiiLitePath.setBackground(JBColor.PINK); } } else { yiiLitePath.setBackground(JBColor.background()); } } @Override public void apply() throws ConfigurationException { PropertiesComponent properties = PropertiesComponent.getInstance(project); properties.setValue("enableYiiStorm", String.valueOf(enableYiiStorm.isSelected())); properties.setValue("themeName", themeNameField.getText()); properties.setValue("langName", langField.getText()); properties.setValue("yiicFile", yiicFileField.getText()); // properties.setValue("yiiConfigPath", yiiConfigPath.getText()); // properties.setValue("yiiLitePath", yiiLitePath.getText()); // properties.setValue("useYiiCompleter", String.valueOf(useYiiCompleter.isSelected())); // properties.setValue("useYiiMigrations", String.valueOf(useMigrationsCheckbox.isSelected())); final ToolWindowManager manager = ToolWindowManager.getInstance(project); final ToolWindow tw = manager.getToolWindow("Migrations"); if (tw != null) { tw.setAvailable(MigrationsCondition.makeCondition(project), null); } /* if (properties.getBoolean("useYiiCompleter", false)) { YiiStormProjectComponent.getInstance(project).loadConfigParser(); } else { YiiStormProjectComponent.getInstance(project).clearConfigParser(); } */ } @Override public boolean isModified() { return true; } @Override public String getHelpTopic() { return null; } @Override public void disposeUIResources() { } @Override public void reset() { } }