blob: 0c7416bc78a3c38ecb382aef7fc7d0f1753a4241 [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.ui.popup;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.popup.Balloon;
import com.intellij.openapi.ui.popup.BalloonBuilder;
import com.intellij.openapi.ui.popup.JBPopupAdapter;
import com.intellij.openapi.ui.popup.LightweightWindowEvent;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.BalloonImpl;
import com.intellij.ui.Gray;
import com.intellij.ui.JBColor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class BalloonPopupBuilderImpl implements BalloonBuilder {
@Nullable private final Map<Disposable, List<Balloon>> myStorage;
@Nullable private Disposable myAnchor;
private final JComponent myContent;
private Color myBorder = new JBColor(JBColor.GRAY, Gray._200);
@Nullable private Insets myBorderInsets = null;
private Color myFill = MessageType.INFO.getPopupBackground();
private boolean myHideOnMouseOutside = true;
private boolean myHideOnKeyOutside = true;
private long myFadeoutTime = -1;
private boolean myShowCallout = true;
private boolean myCloseButtonEnabled = false;
private boolean myHideOnFrameResize = true;
private boolean myHideOnLinkClick = false;
private ActionListener myClickHandler;
private boolean myCloseOnClick;
private int myAnimationCycle = 500;
private int myCalloutShift;
private int myPositionChangeXShift;
private int myPositionChangeYShift;
private boolean myHideOnAction = true;
private boolean myDialogMode;
private String myTitle;
private Insets myContentInsets = new Insets(2, 2, 2, 2);
private boolean myShadow = false;
private boolean mySmallVariant = false;
private Balloon.Layer myLayer;
private boolean myBlockClicks = false;
public BalloonPopupBuilderImpl(@Nullable Map<Disposable, List<Balloon>> storage, @NotNull final JComponent content) {
myStorage = storage;
myContent = content;
}
@Override
public boolean isHideOnAction() {
return myHideOnAction;
}
@NotNull
@Override
public BalloonBuilder setHideOnAction(boolean hideOnAction) {
myHideOnAction = hideOnAction;
return this;
}
@NotNull
@Override
public BalloonBuilder setDialogMode(boolean dialogMode) {
myDialogMode = dialogMode;
return this;
}
@NotNull
@Override
public BalloonBuilder setPreferredPosition(final Balloon.Position position) {
return this;
}
@NotNull
@Override
public BalloonBuilder setBorderColor(@NotNull final Color color) {
myBorder = color;
return this;
}
@Override
public BalloonBuilder setBorderInsets(@Nullable Insets insets) {
myBorderInsets = insets;
return this;
}
@NotNull
@Override
public BalloonBuilder setFillColor(@NotNull final Color color) {
myFill = color;
return this;
}
@NotNull
@Override
public BalloonBuilder setHideOnClickOutside(final boolean hide) {
myHideOnMouseOutside = hide;
return this;
}
@NotNull
@Override
public BalloonBuilder setHideOnKeyOutside(final boolean hide) {
myHideOnKeyOutside = hide;
return this;
}
@NotNull
@Override
public BalloonBuilder setShowCallout(final boolean show) {
myShowCallout = show;
return this;
}
@NotNull
@Override
public BalloonBuilder setFadeoutTime(long fadeoutTime) {
myFadeoutTime = fadeoutTime;
return this;
}
@NotNull
@Override
public BalloonBuilder setBlockClicksThroughBalloon(boolean block) {
myBlockClicks = block;
return this;
}
@NotNull
@Override
public BalloonBuilder setAnimationCycle(int time) {
myAnimationCycle = time;
return this;
}
@NotNull
@Override
public BalloonBuilder setHideOnFrameResize(boolean hide) {
myHideOnFrameResize = hide;
return this;
}
@NotNull
@Override
public BalloonBuilder setHideOnLinkClick(boolean hide) {
myHideOnLinkClick = hide;
return this;
}
@NotNull
@Override
public BalloonBuilder setPositionChangeXShift(int positionChangeXShift) {
myPositionChangeXShift = positionChangeXShift;
return this;
}
@NotNull
@Override
public BalloonBuilder setPositionChangeYShift(int positionChangeYShift) {
myPositionChangeYShift = positionChangeYShift;
return this;
}
@NotNull
@Override
public BalloonBuilder setCloseButtonEnabled(boolean enabled) {
myCloseButtonEnabled = enabled;
return this;
}
@NotNull
@Override
public BalloonBuilder setClickHandler(ActionListener listener, boolean closeOnClick) {
myClickHandler = listener;
myCloseOnClick = closeOnClick;
return this;
}
@NotNull
@Override
public BalloonBuilder setCalloutShift(int length) {
myCalloutShift = length;
return this;
}
@NotNull
@Override
public BalloonBuilder setTitle(@Nullable String title) {
myTitle = title;
return this;
}
@NotNull
@Override
public BalloonBuilder setContentInsets(Insets insets) {
myContentInsets = insets;
return this;
}
@NotNull
@Override
public BalloonBuilder setShadow(boolean shadow) {
myShadow = shadow;
return this;
}
@NotNull
@Override
public BalloonBuilder setSmallVariant(boolean smallVariant) {
mySmallVariant = smallVariant;
return this;
}
@NotNull
@Override
public BalloonBuilder setLayer(Balloon.Layer layer) {
myLayer = layer;
return this;
}
@NotNull
@Override
public BalloonBuilder setDisposable(@NotNull Disposable anchor) {
myAnchor = anchor;
return this;
}
@NotNull
@Override
public Balloon createBalloon() {
final BalloonImpl result = new BalloonImpl(
myContent, myBorder, myBorderInsets, myFill, myHideOnMouseOutside, myHideOnKeyOutside, myHideOnAction, myShowCallout, myCloseButtonEnabled,
myFadeoutTime, myHideOnFrameResize, myHideOnLinkClick, myClickHandler, myCloseOnClick, myAnimationCycle, myCalloutShift,
myPositionChangeXShift, myPositionChangeYShift, myDialogMode, myTitle, myContentInsets, myShadow, mySmallVariant, myBlockClicks,
myLayer);
if (myStorage != null && myAnchor != null) {
List<Balloon> balloons = myStorage.get(myAnchor);
if (balloons == null) {
myStorage.put(myAnchor, balloons = new ArrayList<Balloon>());
Disposer.register(myAnchor, new Disposable() {
@Override
public void dispose() {
List<Balloon> toDispose = myStorage.remove(myAnchor);
if (toDispose != null) {
for (Balloon balloon : toDispose) {
if (!balloon.isDisposed()) {
Disposer.dispose(balloon);
}
}
}
}
});
}
balloons.add(result);
result.addListener(new JBPopupAdapter() {
@Override
public void onClosed(LightweightWindowEvent event) {
if (!result.isDisposed()) {
Disposer.dispose(result);
}
}
});
}
return result;
}
}