package fr.adrienbrault.idea.symfony2plugin.ui; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.ui.AnActionButton; import com.intellij.ui.ToolbarDecorator; import com.intellij.ui.table.TableView; import com.intellij.util.ui.ElementProducer; import com.intellij.util.ui.ListTableModel; import com.jetbrains.php.lang.PhpFileType; import com.jetbrains.plugins.webDeployment.config.WebServerConfig; import fr.adrienbrault.idea.symfony2plugin.Settings; import fr.adrienbrault.idea.symfony2plugin.routing.dict.RoutingFile; import fr.adrienbrault.idea.symfony2plugin.ui.utils.UiSettingsUtil; import fr.adrienbrault.idea.symfony2plugin.ui.utils.dict.UiPathColumnInfo; import fr.adrienbrault.idea.symfony2plugin.ui.utils.dict.WebServerFileDialogExtensionCallback; import fr.adrienbrault.idea.symfony2plugin.webDeployment.WebDeploymentUtil; import icons.WebDeploymentIcons; 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.util.ArrayList; import java.util.List; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class RoutingSettingsForm implements Configurable { private JPanel panel1; private JPanel listviewPanel; private JButton buttonReset; private TableView<RoutingFile> tableView; private Project project; private boolean changed = false; private ListTableModel<RoutingFile> modelList; public RoutingSettingsForm(@NotNull Project project) { this.project = project; this.tableView = new TableView<>(); this.modelList = new ListTableModel<>( new UiPathColumnInfo.PathColumn(), new UiPathColumnInfo.TypeColumn(project) ); this.initList(); this.modelList.addTableModelListener(e -> RoutingSettingsForm.this.changed = true); this.tableView.setModelAndUpdateColumns(this.modelList); buttonReset.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { super.mouseClicked(e); resetList(); // add default path for (String defaultContainerPath : Settings.DEFAULT_ROUTES) { RoutingSettingsForm.this.modelList.addRow(new RoutingFile(defaultContainerPath)); } } }); } private void initList() { List<RoutingFile> containerFiles = getSettings().routingFiles; if(containerFiles != null && containerFiles.size() > 0) { this.modelList.addRows(containerFiles); } } @Nls @Override public String getDisplayName() { return "Routing"; } @Nullable @Override public String getHelpTopic() { return null; } @Nullable @Override public JComponent createComponent() { ToolbarDecorator tablePanel = ToolbarDecorator.createDecorator(this.tableView, new ElementProducer<RoutingFile>() { @Override public RoutingFile createElement() { return null; } @Override public boolean canCreateElement() { return true; } }); tablePanel.setEditAction(anActionButton -> { RoutingFile containerFile = RoutingSettingsForm.this.tableView.getSelectedObject(); if(containerFile == null) { return; } String uri = UiSettingsUtil.getPathDialog(project, PhpFileType.INSTANCE); if(uri == null) { return; } containerFile.setPath(uri); RoutingSettingsForm.this.changed = true; }); tablePanel.setAddAction(anActionButton -> { String uri = UiSettingsUtil.getPathDialog(project, PhpFileType.INSTANCE); if(uri == null) { return; } RoutingSettingsForm.this.tableView.getListTableModel().addRow(new RoutingFile(uri)); RoutingSettingsForm.this.changed = true; }); if(WebDeploymentUtil.isEnabled(project)) { addWebDeploymentButton(tablePanel); } this.panel1.add(tablePanel.createPanel()); return this.panel1; } private void addWebDeploymentButton(ToolbarDecorator tablePanel) { tablePanel.addExtraAction(new AnActionButton("Remote", WebDeploymentIcons.Download) { @Override public void actionPerformed(AnActionEvent anActionEvent) { UiSettingsUtil.openFileDialogForDefaultWebServerConnection(project, new WebServerFileDialogExtensionCallback("php") { @Override public void success(@NotNull WebServerConfig server, @NotNull WebServerConfig.RemotePath remotePath) { RoutingSettingsForm.this.tableView.getListTableModel().addRow( new RoutingFile("remote://" + org.apache.commons.lang.StringUtils.stripStart(remotePath.path, "/")) ); RoutingSettingsForm.this.changed = true; } }); } }); } @Override public boolean isModified() { return this.changed; } @Override public void apply() throws ConfigurationException { List<RoutingFile> containerFiles = new ArrayList<>(); for(RoutingFile containerFile :this.tableView.getListTableModel().getItems()) { containerFiles.add(new RoutingFile(containerFile.getPath())); } getSettings().routingFiles = containerFiles; this.changed = false; } private Settings getSettings() { return Settings.getInstance(this.project); } @Override public void reset() { this.resetList(); this.initList(); this.changed = false; } private void resetList() { // clear list, easier? while(this.modelList.getRowCount() > 0) { this.modelList.removeRow(0); } } @Override public void disposeUIResources() { } }