/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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.kie.workbench.common.widgets.metadata.client;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.IsWidget;
import org.guvnor.common.services.project.context.ProjectContext;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.guvnor.common.services.shared.metadata.model.Overview;
import org.guvnor.structure.repositories.RepositoryRemovedEvent;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.kie.workbench.common.widgets.client.callbacks.CommandBuilder;
import org.kie.workbench.common.widgets.client.callbacks.CommandDrivenErrorCallback;
import org.kie.workbench.common.widgets.client.menu.FileMenuBuilder;
import org.kie.workbench.common.widgets.client.source.ViewDRLSourceWidget;
import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter;
import org.uberfire.backend.vfs.ObservablePath;
import org.uberfire.client.workbench.type.ClientResourceType;
import org.uberfire.client.workbench.widgets.multipage.Page;
import org.uberfire.ext.editor.commons.client.BaseEditor;
import org.uberfire.ext.editor.commons.client.file.popups.CopyPopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.DeletePopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.RenamePopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter;
import org.uberfire.ext.editor.commons.client.menu.MenuItems;
import org.uberfire.mvp.Command;
import org.uberfire.mvp.ParameterizedCommand;
import org.uberfire.mvp.PlaceRequest;
import org.uberfire.workbench.model.menu.MenuItem;
import org.uberfire.workbench.model.menu.Menus;
public abstract class KieEditor
extends BaseEditor
implements KieEditorWrapperView.KieEditorWrapperPresenter {
protected Menus menus;
@Inject
protected KieEditorWrapperView kieView;
@Inject
protected OverviewWidgetPresenter overviewWidget;
@Inject
protected FileMenuBuilder menuBuilder;
@Inject
protected ProjectContext workbenchContext;
@Inject
protected SavePopUpPresenter savePopUpPresenter;
@Inject
protected DeletePopUpPresenter deletePopUpPresenter;
@Inject
protected RenamePopUpPresenter renamePopUpPresenter;
@Inject
protected CopyPopUpPresenter copyPopUpPresenter;
protected Metadata metadata;
private ViewDRLSourceWidget sourceWidget;
//The default implementation delegates to the HashCode comparison in BaseEditor
private final MayCloseHandler DEFAULT_MAY_CLOSE_HANDLER = new MayCloseHandler() {
@Override
public boolean mayClose( final Object object ) {
if ( object != null ) {
return KieEditor.this.mayClose( object.hashCode() );
} else {
return true;
}
}
};
//This implementation always permits closure as something went wrong loading the Editor's content
private final MayCloseHandler EXCEPTION_MAY_CLOSE_HANDLER = new MayCloseHandler() {
@Override
public boolean mayClose( final Object object ) {
return true;
}
};
private MayCloseHandler mayCloseHandler = DEFAULT_MAY_CLOSE_HANDLER;
protected KieEditor() {
}
protected KieEditor( final KieEditorView baseView ) {
super( baseView );
}
protected void init( final ObservablePath path,
final PlaceRequest place,
final ClientResourceType type ) {
this.init( path,
place,
type,
true );
}
protected void init( final ObservablePath path,
final PlaceRequest place,
final ClientResourceType type,
final boolean addFileChangeListeners ) {
this.init( path,
place,
type,
addFileChangeListeners,
true );
}
@Override
protected void init( final ObservablePath path,
final PlaceRequest place,
final ClientResourceType type,
final MenuItems... menuItems ) {
this.init( path, place, type, true, false, menuItems );
}
@Override
protected void init( final ObservablePath path,
final PlaceRequest place,
final ClientResourceType type,
final boolean addFileChangeListeners,
final boolean displayShowMoreVersions,
final MenuItems... menuItems ) {
kieView.setPresenter( this );
super.init( path, place, type, addFileChangeListeners, displayShowMoreVersions, menuItems );
}
protected void showVersions() {
selectOverviewTab();
overviewWidget.showVersionsTab();
}
protected void createOriginalHash( Object object ) {
if ( object != null ) {
setOriginalHash( object.hashCode() );
}
}
@Override
public void setOriginalHash( Integer originalHash ) {
super.setOriginalHash( originalHash );
overviewWidget.resetDirty();
}
public boolean mayClose( Object object ) {
return mayCloseHandler.mayClose( object );
}
protected CommandDrivenErrorCallback getNoSuchFileExceptionErrorCallback() {
return new CommandDrivenErrorCallback( baseView,
new CommandBuilder()
.addNoSuchFileException( baseView,
kieView.getMultiPage(),
menus )
.addFileSystemNotFoundException( baseView,
kieView.getMultiPage(),
menus )
.build()
) {
@Override
public boolean error( final Message message,
final Throwable throwable ) {
mayCloseHandler = EXCEPTION_MAY_CLOSE_HANDLER;
return super.error( message,
throwable );
}
};
}
protected CommandDrivenErrorCallback getCouldNotGenerateSourceErrorCallback() {
return new CommandDrivenErrorCallback( baseView,
new CommandBuilder()
.addSourceCodeGenerationFailedException( baseView,
sourceWidget )
.build()
);
}
protected void addSourcePage() {
sourceWidget = GWT.create( ViewDRLSourceWidget.class );
kieView.addSourcePage( sourceWidget );
}
protected void addPage( Page page ) {
kieView.addPage( page );
}
protected void resetEditorPages( final Overview overview ) {
this.overviewWidget.setContent( overview, versionRecordManager.getPathToLatest() );
this.metadata = overview.getMetadata();
kieView.clear();
kieView.addMainEditorPage( baseView );
kieView.addOverviewPage( overviewWidget,
new com.google.gwt.user.client.Command() {
@Override
public void execute() {
overviewWidget.refresh( versionRecordManager.getVersion() );
}
} );
}
protected void OnClose() {
kieView.clear();
}
protected void addImportsTab( IsWidget importsWidget ) {
kieView.addImportsTab( importsWidget );
}
/**
* If you want to customize the menu override this method.
*/
protected void makeMenuBar() {
menus = menuBuilder
.addSave( versionRecordManager.newSaveMenuItem( new Command() {
@Override
public void execute() {
onSave();
}
} ) )
.addCopy( versionRecordManager.getCurrentPath(),
fileNameValidator )
.addRename( versionRecordManager.getPathToLatest(),
fileNameValidator )
.addDelete( versionRecordManager.getPathToLatest() )
.addValidate( onValidate() )
.addNewTopLevelMenu( versionRecordManager.buildMenu() )
.build();
}
protected boolean isEditorTabSelected() {
return kieView.isEditorTabSelected();
}
protected boolean isOverviewTabSelected() {
return kieView.isOverviewTabSelected();
}
protected int getSelectedTabIndex() {
return kieView.getSelectedTabIndex();
}
public void setSelectedTab( int index ) {
kieView.setSelectedTab( index );
}
protected void selectOverviewTab() {
kieView.selectOverviewTab();
}
protected void selectEditorTab() {
kieView.selectEditorTab();
}
protected void updateSource( String source ) {
sourceWidget.setContent( source );
}
public IsWidget getWidget() {
return kieView.asWidget();
}
public void onRepositoryRemoved( final @Observes RepositoryRemovedEvent event ) {
if ( event.getRepository() == null ) {
return;
}
if ( workbenchContext == null ) {
return;
}
if ( workbenchContext.getActiveRepository() == null ) {
return;
}
if ( workbenchContext.getActiveRepository().equals( event.getRepository() ) ) {
for ( MenuItem mi : menus.getItemsMap().values() ) {
mi.setEnabled( false );
}
}
}
@Override
public boolean mayClose( Integer currentHash ) {
if ( this.isDirty( currentHash ) || overviewWidget.isDirty() ) {
return this.baseView.confirmClose();
} else {
return true;
}
}
@Override
protected void save() {
savePopUpPresenter.show( versionRecordManager.getCurrentPath(),
new ParameterizedCommand<String>() {
@Override
public void execute( final String commitMessage ) {
baseView.showSaving();
save( commitMessage );
concurrentUpdateSessionInfo = null;
}
} );
concurrentUpdateSessionInfo = null;
}
protected void save( final String commitMessage ) {
}
public void onOverviewSelected() {
}
public void onSourceTabSelected() {
}
/**
* Overwrite this if you want to do something special when the editor tab is selected.
*/
public void onEditTabSelected() {
}
public void onEditTabUnselected() {
}
//Handler for MayClose requests
private interface MayCloseHandler {
boolean mayClose( final Object object );
}
}