/*
* 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.AdtPlugin;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.ui.ISharedImages;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* The {@linkplain ActivityMenuListener} class is responsible for
* generating the activity menu in the {@link ConfigurationChooser}.
*/
class ActivityMenuListener extends SelectionAdapter {
private static final int ACTION_OPEN_ACTIVITY = 1;
private static final int ACTION_SELECT_ACTIVITY = 2;
private final ConfigurationChooser mConfigChooser;
private final int mAction;
private final String mFqcn;
ActivityMenuListener(
@NonNull ConfigurationChooser configChooser,
int action,
@Nullable String fqcn) {
mConfigChooser = configChooser;
mAction = action;
mFqcn = fqcn;
}
@Override
public void widgetSelected(SelectionEvent e) {
switch (mAction) {
case ACTION_OPEN_ACTIVITY: {
Configuration configuration = mConfigChooser.getConfiguration();
String fqcn = configuration.getActivity();
AdtPlugin.openJavaClass(mConfigChooser.getProject(), fqcn);
break;
}
case ACTION_SELECT_ACTIVITY: {
mConfigChooser.selectActivity(mFqcn);
mConfigChooser.onSelectActivity();
break;
}
default: assert false : mAction;
}
}
static void show(ConfigurationChooser chooser, ToolItem combo) {
// TODO: Allow using fragments here as well?
Menu menu = new Menu(chooser.getShell(), SWT.POP_UP);
ISharedImages sharedImages = JavaUI.getSharedImages();
Configuration configuration = chooser.getConfiguration();
String current = configuration.getActivity();
if (current != null) {
MenuItem item = new MenuItem(menu, SWT.PUSH);
String label = ConfigurationChooser.getActivityLabel(current, true);
item.setText( String.format("Open %1$s...", label));
Image image = sharedImages.getImage(ISharedImages.IMG_OBJS_CUNIT);
item.setImage(image);
item.addSelectionListener(
new ActivityMenuListener(chooser, ACTION_OPEN_ACTIVITY, null));
@SuppressWarnings("unused")
MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
}
IProject project = chooser.getProject();
Image image = sharedImages.getImage(ISharedImages.IMG_OBJS_CLASS);
// Add activities found to be relevant to this layout
String layoutName = ResourceHelper.getLayoutName(chooser.getEditedFile());
String pkg = ManifestInfo.get(project).getPackage();
List<String> preferred = ManifestInfo.guessActivities(project, layoutName, pkg);
current = addActivities(chooser, menu, current, image, preferred);
// Add all activities
List<String> activities = ManifestInfo.getProjectActivities(project);
if (preferred.size() > 0) {
// Filter out the activities we've already listed above
List<String> filtered = new ArrayList<String>(activities.size());
Set<String> remove = new HashSet<String>(preferred);
for (String fqcn : activities) {
if (!remove.contains(fqcn)) {
filtered.add(fqcn);
}
}
activities = filtered;
}
if (activities.size() > 0) {
if (preferred.size() > 0) {
@SuppressWarnings("unused")
MenuItem separator = new MenuItem(menu, SWT.SEPARATOR);
}
addActivities(chooser, menu, current, image, activities);
}
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);
}
private static String addActivities(ConfigurationChooser chooser, Menu menu, String current,
Image image, List<String> activities) {
for (final String fqcn : activities) {
String title = ConfigurationChooser.getActivityLabel(fqcn, false);
MenuItem item = new MenuItem(menu, SWT.CHECK);
item.setText(title);
item.setImage(image);
boolean selected = title.equals(current);
if (selected) {
item.setSelection(true);
current = null; // Only show the first occurrence as selected
// such that we don't show it selected again in the full activity list
}
item.addSelectionListener(new ActivityMenuListener(chooser,
ACTION_SELECT_ACTIVITY, fqcn));
}
return current;
}
}