/*
* 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.grid;
import java.util.List;
import org.onecmdb.ui.gwt.desktop.client.WindowFactory;
import org.onecmdb.ui.gwt.desktop.client.control.GridModelConfigLoader;
import org.onecmdb.ui.gwt.desktop.client.service.content.ContentData;
import org.onecmdb.ui.gwt.desktop.client.service.model.AttributeModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.CIModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.CMDBPermissions;
import org.onecmdb.ui.gwt.desktop.client.service.model.ValueModel;
import org.onecmdb.ui.gwt.desktop.client.service.model.grid.AttributeColumnConfig;
import org.onecmdb.ui.gwt.desktop.client.service.model.grid.CIModelCollection;
import org.onecmdb.ui.gwt.desktop.client.service.model.grid.GridModelConfig;
import org.onecmdb.ui.gwt.desktop.client.utils.ExpressionHandler;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.ComponentPlugin;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.grid.CellSelectionModel;
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.EditorGrid;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel;
import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel.CellSelection;
import com.extjs.gxt.ui.client.widget.layout.FillLayout;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class EditableSingleCIGrid extends LayoutContainer {
protected List<AttributeModel> attributes;
private ContentData mdr;
private ContentData gridData;
private GridModelConfig gridConfig;
private CIModel ci;
private ListStore<CIModelCollection> store;
//private boolean readonly;
protected CMDBPermissions permissions;
private String rootCI;
public EditableSingleCIGrid(ContentData mdr, CIModel instance) {
this.mdr = mdr;
this.ci = instance;
}
public void setRootCI(String root) {
this.rootCI = root;
}
/*
public boolean isReadonly() {
return readonly;
}
public void setReadonly(boolean readonly) {
this.readonly = readonly;
}
*/
@Override
protected void onRender(Element parent, int index) {
super.onRender(parent, index);
loadGridConfig();
}
protected void loadGridConfig() {
ContentData gridData = new ContentData();
if (ci.isTemplate()) {
gridData.set("template", ci.getAlias());
} else {
gridData.set("template", ci.getDerivedFrom());
}
new GridModelConfigLoader(mdr, gridData, permissions, ci.isTemplate()).load(new AsyncCallback<GridModelConfig>() {
public void onFailure(Throwable arg0) {
// TODO Auto-generated method stub
}
public void onSuccess(final GridModelConfig arg0) {
EditableSingleCIGrid.this.gridConfig = arg0;
init(arg0.getColumns());
// Need to reload ci, why?
/*
if (!ci.isTemplate()) {
List<String> aliases = new ArrayList<String>();
aliases.add(ci.getAlias());
ModelServiceFactory.get().getCIModel(CMDBSession.get().getToken(), mdr, aliases, new CMDBAsyncCallback<List<CIModel>>() {
@Override
public void onSuccess(List<CIModel> list) {
if (list.size() == 1) {
ci = list.get(0);
}
init(arg0.getColumns());
}
});
} else {
init(arg0.getColumns());
}
*/
}
});
}
protected void init(List<ColumnConfig> cols) {
setLayout(new FillLayout());
store = new ListStore<CIModelCollection>();
//store.clearGrouping();
//store.groupBy("status");
//final ListStore store = new ListStore(loader);
/*
ContentPanel cp = new ContentPanel();
cp.setHeading("Edit - " + ci.getNameAndIcon());
cp.setFrame(true);
cp.setLayout(new FitLayout());
*/
CIModelCollection col = new CIModelCollection();
col.addCIModel("offspring", ci);
store.add(col);
final ColumnModel cm = new ColumnModel(cols);
Grid newGrid = null;
if (permissions.getCurrentState().equals(CMDBPermissions.PermissionState.EDIT)) {
newGrid = new EditorGrid(store, cm);
} else {
newGrid = new Grid(store, cm);
}
final Grid grid = newGrid;
for (ColumnConfig cfg : cols) {
if (cfg instanceof ComponentPlugin) {
grid.addPlugin((ComponentPlugin)cfg);
}
}
/*
if (gridConfig.getAutoExpandColumnId() != null) {
grid.setAutoExpandColumn(gridConfig.getAutoExpandColumnId());
}
*/
/*
MyGroupingView view = new MyGroupingView();
view.setForceFit(true);
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);
*/
grid.setBorders(true);
//grid.setLoadMask(true);
grid.setContextMenu(getGridContextMenu(grid, cols));
/*
if (permissions.getCurrentState().equals(CMDBPermissions.PermissionState.READONLY)) {
grid.addListener(Events.RowDoubleClick, getPropertySelection(grid));
}
*/
add(grid);
/*
ToolBar toolBar = new ToolBar();
if (gridConfig.isSupportAddRow()) {
TextToolItem add = new TextToolItem("Add Row");
add.addSelectionListener(new SelectionListener<ToolBarEvent>() {
@Override
public void componentSelected(ToolBarEvent ce) {
CIModelCollection model = gridConfig.createNewInstance();
grid.stopEditing();
store.insert(model, 0);
grid.startEditing(0, 0);
}
});
//toolBar.add(add);
pageToolBar.add(add);
}
cp.setTopComponent(pageToolBar);
*/
/*
cp.setButtonAlign(HorizontalAlignment.CENTER);
cp.addButton(new Button("Reset", new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
// Remove all new Objects...
for (CIModelCollection col : store.getModels()) {
if (col.isNewCollection()) {
store.remove(col);
}
}
store.rejectChanges();
}
}));
cp.addButton(new Button("Save", new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
final List<CIModelCollection> base = new ArrayList<CIModelCollection>();
final List<CIModelCollection> local = new ArrayList<CIModelCollection>();
Listener<StoreEvent> listener = new Listener<StoreEvent>() {
public void handleEvent(StoreEvent be) {
if (be.operation == RecordUpdate.COMMIT) {
if (be.model instanceof CIModelCollection) {
local.add((CIModelCollection) be.model);
}
}
}
};
List<Record> records = store.getModifiedRecords();
for (Record record : records) {
CIModelCollection item = (CIModelCollection) record.getModel();
if (item.isNewCollection()) {
continue;
}
CIModelCollection old = item.copy();
Map<String, Object> original = record.getChanges();
for (String p : original.keySet()) {
old.set(p, original.get(p));
}
base.add(old);
}
store.addListener(Store.Update, listener);
store.commitChanges();
store.removeListener(Store.Update, listener);
// Do store on modfied.
ModelServiceFactory.get().store(mdr, CMDBSession.get().getToken(), local, base, new AsyncCallback<StoreResult>() {
public void onFailure(Throwable caught) {
}
public void onSuccess(StoreResult result) {
}
});
}
}));
*/
//add(cp);
layout();
}
public boolean commit() {
store.commitChanges();
return(true);
}
public void restore() {
store.rejectChanges();
}
private SelectionListener<ComponentEvent> getPropertySelection(final Grid grid) {
SelectionListener<ComponentEvent> selection = new SelectionListener<ComponentEvent>() {
@Override
public void handleEvent(ComponentEvent ce) {
super.handleEvent(ce);
if (ce.type == Events.RowDoubleClick) {
componentSelected(ce);
}
}
@Override
public void componentSelected(ComponentEvent ce) {
GridSelectionModel<ModelData> selectionModel = (GridSelectionModel<ModelData>) grid.getSelectionModel();
ModelData data = selectionModel.getSelectedItem();
if (selectionModel instanceof CellSelectionModel) {
data = ((CellSelectionModel)selectionModel).getSelectCell().model;
}
if (!(data instanceof CIModelCollection)) {
return;
}
final CIModelCollection dataCol = (CIModelCollection)data;
DeferredCommand.addCommand(new Command() {
public void execute() {
CIPropertyPanel panel = new CIPropertyPanel(mdr, dataCol, rootCI);
panel.setPermissions(permissions);
Window w = WindowFactory.getWindow("Properties for " + dataCol.getCIModels().get(0).getDisplayName(), panel);
//w.add(new CIValueForm(gridConfig, store, data));
w.show();
w.layout();
w.toFront();
}
});
}
};
return(selection);
}
private Menu getGridContextMenu(final Grid grid, final List<ColumnConfig> cols) {
Menu menu = new Menu();
MenuItem item = new MenuItem("Properties", "property-icon");
item.addSelectionListener(getPropertySelection(grid));
menu.add(item);
final MenuItem open = new MenuItem("Open in Browser", "open-icon");
open.addSelectionListener(new SelectionListener<ComponentEvent>() {
@Override
public void componentSelected(ComponentEvent ce) {
String url = open.getData("url");
com.google.gwt.user.client.Window.open(url,"OneCMDB_URL", "");
}
});
open.setVisible(false);
menu.add(open);
menu.addListener(Events.BeforeShow, new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
open.setVisible(false);
GridSelectionModel<ModelData> selectionModel = (GridSelectionModel<ModelData>) grid.getSelectionModel();
ModelData data = selectionModel.getSelectedItem();
if (selectionModel instanceof CellSelectionModel) {
CellSelection cell = ((CellSelectionModel)selectionModel).getSelectCell();
if (cell == null) {
return;
}
if (gridConfig.getColumnConfig() == null) {
return;
}
if (cell.cell < 0 || cell.cell >= gridConfig.getColumnConfig().size()) {
return;
}
AttributeColumnConfig cfg = gridConfig.getColumnConfig().get(cell.cell);
if (cfg == null) {
return;
}
if (cell.model == null) {
return;
}
if ("xs:anyURI".equals(cfg.getType())) {
open.setVisible(true);
Object value = cell.model.get(cfg.getId());
String url = "";
if (value instanceof ValueModel) {
url = ((ValueModel)value).getValue();
url = ExpressionHandler.replaceURL(url);
}
open.setData("url", url);
}
}
}
});
return(menu);
}
public void setPermissions(CMDBPermissions permissions) {
this.permissions = permissions;
}
}