/*
* Copyright 2000-2006 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 jetbrains.communicator.commands;
import jetbrains.communicator.core.users.User;
import jetbrains.communicator.core.users.UserModel;
import jetbrains.communicator.ide.IDEFacade;
import jetbrains.communicator.ide.UserListComponent;
import jetbrains.communicator.util.StringUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author Kir
*/
public class DeleteCommand extends EnabledWhenFocusedCommand {
static final String QUESTION_PREFIX = "Delete ";
private final UserModel myUserModel;
private final IDEFacade myIDEFacade;
public DeleteCommand(UserModel userModel, UserListComponent usetListComponent, IDEFacade facade) {
super(usetListComponent);
myUserModel = userModel;
myIDEFacade = facade;
}
public boolean enabled() {
return myUserListComponent.getSelectedNodes().length > 0;
}
public void execute() {
Object[] selectedNodes = myUserListComponent.getSelectedNodes();
if (!myIDEFacade.askQuestion("Delete Confirmation", buildQuestion(selectedNodes))) {
return;
}
deleteSelectedUsers(selectedNodes);
deleteSelectedGroups(selectedNodes);
}
private void deleteSelectedGroups(Object[] selectedNodes) {
for (int i = 0; i < selectedNodes.length; i++) {
Object selectedNode = selectedNodes[i];
if (selectedNode instanceof String) {
myUserModel.removeGroup((String) selectedNode);
}
}
}
private void deleteSelectedUsers(Object[] selectedNodes) {
for (int i = 0; i < selectedNodes.length; i++) {
Object selectedNode = selectedNodes[i];
if (selectedNode instanceof User) {
myUserModel.removeUser((User) selectedNode);
}
}
}
String buildQuestion(Object[] selectedNodes) {
List usersToDelete = new ArrayList();
final List groupsToDelete = new ArrayList();
buildListOfDeletedUsersAndGroups(selectedNodes, usersToDelete, groupsToDelete);
StringBuffer question = new StringBuffer(QUESTION_PREFIX);
final boolean hasBothUsersAndGroups = usersToDelete.size() > 0 && groupsToDelete.size() > 0;
appendItems(question, groupsToDelete, "group", hasBothUsersAndGroups,
new GroupTextExtractor(groupsToDelete, hasBothUsersAndGroups));
if (hasBothUsersAndGroups) {
appendAndBetweenGroupsAndUsers(question, groupsToDelete, usersToDelete);
}
appendItems(question, usersToDelete, "user", hasBothUsersAndGroups, new ItemTextExtractor() {
public String getText(Object item) {
return ((User) item).getDisplayName();
}
});
if (hasBothUsersAndGroups && usersToDelete.size() > 1) {
question.append(" \nfrom other groups");
}
question.append('?');
return question.toString();
}
private void appendAndBetweenGroupsAndUsers(StringBuffer question, List groupsToDelete, List usersToDelete) {
if (groupsToDelete.size() > 1) {
question.append(" \n");
}
else {
question.append(' ');
}
question.append("and ");
if (usersToDelete.size() > 1) {
question.append('\n');
}
}
private void buildListOfDeletedUsersAndGroups(Object[] selectedNodes, List usersToDelete, List groupsToDelete) {
for (int i = 0; i < selectedNodes.length; i++) {
Object selectedNode = selectedNodes[i];
if (selectedNode instanceof User) {
usersToDelete.add(selectedNode);
}
else if (selectedNode instanceof String) {
groupsToDelete.add(selectedNode);
}
}
for (Iterator it = usersToDelete.iterator(); it.hasNext();) {
User user = (User) it.next();
if (groupsToDelete.contains(user.getGroup())) {
it.remove();
}
}
}
private void appendItems(StringBuffer question, List items, String itemName, boolean useCommasOnly, ItemTextExtractor extractor) {
if (items.size() > 0) {
StringUtil.appendItemName(question, itemName, items.size());
question.append(' ');
appendCommaSeparated(question, items, extractor);
appendTail(question, items, extractor, useCommasOnly);
}
}
private void appendTail(StringBuffer question, List items, ItemTextExtractor extractor, boolean useCommasOnly) {
if (items.size() >= 2) {
question.append(extractor.getText(items.get(items.size() - 2)));
if (items.size() >= 3 || useCommasOnly) {
question.append(", ");
}
else {
question.append(' ');
}
if (!useCommasOnly) {
question.append("and ");
}
}
question.append(extractor.getText(items.get(items.size() - 1)));
}
private void appendCommaSeparated(StringBuffer question, List items, ItemTextExtractor extractor) {
for (int i = 0; i < items.size() - 2; i++) {
String itemText = extractor.getText(items.get(i));
question.append(itemText).append(", ");
}
}
private interface ItemTextExtractor {
String getText(Object item);
}
private class GroupTextExtractor implements ItemTextExtractor {
private final List myGroupsToDelete;
private final boolean myHasBothUsersAndGroups;
GroupTextExtractor(List groupsToDelete, boolean hasBothUsersAndGroups) {
myGroupsToDelete = groupsToDelete;
myHasBothUsersAndGroups = hasBothUsersAndGroups;
}
public String getText(Object item) {
int numberOfUsers = myUserModel.getUsers((String) item).length;
StringBuffer sb = new StringBuffer("\"" + item + '"');
if (numberOfUsers == 0) {
return sb.toString();
}
if (myGroupsToDelete.size() == 1 && !myHasBothUsersAndGroups) {
sb.append(" with its ");
StringUtil.appendItems(sb, "user", numberOfUsers);
}
else {
sb.append('(');
StringUtil.appendItems(sb, "user", numberOfUsers);
sb.append(')');
}
return sb.toString();
}
}
}