/* * Copyright 2000-2017 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 org.jetbrains.plugins.groovy.intentions.style.parameterToEntry; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.EditorComboBoxEditor; import com.intellij.ui.EditorComboBoxRenderer; import com.intellij.ui.EditorTextField; import com.intellij.ui.StringComboboxEditor; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.GroovyFileType; import org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyNamesUtil; import org.jetbrains.plugins.groovy.settings.GroovyApplicationSettings; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; import java.awt.event.*; import java.util.EventListener; public class GroovyMapParameterDialog extends DialogWrapper { private JPanel contentPane; private ComboBox myNameComboBox; private JLabel myNameLabel; private JCheckBox myCbTypeSpec; private JCheckBox myCreateNew; private final Project myProject; private final EventListenerList myListenerList = new EventListenerList(); public GroovyMapParameterDialog(Project project, final String[] possibleNames, final boolean createNew) { super(true); myProject = project; setUpDialog(possibleNames, createNew); init(); } private void setUpDialog(final String[] possibleNames, boolean createNew) { setTitle(GroovyIntentionsBundle.message("convert.param.to.map.entry")); if (GroovyApplicationSettings.getInstance().CONVERT_PARAM_CREATE_NEW_PARAM != null) { myCreateNew.setSelected(createNew = GroovyApplicationSettings.getInstance().CONVERT_PARAM_CREATE_NEW_PARAM.booleanValue()); } else { myCreateNew.setSelected(createNew); } myNameLabel.setLabelFor(myNameComboBox); myCbTypeSpec.setMnemonic(KeyEvent.VK_T); myCbTypeSpec.setFocusable(false); setUpNameComboBox(possibleNames); setModal(true); if (GroovyApplicationSettings.getInstance().CONVERT_PARAM_SPECIFY_MAP_TYPE != null) { myCbTypeSpec.setSelected(GroovyApplicationSettings.getInstance().CONVERT_PARAM_SPECIFY_MAP_TYPE.booleanValue()); } else { myCbTypeSpec.setSelected(true); } myCbTypeSpec.setEnabled(createNew); myNameComboBox.setEnabled(createNew); myNameLabel.setEnabled(createNew); myCreateNew.addChangeListener(new ChangeListener() { @Override public void stateChanged(final ChangeEvent e) { final boolean flag = myCreateNew.isSelected(); myCbTypeSpec.setEnabled(flag); myNameComboBox.setEnabled(flag); myNameLabel.setEnabled(flag); } }); } public boolean createNewFirst() { return myCreateNew.isSelected(); } @Override public JComponent getPreferredFocusedComponent() { return myNameComboBox; } public boolean specifyTypeExplicitly() { return myCbTypeSpec.isSelected(); } @Override protected void doOKAction() { if (myCbTypeSpec.isEnabled()) { GroovyApplicationSettings.getInstance().CONVERT_PARAM_SPECIFY_MAP_TYPE = myCbTypeSpec.isSelected(); } GroovyApplicationSettings.getInstance().CONVERT_PARAM_CREATE_NEW_PARAM = myCreateNew.isSelected(); super.doOKAction(); } @Override public void doCancelAction() { super.doCancelAction(); } @Override protected JComponent createCenterPanel() { return contentPane; } @Override public JComponent getContentPane() { return contentPane; } @Nullable protected String getEnteredName() { if (myNameComboBox.getEditor().getItem() instanceof String && !((String)myNameComboBox.getEditor().getItem()).isEmpty()) { return (String)myNameComboBox.getEditor().getItem(); } else { return null; } } private void setUpNameComboBox(String[] possibleNames) { final EditorComboBoxEditor comboEditor = new StringComboboxEditor(myProject, GroovyFileType.GROOVY_FILE_TYPE, myNameComboBox); myNameComboBox.setEditor(comboEditor); myNameComboBox.setRenderer(new EditorComboBoxRenderer(comboEditor)); myNameComboBox.setEditable(true); myNameComboBox.setMaximumRowCount(8); myListenerList.add(DataChangedListener.class, new DataChangedListener()); myNameComboBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { fireNameDataChanged(); } }); ((EditorTextField)myNameComboBox.getEditor().getEditorComponent()).addDocumentListener(new DocumentListener() { @Override public void documentChanged(DocumentEvent event) { fireNameDataChanged(); } }); contentPane.registerKeyboardAction(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { IdeFocusManager.getGlobalInstance().requestFocus(myNameComboBox, true); }); } }, KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.ALT_MASK), JComponent.WHEN_IN_FOCUSED_WINDOW); for (String possibleName : possibleNames) { myNameComboBox.addItem(possibleName); } } private void fireNameDataChanged() { Object[] list = myListenerList.getListenerList(); for (Object aList : list) { if (aList instanceof DataChangedListener) { ((DataChangedListener)aList).dataChanged(); } } } class DataChangedListener implements EventListener { void dataChanged() { updateOkStatus(); } } private void updateOkStatus() { String text = getEnteredName(); setOKActionEnabled(GroovyNamesUtil.isIdentifier(text)); } }