| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php |
| * |
| * 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 com.android.ide.eclipse.adt.internal.editors.layout.configuration; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs; |
| import com.android.sdklib.AndroidVersion; |
| import com.android.sdklib.IAndroidTarget; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.graphics.Point; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.widgets.Menu; |
| import org.eclipse.swt.widgets.MenuItem; |
| import org.eclipse.swt.widgets.ToolItem; |
| |
| import java.util.List; |
| import java.util.RandomAccess; |
| |
| /** |
| * The {@linkplain TargetMenuListener} class is responsible for |
| * generating the rendering target menu in the {@link ConfigurationChooser}. |
| */ |
| class TargetMenuListener extends SelectionAdapter { |
| private final ConfigurationChooser mConfigChooser; |
| private final IAndroidTarget mTarget; |
| private final boolean mPickBest; |
| |
| TargetMenuListener( |
| @NonNull ConfigurationChooser configChooser, |
| @Nullable IAndroidTarget target, |
| boolean pickBest) { |
| mConfigChooser = configChooser; |
| mTarget = target; |
| mPickBest = pickBest; |
| } |
| |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| IAndroidTarget target = mTarget; |
| AdtPrefs prefs = AdtPrefs.getPrefs(); |
| if (mPickBest) { |
| boolean autoPick = prefs.isAutoPickRenderTarget(); |
| autoPick = !autoPick; |
| prefs.setAutoPickRenderTarget(autoPick); |
| if (autoPick) { |
| target = ConfigurationMatcher.findDefaultRenderTarget(mConfigChooser); |
| } else { |
| // Turn it off, but keep current target until another one is chosen |
| return; |
| } |
| } else { |
| // Manually picked some other target: turn off auto-pick |
| prefs.setAutoPickRenderTarget(false); |
| } |
| mConfigChooser.selectTarget(target); |
| mConfigChooser.onRenderingTargetChange(); |
| } |
| |
| static void show(ConfigurationChooser chooser, ToolItem combo) { |
| Menu menu = new Menu(chooser.getShell(), SWT.POP_UP); |
| Configuration configuration = chooser.getConfiguration(); |
| IAndroidTarget current = configuration.getTarget(); |
| List<IAndroidTarget> targets = chooser.getTargetList(); |
| boolean haveRecent = false; |
| |
| MenuItem menuItem = new MenuItem(menu, SWT.CHECK); |
| menuItem.setText("Automatically Pick Best"); |
| menuItem.addSelectionListener(new TargetMenuListener(chooser, null, true)); |
| if (AdtPrefs.getPrefs().isAutoPickRenderTarget()) { |
| menuItem.setSelection(true); |
| } |
| |
| @SuppressWarnings("unused") |
| MenuItem separator = new MenuItem(menu, SWT.SEPARATOR); |
| |
| // Process in reverse order: most important targets first |
| assert targets instanceof RandomAccess; |
| for (int i = targets.size() - 1; i >= 0; i--) { |
| IAndroidTarget target = targets.get(i); |
| |
| AndroidVersion version = target.getVersion(); |
| if (version.getApiLevel() >= 7) { |
| haveRecent = true; |
| } else if (haveRecent) { |
| // Don't show ancient rendering targets; they're pretty broken |
| // (unless of course all you have are ancient targets) |
| break; |
| } |
| |
| String title = ConfigurationChooser.getRenderingTargetLabel(target, false); |
| MenuItem item = new MenuItem(menu, SWT.CHECK); |
| item.setText(title); |
| |
| boolean selected = current == target; |
| if (selected) { |
| item.setSelection(true); |
| } |
| |
| item.addSelectionListener(new TargetMenuListener(chooser, target, false)); |
| } |
| |
| Rectangle bounds = combo.getBounds(); |
| Point location = new Point(bounds.x, bounds.y + bounds.height); |
| location = combo.getParent().toDisplay(location); |
| menu.setLocation(location.x, location.y); |
| menu.setVisible(true); |
| } |
| } |