Crossfire JXClient, Trunk
JXCWindowRenderer.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.misc;
24 
43 import java.awt.Color;
44 import java.awt.Component;
45 import java.awt.Container;
46 import java.awt.Dimension;
47 import java.awt.DisplayMode;
48 import java.awt.Frame;
49 import java.awt.Graphics;
50 import java.awt.GraphicsConfiguration;
51 import java.awt.GraphicsDevice;
52 import java.awt.GraphicsEnvironment;
53 import java.awt.Insets;
54 import java.awt.Point;
55 import java.awt.Rectangle;
56 import java.awt.Toolkit;
57 import java.awt.Window;
58 import java.awt.event.ComponentEvent;
59 import java.awt.event.ComponentListener;
60 import java.awt.event.KeyEvent;
61 import java.awt.event.MouseEvent;
62 import java.awt.event.MouseWheelEvent;
63 import java.awt.event.MouseWheelListener;
64 import java.awt.image.BufferStrategy;
65 import java.io.IOException;
66 import java.io.Writer;
67 import java.time.LocalDateTime;
68 import java.time.format.DateTimeFormatter;
69 import java.util.Collection;
70 import java.util.Iterator;
71 import java.util.List;
72 import java.util.ListIterator;
73 import java.util.Locale;
74 import java.util.concurrent.CopyOnWriteArrayList;
75 import javax.swing.JFrame;
76 import javax.swing.JLayeredPane;
77 import javax.swing.JViewport;
78 import javax.swing.RootPaneContainer;
79 import javax.swing.event.MouseInputListener;
80 import org.jetbrains.annotations.NotNull;
81 import org.jetbrains.annotations.Nullable;
82 
87 public class JXCWindowRenderer {
88 
92  private static final int DEFAULT_NUM_LOOK_OBJECTS = 50;
93 
97  private static final int DEFAULT_MAP_WIDTH = 9;
98 
102  private static final int DEFAULT_MAP_HEIGHT = 9;
103 
107  @Nullable
108  private JFrame frame;
109 
114  @NotNull
115  private final Container layeredPane = new JLayeredPane() {
116 
120  private static final long serialVersionUID = 1L;
121 
122  @Override
123  public void paint(@NotNull final Graphics g) {
124  super.paint(g);
126  }
127 
128  };
129 
133  @NotNull
134  private final MouseTracker mouseTracker;
135 
139  @NotNull
141 
145  @Nullable
146  private final Writer debugScreen;
147 
151  @NotNull
152  private final GraphicsEnvironment graphicsEnvironment;
153 
157  @NotNull
158  private final GraphicsDevice graphicsDevice;
159 
163  @NotNull
164  private final DisplayMode defaultDisplayMode;
165 
169  @NotNull
170  private final Rectangle maximumWindowBounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds(); // This call hangs on Solaris when called from the EDT.
171 
175  @NotNull
176  private final MouseInputListener mouseInputListener = new MouseInputListener() {
177 
178  @Override
179  public void mouseClicked(final MouseEvent e) {
180  mouseTracker.mouseClicked(findElement(e.getComponent(), e), e);
181  }
182 
183  @Override
184  public void mousePressed(final MouseEvent e) {
185  mouseTracker.mousePressed(findElement(e.getComponent(), e), e);
186  }
187 
188  @Override
189  public void mouseReleased(final MouseEvent e) {
190  mouseTracker.mouseReleased(findElement(e.getComponent(), e), e);
191  }
192 
193  @Override
194  public void mouseEntered(final MouseEvent e) {
195  mouseTracker.mouseEntered(findElement(e.getComponent(), e), e);
196  }
197 
198  @Override
199  public void mouseExited(final MouseEvent e) {
201  }
202 
203  @Override
204  public void mouseDragged(final MouseEvent e) {
205  mouseTracker.mouseDragged(findElement(e.getComponent(), e), e);
206  }
207 
208  @Override
209  public void mouseMoved(final MouseEvent e) {
210  mouseTracker.mouseMoved(findElement(e.getComponent(), e), e);
211  }
212 
213  };
214 
218  @NotNull
219  private final MouseWheelListener mouseWheelListener = new MouseWheelListener() {
220 
221  @Override
222  public void mouseWheelMoved(final MouseWheelEvent e) {
223  mouseTracker.mouseWheelMoved(findElement(e.getComponent(), e), e);
224  }
225 
226  };
227 
234  @Nullable
235  private BufferStrategy bufferStrategy;
236 
240  private int windowWidth;
241 
245  private int windowHeight;
246 
251  @NotNull
252  private final List<Gui> openDialogs = new CopyOnWriteArrayList<>();
253 
257  @NotNull
259 
263  @Nullable
264  private Gui currentGui;
265 
270  @NotNull
271  private final Collection<GUIMap> maps = new CopyOnWriteArrayList<>();
272 
277  @NotNull
278  private final Collection<GUIFloorList> floorLists = new CopyOnWriteArrayList<>();
279 
283  @Nullable
284  private Component tooltip;
285 
289  private int offsetX;
290 
294  private int offsetY;
295 
299  private boolean isFullScreen;
300 
304  private boolean wasDisplayed;
305 
309  @NotNull
311 
315  @NotNull
316  private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS ", Locale.ENGLISH);
317 
321  @NotNull
322  private final ComponentListener componentListener = new ComponentListener() {
323 
324  @Override
325  public void componentResized(final ComponentEvent e) {
326  final RootPaneContainer tmpFrame = frame;
327  assert tmpFrame != null;
328  final int width = tmpFrame.getContentPane().getWidth();
329  final int height = tmpFrame.getContentPane().getHeight();
330  updateWindowSize(width, height);
332  }
333 
334  @Override
335  public void componentMoved(final ComponentEvent e) {
336  // ignore
337  }
338 
339  @Override
340  public void componentShown(final ComponentEvent e) {
342  }
343 
344  @Override
345  public void componentHidden(final ComponentEvent e) {
346  // ignore
347  }
348 
349  };
350 
357  public JXCWindowRenderer(@NotNull final MouseTracker mouseTracker, @NotNull final CrossfireServerConnection crossfireServerConnection, @Nullable final Writer debugScreen) {
358  this.mouseTracker = mouseTracker;
359  this.crossfireServerConnection = crossfireServerConnection;
360  this.debugScreen = debugScreen;
361  graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
362  graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();
364  debugScreenWrite("getMaxWindowDimension: maximum window bounds="+maximumWindowBounds.width+"x"+maximumWindowBounds.height+"+"+maximumWindowBounds.x+"+"+maximumWindowBounds.y);
365  }
366 
375  public boolean setFullScreenMode(@NotNull final JFrame frame, @Nullable final Resolution resolution) {
376  debugScreenWrite("setFullScreenMode: resolution="+(resolution == null ? "default" : resolution));
377 
378  final DisplayMode currentDisplayMode = getDisplayMode();
379  if (frame == this.frame && isFullScreen && bufferStrategy != null && (resolution == null || resolution.getWidth() == windowWidth && resolution.getHeight() == windowHeight)) {
380  debugScreenWrite("setResolutionPre: no change needed");
381  debugScreenWrite("setResolutionPre: success");
382  return true;
383  }
384 
386 
387  final Dimension dimension;
388  if (resolution == null) {
389  dimension = new Dimension(currentDisplayMode.getWidth(), currentDisplayMode.getHeight());
390  debugScreenWrite("setFullScreenMode: full-screen requested, dimension="+dimension+" [using current display resolution]");
391  } else {
392  dimension = new Dimension(resolution.getWidth(), resolution.getHeight());
393  debugScreenWrite("setFullScreenMode: full-screen requested, dimension="+dimension+" [using user-specified resolution]");
394  }
395  frame.setPreferredSize(dimension);
396  frame.setResizable(false);
397  frame.setUndecorated(true);
398 
399  // full-screen switch must happen before display mode change
400  if (!isFullScreenSupported()) {
401  setFullScreenWindow(null);
402  debugScreenWrite("setFullScreenMode: failure");
403  return false;
404  }
405 
407 
408  if (resolution == null || resolution.equalsDisplayMode(currentDisplayMode)) {
409  debugScreenWrite("setFullScreenMode: requested resolution matches screen resolution");
410  } else {
411  if (!isDisplayChangeSupported()) {
412  setFullScreenWindow(null);
413  debugScreenWrite("setFullScreenMode: failure");
414  return false;
415  }
416 
417  final DisplayMode newDisplayMode = new DisplayMode(resolution.getWidth(), resolution.getHeight(), DisplayMode.BIT_DEPTH_MULTI, DisplayMode.REFRESH_RATE_UNKNOWN);
418  try {
419  setDisplayMode(newDisplayMode);
420  } catch (final IllegalArgumentException ex) {
421  debugScreenWrite("setFullScreenMode: setting screen resolution failed: "+ex.getMessage());
423  setFullScreenWindow(null);
424  debugScreenWrite("setFullScreenMode: failure");
425  return false;
426  }
427  }
428 
429  setResolutionPost(frame, dimension);
430  if (this.frame != null) {
431  this.frame.removeComponentListener(componentListener);
432  }
433  this.frame = frame;
434  this.frame.addComponentListener(componentListener);
437  return true;
438  }
439 
448  public void setWindowMode(@NotNull final JFrame frame, @Nullable final Resolution resolution, @NotNull final Resolution minResolution, final boolean fixedSize) {
449  debugScreenWrite("setWindowMode: resolution="+(resolution == null ? "default" : resolution)+", minResolution="+minResolution+", fixedSize="+fixedSize);
450 
451  final DisplayMode currentDisplayMode = getDisplayMode();
452  if (frame == this.frame && !isFullScreen && bufferStrategy != null && (resolution == null || resolution.getWidth() == windowWidth && resolution.getHeight() == windowHeight)) {
453  debugScreenWrite("setResolutionPre: no change needed");
454  debugScreenWrite("setResolutionPre: success");
455  return;
456  }
457 
459 
460  debugScreenWrite("setResolutionPre: windowed mode requested");
461  frame.setUndecorated(false);
462  frame.setResizable(!fixedSize);
463  final Point centerPoint = getCenterPoint();
464  final Dimension dimension;
465  //noinspection IfMayBeConditional
466  if (resolution == null) {
467  dimension = new Dimension(currentDisplayMode.getWidth(), currentDisplayMode.getHeight());
468  } else {
469  dimension = resolution.asDimension();
470  }
471  final int x = centerPoint.x-dimension.width/2;
472  final int y = centerPoint.y-dimension.height/2;
473  if (!wasDisplayed) {
474  frame.setLocation(x, y); // try to minimize display movements
475  }
476  frame.setVisible(true);
477  final Insets frameInsets = frame.getInsets();
478  debugScreenWrite("setResolutionPre: frame insets: top="+frameInsets.top+", bottom="+frameInsets.bottom+", left="+frameInsets.left+", right="+frameInsets.right);
479 
480  final Dimension maxDimension = getMaxWindowDimension(frameInsets);
481  debugScreenWrite("setResolutionPre: maximum window dimension: "+maxDimension.width+"x"+maxDimension.height);
482  if (dimension.width > maxDimension.width || dimension.height > maxDimension.height) {
483  //noinspection VariableNotUsedInsideIf
484  if (resolution == null) {
485  final int tmpWidth = dimension.width;
486  final int tmpHeight = dimension.height;
487  dimension.width = Math.max(minResolution.getWidth()+frameInsets.left+frameInsets.right, maxDimension.width);
488  dimension.height = Math.max(minResolution.getHeight()+frameInsets.top+frameInsets.bottom, maxDimension.height);
489  debugScreenWrite("setResolutionPre: window size "+tmpWidth+"x"+tmpHeight+" exceeds maximum allowed size "+maxDimension.width+"x"+maxDimension.height+", reducing to "+dimension.width+"x"+dimension.height);
490  } else {
491  debugScreenWrite("setResolutionPre: window size "+dimension.width+"x"+dimension.height+" exceeds maximum allowed size "+maxDimension.width+"x"+maxDimension.height+", ignoring");
492  }
493  }
494 
495  if (wasDisplayed) {
496  debugScreenWrite("setResolutionPre: resizing window to "+dimension);
497  frame.setPreferredSize(dimension);
498  frame.setSize(dimension);
499  } else {
500  wasDisplayed = true;
501  final int x2 = centerPoint.x-dimension.width/2-frameInsets.left;
502  final int y2 = centerPoint.y-dimension.height/2-frameInsets.top;
503  debugScreenWrite("setResolutionPre: moving window to ("+frameInsets.left+"+"+dimension.width+"+"+frameInsets.right+")x("+frameInsets.top+"+"+dimension.height+"+"+frameInsets.bottom+")+"+x2+"+"+y2);
504  frame.setBounds(x2, y2, dimension.width+frameInsets.left+frameInsets.right, dimension.height+frameInsets.top+frameInsets.bottom);
505  }
506 
507  setResolutionPost(frame, dimension);
508  if (this.frame != null) {
509  this.frame.removeComponentListener(componentListener);
510  }
511  this.frame = frame;
512  this.frame.addComponentListener(componentListener);
515  }
516 
522  private void setResolutionPre(@NotNull final Window frame) {
523  // disable full-screen since switching from full-screen to full-screen
524  // does not work reliably
525  if (isFullScreen) {
527  }
528  setFullScreenWindow(null);
529 
530  debugScreenWrite("setResolutionPre: disposing frame");
531  frame.dispose();
532  }
533 
540  private void setResolutionPost(@NotNull final Window frame, @NotNull final Dimension dimension) {
541  debugScreenWrite("setResolutionPost: creating buffer strategy");
542  frame.createBufferStrategy(2);
543  bufferStrategy = frame.getBufferStrategy();
544 
545  final Insets insets = frame.getInsets();
546  offsetX = insets.left;
547  offsetY = insets.top;
548  debugScreenWrite("setResolutionPost: offset="+offsetX+"x"+offsetY+" insets: top="+insets.top+", bottom="+insets.bottom+", left="+insets.left+", right="+insets.right);
549 
550  debugScreenWrite("setResolutionPost: requesting focus");
551  frame.requestFocusInWindow();
552 
553  updateWindowSize(dimension.width, dimension.height);
554 
555  frame.add(layeredPane);
556  if (currentGui == null) {
557  frame.validate();
558  } else {
560  if (windowWidth > 0 && windowHeight > 0) {
561  assert currentGui != null;
563  }
564 
565  frame.validate();
567  }
568 
569  debugScreenWrite("setResolutionPost: success");
570  }
571 
577  private void updateWindowSize(final int windowWidth, final int windowHeight) {
578  if (this.windowWidth == windowWidth && this.windowHeight == windowHeight) {
579  return;
580  }
581  this.windowWidth = windowWidth;
582  this.windowHeight = windowHeight;
583  debugScreenWrite("updateWindowSize: gui size="+this.windowWidth+"x"+this.windowHeight);
584  if (currentGui != null) {
586  }
587  if (frame != null) {
588  frame.validate();
589  }
590  }
591 
597  @NotNull
598  private Dimension getMaxWindowDimension(@NotNull final Insets frameInsets) {
599  final GraphicsConfiguration graphicsConfiguration = graphicsDevice.getDefaultConfiguration();
600  final Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(graphicsConfiguration);
601  debugScreenWrite("getMaxWindowDimension: screen insets: top="+screenInsets.top+", bottom="+screenInsets.bottom+", left="+screenInsets.left+", right="+screenInsets.right);
602 
603  final int maxWidth = maximumWindowBounds.width-screenInsets.left-screenInsets.right-frameInsets.left-frameInsets.right;
604  final int maxHeight = maximumWindowBounds.height-screenInsets.top-screenInsets.bottom-frameInsets.top-frameInsets.bottom;
605  debugScreenWrite("getMaxWindowDimension: maximum window dimension: "+maxWidth+"x"+maxHeight);
606  return new Dimension(maxWidth, maxHeight);
607  }
608 
612  public void endRendering() {
613  if (isFullScreen && frame != null) {
614  if (currentGui != null) {
616  }
617  final Resolution minResolution = new Resolution(1, 1);
618  assert frame != null;
619  setWindowMode(frame, null, minResolution, false);
620  assert frame != null;
622  assert frame != null;
624  assert frame != null;
625  frame.removeComponentListener(componentListener);
626  frame = null;
627  }
628  }
629 
634  public void redraw(@NotNull final Graphics g) {
635  layeredPane.paint(g);
636  }
637 
642  public void clearGUI(@NotNull final Gui gui) {
643  setCurrentGui(gui);
644  for (int ig = 0; ig < 3; ig++) {
645  assert bufferStrategy != null;
646  final Graphics g = bufferStrategy.getDrawGraphics();
647  redrawBlack(g);
648  g.dispose();
649  assert bufferStrategy != null;
650  bufferStrategy.show();
651  }
652  }
653 
658  private void redrawBlack(@NotNull final Graphics g) {
659  g.setColor(Color.BLACK);
660  assert frame != null;
661  final int width = frame.getWidth();
662  assert frame != null;
663  final int height = frame.getHeight();
664  g.fillRect(0, 0, width, height);
665  }
666 
675  public boolean openDialog(@NotNull final Gui dialog, final boolean autoCloseOnDeactivate) {
676  if (dialog == currentGui) {
677  return false;
678  }
679 
680  if (!openDialogs.isEmpty() && openDialogs.get(openDialogs.size()-1) == dialog) {
681  dialog.autoSize(windowWidth, windowHeight);
682  return false;
683  }
684 
685  if (!openDialogsRemove(dialog)) {
686  dialog.activateDefaultElement();
687  dialog.setGuiAutoCloseListener(autoCloseOnDeactivate ? () -> closeDialog(dialog) : null);
688  }
689  openDialogsAdd(dialog);
691  return true;
692  }
693 
698  public void raiseDialog(@NotNull final Gui dialog) {
699  if (dialog == currentGui) {
700  return;
701  }
702 
703  if (!openDialogs.isEmpty() && openDialogs.get(openDialogs.size()-1) == dialog) {
704  dialog.autoSize(windowWidth, windowHeight);
705  return;
706  }
707 
708  if (!openDialogs.contains(dialog)) {
709  return;
710  }
711 
712  dialog.autoSize(windowWidth, windowHeight);
713  layeredPane.add(dialog.getComponent(), 1, 0);
714  openDialogs.remove(dialog);
715  openDialogs.add(dialog);
716  if (frame != null) {
717  frame.validate();
718  }
719 
721  }
722 
728  public boolean isDialogOpen(@NotNull final Gui dialog) {
729  return openDialogs.contains(dialog);
730  }
731 
737  @NotNull
738  public Iterable<Gui> getOpenDialogs() {
739  return OpenDialogsIterator::new;
740  }
741 
746  public void setCurrentGui(@NotNull final Gui gui) {
748  if (frame != null && currentGui != null) {
750  }
751  currentGui = gui;
752  //noinspection VariableNotUsedInsideIf
753  if (frame != null) {
755  }
756 
757  if (windowWidth > 0 && windowHeight > 0) {
758  assert currentGui != null;
759  currentGui.getComponent().setBounds(0, 0, windowWidth, windowHeight);
760  }
761  if (frame != null) {
762  frame.validate();
763  }
764  });
766  }
767 
774  public boolean closeDialog(@NotNull final Gui dialog) {
775  if (!openDialogsRemove(dialog)) {
776  return false;
777  }
778 
779  dialog.setActiveElementActive(false);
781  return true;
782  }
783 
789  public boolean toggleDialog(@NotNull final Gui dialog) {
790  if (dialog == currentGui) {
791  return true;
792  }
793 
794  if (openDialogsRemove(dialog)) {
795  dialog.setActiveElementActive(false);
797  return false;
798  }
799 
800  dialog.setGuiAutoCloseListener(null);
801  openDialogsAdd(dialog);
802  dialog.activateDefaultElement();
804  return true;
805  }
806 
811  public void setTooltip(@Nullable final Component tooltip) {
812  if (this.tooltip != null) {
813  layeredPane.remove(this.tooltip);
814  }
815  this.tooltip = tooltip;
816  if (this.tooltip != null) {
817  layeredPane.add(this.tooltip, 2, -1);
818  }
819  }
820 
825  public void setGuiState(@NotNull final RendererGuiState rendererGuiState) {
826  if (this.rendererGuiState == rendererGuiState) {
827  return;
828  }
829 
830  final RendererGuiState prevRendererGuiState = this.rendererGuiState;
831  this.rendererGuiState = rendererGuiState;
833  for (Gui dialog : openDialogs) {
834  removeFromLayeredPane(dialog.getComponent());
835  if (!dialog.isHidden(rendererGuiState)) {
836  addToLayeredPane(dialog.getComponent(), 1, 0);
837  if (dialog.isHidden(prevRendererGuiState)) {
838  dialog.notifyOpen();
839  }
840  }
841  }
842  if (frame != null) {
843  frame.validate();
844  }
845  });
848  listener.guiStateChanged(rendererGuiState);
849  }
850  }
851 
856  @NotNull
858  return rendererGuiState;
859  }
860 
866  public void addGuiStateListener(@NotNull final RendererGuiStateListener listener) {
867  rendererGuiStateListeners.add(listener);
868  }
869 
875  private void openDialogsAdd(@NotNull final Gui dialog) {
876  if (openDialogs.contains(dialog)) {
877  raiseDialog(dialog);
878  return;
879  }
880 
881  final Point mouse = frame == null ? null : frame.getMousePosition(true);
882  if (mouse == null || dialog.isHidden(rendererGuiState)) {
883  openDialogs.add(dialog);
884  if (!dialog.isHidden(rendererGuiState)) {
885  openDialogInt(dialog);
886  }
887  } else {
888  if (dialog.isWithinDrawingArea(mouse.x, mouse.y)) {
889  final MouseEvent mouseEvent = new MouseEvent(frame, 0, System.currentTimeMillis(), 0, mouse.x, mouse.y, 0, false);
890  mouseTracker.mouseExited(mouseEvent);
891  openDialogs.add(dialog);
892  assert !dialog.isHidden(rendererGuiState);
893  openDialogInt(dialog);
894  mouseTracker.mouseEntered(findElement(mouseEvent), mouseEvent);
895  } else {
896  openDialogs.add(dialog);
897  assert !dialog.isHidden(rendererGuiState);
898  openDialogInt(dialog);
899  }
900  }
901 
902  dialog.autoSize(windowWidth, windowHeight);
903  dialog.notifyOpen();
904  }
905 
910  private void openDialogInt(@NotNull final Gui dialog) {
911  addToLayeredPane(dialog.getComponent(), 1, 0);
912  if (frame != null) {
913  frame.validate();
914  }
915  }
916 
923  private boolean openDialogsRemove(@NotNull final Gui dialog) {
924  if (!openDialogs.contains(dialog)) {
925  return false;
926  }
927 
928  final Point mouse = frame == null ? null : frame.getMousePosition(true);
929  if (mouse == null) {
930  openDialogs.remove(dialog);
931  removeFromLayeredPane(dialog.getComponent());
932  if (frame != null) {
933  frame.validate();
934  // @todo too aggressive?
935  assert frame != null;
936  frame.repaint();
937  }
938  } else {
939  if (dialog.isWithinDrawingArea(mouse.x, mouse.y)) {
940  final MouseEvent mouseEvent = new MouseEvent(frame, 0, System.currentTimeMillis(), 0, mouse.x, mouse.y, 0, false);
941  mouseTracker.mouseExited(mouseEvent);
942  openDialogs.remove(dialog);
943  removeFromLayeredPane(dialog.getComponent());
944  if (frame != null) {
945  frame.validate();
946  // @todo too aggressive?
947  assert frame != null;
948  frame.repaint();
949  }
950  mouseTracker.mouseEntered(findElement(mouseEvent), mouseEvent);
951  } else {
952  openDialogs.remove(dialog);
953  removeFromLayeredPane(dialog.getComponent());
954  if (frame != null) {
955  frame.validate();
956  // @todo too aggressive?
957  assert frame != null;
958  frame.repaint();
959  }
960  }
961  }
962 
963  return true;
964  }
965 
971  public boolean deactivateCommandInput() {
972  for (Gui dialog : openDialogs) {
973  if (!dialog.isHidden(rendererGuiState)) {
974  if (dialog.deactivateCommandInput()) {
975  return true;
976  }
977  if (dialog.isModal()) {
978  return false;
979  }
980  }
981  }
982 
983  assert currentGui != null;
985  }
986 
991  @Nullable
993  for (Gui dialog : openDialogs) {
994  if (!dialog.isHidden(rendererGuiState)) {
995  final Buffer buffer = getActiveMessageBuffer(dialog);
996  if (buffer != null) {
997  return buffer;
998  }
999  if (dialog.isModal()) {
1000  return null;
1001  }
1002  }
1003  }
1004 
1005  assert currentGui != null;
1007  }
1008 
1014  @Nullable
1015  private static Buffer getActiveMessageBuffer(@NotNull final Gui gui) {
1016  final GUILog buffer = gui.getFirstElement(GUIMessageLog.class);
1017  return buffer == null ? null : buffer.getBuffer();
1018  }
1019 
1024  public void setSelectedHostname(@NotNull final String serverName) {
1025  assert currentGui != null;
1026  final GUIMetaElementList metaElementList = currentGui.getFirstElement(GUIMetaElementList.class);
1027  if (metaElementList != null) {
1028  metaElementList.setSelectedHostname(serverName);
1029  }
1030  }
1031 
1038  @Nullable
1040  // check main gui
1041  assert currentGui != null;
1042  final GUIText textArea1 = activateCommandInput(currentGui);
1043  if (textArea1 != null) {
1044  return textArea1;
1045  }
1046 
1047  // check visible dialogs
1048  for (Gui dialog : openDialogs) {
1049  if (!dialog.isHidden(rendererGuiState)) {
1050  final GUIText textArea2 = activateCommandInput(dialog);
1051  if (textArea2 != null) {
1052  openDialog(dialog, false); // raise dialog
1053  return textArea2;
1054  }
1055  }
1056  if (dialog.isModal()) {
1057  return null;
1058  }
1059  }
1060 
1061  return null;
1062  }
1063 
1069  public boolean handleKeyPress(@NotNull final KeyEvent2 e) {
1070  assert currentGui != null;
1071  return currentGui.handleKeyPress(e);
1072  }
1073 
1077  private class OpenDialogsIterator implements Iterator<Gui> {
1078 
1083  @NotNull
1084  private final ListIterator<Gui> it = openDialogs.listIterator(openDialogs.size());
1085 
1086  @Override
1087  public boolean hasNext() {
1088  return it.hasPrevious();
1089  }
1090 
1091  @NotNull
1092  @Override
1093  public Gui next() {
1094  return it.previous();
1095  }
1096 
1097  @Override
1098  public void remove() {
1099  throw new UnsupportedOperationException("remove() not implemented");
1100  }
1101 
1102  }
1103 
1108  public int getWindowWidth() {
1109  return windowWidth;
1110  }
1111 
1116  public int getWindowHeight() {
1117  return windowHeight;
1118  }
1119 
1126  @Nullable
1127  private static AbstractGUIElement findElement(@NotNull final Component component, @NotNull final MouseEvent mouseEvent) {
1128  for (Component result = component; result != null; result = result.getParent()) {
1129  if (result instanceof AbstractGUIElement) {
1130  return (AbstractGUIElement)result;
1131  }
1132  if (result instanceof JViewport) {
1133  final JViewport viewport = (JViewport)result;
1134  final Point position = viewport.getViewPosition();
1135  mouseEvent.translatePoint(-position.x, -position.y);
1136  }
1137  }
1138  return null;
1139  }
1140 
1148  @Nullable
1149  private AbstractGUIElement findElement(@NotNull final MouseEvent e) {
1150  final MouseEvent ce = e;//convertEvent(e);
1151  AbstractGUIElement elected = null;
1152 
1153  final int eX = ce.getX();
1154  final int eY = ce.getY();
1155  for (Gui dialog : openDialogs) {
1156  if (!dialog.isHidden(rendererGuiState)) {
1157  elected = getElementFromPoint(dialog, eX-dialog.getComponent().getX(), eY-dialog.getComponent().getY());
1158  //noinspection VariableNotUsedInsideIf
1159  if (elected != null) {
1160  break;
1161  }
1162  }
1163  if (dialog.isModal()) {
1164  return null;
1165  }
1166  }
1167 
1168  if (elected == null) {
1169  assert currentGui != null;
1170  elected = getElementFromPoint(currentGui, eX, eY);
1171  }
1172 
1173  return elected;
1174  }
1175 
1185  @Nullable
1186  private AbstractGUIElement getElementFromPoint(@NotNull final Gui gui, final int eX, final int eY) {
1187  final int x = eX-offsetX;
1188  final int y = eY-offsetY;
1189  return gui.getElementFromPoint(x, y);
1190  }
1191 
1196  private void debugScreenWrite(@NotNull final CharSequence message) {
1197  if (debugScreen == null) {
1198  return;
1199  }
1200 
1201  try {
1202  debugScreen.append(FORMATTER.format(LocalDateTime.now()));
1203  debugScreen.append(message);
1204  debugScreen.append("\n");
1205  debugScreen.flush();
1206  } catch (final IOException ex) {
1207  System.err.println("Cannot write screen debug: "+ex.getMessage());
1208  System.exit(1);
1209  throw new AssertionError(ex);
1210  }
1211  }
1212 
1219  private void addToLayeredPane(@NotNull final Component component, final int layer, final int index) {
1220  layeredPane.add(component, layer, index);
1221  addMouseTrackerRecursively(component);
1222  addComponent(component);
1223  }
1224 
1229  private void removeFromLayeredPane(@NotNull final Component component) {
1230  layeredPane.remove(component);
1231  removeMouseTrackerRecursively(component);
1232  removeComponent(component);
1233  }
1234 
1239  private void addMouseTracker(@NotNull final Component component) {
1240  if (component instanceof AbstractGUIElement && ((AbstractGUIElement)component).isIgnore()) {
1241  return;
1242  }
1243 
1244  component.addMouseListener(mouseInputListener);
1245  component.addMouseMotionListener(mouseInputListener);
1246  component.addMouseWheelListener(mouseWheelListener);
1247  }
1248 
1253  private void removeMouseTracker(@NotNull final Component component) {
1254  if (component instanceof AbstractGUIElement && ((AbstractGUIElement)component).isIgnore()) {
1255  return;
1256  }
1257 
1258  component.removeMouseListener(mouseInputListener);
1259  component.removeMouseMotionListener(mouseInputListener);
1260  component.removeMouseWheelListener(mouseWheelListener);
1261  }
1262 
1268  private void addMouseTrackerRecursively(@NotNull final Component component) {
1269  addMouseTracker(component);
1270  if (component instanceof Container) {
1271  final Container container = (Container)component;
1272  for (int i = 0; i < container.getComponentCount(); i++) {
1273  addMouseTrackerRecursively(container.getComponent(i));
1274  }
1275  }
1276  }
1277 
1283  private void removeMouseTrackerRecursively(@NotNull final Component component) {
1284  removeMouseTracker(component);
1285  if (component instanceof Container) {
1286  final Container container = (Container)component;
1287  for (int i = 0; i < container.getComponentCount(); i++) {
1288  removeMouseTrackerRecursively(container.getComponent(i));
1289  }
1290  }
1291  }
1292 
1297  private void addComponent(@NotNull final Component component) {
1298  //noinspection ChainOfInstanceofChecks
1299  if (component instanceof GUIMap) {
1300  final GUIMap map = (GUIMap)component;
1301  maps.add(map);
1302  }
1303  if (component instanceof GUIFloorList) {
1304  final GUIFloorList floorList = (GUIFloorList)component;
1305  floorLists.add(floorList);
1306  }
1307  if (component instanceof Container) {
1308  final Container container = (Container)component;
1309  for (int i = 0; i < container.getComponentCount(); i++) {
1310  addComponent(container.getComponent(i));
1311  }
1312  }
1313  }
1314 
1319  private void removeComponent(@NotNull final Component component) {
1320  //noinspection ChainOfInstanceofChecks
1321  if (component instanceof GUIMap) {
1322  final GUIMap map = (GUIMap)component;
1323  maps.remove(map);
1324  }
1325  if (component instanceof GUIFloorList) {
1326  final GUIFloorList floorList = (GUIFloorList)component;
1327  floorLists.remove(floorList);
1328  }
1329  if (component instanceof Container) {
1330  final Container container = (Container)component;
1331  for (int i = 0; i < container.getComponentCount(); i++) {
1332  removeComponent(container.getComponent(i));
1333  }
1334  }
1335  }
1336 
1341  public void updateServerSettings() {
1342  if (frame == null || !frame.isVisible()) {
1343  return;
1344  }
1345 
1346  final Dimension mapSize = getMapSize();
1347  crossfireServerConnection.setPreferredMapSize(mapSize.width, mapSize.height);
1349  }
1350 
1355  @NotNull
1356  private Dimension getMapSize() {
1357  int width = DEFAULT_MAP_WIDTH;
1358  int height = DEFAULT_MAP_HEIGHT;
1359  for (GUIMap map : maps) {
1360  width = Math.max(width, map.getPreferredMapWidth());
1361  height = Math.max(height, map.getPreferredMapHeight());
1362  }
1363  return new Dimension(width, height);
1364  }
1365 
1370  private int getNumLookObjects() {
1371  int minNumLookObjects = Integer.MAX_VALUE;
1372  for (GUIFloorList floorList : floorLists) {
1373  minNumLookObjects = Math.min(minNumLookObjects, floorList.getNumLookObjects());
1374  }
1375  if (minNumLookObjects < Integer.MAX_VALUE) {
1376  return minNumLookObjects;
1377  }
1378 
1379  return DEFAULT_NUM_LOOK_OBJECTS;
1380  }
1381 
1388  @Nullable
1389  public static GUIText activateCommandInput(@NotNull final Gui gui) {
1390  final GUIText textArea = gui.getFirstElement(GUIText.class);
1391  if (textArea == null) {
1392  return null;
1393  }
1394 
1395  if (!textArea.getName().equals("command")) {
1396  return null;
1397  }
1398 
1399  textArea.setActive(true);
1400  return textArea;
1401  }
1402 
1407  private boolean isDisplayChangeSupported() {
1408  final boolean result = graphicsDevice.isDisplayChangeSupported();
1409  debugScreenWrite("isDisplayChangeSupported()="+(result ? "yes" : "no"));
1410  return result;
1411  }
1412 
1417  private void setDisplayMode(@NotNull final DisplayMode displayMode) {
1418  debugScreenWrite("setDisplayMode("+displayMode.getWidth()+"x"+displayMode.getHeight()+")");
1419  graphicsDevice.setDisplayMode(displayMode);
1420  }
1421 
1426  @NotNull
1427  private DisplayMode getDisplayMode() {
1428  final DisplayMode displayMode = graphicsDevice.getDisplayMode();
1429  debugScreenWrite("getDisplayMode: "+displayMode.getWidth()+"x"+displayMode.getHeight());
1430  return displayMode;
1431  }
1432 
1438  private boolean isFullScreenSupported() {
1439  final boolean result = graphicsDevice.isFullScreenSupported();
1440  debugScreenWrite("isFullScreenSupported()="+(result ? "yes" : "no"));
1441  return result;
1442  }
1443 
1449  private void setFullScreenWindow(@Nullable final Window window) {
1450  isFullScreen = window != null;
1451  debugScreenWrite("setFullScreenWindow("+(isFullScreen ? "enter full-screen mode" : "leave full-screen mode")+")");
1452  graphicsDevice.setFullScreenWindow(window);
1453  }
1454 
1459  @NotNull
1460  private Point getCenterPoint() {
1461  final Point result = graphicsEnvironment.getCenterPoint();
1462  debugScreenWrite("getCenterPoint: "+result.x+"/"+result.y);
1463  return result;
1464  }
1465 
1466 }
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addGuiStateListener
void addGuiStateListener(@NotNull final RendererGuiStateListener listener)
Definition: JXCWindowRenderer.java:866
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeComponent
void removeComponent(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1319
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mousePressed
void mousePressed(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Definition: MouseTracker.java:185
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.closeDialog
boolean closeDialog(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:774
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2
Definition: KeyEvent2.java:34
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.graphicsDevice
final GraphicsDevice graphicsDevice
Definition: JXCWindowRenderer.java:158
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.maps
final Collection< GUIMap > maps
Definition: JXCWindowRenderer.java:271
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.wasDisplayed
boolean wasDisplayed
Definition: JXCWindowRenderer.java:304
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.gui.list.GUIFloorList
Definition: GUIFloorList.java:45
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setCurrentGui
void setCurrentGui(@NotNull final Gui gui)
Definition: JXCWindowRenderer.java:746
com.realtime.crossfire.jxclient.gui.gui.Gui
Definition: Gui.java:49
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.floorLists
final Collection< GUIFloorList > floorLists
Definition: JXCWindowRenderer.java:278
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isFullScreenSupported
boolean isFullScreenSupported()
Definition: JXCWindowRenderer.java:1438
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getMapSize
Dimension getMapSize()
Definition: JXCWindowRenderer.java:1356
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeFromLayeredPane
void removeFromLayeredPane(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1229
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.layeredPane
final Container layeredPane
Definition: JXCWindowRenderer.java:115
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setResolutionPost
void setResolutionPost(@NotNull final Window frame, @NotNull final Dimension dimension)
Definition: JXCWindowRenderer.java:540
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.activateCommandInput
GUIText activateCommandInput()
Definition: JXCWindowRenderer.java:1039
com.realtime.crossfire.jxclient.gui.log.Buffer
Definition: Buffer.java:41
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogs
final List< Gui > openDialogs
Definition: JXCWindowRenderer.java:252
com.realtime.crossfire.jxclient.gui.map
Definition: AbstractGUIMap.java:23
com.realtime.crossfire.jxclient.gui.list.GUIMetaElementList
Definition: GUIMetaElementList.java:45
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setDisplayMode
void setDisplayMode(@NotNull final DisplayMode displayMode)
Definition: JXCWindowRenderer.java:1417
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isFullScreen
boolean isFullScreen
Definition: JXCWindowRenderer.java:299
com.realtime.crossfire.jxclient.gui.misc.MouseTracker
Definition: MouseTracker.java:55
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.mouseInputListener
final MouseInputListener mouseInputListener
Definition: JXCWindowRenderer.java:176
com.realtime.crossfire.jxclient.util.EventListenerList2
Definition: EventListenerList2.java:37
com.realtime.crossfire.jxclient.gui.textinput
Definition: ActivateCommandInputCommand.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addToLayeredPane
void addToLayeredPane(@NotNull final Component component, final int layer, final int index)
Definition: JXCWindowRenderer.java:1219
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getElementFromPoint
AbstractGUIElement getElementFromPoint(@NotNull final Gui gui, final int eX, final int eY)
Definition: JXCWindowRenderer.java:1186
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.findElement
AbstractGUIElement findElement(@NotNull final MouseEvent e)
Definition: JXCWindowRenderer.java:1149
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.debugScreenWrite
void debugScreenWrite(@NotNull final CharSequence message)
Definition: JXCWindowRenderer.java:1196
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isDialogOpen
boolean isDialogOpen(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:728
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.offsetX
int offsetX
Definition: JXCWindowRenderer.java:289
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getActiveMessageBuffer
Buffer getActiveMessageBuffer()
Definition: JXCWindowRenderer.java:992
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator
Definition: JXCWindowRenderer.java:1077
com.realtime.crossfire.jxclient.gui.keybindings
Definition: InvalidKeyBindingException.java:23
com.realtime.crossfire.jxclient.gui.list.GUIItemList
Definition: GUIItemList.java:46
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getActiveMessageBuffer
static Buffer getActiveMessageBuffer(@NotNull final Gui gui)
Definition: JXCWindowRenderer.java:1015
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setFullScreenMode
boolean setFullScreenMode(@NotNull final JFrame frame, @Nullable final Resolution resolution)
Definition: JXCWindowRenderer.java:375
com.realtime.crossfire.jxclient.gui.log
Definition: Buffer.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer
Definition: JXCWindowRenderer.java:87
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.mouseTracker
final MouseTracker mouseTracker
Definition: JXCWindowRenderer.java:134
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.defaultDisplayMode
final DisplayMode defaultDisplayMode
Definition: JXCWindowRenderer.java:164
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.rendererGuiState
RendererGuiState rendererGuiState
Definition: JXCWindowRenderer.java:310
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setWindowMode
void setWindowMode(@NotNull final JFrame frame, @Nullable final Resolution resolution, @NotNull final Resolution minResolution, final boolean fixedSize)
Definition: JXCWindowRenderer.java:448
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setSelectedHostname
void setSelectedHostname(@NotNull final String serverName)
Definition: JXCWindowRenderer.java:1024
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.updateServerSettings
void updateServerSettings()
Definition: JXCWindowRenderer.java:1341
com.realtime.crossfire.jxclient.gui.list
Definition: CharacterCellRenderer.java:23
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.setPreferredMapSize
void setPreferredMapSize(int preferredMapWidth, int preferredMapHeight)
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.DEFAULT_MAP_WIDTH
static final int DEFAULT_MAP_WIDTH
Definition: JXCWindowRenderer.java:97
com.realtime.crossfire.jxclient.gui.list.GUIMetaElementList.setSelectedHostname
void setSelectedHostname(@NotNull final String serverName)
Definition: GUIMetaElementList.java:234
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getDisplayMode
DisplayMode getDisplayMode()
Definition: JXCWindowRenderer.java:1427
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getOpenDialogs
Iterable< Gui > getOpenDialogs()
Definition: JXCWindowRenderer.java:738
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseMoved
void mouseMoved(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Definition: MouseTracker.java:171
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.FORMATTER
static final DateTimeFormatter FORMATTER
Definition: JXCWindowRenderer.java:316
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.componentListener
final ComponentListener componentListener
Definition: JXCWindowRenderer.java:322
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.redraw
void redraw(@NotNull final Graphics g)
Definition: JXCWindowRenderer.java:634
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.findElement
static AbstractGUIElement findElement(@NotNull final Component component, @NotNull final MouseEvent mouseEvent)
Definition: JXCWindowRenderer.java:1127
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.currentGui
Gui currentGui
Definition: JXCWindowRenderer.java:264
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.handleKeyPress
boolean handleKeyPress(@NotNull final KeyEvent2 e)
Definition: JXCWindowRenderer.java:1069
com.realtime.crossfire.jxclient.gui.log.GUILog
Definition: GUILog.java:55
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseEntered
void mouseEntered(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Definition: MouseTracker.java:224
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection
Definition: CrossfireServerConnection.java:37
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.DEFAULT_MAP_HEIGHT
static final int DEFAULT_MAP_HEIGHT
Definition: JXCWindowRenderer.java:102
com.realtime.crossfire.jxclient.gui.gui.Gui.getComponent
JComponent getComponent()
Definition: Gui.java:161
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isDisplayChangeSupported
boolean isDisplayChangeSupported()
Definition: JXCWindowRenderer.java:1407
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.endRendering
void endRendering()
Definition: JXCWindowRenderer.java:612
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getNumLookObjects
int getNumLookObjects()
Definition: JXCWindowRenderer.java:1370
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseExited
void mouseExited(@NotNull final MouseEvent e)
Definition: MouseTracker.java:236
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getWindowHeight
int getWindowHeight()
Definition: JXCWindowRenderer.java:1116
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.updateWindowSize
void updateWindowSize(final int windowWidth, final int windowHeight)
Definition: JXCWindowRenderer.java:577
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getGuiState
RendererGuiState getGuiState()
Definition: JXCWindowRenderer.java:857
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.tooltip
Component tooltip
Definition: JXCWindowRenderer.java:284
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.DEFAULT_NUM_LOOK_OBJECTS
static final int DEFAULT_NUM_LOOK_OBJECTS
Definition: JXCWindowRenderer.java:92
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseDragged
void mouseDragged(@Nullable final GUIElement element, @NotNull final MouseEvent e)
Definition: MouseTracker.java:147
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.graphicsEnvironment
final GraphicsEnvironment graphicsEnvironment
Definition: JXCWindowRenderer.java:152
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogsAdd
void openDialogsAdd(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:875
com.realtime.crossfire.jxclient.gui.gui.Gui.getFirstElement
public< T extends GUIElement > T getFirstElement(@NotNull final Class< T > class_)
Definition: Gui.java:300
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.frame
JFrame frame
Definition: JXCWindowRenderer.java:108
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setResolutionPre
void setResolutionPre(@NotNull final Window frame)
Definition: JXCWindowRenderer.java:522
com.realtime.crossfire.jxclient.gui.gui.RendererGuiState.START
START
Definition: RendererGuiState.java:36
com.realtime.crossfire.jxclient.util.SwingUtilities2.invokeAndWait
static void invokeAndWait(@NotNull final Runnable runnable)
Definition: SwingUtilities2.java:47
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addComponent
void addComponent(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1297
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogsRemove
boolean openDialogsRemove(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:923
com.realtime.crossfire.jxclient.gui.gui.GUIElement
Definition: GUIElement.java:33
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.offsetY
int offsetY
Definition: JXCWindowRenderer.java:294
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.redrawBlack
void redrawBlack(@NotNull final Graphics g)
Definition: JXCWindowRenderer.java:658
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.mouseWheelListener
final MouseWheelListener mouseWheelListener
Definition: JXCWindowRenderer.java:219
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setGuiState
void setGuiState(@NotNull final RendererGuiState rendererGuiState)
Definition: JXCWindowRenderer.java:825
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addMouseTrackerRecursively
void addMouseTrackerRecursively(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1268
com.realtime.crossfire.jxclient.gui.gui
Definition: AbstractGUIElement.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.activateCommandInput
static GUIText activateCommandInput(@NotNull final Gui gui)
Definition: JXCWindowRenderer.java:1389
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.clearGUI
void clearGUI(@NotNull final Gui gui)
Definition: JXCWindowRenderer.java:642
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.windowWidth
int windowWidth
Definition: JXCWindowRenderer.java:240
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.crossfireServerConnection
final CrossfireServerConnection crossfireServerConnection
Definition: JXCWindowRenderer.java:140
com.realtime.crossfire
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseWheelMoved
void mouseWheelMoved(@Nullable final GUIElement element, @NotNull final MouseWheelEvent e)
Definition: MouseTracker.java:276
com.realtime.crossfire.jxclient.gui.log.GUILog.getBuffer
Buffer getBuffer()
Definition: GUILog.java:310
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.debugScreen
final Writer debugScreen
Definition: JXCWindowRenderer.java:146
com.realtime.crossfire.jxclient.gui.textinput.GUIText
Definition: GUIText.java:61
com.realtime
com.realtime.crossfire.jxclient.util.Resolution
Definition: Resolution.java:36
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialog
boolean openDialog(@NotNull final Gui dialog, final boolean autoCloseOnDeactivate)
Definition: JXCWindowRenderer.java:675
com
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getMaxWindowDimension
Dimension getMaxWindowDimension(@NotNull final Insets frameInsets)
Definition: JXCWindowRenderer.java:598
com.realtime.crossfire.jxclient.util.SwingUtilities2
Definition: SwingUtilities2.java:34
com.realtime.crossfire.jxclient.gui.map.GUIMap
Definition: GUIMap.java:48
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.bufferStrategy
BufferStrategy bufferStrategy
Definition: JXCWindowRenderer.java:235
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getCenterPoint
Point getCenterPoint()
Definition: JXCWindowRenderer.java:1460
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.raiseDialog
void raiseDialog(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:698
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseClicked
void mouseClicked(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Definition: MouseTracker.java:137
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.setActive
void setActive(final boolean active)
Definition: ActivatableGUIElement.java:115
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.windowHeight
int windowHeight
Definition: JXCWindowRenderer.java:245
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getName
String getName()
Definition: AbstractGUIElement.java:174
com.realtime.crossfire.jxclient.gui.gui.Gui.handleKeyPress
boolean handleKeyPress(@NotNull final KeyEvent2 e)
Definition: Gui.java:401
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseReleased
void mouseReleased(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Definition: MouseTracker.java:202
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogInt
void openDialogInt(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:910
com.realtime.crossfire.jxclient.gui.gui.RendererGuiState
Definition: RendererGuiState.java:31
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addMouseTracker
void addMouseTracker(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1239
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setFullScreenWindow
void setFullScreenWindow(@Nullable final Window window)
Definition: JXCWindowRenderer.java:1449
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.paintActiveComponent
void paintActiveComponent(@NotNull final Graphics g)
Definition: MouseTracker.java:290
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator.it
final ListIterator< Gui > it
Definition: JXCWindowRenderer.java:1084
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement
Definition: AbstractGUIElement.java:37
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator.next
Gui next()
Definition: JXCWindowRenderer.java:1093
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeMouseTrackerRecursively
void removeMouseTrackerRecursively(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1283
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getWindowWidth
int getWindowWidth()
Definition: JXCWindowRenderer.java:1108
com.realtime.crossfire.jxclient.gui.gui.RendererGuiStateListener
Definition: RendererGuiStateListener.java:32
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.toggleDialog
boolean toggleDialog(@NotNull final Gui dialog)
Definition: JXCWindowRenderer.java:789
com.realtime.crossfire.jxclient.gui.log.GUIMessageLog
Definition: GUIMessageLog.java:40
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator.hasNext
boolean hasNext()
Definition: JXCWindowRenderer.java:1087
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeMouseTracker
void removeMouseTracker(@NotNull final Component component)
Definition: JXCWindowRenderer.java:1253
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.JXCWindowRenderer
JXCWindowRenderer(@NotNull final MouseTracker mouseTracker, @NotNull final CrossfireServerConnection crossfireServerConnection, @Nullable final Writer debugScreen)
Definition: JXCWindowRenderer.java:357
com.realtime.crossfire.jxclient.gui.gui.Gui.deactivateCommandInput
boolean deactivateCommandInput()
Definition: Gui.java:440
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.deactivateCommandInput
boolean deactivateCommandInput()
Definition: JXCWindowRenderer.java:971
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setTooltip
void setTooltip(@Nullable final Component tooltip)
Definition: JXCWindowRenderer.java:811
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.setPreferredNumLookObjects
void setPreferredNumLookObjects(int preferredNumLookObjects)
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.rendererGuiStateListeners
final EventListenerList2< RendererGuiStateListener > rendererGuiStateListeners
Definition: JXCWindowRenderer.java:258
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.maximumWindowBounds
final Rectangle maximumWindowBounds
Definition: JXCWindowRenderer.java:170