/* * Copyright 2005 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.ruleeditor; import java.util.Date; import org.drools.guvnor.client.common.AssetFormats; import org.drools.guvnor.client.common.FormStyleLayout; import org.drools.guvnor.client.common.FormStylePopup; import org.drools.guvnor.client.common.GenericCallback; import org.drools.guvnor.client.common.ImageButton; import org.drools.guvnor.client.common.RulePackageSelector; import org.drools.guvnor.client.common.SmallLabel; import org.drools.guvnor.client.messages.Constants; import org.drools.guvnor.client.resources.Images; import org.drools.guvnor.client.rpc.MetaData; import org.drools.guvnor.client.rpc.RepositoryServiceFactory; import org.drools.guvnor.client.security.Capabilities; import org.drools.guvnor.client.security.CapabilitiesManager; import org.drools.guvnor.client.util.DecoratedDisclosurePanel; import org.drools.guvnor.client.util.Format; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * This displays the metadata for a versionable asset. * It also captures edits, but it does not load or save anything itself. * @author Michael Neale */ public class MetaDataWidget extends Composite { private Constants constants = GWT.create( Constants.class ); private static Images images = GWT.create( Images.class ); private MetaData data; private boolean readOnly; private String uuid; private Command metaDataRefreshView; private Command fullRefreshView; private VerticalPanel layout = new VerticalPanel(); AssetCategoryEditor ed; private FormStyleLayout currentSection; private String currentSectionName; public MetaDataWidget(final MetaData d, final boolean readOnly, final String uuid, final Command metaDataRefreshView, final Command fullRefreshView) { super(); this.uuid = uuid; this.data = d; this.readOnly = readOnly; this.metaDataRefreshView = metaDataRefreshView; this.fullRefreshView = fullRefreshView; Button show = new Button( constants.showMoreInfo() ); show.addClickHandler( new ClickHandler() { public void onClick(ClickEvent sender) { layout.clear(); render(); } } ); layout.add( new SmallLabel( Format.format( "{0}: [<b>{1}</b>]", constants.Title(), d.name ) ) ); layout.add( show ); initWidget( layout ); } private void render() { if ( !readOnly ) { Image edit = new ImageButton( images.edit(), constants.RenameThisAsset() ); edit.addClickHandler( new ClickHandler() { public void onClick(ClickEvent w) { showRenameAsset( w ); } } ); addHeader( images.metadata(), data.name, edit ); } else { addHeader( images.assetVersion(), data.name, null ); } loadData(); } private void addHeader(ImageResource img, String name, Image edit) { startSection( name ); HorizontalPanel hp = new HorizontalPanel(); hp.add( new SmallLabel( "<b>" + name + "</b>" ) ); if ( edit != null ) hp.add( edit ); currentSection.addAttribute( constants.Title(), hp ); } private void loadData() { addAttribute( constants.CategoriesMetaData(), categories() ); addAttribute( constants.ModifiedOnMetaData(), readOnlyDate( data.lastModifiedDate ) ); addAttribute( constants.ModifiedByMetaData(), readOnlyText( data.lastContributor ) ); addAttribute( constants.NoteMetaData(), readOnlyText( data.checkinComment ) ); if ( !readOnly ) { addAttribute( constants.CreatedOnMetaData(), readOnlyDate( data.createdDate ) ); } addAttribute( constants.CreatedByMetaData(), readOnlyText( data.creator ) ); addAttribute( constants.FormatMetaData(), new SmallLabel( "<b>" + data.format + "</b>" ) ); addAttribute( constants.PackageMetaData(), packageEditor( data.packageName ) ); addAttribute( constants.IsDisabledMetaData(), editableBoolean( new FieldBooleanBinding() { public boolean getValue() { return data.disabled; } public void setValue(boolean val) { data.disabled = val; } }, constants.DisableTip() ) ); addAttribute( "UUID:", readOnlyText( uuid ) ); endSection(); startSection( constants.OtherMetaData() ); addAttribute( constants.SubjectMetaData(), editableText( new FieldBinding() { public String getValue() { return data.subject; } public void setValue(String val) { data.subject = val; } }, constants.AShortDescriptionOfTheSubjectMatter() ) ); addAttribute( constants.TypeMetaData(), editableText( new FieldBinding() { public String getValue() { return data.type; } public void setValue(String val) { data.type = val; } }, constants.TypeTip() ) ); addAttribute( constants.ExternalLinkMetaData(), editableText( new FieldBinding() { public String getValue() { return data.externalRelation; } public void setValue(String val) { data.externalRelation = val; } }, constants.ExternalLinkTip() ) ); addAttribute( constants.SourceMetaData(), editableText( new FieldBinding() { public String getValue() { return data.externalSource; } public void setValue(String val) { data.externalSource = val; } }, constants.SourceMetaDataTip() ) ); endSection( true ); startSection( constants.VersionHistory() ); addAttribute( constants.CurrentVersionNumber(), getVersionNumberLabel() ); if ( !readOnly ) { addRow( new VersionBrowser( this.uuid, this.data, fullRefreshView ) ); } endSection( true ); } private void addRow(VersionBrowser versionBrowser) { this.currentSection.addRow( versionBrowser ); } private void addAttribute(String string, Widget editable) { this.currentSection.addAttribute( string, editable ); } private void endSection() { endSection( false ); } private void endSection(boolean collapsed) { DecoratedDisclosurePanel advancedDisclosure = new DecoratedDisclosurePanel( currentSectionName ); advancedDisclosure.setWidth( "100%" ); advancedDisclosure.setOpen( collapsed ); advancedDisclosure.setContent( this.currentSection ); layout.add( advancedDisclosure ); } private void startSection(String name) { currentSection = new FormStyleLayout(); currentSectionName = name; } private Widget packageEditor(final String packageName) { if ( this.readOnly || !CapabilitiesManager.getInstance().shouldShow( Capabilities.SHOW_PACKAGE_VIEW ) ) { return readOnlyText( packageName ); } else { HorizontalPanel horiz = new HorizontalPanel(); horiz.setStyleName( "metadata-Widget" ); //NON-NLS horiz.add( readOnlyText( packageName ) ); Image editPackage = new ImageButton( images.edit() ); editPackage.addClickHandler( new ClickHandler() { public void onClick(ClickEvent w) { showEditPackage( packageName, w ); } } ); horiz.add( editPackage ); return horiz; } } private void showRenameAsset(ClickEvent source) { final FormStylePopup pop = new FormStylePopup( images.packageLarge(), constants.RenameThisItem() ); final TextBox box = new TextBox(); box.setText( data.name ); pop.addAttribute( constants.NewNameAsset(), box ); Button ok = new Button( constants.RenameItem() ); pop.addAttribute( "", ok ); ok.addClickHandler( new ClickHandler() { public void onClick(ClickEvent w) { RepositoryServiceFactory.getService().renameAsset( uuid, box.getText(), new GenericCallback<java.lang.String>() { public void onSuccess(String data) { metaDataRefreshView.execute(); Window.alert( constants.ItemHasBeenRenamed() ); pop.hide(); } } ); } } ); pop.show(); } private void showEditPackage(final String pkg, ClickEvent source) { final FormStylePopup pop = new FormStylePopup( images.packageLarge(), constants.MoveThisItemToAnotherPackage() ); pop.addAttribute( constants.CurrentPackage(), new Label( pkg ) ); final RulePackageSelector sel = new RulePackageSelector(); pop.addAttribute( constants.NewPackage(), sel ); Button ok = new Button( constants.ChangePackage() ); pop.addAttribute( "", ok ); ok.addClickHandler( new ClickHandler() { public void onClick(ClickEvent w) { if ( sel.getSelectedPackage().equals( pkg ) ) { Window.alert( constants.YouNeedToPickADifferentPackageToMoveThisTo() ); return; } RepositoryServiceFactory.getService().changeAssetPackage( uuid, sel.getSelectedPackage(), Format.format( constants.MovedFromPackage(), pkg ), new GenericCallback<java.lang.Void>() { public void onSuccess(Void v) { metaDataRefreshView.execute(); pop.hide(); } } ); } } ); pop.show(); } private Widget getVersionNumberLabel() { if ( data.versionNumber == 0 ) { return new SmallLabel( constants.NotCheckedInYet() ); } else { return readOnlyText( Long.toString( data.versionNumber ) ); } } private Widget readOnlyDate(Date lastModifiedDate) { if ( lastModifiedDate == null ) { return null; } else { return new SmallLabel( lastModifiedDate.toLocaleString() ); } } private Label readOnlyText(String text) { SmallLabel lbl = new SmallLabel( text ); lbl.setWidth( "100%" ); return lbl; } private Widget categories() { ed = new AssetCategoryEditor( this.data, this.readOnly ); return ed; } /** This binds a field, and returns a text editor for it */ private Widget editableText(final FieldBinding bind, String toolTip) { if ( !readOnly ) { final TextBox box = new TextBox(); box.setTitle( toolTip ); box.setText( bind.getValue() ); box.setVisibleLength( 10 ); ChangeHandler listener = new ChangeHandler() { public void onChange(ChangeEvent w) { bind.setValue( box.getText() ); } }; box.addChangeHandler( listener ); return box; } else { return new Label( bind.getValue() ); } } /** * This binds a field, and returns a check box editor for it. * * @param bind Interface to bind to. * @param toolTip tool tip. * @return */ private Widget editableBoolean(final FieldBooleanBinding bind, String toolTip) { if ( !readOnly ) { final CheckBox box = new CheckBox(); box.setTitle( toolTip ); box.setEnabled( bind.getValue() ); ClickHandler listener = new ClickHandler() { public void onClick(ClickEvent w) { boolean b = box.isEnabled(); bind.setValue( b ); } }; box.addClickHandler( listener ); return box; } else { final CheckBox box = new CheckBox(); box.setEnabled( bind.getValue() ); box.setEnabled( false ); return box; } } /** used to bind fields in the meta data DTO to the form */ static interface FieldBinding { void setValue(String val); String getValue(); } /** used to bind fields in the meta data DTO to the form */ static interface FieldBooleanBinding { void setValue(boolean val); boolean getValue(); } /** * Return the data if it is to be saved. */ public MetaData getData() { return data; } public void refresh() { render(); } }