package com.teotigraphix.caustk.controller; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import org.androidtransfuse.event.EventObserver; import com.teotigraphix.caustk.project.IProjectManager.OnProjectManagerChange; import com.teotigraphix.caustk.project.IProjectManager.ProjectManagerChangeKind; import com.teotigraphix.caustk.project.Project; public abstract class SubControllerBase { //---------------------------------- // controller //---------------------------------- private ICaustkController controller; public final ICaustkController getController() { return controller; } //---------------------------------- // model //---------------------------------- private SubControllerModel model; protected SubControllerModel getInternalModel() { return model; } //---------------------------------- // modelType //---------------------------------- protected abstract Class<? extends SubControllerModel> getModelType(); //-------------------------------------------------------------------------- // Constructor //-------------------------------------------------------------------------- protected void resetModel() { try { model = createModel(controller); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public SubControllerBase(ICaustkController controller) { this.controller = controller; resetModel(); /* >> SAVE LibraryManagerModel >> SAVE SoundSourceModel >> SAVE SoundMixerModel >> SAVE SystemSequencerModel >> SAVE >> SAVE_COMPLETE >> SAVE_COMPLETE flushProjectFile() LibraryManagerModel >> SAVE_COMPLETE SoundSourceModel >> SAVE_COMPLETE SoundMixerModel >> SAVE_COMPLETE SystemSequencerModel >> SAVE_COMPLETE */ controller.getDispatcher().register(OnProjectManagerChange.class, new EventObserver<OnProjectManagerChange>() { @Override public void trigger(OnProjectManagerChange object) { if (object.getKind() == ProjectManagerChangeKind.SAVE) { //System.out.println(getModelType().getSimpleName() + " >> SAVE"); saveState(object.getProject()); } else if (object.getKind() == ProjectManagerChangeKind.SAVE_COMPLETE) { //System.out.println(getModelType().getSimpleName() + " >> SAVE_COMPLETE"); } else if (object.getKind() == ProjectManagerChangeKind.LOAD) { //System.out.println(getModelType().getSimpleName() + " >> LOAD"); loadState(object.getProject()); } else if (object.getKind() == ProjectManagerChangeKind.CREATE) { //System.out.println(getModelType().getSimpleName() + " >> CREATE"); createProject(object.getProject()); } else if (object.getKind() == ProjectManagerChangeKind.EXIT) { //System.out.println(getModelType().getSimpleName() + " >> EXIT"); projectExit(object.getProject()); } } }); } //-------------------------------------------------------------------------- // State //-------------------------------------------------------------------------- private SubControllerModel createModel(ICaustkController controller) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Constructor<? extends SubControllerModel> constructor = getModelType().getConstructor( ICaustkController.class); return constructor.newInstance(controller); } protected void createProject(Project project) { } protected void loadState(Project project) { String data = project.getString(getModelType().getName()); // if the data does not exist, API update, just create the model if (data == null) { resetModel(); return; } model = getController().getSerializeService().fromString(data, getModelType()); } protected void saveState(Project project) { String data = getController().getSerializeService().toString(model); project.put(getModelType().getName(), data); } protected void projectExit(Project project) { } }