/******************************************************************************* * Copyright (c) 2016 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.windup.ui.internal.launch; import java.io.File; import java.nio.file.Path; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.jboss.tools.windup.model.Facades.IFacade; import org.jboss.tools.windup.model.OptionFacades.OptionTypeFacade; import org.jboss.tools.windup.model.OptionFacades.OptionsFacadeManager; import org.jboss.tools.windup.model.OptionFacades.Type; import org.jboss.tools.windup.ui.internal.Messages; import org.jboss.windup.bootstrap.help.OptionDescription; /** * GUI facades for options. */ public class OptionUiFacades { public static interface OptionUiFacade extends IFacade { void createControls(Composite parent); boolean isValid(); Control getControl(); void setFocus(); OptionDescription getOptionDescription(); String getValue(); } private static abstract class AbstractOptionUiFacade<T> implements OptionUiFacade { @SuppressWarnings("unused") protected OptionTypeFacade<T> optionTypeFacade; protected OptionDescription option; protected Control control; protected Runnable optionChangedCallback; private String value = ""; // For Alpha, just a simple text field. protected Text textWidget; public AbstractOptionUiFacade(OptionTypeFacade<T> optionTypeFacade, Runnable optionChangedCallback) { this.optionTypeFacade = optionTypeFacade; this.optionChangedCallback = optionChangedCallback; this.option = optionTypeFacade.getOptionDescription(); } @Override public void createControls(Composite parent) { Composite control = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(2).applyTo(control); Label valueLabel = new Label(control, SWT.NONE); valueLabel.setText(Messages.VALUE+":"); valueLabel.setFont(parent.getFont()); GridDataFactory.fillDefaults().hint(50, SWT.DEFAULT).align(SWT.RIGHT, SWT.CENTER).applyTo(valueLabel); createInputControl(control); this.control = control; } @Override public void setFocus() { value = ""; textWidget.setText(""); textWidget.setFocus(); } protected void createInputControl(Composite parent) { textWidget = new Text(parent, SWT.BORDER | SWT.SINGLE); GridDataFactory.fillDefaults().grab(true, false).applyTo(textWidget); textWidget.setFont(parent.getFont()); textWidget.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { AbstractOptionUiFacade.this.value = textWidget.getText().trim(); optionChangedCallback.run(); } }); } @Override public boolean isValid() { return !value.isEmpty(); } public String getValue() { return value; } @Override public OptionDescription getOptionDescription() { return this.option; } @Override public Control getControl() { return this.control; } } public static class StringControlFacade extends AbstractOptionUiFacade<String> { public StringControlFacade(OptionTypeFacade<String> optionTypeFacade, Runnable optionChangedCallback) { super (optionTypeFacade, optionChangedCallback); } } public static class BooleanControlFacade extends AbstractOptionUiFacade<Boolean> { private Button button; private boolean enabled = false; public BooleanControlFacade(OptionTypeFacade<Boolean> optionTypeFacade, Runnable optionChangedCallback) { super(optionTypeFacade, optionChangedCallback); } @Override public void createControls(Composite parent) { Composite control = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(1).applyTo(control); button = new Button(control, SWT.CHECK); button.setText("Include the --" + option.getName() + " argument."); //$NON-NLS-1$ button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { BooleanControlFacade.this.enabled = button.getSelection(); } }); Text text = new Text(control, SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL|SWT.WRAP); GridDataFactory.fillDefaults().grab(true, true).applyTo(text); text.setEditable(false); text.setText(option.getDescription()); this.control = control; } @Override public boolean isValid() { return true; } @Override public String getValue() { return String.valueOf(enabled); } @Override public void setFocus() { button.setFocus(); } } public static class FileControlFacade extends AbstractOptionUiFacade<File> { public FileControlFacade(OptionTypeFacade<File> optionTypeFacade, Runnable optionChangedCallback) { super(optionTypeFacade, optionChangedCallback); } } public static class PathControlFacade extends AbstractOptionUiFacade<Path> { public PathControlFacade(OptionTypeFacade<Path> optionTypeFacade, Runnable optionChangedCallback) { super(optionTypeFacade, optionChangedCallback); } } @SuppressWarnings("unchecked") public static OptionUiFacade createOptionUiFacade(OptionDescription option, OptionsFacadeManager mgr, Runnable optionChangedCallback) { Type type = Type.valueOf(option.getType().toUpperCase()); OptionTypeFacade<?> typeFacade = mgr.getFacade(option, OptionTypeFacade.class); OptionUiFacade uiFacade = null; switch(type) { case STRING: { uiFacade = new StringControlFacade((OptionTypeFacade<String>) typeFacade, optionChangedCallback); break; } case BOOLEAN: { uiFacade = new BooleanControlFacade((OptionTypeFacade<Boolean>) typeFacade, optionChangedCallback); break; } case FILE: { uiFacade = new FileControlFacade((OptionTypeFacade<File>) typeFacade, optionChangedCallback); break; } case PATH: { uiFacade = new PathControlFacade((OptionTypeFacade<Path>) typeFacade, optionChangedCallback); break; } } return uiFacade; } }