package org.smartly.application.desktopgap.impl.app.applications.window; import org.smartly.application.desktopgap.impl.app.applications.events.FrameCloseEvent; import org.smartly.application.desktopgap.impl.app.applications.events.FrameOpenEvent; import org.smartly.application.desktopgap.impl.app.applications.events.Handlers; import org.smartly.application.desktopgap.impl.app.applications.window.frame.AppFrame; import org.smartly.application.desktopgap.impl.app.applications.window.frame.AppFrameRepository; import org.smartly.commons.Delegates; import org.smartly.commons.util.StringUtils; /** * Application Window Manager. * Each application can host one or more windows. */ public final class AppWindows { // -------------------------------------------------------------------- // e v e n t s // -------------------------------------------------------------------- private static final Class EVENT_ON_OPEN = Handlers.OnOpen.class; private static final Class EVENT_ON_CLOSE = Handlers.OnClose.class; // -------------------------------------------------------------------- // f i e l d s // -------------------------------------------------------------------- private final Delegates.Handlers _eventHandler; private final AppInstance _app; private final AppFrameRepository _frames; // -------------------------------------------------------------------- // c o n s t r u c t o r // -------------------------------------------------------------------- public AppWindows(final AppInstance app) { _app = app; _frames = new AppFrameRepository(); _eventHandler = new Delegates.Handlers(); } // -------------------------------------------------------------------- // p u b l i c // -------------------------------------------------------------------- public AppInstance getApp() { return _app; } public int size() { return _frames.size(); } public boolean isEmpty() { return _frames.size() == 0; } // -------------------------------------------------------------------- // events // -------------------------------------------------------------------- public void onEvent(final Delegates.Handler handler) { _eventHandler.add(handler); } // -------------------------------------------------------------------- // frame // -------------------------------------------------------------------- public AppFrame open(final String winId) { final String id = this.createWinId(winId); return this.openById(id); } public void close(final String winId) { if (!StringUtils.hasText(winId)) { this.closeAll(); } else { final String id = this.createWinId(winId); final AppFrame frame = _frames.remove(id); if (null != frame) { frame.close(); } } } /** * Same as close, but with no events. */ public void kill(final String winId) { if (!StringUtils.hasText(winId)) { this.killAll(); } else { final String id = this.createWinId(winId); final AppFrame frame = _frames.remove(id); if (null != frame) { frame.kill(); } } } public void minimize(final String winId) { if (!StringUtils.hasText(winId)) { this.minimizeAll(); } else { final String id = this.createWinId(winId); final AppFrame frame = _frames.get(id); if (null != frame) { frame.minimize(); } } } // ------------------------------------------------------------------------ // p r i v a t e // ------------------------------------------------------------------------ private String createWinId(final String winId) { final String appId = _app.getId(); if (StringUtils.hasText(winId) && !winId.equalsIgnoreCase(appId)) { return StringUtils.concatDot(appId, winId); } return appId; } private AppFrame openById(final String id) { final AppFrame frame; if (_frames.contains(id)) { frame = _frames.get(id); } else { frame = new AppFrame(this, id); this.handleFrameEvents(frame); } frame.open(); return frame; } private void handleFrameEvents(final AppFrame frame) { //-- open --// frame.onEvent(new Handlers.OnOpen() { @Override public void handle(final FrameOpenEvent event) { handleOpenFrame(frame); _eventHandler.triggerAsync(EVENT_ON_OPEN, event); } }); //-- close --// frame.onEvent(new Handlers.OnClose() { @Override public void handle(final FrameCloseEvent event) { handleCloseFrame(frame); _eventHandler.trigger(EVENT_ON_CLOSE, event); } }); } private void closeAll() { final AppFrame[] frames = _frames.removeAll(); for (final AppFrame frame : frames) { try { frame.close(); } catch (Throwable ignored) { } } } private void killAll() { final AppFrame[] frames = _frames.removeAll(); for (final AppFrame frame : frames) { try { frame.kill(); } catch (Throwable ignored) { } } } private void minimizeAll() { final AppFrame[] frames = _frames.getAll(); for (final AppFrame frame : frames) { try { frame.minimize(); } catch (Throwable ignored) { } } } private void handleCloseFrame(final AppFrame frame) { // remove if exists _frames.remove(frame); } private void handleOpenFrame(final AppFrame frame) { _frames.put(frame); } }