package fr.adrienbrault.idea.symfony2plugin.ui.utils; import com.intellij.openapi.Disposable; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.EditorTextField; import com.intellij.util.Alarm; import com.intellij.util.Consumer; import com.jetbrains.php.completion.PhpCompletionUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class ClassCompletionPanelWrapper { @NotNull private final Project project; @NotNull private final JPanel panel; @NotNull private final Consumer<String> consumer; private EditorTextField field; private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD); private boolean myDisposed = false; public ClassCompletionPanelWrapper(@NotNull Project project, @NotNull JPanel panel, @NotNull final Consumer<String> consumer) { this.project = project; this.panel = panel; this.consumer = consumer; init(); } public String getClassName() { return field.getText(); } public void setClassName(@NotNull String clazz) { field.setText(clazz); consumer.consume(field.getText()); } private void init() { this.field = new EditorTextField("", project, com.jetbrains.php.lang.PhpFileType.INSTANCE); PhpCompletionUtil.installClassCompletion(this.field, null, getDisposable()); this.field.getDocument().addDocumentListener(new DocumentAdapter() { @Override public void documentChanged(DocumentEvent e) { String text = field.getText(); if (StringUtil.isEmpty(text) || StringUtil.endsWith(text, "\\")) { return; } addUpdateRequest(250, () -> consumer.consume(field.getText())); } }); GridBagConstraints gbConstraints = new GridBagConstraints(); gbConstraints.fill = 1; gbConstraints.weightx = 1.0D; gbConstraints.gridx = 1; gbConstraints.gridy = 1; panel.add(field, gbConstraints); } private Disposable getDisposable() { return () -> { myDisposed = true; myAlarm.cancelAllRequests(); }; } private void addUpdateRequest(final int delay, @NotNull final Runnable runnable) { SwingUtilities.invokeLater(() -> { if (myDisposed) { return; } myAlarm.cancelAllRequests(); myAlarm.addRequest(runnable, delay); }); } }