/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * 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 Lesser General Public License for more details. * * Copyright (c) 2002-2016 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.dialogs.scheduling; import org.pentaho.gwt.widgets.client.dialogs.IDialogCallback; import org.pentaho.gwt.widgets.client.dialogs.IDialogValidatorCallback; import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox; import org.pentaho.gwt.widgets.client.dialogs.PromptDialogBox; import org.pentaho.gwt.widgets.client.utils.NameUtils; import org.pentaho.gwt.widgets.client.utils.string.StringUtils; import org.pentaho.mantle.client.dialogs.folderchooser.SelectFolderDialog; import org.pentaho.mantle.client.messages.Messages; import com.google.gwt.dom.client.Style.VerticalAlign; 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.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; public abstract class ScheduleOutputLocationDialog extends PromptDialogBox { private String filePath; private TextBox scheduleNameTextBox = new TextBox(); private Label scheduleNameLabel; private static TextBox scheduleLocationTextBox = new TextBox(); private static HandlerRegistration changeHandlerReg = null; private static HandlerRegistration keyHandlerReg = null; static { scheduleLocationTextBox.setText( getDefaultSaveLocation() ); } private static native String getDefaultSaveLocation() /*-{ return window.top.HOME_FOLDER; }-*/; public ScheduleOutputLocationDialog( final String filePath ) { super( Messages.getString( "runInBackground" ), Messages.getString( "nextStep" ), Messages.getString( "cancel" ), false, true ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ this.filePath = filePath; createUI(); setupCallbacks(); } private void createUI() { VerticalPanel content = new VerticalPanel(); HorizontalPanel scheduleNameLabelPanel = new HorizontalPanel(); scheduleNameLabel = new Label( Messages.getString( "scheduleNameColon" ) ); scheduleNameLabel.setHorizontalAlignment( HasHorizontalAlignment.ALIGN_LEFT ); Label scheduleNameInfoLabel = new Label( Messages.getString( "scheduleNameInfo" ) ); scheduleNameInfoLabel.setStyleName( "msg-Label" ); scheduleNameLabelPanel.add( scheduleNameLabel ); scheduleNameLabelPanel.add( scheduleNameInfoLabel ); String defaultName = filePath.substring( filePath.lastIndexOf( "/" ) + 1, filePath.lastIndexOf( "." ) ); scheduleNameTextBox.getElement().setId( "schedule-name-input" ); scheduleNameTextBox.setText( defaultName ); content.add( scheduleNameLabelPanel ); content.add( scheduleNameTextBox ); Label scheduleLocationLabel = new Label( Messages.getString( "generatedContentLocation" ) ); scheduleLocationLabel.setStyleName( ScheduleEditor.SCHEDULE_LABEL ); content.add( scheduleLocationLabel ); Button browseButton = new Button( Messages.getString( "select" ) ); browseButton.addClickHandler( new ClickHandler() { public void onClick( ClickEvent event ) { final SelectFolderDialog selectFolder = new SelectFolderDialog(); selectFolder.setCallback( new IDialogCallback() { public void okPressed() { scheduleLocationTextBox.setText( selectFolder.getSelectedPath() ); } public void cancelPressed() { } } ); selectFolder.center(); } } ); browseButton.setStyleName( "pentaho-button" ); ChangeHandler ch = new ChangeHandler() { public void onChange( ChangeEvent event ) { updateButtonState(); } }; KeyUpHandler kh = new KeyUpHandler() { public void onKeyUp( KeyUpEvent event ) { updateButtonState(); } }; if ( keyHandlerReg != null ) { keyHandlerReg.removeHandler(); } if ( changeHandlerReg != null ) { changeHandlerReg.removeHandler(); } keyHandlerReg = scheduleNameTextBox.addKeyUpHandler( kh ); changeHandlerReg = scheduleLocationTextBox.addChangeHandler( ch ); scheduleNameTextBox.addChangeHandler( ch ); scheduleLocationTextBox.getElement().setId( "generated-content-location" ); HorizontalPanel locationPanel = new HorizontalPanel(); scheduleLocationTextBox.setEnabled( false ); locationPanel.add( scheduleLocationTextBox ); locationPanel.setCellVerticalAlignment( scheduleLocationTextBox, HasVerticalAlignment.ALIGN_MIDDLE ); locationPanel.add( browseButton ); content.add( locationPanel ); setContent( content ); content.getElement().getStyle().clearHeight(); content.getElement().getParentElement().getStyle().setVerticalAlign( VerticalAlign.TOP ); content.getParent().setHeight( "100%" ); okButton.getParent().getParent().setStyleName( "button-panel" ); updateButtonState(); setSize( "650px", "450px" ); validateScheduleLocationTextBox(); } private void setupCallbacks() { setValidatorCallback( new IDialogValidatorCallback() { @Override public boolean validate() { String name = scheduleNameTextBox.getText(); boolean isValid = NameUtils.isValidFileName( name ); if ( !isValid ) { MessageDialogBox errorDialog = new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "prohibitedNameSymbols", name, NameUtils.reservedCharListForDisplay( " " ) ), false, false, true ); //$NON-NLS-1$ //$NON-NLS-2$ errorDialog.center(); } return isValid; } } ); setCallback( new IDialogCallback() { @Override public void okPressed() { onSelect( scheduleNameTextBox.getText(), scheduleLocationTextBox.getText() ); } @Override public void cancelPressed() { } } ); } private void updateButtonState() { boolean hasLocation = !StringUtils.isEmpty( scheduleLocationTextBox.getText() ); boolean hasName = !StringUtils.isEmpty( scheduleNameTextBox.getText() ); okButton.setEnabled( hasLocation && hasName ); } private void validateScheduleLocationTextBox() { final Command errorCallback = new Command() { @Override public void execute() { scheduleLocationTextBox.setText( getDefaultSaveLocation() ); // restore default location } }; OutputLocationUtils.validateOutputLocation( scheduleLocationTextBox.getText(), null, errorCallback ); } protected abstract void onSelect( String name, String outputLocationPath ); public void setOkButtonText( String text ) { okButton.setText( text ); } public void setScheduleNameText( String text ) { scheduleNameLabel.setText( text ); } }