Package com.zycus.dotproject.ui

Source Code of com.zycus.dotproject.ui.ProjectTaskArea$DefaultRenderer

package com.zycus.dotproject.ui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.Stack;
import java.util.Vector;

import javax.swing.AbstractAction;
import javax.swing.AbstractCellEditor;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.ListCellRenderer;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.tree.TreeModel;

import com.zycus.dotproject.bo.BOProject;
import com.zycus.dotproject.bo.BOTask;
import com.zycus.dotproject.bo.BOUser;
import com.zycus.dotproject.bo.Priority;
import com.zycus.dotproject.bo.TaskCompletionStatus;
import com.zycus.dotproject.factory.UserManagerFactory;
import com.zycus.dotproject.ui.TreeViewProjectModel.Columns;
import com.zycus.dotproject.ui.TreeViewProjectModel.PureTreeModel;
import com.zycus.dotproject.ui.component.IndentBorder;
import com.zycus.dotproject.ui.component.JTreeTable;
import com.zycus.dotproject.ui.component.TreeTableModel;
import com.zycus.dotproject.ui.component.datepicker.CalendarADC;
import com.zycus.dotproject.ui.event.ProjectSelectionListener;
import com.zycus.dotproject.ui.event.ViewChangeListener.ViewType;
import com.zycus.dotproject.util.ApplicationContext;
import com.zycus.dotproject.util.DialogUtility;
import com.zycus.dotproject.util.ProjectCalculator;

/**
* http://www.jroller.com/santhosh/entry/tree_inside_jcombobox
*
*/
public class ProjectTaskArea extends JTreeTable {
  private TreeViewProjectModel    customModel  = null;
  private DotProjectPopupMenu      popup    = null;
  private DotProjectHeaderPopupMenu  headerPopup  = null;
 
  static class AddChildAction extends AbstractAction {
    private ProjectTaskArea  pta  = null;

    public AddChildAction(ProjectTaskArea pta) {
      this.pta = pta;
    }

    public void actionPerformed(ActionEvent e) {
      pta.onAddTask();
    }
  }

  static class AddTaskLogAction extends AbstractAction {
    private ProjectTaskArea  pta  = null;

    public AddTaskLogAction(ProjectTaskArea pta) {
      this.pta = pta;
    }

    public void actionPerformed(ActionEvent e) {
      int selectedRow = pta.getSelectedRow();
      if (selectedRow < 0) {
        return;
      }
      Object selectedObject = null;
      if ((selectedObject = pta.getValueAt(selectedRow, -1)) == null) {
        return;
      }
      if (selectedObject instanceof BOTask && ((BOTask) selectedObject).canAddTaskLog(ApplicationContext.getCurrentUser())) {
        DialogUtility.showDialog(new TaskLogPanel(null, (BOTask) selectedObject), "Add New Log", new Dimension(400, 300));
        pta.dataChanged();
      }
    }
  }

  static class TaskDetailsAction extends AbstractAction {
    private ProjectTaskArea  pta  = null;

    public TaskDetailsAction(ProjectTaskArea pta) {
      this.pta = pta;
    }

    public void actionPerformed(ActionEvent e) {
      int selectedRow = pta.getSelectedRow();
      if (selectedRow < 0) {
        return;
      }
      Object selectedObject = null;
      if ((selectedObject = pta.getValueAt(selectedRow, -1)) == null) {
        return;
      }
      if (selectedObject instanceof BOTask) {
        DialogUtility.showDialog(new TaskManagementPanel((BOTask) selectedObject), "Task Details : " + ((BOTask) selectedObject).getTaskName(), new Dimension(750, 350));
      }
    }
  }
 
  static class TaskDeleteAction extends AbstractAction {
    private ProjectTaskArea  pta  = null;

    public TaskDeleteAction(ProjectTaskArea pta) {
      this.pta = pta;
    }

    public void actionPerformed(ActionEvent e) {
      int selectedRow = pta.getSelectedRow();
      if (selectedRow < 0) {
        return;
      }
      Object selectedObject = null;
      if ((selectedObject = pta.getValueAt(selectedRow, -1)) == null) {
        return;
      }
      if (selectedObject instanceof BOTask) {
        pta.onDeleteTask();
      }
    }
  }

  static class ExpandAllAction extends AbstractAction {
    private JTree  tree  = null;

    public ExpandAllAction(JTree tree) {
      this.tree = tree;
    }

    public void actionPerformed(ActionEvent actionEvent) {
      for (int i = tree.getRowCount(); i >= 0; i--) {
        tree.expandRow(i);
      }
    }
  }

  static class CollapseAllAction extends AbstractAction {
    private JTree  tree  = null;

    public CollapseAllAction(JTree tree) {
      this.tree = tree;
    }

    public void actionPerformed(ActionEvent actionEvent) {
      int rowCount = tree.getRowCount();
      for (int i = rowCount; i >= 0; i--) {
        tree.collapseRow(i);
        if (rowCount != tree.getRowCount()) {
          i = rowCount = tree.getRowCount();
        }
      }
    }
  }

  class PopupListener extends MouseAdapter {
    DotProjectColumnSelectorPopupMenu  popupMenu  = new DotProjectColumnSelectorPopupMenu();

