package com.onaro.sanscreen.client.view.task; import com.onaro.sanscreen.client.SANscreenClientPlugin; import com.onaro.sanscreen.client.SessionsHelper; import com.onaro.sanscreen.server.dataobject.task.TaskData; import com.onaro.sanscreen.task.TaskStatusType; import com.onaro.sanscreen.task.sessions.TaskSession; import com.onaro.sanscreen.util.Constant; import javax.swing.*; import java.awt.*; import java.text.Collator; import java.util.*; import java.util.List; public class TaskDependsCombo extends JComboBox { private static final long serialVersionUID = 1L; public final static String TASK_STATUS_ENUM = "Task.Status"; //$NON-NLS-1$ TaskData defaultTaskData; private Map idToTask = new HashMap(); public TaskDependsCombo() throws Exception { this(Constant.NULL_ID); } public TaskDependsCombo(long selectTaskId) throws Exception { /** Limit the width of the comb box */ TaskData prototypeTask = new TaskData(); prototypeTask.setName("AAAAAAA"); //$NON-NLS-1$ setPrototypeDisplayValue(prototypeTask); TaskData initialSelection = null; TaskSession taskSession = SessionsHelper.getInstance().getTaskSession(); List tasks = taskSession.getTasks(); Collections.sort(tasks, taskComparator); for (Iterator itr = tasks.iterator(); itr.hasNext();) { TaskData taskData = itr.next(); addItem(taskData); idToTask.put(Long.valueOf(taskData.getId()), taskData); if (taskData.getId() == selectTaskId) initialSelection = taskData; } defaultTaskData = new TaskData(); defaultTaskData.setId(Constant.NULL_ID); defaultTaskData.setName(TaskActions.resources.getString("task.details.depends.default")); //$NON-NLS-1$ addItem(defaultTaskData); idToTask.put(Long.valueOf(defaultTaskData.getId()), defaultTaskData); if (initialSelection == null) initialSelection = defaultTaskData; setSelectedItem(initialSelection); setRenderer(new DefaultListCellRenderer() { private static final long serialVersionUID = 1L; public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { TaskData taskData = (TaskData) value; StringBuilder newValue = new StringBuilder(taskData.getName()); if (taskData.getReferenceNumber() != null && taskData.getReferenceNumber().length() > 0) newValue.append(" (").append(taskData.getReferenceNumber()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ if (taskData.getId() == Constant.NULL_ID) { TaskStatusType status = TaskStatusType.getById(taskData.getStatus()); newValue.append(" - ").append(SANscreenClientPlugin.getDefault().getEnumPresentation().getAttributes(TASK_STATUS_ENUM, status.name())); //$NON-NLS-1$ } return super.getListCellRendererComponent(list, newValue.toString(), index, isSelected, cellHasFocus); } }); } public void setSelectedItem(long selectTaskId) { setSelectedItem(idToTask.get(Long.valueOf(selectTaskId))); } public void excludeTask(long taskId) { Long longTaskId = Long.valueOf(taskId); Object task = idToTask.get(longTaskId); if (task != null) { removeItem(task); idToTask.remove(longTaskId); } } private static final TaskComboComperator taskComparator = new TaskComboComperator(); static class TaskComboComperator implements Comparator { public int compare(Object o1, Object o2) { TaskData t1 = (TaskData) o1; TaskData t2 = (TaskData) o2; if (t1 == t2) return 0; if (t1 == null) return -1; if (t2 == null) return 1; // Use natural language sort order. return Collator.getInstance().compare(t1.getName(), t2.getName()); } } }