Crossfire JXClient, Trunk
TooltipManagerImpl.java
Go to the documentation of this file.
1 /*
2  * This file is part of JXClient, the Fullscreen Java Crossfire Client.
3  *
4  * JXClient is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * JXClient is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with JXClient; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * Copyright (C) 2005-2008 Yann Chachkoff
19  * Copyright (C) 2006-2017,2019-2023 Andreas Kirschbaum
20  * Copyright (C) 2010-2012,2014-2018,2020-2023 Nicolas Weeger
21  */
22 
23 package com.realtime.crossfire.jxclient.gui.label;
24 
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32 
38 public class TooltipManagerImpl implements TooltipManager {
39 
43  private static final int TOOLTIP_DISTANCE = 8;
44 
48  private int windowWidth;
49 
53  private int windowHeight;
54 
59  @Nullable
61 
66  @Nullable
68 
72  @NotNull
73  private final Object activeGuiElementSync = new Object();
74 
79  @NotNull
80  private final Runnable resetRunnable = new Runnable() {
81 
82  @Override
83  public void run() {
84  synchronized (activeGuiElementSync) {
85  removeTooltip();
86  activeGuiElement = null;
87  }
88  }
89 
90  };
91 
97  public void setScreenSize(final int windowWidth, final int windowHeight) {
98  synchronized (activeGuiElementSync) {
99  this.windowWidth = windowWidth;
100  this.windowHeight = windowHeight;
101  }
102  }
103 
108  public void setTooltip(@Nullable final AbstractLabel tooltip) {
109  synchronized (activeGuiElementSync) {
110  this.tooltip = tooltip;
111  }
112  }
113 
117  public void reset() {
119  }
120 
121  @Override
122  public void setElement(@NotNull final AbstractGUIElement guiElement) {
124  synchronized (activeGuiElementSync) {
125  if (activeGuiElement == null) {
126  activeGuiElement = guiElement;
127  addTooltip();
128  } else if (activeGuiElement != guiElement) {
129  removeTooltip();
130  activeGuiElement = guiElement;
131  addTooltip();
132  }
133  }
134  });
135  }
136 
137  @Override
138  public void unsetElement(@NotNull final AbstractGUIElement guiElement) {
140  synchronized (activeGuiElementSync) {
141  if (activeGuiElement == guiElement) {
142  removeTooltip();
143  activeGuiElement = null;
144  }
145  }
146  });
147  }
148 
149  @Override
150  public void tooltipTextChanged(@NotNull final GUIElement element) {
151  synchronized (activeGuiElementSync) {
152  if (element != activeGuiElement) {
153  return;
154  }
155  }
156 
157  SwingUtilities2.invokeLater(this::addTooltip);
158  }
159 
164  private void addTooltip() {
165  synchronized (activeGuiElementSync) {
166  final AbstractGUIElement tmpActiveGuiElement = activeGuiElement;
167  if (tmpActiveGuiElement == null) {
168  return;
169  }
170 
171  final AbstractLabel tmpTooltip = tooltip;
172  if (tmpTooltip == null) {
173  return;
174  }
175 
176  final TooltipText tooltipText = tmpActiveGuiElement.getTooltip();
177  if (tooltipText == null) {
178  tmpTooltip.setVisible(false);
179  return;
180  }
181  final String text = tooltipText.getText();
182  if (text.isEmpty()) {
183  tmpTooltip.setVisible(false);
184  return;
185  }
186 
187  tmpTooltip.setVisible(true);
188  tmpTooltip.setText(text);
189 
190  final int preferredX = tooltipText.getX()+tooltipText.getW()/2-tmpTooltip.getWidth()/2;
191  final int maxX = windowWidth-tmpTooltip.getWidth();
192  final int tx = Math.max(0, Math.min(preferredX, maxX));
193  final int elementY = tooltipText.getY();
194  final int preferredY = elementY+tooltipText.getH()+TOOLTIP_DISTANCE;
195  final int ty = preferredY+tmpTooltip.getHeight() <= windowHeight ? preferredY : elementY-tmpTooltip.getHeight()-TOOLTIP_DISTANCE;
196  tmpTooltip.setLocation(tx, ty);
197  }
198  }
199 
203  private void removeTooltip() {
204  final AbstractLabel tooltip;
205  synchronized (activeGuiElementSync) {
206  tooltip = this.tooltip;
207  }
208  if (tooltip != null) {
209  tooltip.setVisible(false);
210  }
211  }
212 
213 }
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.gui.label.AbstractLabel
Definition: AbstractLabel.java:43
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getTooltip
abstract TooltipText getTooltip()
com.realtime.crossfire.jxclient.gui.gui.TooltipText.getW
int getW()
Definition: TooltipText.java:104
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.reset
void reset()
Definition: TooltipManagerImpl.java:117
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.activeGuiElement
AbstractGUIElement activeGuiElement
Definition: TooltipManagerImpl.java:67
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.setTooltip
void setTooltip(@Nullable final AbstractLabel tooltip)
Definition: TooltipManagerImpl.java:108
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.setScreenSize
void setScreenSize(final int windowWidth, final int windowHeight)
Definition: TooltipManagerImpl.java:97
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.tooltipTextChanged
void tooltipTextChanged(@NotNull final GUIElement element)
Definition: TooltipManagerImpl.java:150
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.activeGuiElementSync
final Object activeGuiElementSync
Definition: TooltipManagerImpl.java:73
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.util.SwingUtilities2.invokeAndWait
static void invokeAndWait(@NotNull final Runnable runnable)
Definition: SwingUtilities2.java:47
com.realtime.crossfire.jxclient.gui.gui.TooltipText.getText
String getText()
Definition: TooltipText.java:80
com.realtime.crossfire.jxclient.gui.gui.TooltipManager
Definition: TooltipManager.java:33
com.realtime.crossfire.jxclient.gui.gui.GUIElement
Definition: GUIElement.java:33
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.addTooltip
void addTooltip()
Definition: TooltipManagerImpl.java:164
com.realtime.crossfire.jxclient.util.SwingUtilities2.invokeLater
static void invokeLater(@NotNull final Runnable runnable)
Definition: SwingUtilities2.java:73
com.realtime.crossfire.jxclient.gui.gui
Definition: AbstractGUIElement.java:23
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.unsetElement
void unsetElement(@NotNull final AbstractGUIElement guiElement)
Definition: TooltipManagerImpl.java:138
com.realtime.crossfire.jxclient.gui.label.AbstractLabel.setText
void setText(@NotNull final String text)
Definition: AbstractLabel.java:120
com.realtime.crossfire.jxclient.gui.gui.TooltipText
Definition: TooltipText.java:31
com.realtime.crossfire
com.realtime
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.tooltip
AbstractLabel tooltip
Definition: TooltipManagerImpl.java:60
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.setElement
void setElement(@NotNull final AbstractGUIElement guiElement)
Definition: TooltipManagerImpl.java:122
com.realtime.crossfire.jxclient.gui.gui.TooltipText.getY
int getY()
Definition: TooltipText.java:96
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.windowHeight
int windowHeight
Definition: TooltipManagerImpl.java:53
com
com.realtime.crossfire.jxclient.util.SwingUtilities2
Definition: SwingUtilities2.java:34
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.removeTooltip
void removeTooltip()
Definition: TooltipManagerImpl.java:203
com.realtime.crossfire.jxclient.gui.gui.TooltipText.getX
int getX()
Definition: TooltipText.java:88
com.realtime.crossfire.jxclient.gui.gui.TooltipText.getH
int getH()
Definition: TooltipText.java:112
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement
Definition: AbstractGUIElement.java:37
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl
Definition: TooltipManagerImpl.java:38
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.windowWidth
int windowWidth
Definition: TooltipManagerImpl.java:48
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.resetRunnable
final Runnable resetRunnable
Definition: TooltipManagerImpl.java:80
com.realtime.crossfire.jxclient.gui.label.TooltipManagerImpl.TOOLTIP_DISTANCE
static final int TOOLTIP_DISTANCE
Definition: TooltipManagerImpl.java:43