    public void mousePressed(MouseEvent e) {
      showPopup(e);
    }

    public void mouseReleased(MouseEvent e) {
      showPopup(e);
    }

    private void showPopup(MouseEvent e) {
      if (e.isPopupTrigger()) {
        popupMenu.show(e.getComponent(), e.getX(), e.getY());
      }
    }
  }

  private class DateEditor extends AbstractCellEditor implements TableCellEditor {
    private JTextField    dateText    = null;
    private ProjectTaskArea  pta        = null;
    private int        currentRow    = -1;
    private int        currentColumn  = -1;
   
    @Deprecated
    private DateComboBox  dateCombo    = null;
    private CalendarADC    dateComboADC  = null;

    private DateEditor(ProjectTaskArea pta) {
      this.pta = pta;
      dateText = new JTextField();
      dateCombo = new DateComboBox();
      dateCombo.setEditable(true);
      dateComboADC = new CalendarADC();
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      if (value != null && value instanceof Date) {
        //dateCombo.setSelectedItem(formatter.format((Date) value));
        dateComboADC.setDate((Date) value);
      }
      if (value == null) {
        //dateCombo.setSelectedItem(formatter.format(new Date()));
        dateComboADC.setDate(new Date());
      }
      currentRow = row;
      currentColumn = column;
      return dateComboADC/*dateCombo dateText */;
    }

    public Object getCellEditorValue() {
     
      dateText.setText(formatter.format(dateComboADC.getDate()));
      try {
        return formatter.parse(dateText.getText());
      } catch (ParseException e) {
        JOptionPane.showMessageDialog(ApplicationContext.getCurrentFrame(), "Please provide proper Date", "Invalid Date", JOptionPane.ERROR_MESSAGE);
        throw new RuntimeException(e);
      }
    }
  }

  static class ChildrenEnumeration implements Enumeration {
    TreeModel  treeModel;
    Object    node;
    int      index  = -1;

    public ChildrenEnumeration(TreeModel treeModel, Object node) {
      this.treeModel = treeModel;
      this.node = node;
    }

    public boolean hasMoreElements() {
      return index < treeModel.getChildCount(node) - 1;
    }

    public Object nextElement() {
      return treeModel.getChild(node, ++index);
    }
  }

  static class PreorderEnumeration implements Enumeration {
    private TreeModel            treeModel;
    protected Stack<Enumeration<Object>>  stack;

    public PreorderEnumeration(TreeModel treeModel) {
      this.treeModel = treeModel;
      Vector<Object> v = new Vector<Object>(1);
      v.addElement(treeModel.getRoot());
      stack = new Stack<Enumeration<Object>>();
      stack.push(v.elements());
    }

    public boolean hasMoreElements() {
      return (!stack.empty() && stack.peek().hasMoreElements());
    }

    public Object nextElement() {
      Enumeration enumer = stack.peek();
      Object node = enumer.nextElement();
      if (!enumer.hasMoreElements())
        stack.pop();
      Enumeration<Object> children = new ChildrenEnumeration(treeModel, node);
      if (children.hasMoreElements())
        stack.push(children);
      return node;
    }
  }

  private class AssineeListEditor extends AbstractCellEditor implements TableCellEditor {
    private JComboBox    userCombo    = null;
    private ProjectTaskArea  pta        = null;
    private int        currentRow    = -1;
    private List<BOUser>  allUsers    = null;
    private Set<BOUser>    currentUsers  = null;

