git: fix i18n warnings
[idea/community.git] / plugins / git4idea / src / git4idea / checkin / GitUserNameNotDefinedDialog.java
1 /*
2  * Copyright 2000-2014 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.ui.ValidationInfo;
21 import com.intellij.openapi.util.Couple;
22 import com.intellij.openapi.util.NlsContexts;
23 import com.intellij.openapi.util.text.HtmlBuilder;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.ui.components.JBCheckBox;
26 import com.intellij.ui.components.JBLabel;
27 import com.intellij.util.SystemProperties;
28 import com.intellij.util.ui.GridBag;
29 import com.intellij.util.ui.JBUI;
30 import com.intellij.util.ui.UIUtil;
31 import git4idea.config.GitVcsSettings;
32 import git4idea.i18n.GitBundle;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35
36 import javax.swing.*;
37 import java.awt.*;
38 import java.util.Collection;
39 import java.util.Iterator;
40 import java.util.Map;
41
42 import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces;
43 import static com.intellij.util.ui.UIUtil.DEFAULT_HGAP;
44 import static com.intellij.util.ui.UIUtil.DEFAULT_VGAP;
45
46 class GitUserNameNotDefinedDialog extends DialogWrapper {
47
48   @NotNull private final Collection<? extends VirtualFile> myRootsWithUndefinedProps;
49   @NotNull private final Collection<? extends VirtualFile> myAllRootsAffectedByCommit;
50   @Nullable private final Couple<String> myProposedValues;
51   @NotNull private final GitVcsSettings mySettings;
52
53   private JTextField myNameTextField;
54   private JTextField myEmailTextField;
55   private JBCheckBox myGlobalCheckbox;
56
57   GitUserNameNotDefinedDialog(@NotNull Project project,
58                               @NotNull Collection<? extends VirtualFile> rootsWithUndefinedProps,
59                               @NotNull Collection<? extends VirtualFile> allRootsAffectedByCommit,
60                               @NotNull Map<VirtualFile, Couple<String>> rootsWithDefinedProps) {
61     super(project, false);
62     myRootsWithUndefinedProps = rootsWithUndefinedProps;
63     myAllRootsAffectedByCommit = allRootsAffectedByCommit;
64     mySettings = GitVcsSettings.getInstance(project);
65
66     myProposedValues = calcProposedValues(rootsWithDefinedProps);
67
68     setTitle(GitBundle.message("title.user.name.email.not.specified"));
69     setOKButtonText(GitBundle.message("button.set.name.and.commit"));
70
71     init();
72   }
73
74   @Override
75   protected ValidationInfo doValidate() {
76     String message = GitBundle.message("validation.warning.set.name.email.for.git");
77     if (isEmptyOrSpaces(getUserName())) {
78       return new ValidationInfo(message, myNameTextField);
79     }
80     if (isEmptyOrSpaces(getUserEmail())) {
81       return new ValidationInfo(message, myEmailTextField);
82     }
83     return null;
84   }
85
86   @Override
87   public JComponent getPreferredFocusedComponent() {
88     return myNameTextField;
89   }
90
91   @Nullable
92   private static Couple<String> calcProposedValues(Map<VirtualFile, Couple<String>> rootsWithDefinedProps) {
93     if (rootsWithDefinedProps.isEmpty()) {
94       return null;
95     }
96     Iterator<Map.Entry<VirtualFile,Couple<String>>> iterator = rootsWithDefinedProps.entrySet().iterator();
97     Couple<String> firstValue = iterator.next().getValue();
98     while (iterator.hasNext()) {
99       // nothing to propose if there are different values set in different repositories
100       if (!firstValue.equals(iterator.next().getValue())) {
101         return null;
102       }
103     }
104     return firstValue;
105   }
106
107   @Override
108   protected JComponent createCenterPanel() {
109
110     JLabel icon = new JLabel(UIUtil.getWarningIcon(), SwingConstants.LEFT);
111     JLabel description = new JLabel(getMessageText());
112
113     myNameTextField = new JTextField(20);
114     JBLabel nameLabel = new JBLabel(GitBundle.message("label.user.name") + " ");
115     nameLabel.setDisplayedMnemonic('n');
116     nameLabel.setLabelFor(myNameTextField);
117
118     myEmailTextField = new JTextField(20);
119     JBLabel emailLabel = new JBLabel(GitBundle.message("label.user.email") + " ");
120     emailLabel.setDisplayedMnemonic('e');
121     emailLabel.setLabelFor(myEmailTextField);
122
123     if (myProposedValues != null) {
124       myNameTextField.setText(myProposedValues.getFirst());
125       myEmailTextField.setText(myProposedValues.getSecond());
126     }
127     else {
128       myNameTextField.setText(SystemProperties.getUserName());
129     }
130
131     myGlobalCheckbox = new JBCheckBox(GitBundle.message("checkbox.set.config.property.globally"), mySettings.shouldSetUserNameGlobally());
132     myGlobalCheckbox.setMnemonic('g');
133
134     JPanel rootPanel = new JPanel(new GridBagLayout());
135     GridBag g = new GridBag()
136       .setDefaultInsets(JBUI.insets(0, 0, DEFAULT_VGAP, DEFAULT_HGAP))
137       .setDefaultAnchor(GridBagConstraints.LINE_START)
138       .setDefaultFill(GridBagConstraints.HORIZONTAL);
139
140     rootPanel.add(description, g.nextLine().next().coverLine(3).pady(DEFAULT_HGAP));
141     rootPanel.add(icon, g.nextLine().next().coverColumn(3));
142     rootPanel.add(nameLabel, g.next().fillCellNone().insets(JBUI.insets(0, 6, DEFAULT_VGAP, DEFAULT_HGAP)));
143     rootPanel.add(myNameTextField, g.next());
144     rootPanel.add(emailLabel, g.nextLine().next().next().fillCellNone().insets(JBUI.insets(0, 6, DEFAULT_VGAP, DEFAULT_HGAP)));
145     rootPanel.add(myEmailTextField, g.next());
146     rootPanel.add(myGlobalCheckbox, g.nextLine().next().next().coverLine(2));
147
148     return rootPanel;
149   }
150
151   @Override
152   protected JComponent createNorthPanel() {
153     return null;
154   }
155
156   @NlsContexts.Label
157   @NotNull
158   private String getMessageText() {
159     if (myAllRootsAffectedByCommit.size() == myRootsWithUndefinedProps.size()) {
160       return "";
161     }
162     HtmlBuilder sb = new HtmlBuilder()
163       .append(GitBundle.message("label.name.email.not.defined.in.n.roots", myRootsWithUndefinedProps.size()));
164     for (VirtualFile root : myRootsWithUndefinedProps) {
165       sb.br().append(root.getPresentableUrl());
166     }
167     return sb.wrapWithHtmlBody().toString();
168   }
169
170   public String getUserName() {
171     return myNameTextField.getText();
172   }
173
174   public String getUserEmail() {
175     return myEmailTextField.getText();
176   }
177
178   public boolean isGlobal() {
179     return myGlobalCheckbox.isSelected();
180   }
181
182 }