/** * Copyright 2010 JBoss Inc * * 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 org.drools.guvnor.client.modeldriven.ui; import org.drools.guvnor.client.common.DirtyableComposite; import org.drools.guvnor.client.common.FormStylePopup; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.rpc.RuleAsset; import org.drools.ide.common.client.modeldriven.dt.TemplateModel; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.gwtext.client.core.EventObject; import com.gwtext.client.data.ArrayReader; import com.gwtext.client.data.FieldDef; import com.gwtext.client.data.GroupingStore; import com.gwtext.client.data.MemoryProxy; import com.gwtext.client.data.Record; import com.gwtext.client.data.RecordDef; import com.gwtext.client.data.StringFieldDef; import com.gwtext.client.widgets.Toolbar; import com.gwtext.client.widgets.ToolbarMenuButton; import com.gwtext.client.widgets.form.TextField; import com.gwtext.client.widgets.grid.ColumnConfig; import com.gwtext.client.widgets.grid.ColumnModel; import com.gwtext.client.widgets.grid.EditorGridPanel; import com.gwtext.client.widgets.grid.GridEditor; import com.gwtext.client.widgets.grid.GridPanel; import com.gwtext.client.widgets.grid.GridView; import com.gwtext.client.widgets.grid.event.EditorGridListenerAdapter; import com.gwtext.client.widgets.grid.event.GridListenerAdapter; import com.gwtext.client.widgets.menu.BaseItem; import com.gwtext.client.widgets.menu.Item; import com.gwtext.client.widgets.menu.Menu; import com.gwtext.client.widgets.menu.event.BaseItemListenerAdapter; public class RuleTemplateEditor extends DirtyableComposite implements RuleModelEditor { private TemplateModel model; private GroupingStore store = null; private EditorGridPanel grid = null; private RuleModeller ruleModeller; private Constants constants = ((Constants) GWT.create( Constants.class )); public RuleTemplateEditor(RuleAsset asset) { model = (TemplateModel) asset.content; final VerticalPanel tPanel = new VerticalPanel(); tPanel.setWidth( "100%" ); ruleModeller = new RuleModeller( asset, new TemplateModellerWidgetFactory() ); tPanel.add( new Button( constants.LoadTemplateData(), new ClickHandler() { public void onClick(ClickEvent event) { final FormStylePopup popUp = new FormStylePopup( null, constants.TemplateData(), (int) (Window.getClientWidth() * 0.8) ); popUp.setHeight( ((int) (Window.getClientHeight() * 0.8)) + "px" ); popUp.addAttribute( "", buildTemplateTable() ); Button close = new Button( constants.Close(), new ClickHandler() { public void onClick(ClickEvent event) { popUp.hide(); } } ); HorizontalPanel pnlClose = new HorizontalPanel(); pnlClose.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_RIGHT ); pnlClose.add( close ); popUp.addAttribute( "", pnlClose ); popUp.show(); } } ) ); tPanel.add( ruleModeller ); initWidget( tPanel ); } private Widget buildTemplateTable() { String[] vars = model.getInterpolationVariablesList(); if ( vars.length == 0 ) { return new Label( "" ); } FieldDef[] fds = new FieldDef[vars.length]; ColumnConfig[] cols = new ColumnConfig[fds.length]; int idx = 0; for ( String var : vars ) { cols[idx] = new ColumnConfig(); cols[idx].setHeader( var ); cols[idx].setDataIndex( var ); cols[idx].setSortable( false ); cols[idx].setWidth( 50 ); cols[idx].setResizable( true ); cols[idx].setEditor( new GridEditor( new TextField() ) ); fds[idx] = new StringFieldDef( var ); idx++; } final RecordDef recordDef = new RecordDef( fds ); ArrayReader reader = new ArrayReader( recordDef ); MemoryProxy proxy = new MemoryProxy( model.getTableAsArray() ); ColumnModel cm = new ColumnModel( cols ); for ( int i = 0; i < cm.getColumnCount(); i++ ) { cm.setEditable( i, true ); } store = new GroupingStore( proxy, reader ); store.load(); grid = new EditorGridPanel( store, cm ); grid.setStripeRows( true ); // GroupingView gv = new GroupingView(); GridView gv = new GridView(); // to stretch it out gv.setForceFit( true ); // gv.setGroupTextTpl("{text} ({[values.rs.length]} {[values.rs.length > 1 ? \"" // NON-NLS // + constants.Items() + "\" : \"" + constants.Item() + "\"]})"); grid.setView( gv ); grid.setStore( store ); grid.setAutoWidth( true ); grid.setAutoHeight( true ); Toolbar tb = new Toolbar(); Menu menu = new Menu(); menu.addItem( new Item( constants.AddRow(), new BaseItemListenerAdapter() { public void onClick(BaseItem item, EventObject e) { String[] rowData = new String[recordDef.getFields().length]; for ( int i = 0; i < rowData.length; i++ ) { rowData[i] = ""; } Record newRecord = recordDef.createRecord( rowData ); store.add( newRecord ); model.addRow( newRecord.getId(), rowData ); } } ) ); menu.addItem( new Item( constants.RemoveSelectedRowS(), new BaseItemListenerAdapter() { public void onClick(BaseItem item, EventObject e) { removeSelectedRows( grid ); } } ) ); grid.addGridListener( new GridListenerAdapter() { public void onKeyPress(EventObject e) { int k = e.getKey(); if ( k == KeyCodes.KEY_DELETE || k == KeyCodes.KEY_BACKSPACE ) { removeSelectedRows( grid ); } else if ( k == KeyCodes.KEY_ENTER ) { int[] selectedCell = grid.getCellSelectionModel().getSelectedCell(); grid.startEditing( selectedCell[0], selectedCell[1] ); } } } ); // grid.setSelectionModel(new RowSelectionModel(false)); ToolbarMenuButton tbb = new ToolbarMenuButton( constants.Modify(), menu ); tb.addButton( tbb ); grid.add( tb ); grid.addEditorGridListener( new EditorGridListenerAdapter() { @Override public void onAfterEdit(GridPanel grid, Record record, String field, Object newValue, Object oldValue, int rowIndex, int colIndex) { model.setValue( field, rowIndex, (String) newValue ); } } ); grid.setWidth( (int) (Window.getClientWidth() * 0.75) ); return grid; } private void removeSelectedRows(EditorGridPanel grid) { if ( com.google.gwt.user.client.Window.confirm( constants.AreYouSureYouWantToDeleteTheSelectedRowS() ) ) { int row = grid.getCellSelectionModel().getSelectedCell()[0]; Record rec = store.getAt( row ); model.removeRowById( rec.getId() ); store.remove( rec ); } } @Override public void resetDirty() { super.resetDirty(); if ( store != null ) { store.commitChanges(); } } public RuleModeller getRuleModeller() { return ruleModeller; } }