// Copyright (c) 2012 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.launcher; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.chromium.debug.core.model.LaunchParams; import org.chromium.debug.core.model.LaunchParams.ValueConverter; import org.chromium.debug.ui.PluginUtil; import org.chromium.debug.ui.launcher.LaunchTabGroup.Params; import org.chromium.sdk.wip.WipBackend; import org.chromium.sdk.wip.eclipse.BackendRegistry; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.jface.preference.PreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Text; class WipRemoteTab extends ChromiumRemoteTab<WipRemoteTab.WipTabElements> { private final Map<String, WipBackend> backendMap; WipRemoteTab() { super(PARAMS); backendMap = new LinkedHashMap<String, WipBackend>(); for (WipBackend b : BackendRegistry.INSTANCE.getBackends()) { backendMap.put(b.getId(), b); } } interface WipTabElements { BackendSelectorControl getBackendSelector(); ChromiumRemoteTab.TabElements getBase(); } @Override protected String getWarning(ILaunchConfiguration config) throws CoreException { String result = super.getWarning(config); if (result != null) { return result; } String backendId = config.getAttribute(LaunchParams.WIP_BACKEND_ID, (String) null); if (backendId == null) { return "Wip backend should be selected"; } if (backendMap.get(backendId) == null) { return "Unknown Wip backend id"; } return null; } @Override protected WipTabElements createDialogElements(Composite composite, final Runnable modifyListener, PreferenceStore store) { final TabElements basicElements = createBasicTabElements(composite, modifyListener, store, getParams()); final BackendSelectorControl backendSelector = new BackendSelectorControl(composite, backendMap, modifyListener); backendSelector.getMainControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); return new WipTabElements() { @Override public BackendSelectorControl getBackendSelector() { return backendSelector; } @Override public TabElements getBase() { return basicElements; } }; } @Override protected TabFieldList<? super WipTabElements, ? super Params> getTabFields() { return WIP_TAB_FIELDS; } private static final TabFieldList<? super WipTabElements, ? super Params> WIP_TAB_FIELDS; static { TabField<String, String, WipTabElements, Params> backendChooser = new TabField<String, String, WipTabElements, Params>( LaunchParams.WIP_BACKEND_ID, TypedMethods.STRING, new FieldAccess<String, WipTabElements>() { @Override void setValue(String value, WipTabElements tabElements) { tabElements.getBackendSelector().setId(value); } @Override String getValue(WipTabElements tabElements) { return tabElements.getBackendSelector().getId(); } }, new DefaultsProvider<String, Params>() { @Override String getFallbackValue() { // TODO: support default value from eclipse variables. return null; } @Override String getInitialConfigValue(Params context) { // TODO: support default value from eclipse variables. return null; } }, ValueConverter.<String>getTrivial()); List<TabFieldList<? super WipTabElements, ? super Params>> list = new ArrayList<TabFieldList<? super WipTabElements, ? super Params>>(2); list.add(createFieldListAdapting(BASIC_TAB_FIELDS, new Adapter<WipTabElements, TabElements>() { @Override public TabElements get(WipTabElements from) { return from.getBase(); } })); list.add(createFieldListImpl(Collections.singletonList(backendChooser))); WIP_TAB_FIELDS = createCompositeFieldList(list); } private static final Params PARAMS = new Params(HostChecker.LOCAL_ONLY, Messages.ChromiumRemoteTab_URL, false); /** * UI control elements that allows to choose {@link WipBackend}. It consists of a dialog group, * that contains a drop-down list with backend ids and a multiline text field with backend * description. */ private static class BackendSelectorControl { private final Group mainControl; private final Combo combo; private final Text text; private final List<WipBackend> elements; private final String[] labelArray; BackendSelectorControl(Composite composite, Map<String, WipBackend> backendMap, final Runnable modifyListener) { Group backendGroup = new Group(composite, 0); // TODO: externalize it. backendGroup.setText("Wip backend"); backendGroup.setLayout(new GridLayout(1, false)); elements = new ArrayList<WipBackend>(); elements.add(null); elements.addAll(backendMap.values()); labelArray = new String[elements.size()]; // TODO: externalize it. labelArray[0] = "Select backend"; for (int i = 1; i < labelArray.length; i++) { labelArray[i] = elements.get(i).getId(); } combo = new Combo(backendGroup, SWT.READ_ONLY); combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); combo.setFont(composite.getFont()); combo.setItems(labelArray); combo.select(0); { text = new Text(backendGroup, SWT.READ_ONLY | SWT.MULTI | SWT.V_SCROLL); Font font = composite.getFont(); text.setFont(font); GridData textLayoutData = new GridData(GridData.FILL_HORIZONTAL); int fontHeight = PluginUtil.getFontMetrics(text, null).getHeight(); textLayoutData.minimumHeight = fontHeight * 3; text.setLayoutData(textLayoutData); } combo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { modifyListener.run(); updateTextField(); } @Override public void widgetDefaultSelected(SelectionEvent event) { } }); mainControl = backendGroup; } public String getId() { WipBackend backend = elements.get(combo.getSelectionIndex()); if (backend == null) { return null; } else { return backend.getId(); } } public void setId(String id) { int index = Arrays.asList(labelArray).indexOf(id); if (index == -1) { index = 0; } combo.select(index); updateTextField(); } private void updateTextField() { WipBackend backend = elements.get(combo.getSelectionIndex()); String textContent; if (backend == null) { textContent = ""; } else { textContent = backend.getDescription(); } text.setText(textContent); } Group getMainControl() { return mainControl; } } }