package krasa.visualvm; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.text.NumberFormat; import java.text.ParseException; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.NumberFormatter; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; public class SettingsDialog { private JTextField visualVmExecutable; private JComponent rootComponent; private JButton browseButton; private JLabel validationMessageLabel; private JCheckBox debugCheckBox; private JFormattedTextField duration; private JLabel durationLabel; private JFormattedTextField delayForStgartingVisualVM; public SettingsDialog() { super(); duration.setFormatterFactory(getDefaultFormatterFactory()); delayForStgartingVisualVM.setFormatterFactory(getDefaultFormatterFactory()); browseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { browseForFile(visualVmExecutable); } }); visualVmExecutable.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { updateLabel(e); } @Override public void insertUpdate(DocumentEvent e) { updateLabel(e); } @Override public void removeUpdate(DocumentEvent e) { updateLabel(e); } private void updateLabel(DocumentEvent e) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { setValidationMessage(visualVmExecutable.getText()); } }); } }); } private DefaultFormatterFactory getDefaultFormatterFactory() { NumberFormatter defaultFormat = new NumberFormatter(); NumberFormat integerInstance = NumberFormat.getIntegerInstance(); integerInstance.setGroupingUsed(false); defaultFormat.setFormat(integerInstance ); return new DefaultFormatterFactory(defaultFormat); } private void browseForFile(@NotNull final JTextField target) { final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor(); descriptor.setHideIgnored(true); descriptor.setTitle("Select VisualVM home"); String text = target.getText(); final VirtualFile toSelect = text == null || text.isEmpty() ? null : LocalFileSystem.getInstance().findFileByPath(text); // 10.5 does not have #chooseFile Project defaultProject = ProjectManager.getInstance().getDefaultProject(); VirtualFile[] virtualFile = FileChooser.chooseFiles(descriptor, defaultProject, toSelect); if (virtualFile != null && virtualFile.length > 0) { target.setText(virtualFile[0].getPath()); } } private void setValidationMessage(String visualVmExecutable1) { if (StringUtils.isBlank(visualVmExecutable1)) { validationMessageLabel.setText("Path is required"); } else if (!new File(visualVmExecutable1).exists()) { validationMessageLabel.setText("File does not exists"); } else { validationMessageLabel.setText(""); } } public JComponent getRootComponent() { return rootComponent; } public void setData(PluginSettings data) { visualVmExecutable.setText(data.getVisualVmExecutable()); duration.setText(data.getDurationToSetContextToButton()); delayForStgartingVisualVM.setText(data.getDelayForVisualVMStart()); debugCheckBox.setSelected(data.getDebug()); } public void getData(PluginSettings data) { data.setVisualVmExecutable(visualVmExecutable.getText()); data.setDurationToSetContextToButton(duration.getText()); data.setDelayForVisualVMStart(delayForStgartingVisualVM.getText()); data.setDebug(debugCheckBox.isSelected()); } public boolean isModified(PluginSettings data) { if (visualVmExecutable.getText() != null ? !visualVmExecutable.getText().equals(data.getVisualVmExecutable()) : data.getVisualVmExecutable() != null) return true; if (duration.getText() != null ? !duration.getText().equals(data.getDurationToSetContextToButton()) : data.getDurationToSetContextToButton() != null) return true; if (delayForStgartingVisualVM.getText() != null ? !delayForStgartingVisualVM.getText().equals(data.getDelayForVisualVMStart()) : data.getDelayForVisualVMStart() != null) return true; if (debugCheckBox.isSelected() != data.getDebug()) return true; return false; } public void setDataCustom(PluginSettings settings) { setData(settings); setValidationMessage(settings.getVisualVmExecutable()); } }