/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.util.ui;
import com.intellij.openapi.util.Getter;
import com.intellij.ui.PopupMenuListenerAdapter;
import com.intellij.ui.TextFieldWithHistory;
import com.intellij.ui.TextFieldWithHistoryWithBrowseButton;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.Convertor;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.PopupMenuEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.List;
import java.util.function.BiFunction;
/**
* @author Irina.Chernushina on 1/5/2016.
*/
public interface ReadonlyFieldWithHistoryWithBrowseButton {
JComponent getComponent();
void set(@NotNull String text);
@NotNull String get();
void addListener(Runnable listener);
void setPreferredWidthToFitText();
class Builder {
private BiFunction<ActionEvent, String, String> myActionListener;
private Getter<List<String>> myHistoryProvider;
private Convertor<TextFieldWithHistory, ListCellRenderer> myRendererCreator;
public Builder withRenderer(@NotNull final Convertor<TextFieldWithHistory, ListCellRenderer> convertor) {
myRendererCreator = convertor;
return this;
}
public Builder withHistoryProvider(@NotNull final Getter<List<String>> provider) {
myHistoryProvider = provider;
return this;
}
public Builder withActionListener(@NotNull final BiFunction<ActionEvent, String, String> listener) {
myActionListener = listener;
return this;
}
public ReadonlyFieldWithHistoryWithBrowseButton build() {
final TextFieldWithHistoryWithBrowseButton field = new TextFieldWithHistoryWithBrowseButton();
final TextFieldWithHistory textFieldWithHistory = field.getChildComponent();
textFieldWithHistory.setHistorySize(-1);
textFieldWithHistory.setMinimumAndPreferredWidth(0);
textFieldWithHistory.setEditable(false);
final ReadonlyFieldWithHistoryWithBrowseButton wrapper = createReadonlyFieldWrapper(field);
if (myActionListener != null) {
field.getButton().addActionListener(e -> {
final String value = myActionListener.apply(e, wrapper.get());
if (value != null) {
wrapper.set(value);
}
});
}
if (myHistoryProvider != null) {
textFieldWithHistory.addPopupMenuListener(new PopupMenuListenerAdapter() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
SwingHelper.setHistory(textFieldWithHistory, ContainerUtil.notNullize(myHistoryProvider.get()), false);
}
});
}
if (myRendererCreator != null) {
final ListCellRenderer renderer = myRendererCreator.convert(textFieldWithHistory);
if (renderer != null) {
//noinspection GtkPreferredJComboBoxRenderer
textFieldWithHistory.setRenderer(renderer);
}
}
return wrapper;
}
@NotNull
public static ReadonlyFieldWithHistoryWithBrowseButton createReadonlyFieldWrapper(final TextFieldWithHistoryWithBrowseButton field) {
return new ReadonlyFieldWithHistoryWithBrowseButton() {
@Override
public JComponent getComponent() {
return field;
}
@Override
public void set(@NotNull String text) {
final TextFieldWithHistory component = field.getChildComponent();
if (!component.getHistory().contains(text)) {
component.setTextAndAddToHistory(text);
}
component.setSelectedItem(text);
}
@NotNull
@Override
public String get() {
final Object item = field.getChildComponent().getSelectedItem();
return item == null ? "" : item.toString().trim();
}
@Override
public void addListener(final Runnable listener) {
field.getChildComponent().addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
listener.run();
}
});
}
public void setPreferredWidthToFitText() {
SwingHelper.setPreferredWidthToFitText(field);
}
};
}
}
}