// $codepro.audit.disable unnecessaryImport
package net.thesocialos.client.desktop;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import net.thesocialos.client.TheSocialOS;
import net.thesocialos.client.app.AppConstants;
import net.thesocialos.client.desktop.DesktopUnit.TypeUnit;
import net.thesocialos.client.desktop.window.FrameWindow;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.web.bindery.event.shared.EventBus;
public class DesktopManager {
EventBus eventBus;
AbsolutePanel absolutePanelScreen;
AbsolutePanel absolutePanelDesktop;
LinkedHashMap<Integer, ArrayList<DesktopUnit>> linkedDesktopUnit; // Desde ventanas hasta formularios
DesktopUnit lastDesktopUnit = null;
UnitsManager unitsManager = new UnitsManager();
AplicationsManager aplicationsManager = new AplicationsManager();
public DesktopManager(EventBus eventBus, AbsolutePanel Screen, AbsolutePanel Desktop) {
absolutePanelScreen = Screen;
absolutePanelDesktop = Desktop;
this.eventBus = eventBus;
linkedDesktopUnit = new LinkedHashMap<Integer, ArrayList<DesktopUnit>>();
ArrayList<DesktopUnit> defaultUnit = new ArrayList<DesktopUnit>();
defaultUnit.add(new FrameWindow("DYMMY", "DUMMY", AppConstants.OTHER, false));
linkedDesktopUnit.put(AppConstants.OTHER, defaultUnit);
handlers();
/*
* Click on the desktop
*/
ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
// TODO Auto-generated method stub
if ((lastDesktopUnit != null && lastDesktopUnit.typeUnit != TypeUnit.WINDOW)) {
if (lastDesktopUnit.getAbsoluteTop() < event.getClientY()
&& (lastDesktopUnit.getAbsoluteTop() + lastDesktopUnit.getHeight()) > event.getClientY()
&& (lastDesktopUnit.getAbsoluteLeft() < event.getClientX() && (lastDesktopUnit
.getAbsoluteLeft() + lastDesktopUnit.getWidth()) > event.getClientX())) return;
lastDesktopUnit.getHeight();
unitsManager.removeUnit(lastDesktopUnit);
event.getClientX();
}
}
};
absolutePanelDesktop.addDomHandler(clickHandler, ClickEvent.getType());
/*
* Application window resize
*/
Window.addResizeHandler(new ResizeHandler() {
Timer resizeTimer = new Timer() {
@Override
public void run() {
Iterator<ArrayList<DesktopUnit>> desktopIterator = linkedDesktopUnit.values().iterator();
while (desktopIterator.hasNext()) {
Iterator<DesktopUnit> desktopUnitIterator = desktopIterator.next().iterator();
while (desktopUnitIterator.hasNext())
checkWindowPosition(desktopUnitIterator.next());
}
}
};
@Override
public void onResize(ResizeEvent event) {
resizeTimer.cancel();
resizeTimer.schedule(250);
}
});
}
class UnitsManager {
/**
* A�ade una unidad dada en el escritorio
*
* @param desktopUnit
* @return True si se a podido abrir // False si ya estaba abierto
*/
public boolean addUnit(DesktopUnit desktopUnit) {
if (desktopUnit.equals(lastDesktopUnit)) return true;
if (lastDesktopUnit != null && lastDesktopUnit.typeUnit.equals(TypeUnit.INFO)) removeUnit(lastDesktopUnit);
if (linkedDesktopUnit.containsKey(desktopUnit.getProgramID())) {
if (desktopUnit.isSubApplication()) {
if (desktopUnit.getID() == AppConstants.OTHER)
aplicationsManager.addApplicationTocontrol(desktopUnit);
ArrayList<DesktopUnit> hashDesktopUnits = linkedDesktopUnit.get(desktopUnit.getProgramID());
if (hashDesktopUnits.contains(desktopUnit)) {
setWindowsZPositions(desktopUnit);
desktopUnit.restore();
return true;
} else
hashDesktopUnits.add(desktopUnit);
} else
return true;
} else {
if (desktopUnit.isSubApplication()) return false;
ArrayList<DesktopUnit> desktopUnits = new ArrayList<DesktopUnit>();
desktopUnits.add(desktopUnit);
linkedDesktopUnit.put(desktopUnit.getID(), desktopUnits);
aplicationsManager.addApplicationTocontrol(desktopUnit);
}
if (desktopUnit.typeUnit.equals(TypeUnit.INFO)) lastDesktopUnit = desktopUnit;
desktopUnit.open(absolutePanelDesktop);
return true;
}
/**
* Delete a windows of the desktop
*
* @param desktopUnit
* @return True si se a podido cerrar // False si no existia
*/
public boolean removeUnit(DesktopUnit desktopUnit) {
if (linkedDesktopUnit.containsKey(desktopUnit.getProgramID())) {
if (desktopUnit.isSubApplication()) {
if (linkedDesktopUnit.get(desktopUnit.getProgramID()).contains(desktopUnit)) {
linkedDesktopUnit.get(desktopUnit.getProgramID()).remove(desktopUnit);
desktopUnit.close(absolutePanelDesktop);
}
} else {
Iterator<DesktopUnit> iDesktopUnit = linkedDesktopUnit.get(desktopUnit.getProgramID()).iterator();
while (iDesktopUnit.hasNext()) {
DesktopUnit deskUnit = iDesktopUnit.next();
deskUnit.close(absolutePanelDesktop);
}
aplicationsManager.removeApplicationToControl(desktopUnit);
linkedDesktopUnit.remove(desktopUnit.getProgramID());
}
if (desktopUnit.equals(lastDesktopUnit)) lastDesktopUnit = null;
if (desktopUnit.getProgramID() == AppConstants.OTHER)
aplicationsManager.removeApplicationToControl(desktopUnit);
return true;
}
return false;
}
}
/**
* Check if window position is correct
*
* @param desktopUnit
* unit to check
* @param xPosition
* reference value. X relative position
* @param yPosition
* reference value. Y relative position
*/
private void checkWindowPosition(DesktopUnit desktopUnit) {
if (desktopUnit.typeUnit == TypeUnit.WINDOW) {
if (desktopUnit.isMaximized())
desktopUnit.setSize(absolutePanelDesktop.getOffsetWidth(), absolutePanelDesktop.getOffsetHeight());
if (desktopUnit.getAbsoluteLeft() < 0) desktopUnit.setPosition(0, desktopUnit.getAbsoluteTop());
else if (desktopUnit.getAbsoluteLeft() + desktopUnit.getWidth() > Window.getClientWidth())
desktopUnit.setPosition(Window.getClientWidth() - desktopUnit.getWidth(), desktopUnit.getAbsoluteTop());
if (desktopUnit.getAbsoluteTop() + desktopUnit.getHeight() > Window.getClientHeight()) desktopUnit
.setPosition(desktopUnit.getAbsoluteLeft(), Window.getClientHeight() - desktopUnit.getHeight());
else if (desktopUnit.getAbsoluteTop() < 0) desktopUnit.setPosition(desktopUnit.getAbsoluteLeft(), 0);
}
}
private void handlers() {
eventBus.addHandler(DesktopEvent.TYPE, new DesktopEventHandler() {
@Override
public void onClose(DesktopEventOnClose event) {
unitsManager.removeUnit(event.getDesktopUnit());
}
@Override
public void onEndDrag(DesktopEventonEndDrag event) {
}
@Override
public void onMaximize(DesktopEventOnMaximize event) {
MaximizeWindow(event.getDesktopUnit());
}
@Override
public void onMinimize(DesktopEventOnMinimize event) {
MinimizeRestoreWindow(event.getDesktopUnit(), event.isForceMinimized());
}
@Override
public void onOpen(DesktopEventOnOpen event) {
if (unitsManager.addUnit(event.getDesktopUnit())) setWindowsZPositions(event.getDesktopUnit());
}
@Override
public void onTop(DesktopEventOnTop event) {
setWindowsZPositions(event.getDesktopUnit());
}
});
}
public boolean maximize(DesktopUnit desktopUnit) {
return null != null;
}
private void MaximizeWindow(DesktopUnit desktopUnit) {
setWindowsZPositions(desktopUnit);
if (desktopUnit.isMaximized()) desktopUnit.setMaximized(false, 0, 0, 0, 0);
else
desktopUnit.setMaximized(true, absolutePanelDesktop.getOffsetWidth(),
absolutePanelDesktop.getOffsetHeight(), 0, 0);
// absolutePanelDesktop.setWidgetPosition(desktopUnit.windowDisplay.getWindow().asWidget(), 0, 0);
}
/**
* Minimize or restore windows
*
* @param desktopUnit
*/
private void MinimizeRestoreWindow(DesktopUnit desktopUnit, boolean isForce) {
if (!desktopUnit.isMinimizable()) return;
if (isForce) {
desktopUnit.minimize();
return;
}
if (desktopUnit.isMinimized()) {
// desktopUnit.setMinimized(false);
desktopUnit.restore();
setWindowsZPositions(desktopUnit);
} else
// desktopUnit.setMinimized(true);
desktopUnit.minimize();
}
private void setWindowsZPositions(DesktopUnit desktopUnit) {
Iterator<ArrayList<DesktopUnit>> desktopIterator = linkedDesktopUnit.values().iterator();
while (desktopIterator.hasNext()) {
Iterator<DesktopUnit> desktopUnitIterator = desktopIterator.next().iterator();
while (desktopUnitIterator.hasNext())
desktopUnitIterator.next().toBack();
}
desktopUnit.toFront();
}
class AplicationsManager {
ArrayList<DesktopUnit> desktopUnits = new ArrayList<DesktopUnit>();
public AplicationsManager() {
}
public boolean addApplicationTocontrol(DesktopUnit application) {
if (checkApplication(application))
if (desktopUnits.add(application))
TheSocialOS.getEventBus().fireEvent(new AppManagerOpenEvent(application));
return false;
}
public void removeApplicationToControl(DesktopUnit application) {
if (checkApplication(application))
if (desktopUnits.remove(application))
TheSocialOS.getEventBus().fireEvent(new AppManagerCloseEvent(application));
}
private boolean checkApplication(DesktopUnit application) {
if (AppConstants.IMAGEFOLDERS == application.getProgramID()
|| AppConstants.VIDEOFOLDERS == application.getProgramID()
|| AppConstants.VIDEOPLAYER == application.getProgramID()
|| AppConstants.OTHER == application.getProgramID()
|| AppConstants.SHAREDMANAGER == application.getProgramID()) return true;
return false;
}
}
}