src/org/jetbrains/tfsIntegration/ui/WorkspaceForm.java (220 lines of code) (raw):
/*
* Copyright 2000-2008 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.tfsIntegration.ui;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.EnumComboBoxModel;
import com.intellij.util.EventDispatcher;
import com.intellij.util.ui.*;
import com.intellij.vcsUtil.VcsUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.tfsIntegration.core.TFSBundle;
import org.jetbrains.tfsIntegration.core.tfs.*;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.table.TableCellEditor;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
public class WorkspaceForm {
private JTextField myNameField;
private JLabel myServerField;
private JLabel myOwnerField;
private JLabel myComputerField;
private JTextArea myCommentField;
private JPanel myContentPane;
private JPanel myTableWrapper;
private ValidatingTableEditor<WorkingFolderInfo> myTable;
private JLabel myMessageLabel;
private JLabel myWorkingFoldrersLabel;
private ComboBox myLocationField;
private ServerInfo myServer;
private final Project myProject;
@Nullable private String myWorkingFolderValidationMessage;
private final EventDispatcher<ChangeListener> myEventDispatcher = EventDispatcher.create(ChangeListener.class);
private static final ColumnInfo<WorkingFolderInfo, Object> STATUS_COLUMN =
new ColumnInfo<WorkingFolderInfo, Object>(TFSBundle.message("working.folder.status.column")) {
@Override
public Object valueOf(WorkingFolderInfo item) {
return item.getStatus();
}
@Override
public void setValue(WorkingFolderInfo item, Object value) {
item.setStatus((WorkingFolderInfo.Status)value);
}
@Override
public boolean isCellEditable(WorkingFolderInfo workingFolderInfo) {
return true;
}
@Override
public int getWidth(JTable table) {
return 80;
}
@Override
public TableCellEditor getEditor(WorkingFolderInfo o) {
return new AbstractTableCellEditor() {
private ComboBox myCombo;
@Override
public Object getCellEditorValue() {
return myCombo.getSelectedItem();
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
ComboBoxModel model = new EnumComboBoxModel<>(WorkingFolderInfo.Status.class);
model.setSelectedItem(value);
myCombo = new ComboBox(model, getWidth(table));
return myCombo;
}
};
}
};
private class LocalPathColumn extends ColumnInfo<WorkingFolderInfo, String> implements ValidatingTableEditor.RowHeightProvider {
LocalPathColumn() {
super(TFSBundle.message("working.folder.local.path.column"));
}
@Override
public String valueOf(WorkingFolderInfo item) {
return item.getLocalPath().getPresentableUrl();
}
@Override
public boolean isCellEditable(WorkingFolderInfo workingFolderInfo) {
return true;
}
@Override
public void setValue(WorkingFolderInfo item, String value) {
item.setLocalPath(VcsUtil.getFilePath(value));
}
@Override
public TableCellEditor getEditor(final WorkingFolderInfo item) {
return new LocalPathCellEditor(TFSBundle.message("select.local.path.title"), myProject);
}
@Override
public int getRowHeight() {
return new JTextField().getPreferredSize().height + 1;
}
}
private final ColumnInfo<WorkingFolderInfo, String> SERVER_PATH_COLUMN =
new ColumnInfo<WorkingFolderInfo, String>(TFSBundle.message("working.folder.server.path.column")) {
@Override
public String valueOf(WorkingFolderInfo item) {
return item.getServerPath();
}
@Override
public void setValue(WorkingFolderInfo item, String value) {
item.setServerPath(value);
}
@Override
public boolean isCellEditable(WorkingFolderInfo item) {
return true;
}
@Override
public TableCellEditor getEditor(final WorkingFolderInfo item) {
return new ServerPathCellEditor(TFSBundle.message("choose.server.path.dialog.title"), myProject, myServer);
}
};
private void createUIComponents() {
myTable = new ValidatingTableEditor<WorkingFolderInfo>() {
@Override
protected WorkingFolderInfo cloneOf(WorkingFolderInfo item) {
return item.getCopy();
}
@Override
protected WorkingFolderInfo createItem() {
String path = myProject.isDefault() ? "" : myProject.getBasePath();
return new WorkingFolderInfo(VcsUtil.getFilePath(path));
}
@Override
@Nullable
protected String validate(WorkingFolderInfo item) {
if (StringUtil.isEmpty(item.getLocalPath().getPath())) {
return TFSBundle.message("local.path.is.empty");
}
if (StringUtil.isEmpty(item.getServerPath())) {
return TFSBundle.message("server.path.is.empty");
}
if (!item.getServerPath().startsWith(VersionControlPath.ROOT_FOLDER)) {
return TFSBundle.message("server.path.is.invalid");
}
return null;
}
@Override
protected void displayMessageAndFix(@Nullable Pair<String, Fix> messageAndFix) {
myWorkingFolderValidationMessage = Pair.getFirst(messageAndFix);
myEventDispatcher.getMulticaster().stateChanged(new ChangeEvent(this));
}
};
myTable.hideMessageLabel();
myTable.setColumnReorderingAllowed(false);
myTableWrapper = new JPanel(new BorderLayout());
myTableWrapper.add(myTable.getContentPane());
}
private void setupLocations() {
for (WorkspaceInfo.Location location : WorkspaceInfo.Location.values()) {
myLocationField.addItem(location);
}
}
private WorkspaceForm(final Project project) {
myProject = project;
myWorkingFoldrersLabel.setLabelFor(myTable.getPreferredFocusedComponent());
DocumentAdapter listener = new DocumentAdapter() {
@Override
protected void textChanged(@NotNull final DocumentEvent e) {
myEventDispatcher.getMulticaster().stateChanged(new ChangeEvent(e));
}
};
myNameField.getDocument().addDocumentListener(listener);
myCommentField.getDocument().addDocumentListener(listener);
myMessageLabel.setIcon(UIUtil.getBalloonWarningIcon());
setupLocations();
}
public WorkspaceForm(Project project, @NotNull ServerInfo server) {
this(project);
myServer = server;
myServerField.setText(myServer.getPresentableUri());
myOwnerField.setText(myServer.getQualifiedUsername());
myComputerField.setText(Workstation.getComputerName());
myTable.setModel(new ColumnInfo[]{STATUS_COLUMN, new LocalPathColumn(), SERVER_PATH_COLUMN}, new ArrayList<>());
}
public WorkspaceForm(Project project, @NotNull WorkspaceInfo workspace) {
this(project, workspace.getServer());
myNameField.setText(workspace.getName());
myLocationField.setSelectedItem(workspace.getLocation());
myCommentField.setText(workspace.getComment());
myTable.setModel(new ColumnInfo[]{STATUS_COLUMN, new LocalPathColumn(), SERVER_PATH_COLUMN},
new ArrayList<>(workspace.getWorkingFoldersCached()));
}
public JPanel getContentPane() {
return myContentPane;
}
public String getWorkspaceName() {
return myNameField.getText();
}
@NotNull
public WorkspaceInfo.Location getWorkspaceLocation() {
return (WorkspaceInfo.Location)myLocationField.getSelectedItem();
}
public String getWorkspaceComment() {
return myCommentField.getText();
}
public List<WorkingFolderInfo> getWorkingFolders() {
return myTable.getItems();
}
public void addListener(ChangeListener listener) {
myEventDispatcher.addListener(listener);
}
public void setErrorMessage(@Nullable final String message) {
myMessageLabel.setText(message);
myMessageLabel.setVisible(message != null);
}
public JComponent getPreferredFocusedComponent() {
return myNameField;
}
@Nullable
public String validateWorkingFolders() {
return myWorkingFolderValidationMessage;
}
}