Merge remote-tracking branch 'origin/master'
[idea/community.git] / plugins / git4idea / src / git4idea / checkin / GitUserNameNotDefinedDialog.java
1 /*
2  * Copyright 2000-2012 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package git4idea.checkin;
17
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.ui.DialogWrapper;
20 import com.intellij.openapi.util.Pair;
21 import com.intellij.openapi.util.text.StringUtil;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import com.intellij.ui.components.JBCheckBox;
24 import com.intellij.ui.components.JBLabel;
25 import com.intellij.util.SystemProperties;
26 import com.intellij.util.ui.GridBag;
27 import com.intellij.util.ui.UIUtil;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.annotations.Nullable;
30
31 import javax.swing.*;
32 import java.awt.*;
33 import java.util.Collection;
34 import java.util.Iterator;
35 import java.util.Map;
36
37 import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces;
38 import static com.intellij.util.ui.UIUtil.DEFAULT_HGAP;
39 import static com.intellij.util.ui.UIUtil.DEFAULT_VGAP;
40
41 /**
42  * @author Kirill Likhodedov
43  */
44 class GitUserNameNotDefinedDialog extends DialogWrapper {
45
46   @NotNull private final Collection<VirtualFile> myRootsWithUndefinedProps;
47   @NotNull private final Collection<VirtualFile> myAllRootsAffectedByCommit;
48   @Nullable private final Pair<String,String> myProposedValues;
49
50   private JTextField myNameTextField;
51   private JTextField myEmailTextField;
52   private JBCheckBox myGlobalCheckbox;
53
54   GitUserNameNotDefinedDialog(@NotNull Project project,
55                                         @NotNull Collection<VirtualFile> rootsWithUndefinedProps, 
56                                         @NotNull Collection<VirtualFile> allRootsAffectedByCommit,
57                                         @NotNull Map<VirtualFile, Pair<String, String>> rootsWithDefinedProps) {
58     super(project, false);
59     myRootsWithUndefinedProps = rootsWithUndefinedProps;
60     myAllRootsAffectedByCommit = allRootsAffectedByCommit;
61
62     myProposedValues = calcProposedValues(rootsWithDefinedProps);
63
64     setTitle("Git User Name Is Not Defined");
65     setOKButtonText("Set and Commit");
66     
67     init();
68   }
69
70   @Override
71   protected ValidationInfo doValidate() {
72     String message = "You have to specify user name and email for Git";
73     if (isEmptyOrSpaces(getUserName())) {
74       return new ValidationInfo(message, myNameTextField);
75     }
76     if (isEmptyOrSpaces(getUserEmail())) {
77       return new ValidationInfo(message, myEmailTextField);
78     }
79     return null;
80   }
81
82   @Override
83   public JComponent getPreferredFocusedComponent() {
84     return myNameTextField;
85   }
86
87   @Nullable
88   private static Pair<String, String> calcProposedValues(Map<VirtualFile, Pair<String, String>> rootsWithDefinedProps) {
89     if (rootsWithDefinedProps.isEmpty()) {
90       return null;
91     }
92     Iterator<Map.Entry<VirtualFile,Pair<String,String>>> iterator = rootsWithDefinedProps.entrySet().iterator();
93     Pair<String, String> firstValue = iterator.next().getValue();
94     while (iterator.hasNext()) {
95       // nothing to propose if there are different values set in different repositories
96       if (!firstValue.equals(iterator.next().getValue())) {
97         return null;
98       }
99     }
100     return firstValue;
101   }
102
103   @Override
104   protected JComponent createCenterPanel() {
105     
106     JLabel icon = new JLabel(UIUtil.getWarningIcon(), SwingConstants.LEFT);
107     JLabel description = new JLabel(getMessageText());
108     
109     myNameTextField = new JTextField(20);
110     JBLabel nameLabel = new JBLabel("Name: ");
111     nameLabel.setDisplayedMnemonic('n');
112     nameLabel.setLabelFor(myNameTextField);
113
114     myEmailTextField = new JTextField(20);
115     JBLabel emailLabel = new JBLabel("E-mail: ");
116     emailLabel.setDisplayedMnemonic('e');
117     emailLabel.setLabelFor(myEmailTextField);
118
119     if (myProposedValues != null) {
120       myNameTextField.setText(myProposedValues.getFirst());
121       myEmailTextField.setText(myProposedValues.getSecond());
122     }
123     else {
124       myNameTextField.setText(SystemProperties.getUserName());
125     }
126
127     myGlobalCheckbox = new JBCheckBox("Set properties globally", true);
128     myGlobalCheckbox.setMnemonic('g');
129
130     JPanel rootPanel = new JPanel(new GridBagLayout());
131     GridBag g = new GridBag()
132       .setDefaultInsets(new Insets(0, 0, DEFAULT_VGAP, DEFAULT_HGAP))
133       .setDefaultAnchor(GridBagConstraints.LINE_START)
134       .setDefaultFill(GridBagConstraints.HORIZONTAL);
135     
136     rootPanel.add(description, g.nextLine().next().coverLine(3).pady(DEFAULT_HGAP));
137     rootPanel.add(icon, g.nextLine().next().coverColumn(3));
138     rootPanel.add(nameLabel, g.next().fillCellNone().insets(new Insets(0, 6, DEFAULT_VGAP, DEFAULT_HGAP)));
139     rootPanel.add(myNameTextField, g.next());
140     rootPanel.add(emailLabel, g.nextLine().next().next().fillCellNone().insets(new Insets(0, 6, DEFAULT_VGAP, DEFAULT_HGAP)));
141     rootPanel.add(myEmailTextField, g.next());
142     rootPanel.add(myGlobalCheckbox, g.nextLine().next().next().coverLine(2));
143
144     return rootPanel;
145   }
146
147   @Override
148   protected JComponent createNorthPanel() {
149     return null;
150   }
151
152   @NotNull
153   private String getMessageText() {
154     if (myAllRootsAffectedByCommit.size() == myRootsWithUndefinedProps.size()) {
155       return "";
156     }
157     String text = "Git user.name and user.email properties are not defined in " + StringUtil.pluralize("root", myRootsWithUndefinedProps.size()) + "<br/>";
158     for (VirtualFile root : myRootsWithUndefinedProps) {
159       text += root.getPresentableUrl() + "<br/>";
160     }
161     return "<html>" + text + "</html>";
162   }
163
164   public String getUserName() {
165     return myNameTextField.getText();
166   }
167
168   public String getUserEmail() {
169     return myEmailTextField.getText();
170   }
171
172   public boolean isGlobal() {
173     return myGlobalCheckbox.isSelected();
174   }
175
176 }