org.chromium.debug.ui.liveedit.LiveEditResultDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.chromium.debug.ui.liveedit.LiveEditResultDialog.java

Source

// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.debug.ui.liveedit;

import java.util.ArrayList;
import java.util.List;

import org.chromium.debug.core.model.ConnectedTargetData;
import org.chromium.debug.core.model.PushChangesPlan;
import org.chromium.debug.core.util.ScriptTargetMapping;
import org.chromium.debug.ui.TableUtils;
import org.chromium.debug.ui.TableUtils.ColumnBasedLabelProvider;
import org.chromium.debug.ui.TableUtils.ColumnData;
import org.chromium.debug.ui.TableUtils.TrivialAdapter;
import org.chromium.debug.ui.TableUtils.ValueAdapter;
import org.chromium.debug.ui.actions.ChooseVmControl;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

/**
 * A dialog that shows LiveEdit update results.
 */
public class LiveEditResultDialog extends Dialog {

    /**
     * A dialog input. It's essentially an algebraic type, all cases are available
     * via {@link #accept(InputVisitor)} method.
     */
    public interface Input {
        <RES> RES accept(InputVisitor<RES> visitor);
    }

    /**
     * A specialized type of dialog input: one that associated with a particular VM.
     */
    public interface SingleInput extends Input {
        <RES> RES acceptSingle(SingleInputVisitor<RES> visitor);

        ScriptTargetMapping getFilePair();
    }

    public interface InputVisitor<RES> extends SingleInputVisitor<RES> {
        RES visitMultipleResult(MultipleResult multipleResult);
    }

    public interface SingleInputVisitor<RES> {
        RES visitSuccess(SuccessResult successResult);

        RES visitErrorMessage(String text);
    }

    public interface MultipleResult {
        List<? extends SingleInput> getList();
    }

    public interface SuccessResult {
        boolean hasDroppedFrames();

        /** @return may be null */
        OldScriptData getOldScriptData();
    }

    public interface OldScriptData {
        LiveEditDiffViewer.Input getScriptStructure();

        String getOldScriptName();
    }

    public static SingleInput createTextInput(final String text, final PushChangesPlan changesPlan) {
        return new LiveEditResultDialog.SingleInput() {
            public <RES> RES accept(LiveEditResultDialog.InputVisitor<RES> visitor) {
                return acceptSingle(visitor);
            }

            public <RES> RES acceptSingle(LiveEditResultDialog.SingleInputVisitor<RES> visitor) {
                return visitor.visitErrorMessage(text);
            }

            public ScriptTargetMapping getFilePair() {
                return changesPlan.getScriptTargetMapping();
            }
        };
    }

    private final Input input;

    public LiveEditResultDialog(Shell shell, Input input) {
        super(shell);
        this.input = input;
    }

    @Override
    protected boolean isResizable() {
        return true;
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText(Messages.LiveEditResultDialog_TITLE);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        // create only OK button
        createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        final Composite composite = (Composite) super.createDialogArea(parent);

        input.accept(new InputVisitor<Void>() {
            public Void visitErrorMessage(String text) {
                createErrorMessageControls(composite, text);
                return null;
            }

            public Void visitSuccess(SuccessResult successResult) {
                createSuccessResultControls(composite, successResult);
                return null;
            }

            public Void visitMultipleResult(MultipleResult multipleResult) {
                createMultipleResultsControl(composite, multipleResult);
                return null;
            }
        });

        return composite;
    }

