Package jetbrains.communicator.commands

Source Code of jetbrains.communicator.commands.DeleteCommand$GroupTextExtractor

/*
* 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();
    }
  }
}
TOP

Related Classes of jetbrains.communicator.commands.DeleteCommand$GroupTextExtractor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.