org.onecmdb.ui.gwt.desktop.client.widget.customview.CustomViewSelectWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.onecmdb.ui.gwt.desktop.client.widget.customview.CustomViewSelectWidget.java

Source

/*
 * Lokomo OneCMDB - An Open Source Software for Configuration
 * Management of Datacenter Resources
 *
 * Copyright (C) 2006 Lokomo Systems AB
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 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
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 * 
 * Lokomo Systems AB can be contacted via e-mail: info@lokomo.com or via
 * paper mail: Lokomo Systems AB, Svrdvgen 27, SE-182 33
 * Danderyd, Sweden.
 *
 */
package org.onecmdb.ui.gwt.desktop.client.widget.customview;

import java.util.ArrayList;
import java.util.List;

import org.onecmdb.ui.gwt.desktop.client.WindowFactory;
import org.onecmdb.ui.gwt.desktop.client.action.CloseTextToolItem;
import org.onecmdb.ui.gwt.desktop.client.fixes.MyGroupingView;
import org.onecmdb.ui.gwt.desktop.client.service.CMDBAsyncCallback;
import org.onecmdb.ui.gwt.desktop.client.service.content.ContentFile;
import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBDesktopWindowItem;
import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBSession;
import org.onecmdb.ui.gwt.desktop.client.service.model.ModelServiceFactory;
import org.onecmdb.ui.gwt.desktop.client.window.CMDBWidgetFactory;
import org.onecmdb.ui.gwt.desktop.client.window.content.CMDBContentBrowserWidget;

import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.core.XTemplate;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.data.HttpProxy;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.ModelType;
import com.extjs.gxt.ui.client.data.XmlReader;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.GroupingStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridGroupRenderer;
import com.extjs.gxt.ui.client.widget.grid.GroupColumnData;
import com.extjs.gxt.ui.client.widget.grid.RowExpander;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.TextToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.user.client.Element;

public class CustomViewSelectWidget extends LayoutContainer {

    private String customViewSource;
    private String root;
    private String recordName;

    public CustomViewSelectWidget(String root, String recordName) {
        this.root = root;
        this.recordName = recordName;
    }

    @Override
    protected void onRender(Element parent, int index) {
        super.onRender(parent, index);
        initUI();
    }

    public void initUI() {
        setLayout(new FitLayout());

        List<ColumnConfig> columns = new ArrayList<ColumnConfig>();

        XTemplate tpl = XTemplate
                .create("<b>Description:</b><br/> {description}<br/><b>Definition:</b><br/>{definition}</br>");

        RowExpander expander = new RowExpander();
        expander.setTemplate(tpl);

        columns.add(expander);
        columns.add(new ColumnConfig("name", "Name", 100));
        columns.add(new ColumnConfig("group", "Group", 100));
        // create the column model  
        final ColumnModel cm = new ColumnModel(columns);

        // defines the xml structure  
        ModelType type = new ModelType();
        type.root = this.root;
        type.recordName = this.recordName;

        type.addField("name", "name");
        type.addField("description");
        type.addField("group");
        type.addField("definition");

        // use a http proxy to get the data  
        String sourceURL = CMDBSession.get().getContentRepositoryURL() + "/" + customViewSource;
        RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, sourceURL);
        HttpProxy proxy = new HttpProxy(builder);

        // need a loader, proxy, and reader  
        XmlReader reader = new XmlReader(type);

        BaseListLoader loader = new BaseListLoader(proxy, reader);
        GroupingStore<ModelData> store = new GroupingStore<ModelData>(loader);
        store.groupBy("group");

        final Grid grid = new Grid<ModelData>(store, cm);
        grid.setBorders(true);
        grid.setAutoExpandColumn("name");
        grid.addListener(Events.RowDoubleClick, new Listener<GridEvent>() {

            public void handleEvent(GridEvent be) {
                // Open it...
                ModelData data = be.grid.getStore().getAt(be.rowIndex);
                openView(data);
            }
        });

        grid.addPlugin(expander);
        MyGroupingView view = new MyGroupingView();
        view.setForceFit(false);
        view.setGroupRenderer(new GridGroupRenderer() {
            public String render(GroupColumnData data) {
                String f = cm.getColumnById(data.field).getHeader();
                String l = data.models.size() == 1 ? "Item" : "Items";
                return f + ": " + data.group + " (" + data.models.size() + " " + l + ")";
            }
        });
        grid.setView(view);

        ToolBar toolBar = new ToolBar();
        TextToolItem open = new TextToolItem("Open", "open-icon");
        open.setToolTip("Open selected view");
        open.addSelectionListener(new SelectionListener<ComponentEvent>() {

            @Override
            public void componentSelected(ComponentEvent ce) {
                ModelData item = grid.getSelectionModel().getSelectedItem();
                if (item != null) {
                    openView(item);
                }
            }
        });
        /*
        TextToolItem close = new TextToolItem("Close", "close-icon");
        close.setToolTip("Close this window");
        close.addSelectionListener(new SelectionListener<ComponentEvent>() {
            
         @Override
         public void componentSelected(ComponentEvent ce) {
        if (getParent() instanceof Window) {
           ((Window)getParent()).close();
        }
        if (getParent().getParent() instanceof Window) {
           ((Window)getParent().getParent()).close();
        }
            
         }
               
        });
        */
        toolBar.add(new FillToolItem());
        toolBar.add(open);
        toolBar.add(new SeparatorToolItem());
        toolBar.add(new CloseTextToolItem(this));

        ContentPanel panel = new ContentPanel();
        panel.setHeaderVisible(false);
        panel.setLayout(new FitLayout());
        panel.add(grid);
        panel.setBottomComponent(toolBar);
        add(panel);
        layout();
        loader.load();

    }

    protected void openView(ModelData data) {
        String def = data.get("definition");
        ContentFile f = new ContentFile();
        f.setPath(def);
        ModelServiceFactory.get().loadCustomView(CMDBSession.get().getToken(), f,
                new CMDBAsyncCallback<BaseModel>() {

                    @Override
                    public void onSuccess(BaseModel arg0) {
                        BaseModel widgets = arg0.get("widgets");
                        Object o = widgets.get("widget");
                        if (o instanceof List) {
                            for (CMDBDesktopWindowItem item : (List<CMDBDesktopWindowItem>) o) {
                                WindowFactory.showWindow(CMDBSession.get().getDesktop(), item);
                            }
                        }
                    }
                });
    }

    public void setCustomFile(String customDef) {
        this.customViewSource = customDef;

    }
}