/*
* Copyright 2012 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.screens.projecteditor.client.editor;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
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.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import org.guvnor.common.services.project.client.ArtifactIdChangeHandler;
import org.guvnor.common.services.project.client.GroupIdChangeHandler;
import org.guvnor.common.services.project.client.POMEditorPanel;
import org.guvnor.common.services.project.client.VersionChangeHandler;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.common.services.project.model.ProjectImports;
import org.guvnor.common.services.project.model.ProjectRepositories;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.gwtbootstrap3.client.ui.AnchorListItem;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.ButtonGroup;
import org.gwtbootstrap3.client.ui.Container;
import org.gwtbootstrap3.client.ui.DropDownHeader;
import org.gwtbootstrap3.client.ui.DropDownMenu;
import org.gwtbootstrap3.client.ui.constants.ButtonSize;
import org.gwtbootstrap3.client.ui.constants.ButtonType;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.gwtbootstrap3.client.ui.constants.Toggle;
import org.kie.workbench.common.screens.projecteditor.client.forms.KModuleEditorPanel;
import org.kie.workbench.common.screens.projecteditor.client.forms.dependencies.DependencyGrid;
import org.kie.workbench.common.screens.projecteditor.client.forms.repositories.RepositoriesWidgetPresenter;
import org.kie.workbench.common.screens.projecteditor.client.resources.ProjectEditorResources;
import org.kie.workbench.common.services.shared.kmodule.KModuleModel;
import org.kie.workbench.common.services.shared.whitelist.WhiteList;
import org.kie.workbench.common.widgets.client.resources.i18n.CommonConstants;
import org.kie.workbench.common.widgets.client.widget.InfoWidget;
import org.kie.workbench.common.widgets.configresource.client.widget.unbound.ImportsWidgetPresenter;
import org.kie.workbench.common.widgets.metadata.client.widget.MetadataWidget;
import org.uberfire.ext.widgets.common.client.common.BusyIndicatorView;
import org.uberfire.ext.widgets.common.client.common.BusyPopup;
import org.uberfire.ext.widgets.common.client.common.popups.YesNoCancelPopup;
import org.uberfire.ext.widgets.common.client.common.popups.errors.ErrorPopup;
@Dependent
public class ProjectScreenViewImpl
extends Composite
implements ProjectScreenView {
private static final int GAV_PANEL_INDEX = 0;
private static final int DEPENDENCY_PANEL_INDEX = 1;
private static final int GAV_METADATA_PANEL_INDEX = 2;
private static final int KBASE_PANEL_INDEX = 3;
private static final int KBASE_METADATA_PANEL_INDEX = 4;
private static final int IMPORTS_PANEL_INDEX = 5;
private static final int IMPORTS_METADATA_PANEL_INDEX = 6;
private static final int REPOSITORIES_PANEL_INDEX = 7;
private static ProjectScreenViewImplBinder uiBinder = GWT.create(ProjectScreenViewImplBinder.class);
interface ProjectScreenViewImplBinder
extends
UiBinder<Widget, ProjectScreenViewImpl> {
}
@UiField
Button dropDownButton;
@UiField
DeckPanel deckPanel;
@UiField
DropDownHeader deploymentsHeader;
@UiField
AnchorListItem deploymentDescriptorButton;
@UiField
DropDownHeader persistenceSettingsHeader;
@UiField
AnchorListItem persistenceDescriptorButton;
@UiField
DropDownHeader repositoriesHeader;
@UiField
AnchorListItem repositoriesButton;
@UiField
Container container;
@Inject
BusyIndicatorView busyIndicatorView;
private POMEditorPanel pomEditorPanel;
private MetadataWidget pomMetadataWidget;
private Presenter presenter;
private KModuleEditorPanel kModuleEditorPanel;
private MetadataWidget kModuleMetaDataPanel;
private ImportsWidgetPresenter importsWidgetPresenter;
private MetadataWidget importsPageMetadata;
private RepositoriesWidgetPresenter repositoriesWidgetPresenter;
private DependencyGrid dependencyGrid;
private Boolean isGAVCheckDisabled = Boolean.FALSE;
private Widget projectScreen;
private SimplePanel layout;
public ProjectScreenViewImpl() {
}
@Inject
public ProjectScreenViewImpl(final POMEditorPanel pomEditorPanel,
final KModuleEditorPanel kModuleEditorPanel,
final ImportsWidgetPresenter importsWidgetPresenter,
final RepositoriesWidgetPresenter repositoriesWidgetPresenter,
final DependencyGrid dependencyGrid,
final MetadataWidget pomMetadataWidget,
final MetadataWidget kModuleMetaDataPanel,
final MetadataWidget importsPageMetadata) {
projectScreen = uiBinder.createAndBindUi(this);
layout = new SimplePanel();
layout.setWidget(projectScreen);
initWidget(this.layout);
this.pomEditorPanel = pomEditorPanel;
this.kModuleEditorPanel = kModuleEditorPanel;
this.importsWidgetPresenter = importsWidgetPresenter;
this.repositoriesWidgetPresenter = repositoriesWidgetPresenter;
this.dependencyGrid = dependencyGrid;
deckPanel.add(pomEditorPanel);
deckPanel.add(dependencyGrid);
this.pomMetadataWidget = pomMetadataWidget;
deckPanel.add(pomMetadataWidget);
deckPanel.add(kModuleEditorPanel);
this.kModuleMetaDataPanel = kModuleMetaDataPanel;
deckPanel.add(kModuleMetaDataPanel);
deckPanel.add(importsWidgetPresenter);
this.importsPageMetadata = importsPageMetadata;
deckPanel.add(importsPageMetadata);
deckPanel.add(repositoriesWidgetPresenter);
addPOMEditorChangeHandlers();
}
public void setPresenter(Presenter presenter) {
this.presenter = presenter;
}
@Override
public void showGAVPanel() {
deckPanel.showWidget(GAV_PANEL_INDEX);
setGAVDropboxTitle(ProjectEditorResources.CONSTANTS.ProjectGeneralSettings());
}
@Override
public void showGAVMetadataPanel() {
deckPanel.showWidget(GAV_METADATA_PANEL_INDEX);
setGAVDropboxTitle(ProjectEditorResources.CONSTANTS.Metadata());
}
@UiHandler(value = "generalSettingsButton")
public void onGeneralSettingsButtonClick(ClickEvent clickEvent) {
presenter.onGAVPanelSelected();
}
@UiHandler(value = "gavMetadataButton")
public void onGAVMetadataButtonClick(ClickEvent clickEvent) {
presenter.onGAVMetadataPanelSelected();
}
@UiHandler(value = "projectPreferencesButton")
public void onProjectPreferencesClick(ClickEvent clickEvent) {
presenter.onProjectPreferencesSelected();
}
private void setGAVDropboxTitle(String subItem) {
dropDownButton.setText(ProjectEditorResources.CONSTANTS.ProjectSettings() + ": " + subItem);
}
@UiHandler(value = "dependenciesButton")
public void onDependenciesButtonClick(ClickEvent clickEvent) {
presenter.onDependenciesSelected();
}
@UiHandler(value = "kbaseButton")
public void onKbaseButtonClick(ClickEvent clickEvent) {
presenter.onKBasePanelSelected();
}
@UiHandler(value = "kbaseMetadataButton")
public void onKbaseMetadataButtonClick(ClickEvent clickEvent) {
presenter.onKBaseMetadataPanelSelected();
}
@Override
public void showKBasePanel() {
deckPanel.showWidget(KBASE_PANEL_INDEX);
dropDownButton.setText(ProjectEditorResources.CONSTANTS.KnowledgeBaseSettings() + ": " + ProjectEditorResources.CONSTANTS.KnowledgeBasesAndSessions());
kModuleEditorPanel.refresh();
}
@Override
public void showKBaseMetadataPanel() {
deckPanel.showWidget(KBASE_METADATA_PANEL_INDEX);
dropDownButton.setText(ProjectEditorResources.CONSTANTS.KnowledgeBaseSettings() + ": " + ProjectEditorResources.CONSTANTS.Metadata());
}
@UiHandler(value = "importsButton")
public void onImportsButtonClick(ClickEvent clickEvent) {
presenter.onImportsPanelSelected();
}
@UiHandler(value = "importsMetadataButton")
public void onImportsMetadataButtonClick(ClickEvent clickEvent) {
presenter.onImportsMetadataPanelSelected();
}
@UiHandler(value = "repositoriesButton")
public void onRepositoriesButtonClick(ClickEvent clickEvent) {
if (isGAVCheckDisabled) {
return;
}
presenter.onRepositoriesPanelSelected();
}
@UiHandler(value = "deploymentDescriptorButton")
public void onDeploymentDescriptorButtonClick(ClickEvent clickEvent) {
presenter.onDeploymentDescriptorSelected();
}
@UiHandler(value = "persistenceDescriptorButton")
public void onPersistenceDescriptorDescriptorButtonClick(ClickEvent clickEvent) {
presenter.onPersistenceDescriptorSelected();
}
@Override
public void setImports(ProjectImports projectImports) {
importsWidgetPresenter.setContent(projectImports,
false);
}
@Override
public void setImportsMetadata(Metadata projectImportsMetadata) {
importsPageMetadata.setContent(projectImportsMetadata,
false);
}
@Override
public void setImportsMetadataUnlockHandler(Runnable unlockHandler) {
importsPageMetadata.setForceUnlockHandler(unlockHandler);
}
@Override
public void setRepositories(ProjectRepositories repositories) {
repositoriesWidgetPresenter.setContent(repositories.getRepositories(),
false);
}
@Override
public void showDependenciesPanel() {
dropDownButton.setText(ProjectEditorResources.CONSTANTS.Dependencies() + ": " + ProjectEditorResources.CONSTANTS.DependenciesList());
deckPanel.showWidget(DEPENDENCY_PANEL_INDEX);
dependencyGrid.show();
}
@Override
public void showImportsPanel() {
dropDownButton.setText(ProjectEditorResources.CONSTANTS.Imports() + ": " + ProjectEditorResources.CONSTANTS.ExternalDataObjects());
deckPanel.showWidget(IMPORTS_PANEL_INDEX);
}
@Override
public void showImportsMetadataPanel() {
dropDownButton.setText(ProjectEditorResources.CONSTANTS.Imports() + ": " + ProjectEditorResources.CONSTANTS.Metadata());
deckPanel.showWidget(IMPORTS_METADATA_PANEL_INDEX);
}
@Override
public void showRepositoriesPanel() {
dropDownButton.setText(ProjectEditorResources.CONSTANTS.Repositories() + ": " + ProjectEditorResources.CONSTANTS.RepositoriesValidation());
deckPanel.showWidget(REPOSITORIES_PANEL_INDEX);
}
@Override
public void showBusyIndicator(final String message) {
BusyPopup.showMessage(message);
}
@Override
public void hideBusyIndicator() {
BusyPopup.close();
}
@Override
public boolean confirmClose() {
return Window.confirm(CommonConstants.INSTANCE.DiscardUnsavedData());
}
@Override
public void setPOM(POM pom) {
pomEditorPanel.setPOM(pom,
false);
}
@Override
public void setDependencies(final POM pom,
final WhiteList whiteList) {
dependencyGrid.setDependencies(pom,
whiteList);
}
@Override
public void setPomMetadata(Metadata pomMetaData) {
pomMetadataWidget.setContent(pomMetaData,
false);
}
@Override
public void setPomMetadataUnlockHandler(Runnable unlockHandler) {
pomMetadataWidget.setForceUnlockHandler(unlockHandler);
}
@Override
public void setKModule(KModuleModel kModule) {
kModuleEditorPanel.setData(kModule,
false);
}
@Override
public void setKModuleMetadata(Metadata kModuleMetaData) {
kModuleMetaDataPanel.setContent(kModuleMetaData,
false);
}
@Override
public void setKModuleMetadataUnlockHandler(Runnable unlockHandler) {
kModuleMetaDataPanel.setForceUnlockHandler(unlockHandler);
}
@Override
public void showNoProjectSelected() {
layout.clear();
InfoWidget infoWidget = new InfoWidget();
infoWidget.setText(ProjectEditorResources.CONSTANTS.NoProjectSelected());
layout.setWidget(infoWidget);
}
@Override
public void showProjectEditor() {
layout.clear();
layout.setWidget(projectScreen);
}
@Override
public void switchBusyIndicator(String newMessage) {
BusyPopup.showMessage(newMessage);
}
@Override
public void showABuildIsAlreadyRunning() {
ErrorPopup.showMessage(ProjectEditorResources.CONSTANTS.ABuildIsAlreadyRunning());
}
@Override
public ButtonGroup getBuildButtons() {
return new ButtonGroup() {{
add(new Button(ProjectEditorResources.CONSTANTS.Build()) {{
setSize(ButtonSize.SMALL);
setDataToggle(Toggle.DROPDOWN);
}});
add(new DropDownMenu() {{
addStyleName("pull-right");
add(new AnchorListItem(ProjectEditorResources.CONSTANTS.Compile()) {{
addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
presenter.triggerBuild();
}
});
}});
add(new AnchorListItem(ProjectEditorResources.CONSTANTS.BuildAndDeploy()) {{
addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
presenter.triggerBuildAndDeploy();
}
});
}});
}});
}};
}
@Override
public void setDeploymentDescriptorEnabled(final Boolean enabled) {
deploymentDescriptorButton.setVisible(enabled);
deploymentsHeader.setVisible(enabled);
}
@Override
public void setGAVCheckDisabledSetting(Boolean disabled) {
this.isGAVCheckDisabled = disabled;
if (disabled != null) {
repositoriesHeader.setVisible(!disabled.booleanValue());
repositoriesButton.setVisible(!disabled.booleanValue());
}
}
private void addPOMEditorChangeHandlers() {
this.pomEditorPanel.addGroupIdChangeHandler(new GroupIdChangeHandler() {
@Override
public void onChange(String newGroupId) {
presenter.validateGroupID(newGroupId);
}
});
this.pomEditorPanel.addArtifactIdChangeHandler(new ArtifactIdChangeHandler() {
@Override
public void onChange(String newArtifactId) {
presenter.validateArtifactID(newArtifactId);
}
});
this.pomEditorPanel.addVersionChangeHandler(new VersionChangeHandler() {
@Override
public void onChange(String newVersion) {
presenter.validateVersion(newVersion);
}
});
}
@Override
public void setValidGroupID(final boolean isValid) {
pomEditorPanel.setValidGroupID(isValid);
}
@Override
public void setValidArtifactID(final boolean isValid) {
pomEditorPanel.setValidArtifactID(isValid);
}
@Override
public void setValidVersion(final boolean isValid) {
pomEditorPanel.setValidVersion(isValid);
}
@Override
public Widget getPomPart() {
return pomEditorPanel.asWidget();
}
@Override
public Widget getPomMetadataPart() {
return pomMetadataWidget;
}
@Override
public Widget getKModulePart() {
return kModuleEditorPanel.asWidget();
}
@Override
public Widget getKModuleMetadataPart() {
return kModuleMetaDataPanel;
}
@Override
public Widget getDependenciesPart() {
return dependencyGrid.asWidget();
}
@Override
public Widget getImportsPart() {
return importsWidgetPresenter.asWidget();
}
@Override
public Widget getImportsMetadataPart() {
return importsPageMetadata;
}
@Override
public Widget getRepositoriesPart() {
return repositoriesWidgetPresenter.asWidget();
}
@Override
public boolean showsImportsPanel() {
return IMPORTS_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsImportsMetadataPanel() {
return IMPORTS_METADATA_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsRepositoriesPanel() {
return REPOSITORIES_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsDependenciesPanel() {
return DEPENDENCY_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsGAVMetadataPanel() {
return GAV_METADATA_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsGAVPanel() {
return GAV_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsKBasePanel() {
return KBASE_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public boolean showsKBaseMetadataPanel() {
return KBASE_METADATA_PANEL_INDEX == deckPanel.getVisibleWidget();
}
@Override
public void showUnexpectedErrorPopup(String error) {
ErrorPopup.showMessage("Unexpected error encountered : " + error);
}
@Override
public void showSaveBeforeContinue(org.uberfire.mvp.Command yesCommand,
org.uberfire.mvp.Command noCommand,
org.uberfire.mvp.Command cancelCommand) {
YesNoCancelPopup popup = YesNoCancelPopup.newYesNoCancelPopup(
org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants.INSTANCE.Information(),
ProjectEditorResources.CONSTANTS.SaveBeforeBuildAndDeploy(),
yesCommand,
org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants.INSTANCE.YES(),
ButtonType.PRIMARY,
IconType.SAVE,
noCommand,
org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants.INSTANCE.NO(),
ButtonType.DANGER,
IconType.WARNING,
cancelCommand,
org.uberfire.ext.widgets.common.client.resources.i18n.CommonConstants.INSTANCE.Cancel(),
ButtonType.DEFAULT,
null
);
popup.setClosable(false);
popup.show();
}
}