package br.com.etyllica.core.context; import java.awt.Color; import java.io.File; import java.util.ArrayList; import java.util.List; import br.com.etyllica.cinematics.Camera; import br.com.etyllica.core.Updatable; import br.com.etyllica.core.context.load.ApplicationLoadListener; import br.com.etyllica.core.context.load.DefaultLoadApplication; import br.com.etyllica.core.dnd.DropTarget; import br.com.etyllica.core.effect.TransitionEffect; import br.com.etyllica.core.event.GUIEvent; import br.com.etyllica.core.event.MouseState; import br.com.etyllica.core.graphics.Graphics; import br.com.etyllica.core.i18n.Language; import br.com.etyllica.core.i18n.LanguageChanger; import br.com.etyllica.core.i18n.LanguageChangerListener; import br.com.etyllica.core.input.mouse.MouseStateChanger; import br.com.etyllica.core.input.mouse.MouseStateListener; import br.com.etyllica.core.ui.UIComponent; import br.com.etyllica.core.ui.UIResizableComponent; import br.com.etyllica.core.ui.ViewContainer; import br.com.etyllica.gui.View; import br.com.etyllica.gui.Window; import br.com.etyllica.layer.Layer; /** * Class to represent sessions of the Main Application like Mini-Applications. * * @author yuripourre * */ public abstract class Context extends Layer implements ViewContainer, UIResizableComponent, Updatable, MouseStateChanger, LanguageChanger, DropTarget { private static final ApplicationLoadListener DUMMY_LOAD_LISTENER = new ApplicationLoadListener() { @Override public void onApplicationLoaded() {} }; /** * The updateInterval between executions */ private int updateInterval = 0; /** * Listener to be updated */ private UpdateIntervalListener updated = null; /** * Transition effect while change to returned Application */ protected TransitionEffect effect = TransitionEffect.NONE; /** * Load percentage unlock Application when reaches 100 */ protected float loading = 0; /** * Loading phrase while loading Application */ protected String loadingInfo = "Loading..."; /** * Application title (useful with windows) */ protected String title = "Application"; /** * Clear application before every draw call */ protected boolean clearBeforeDraw = true; /** * Map shared between Applications */ protected Session session; /** * Scene camera */ protected Camera camera; /** * Scene Graph Windows */ protected Scene scene; /** * Last time updated */ protected long lastUpdate = 0; /** * Lock on update */ private boolean locked = false; /** * Lock on load * Start as true */ private boolean loaded = true; /** * Pause */ protected boolean paused = false; /** * Active Center Mouse */ protected boolean activeCenterMouse = false; /** * Application to be shown during loading */ private ApplicationLoadListener loadListener = DUMMY_LOAD_LISTENER; private MouseStateListener mouseStateListener; private LanguageChangerListener languageChangerListener; protected Window parent; /** * Returned Application (next Application to show up) */ protected Context nextApplication = this; protected DefaultLoadApplication loadApplication; protected int fps = 0; private boolean drawCursor = true; protected List<View> views = new ArrayList<View>(); protected List<UIComponent> components = new ArrayList<UIComponent>(); /** * Constructor * * @param x coordinate to show Application (useful with multiple Applications) * @param y coordinate to show Application (useful with multiple Applications) * @param w Application width * @param h Application height */ public Context(int x, int y, int w, int h) { super(x, y, w, h); scene = new Scene(); components.add(scene); this.loading = 0; //TODO Dictionary get "loading"+... this.loadingInfo = "Carregando..."; } /** * Constructor for "fit Window" Applications * * @param w Application width * @param h Application height */ public Context(int w, int h) { this(0, 0, w, h); } public void startLoad() { locked = true; this.loading = 0; load(); locked = false; notifyListeners(); } private void notifyListeners() { loadListener.onApplicationLoaded(); } /** * Load method is the first method called before constructor. * Application gets lock while load() and unlocks when loading = 100; */ public abstract void load(); /** * Draw method */ public abstract void draw(Graphics g); /** * Method called when activity will be closed, useful to dispose loaded resources */ public void dispose() { } /** * Method to Update by GUI events */ public void update(GUIEvent event) { // TODO Auto-generated method stub } public void update(long now) { } @Override public boolean onMouse(int mx, int my) { return false; } public float getLoading() { return loading; } public String getLoadingInfo() { return loadingInfo; } public void setSession(Session session) { this.session = session; } public Session getSession() { return session; } public void setSessionValue(String key, Object value) { session.put(key, value); } public Object getSessionValue(String key) { return session.get(key); } public boolean isClearBeforeDraw() { return clearBeforeDraw; } public void setClearBeforeDraw(boolean clearBeforeDraw) { this.clearBeforeDraw = clearBeforeDraw; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } protected void updateAtFixedRate(int interval, UpdateIntervalListener updated) { updateInterval = interval; this.updated = updated; } protected void stopTimeUpdate() { updateInterval = 0; } public void changeMouseState(MouseState state) { if(mouseStateListener != null) mouseStateListener.changeState(state); } public MouseStateListener getMouseStateListener() { return mouseStateListener; } public void setMouseStateListener(MouseStateListener mouseStateListener) { this.mouseStateListener = mouseStateListener; } public void changeLanguage(Language language) { if(languageChangerListener != null) languageChangerListener.changeLanguage(language); } public LanguageChangerListener getLanguageChangerListener() { return languageChangerListener; } public void setLanguageChangerListener( LanguageChangerListener languageChangerListener) { this.languageChangerListener = languageChangerListener; } public int getUpdateInterval() { return updateInterval; } public long getLastUpdate() { return lastUpdate; } public void setLastUpdate(long lastUpdate) { this.lastUpdate = lastUpdate; } public boolean isLocked() { return locked; } public void setLoadListener(ApplicationLoadListener listener) { this.loadListener = listener; } public Context getNextApplication() { return nextApplication; } protected void setNextApplication(Context nextApplication) { this.nextApplication = nextApplication; } public Scene getScene() { return scene; } public void setScene(Scene scene) { this.scene = scene; } public Camera getCamera() { return camera; } public void setCamera(Camera camera) { this.camera = camera; } public int getFps() { return fps; } public void setFps(int fps) { this.fps = fps; } public DefaultLoadApplication getLoadApplication() { return loadApplication; } public UpdateIntervalListener getUpdated() { return updated; } public boolean isDrawCursor() { return drawCursor; } public void setDrawCursor(boolean drawCursor) { this.drawCursor = drawCursor; } public void hideCursor() { this.drawCursor = false; } public void showCursor() { this.drawCursor = true; } public boolean isActiveCenterMouse() { return activeCenterMouse; } public void setParent(Window window) { this.parent = window; setSession(window.getSession()); setCamera(window.getCamera()); } public boolean isLoaded() { return loaded; } public void setLoaded(boolean loaded) { this.loaded = loaded; } public List<View> getViews() { return views; } public void setViews(List<View> views) { this.views = views; } public void addView(View view) { this.views.add(view); } public Color getBackgroundColor() { return Color.WHITE; } public void dragEnter() { } public void dragExit() { } public void dropFiles(int x, int y, List<File> files) { } public List<UIComponent> getComponents() { return components; } }