org.openremote.modeler.client.view.UIDesignerView.java Source code

Java tutorial

Introduction

Here is the source code for org.openremote.modeler.client.view.UIDesignerView.java

Source

/*
 * OpenRemote, the Home of the Digital Home. Copyright 2008-2009, OpenRemote Inc.
 * 
 * See the contributors.txt file in the distribution for a full listing of individual contributors.
 * 
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
 * Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
 * later version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */
package org.openremote.modeler.client.view;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.openremote.modeler.client.Constants;
import org.openremote.modeler.client.event.PropertyEditEvent;
import org.openremote.modeler.client.model.AutoSaveResponse;
import org.openremote.modeler.client.proxy.BeanModelDataBase;
import org.openremote.modeler.client.proxy.UtilsProxy;
import org.openremote.modeler.client.rpc.AsyncServiceFactory;
import org.openremote.modeler.client.rpc.AsyncSuccessCallback;
import org.openremote.modeler.client.utils.IDUtil;
import org.openremote.modeler.client.utils.PanelsAndMaxOid;
import org.openremote.modeler.client.utils.TouchPanels;
import org.openremote.modeler.client.widget.uidesigner.ProfilePanel;
import org.openremote.modeler.client.widget.uidesigner.PropertyPanel;
import org.openremote.modeler.client.widget.uidesigner.ScreenPanel;
import org.openremote.modeler.client.widget.uidesigner.TemplatePanel;
import org.openremote.modeler.client.widget.uidesigner.WidgetPanel;
import org.openremote.modeler.domain.Group;
import org.openremote.modeler.domain.GroupRef;
import org.openremote.modeler.domain.Panel;
import org.openremote.modeler.domain.ScreenPair;
import org.openremote.modeler.domain.ScreenPairRef;

import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.InfoConfig;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.layout.AccordionLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;

/**
 * The Class UIDesignerView.
 */
public class UIDesignerView extends TabItem {

    /** The screen tab. */
    private ScreenPanel screenPanel = new ScreenPanel();

    /** The auto_save_interval millisecond. */
    private static final int AUTO_SAVE_INTERVAL_MS = 30000;

    private Timer timer;

    private ProfilePanel profilePanel = null;

    private TemplatePanel templatePanel = null;

    private PropertyPanel propertyPanel = null;

    /**
     * Instantiates a new uI designer view.
     */
    public UIDesignerView() {
        super();
        setText("UI Designer");

        AsyncServiceFactory.getUtilsRPCServiceAsync().getAccountPath(new AsyncSuccessCallback<String>() {
            public void onFailure(Throwable caught) {
                Info.display("Error", "falid to get account path.");
                super.checkTimeout(caught);
            }

            public void onSuccess(String result) {
                Cookies.setCookie(Constants.CURRETN_RESOURCE_PATH, result);
            }

        });
        setLayout(new BorderLayout());
        profilePanel = createWest();
        createCenter();
        createEast();
        prepareData();
        createAutoSaveTimer();
    }

    /**
     * Creates the timer.
     */
    private void createAutoSaveTimer() {
        timer = new Timer() {
            @Override
            public void run() {
                autoSaveUiDesignerLayout();
            }
        };
        timer.scheduleRepeating(AUTO_SAVE_INTERVAL_MS);
    }

    /**
     * Auto save ui designer layout json.
     */
    public void autoSaveUiDesignerLayout() {
        if (profilePanel.isInitialized()) {
            UtilsProxy.autoSaveUiDesignerLayout(getAllPanels(), IDUtil.currentID(),
                    new AsyncSuccessCallback<AutoSaveResponse>() {
                        @Override
                        public void onSuccess(AutoSaveResponse result) {
                            if (result != null && result.isUpdated()) {
                                Info.display("Info", "UI designer layout saved at "
                                        + DateTimeFormat.getFormat("HH:mm:ss").format(new Date()));
                            }
                            Window.setStatus("Auto-Saving: UI designer layout saved at: "
                                    + DateTimeFormat.getFormat("HH:mm:ss").format(new Date()));
                        }

                        @Override
                        public void onFailure(Throwable caught) {
                            timer.cancel();
                            boolean timeout = super.checkTimeout(caught);
                            if (!timeout) {
                                Info.display(new InfoConfig("Error", caught.getMessage() + " "
                                        + DateTimeFormat.getFormat("HH:mm:ss").format(new Date())));
                            }
                            Window.setStatus("Failed to save UI designer layout at: "
                                    + DateTimeFormat.getFormat("HH:mm:ss").format(new Date()));
                        }
                    });
            Window.setStatus("Saving ....");
        } else {
            Window.setStatus(
                    "Auto-Saving: Unable to save UI designer because panel list has not been initialized. ");
        }
    }

