package com.teotigraphix.caustic.controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.inject.Named;
import org.androidtransfuse.event.EventObserver;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.teotigraphix.caustic.mediator.ICaustkMediator;
import com.teotigraphix.caustic.model.ApplicationModel;
import com.teotigraphix.caustic.model.IApplicationModel;
import com.teotigraphix.caustic.model.ICaustkModel;
import com.teotigraphix.caustic.model.ModelBase;
import com.teotigraphix.caustk.application.ICaustkApplicationProvider;
import com.teotigraphix.caustk.controller.ICaustkController;
import com.teotigraphix.caustk.core.CtkDebug;
import com.teotigraphix.caustk.project.IProjectManager;
import com.teotigraphix.caustk.project.IProjectManager.OnProjectManagerChange;
import com.teotigraphix.caustk.project.IProjectManager.ProjectManagerChangeKind;
import com.teotigraphix.caustk.project.Project;
/**
* Mediates the {@link ApplicationModel}.
*/
@Singleton
public class ApplicationController implements IApplicationController {
@Inject
private IApplicationModel applicationModel;
@Inject
@Named("resources")
ResourceBundle resourceBundle;
private ICaustkController controller;
private List<ICaustkModel> models = new ArrayList<ICaustkModel>();
private List<ICaustkMediator> mediators = new ArrayList<ICaustkMediator>();
@Override
public ICaustkController getController() {
return controller;
}
@Override
public void registerMeditor(ICaustkMediator mediator) {
if (mediators.contains(mediator)) {
CtkDebug.warn("ApplicationController already contains " + mediator);
return;
}
mediators.add(mediator);
}
@Override
public void registerMediatorObservers() {
CtkDebug.log("ApplicationController Register Mediator Observers");
for (ICaustkMediator mediator : mediators) {
CtkDebug.log(" Register; " + mediator.getClass().getSimpleName());
mediator.onRegisterObservers();
}
}
@Override
public void registerMeditors() {
CtkDebug.log("ApplicationController Register Mediators");
for (ICaustkMediator mediator : mediators) {
CtkDebug.log(" Register; " + mediator.getClass().getSimpleName());
mediator.onRegister();
}
}
@Override
public void registerModel(ICaustkModel model) {
if (models.contains(model)) {
CtkDebug.warn("ApplicationController already contains " + model);
return;
}
models.add(model);
}
@Override
public void registerModels() {
CtkDebug.log("ApplicationController Register Models");
for (ICaustkModel model : models) {
CtkDebug.log(" Register; " + model.getClass().getSimpleName());
model.onRegister();
}
}
@Inject
public ApplicationController(ICaustkApplicationProvider provider) {
controller = provider.get().getController();
controller.getDispatcher().register(OnProjectManagerChange.class,
new EventObserver<OnProjectManagerChange>() {
@Override
public void trigger(OnProjectManagerChange object) {
if (object.getKind() == ProjectManagerChangeKind.CREATE) {
//onProjectCreate();
} else if (object.getKind() == ProjectManagerChangeKind.LOAD) {
//onProjectLoad();
} else if (object.getKind() == ProjectManagerChangeKind.SAVE) {
onProjectSave();
} else if (object.getKind() == ProjectManagerChangeKind.SAVE_COMPLETE) {
}
}
});
}
@Override
public void start() throws IOException {
getController().getApplication().initialize();
// from event calls appModel.start()
getController().getApplication().start();
applicationModel.start();
IProjectManager projectManager = getController().getProjectManager();
String path = projectManager.getSessionPreferences().getString("lastProject");
@SuppressWarnings("unused")
Project project = null;
if (path == null) {
project = projectManager.create(new File("UntitledProject"));
} else {
project = projectManager.load(new File(path));
}
}
public void load() {
for (ICaustkModel model : models) {
if (model instanceof ModelBase) {
CtkDebug.log(" Load; " + model.getClass().getSimpleName());
((ModelBase)model).setupState();
}
}
}
/**
* @see OnApplicationControllerShow
*/
@Override
public void show() {
CtkDebug.log("ApplicationController.show()");
applicationModel.run();
for (ICaustkModel model : models) {
CtkDebug.log(" Show " + model.getClass().getSimpleName());
model.onShow();
}
}
protected void onProjectSave() {
applicationModel.setDirty(false);
for (ICaustkModel model : models) {
CtkDebug.log(" Saving; " + model.getClass().getSimpleName());
model.save();
}
}
}