blob: 5874759ab63d8e336f2e620b4804cccdf79653d5 [file] [log] [blame]
/*
* Copyright 2000-2010 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.openapi.ui.popup;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.util.Condition;
import com.intellij.ui.awt.RelativePoint;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.HyperlinkListener;
import java.awt.*;
import java.util.List;
/**
* Factory class for creating popup chooser windows (similar to the Code | Generate... popup) and various notifications/confirmations.
*
* @author mike
* @since 6.0
*/
public abstract class JBPopupFactory {
/**
* Returns the popup factory instance.
*
* @return the popup factory instance.
*/
public static JBPopupFactory getInstance() {
return ServiceManager.getService(JBPopupFactory.class);
}
@NotNull
public PopupChooserBuilder createListPopupBuilder(@NotNull JList list) {
return new PopupChooserBuilder(list);
}
/**
* Creates a popup with the specified title and two options, Yes and No.
*
* @param title the title of the popup.
* @param onYes the runnable which is executed when the Yes option is selected.
* @param defaultOptionIndex the index of the option which is selected by default.
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createConfirmation(String title, Runnable onYes, int defaultOptionIndex);
/**
* Creates a popup allowing to choose one of two specified options and execute code when one of them is selected.
*
* @param title the title of the popup.
* @param yesText the title for the Yes option.
* @param noText the title for the No option.
* @param onYes the runnable which is executed when the Yes option is selected.
* @param defaultOptionIndex the index of the option which is selected by default.
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createConfirmation(String title, String yesText, String noText, Runnable onYes, int defaultOptionIndex);
/**
* Creates a popup allowing to choose one of two specified options and execute code when either of them is selected.
*
* @param title the title of the popup.
* @param yesText the title for the Yes option.
* @param noText the title for the No option.
* @param onYes the runnable which is executed when the Yes option is selected.
* @param onNo the runnable which is executed when the No option is selected.
* @param defaultOptionIndex the index of the option which is selected by default.
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createConfirmation(String title,
String yesText,
String noText,
Runnable onYes,
Runnable onNo,
int defaultOptionIndex);
@NotNull
public abstract ListPopupStep createActionsStep(@NotNull ActionGroup actionGroup,
@NotNull DataContext dataContext,
boolean showNumbers,
boolean showDisabledActions,
String title,
Component component,
boolean honorActionMnemonics);
@NotNull
public abstract ListPopupStep createActionsStep(@NotNull ActionGroup actionGroup,
@NotNull DataContext dataContext,
boolean showNumbers,
boolean showDisabledActions,
String title,
Component component,
boolean honorActionMnemonics,
int defaultOptionIndex, final boolean autoSelectionEnabled);
@NotNull
public abstract RelativePoint guessBestPopupLocation(@NotNull JComponent component);
public boolean isChildPopupFocused(@Nullable Component parent) {
return getChildFocusedPopup(parent) != null;
}
public JBPopup getChildFocusedPopup(@Nullable Component parent) {
if (parent == null) return null;
List<JBPopup> popups = getChildPopups(parent);
for (JBPopup each : popups) {
if (each.isFocused()) return each;
}
return null;
}
/**
* Possible ways to select actions in a popup from keyboard.
*/
public enum ActionSelectionAid {
/**
* The actions in a popup are prefixed by numbers (indexes in the list).
*/
NUMBERING,
/**
* Same as numbering, but will allow A-Z 'numbers' when out of 0-9 range.
*/
ALPHA_NUMBERING,
/**
* The actions in a popup can be selected by typing part of the action's text.
*/
SPEEDSEARCH,
/**
* The actions in a popup can be selected by pressing the character from the action's text prefixed with
* an &amp; character.
*/
MNEMONICS
}
/**
* Creates a popup allowing to choose one of the actions from the specified action group.
*
* @param title the title of the popup.
* @param actionGroup the action group from which the popup is built.
* @param dataContext the data context which provides the data for the selected action
* @param selectionAidMethod keyboard selection mode for actions in the popup.
* @param showDisabledActions if true, disabled actions are shown as disabled; if false, disabled actions are not shown
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createActionGroupPopup(@Nullable String title,
@NotNull ActionGroup actionGroup,
@NotNull DataContext dataContext,
ActionSelectionAid selectionAidMethod,
boolean showDisabledActions);
/**
* Creates a popup allowing to choose one of the actions from the specified action group.
*
* @param title the title of the popup.
* @param actionGroup the action group from which the popup is built.
* @param dataContext the data context which provides the data for the selected action
* @param selectionAidMethod keyboard selection mode for actions in the popup.
* @param showDisabledActions if true, disabled actions are shown as disabled; if false, disabled actions are not shown
* @param actionPlace action place for ActionManager to use when creating the popup
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createActionGroupPopup(String title,
@NotNull ActionGroup actionGroup,
@NotNull DataContext dataContext,
ActionSelectionAid selectionAidMethod,
boolean showDisabledActions, @Nullable final String actionPlace);
/**
* Creates a popup allowing to choose one of the actions from the specified action group.
*
* @param title the title of the popup.
* @param actionGroup the action group from which the popup is built.
* @param dataContext the data context which provides the data for the selected action
* @param selectionAidMethod keyboard selection mode for actions in the popup.
* @param showDisabledActions if true, disabled actions are shown as disabled; if false, disabled actions are not shown
* @param disposeCallback method which is called when the popup is closed (either by selecting an action or by canceling)
* @param maxRowCount maximum number of popup rows visible at once (if there are more actions in the action group, a scrollbar
* is displayed)
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createActionGroupPopup(String title,
@NotNull ActionGroup actionGroup,
@NotNull DataContext dataContext,
ActionSelectionAid selectionAidMethod,
boolean showDisabledActions,
@Nullable Runnable disposeCallback,
int maxRowCount);
@NotNull
public abstract ListPopup createActionGroupPopup(String title,
@NotNull ActionGroup actionGroup,
@NotNull DataContext dataContext,
boolean showNumbers,
boolean showDisabledActions,
boolean honorActionMnemonics,
@Nullable Runnable disposeCallback,
int maxRowCount,
@Nullable Condition<AnAction> preselectActionCondition);
/**
* @deprecated use {@link #createListPopup(ListPopupStep)} instead (<code>step</code> must be a ListPopupStep in any case)
*/
@NotNull
public abstract ListPopup createWizardStep(@NotNull PopupStep step);
/**
* Creates a custom list popup with the specified step.
*
* @param step the custom step for the list popup.
* @return the popup instance.
*/
@NotNull
public abstract ListPopup createListPopup(@NotNull ListPopupStep step);
@NotNull
public abstract TreePopup createTree(JBPopup parent, @NotNull TreePopupStep step, Object parentValue);
@NotNull
public abstract TreePopup createTree(@NotNull TreePopupStep step);
@NotNull
public abstract ComponentPopupBuilder createComponentPopupBuilder(@NotNull JComponent content, @Nullable JComponent preferableFocusComponent);
/**
* Returns the location where a popup with the specified data context is displayed.
*
* @param dataContext the data context from which the location is determined.
* @return location as close as possible to the action origin. Method has special handling of
* the following components:<br>
* - caret offset for editor<br>
* - current selected node for tree<br>
* - current selected row for list<br>
*/
@NotNull
public abstract RelativePoint guessBestPopupLocation(@NotNull DataContext dataContext);
/**
* Returns the location where a popup invoked from the specified editor should be displayed.
*
* @param editor the editor over which the popup is shown.
* @return location as close as possible to the action origin.
*/
@NotNull
public abstract RelativePoint guessBestPopupLocation(@NotNull Editor editor);
/**
* @param editor the editor over which the popup is shown.
* @return true if popup location is located in visible area
* false if center would be suggested instead
*/
public abstract boolean isBestPopupLocationVisible(@NotNull Editor editor);
public abstract Point getCenterOf(JComponent container, JComponent content);
@NotNull
public abstract List<JBPopup> getChildPopups(@NotNull Component parent);
public abstract boolean isPopupActive();
@NotNull
public abstract BalloonBuilder createBalloonBuilder(@NotNull JComponent content);
@NotNull
public abstract BalloonBuilder createDialogBalloonBuilder(@NotNull JComponent content, String title);
@NotNull
public abstract BalloonBuilder createHtmlTextBalloonBuilder(@NotNull String htmlContent, @Nullable Icon icon, Color fillColor, @Nullable HyperlinkListener listener);
@NotNull
public abstract BalloonBuilder createHtmlTextBalloonBuilder(@NotNull String htmlContent, MessageType messageType, @Nullable HyperlinkListener listener);
@NotNull
public abstract JBPopup createMessage(String text);
@Nullable
public abstract Balloon getParentBalloonFor(@Nullable Component c);
}