/**
* Copyright 2008-2016 Qualogy Solutions B.V.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qualogy.qafe.gwt.client.ui;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.gwt.mosaic.ui.client.WindowPanel;
import org.gwt.mosaic.ui.client.WindowPanel.WindowState;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.DoubleClickEvent;
import com.google.gwt.event.dom.client.DoubleClickHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.UIObject;
import com.google.gwt.user.client.ui.Widget;
import com.qualogy.qafe.gwt.client.component.DesktopIcon;
import com.qualogy.qafe.gwt.client.component.html5.notifications.Notification;
import com.qualogy.qafe.gwt.client.context.ClientApplicationContext;
import com.qualogy.qafe.gwt.client.factory.MainFactoryActions;
import com.qualogy.qafe.gwt.client.ui.renderer.RendererHelper;
import com.qualogy.qafe.gwt.client.ui.renderer.WindowRenderer;
import com.qualogy.qafe.gwt.client.ui.renderer.events.CallbackHandler;
import com.qualogy.qafe.gwt.client.ui.renderer.events.EventFactory;
import com.qualogy.qafe.gwt.client.util.QAMLConstants;
import com.qualogy.qafe.gwt.client.vo.ui.ComponentGVO;
import com.qualogy.qafe.gwt.client.vo.ui.MenuItemGVO;
import com.qualogy.qafe.gwt.client.vo.ui.UIGVO;
import com.qualogy.qafe.gwt.client.vo.ui.WindowGVO;
import com.qualogy.qafe.gwt.client.vo.ui.event.EventListenerGVO;
import com.qualogy.qafe.gwt.client.vo.ui.event.InputVariableGVO;
public class GWTUIGenerator {
public static final Panel createView(UIGVO ui) {
Panel view = null;
if (ui != null) {
String uuid = ui.getUuid();
WindowGVO[] windows = ui.getWindows();
Widget[] widgets = new Widget[windows.length];
/*
* for (int i = 0; i < windows.length; i++) {
*
* Widget w = (Widget) new
* WindowRenderer().render(windows[i],windows[i].getId() +"|"+uuid
* ); widgets[i] = w; }
*/
buildMenu(widgets, windows, uuid, ui);
}
return view;
}
public static final Widget createView(UIGVO ui, String windowId) {
Widget view = null;
if (ui != null) {
String uuid = ui.getUuid();
WindowGVO[] windows = ui.getWindows();
for (int i = 0; i < windows.length; i++) {
if (windowId != null && windowId.equals(windows[i].getId())) {
view = (Widget) new WindowRenderer().render(windows[i], uuid, windowId, ui.getAppId());
EventFactory.processOnLoadEvent(windows[i], view);
break;
}
// check if there onload events for this.
}
}
return view;
}
// CHECKSTYLE.OFF: CyclomaticComplexity
private static void buildMenu(Widget[] widgets, WindowGVO[] windows, final String uuid, UIGVO ui) {
if (widgets != null && windows != null) {
MenuBar menuBar = null;
String menuTitle = "";
boolean tryMeFeature = false;
if (ui.getTitle() != null) {
menuTitle = ui.getTitle();
// TODO: is it needed to call this method?
ClientApplicationContext.getInstance().removeWindow(menuTitle, ui.getAppId(), uuid);
menuBar = new MenuBar(true);
MenuItem menuItem = createMenuItem(ui.getAppId(), menuTitle, uuid, null, menuBar);
if (ui.getRootMenu()==null){
if (ClientApplicationContext.getInstance().getApplicationsMenu() != null) {
ClientApplicationContext.getInstance().getApplicationsMenu().addItem(menuItem);
}
} else {
// get the rootMenu and add the item to that menu
MenuBar targetMenuBar = ClientApplicationContext.getInstance().getMenuBars().get(ui.getRootMenu());
if (targetMenuBar!=null){
targetMenuBar.addItem(menuItem);
}
}
} else {
menuTitle = "Try me!";
if (ClientApplicationContext.getInstance().getTryMeMenu() == null) {
menuBar = new MenuBar(true);
ClientApplicationContext.getInstance().setTryMeMenu(menuBar);
ClientApplicationContext.getInstance().getMainMenu().addItem(menuTitle, menuBar);
}
tryMeFeature = true;
menuBar = ClientApplicationContext.getInstance().getTryMeMenu();
ClientApplicationContext.getInstance().log("Try me menu", "Check Try Me! menu for updated application", false, true, null);
}
for (int i = 0; i < widgets.length; i++) {
String title = windows[i].getTitle();
if (title == null || title.length() == 0) {
title = windows[i].getId();
}
if (windows[i].getIsparent() != null && windows[i].getIsparent().booleanValue()) {
menuBar.addItem(createMenuItem(title, uuid, windows[i].getId(), ui, tryMeFeature));
}
if (ClientApplicationContext.getInstance().isMDI()) {
if (ClientApplicationContext.getInstance().getDockMode()) {
if (windows[i].getInDock() != null && windows[i].getInDock().booleanValue()) {
addToDockPanel(windows[i], uuid, title, ui.getAppId());
} else {
createDesktopIcon(windows[i], uuid, title, ui.getAppId());
}
} else {
createDesktopIcon(windows[i], uuid, title, ui.getAppId());
}
}
}
if (ClientApplicationContext.getInstance().isMDI()) {
ClientApplicationContext.getInstance().updatePosition();
}
}
}
// CHECKSTYLE.ON: CyclomaticComplexity
private static void addToDockPanel(final WindowGVO windowGVO, final String uuid, final String title, final String appId) {
if (windowGVO != null && windowGVO.getIcon() != null && windowGVO.getIcon().length() > 0) {
final String windowId = windowGVO.getId();
final Image dockImage = new Image(windowGVO.getIcon());
dockImage.setTitle(title);
//dockImage.setHeight(60 + "px");
//dockImage.setWidth(40 + "px");
dockImage.setStylePrimaryName("dockItem");
fillInMandatoryOnly(windowGVO, dockImage, uuid, windowId, appId);
dockImage.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
WindowPanel existingWindowPanel = ClientApplicationContext.getInstance().windowIdExists(windowId, uuid);
if (existingWindowPanel == null) {
EventListenerGVO[] events = windowGVO.getEvents();
if (events != null) {
String eventType = QAMLConstants.EVENT_ONCLICK;
for (EventListenerGVO eventGVO : events) {
if (eventGVO.getEventComponentId().equals(windowId) && eventGVO.getEventListenerType().equals(eventType)) {
createCallBack4OpenWindow(dockImage, eventType, eventGVO);
break;
}
}
}
// MainFactoryActions.getUIByUUID(uuid, windowId);
} else {
Iterator itr = ClientApplicationContext.getInstance().getHorizontalPanel().iterator();
while (itr.hasNext()) {
Widget w = (Widget) itr.next();
if (w.getTitle().equals(title)) {
existingWindowPanel.setWindowState(WindowState.NORMAL);
existingWindowPanel.show();
ClientApplicationContext.getInstance().getHorizontalPanel().remove(w);
}
}
existingWindowPanel.toFront();
}
}
});
if (ClientApplicationContext.getInstance().getDockPanel() != null) {
ClientApplicationContext.getInstance().getDockPanel().add(dockImage);
int dockWidth = ClientApplicationContext.getInstance().getDockPanel().getOffsetWidth();
DOM.setStyleAttribute(ClientApplicationContext.getInstance().getDockPanel().getElement(), "left", Window.getClientWidth() / 2 - (dockWidth / 2) + "");
}
}
}
private static void createDesktopIcon(final WindowGVO windowGVO, final String uuid, final String title, final String appId) {
if (windowGVO != null && windowGVO.getIcon() != null && windowGVO.getIcon().length() > 0) {
final String windowId = windowGVO.getId();
final DesktopIcon desktopIcon = new DesktopIcon(windowGVO.getIcon(), title);
fillInMandatoryOnly(windowGVO, desktopIcon, uuid, windowId, appId);
desktopIcon.addDoubleClickHandler(new DoubleClickHandler() {
public void onDoubleClick(DoubleClickEvent event) {
// ClientApplicationContext.getInstance().removeWindow(windowId,
// uuid);
WindowPanel existingWindowPanel = ClientApplicationContext.getInstance().windowIdExists(windowId, uuid);
if (existingWindowPanel == null) {
EventListenerGVO[] events = windowGVO.getEvents();
if (events != null) {
String eventType = QAMLConstants.EVENT_ONCLICK;
for (EventListenerGVO eventGVO : events) {
if (eventGVO.getEventComponentId().equals(windowId) && eventGVO.getEventListenerType().equals(eventType)) {
createCallBack4OpenWindow(desktopIcon, eventType, eventGVO);
break;
}
}
}
// MainFactoryActions.getUIByUUID(uuid, windowId);
} else {
Iterator itr = ClientApplicationContext.getInstance().getHorizontalPanel().iterator();
while (itr.hasNext()) {
Widget w = (Widget) itr.next();
if (w.getTitle().equals(title)) {
existingWindowPanel.setWindowState(WindowState.NORMAL);
existingWindowPanel.show();
ClientApplicationContext.getInstance().getHorizontalPanel().remove(w);
}
}
existingWindowPanel.toFront();
}
}
});
ClientApplicationContext.getInstance().getDragController().makeDraggable(desktopIcon, desktopIcon.getTitleLabel());
ClientApplicationContext.getInstance().addDesktopIcon(desktopIcon);
}
}
public static MenuItem createMenuItem(String itemId, String itemLabel, String uuid, String context, MenuBar subMenu) {
MenuItem menuItem = new MenuItem(itemLabel, subMenu);
MenuItemGVO menuItemGVO = new MenuItemGVO();
menuItemGVO.setId(itemId);
RendererHelper.fillIn(menuItemGVO, menuItem, uuid, null, context);
return menuItem;
}
private static MenuItem createMenuItem(final String title, final String uuid, final String windowId, final UIGVO uiGVO, final boolean tryMe) {
final MenuItem menuItem = new MenuItem(title, (Command) null);
MenuItemGVO menuItemGVO = new MenuItemGVO();
menuItemGVO.setId(windowId);
RendererHelper.fillIn(menuItemGVO, menuItem, uuid, null, uiGVO.getAppId());
Command command = new Command() {
public void execute() {
if(ClientApplicationContext.getInstance().isDesktopNotificationPossible() && Notification.isNotificationNotAllowed()){
Notification.requestPermission();
}
// ClientApplicationContext.getInstance().removeWindow(windowId,
// uuid);
WindowPanel existingWindowPanel = ClientApplicationContext.getInstance().windowIdExists(windowId, uuid);
if (existingWindowPanel == null) {
if (tryMe) {
MainFactoryActions.getUIByUUID(uuid, windowId);
} else {
String eventType = QAMLConstants.EVENT_ONCLICK;
EventListenerGVO eventGVO = uiGVO.getEventMap().get(windowId);
createCallBack4OpenWindow(menuItem, eventType, eventGVO);
}
// MainFactoryActions.getUIByUUID(uuid, windowId);
} else {
Iterator itr = ClientApplicationContext.getInstance().getHorizontalPanel().iterator();
while (itr.hasNext()) {
Widget w = (Widget) itr.next();
if (w.getTitle().equals(title)) {
existingWindowPanel.setWindowState(WindowState.NORMAL);
existingWindowPanel.show();
ClientApplicationContext.getInstance().getHorizontalPanel().remove(w);
}
}
existingWindowPanel.toFront();
}
}
};
menuItem.setCommand(command);
return menuItem;
}
private static void createCallBack4OpenWindow(UIObject sender, String eventType, EventListenerGVO eventGVO) {
List<InputVariableGVO> input = new ArrayList<InputVariableGVO>();
CallbackHandler.createCallBack(sender, eventType, eventGVO, input);
}
private static void fillInMandatoryOnly(ComponentGVO componentGVO, UIObject uiObject, String uuid, String parent, String context) {
RendererHelper.addId(componentGVO, uiObject, uuid, parent, context, false);
RendererHelper.addUUID(componentGVO, uiObject, uuid);
}
}