blob: 4e6cf8a16378e7275491808101ba695cb65890d7 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.intellij.util.xml.ui.actions;
import com.intellij.ide.TypePresentationService;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.ui.popup.ListPopup;
import com.intellij.ui.CommonActionsPanel;
import com.intellij.util.ReflectionUtil;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomManager;
import com.intellij.util.xml.ElementPresentationManager;
import com.intellij.util.xml.TypeChooser;
import com.intellij.util.xml.reflect.DomCollectionChildDescription;
import com.intellij.util.xml.ui.DomCollectionControl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* User: Sergey.Vasiliev
*/
public abstract class AddDomElementAction extends AnAction {
public AddDomElementAction() {
super(ApplicationBundle.message("action.add"), null, DomCollectionControl.ADD_ICON);
}
@Override
public void update(AnActionEvent e) {
if (!isEnabled(e)) {
e.getPresentation().setEnabled(false);
return;
}
final AnAction[] actions = getChildren(e);
for (final AnAction action : actions) {
e.getPresentation().setEnabled(true);
action.update(e);
if (e.getPresentation().isEnabled()) {
break;
}
}
if (actions.length == 1) {
e.getPresentation().setText(actions[0].getTemplatePresentation().getText());
} else {
final String actionText = getActionText(e);
if (!actionText.endsWith("...")) {
e.getPresentation().setText(actionText + (actions.length > 1 ? "..." : ""));
}
}
e.getPresentation().setIcon(DomCollectionControl.ADD_ICON);
super.update(e);
}
@Override
public void actionPerformed(AnActionEvent e) {
final AnAction[] actions = getChildren(e);
if (actions.length > 1) {
final DefaultActionGroup group = new DefaultActionGroup();
for (final AnAction action : actions) {
group.add(action);
}
final DataContext dataContext = e.getDataContext();
final ListPopup groupPopup =
JBPopupFactory.getInstance().createActionGroupPopup(null,
group, dataContext, JBPopupFactory.ActionSelectionAid.NUMBERING, true);
showPopup(groupPopup, e);
}
else if (actions.length == 1) {
actions[0].actionPerformed(e);
}
}
protected String getActionText(final AnActionEvent e) {
return e.getPresentation().getText();
}
protected boolean isEnabled(final AnActionEvent e) {
return true;
}
protected void showPopup(final ListPopup groupPopup, final AnActionEvent e) {
final Component component = e.getInputEvent().getComponent();
if (component instanceof ActionButtonComponent) {
groupPopup.showUnderneathOf(component);
} else {
groupPopup.showInBestPositionFor(e.getDataContext());
}
}
@NotNull
public AnAction[] getChildren(@Nullable AnActionEvent e) {
Project project = e == null ? null : CommonDataKeys.PROJECT.getData(e.getDataContext());
if (project == null) return AnAction.EMPTY_ARRAY;
DomCollectionChildDescription[] descriptions = getDomCollectionChildDescriptions(e);
final List<AnAction> actions = new ArrayList<AnAction>();
for (DomCollectionChildDescription description : descriptions) {
final TypeChooser chooser = DomManager.getDomManager(project).getTypeChooserManager().getTypeChooser(description.getType());
for (Type type : chooser.getChooserTypes()) {
final Class<?> rawType = ReflectionUtil.getRawType(type);
String name = TypePresentationService.getService().getTypePresentableName(rawType);
Icon icon = null;
if (!showAsPopup() || descriptions.length == 1) {
// if (descriptions.length > 1) {
icon = ElementPresentationManager.getIconForClass(rawType);
// }
}
actions.add(createAddingAction(e, ApplicationBundle.message("action.add") + " " + name, icon, type, description));
}
}
if (actions.size() > 1 && showAsPopup()) {
ActionGroup group = new ActionGroup() {
@Override
@NotNull
public AnAction[] getChildren(@Nullable AnActionEvent e) {
return actions.toArray(new AnAction[actions.size()]);
}
};
return new AnAction[]{new ShowPopupAction(group)};
}
else {
if (actions.size() > 1) {
actions.add(Separator.getInstance());
} else if (actions.size() == 1) {
}
}
return actions.toArray(new AnAction[actions.size()]);
}
protected abstract AnAction createAddingAction(final AnActionEvent e,
final String name,
final Icon icon,
final Type type,
final DomCollectionChildDescription description);
@NotNull
protected abstract DomCollectionChildDescription[] getDomCollectionChildDescriptions(final AnActionEvent e);
@Nullable
protected abstract DomElement getParentDomElement(final AnActionEvent e);
protected abstract JComponent getComponent(AnActionEvent e);
protected boolean showAsPopup() {
return true;
}
protected class ShowPopupAction extends AnAction {
protected final ActionGroup myGroup;
protected ShowPopupAction(ActionGroup group) {
super(ApplicationBundle.message("action.add"), null, DomCollectionControl.ADD_ICON);
myGroup = group;
setShortcutSet(CommonActionsPanel.getCommonShortcut(CommonActionsPanel.Buttons.ADD));
}
@Override
public void actionPerformed(AnActionEvent e) {
final ListPopup groupPopup =
JBPopupFactory.getInstance().createActionGroupPopup(null,
myGroup, e.getDataContext(), JBPopupFactory.ActionSelectionAid.NUMBERING, true);
showPopup(groupPopup, e);
}
}
}