protected Control createContents()

in PluginsAndFeatures/azure-toolkit-for-eclipse/com.microsoft.azuretools.hdinsight/src/com/microsoft/azuretools/hdinsight/spark/ui/SparkSubmissionExDialog.java [182:462]


    protected Control createContents(Composite parent) {
        final Composite root = new Composite(parent, SWT.NONE);
        root.setLayout(new GridLayout(2, false));
        root.setLayoutData(new GridDataBuilder().widthHint(600).build());

        final Label clusterListLabel = new Label(root, SWT.LEFT);
        clusterListLabel.setText("Cluster Name:");

        clustersListComboBox = new Combo(root, SWT.READ_ONLY);
        clustersListComboBox.setLayoutData(new GridDataBuilder().build());
        clustersListComboBox.setToolTipText(
                "The HDInsight Spark cluster you want to submit your application to. Only Linux cluster is supported.");
        clustersListComboBox.addModifyListener(event -> {
            IClusterDetail clusterDetail = getSelectedCluster(clustersListComboBox.getText());
            if (clusterDetail != null && ClusterManagerEx.getInstance().isHdiReaderCluster(clusterDetail)) {
                showHdiReaderErrors(true);
            } else {
                showHdiReaderErrors(false);
            }
        });

        // Execute "select the first item" operation after the dialog opened
        Display.getDefault().asyncExec(() -> {
            for (IClusterDetail clusterDetail : cachedClusterDetails) {
                clustersListComboBox.add(clusterDetail.getTitle());
                clustersListComboBox.setData(clusterDetail.getTitle(), clusterDetail);
            }
            if (cachedClusterDetails.size() > 0) {
                // Send SWT.Modify event after select the first item
                clustersListComboBox.select(0);
            }
        });

        //Add blank label as a placeholder
        final Label placeholderLabel = new Label(root, SWT.LEFT);
        placeholderLabel.setVisible(false);
        final Composite warningWithLink = new Composite(root, SWT.NONE);
        warningWithLink.setLayout(new GridLayout(2, false));
        warningWithLink.setLayoutData(new GridDataBuilder().build());

        // Add warning message and link cluster button composite
        hdiReaderErrorMsgLabel = new Label(warningWithLink, SWT.LEFT);
        hdiReaderErrorMsgLabel.setText(
                "No Ambari permission to submit job to the selected cluster...");
        hdiReaderErrorMsgLabel.setToolTipText(
                "No Ambari permission to submit job to the selected cluster. Please ask the cluster owner or user "
                + "access administrator to upgrade your role to HDInsight Cluster Operator in the Azure Portal, or "
                + "link to the selected cluster.");
        hdiReaderLink = new Link(warningWithLink, SWT.NONE);
        hdiReaderLink.setText("<a href=\" \">Link this cluster</a>");
        hdiReaderLink.addListener(SWT.Selection, e -> {
            IClusterDetail selectedClusterDetail = getSelectedCluster(clustersListComboBox.getText());
            if (selectedClusterDetail != null && ClusterManagerEx.getInstance().isHdiReaderCluster(selectedClusterDetail)) {
                String defaultStorageRootPath = ((ClusterDetail) selectedClusterDetail).getDefaultStorageRootPath();

                AddNewHDInsightReaderClusterForm linkClusterForm = new AddNewHDInsightReaderClusterForm(
                        PluginUtil.getParentShell(), null, (ClusterDetail) selectedClusterDetail) {
                    protected void afterOkActionPerformed() {
                        showHdiReaderErrors(false);
                        HDInsightAdditionalClusterDetail linkedCluster =
                                (HDInsightAdditionalClusterDetail) ClusterManagerEx.getInstance().findClusterDetail(clusterDetail ->
                                        getSelectedLinkedHdiCluster(clusterDetail, selectedClusterDetail.getName()), true);
                        if (linkedCluster != null) {
                            linkedCluster.setDefaultStorageRootPath(defaultStorageRootPath);
                            ClusterManagerEx.getInstance().updateHdiAdditionalClusterDetail(linkedCluster);

                            // Display the HDI reader cluster as linked cluster
                            Display.getDefault().asyncExec(() -> {
                                int selectedClusterIndex = clustersListComboBox.indexOf(selectedClusterDetail.getTitle());
                                clustersListComboBox.setItem(selectedClusterIndex, linkedCluster.getTitle());
                                clustersListComboBox.setData(linkedCluster.getTitle(), linkedCluster);
                            });
                        }
                    }
                };
                linkClusterForm.open();
            }
        });

        // Hide HDInsight reader cluster error when dialog open at first time
        showHdiReaderErrors(false);

        // Radio button group for the artifact selection
        final Group artifactSelectGroup = new Group(root, SWT.NONE);
        artifactSelectGroup.setText("Select an Artifact to submit");
        artifactSelectGroup.setLayout(new GridLayout(2, false));
        artifactSelectGroup.setLayoutData(new GridDataBuilder().span(2, 2).build());

        // Project artifacts Radio button
        projectArtifactRadioButton = new Button(artifactSelectGroup, SWT.RADIO);
        projectArtifactRadioButton.setText("Artifact from Eclipse project:");
        projectArtifactRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent ignored) {
                switchToProjectArtifactSelection(true);
            }
        });

        final String selectProjectArtifactTip = "The Artifact you want to use.";
        projectArtifactSelectComboBox = new Combo(artifactSelectGroup, SWT.READ_ONLY);
        projectArtifactSelectComboBox.setToolTipText(selectProjectArtifactTip);
        projectArtifactSelectComboBox.setLayoutData(new GridDataBuilder().widthHint(400).build());
        projectArtifactSelectComboBox.getAccessible().addAccessibleListener(new AccessibleAdapter() {
            public void getName(AccessibleEvent event) {
                event.result = projectArtifactRadioButton.getText();
            }
        });
        final String[] projects = getProjects();
        projectArtifactSelectComboBox.setItems(projects);
        if (myProject != null) {
            final String selectedProjectName = myProject.getName();
            for (int i = 0; i < projects.length; ++i) {
                if (projects[i].equalsIgnoreCase(selectedProjectName)) {
                    projectArtifactSelectComboBox.select(i);
                }
            }
        } else if (projects.length > 0) {
            projectArtifactSelectComboBox.select(0);
        }

        // Local artifact
        localArtifactRadioButton = new Button(artifactSelectGroup, SWT.RADIO);
        localArtifactRadioButton.setText("Artifact from hard disk:");
        localArtifactRadioButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent ignored) {
                switchToProjectArtifactSelection(false);
            }
        });

        final Composite localArtifactSelection = new Composite(artifactSelectGroup, SWT.NONE);
        localArtifactSelection.setLayout(new GridLayout(2, false));
        localArtifactSelection.setLayoutData(new GridDataBuilder().build());

        final String localArtifactInputTip = "Input the local artifact path.";
        localArtifactInput = new Text(localArtifactSelection, SWT.LEFT | SWT.BORDER);
        localArtifactInput.setToolTipText(localArtifactInputTip);
        localArtifactInput.setLayoutData(new GridDataBuilder().build());
        localArtifactInput.getAccessible().addAccessibleListener(new AccessibleAdapter() {
            public void getName(AccessibleEvent event) {
                event.result = localArtifactRadioButton.getText();
            }
        });

        // Browser button to open file selection dialog
        localArtifactBrowseButton = new Button(localArtifactSelection, SWT.PUSH);
        localArtifactBrowseButton.setText("Browse");
        localArtifactBrowseButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                FileDialog dialog = new FileDialog(SparkSubmissionExDialog.this.getShell());
                String[] extensions = { "*.jar", "*.JAR" };
                dialog.setFilterExtensions(extensions);
                String file = dialog.open();
                if (file != null) {
                    localArtifactInput.setText(file);
                }
            }
        });

        localArtifactBrowseButton.getAccessible().addAccessibleListener(new AccessibleAdapter() {
            public void getName(AccessibleEvent event) {
                event.result = "Browse. Open System File dialog to select artifact";
            }
        });

        // Default selection
        projectArtifactRadioButton.setSelection(true);
        switchToProjectArtifactSelection(true);

        // Main class input
        final Label sparkMainClassLabel = new Label(root, SWT.LEFT);
        sparkMainClassLabel.setText("Main class name");

        mainClassCombo = new Combo(root, SWT.DROP_DOWN);
        mainClassCombo.setToolTipText("Application's java/spark main class");
        mainClassCombo.setLayoutData(new GridDataBuilder().build());
        try {
            java.util.Set<String> classes = getClassesWithMainMethod();
            String [] names = new String[classes.size()];
            classes.toArray(names);
            mainClassCombo.setItems(names);
            mainClassCombo.select(0);
        } catch (CoreException e1) {
            Activator.getDefault().log("get main class list error", e1);
        }

        // Job configuration
        final Label jobConfigurationLabel = new Label(root, SWT.LEFT);
        jobConfigurationLabel.setText("Job configurations");
        jobConfigurationLabel.setLayoutData(new GridDataBuilder().verticalAlignment(TOP).build());

        jobConfigTableViewer = new TableViewer(root, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
        jobConfigTableViewer.setUseHashlookup(true);
        jobConfigTableViewer.setColumnProperties(COLUMN_NAMES);

        final Table jobConfigurationTable = jobConfigTableViewer.getTable();
        jobConfigurationTable.setHeaderVisible(true);
        jobConfigurationTable.setLinesVisible(true);

        jobConfigurationTable.setLayout(new GridLayout(1, false));
        jobConfigurationTable.setLayoutData(new GridDataBuilder().heightHint(75).build());

        final TableViewerColumn keyCol = new TableViewerColumn(jobConfigTableViewer, SWT.NONE);
        keyCol.getColumn().setText(COLUMN_NAMES[0]);
        keyCol.getColumn().setWidth(150);

        final TableViewerColumn valueCol = new TableViewerColumn(jobConfigTableViewer, SWT.NONE);
        valueCol.getColumn().setText(COLUMN_NAMES[1]);
        valueCol.getColumn().setWidth(80);

        final CellEditor[] editors = new CellEditor[] {
            new TextCellEditor(jobConfigurationTable),
            new TextCellEditor(jobConfigurationTable)
        };

        jobConfigTableViewer.setCellEditors(editors);
        jobConfigTableViewer.setContentProvider(new JobConfigurationContentProvider());
        jobConfigTableViewer.setLabelProvider(new JobConfigurationLabelProvider());
        jobConfigTableViewer.setCellModifier(new JobConfigurationCellModifier());

        jobConfigurationTable.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                if (e.keyCode == SWT.SPACE) {
                    TableItem[] selection = ((Table)e.getSource()).getSelection();
                    if (selection.length > 0) {
                        jobConfigTableViewer.editElement(selection[0].getData(), 1);
                    }
                }
            }
        });


        ColumnViewerEditorActivationStrategy activationSupport = new ColumnViewerEditorActivationStrategy(jobConfigTableViewer) {
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                // Enable editor only with mouse double click or space key press
                if (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC
                        || event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED && event.character == SWT.SPACE) {
                    EventObject source = event.sourceEvent;
                    // Take double right click as invalid mouse event
                    return !(source instanceof MouseEvent && ((MouseEvent)source).button == 3);
                }

                return false;
            }
        };

        TableViewerEditor.create(jobConfigTableViewer, activationSupport, ColumnViewerEditor.TABBING_HORIZONTAL |
            ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR |
            ColumnViewerEditor.TABBING_VERTICAL |
            ColumnViewerEditor.KEYBOARD_ACTIVATION);

        initializeTable();
        // Make the table focus at the first cell when it get focus at the first time
        jobConfigTableViewer.editElement(jobConfigurationTable.getItem(0).getData(), 0);

        final Label label = new Label(root, SWT.LEFT);
        label.setText("Command line arguments");
        final String commandLineTip = "Command line arguments used in your main class; multiple arguments should be split by space.";
        commandLineTextField = new Text(root, SWT.LEFT | SWT.BORDER);
        commandLineTextField.setToolTipText(commandLineTip);
        commandLineTextField.setLayoutData(new GridDataBuilder().build());

        final String refJarsTip = "Files to be placed on the java classpath; The path needs to be a Azure Blob Storage Path (path started with wasb://); Multiple paths should be split by semicolon (;)";
        final Label referencedJarsLabel = new Label(root, SWT.LEFT);
        referencedJarsLabel.setText("Referenced Jars");
        referencedJarsTextField = new Text(root, SWT.BORDER | SWT.LEFT);
        referencedJarsTextField.setToolTipText(refJarsTip);
        referencedJarsTextField.setLayoutData(new GridDataBuilder().build());

        final Label referencedFilesLabel = new Label(root, SWT.LEFT);
        referencedFilesLabel.setText("Referenced Files");
        final String refFilesTip = "Files to be placed in executor working directory. The path needs to be a Azure Blob Storage Path (path started with wasb://); Multiple paths should be split by semicolon (;) ";
        referencedFilesTextField = new Text(root, SWT.BORDER | SWT.LEFT);
        referencedFilesTextField.setToolTipText(refFilesTip);
        referencedFilesTextField.setLayoutData(new GridDataBuilder().build());

        return super.createContents(parent);
    }