    private void createErrorMessageControls(Composite parent, String text) {
        Text textControl = new Text(parent, SWT.WRAP);
        Display display = textControl.getDisplay();
        textControl.setBackground(display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
        textControl.setText(text);
    }

    private void createSuccessResultControls(Composite parent, SuccessResult successResult) {
        Label label1 = new Label(parent, SWT.NONE);
        label1.setText(Messages.LiveEditResultDialog_SUCCESS);

        if (successResult.hasDroppedFrames()) {
            Label label2 = new Label(parent, SWT.NONE);
            label2.setText(Messages.LiveEditResultDialog_FRAMES_DROPPED);
        }

        final OldScriptData withOldScript = successResult.getOldScriptData();
        if (withOldScript != null) {
            Label new_script_label = new Label(parent, SWT.NONE);
            new_script_label.setText(Messages.LiveEditResultDialog_SCRIPT_CREATED);
            LiveEditDiffViewer.Configuration configuration = new LiveEditDiffViewer.Configuration() {
                public String getNewLabel() {
                    return Messages.LiveEditResultDialog_CURRENT_SCRIPT;
                }

                public String getOldLabel() {
                    return NLS.bind(Messages.LiveEditResultDialog_OLD_SCRIPT, withOldScript.getOldScriptName());
                }

                public boolean oldOnLeft() {
                    return false;
                }
            };

            LiveEditDiffViewer viewer = LiveEditDiffViewer.create(parent, configuration);
            viewer.setInput(withOldScript.getScriptStructure());
        }
    }

    /**
     * Result for several VMs' update is shown as a table.
     */
    private void createMultipleResultsControl(Composite parent, MultipleResult multipleResult) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(Messages.LiveEditResultDialog_SEVERAL_VMS);
        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        final Table table = new Table(parent, SWT.BORDER);
        table.setFont(parent.getFont());
        table.setLayoutData(new GridData(GridData.FILL_BOTH));

        table.setHeaderVisible(true);

        ValueAdapter<SingleInput, ConnectedTargetData> inputToTargetAdapter = new ValueAdapter<SingleInput, ConnectedTargetData>() {
            public ConnectedTargetData convert(SingleInput from) {
                return from.getFilePair().getConnectedTargetData();
            }
        };

        List<ColumnData<SingleInput, ?>> columnDataList = new ArrayList<ColumnData<SingleInput, ?>>(
                ChooseVmControl.createLaunchTargetColumns(inputToTargetAdapter));

        columnDataList.add(ColumnData.create(new TrivialAdapter<SingleInput>(), new StatusLabelProvider()));

        // Create physical columns in the table.
        for (ColumnData<?, ?> data : columnDataList) {
            data.getLabelProvider().createColumn(table);
        }

        final TableViewer tableViewer = new TableViewer(table);

        IStructuredContentProvider contentProvider = new IStructuredContentProvider() {
            public Object[] getElements(Object inputElement) {
                MultipleResult input = (MultipleResult) inputElement;
                return input.getList().toArray();
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        };

        tableViewer.setContentProvider(contentProvider);

        ColumnBasedLabelProvider<SingleInput> labelProvider = new ColumnBasedLabelProvider<SingleInput>(
                TableUtils.createCastAdapter(SingleInput.class), columnDataList);

        tableViewer.setLabelProvider(labelProvider);

        tableViewer.setInput(multipleResult);
    }

    private static class StatusLabelProvider extends TableUtils.ColumnLabelProvider<SingleInput> {
        @Override
        public Image getColumnImage(SingleInput element) {
            return null;
        }

        @Override
        public String getColumnText(SingleInput element) {
            return element.acceptSingle(textGetterVisitor);
        }

        @Override
        public TableColumn createColumn(Table table) {
            TableColumn statusCol = new TableColumn(table, SWT.NONE);
            statusCol.setText(Messages.LiveEditResultDialog_STATUS);
            statusCol.setWidth(200);
            return statusCol;
        }

        private final SingleInputVisitor<String> textGetterVisitor = new SingleInputVisitor<String>() {
            public String visitErrorMessage(String text) {
                return NLS.bind(Messages.LiveEditResultDialog_FAILURE, text);
            }

            public String visitSuccess(SuccessResult successResult) {
                return Messages.LiveEditResultDialog_OK;
            }
        };
    }
}