00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.gui.label;
00023
00024 import com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement;
00025 import com.realtime.crossfire.jxclient.gui.gui.GUIElement;
00026 import com.realtime.crossfire.jxclient.gui.gui.GuiUtils;
00027 import java.awt.Color;
00028 import java.awt.Dimension;
00029 import java.awt.Graphics;
00030 import java.awt.event.MouseEvent;
00031 import org.jetbrains.annotations.NotNull;
00032 import org.jetbrains.annotations.Nullable;
00033
00042 public class MouseTracker {
00043
00047 private final boolean debugGui;
00048
00052 @Nullable
00053 private GUIElement mouseElement = null;
00054
00058 @Nullable
00059 private AbstractGUIElement activeComponent = null;
00060
00064 private boolean isDragging = false;
00065
00069 private boolean isClicked = false;
00070
00075 public MouseTracker(final boolean debugGui) {
00076 this.debugGui = debugGui;
00077 }
00078
00084 @SuppressWarnings("UnusedParameters")
00085 public void mouseDragged(@Nullable final GUIElement element, @NotNull final MouseEvent e) {
00086 isClicked = false;
00087 if (mouseElement != null) {
00088 mouseElement.mouseMoved(e);
00089 }
00090 if (isDragging && mouseElement != null) {
00091 mouseElement.mouseDragged(e);
00092 }
00093 }
00094
00100 public void mouseMoved(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e) {
00101 enterElement(element, e);
00102 if (mouseElement != null) {
00103 mouseElement.mouseMoved(e);
00104 }
00105 }
00106
00112 public void mousePressed(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e) {
00113 enterElement(element, e);
00114 if (mouseElement != null) {
00115 mouseElement.mousePressed(e);
00116 }
00117 isDragging = true;
00118 isClicked = true;
00119 }
00120
00126 public void mouseReleased(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e) {
00127 final boolean tmpIsClicked = isClicked;
00128 isDragging = false;
00129 enterElement(element, e);
00130 if (tmpIsClicked && element != null) {
00131
00132
00133 element.mouseClicked(e);
00134 }
00135 if (mouseElement != null) {
00136 mouseElement.mouseReleased(e);
00137 }
00138 }
00139
00145 public void mouseEntered(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e) {
00146 isClicked = false;
00147 if (!isDragging) {
00148 enterElement(element, e);
00149 }
00150 }
00151
00156 public void mouseExited(@NotNull final MouseEvent e) {
00157 isClicked = false;
00158 if (!isDragging) {
00159 enterElement(null, e);
00160 }
00161 }
00162
00168 private void enterElement(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e) {
00169 if (mouseElement == element) {
00170 return;
00171 }
00172
00173 final GUIElement tmp = mouseElement;
00174 if (tmp != null) {
00175 tmp.mouseExited(e);
00176 if (activeComponent != null) {
00177 activeComponent.setChanged();
00178 activeComponent = null;
00179 }
00180 }
00181
00182 mouseElement = element;
00183
00184 if (element != null) {
00185 element.mouseEntered(e, debugGui);
00186 if (debugGui && activeComponent != element) {
00187 activeComponent = element;
00188 activeComponent.setChanged();
00189 }
00190 }
00191 }
00192
00197 public void paintActiveComponent(@NotNull final Graphics g) {
00198 final AbstractGUIElement component = activeComponent;
00199 if (component != null) {
00200 final String text = component.getName();
00201 final Dimension dimension = GuiUtils.getTextDimension(text, g.getFontMetrics());
00202 g.setColor(Color.BLACK);
00203 g.fillRect(0, 2, dimension.width+4, dimension.height+8);
00204 g.setColor(Color.RED);
00205 g.drawString(text, 2, 16);
00206 g.drawRect(GuiUtils.getElementX(component), GuiUtils.getElementY(component), component.getWidth()-1, component.getHeight()-1);
00207 }
00208 }
00209
00210 }