public static void initDartSdkAndDartiumControls( final @Nullable Project project, final @NotNull TextFieldWithBrowseButton dartSdkPathComponent, final @NotNull JBLabel versionLabel, final @NotNull TextFieldWithBrowseButton dartiumPathComponent, final @NotNull Computable<Boolean> isResettingControlsComputable) { final TextComponentAccessor<JTextField> textComponentAccessor = new TextComponentAccessor<JTextField>() { @Override public String getText(final JTextField component) { return component.getText(); } @Override public void setText(final JTextField component, @NotNull String text) { if (!text.isEmpty() && !isDartSdkHome(text)) { final String probablySdkPath = text + "/dart-sdk"; if (isDartSdkHome(probablySdkPath)) { component.setText(FileUtilRt.toSystemDependentName(probablySdkPath)); return; } } component.setText(FileUtilRt.toSystemDependentName(text)); } }; final ComponentWithBrowseButton.BrowseFolderActionListener<JTextField> browseFolderListener = new ComponentWithBrowseButton.BrowseFolderActionListener<JTextField>( "Select Dart SDK path", null, dartSdkPathComponent, project, FileChooserDescriptorFactory.createSingleFolderDescriptor(), textComponentAccessor); dartSdkPathComponent.addBrowseFolderListener(project, browseFolderListener); dartiumPathComponent.addBrowseFolderListener( "Select Dartium browser path", null, project, FileChooserDescriptorFactory.createSingleFileOrExecutableAppDescriptor()); dartSdkPathComponent .getTextField() .getDocument() .addDocumentListener( new DocumentAdapter() { @Override protected void textChanged(final DocumentEvent e) { final String sdkHomePath = dartSdkPathComponent.getText().trim(); versionLabel.setText(sdkHomePath.isEmpty() ? "" : getSdkVersion(sdkHomePath)); if (!isResettingControlsComputable.compute() && isDartSdkHome(sdkHomePath)) { final String dartiumPath = DartiumUtil.getDartiumPathForSdk(sdkHomePath); if (dartiumPath != null) { dartiumPathComponent.setText(FileUtilRt.toSystemDependentName(dartiumPath)); } } } }); }