package scrum.client;
import ilarkesto.core.scope.CascadingScope;
import ilarkesto.core.scope.NonConcurrentScopeManager;
import ilarkesto.core.scope.Scope;
import ilarkesto.core.scope.ScopeManager;
import ilarkesto.gwt.client.AGwtApplication;
import ilarkesto.gwt.client.ObjectMappedFlowPanel;
import scrum.client.admin.Auth;
import scrum.client.admin.SystemMessageManager;
import scrum.client.admin.User;
import scrum.client.calendar.Calendar;
import scrum.client.collaboration.Chat;
import scrum.client.collaboration.UsersStatus;
import scrum.client.collaboration.Wiki;
import scrum.client.communication.Pinger;
import scrum.client.communication.ServerErrorManager;
import scrum.client.core.RichtextAutosaver;
import scrum.client.core.ServiceCaller;
import scrum.client.files.Uploader;
import scrum.client.i18n.Localizer;
import scrum.client.issues.IssueManager;
import scrum.client.journal.ChangeHistoryManager;
import scrum.client.project.CloseProjectServiceCall;
import scrum.client.project.Project;
import scrum.client.search.Search;
import scrum.client.undo.Undo;
import scrum.client.workspace.DndManager;
import scrum.client.workspace.Navigator;
import scrum.client.workspace.ProjectWorkspaceWidgets;
import scrum.client.workspace.Ui;
import scrum.client.workspace.UsersWorkspaceWidgets;
public class ScrumScopeManager {
private static NonConcurrentScopeManager scopeManager;
private static CascadingScope appScope;
private static CascadingScope userScope;
private static CascadingScope projectScope;
static void initialize() {
assert scopeManager == null;
Dao dao = Dao.get();
ScrumGwtApplication app = (ScrumGwtApplication) AGwtApplication.get();
dao.setApp(app);
scopeManager = NonConcurrentScopeManager.createCascadingScopeInstance("app", new ScrumComponentsReflector());
appScope = (CascadingScope) scopeManager.getScope();
Scope scope = appScope;
scope.putComponent("app", app);
scope.putComponent(dao);
scope.putComponent(new ServiceCaller());
scope.putComponent(new Pinger());
scope.putComponent(new Ui());
scope.putComponent(new SystemMessageManager());
scope.putComponent(new Auth());
scope.putComponent(new Navigator());
scope.putComponent(new ServerErrorManager());
scope.putComponent(new RichtextAutosaver());
appScope.wireComponents();
}
public static void createUserScope(User user) {
assert user != null;
userScope = appScope.createScope("user");
Scope scope = scopeManager.setScope(userScope);
scope.putComponent(user);
scope.putComponent(new UsersWorkspaceWidgets());
scope.putComponent(new Localizer());
userScope.wireComponents();
}
public static void createProjectScope(Project project) {
assert scopeManager == ScopeManager.getInstance();
projectScope = userScope.createScope("project");
Scope scope = scopeManager.setScope(projectScope);
scope.putComponent(project);
scope.putComponent(project.getUserConfig(userScope.getComponent(User.class)));
scope.putComponent(new ProjectWorkspaceWidgets());
scope.putComponent(new Chat());
scope.putComponent(new ChangeHistoryManager());
scope.putComponent(new Wiki());
scope.putComponent(new Calendar());
scope.putComponent(new Undo());
scope.putComponent(new DndManager());
scope.putComponent(new Uploader());
scope.putComponent(new Search());
scope.putComponent(new UsersStatus());
scope.putComponent(new IssueManager());
projectScope.wireComponents();
}
public static void destroyProjectScope() {
Scope.get().getComponent(Ui.class).lock("Closing project...");
new CloseProjectServiceCall().execute();
appScope.getComponent(Dao.class).clearProjectEntities();
ObjectMappedFlowPanel.objectHeights.clear();
projectScope = null;
scopeManager.setScope(userScope);
}
public static boolean isProjectScope() {
return projectScope != null;
}
public static Project getProject() {
return (Project) projectScope.getComponent("project");
}
}