    private AssineeListEditor(ProjectTaskArea pta) {
      this.pta = pta;
      allUsers = UserManagerFactory.getUserManager().getAllUsers();
      Collections.sort(allUsers);
      userCombo = new JComboBox(allUsers.toArray()) {
        @Override
        public void hidePopup() {
          // super.hidePopup();
        }

        @Override
        public void setPopupVisible(boolean v) {
          if (!v) {
            return;
          }
          super.setPopupVisible(v);
        }
      };
      userCombo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
          BOUser user = (BOUser) userCombo.getSelectedItem();
          addEditUser(user);
        }
      });
      userCombo.setRenderer(new CheckComboRenderer());
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      if (value instanceof Set) {
        currentUsers = (Set<BOUser>) value;
      }
      currentRow = row;
      return userCombo;
    }

    public Object getCellEditorValue() {
      return userCombo.getSelectedItem();
    }

    private Set<BOUser> removeUser(BOUser user, Set<BOUser> users) {
      Set<BOUser> usesReturn = new LinkedHashSet<BOUser>();
      for (BOUser cUser : users) {
        if (cUser.getUserID() == user.getUserID()) {
          continue;
        }
        usesReturn.add(cUser);
      }
      return usesReturn;
    }

    private void addEditUser(BOUser user) {
      if (user == null || currentUsers == null) {
        return;
      }
      if (isUserPresent(user)) {
        currentUsers = removeUser(user, currentUsers);
        // userCombo.showPopup();
        // userCombo.updateUI();
        // userCombo.showPopup();
      } else {
        currentUsers.add(user);
      }
    }

    private boolean isUserPresent(BOUser user) {
      if (currentUsers == null) {
        return false;
      }
      for (BOUser cUser : currentUsers) {
        if (cUser.getUserID() == user.getUserID()) {
          return true;
        }
      }
      return false;
    }

    private class CheckComboRenderer implements ListCellRenderer {
      JCheckBox  checkBox;

      public CheckComboRenderer() {
        checkBox = new JCheckBox();
      }

      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        BOUser user = (BOUser) value;
        checkBox.setText(user.toString());
        // System.out.println(UIManager.getColor(
        // "Menu.selectionBackground"));
        // System.out.println(UIManager.getColor("Menu.background"));
        checkBox.setBackground(isSelected ? UIManager.getColor("Menu.selectionBackground") : UIManager.getColor("Menu.background"));
        if (currentUsers != null && isUserPresent(user)) {
          checkBox.setSelected(true);
        } else {
          checkBox.setSelected(false);
        }
        return checkBox;
      }
    }

    @Override
    protected void fireEditingStopped() {
      int rows[] = pta.getSelectedRows();
      if (rows != null && rows.length > 0) {
        List<BOTask> tasks = new ArrayList<BOTask>();
        for (int row : rows) {
          if (pta.getModel().getValueAt(row, -1) != null) {
            if (pta.getModel().getValueAt(row, -1) instanceof BOTask) {
              BOTask currentTask = (BOTask) pta.getModel().getValueAt(row, -1);
              currentTask.setAssineeUsers(new LinkedHashSet<BOUser>(currentUsers));
              tasks.add(currentTask);
            }
          }
        }
        if (tasks.size() > 0) {
          ProjectCalculator.assineeChanged(currentUsers, tasks.toArray(new BOTask[] {}));
        }
      } else {
        if (currentRow >= 0 && (pta.getModel().getValueAt(currentRow, -1) != null)) {
          if (pta.getModel().getValueAt(currentRow, -1) instanceof BOTask) {
            ((BOTask) pta.getModel().getValueAt(currentRow, -1)).setAssineeUsers(new LinkedHashSet<BOUser>(currentUsers));
            ProjectCalculator.assineeChanged(currentUsers, (BOTask) pta.getModel().getValueAt(currentRow, -1));
          }
        }
      }
      super.fireEditingStopped();
    }
  }

  private class PredecessorsListEditor extends AbstractCellEditor implements TableCellEditor {
    private JComboBox    taskCombo    = null;
    private ProjectTaskArea  pta        = null;
    private int        currentRow    = -1;
    private Set<BOTask>    currentTasks  = null;
    private Set<BOTask>    oldTasks    = new LinkedHashSet<BOTask>();
    // private PureTreeModel pureModel = new
    // TreeViewProjectModel.PureTreeModel();
    private TaskListModel  taskListModel  = new TaskListModel();

    /*
     * private void updateAllTasks() { allTasks = new ArrayList<BOTask>();
     * Enumeration enumer = new PreorderEnumeration(pureModel); while
     * (enumer.hasMoreElements()) { Object obj = enumer.nextElement(); if
     * (obj instanceof BOTask) { allTasks.add((BOTask) obj); } } }
     */

    private PredecessorsListEditor(ProjectTaskArea pta) {
      this.pta = pta;
      taskCombo = new JComboBox(taskListModel) {
        @Override
        public void hidePopup() {
          // super.hidePopup();
        }

        @Override
        public void setPopupVisible(boolean v) {
          if (!v) {
            return;
          }
          super.setPopupVisible(v);
        }
      };
      taskCombo.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionEvent) {
          if (taskCombo.getSelectedItem() == null) {
            return;
          }
          if (taskCombo.getSelectedItem() instanceof BOProject) {
            return;
          }
          BOTask task = (BOTask) taskCombo.getSelectedItem();
          addEditTask(task);
        }
      });

      taskCombo.setRenderer(new CheckComboRenderer());
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      if (value instanceof Set) {
        currentTasks = (Set<BOTask>) value;
        oldTasks.clear();
      }
      taskCombo.updateUI();
      /*
       * updateAllTasks(); taskCombo.removeAllItems();
       *
       * for (BOTask task : allTasks) { taskCombo.addItem(allTasks); }
       * taskCombo.updateUI();
       */
      currentRow = row;
      return taskCombo;
    }

    public Object getCellEditorValue() {
      return taskCombo.getSelectedItem();
    }

    private void addEditTask(BOTask task) {
      if (task == null || currentTasks == null) {
        return;
      }
      if (isTaskPresent(task)) {
        currentTasks.remove(task);
        oldTasks.add(task);
      } else {
        currentTasks.add(task);
        oldTasks.remove(task);
      }
    }

    private boolean isTaskPresent(BOTask task) {
      if (currentTasks == null) {
        return false;
      }
      for (BOTask cTask : currentTasks) {
        if (cTask.getEnhancedTaskID() == task.getEnhancedTaskID()) {
          return true;
        }
      }
      return false;
    }

    private class CheckComboRenderer implements ListCellRenderer {
      private JCheckBox  checkBox;
      private JLabel    lblBlank  = null;

      public CheckComboRenderer() {
        checkBox = new JCheckBox();
        lblBlank = new JLabel();
      }

      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        if (value == null) {
          return lblBlank;
        }
        checkBox.setText(value.toString());
        checkBox.setBackground(isSelected ? UIManager.getColor("Menu.selectionBackground") : UIManager.getColor("Menu.background"));
        if (value instanceof BOTask) {
          if (currentTasks != null && isTaskPresent((BOTask) value)) {
            checkBox.setSelected(true);
          } else {
            checkBox.setSelected(false);
          }
        } else {
          checkBox.setSelected(false);
        }
        int depth = (value instanceof BOProject) ? 0 : getDepth((BOTask) value);
        IndentBorder indentBorder = new IndentBorder();
        indentBorder.setDepth(depth);
        checkBox.setBorder(indentBorder);
        return checkBox;
      }
    }

    @Override
    protected void fireEditingStopped() {
      int rows[] = pta.getSelectedRows();
      if (rows != null && rows.length > 0) {
        for (int row : rows) {
          Object obj = pta.getModel().getValueAt(row, -1);
          if (obj != null) {
            if (obj instanceof BOTask) {
              for (BOTask t : oldTasks) {
                t.getDependentTasks().remove((BOTask) obj);
              }
             
              ((BOTask) obj).setPreviousTasks(new LinkedHashSet<BOTask>(currentTasks));
              for (BOTask t : currentTasks) {
                t.getDependentTasks().add((BOTask) obj);
              }
              ProjectCalculator.predecessorsChanged(currentTasks, (BOTask) obj, ApplicationContext.getCurrentUser());
            }
          }
        }
      } else {
        if (currentRow >= 0 && (pta.getModel().getValueAt(currentRow, -1) != null)) {
          Object obj = pta.getModel().getValueAt(currentRow, -1);
          if (obj instanceof BOTask) {
            for (BOTask t : oldTasks) {
              t.getDependentTasks().remove((BOTask) obj);
            }
           
            ((BOTask) obj).setPreviousTasks(new LinkedHashSet<BOTask>(currentTasks));
            for (BOTask t : currentTasks) {
              t.getDependentTasks().add((BOTask) obj);
            }
            ProjectCalculator.predecessorsChanged(currentTasks, (BOTask) obj, ApplicationContext.getCurrentUser());
          }
        }
      }
      super.fireEditingStopped();
      // pta.dataChanged();
    }
  }

  private class PriorityEditor extends AbstractCellEditor implements TableCellEditor {
    private ProjectTaskArea  pta        = null;
    private JComboBox    priorityCombo  = null;

    private PriorityEditor(ProjectTaskArea pta) {
      priorityCombo = new JComboBox(Priority.values());
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      if (value instanceof Priority) {
        priorityCombo.setSelectedItem(value);
      }
      return priorityCombo;
    }

    public Object getCellEditorValue() {
      return priorityCombo.getSelectedItem();
    }
  }

  private class UserListEditor extends AbstractCellEditor implements TableCellEditor {
    private JComboBox    userCombo  = null;
    private ProjectTaskArea  pta      = null;
    private int        currentRow  = -1;
    private List<BOUser>  users    = null;

    private UserListEditor(ProjectTaskArea pta) {
      this.pta = pta;
      users = UserManagerFactory.getUserManager().getAllUsers();
      userCombo = new JComboBox();
      Collections.sort(users);
      for (BOUser user : users) {
        userCombo.addItem(user);
      }
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      if (value instanceof BOUser) {
        for (BOUser user : users) {
          if (user.getUserID() == ((BOUser) value).getUserID()) {
            userCombo.setSelectedIndex(users.indexOf(user));
            break;
          }
        }
      }
      currentRow = row;
      return userCombo;
    }

    public Object getCellEditorValue() {
      return userCombo.getSelectedItem();
    }

    @Override
    protected void fireEditingStopped() {
      int rows[] = pta.getSelectedRows();
      if (rows != null && rows.length > 0) {
        for (int row : rows) {
          if (pta.getModel().getValueAt(row, -1) != null) {
            if (pta.getModel().getValueAt(row, -1) instanceof BOTask)
              ((BOTask) pta.getModel().getValueAt(row, -1)).setOwner((BOUser) userCombo.getSelectedItem());
          }
        }
      } else {
        if (currentRow >= 0 && (pta.getModel().getValueAt(currentRow, -1) != null)) {
          if (pta.getModel().getValueAt(currentRow, -1) instanceof BOTask)
            ((BOTask) pta.getModel().getValueAt(currentRow, -1)).setOwner((BOUser) userCombo.getSelectedItem());
        }
      }
      super.fireEditingStopped();
    }
  }

  private void removeObject(Set set, Object objToRemove) {
    int size = set.size();
    List lst = new ArrayList(set);
    set.clear();
    for (int iCounter = 0; iCounter < size; iCounter++) {
      if (lst.get(iCounter).hashCode() != objToRemove.hashCode()) {
        set.add(lst.get(iCounter));
      }
    }
  }

  private class TaskParenttEditor extends AbstractCellEditor implements TableCellEditor {
    private JComboBox    taskCombo    = null;
    private ProjectTaskArea  pta        = null;
    private int        currentRow    = -1;
    private TaskListModel  taskListModel  = new TaskListModel();

    private TaskParenttEditor(ProjectTaskArea pta) {
      this.pta = pta;
      taskCombo = new JComboBox(taskListModel);
      taskCombo.setRenderer(new TreeListCellRenderer());
      ApplicationContext.addProjectSelectionListener(new ProjectSelectionListener() {
        public void projectSelected(BOProject project) {
          if (taskCombo != null) {
            taskCombo.updateUI();
          }
        }
      });
    }

    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
      taskCombo.updateUI();
      if (value instanceof BOTask) {
        taskListModel.setSelectedItem(value);
      }
      currentRow = row;
      return taskCombo;
    }

    public Object getCellEditorValue() {
      return taskCombo.getSelectedItem();
    }

    @Override
    protected void fireEditingStopped() {
      if (taskListModel.getSelectedItem() == null || !(taskListModel.getSelectedItem() instanceof BOTask)) {
        super.fireEditingStopped();
        return;
      }
      BOTask newParent = (BOTask) taskListModel.getSelectedItem();

      int rows[] = pta.getSelectedRows();
      if (rows != null && rows.length > 0) {
        List<BOTask> tasks = new ArrayList<BOTask>();
        for (int row : rows) {
          if (pta.getModel().getValueAt(row, -1) != null) {
            if (pta.getModel().getValueAt(row, -1) instanceof BOTask) {
              BOTask currentTask = (BOTask) pta.getModel().getValueAt(row, -1);
              BOTask oldParentTask = currentTask.getParentTask();

              if (oldParentTask == null || oldParentTask.equals(currentTask)) {
                ApplicationContext.getCurrentProjet().getTasks().remove(currentTask);
                removeObject(ApplicationContext.getCurrentProjet().getTasks(), currentTask);
              } else {
                oldParentTask.getChildTasks().remove(currentTask);
                removeObject(oldParentTask.getChildTasks(), currentTask);
              }

              currentTask.setParentTask(newParent);
              tasks.add(currentTask);

              if (newParent.equals(currentTask)) {
                ApplicationContext.getCurrentProjet().getTasks().add(currentTask);
              } else {
                newParent.getChildTasks().add(currentTask);
                newParent.getPreviousTasks().clear();
              }
              ProjectCalculator.parentChanged(newParent, oldParentTask, currentTask, ApplicationContext.getCurrentUser());
            }
          }
        }
      } else {
        if (currentRow >= 0 && (pta.getModel().getValueAt(currentRow, -1) != null)) {
          if (pta.getModel().getValueAt(currentRow, -1) instanceof BOTask) {
            BOTask currentTask = (BOTask) pta.getModel().getValueAt(currentRow, -1);
            BOTask oldParentTask = currentTask.getParentTask();

            if (oldParentTask == null || oldParentTask.equals(currentTask)) {
              ApplicationContext.getCurrentProjet().getTasks().remove(currentTask);
              removeObject(ApplicationContext.getCurrentProjet().getTasks(), currentTask);
            } else {
              oldParentTask.getChildTasks().remove(currentTask);
              removeObject(oldParentTask.getChildTasks(), currentTask);
            }
            currentTask.setParentTask(newParent);
            ProjectCalculator.parentChanged(newParent, oldParentTask, currentTask, ApplicationContext.getCurrentUser());

            if (newParent.equals(currentTask)) {
              ApplicationContext.getCurrentProjet().getTasks().add(currentTask);
            } else {
              newParent.getChildTasks().add(currentTask);
              newParent.getPreviousTasks().clear();
            }
          }
        }
      }
      super.fireEditingStopped();
    }
  }

  private void onExpandCollapse() {
    int selectedRow = getSelectedRow();
    if (getTree().isExpanded(selectedRow) == false) {
      getTree().expandRow(selectedRow);
    } else {
      getTree().collapseRow(selectedRow);
    }
    getTree().setSelectionRow(selectedRow);
  }

  public void dataChanged() {
    formatter = new SimpleDateFormat(ApplicationContext.getUserPreferences().getDateDisplayFormat());
    customModel.updateBaseData();
    updateUI();
  }

  private void onAddTask() {
    if (ApplicationContext.getViewTYpe() == ViewType.ResourceView) {
      StatusBar.showWarningStatusMessage("Task addition is not allowed in resource view");
      return;
    }
    int selectedRow = getSelectedRow();
    if (selectedRow < 0) {
      return;
    }
    Object selectedObject = null;
    if ((selectedObject = getValueAt(selectedRow, -1)) == null) {
      return;
    }
    BOTask childTask = new BOTask();
    if (selectedObject instanceof BOTask) {
      BOTask parentTask = (BOTask) selectedObject;
      if (parentTask.canAddTasks(ApplicationContext.getCurrentUser()) == false) {
        StatusBar.showWarningStatusMessage("You do not have sufficient privilege to add task");
        return;
      }
      childTask.setParentTask(parentTask);
      parentTask.getChildTasks().add(childTask);
      parentTask.getPreviousTasks().clear();
    } else if (selectedObject instanceof BOProject) {
      BOProject project = (BOProject) selectedObject;
      if (project.canAddTasks(ApplicationContext.getCurrentUser()) == false) {
        StatusBar.showWarningStatusMessage("You do not have sufficient privilege to add task");
        return;
      }
      childTask.setParentTask(childTask);
      project.getTasks().add(childTask);
    }
    childTask.setOwner(ApplicationContext.getCurrentUser());
    childTask.setTaskName("New task");
    // TODO temporary bug fix
    childTask.setEnhancedTaskID(-System.currentTimeMillis());
    childTask.setProject(ApplicationContext.getCurrentProjet());
    if (getTree().isExpanded(selectedRow) == false) {
      getTree().expandRow(selectedRow);
      getTree().setSelectionRow(selectedRow);
      // super.
    }
    ProjectCalculator.taskAdded(childTask, ApplicationContext.getCurrentUser());
    dataChanged();
  }

  private class TreeListCellRenderer extends DefaultListCellRenderer {
    private PureTreeModel  pureModel  = new TreeViewProjectModel.PureTreeModel();

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
      TreeListCellRenderer.this.updateUI();
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
      boolean leaf = pureModel.isLeaf(value);
      setIcon(leaf ? UIManager.getIcon("Tree.leafIcon") : UIManager.getIcon("Tree.openIcon"));
      int depth = (value instanceof BOProject) ? 0 : getDepth((BOTask) value);// somehow
      IndentBorder indentBorder = new IndentBorder();
      indentBorder.setDepth(depth);
      setBorder(indentBorder);
      return this;
    }

  }

  private int getDepth(BOTask task) {
    if (task.getParentTask().getEnhancedTaskID() == task.getEnhancedTaskID()) {
      return 1;
    } else {
      return getDepth(task.getParentTask()) + 1;
    }
  }

  private void onDeleteTask() {
   
    BOUser currentUser = ApplicationContext.getCurrentUser();
    System.out.println("#### MANINI ProjectTaskArea.onDeleteTask()");
    if (ApplicationContext.getViewTYpe() == ViewType.ResourceView) {
      StatusBar.showWarningStatusMessage("Task deletion is not allowed in resource view");
      return;
    }
    int[] rows = getSelectedRows();
    for (int row : rows) {
      if (row > 0) {// to ensure not delete project
        BOTask task = (BOTask) getValueAt(row, -1);
        if (task.canBeDeleted(currentUser) == false) {
          StatusBar.showErrorStatusMessage("You do not have sufficient privilege to delete task");
          continue;
        }
       
        ProjectCalculator.taskDeleted(task, currentUser);
       
        // this is for removing previous tasks
        for (BOTask dependendTask : task.getDependentTasks())
        {
          dependendTask.getPreviousTasks().remove(task);
        }
       
        for (BOUser user : task.getAssineeUsers())
        {
          user.getAssignedTasks().remove(task);
        }

        if (task.getParentTask() != null && task.getParentTask().getTaskID()!= task.getTaskID())
        {
          removeObject(task.getParentTask().getChildTasks(), task);
          // task.getParentTask().getChildTasks().remove(task);
        }
        if (task.getParentTask() != null && !task.equals(task.getParentTask()))
        {
          removeObject(task.getParentTask().getChildTasks(), task);
          // task.getParentTask().getChildTasks().remove(task);
        }
        else
        {
          removeObject(task.getProject().getTasks(), task);
          // task.getProject().getTasks().remove(task);
        }
       
        task.getDependentTasks().clear();
        task.setDependentTasks(null);

        task.setParentTask(null);
        task.setProject(null);
        task.setOwner(null);

        task.getAssineeUsers().clear();
        task.setAssineeUsers(null);
      }
    }
   
    System.out.println("#### MANINI " + ApplicationContext.getCurrentProjet().getTasks());
    dataChanged();
  }

  private class TaskListModel extends AbstractListModel implements ComboBoxModel {
    private Object      selectedObject  = null;
    private PureTreeModel  pureModel    = new TreeViewProjectModel.PureTreeModel();

    public Object getSelectedItem() {
      return selectedObject;
    }

    public void setSelectedItem(Object anItem) {
      selectedObject = anItem;
    }

    public Object getElementAt(int index) {
      Enumeration enumer = new PreorderEnumeration(pureModel);
      for (int i = 0; i < index; i++)
        enumer.nextElement();
      return enumer.nextElement();
    }

    public int getSize() {
      int count = 0;
      Enumeration enumer = new PreorderEnumeration(pureModel);
      while (enumer.hasMoreElements()) {
        enumer.nextElement();
        count++;
      }
      return count;
    }
  }

  static class ColumnShowHideAction extends AbstractAction {
    private ProjectTaskArea  pta  = null;

    public ColumnShowHideAction(ProjectTaskArea pta) {
      this.pta = pta;
      for (Columns col : Columns.values()) {
        col.setTableColumn(pta.getColumnModel().getColumn(col.ordinal()));
      }
    }

    public void actionPerformed(ActionEvent e) {
      JCheckBoxMenuItem m = (JCheckBoxMenuItem) e.getSource();
      if (m == null) {
        return;
      }
      pta.showHideColumn(Columns.valueOfCaption(m.getText()), m.getState());
    }
  }

  public void showHideColumn(Columns col, boolean isSelected) {
    col.setVisible(isSelected);
    ArrayList<Boolean> visibleList = new ArrayList<Boolean>();
    if (isSelected == false) {
      getColumnModel().removeColumn(col.getTableColumn());
      ApplicationContext.getUserPreferences().getColumnsSettings().set(col.ordinal(), isSelected);
    } else {
      for (Columns innerCol : Columns.values()) {
        visibleList.add(innerCol.isVisible());
        if (innerCol.ordinal() >= col.ordinal() && innerCol.isVisible()) {
          getColumnModel().removeColumn(innerCol.getTableColumn());
        }
      }
      for (Columns innerCol : Columns.values()) {
        if (innerCol.ordinal() >= col.ordinal() && innerCol.isVisible()) {
          getColumnModel().addColumn(innerCol.getTableColumn());
        }
      }
      ApplicationContext.getUserPreferences().setColumnsSettings(visibleList);
    }
    dataChanged();
    ApplicationContext.saveSettings();
  }

  private void initColumnsVisibility() {
    ArrayList<Boolean> visibleList = ApplicationContext.getUserPreferences().getColumnsSettings();
    if (visibleList.size() <= 0) {
      for (Columns col : Columns.values()) {
        visibleList.add(col.isVisible());
      }
      return;
    }
    for (Columns col : Columns.values()) {
      col.setVisible(visibleList.get(col.ordinal()));
    }

    for (Columns innerCol : Columns.values()) {
      if (innerCol.isVisible() == false) {
        getColumnModel().removeColumn(innerCol.getTableColumn());
      }
    }
    headerPopup.updateSelectedState();
  }

  private void onDeleteCellValue() {
    int[] rows = getSelectedRows();
    int col = getSelectedColumn();
    // this is for fail-safe
    if (col < 0) {
      return;
    }
    for (int row : rows) {
      if (row > 0) {// to ensure not edit project
        BOTask task = (BOTask) getValueAt(row, -1);
        if (task.canBeDeleted(ApplicationContext.getCurrentUser()) == false) {
          StatusBar.showWarningStatusMessage("You do not have sufficient privilege to edit task");
          continue;
        }
        if (col == 3) {
          System.out.println("ProjectTaskArea.onDeleteCellValue(Assinees)");
        }

      }
    }
    dataChanged();
  }

  public ProjectTaskArea(TreeTableModel treeTableModel) {
    super(treeTableModel);
    // setAutoCreateRowSorter(true);
    setAutoResizeMode(AUTO_RESIZE_OFF);
    customModel = (TreeViewProjectModel) treeTableModel;
    customModel.pta = this;
    popup = new DotProjectPopupMenu(this);
    headerPopup = new DotProjectHeaderPopupMenu(this);
    getTableHeader().addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent e) {
        if (e.isPopupTrigger()) {
          headerPopup.show(e.getComponent(), e.getX(), e.getY());
        }
      }

      @Override
      public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger()) {
          headerPopup.show(e.getComponent(), e.getX(), e.getY());
        }
      }
    });
    addKeyListener(new KeyAdapter() {
      @Override
      public void keyPressed(KeyEvent keyEvent) {
        if (keyEvent.getKeyCode() == KeyEvent.VK_DELETE && keyEvent.isControlDown()) {
          System.err.println(".keyPressed()");
          keyEvent.consume();
          onDeleteCellValue();
        }
      }

      @Override
      public void keyReleased(KeyEvent keyEvent) {
        if (keyEvent.getKeyCode() == KeyEvent.VK_INSERT && keyEvent.isControlDown()) {
          onAddTask();
        } else if (keyEvent.getKeyCode() == KeyEvent.VK_DELETE && keyEvent.isControlDown() == false) {
          onDeleteTask();
        } else if (keyEvent.getKeyCode() == KeyEvent.VK_MULTIPLY && keyEvent.isControlDown()) {
          onExpandCollapse();
        }
      }
    });

    setPreferedWidths();
    addMouseListener(new MouseAdapter() {
      @Override
      public void mouseReleased(MouseEvent e) {
        if (e.isPopupTrigger()) {
          popup.show(e.getComponent(), e.getX(), e.getY());
        }
      }

      public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
          if (getTree().isExpanded(getSelectedRow())) {
            getTree().collapseRow(getSelectedRow());
          } else {
            getTree().expandRow(getSelectedRow());
          }
          return;
        }
        if (e.isPopupTrigger()) {
          popup.show(e.getComponent(), e.getX(), e.getY());
        }
      }
    });
    ApplicationContext.addProjectSelectionListener((ProjectSelectionListener) customModel);
    ApplicationContext.addProjectSelectionListener(new ProjectSelectionListener() {
      public void projectSelected(BOProject project) {
        ProjectTaskArea.this.dataChanged();
      }
    });

    // setIntercellSpacing(new Dimension(6, 0));
    // tree.putClientProperty("JTree.lineStyle", "Horizontal");
    // setShowHorizontalLines(true);
    setDefaultEditor(Priority.class, new PriorityEditor(this));
    setDefaultEditor(BOUser.class, new UserListEditor(this));
    setDefaultEditor(Date.class, new DateEditor(this));
    setDefaultEditor(BOTask.class, new TaskParenttEditor(this));
    getColumnModel().getColumn(TreeViewProjectModel.Columns.Assinees.ordinal()).setCellEditor(new AssineeListEditor(this));
    getColumnModel().getColumn(TreeViewProjectModel.Columns.Predecessors.ordinal()).setCellEditor(new PredecessorsListEditor(this));
    DefaultRenderer defaultRenderer = new DefaultRenderer(this);

    setDefaultRenderer(Priority.class, defaultRenderer);
    setDefaultRenderer(String.class, defaultRenderer);
    setDefaultRenderer(Date.class, defaultRenderer);
    setDefaultRenderer(Integer.class, defaultRenderer);
    setDefaultRenderer(Float.class, defaultRenderer);
    setDefaultRenderer(BOUser.class, defaultRenderer);
    setDefaultRenderer(BOTask.class, defaultRenderer);

    initColumnsVisibility();
  }

  static class DefaultRenderer extends DefaultTableCellRenderer {
    private ProjectTaskArea  pta        = null;
    protected Border    highlightBorder  = null;

    public DefaultRenderer(ProjectTaskArea pta) {
      this.pta = pta;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
      Color background = null;
      Color foreground = null;

      if (value != null && value instanceof Date) {
        setText(pta.formatter.format(value));
      }
      Object currentVal = pta.getValueAt(row, -1);
      if (currentVal != null && currentVal instanceof BOUser) {
        // just incase of user yellow is required
        background = new Color(255, 255, 204);
        foreground = Color.BLACK;
      } else {
        if (isSelected) {
          background = table.getSelectionBackground();
          foreground = table.getSelectionForeground();
        } else {
          background = table.getBackground();
          foreground = table.getForeground();
        }
        highlightBorder = null;
        if (hasFocus) {
          highlightBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
        }

        if (isSelected || hasFocus) {
          setBackground(UIManager.getColor("Table.selectionBackground"));
        } else {
          setBackground(Color.white);
        }
      }
      setForeground(foreground);
      setBackground(background);

      if (value != null && value instanceof Number) {
        setHorizontalAlignment(RIGHT);
      } else {
        setHorizontalAlignment(LEFT);
      }
      if (pta.getColumnClass(column) == Integer.class || pta.getColumnClass(column) == Float.class) {
        setHorizontalAlignment(RIGHT);
      }
      if (table.getColumnModel().getColumn(column).getHeaderValue().toString().equalsIgnoreCase(Columns.Percentage.toString()) && value != null) {
        setText(value.toString() + " %");
        setHorizontalAlignment(RIGHT);
        if(currentVal instanceof BOTask) {
          setBackground(getTaskColor((BOTask)currentVal, background));
        }
      } else if (value != null && value instanceof Collection) {
        if (((Collection) value).size() <= 0) {
          setText("");
        }
      }
      return this;
    }
   
    private Color getTaskColor(BOTask task, Color currentColor) {
      TaskCompletionStatus taskCompletionStatus = task.getTaskCompletionStatus();
      if(taskCompletionStatus== TaskCompletionStatus.Normal) {
        return currentColor;
      }else {
        return taskCompletionStatus.getDisplayColor();
      }
    }
  }

  private SimpleDateFormat  formatter  = new SimpleDateFormat(ApplicationContext.getUserPreferences().getDateDisplayFormat());

  private void setPreferedWidths() {
    getColumnModel().getColumn(Columns.ID.ordinal()).setWidth(50);
    getColumnModel().getColumn(Columns.ID.ordinal()).setMaxWidth(50);

    getColumnModel().getColumn(Columns.TaskName.ordinal()).setPreferredWidth(300);
    getColumnModel().getColumn(Columns.Parent.ordinal()).setPreferredWidth(150);
    getColumnModel().getColumn(Columns.Predecessors.ordinal()).setPreferredWidth(150);
    getColumnModel().getColumn(Columns.StartDate.ordinal()).setPreferredWidth(100);
    getColumnModel().getColumn(Columns.EndDate.ordinal()).setPreferredWidth(100);
    getColumnModel().getColumn(Columns.Duration.ordinal()).setPreferredWidth(50);
    getColumnModel().getColumn(Columns.Percentage.ordinal()).setPreferredWidth(50);
  }

  public int getRowAtPoint(Point p) {
    Point location = getLocationOnScreen();
    int row = -1;
    int mouseY = p.y;
    int tableY = location.y;
    int rowHeight = getRowHeight();
    row = (int) Math.floor((mouseY - tableY) / rowHeight);
    return row;
  }

  @Override
  public String getToolTipText(MouseEvent event) {
    Point p = event.getLocationOnScreen();
    int rowIndex = getRowAtPoint(p);
    int colIndex = columnAtPoint(p);
    if (rowIndex < 0) {
      return super.getToolTipText(event);
    }
    Object value = getValueAt(rowIndex, colIndex);
    if (value == null) {
      return super.getToolTipText(event);
    }
    if (value instanceof Set && ((Set) value).size() <= 0) {
      return null;
    }
    /*
     * if(colIndex == Columns.TaskName.ordinal() && getValueAt(rowIndex, -1)
     * instanceof BOTask) { BOTask t = (BOTask)getValueAt(rowIndex, -1);
     * if(t.getTaskDescription() == null) { return t.getTaskName(); }else {
     * return t.getTaskName() + " [ " + t.getTaskDescription() + " ] "; }
     *
     * }
     */
    return value.toString();
  }
}
TOP

Related Classes of com.zycus.dotproject.ui.ProjectTaskArea$DefaultRenderer

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.