| /* |
| * 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.tabs; |
| |
| import com.intellij.icons.AllIcons; |
| import com.intellij.openapi.actionSystem.ActionGroup; |
| import com.intellij.openapi.ui.Queryable; |
| import com.intellij.reference.SoftReference; |
| import com.intellij.ui.PlaceProvider; |
| import com.intellij.ui.SimpleColoredText; |
| import com.intellij.ui.SimpleTextAttributes; |
| import com.intellij.ui.content.AlertIcon; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.awt.event.MouseEvent; |
| import java.beans.PropertyChangeSupport; |
| import java.lang.ref.WeakReference; |
| import java.util.Map; |
| |
| public final class TabInfo implements Queryable, PlaceProvider<String> { |
| |
| public static final String ACTION_GROUP = "actionGroup"; |
| public static final String ICON = "icon"; |
| public static final String TAB_COLOR = "color"; |
| public static final String COMPONENT = "component"; |
| public static final String TEXT = "text"; |
| public static final String TAB_ACTION_GROUP = "tabActionGroup"; |
| public static final String ALERT_ICON = "alertIcon"; |
| |
| public static final String ALERT_STATUS = "alertStatus"; |
| public static final String HIDDEN = "hidden"; |
| public static final String ENABLED = "enabled"; |
| |
| private JComponent myComponent; |
| private JComponent myPreferredFocusableComponent; |
| |
| private ActionGroup myGroup; |
| |
| private final PropertyChangeSupport myChangeSupport = new PropertyChangeSupport(this); |
| |
| private Icon myIcon; |
| private String myPlace; |
| private Object myObject; |
| private JComponent mySideComponent; |
| private WeakReference<JComponent> myLastFocusOwner; |
| |
| |
| private ActionGroup myTabLabelActions; |
| private String myTabActionPlace; |
| |
| private AlertIcon myAlertIcon; |
| |
| private int myBlinkCount; |
| private boolean myAlertRequested; |
| private boolean myHidden; |
| private JComponent myActionsContextComponent; |
| |
| private final SimpleColoredText myText = new SimpleColoredText(); |
| private String myTooltipText; |
| |
| private int myDefaultStyle = -1; |
| private Color myDefaultForeground; |
| private Color myDefaultWaveColor; |
| |
| private SimpleTextAttributes myDefaultAttributes; |
| private static final AlertIcon DEFAULT_ALERT_ICON = new AlertIcon(AllIcons.Nodes.TabAlert); |
| |
| private boolean myEnabled = true; |
| private Color myTabColor = null; |
| |
| private Queryable myQueryable; |
| private DragOutDelegate myDragOutDelegate; |
| |
| /** |
| * The tab which was selected before the mouse was pressed on this tab. Focus will be transferred to that tab if this tab is dragged |
| * out of its container. (IDEA-61536) |
| */ |
| private WeakReference<TabInfo> myPreviousSelection = new WeakReference<TabInfo>(null); |
| private boolean myTitleShortened; |
| |
| public TabInfo(final JComponent component) { |
| myComponent = component; |
| myPreferredFocusableComponent = component; |
| } |
| |
| public PropertyChangeSupport getChangeSupport() { |
| return myChangeSupport; |
| } |
| |
| public TabInfo setText(String text) { |
| clearText(false); |
| append(text, getDefaultAttributes()); |
| return this; |
| } |
| |
| private SimpleTextAttributes getDefaultAttributes() { |
| if (myDefaultAttributes != null) return myDefaultAttributes; |
| |
| myDefaultAttributes = new SimpleTextAttributes(myDefaultStyle != -1 ? myDefaultStyle : SimpleTextAttributes.STYLE_PLAIN, |
| myDefaultForeground, myDefaultWaveColor); |
| |
| return myDefaultAttributes; |
| } |
| |
| public TabInfo clearText(final boolean invalidate) { |
| final String old = myText.toString(); |
| myText.clear(); |
| if (invalidate) { |
| myChangeSupport.firePropertyChange(TEXT, old, myText.toString()); |
| } |
| return this; |
| } |
| |
| public TabInfo append(String fragment, SimpleTextAttributes attributes) { |
| final String old = myText.toString(); |
| myText.append(fragment, attributes); |
| myChangeSupport.firePropertyChange(TEXT, old, myText.toString()); |
| return this; |
| } |
| |
| public TabInfo setIcon(Icon icon) { |
| Icon old = myIcon; |
| myIcon = icon; |
| myChangeSupport.firePropertyChange(ICON, old, icon); |
| return this; |
| } |
| |
| public TabInfo setComponent(Component c) { |
| if (myComponent == c) return this; |
| JComponent old = myComponent; |
| myComponent = (JComponent)c; |
| myChangeSupport.firePropertyChange(COMPONENT, old, myComponent); |
| return this; |
| } |
| |
| public ActionGroup getGroup() { |
| return myGroup; |
| } |
| |
| public JComponent getComponent() { |
| return myComponent; |
| } |
| |
| public String getText() { |
| return myText.toString(); |
| } |
| |
| public SimpleColoredText getColoredText() { |
| return myText; |
| } |
| |
| public Icon getIcon() { |
| return myIcon; |
| } |
| |
| public String getPlace() { |
| return myPlace; |
| } |
| |
| public TabInfo setSideComponent(JComponent comp) { |
| mySideComponent = comp; |
| return this; |
| } |
| |
| public JComponent getSideComponent() { |
| return mySideComponent; |
| } |
| |
| public TabInfo setActions(ActionGroup group, String place) { |
| ActionGroup old = myGroup; |
| myGroup = group; |
| myPlace = place; |
| myChangeSupport.firePropertyChange(ACTION_GROUP, old, myGroup); |
| return this; |
| } |
| |
| public TabInfo setActionsContextComponent(JComponent c) { |
| myActionsContextComponent = c; |
| return this; |
| } |
| |
| public JComponent getActionsContextComponent() { |
| return myActionsContextComponent; |
| } |
| |
| public TabInfo setObject(final Object object) { |
| myObject = object; |
| return this; |
| } |
| |
| public Object getObject() { |
| return myObject; |
| } |
| |
| public JComponent getPreferredFocusableComponent() { |
| return myPreferredFocusableComponent != null ? myPreferredFocusableComponent : myComponent; |
| } |
| |
| public TabInfo setPreferredFocusableComponent(final JComponent component) { |
| myPreferredFocusableComponent = component; |
| return this; |
| } |
| |
| public void setLastFocusOwner(final JComponent owner) { |
| myLastFocusOwner = new WeakReference<JComponent>(owner); |
| } |
| |
| public ActionGroup getTabLabelActions() { |
| return myTabLabelActions; |
| } |
| |
| public String getTabActionPlace() { |
| return myTabActionPlace; |
| } |
| |
| public TabInfo setTabLabelActions(final ActionGroup tabActions, String place) { |
| ActionGroup old = myTabLabelActions; |
| myTabLabelActions = tabActions; |
| myTabActionPlace = place; |
| myChangeSupport.firePropertyChange(TAB_ACTION_GROUP, old, myTabLabelActions); |
| return this; |
| } |
| |
| @Nullable |
| public JComponent getLastFocusOwner() { |
| return SoftReference.dereference(myLastFocusOwner); |
| } |
| |
| public TabInfo setAlertIcon(final AlertIcon alertIcon) { |
| AlertIcon old = myAlertIcon; |
| myAlertIcon = alertIcon; |
| myChangeSupport.firePropertyChange(ALERT_ICON, old, myAlertIcon); |
| return this; |
| } |
| |
| public void fireAlert() { |
| myAlertRequested = true; |
| myChangeSupport.firePropertyChange(ALERT_STATUS, null, true); |
| } |
| |
| public void stopAlerting() { |
| myAlertRequested = false; |
| myChangeSupport.firePropertyChange(ALERT_STATUS, null, false); |
| } |
| |
| public int getBlinkCount() { |
| return myBlinkCount; |
| } |
| |
| public void setBlinkCount(final int blinkCount) { |
| myBlinkCount = blinkCount; |
| } |
| |
| public String toString() { |
| return getText(); |
| } |
| |
| public AlertIcon getAlertIcon() { |
| return myAlertIcon == null ? DEFAULT_ALERT_ICON : myAlertIcon; |
| } |
| |
| public void resetAlertRequest() { |
| myAlertRequested = false; |
| } |
| |
| public boolean isAlertRequested() { |
| return myAlertRequested; |
| } |
| |
| public void setHidden(boolean hidden) { |
| boolean old = myHidden; |
| myHidden = hidden; |
| myChangeSupport.firePropertyChange(HIDDEN, old, myHidden); |
| } |
| |
| public boolean isHidden() { |
| return myHidden; |
| } |
| |
| public void setEnabled(boolean enabled) { |
| boolean old = myEnabled; |
| myEnabled = enabled; |
| myChangeSupport.firePropertyChange(ENABLED, old, myEnabled); |
| } |
| |
| public boolean isEnabled() { |
| return myEnabled; |
| } |
| |
| public TabInfo setDefaultStyle(@SimpleTextAttributes.StyleAttributeConstant int style) { |
| myDefaultStyle = style; |
| myDefaultAttributes = null; |
| update(); |
| return this; |
| } |
| |
| public TabInfo setDefaultForeground(final Color fg) { |
| myDefaultForeground = fg; |
| myDefaultAttributes = null; |
| update(); |
| return this; |
| } |
| |
| public Color getDefaultForeground() { |
| return myDefaultForeground; |
| } |
| |
| public TabInfo setDefaultWaveColor(final Color waveColor) { |
| myDefaultWaveColor = waveColor; |
| myDefaultAttributes = null; |
| update(); |
| return this; |
| } |
| |
| |
| private void update() { |
| setText(getText()); |
| } |
| |
| public void revalidate() { |
| myDefaultAttributes = null; |
| update(); |
| } |
| |
| public TabInfo setTooltipText(final String text) { |
| String old = myTooltipText; |
| myTooltipText = text; |
| myChangeSupport.firePropertyChange(TEXT, old, myTooltipText); |
| return this; |
| } |
| |
| public String getTooltipText() { |
| return myTooltipText; |
| } |
| |
| public TabInfo setTabColor(Color color) { |
| Color old = myTabColor; |
| myTabColor = color; |
| myChangeSupport.firePropertyChange(TAB_COLOR, old, color); |
| return this; |
| } |
| |
| public Color getTabColor() { |
| return myTabColor; |
| } |
| |
| public TabInfo setTestableUi(Queryable queryable) { |
| myQueryable = queryable; |
| return this; |
| } |
| |
| public void putInfo(@NotNull Map<String, String> info) { |
| if (myQueryable != null) { |
| myQueryable.putInfo(info); |
| } |
| } |
| |
| public TabInfo setDragOutDelegate(DragOutDelegate delegate) { |
| myDragOutDelegate = delegate; |
| return this; |
| } |
| |
| public boolean canBeDraggedOut() { |
| return myDragOutDelegate != null; |
| } |
| |
| public DragOutDelegate getDragOutDelegate() { |
| return myDragOutDelegate; |
| } |
| |
| public void setPreviousSelection(@Nullable TabInfo previousSelection) { |
| myPreviousSelection = new WeakReference<TabInfo>(previousSelection); |
| } |
| |
| @Nullable |
| public TabInfo getPreviousSelection() { |
| return myPreviousSelection.get(); |
| } |
| |
| public boolean isTitleShortened() { |
| return myTitleShortened; |
| } |
| |
| public void setTitleIsShortened(boolean titleIsShortened) { |
| myTitleShortened = titleIsShortened; |
| } |
| |
| public interface DragOutDelegate { |
| |
| void dragOutStarted(MouseEvent mouseEvent, TabInfo info); |
| void processDragOut(MouseEvent event, TabInfo source); |
| void dragOutFinished(MouseEvent event, TabInfo source); |
| void dragOutCancelled(TabInfo source); |
| } |
| |
| } |