mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[vcs]: change ui/ux for ChangeListChooser (IDEA-153163, IDEA-150818)
* get rid of radio button, use editable combobox instead; * update description if exist; * change combobox model from local changelist to string; remove linkRenderer bacause links are not clickable anyway;
This commit is contained in:
committed by
Nadya Zabrodina
parent
b16891ee2d
commit
873214c889
@@ -1,50 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="com.intellij.openapi.vcs.changes.ui.ChangeListChooserPanel">
|
||||
<grid id="84622" binding="myPanel" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
|
||||
<margin top="0" left="0" bottom="0" right="0"/>
|
||||
<constraints>
|
||||
<xy x="214" y="106" width="285" height="171"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
<border type="none"/>
|
||||
<children>
|
||||
<component id="cde9d" class="javax.swing.JRadioButton" binding="myRbExisting">
|
||||
<constraints>
|
||||
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text resource-bundle="messages/VcsBundle" key="changes.changelist.chooser.existing.changelist"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="e9094" class="javax.swing.JRadioButton" binding="myRbNew">
|
||||
<constraints>
|
||||
<grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties>
|
||||
<text resource-bundle="messages/VcsBundle" key="changes.changelist.chooser.new.changelist"/>
|
||||
</properties>
|
||||
</component>
|
||||
<component id="6e64e" class="javax.swing.JComboBox" binding="myExistingListsCombo">
|
||||
<constraints>
|
||||
<grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="1" indent="3" use-parent-layout="false"/>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
<component id="54fed" class="com.intellij.openapi.vcs.changes.ui.NewEditChangelistPanel" binding="myNewListPanel" custom-create="true">
|
||||
<constraints>
|
||||
<grid row="3" column="0" row-span="1" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="3" use-parent-layout="false">
|
||||
<minimum-size width="300" height="150"/>
|
||||
<preferred-size width="300" height="150"/>
|
||||
</grid>
|
||||
</constraints>
|
||||
<properties/>
|
||||
</component>
|
||||
</children>
|
||||
</grid>
|
||||
<buttonGroups>
|
||||
<group name="buttonGroup1">
|
||||
<member id="cde9d"/>
|
||||
<member id="e9094"/>
|
||||
</group>
|
||||
</buttonGroups>
|
||||
</form>
|
||||
+103
-117
@@ -15,161 +15,144 @@
|
||||
*/
|
||||
package com.intellij.openapi.vcs.changes.ui;
|
||||
|
||||
import com.intellij.openapi.fileTypes.FileTypes;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.openapi.ui.ComboBox;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.openapi.vcs.VcsBundle;
|
||||
import com.intellij.openapi.vcs.VcsConfiguration;
|
||||
import com.intellij.openapi.vcs.changes.ChangeList;
|
||||
import com.intellij.openapi.vcs.changes.ChangeListManager;
|
||||
import com.intellij.openapi.vcs.changes.LocalChangeList;
|
||||
import com.intellij.openapi.vcs.changes.committed.CommittedChangeListRenderer;
|
||||
import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
import com.intellij.ui.*;
|
||||
import com.intellij.util.NullableConsumer;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.ItemEvent;
|
||||
import java.awt.event.ItemListener;
|
||||
import java.util.*;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public class ChangeListChooserPanel extends JPanel {
|
||||
private static final Comparator<ChangeList> CHANGE_LIST_COMPARATOR = new Comparator<ChangeList>() {
|
||||
@Override
|
||||
public int compare(ChangeList o1, ChangeList o2) {
|
||||
return o1.getName().compareToIgnoreCase(o2.getName());
|
||||
}
|
||||
};
|
||||
|
||||
private JPanel myPanel;
|
||||
private JRadioButton myRbExisting;
|
||||
private JRadioButton myRbNew;
|
||||
private JComboBox myExistingListsCombo;
|
||||
private NewEditChangelistPanel myNewListPanel;
|
||||
private final MyEditorComboBox myExistingListsCombo;
|
||||
private final NewEditChangelistPanel myListPanel;
|
||||
private final NullableConsumer<String> myOkEnabledListener;
|
||||
private Project myProject;
|
||||
private final Project myProject;
|
||||
|
||||
public ChangeListChooserPanel(final Project project, @NotNull final NullableConsumer<String> okEnabledListener) {
|
||||
super(new BorderLayout());
|
||||
myProject = project;
|
||||
myOkEnabledListener = okEnabledListener;
|
||||
add(myPanel, BorderLayout.CENTER);
|
||||
|
||||
myRbExisting.addItemListener(new ItemListener() {
|
||||
public void itemStateChanged(ItemEvent e) {
|
||||
updateEnabledItems();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void init() {
|
||||
myExistingListsCombo.setRenderer(new ColoredListCellRendererWrapper() {
|
||||
private final IssueLinkRenderer myLinkRenderer = new IssueLinkRenderer(myProject, this);
|
||||
|
||||
myExistingListsCombo = new MyEditorComboBox(project);
|
||||
myExistingListsCombo.setEditable(true);
|
||||
myExistingListsCombo.setRenderer(new ColoredListCellRenderer<String>() {
|
||||
@Override
|
||||
protected void doCustomize(JList list, Object value, int index, boolean selected, boolean hasFocus) {
|
||||
if (value instanceof LocalChangeList) {
|
||||
String name = ((LocalChangeList) value).getName();
|
||||
|
||||
if (myExistingListsCombo.getWidth() == 0) {
|
||||
protected void customizeCellRenderer(@NotNull JList<? extends String> list,
|
||||
String value,
|
||||
int index,
|
||||
boolean selected,
|
||||
boolean hasFocus) {
|
||||
if (value != null) {
|
||||
String name = value;
|
||||
LocalChangeList changeList = ChangeListManager.getInstance(myProject).findChangeList(name);
|
||||
int visibleWidth = myExistingListsCombo.getEditorTextField().getVisibleRect().width;
|
||||
if (visibleWidth == 0) {
|
||||
name = name.length() > 10 ? name.substring(0, 7) + " .." : name;
|
||||
}
|
||||
else {
|
||||
final FontMetrics fm = list.getFontMetrics(list.getFont());
|
||||
final int width = fm.stringWidth(name);
|
||||
final int listWidth = myExistingListsCombo.getWidth();
|
||||
if ((listWidth > 0) && (width > listWidth)) {
|
||||
final String truncated = CommittedChangeListRenderer.truncateDescription(name, fm, listWidth - fm.stringWidth(" ..") - 7);
|
||||
if ((visibleWidth > 0) && (width > visibleWidth)) {
|
||||
final String truncated = CommittedChangeListRenderer
|
||||
.truncateDescription(name, fm, visibleWidth - fm.stringWidth(" ..") - 7);
|
||||
if (truncated.length() > 5) {
|
||||
name = truncated + " ..";
|
||||
}
|
||||
}
|
||||
}
|
||||
myLinkRenderer.appendTextWithLinks(name, ((LocalChangeList)value).isDefault()
|
||||
? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES : SimpleTextAttributes.REGULAR_ATTRIBUTES);
|
||||
append(name, changeList != null && changeList.isDefault()
|
||||
? SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES
|
||||
: SimpleTextAttributes.REGULAR_ATTRIBUTES);
|
||||
}
|
||||
}
|
||||
});
|
||||
myNewListPanel.init(null);
|
||||
myRbNew.addFocusListener(new FocusAdapter() {
|
||||
myListPanel = new NewEditChangelistPanel(myProject) {
|
||||
|
||||
@Override
|
||||
public void focusGained(FocusEvent e) {
|
||||
if (myRbNew.isSelected()) {
|
||||
IdeFocusManager.getInstance(myProject).requestFocus(myNewListPanel.getPreferredFocusedComponent(), true);
|
||||
}
|
||||
protected NewEditChangelistPanel.ComponentWithTextFieldWrapper createComponentWithTextField(Project project) {
|
||||
return new ComponentWithTextFieldWrapper(myExistingListsCombo) {
|
||||
@NotNull
|
||||
@Override
|
||||
public EditorTextField getEditorTextField() {
|
||||
return myExistingListsCombo.getEditorTextField();
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
final ComboboxSpeedSearch search = new ComboboxSpeedSearch(myExistingListsCombo);
|
||||
search.setComparator(new SpeedSearchComparator(true, false));
|
||||
|
||||
@Override
|
||||
protected void nameChanged(String errorMessage) {
|
||||
LocalChangeList list = getExistingChangelist();
|
||||
setDescription(list != null ? list.getComment() : "");
|
||||
myOkEnabledListener.consume(errorMessage);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void nameChangedImpl(Project project, LocalChangeList initial) {
|
||||
nameChanged(StringUtil.isEmptyOrSpaces(getChangeListName()) ? "Cannot create new changelist with empty name." : null);
|
||||
}
|
||||
};
|
||||
myOkEnabledListener = okEnabledListener;
|
||||
add(myListPanel, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
public void init() {
|
||||
myListPanel.init(null);
|
||||
}
|
||||
|
||||
public void setChangeLists(Collection<? extends ChangeList> changeLists) {
|
||||
List<ChangeList> list = new ArrayList<ChangeList>(changeLists);
|
||||
Collections.sort(list, CHANGE_LIST_COMPARATOR);
|
||||
myExistingListsCombo.setModel(new CollectionComboBoxModel(list, null));
|
||||
List<String> changelistNames = ContainerUtil.map(changeLists, ChangeList::getName);
|
||||
Collections.sort(changelistNames);
|
||||
myExistingListsCombo.setModel(new CollectionComboBoxModel<String>(changelistNames));
|
||||
}
|
||||
|
||||
public void setDefaultName(String name) {
|
||||
if (! StringUtil.isEmptyOrSpaces(name)) {
|
||||
myNewListPanel.setChangeListName(name);
|
||||
if (!StringUtil.isEmptyOrSpaces(name)) {
|
||||
myListPanel.setChangeListName(name);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateEnabledItems() {
|
||||
if (myRbExisting.isSelected()) {
|
||||
myExistingListsCombo.setEnabled(true);
|
||||
UIUtil.setEnabled(myNewListPanel, false, true);
|
||||
myExistingListsCombo.requestFocus();
|
||||
}
|
||||
else {
|
||||
myExistingListsCombo.setEnabled(false);
|
||||
UIUtil.setEnabled(myNewListPanel, true, true);
|
||||
myNewListPanel.requestFocus();
|
||||
}
|
||||
if (myProject != null) {
|
||||
myNewListPanel.nameChangedImpl(myProject, null);
|
||||
myListPanel.nameChangedImpl(myProject, null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method used as getResult, usually invoked inside doOkAction
|
||||
*/
|
||||
@Nullable
|
||||
public LocalChangeList getSelectedList(Project project) {
|
||||
ChangeListManager manager = ChangeListManager.getInstance(project);
|
||||
if (myRbNew.isSelected()) {
|
||||
String newText = myNewListPanel.getChangeListName();
|
||||
if (manager.findChangeList(newText) != null) {
|
||||
Messages.showErrorDialog(project,
|
||||
VcsBundle.message("changes.newchangelist.warning.already.exists.text", newText),
|
||||
VcsBundle.message("changes.newchangelist.warning.already.exists.title"));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
final boolean existingSelected = myRbExisting.isSelected();
|
||||
VcsConfiguration.getInstance(myProject).PRESELECT_EXISTING_CHANGELIST = existingSelected;
|
||||
String changeListName = myListPanel.getChangeListName();
|
||||
LocalChangeList localChangeList = manager.findChangeList(changeListName);
|
||||
|
||||
if (existingSelected) {
|
||||
return (LocalChangeList)myExistingListsCombo.getSelectedItem();
|
||||
if (localChangeList == null) {
|
||||
localChangeList = manager.addChangeList(changeListName, myListPanel.getDescription());
|
||||
myListPanel.changelistCreatedOrChanged(localChangeList);
|
||||
}
|
||||
else {
|
||||
LocalChangeList changeList = manager.addChangeList(myNewListPanel.getChangeListName(), myNewListPanel.getDescription());
|
||||
myNewListPanel.changelistCreatedOrChanged(changeList);
|
||||
if (myNewListPanel.getMakeActiveCheckBox().isSelected()) {
|
||||
manager.setDefaultChangeList(changeList);
|
||||
}
|
||||
VcsConfiguration.getInstance(project).MAKE_NEW_CHANGELIST_ACTIVE = myNewListPanel.getMakeActiveCheckBox().isSelected();
|
||||
|
||||
return changeList;
|
||||
//update description if changed
|
||||
localChangeList.setComment(myListPanel.getDescription());
|
||||
}
|
||||
if (myListPanel.getMakeActiveCheckBox().isSelected()) {
|
||||
manager.setDefaultChangeList(localChangeList);
|
||||
}
|
||||
VcsConfiguration.getInstance(project).MAKE_NEW_CHANGELIST_ACTIVE = myListPanel.getMakeActiveCheckBox().isSelected();
|
||||
return localChangeList;
|
||||
}
|
||||
|
||||
public void setDefaultSelection(final ChangeList defaultSelection) {
|
||||
@@ -177,34 +160,37 @@ public class ChangeListChooserPanel extends JPanel {
|
||||
myExistingListsCombo.setSelectedIndex(0);
|
||||
}
|
||||
else {
|
||||
myExistingListsCombo.setSelectedItem(defaultSelection);
|
||||
myExistingListsCombo.setSelectedItem(defaultSelection.getName());
|
||||
}
|
||||
//if defaultSelection was predefined as null then it means we could not use existing is this context
|
||||
if (defaultSelection != null && VcsConfiguration.getInstance(myProject).PRESELECT_EXISTING_CHANGELIST) {
|
||||
myRbExisting.setSelected(true);
|
||||
}
|
||||
else {
|
||||
myRbNew.setSelected(true);
|
||||
}
|
||||
|
||||
updateDescription();
|
||||
updateEnabledItems();
|
||||
}
|
||||
|
||||
public JComponent getPreferredFocusedComponent() {
|
||||
return myRbExisting.isSelected() ? myExistingListsCombo : myNewListPanel.getPreferredFocusedComponent();
|
||||
private void updateDescription() {
|
||||
LocalChangeList list = getExistingChangelist();
|
||||
myListPanel.setDescription(list != null ? list.getComment() : "");
|
||||
}
|
||||
|
||||
private void createUIComponents() {
|
||||
myNewListPanel = new NewEditChangelistPanel(myProject) {
|
||||
private LocalChangeList getExistingChangelist() {
|
||||
ChangeListManager manager = ChangeListManager.getInstance(myProject);
|
||||
String changeListName = myListPanel.getChangeListName();
|
||||
return manager.findChangeList(changeListName);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void nameChanged(String errorMessage) {
|
||||
if (myRbExisting.isSelected()) {
|
||||
myOkEnabledListener.consume(null);
|
||||
} else {
|
||||
myOkEnabledListener.consume(errorMessage);
|
||||
}
|
||||
}
|
||||
};
|
||||
public JComponent getPreferredFocusedComponent() {
|
||||
return myExistingListsCombo;
|
||||
}
|
||||
|
||||
private static class MyEditorComboBox extends ComboBox<String> {
|
||||
|
||||
public MyEditorComboBox(Project project) {
|
||||
super();
|
||||
setEditor(new StringComboboxEditor(project, FileTypes.PLAIN_TEXT, this));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private EditorTextField getEditorTextField() {
|
||||
return ObjectUtils.assertNotNull((EditorTextField)getEditor().getEditorComponent());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user