/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.oodt.filemgrget; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.*; import org.pentaho.di.core.Const; import org.pentaho.di.i18n.BaseMessages; import org.pentaho.di.trans.TransMeta; import org.pentaho.di.trans.step.BaseStepMeta; import org.pentaho.di.trans.step.StepDialogInterface; import org.pentaho.di.ui.core.widget.TextVar; import org.pentaho.di.ui.trans.step.BaseStepDialog; /** * Copyright 2014 OSBI Ltd * * 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. */ public class FilemgrGetStepDialog extends BaseStepDialog implements StepDialogInterface { /** * The PKG member is used when looking up internationalized strings. * The properties file with localized keys is expected to reside in * {the package of the class specified}/messages/messages_{locale}.properties */ private static Class<?> PKG = FilemgrGetStepMeta.class; // for i18n purposes // this is the object the stores the step's settings // the dialog reads the settings from it when opening // the dialog writes the settings to it when confirmed private FilemgrGetStepMeta meta; // text field holding the name of the field to add to the row stream //private Text wHelloFieldName; // text field holding the name of the field to check the filename against private TextVar wFilenameField; private Text wServerURLField; private TextVar wResultField; private Button[] radioButtons2 = new Button[2]; private Button[] radioButtons = new Button[2]; private Search selectedsearch; private Process selectedprocess; /** * The constructor should simply invoke super() and save the incoming meta * object to a local variable, so it can conveniently read and write settings * from/to it. * * @param parent the SWT shell to open the dialog in * @param in the meta object holding the step's settings * @param transMeta transformation description * @param sname the step name */ public FilemgrGetStepDialog(Shell parent, Object in, TransMeta transMeta, String sname) { super(parent, (BaseStepMeta) in, transMeta, sname); meta = (FilemgrGetStepMeta) in; } /** * This method is called by Spoon when the user opens the settings dialog of the step. * It should open the dialog and return only once the dialog has been closed by the user. * * If the user confirms the dialog, the meta object (passed in the constructor) must * be updated to reflect the new step settings. The changed flag of the meta object must * reflect whether the step configuration was changed by the dialog. * * If the user cancels the dialog, the meta object must not be updated, and its changed flag * must remain unaltered. * * The open() method must return the name of the step after the user has confirmed the dialog, * or null if the user cancelled the dialog. */ public String open() { // store some convenient SWT variables Shell parent = getParent(); Display display = parent.getDisplay(); // SWT code for preparing the dialog shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MIN | SWT.MAX); props.setLook(shell); setShellImage(shell, meta); // Save the value of the changed flag on the meta object. If the user cancels // the dialog, it will be restored to this saved value. // The "changed" variable is inherited from BaseStepDialog changed = meta.hasChanged(); // The ModifyListener used on all controls. It will update the meta object to // indicate that changes are being made. ModifyListener lsMod = new ModifyListener() { public void modifyText(ModifyEvent e) { meta.setChanged(); } }; // ------------------------------------------------------- // // SWT code for building the actual settings dialog // // ------------------------------------------------------- // FormLayout formLayout = new FormLayout(); formLayout.marginWidth = Const.FORM_MARGIN; formLayout.marginHeight = Const.FORM_MARGIN; shell.setLayout(formLayout); shell.setText(BaseMessages.getString(PKG, "FilemgrGetStep.Name")); int middle = props.getMiddlePct(); int margin = Const.MARGIN; // Stepname line wlStepname = new Label(shell, SWT.RIGHT); wlStepname.setText(BaseMessages.getString(PKG, "System.Label.StepName")); props.setLook(wlStepname); fdlStepname = new FormData(); fdlStepname.left = new FormAttachment(0, 0); fdlStepname.right = new FormAttachment(middle, -margin); fdlStepname.top = new FormAttachment(0, margin); wlStepname.setLayoutData(fdlStepname); wStepname = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER); wStepname.setText(stepname); props.setLook(wStepname); wStepname.addModifyListener(lsMod); fdStepname = new FormData(); fdStepname.left = new FormAttachment(middle, 0); fdStepname.top = new FormAttachment(0, margin); fdStepname.right = new FormAttachment(100, 0); wStepname.setLayoutData(fdStepname); // servername field value Label wlServerName = new Label(shell, SWT.RIGHT); wlServerName.setText(BaseMessages.getString(PKG, "FilemgrGet.ServerURL.Label")); props.setLook(wlServerName); FormData fdlServerName = new FormData(); fdlServerName.left = new FormAttachment(0, 0); fdlServerName.right = new FormAttachment(middle, -margin); fdlServerName.top = new FormAttachment(wStepname, margin); wlServerName.setLayoutData(fdlServerName); wServerURLField = new Text(shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER); props.setLook(wServerURLField); wServerURLField.addModifyListener(lsMod); FormData fdServerName = new FormData(); fdServerName.left = new FormAttachment(middle, 0); fdServerName.right = new FormAttachment(100, 0); fdServerName.top = new FormAttachment(wStepname, margin); wServerURLField.setLayoutData(fdServerName); // product type Label wlValName = new Label(shell, SWT.RIGHT); wlValName.setText(BaseMessages.getString(PKG, "FilemgrGet.ProductType.Label")); props.setLook(wlValName); FormData fdlValName = new FormData(); fdlValName.left = new FormAttachment(0, 0); fdlValName.right = new FormAttachment(middle, -margin); fdlValName.top = new FormAttachment(wServerURLField, margin); wlValName.setLayoutData(fdlValName); wFilenameField = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER); props.setLook(wFilenameField); wFilenameField.addModifyListener(lsMod); FormData fdValName = new FormData(); fdValName.left = new FormAttachment(middle, 0); fdValName.right = new FormAttachment(100, 0); fdValName.top = new FormAttachment(wServerURLField, margin); wFilenameField.setLayoutData(fdValName); // processtype value Label wlProcessTypeName = new Label(shell, SWT.RIGHT); wlProcessTypeName.setText(BaseMessages.getString(PKG, "FilemgrGet.ProcessType.Label")); props.setLook(wlProcessTypeName); FormData fdlProcessTypeName = new FormData(); fdlProcessTypeName.left = new FormAttachment(0, 0); fdlProcessTypeName.right = new FormAttachment(middle, -margin); fdlProcessTypeName.top = new FormAttachment(wFilenameField, margin); wlProcessTypeName.setLayoutData(fdlProcessTypeName); Composite composite = new Composite(shell, SWT.NULL); composite.setLayout(new RowLayout()); radioButtons2[0] = new Button(composite, SWT.RADIO); radioButtons2[0].setSelection(true); radioButtons2[0].setText("List Products"); radioButtons2[0].pack(); radioButtons2[1] = new Button(composite, SWT.RADIO); radioButtons2[1].setSelection(false); radioButtons2[1].setText("Get Product"); radioButtons2[1].pack(); props.setLook(radioButtons2[0]); props.setLook(radioButtons2[1]); //wFilenameField.addModifyListener(lsMod); FormData fdProcessTypeName = new FormData(); fdProcessTypeName.left = new FormAttachment(middle, 0); fdProcessTypeName.right = new FormAttachment(100, 0); fdProcessTypeName.top = new FormAttachment(wFilenameField, margin); composite.setLayoutData(fdProcessTypeName); // search type value Label wlSearchName = new Label(shell, SWT.RIGHT); wlSearchName.setText(BaseMessages.getString(PKG, "FilemgrGet.SearchType.Label")); props.setLook(wlSearchName); FormData fdlSearchName = new FormData(); fdlSearchName.left = new FormAttachment(0, 0); fdlSearchName.right = new FormAttachment(middle, -margin); fdlSearchName.top = new FormAttachment(composite, margin); wlSearchName.setLayoutData(fdlSearchName); Composite composite1 = new Composite(shell, SWT.NULL); composite1.setLayout(new RowLayout()); radioButtons[0] = new Button(composite1, SWT.RADIO); radioButtons[0].setSelection(true); radioButtons[0].setText("Name"); radioButtons[0].pack(); radioButtons[1] = new Button(composite1, SWT.RADIO); radioButtons[1].setSelection(false); radioButtons[1].setText("ID"); radioButtons[1].pack(); props.setLook(radioButtons[0]); props.setLook(radioButtons[1]); radioButtons[0].addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { selectedsearch = Search.NAME; } }); radioButtons[1].addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { selectedsearch = Search.ID; } }); FormData fdSearchName = new FormData(); fdSearchName.left = new FormAttachment(middle, 0); fdSearchName.right = new FormAttachment(100, 0); fdSearchName.top = new FormAttachment(composite, margin); composite1.setLayoutData(fdSearchName); if(meta.getProcessType()==Process.LIST){ radioButtons[0].setEnabled(false); radioButtons[1].setEnabled(false); } // servername field value Label wlResultName = new Label(shell, SWT.RIGHT); wlResultName.setText(BaseMessages.getString(PKG, "FilemgrGet.Result.Label")); props.setLook(wlResultName); FormData fdlResultName = new FormData(); fdlResultName.left = new FormAttachment(0, 0); fdlResultName.right = new FormAttachment(middle, -margin); fdlResultName.top = new FormAttachment(composite1, margin); wlResultName.setLayoutData(fdlResultName); wResultField = new TextVar(transMeta, shell, SWT.SINGLE | SWT.LEFT | SWT.BORDER); props.setLook(wResultField); wResultField.addModifyListener(lsMod); FormData fdResultName = new FormData(); fdResultName.left = new FormAttachment(middle, 0); fdResultName.right = new FormAttachment(100, 0); fdResultName.top = new FormAttachment(composite1, margin); wResultField.setLayoutData(fdResultName); wResultField.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { wResultField.setToolTipText(transMeta.environmentSubstitute(wResultField.getText())); } }); if(meta.getProcessType()==Process.LIST){ wResultField.setEnabled(false); } // OK and cancel buttons wOK = new Button(shell, SWT.PUSH); wOK.setText(BaseMessages.getString(PKG, "System.Button.OK")); wCancel = new Button(shell, SWT.PUSH); wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel")); BaseStepDialog.positionBottomButtons(shell, new Button[] { wOK, wCancel }, margin, wResultField); // Add listeners for cancel and OK lsCancel = new Listener() { public void handleEvent(Event e) {cancel();} }; lsOK = new Listener() { public void handleEvent(Event e) {ok();} }; wCancel.addListener(SWT.Selection, lsCancel); wOK.addListener(SWT.Selection, lsOK); /** * Radio button listeners */ radioButtons2[0].addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { selectedprocess = Process.LIST; wResultField.setEnabled(false); radioButtons[0].setEnabled(false); radioButtons[1].setEnabled(false); } }); radioButtons2[1].addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { selectedprocess = Process.GET; radioButtons[0].setEnabled(true); radioButtons[1].setEnabled(true); wResultField.setEnabled(true); } }); // default listener (for hitting "enter") lsDef = new SelectionAdapter() { public void widgetDefaultSelected(SelectionEvent e) {ok();} }; wStepname.addSelectionListener(lsDef); wFilenameField.addSelectionListener(lsDef); wServerURLField.addSelectionListener(lsDef); wResultField.addSelectionListener(lsDef); // Detect X or ALT-F4 or something that kills this window and cancel the dialog properly shell.addShellListener(new ShellAdapter() { public void shellClosed(ShellEvent e) {cancel();} }); // Set/Restore the dialog size based on last position on screen // The setSize() method is inherited from BaseStepDialog setSize(); // populate the dialog with the values from the meta object populateDialog(); // restore the changed flag to original value, as the modify listeners fire during dialog population meta.setChanged(changed); // open dialog and enter event loop shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } // at this point the dialog has closed, so either ok() or cancel() have been executed // The "stepname" variable is inherited from BaseStepDialog return stepname; } /** * This helper method puts the step configuration stored in the meta object * and puts it into the dialog controls. */ private void populateDialog() { wStepname.selectAll(); wFilenameField.setText(meta.getProductTypeField()); wServerURLField.setText(meta.getServerURLField()); wResultField.setText(meta.getResultField()); if(meta.getSearchType() == Search.NAME){ radioButtons[0].setSelection(true); radioButtons[1].setSelection(false); selectedsearch = Search.NAME; } else{ radioButtons[1].setSelection(true); radioButtons[0].setSelection(false); selectedsearch = Search.ID; } if(meta.getProcessType() == Process.LIST){ radioButtons2[0].setSelection(true); radioButtons2[1].setSelection(false); selectedprocess= Process.LIST; } else{ radioButtons2[1].setSelection(true); radioButtons2[0].setSelection(false); selectedprocess = Process.GET; } } /** * Called when the user cancels the dialog. */ private void cancel() { // The "stepname" variable will be the return value for the open() method. // Setting to null to indicate that dialog was cancelled. stepname = null; // Restoring original "changed" flag on the met aobject meta.setChanged(changed); // close the SWT dialog window dispose(); } /** * Called when the user confirms the dialog */ private void ok() { stepname = wStepname.getText(); meta.setProductName(wFilenameField.getText()); meta.setServerURLField(wServerURLField.getText()); meta.setResultField(wResultField.getText()); meta.setProcessType(selectedprocess); meta.setSearchType(selectedsearch); // close the SWT dialog window dispose(); } }