/* * 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, Sv�rdv�gen 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; } }