package scrum.client.workspace;
import ilarkesto.core.scope.Scope;
import ilarkesto.gwt.client.AGwtEntity;
import ilarkesto.gwt.client.AWidget;
import ilarkesto.gwt.client.EntityDoesNotExistException;
import ilarkesto.gwt.client.SwitcherWidget;
import ilarkesto.gwt.client.SwitchingNavigatorWidget;
import scrum.client.admin.ProjectUserConfigWidget;
import scrum.client.admin.PunishmentsWidget;
import scrum.client.admin.User;
import scrum.client.calendar.CalendarWidget;
import scrum.client.calendar.SimpleEvent;
import scrum.client.collaboration.Chat;
import scrum.client.collaboration.ForumSupport;
import scrum.client.collaboration.ForumWidget;
import scrum.client.collaboration.Subject;
import scrum.client.collaboration.WikiWidget;
import scrum.client.collaboration.Wikipage;
import scrum.client.context.UserHighlightSupport;
import scrum.client.core.RequestEntityByReferenceServiceCall;
import scrum.client.core.RequestEntityServiceCall;
import scrum.client.dashboard.DashboardWidget;
import scrum.client.files.File;
import scrum.client.files.FileRepositoryWidget;
import scrum.client.impediments.Impediment;
import scrum.client.impediments.ImpedimentListWidget;
import scrum.client.issues.Issue;
import scrum.client.issues.IssueManagementWidget;
import scrum.client.journal.JournalWidget;
import scrum.client.journal.ProjectEvent;
import scrum.client.pr.BlogEntry;
import scrum.client.pr.BlogWidget;
import scrum.client.project.ProductBacklogWidget;
import scrum.client.project.Project;
import scrum.client.project.ProjectAdminWidget;
import scrum.client.project.ProjectOverviewWidget;
import scrum.client.project.Quality;
import scrum.client.project.QualityBacklogWidget;
import scrum.client.project.Requirement;
import scrum.client.release.Release;
import scrum.client.release.ReleaseManagementWidget;
import scrum.client.risks.Risk;
import scrum.client.risks.RiskListWidget;
import scrum.client.search.Search;
import scrum.client.search.SearchResultsWidget;
import scrum.client.sprint.NextSprintWidget;
import scrum.client.sprint.Sprint;
import scrum.client.sprint.SprintBacklogWidget;
import scrum.client.sprint.SprintHistoryWidget;
import scrum.client.sprint.Task;
import scrum.client.tasks.WhiteboardWidget;
import com.google.gwt.user.client.ui.Widget;
public class ProjectWorkspaceWidgets extends GProjectWorkspaceWidgets {
private ProjectSidebarWidget sidebar = new ProjectSidebarWidget();
private DashboardWidget dashboard;
private ProjectOverviewWidget projectOverview;
private WhiteboardWidget whiteboard;
private SprintBacklogWidget sprintBacklog;
private ProductBacklogWidget productBacklog;
private QualityBacklogWidget qualityBacklog;
private ForumWidget forum;
private CalendarWidget calendar;
private NextSprintWidget nextSprint;
private ImpedimentListWidget impedimentList;
private IssueManagementWidget issueList;
private RiskListWidget riskList;
private ReleaseManagementWidget releaseList;
private WikiWidget wiki;
private SprintHistoryWidget sprintHistory;
private ProjectUserConfigWidget projectUserConfig;
private PunishmentsWidget punishments;
private JournalWidget projectEventList;
private FileRepositoryWidget fileRepository;
private ProjectAdminWidget projectAdmin;
private BlogWidget blog;
private PageSet pages = new PageSet();
private boolean searchResultsAdded;
private User highlightedUser;
public ProjectWorkspaceWidgets() {
projectOverview = new ProjectOverviewWidget();
dashboard = new DashboardWidget();
pages.addPage(new Page(dashboard, "Dashboard", null));
String sprintGroupKey = "sprint";
whiteboard = new WhiteboardWidget();
pages.addPage(new Page(whiteboard, "Whiteboard", sprintGroupKey));
sprintBacklog = new SprintBacklogWidget();
pages.addPage(new Page(sprintBacklog, "Sprint Backlog", sprintGroupKey));
String productGroupKey = "product";
productBacklog = new ProductBacklogWidget();
pages.addPage(new Page(productBacklog, "Product Backlog", productGroupKey));
qualityBacklog = new QualityBacklogWidget();
pages.addPage(new Page(qualityBacklog, "Qualities", productGroupKey));
issueList = new IssueManagementWidget();
pages.addPage(new Page(issueList, "Issues", productGroupKey));
releaseList = new ReleaseManagementWidget();
pages.addPage(new Page(releaseList, "Releases", productGroupKey));
String projectGroupKey = "project";
impedimentList = new ImpedimentListWidget();
pages.addPage(new Page(impedimentList, "Impediments", projectGroupKey));
riskList = new RiskListWidget();
pages.addPage(new Page(riskList, "Risks", projectGroupKey));
projectEventList = new JournalWidget();
pages.addPage(new Page(projectEventList, "Journal", projectGroupKey));
nextSprint = new NextSprintWidget();
pages.addPage(new Page(nextSprint, "Next Sprint", projectGroupKey));
sprintHistory = new SprintHistoryWidget();
pages.addPage(new Page(sprintHistory, "Sprint History", projectGroupKey));
String collaborationGroupKey = "collaboration";
wiki = new WikiWidget();
pages.addPage(new Page(wiki, "Wiki", collaborationGroupKey));
forum = new ForumWidget();
pages.addPage(new Page(forum, "Forum", collaborationGroupKey));
calendar = new CalendarWidget();
pages.addPage(new Page(calendar, "Calendar", collaborationGroupKey));
fileRepository = new FileRepositoryWidget();
pages.addPage(new Page(fileRepository, "File Repository", collaborationGroupKey));
punishments = new PunishmentsWidget();
pages.addPage(new Page(punishments, "Courtroom", collaborationGroupKey));
String administrationKey = "administration";
blog = new BlogWidget();
pages.addPage(new Page(blog, "Blog", administrationKey));
projectUserConfig = new ProjectUserConfigWidget();
pages.addPage(new Page(projectUserConfig, "Personal Preferences", administrationKey));
projectAdmin = new ProjectAdminWidget();
pages.addPage(new Page(projectAdmin, "Project administration", administrationKey));
SwitchingNavigatorWidget navigator = getSidebar().getNavigator();
navigator.addItem("Dashboard", dashboard);
addNavigatorGroup(navigator, sprintGroupKey, "Sprint");
addNavigatorGroup(navigator, productGroupKey, "Product");
addNavigatorGroup(navigator, projectGroupKey, "Project");
addNavigatorGroup(navigator, collaborationGroupKey, "Collaboration");
addNavigatorGroup(navigator, administrationKey, "Administration");
}
private void addNavigatorGroup(SwitchingNavigatorWidget navigator, String groupKey, String label) {
navigator.addGroup(label, groupKey);
for (Page page : pages.getPagesByGroupKey(groupKey)) {
navigator.addItem(groupKey, page.getLabel(), page.getWidget());
}
}
public void activate() {
Scope.get().getComponent(Ui.class).show(sidebar, dashboard);
}
public void highlightUser(User user) {
if (highlightedUser == user) return;
Widget currentWidget = getWorkarea().getCurrentWidget();
if (currentWidget instanceof UserHighlightSupport) {
((UserHighlightSupport) currentWidget).highlightUser(user);
}
highlightedUser = user;
}
public ProjectUserConfigWidget getProjectUserConfig() {
return projectUserConfig;
}
public void showSearchResults() {
SwitchingNavigatorWidget navigator = getSidebar().getNavigator();
SearchResultsWidget results = Scope.get().getComponent(Search.class).getResultsWidget();
if (!searchResultsAdded) {
navigator.addItem("Search Results", results);
searchResultsAdded = true;
}
navigator.select(results);
}
public void showEntityByReference(final String reference) {
log.debug("Showing entity by reference:", reference);
AGwtEntity entity = dao.getEntityByReference(reference);
if (entity != null) {
showEntity(entity);
return;
}
Scope.get().getComponent(Ui.class).lock("Searching for " + reference);
new RequestEntityByReferenceServiceCall(reference).execute(new Runnable() {
public void run() {
AGwtEntity entity = dao.getEntityByReference(reference);
Ui ui = Scope.get().getComponent(Ui.class);
if (entity == null) {
ui.unlock();
if (reference.length() > 4 && reference.startsWith("[[")) {
String pageName = reference.substring(2, reference.length() - 2);
showWiki(pageName);
} else {
Scope.get().getComponent(Chat.class)
.postSystemMessage("Object does not exist: " + reference, false);
}
return;
}
ui.unlock();
showEntity(entity);
}
});
}
public void showEntityById(final String entityId) {
log.debug("Showing entity by id:", entityId);
AGwtEntity entity;
try {
entity = dao.getEntity(entityId);
} catch (EntityDoesNotExistException ex) {
entity = null;
}
if (entity != null) {
showEntity(entity);
return;
}
Scope.get().getComponent(Ui.class).lock("Searching for " + entityId);
new RequestEntityServiceCall(entityId).execute(new Runnable() {
public void run() {
AGwtEntity entity;
try {
entity = dao.getEntity(entityId);
} catch (EntityDoesNotExistException ex) {
entity = null;
}
Ui ui = Scope.get().getComponent(Ui.class);
if (entity == null) {
ui.unlock();
Scope.get().getComponent(Chat.class).postSystemMessage("Entity does not exist: " + entityId, false);
return;
}
ui.unlock();
showEntity(entity);
}
});
}
public void showEntity(AGwtEntity entity) {
log.debug("Showing entity:", entity);
if (entity instanceof Task) {
showTask((Task) entity);
} else if (entity instanceof Requirement) {
showRequirement((Requirement) entity);
} else if (entity instanceof Issue) {
showIssue((Issue) entity);
} else if (entity instanceof Risk) {
showRisk((Risk) entity);
} else if (entity instanceof Quality) {
showQualityBacklog((Quality) entity);
} else if (entity instanceof Subject) {
showForum((Subject) entity);
} else if (entity instanceof Impediment) {
showImpediment((Impediment) entity);
} else if (entity instanceof File) {
showFile((File) entity);
} else if (entity instanceof Sprint) {
showSprint((Sprint) entity);
} else if (entity instanceof Wikipage) {
showWiki((Wikipage) entity);
} else if (entity instanceof SimpleEvent) {
showCalendar((SimpleEvent) entity);
} else if (entity instanceof Project) {
showDashboard();
} else if (entity instanceof ProjectEvent) {
showProjectEventList((ProjectEvent) entity);
} else if (entity instanceof Release) {
showRelease((Release) entity);
} else if (entity instanceof BlogEntry) {
showBlog((BlogEntry) entity);
} else {
throw new RuntimeException("Showing entity not supported: " + entity.getClass().getName());
}
}
public void showPage(String pageName) {
Page page = pages.getPageByName(pageName);
if (page == null) return;
select(page.getWidget());
}
public void showDashboard() {
select(dashboard);
}
public void showSprint(Sprint sprint) {
if (sprint.isCurrent()) {
showSprintBacklog((Requirement) null);
} else {
showSprintHistory(sprint);
}
}
public void showProjectEventList(ProjectEvent event) {
select(projectEventList);
projectEventList.select(event);
}
public void showSprintHistory(Sprint sprint) {
select(sprintHistory);
sprintHistory.select(sprint);
}
public void showIssue(Issue issue) {
select(issueList);
issueList.select(issue);
}
public void showRelease(Release release) {
select(releaseList);
releaseList.select(release);
}
public void showImpediment(Impediment impediment) {
select(impedimentList);
impedimentList.select(impediment);
}
public void showFile(File file) {
select(fileRepository);
fileRepository.select(file);
}
public void showRisk(Risk risk) {
select(riskList);
riskList.select(risk);
}
public void showTask(Task task) {
if (getWorkarea().isShowing(whiteboard)) {
showWhiteboard(task);
} else {
showSprintBacklog(task);
}
}
public void showRequirement(Requirement requirement) {
boolean inCurrentSprint = requirement.isInCurrentSprint();
if (inCurrentSprint) {
if (getWorkarea().isShowing(productBacklog)) {
showProductBacklog(requirement);
} else {
showSprintBacklog(requirement);
}
} else {
showProductBacklog(requirement);
}
}
public void showWiki(String page) {
select(wiki);
if (page != null) wiki.showPage(page);
}
public void showWiki(Wikipage page) {
select(wiki);
if (page != null) wiki.showPage(page);
}
private SwitcherWidget getWorkarea() {
return Scope.get().getComponent(Ui.class).getWorkspace().getWorkarea();
}
public void showWhiteboard(Task task) {
select(whiteboard);
whiteboard.selectTask(task);
}
public void showSprintBacklog(Task task) {
select(sprintBacklog);
sprintBacklog.selectTask(task);
}
public void showSprintBacklog(Requirement requirement) {
select(sprintBacklog);
if (requirement != null) sprintBacklog.selectRequirement(requirement);
}
public void showProductBacklog(Requirement requirement) {
select(productBacklog);
productBacklog.select(requirement);
}
public void showImpedimentList(Impediment impediment) {
select(impedimentList);
impedimentList.select(impediment);
}
public void showForum(ForumSupport entity) {
select(forum);
forum.select(entity);
}
public void showIssueList(Issue issue) {
select(issueList);
issueList.select(issue);
}
public void showQualityBacklog(Quality quality) {
select(qualityBacklog);
qualityBacklog.select(quality);
}
public void showBlog(BlogEntry blogEntry) {
select(blog);
blog.select(blogEntry);
}
public void showRiskList(Risk risk) {
select(riskList);
riskList.select(risk);
}
public void showCalendar(SimpleEvent event) {
select(calendar);
calendar.showEvent(event);
}
public void showProjectEvent(ProjectEvent event) {
}
private void select(AWidget widget) {
getSidebar().getNavigator().select(widget);
Scope.get().getComponent(Ui.class).unlock();
}
public WikiWidget getWiki() {
return wiki;
}
public SprintHistoryWidget getSprintHistory() {
return sprintHistory;
}
public CalendarWidget getCalendar() {
return calendar;
}
public JournalWidget getProjectEventList() {
return projectEventList;
}
public ImpedimentListWidget getImpedimentList() {
return impedimentList;
}
public FileRepositoryWidget getFileRepository() {
return fileRepository;
}
public IssueManagementWidget getIssueList() {
return issueList;
}
public NextSprintWidget getNextSprint() {
return nextSprint;
}
public ProductBacklogWidget getProductBacklog() {
return productBacklog;
}
public ProjectOverviewWidget getProjectOverview() {
return projectOverview;
}
public QualityBacklogWidget getQualityBacklog() {
return qualityBacklog;
}
public ForumWidget getForum() {
return forum;
}
public RiskListWidget getRiskList() {
return riskList;
}
public ProjectSidebarWidget getSidebar() {
return sidebar;
}
public SprintBacklogWidget getSprintBacklog() {
return sprintBacklog;
}
public WhiteboardWidget getWhiteboard() {
return whiteboard;
}
}