    public void saveUiDesignerLayout() {
        if (templatePanel != null && templatePanel.isExpanded()) {
            templatePanel.saveTemplateUpdates();
        } else {
            if (profilePanel.isInitialized()) {
                UtilsProxy.saveUiDesignerLayout(getAllPanels(), IDUtil.currentID(),
                        new AsyncSuccessCallback<AutoSaveResponse>() {
                            @Override
                            public void onSuccess(AutoSaveResponse result) {
                                if (result != null && result.isUpdated()) {
                                    Info.display("Info", "UI designer layout saved at "
                                            + DateTimeFormat.getFormat("HH:mm:ss").format(new Date()));
                                }
                                Window.setStatus("UI designer layout saved at: "
                                        + DateTimeFormat.getFormat("HH:mm:ss").format(new Date()));
                            }

                            @Override
                            public void onFailure(Throwable caught) {
                                timer.cancel();
                                boolean timeout = super.checkTimeout(caught);
                                if (!timeout) {
                                    Info.display(new InfoConfig("Error", caught.getMessage() + " "
                                            + DateTimeFormat.getFormat("HH:mm:ss").format(new Date())));
                                }
                                Window.setStatus("Failed to save UI designer layout at: "
                                        + DateTimeFormat.getFormat("HH:mm:ss").format(new Date()));

                                System.out.println(caught.toString());

                            }

                        });
                Window.setStatus("Saving ....");
            } else {
                Window.setStatus("Unable to save UI designer because panel list has not been initialized. ");
            }
        }
    }

    public void restore() {
        UtilsProxy.restore(new AsyncSuccessCallback<PanelsAndMaxOid>() {
            @Override
            public void onSuccess(PanelsAndMaxOid panelsAndMaxOid) {
                BeanModelDataBase.panelTable.clear();
                BeanModelDataBase.groupTable.clear();
                BeanModelDataBase.screenTable.clear();
                Collection<Panel> panels = panelsAndMaxOid.getPanels();
                long maxOid = panelsAndMaxOid.getMaxOid();

                for (Panel panel : panels) {
                    BeanModelDataBase.panelTable.insert(panel.getBeanModel());
                    for (GroupRef groupRef : panel.getGroupRefs()) {
                        Group group = groupRef.getGroup();
                        BeanModelDataBase.groupTable.insert(group.getBeanModel());
                        for (ScreenPairRef screenRef : group.getScreenRefs()) {
                            ScreenPair screen = screenRef.getScreen();
                            BeanModelDataBase.screenTable.insert(screen.getBeanModel());
                        }
                    }
                }
                IDUtil.setCurrentID(maxOid);
                refreshPanelTree();
            }

            @Override
            public void onFailure(Throwable caught) {
                MessageBox.alert("Error", "UI designer restore failed: " + caught.getMessage(), null);
                super.checkTimeout(caught);
            }
        });
    }

    /**
     * Creates the east.
     */
    private void createEast() {
        BorderLayoutData eastLayout = new BorderLayoutData(LayoutRegion.EAST, 300);
        eastLayout.setSplit(true);
        eastLayout.setMargins(new Margins(0, 2, 0, 2));
        add(createWidgetAndPropertyContainer(), eastLayout);
    }

    /**
     * Creates the west.
     */
    private ProfilePanel createWest() {
        ContentPanel west = new ContentPanel();
        ProfilePanel result = new ProfilePanel(screenPanel);
        result.addListener(PropertyEditEvent.PropertyEditEvent, new Listener<PropertyEditEvent>() {
            public void handleEvent(PropertyEditEvent be) {
                propertyPanel.setPropertyForm(be.getPropertyEditable());
            }

        });
        templatePanel = new TemplatePanel(screenPanel);
        BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 200);
        westData.setSplit(true);
        west.setLayout(new AccordionLayout());
        west.setBodyBorder(false);
        west.setHeaderVisible(false);
        west.add(result);
        west.add(templatePanel);
        westData.setMargins(new Margins(0, 2, 0, 0));
        add(west, westData);
        return result;
    }

    private void refreshPanelTree() {
        if (profilePanel != null) {
            profilePanel.layout();
        }
    }

    /**
     * Creates the center.
     */
    private void createCenter() {
        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
        centerData.setMargins(new Margins(0, 2, 0, 2));
        add(screenPanel, centerData);
    }

    /**
     * Prepare data.
     */
    private void prepareData() {
        TouchPanels.load();
    }

    /**
     * create widget and property container in the view's east.
     */
    private ContentPanel createWidgetAndPropertyContainer() {
        ContentPanel widgetAndPropertyContainer = new ContentPanel(new BorderLayout());
        widgetAndPropertyContainer.setHeaderVisible(false);
        widgetAndPropertyContainer.setBorders(false);
        widgetAndPropertyContainer.setBodyBorder(false);

        WidgetPanel widgetPanel = new WidgetPanel();
        BorderLayoutData northData = new BorderLayoutData(LayoutRegion.NORTH);
        northData.setSplit(true);
        northData.setMargins(new Margins(2));
        widgetPanel.setSize("100%", "50%");
        widgetAndPropertyContainer.add(widgetPanel, northData);

        propertyPanel = new PropertyPanel();
        BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER);
        centerData.setSplit(true);
        centerData.setMargins(new Margins(2));
        propertyPanel.setSize("100%", "50%");

        widgetAndPropertyContainer.add(propertyPanel, centerData);
        return widgetAndPropertyContainer;
    }

    List<Panel> getAllPanels() {
        List<Panel> panelList = new ArrayList<Panel>();
        for (BeanModel panelBeanModel : BeanModelDataBase.panelTable.loadAll()) {
            panelList.add((Panel) panelBeanModel.getBean());
        }
        return panelList;
    }
}