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 final JViewport viewport) {
1133  final Point position = viewport.getViewPosition();
1134  mouseEvent.translatePoint(-position.x, -position.y);
1135  }
1136  }
1137  return null;
1138  }
1139 
1147  @Nullable
1148  private AbstractGUIElement findElement(@NotNull final MouseEvent e) {
1149  final MouseEvent ce = e;//convertEvent(e);
1150  AbstractGUIElement elected = null;
1151 
1152  final int eX = ce.getX();
1153  final int eY = ce.getY();
1154  for (Gui dialog : openDialogs) {
1155  if (!dialog.isHidden(rendererGuiState)) {
1156  elected = getElementFromPoint(dialog, eX-dialog.getComponent().getX(), eY-dialog.getComponent().getY());
1157  //noinspection VariableNotUsedInsideIf
1158  if (elected != null) {
1159  break;
1160  }
1161  }
1162  if (dialog.isModal()) {
1163  return null;
1164  }
1165  }
1166 
1167  if (elected == null) {
1168  assert currentGui != null;
1169  elected = getElementFromPoint(currentGui, eX, eY);
1170  }
1171 
1172  return elected;
1173  }
1174 
1184  @Nullable
1185  private AbstractGUIElement getElementFromPoint(@NotNull final Gui gui, final int eX, final int eY) {
1186  final int x = eX-offsetX;
1187  final int y = eY-offsetY;
1188  return gui.getElementFromPoint(x, y);
1189  }
1190 
1195  private void debugScreenWrite(@NotNull final CharSequence message) {
1196  if (debugScreen == null) {
1197  return;
1198  }
1199 
1200  try {
1201  debugScreen.append(FORMATTER.format(LocalDateTime.now()));
1202  debugScreen.append(message);
1203  debugScreen.append("\n");
1204  debugScreen.flush();
1205  } catch (final IOException ex) {
1206  System.err.println("Cannot write screen debug: "+ex.getMessage());
1207  System.exit(1);
1208  throw new AssertionError(ex);
1209  }
1210  }
1211 
1218  private void addToLayeredPane(@NotNull final Component component, final int layer, final int index) {
1219  layeredPane.add(component, layer, index);
1220  addMouseTrackerRecursively(component);
1221  addComponent(component);
1222  }
1223 
1228  private void removeFromLayeredPane(@NotNull final Component component) {
1229  layeredPane.remove(component);
1230  removeMouseTrackerRecursively(component);
1231  removeComponent(component);
1232  }
1233 
1238  private void addMouseTracker(@NotNull final Component component) {
1239  if (component instanceof AbstractGUIElement && ((AbstractGUIElement)component).isIgnore()) {
1240  return;
1241  }
1242 
1243  component.addMouseListener(mouseInputListener);
1244  component.addMouseMotionListener(mouseInputListener);
1245  component.addMouseWheelListener(mouseWheelListener);
1246  }
1247 
1252  private void removeMouseTracker(@NotNull final Component component) {
1253  if (component instanceof AbstractGUIElement && ((AbstractGUIElement)component).isIgnore()) {
1254  return;
1255  }
1256 
1257  component.removeMouseListener(mouseInputListener);
1258  component.removeMouseMotionListener(mouseInputListener);
1259  component.removeMouseWheelListener(mouseWheelListener);
1260  }
1261 
1267  private void addMouseTrackerRecursively(@NotNull final Component component) {
1268  addMouseTracker(component);
1269  if (component instanceof final Container container) {
1270  for (int i = 0; i < container.getComponentCount(); i++) {
1271  addMouseTrackerRecursively(container.getComponent(i));
1272  }
1273  }
1274  }
1275 
1281  private void removeMouseTrackerRecursively(@NotNull final Component component) {
1282  removeMouseTracker(component);
1283  if (component instanceof final Container container) {
1284  for (int i = 0; i < container.getComponentCount(); i++) {
1285  removeMouseTrackerRecursively(container.getComponent(i));
1286  }
1287  }
1288  }
1289 
1294  private void addComponent(@NotNull final Component component) {
1295  //noinspection ChainOfInstanceofChecks
1296  if (component instanceof final GUIMap map) {
1297  maps.add(map);
1298  }
1299  if (component instanceof final GUIFloorList floorList) {
1300  floorLists.add(floorList);
1301  }
1302  if (component instanceof final Container container) {
1303  for (int i = 0; i < container.getComponentCount(); i++) {
1304  addComponent(container.getComponent(i));
1305  }
1306  }
1307  }
1308 
1313  private void removeComponent(@NotNull final Component component) {
1314  //noinspection ChainOfInstanceofChecks
1315  if (component instanceof final GUIMap map) {
1316  maps.remove(map);
1317  }
1318  if (component instanceof final GUIFloorList floorList) {
1319  floorLists.remove(floorList);
1320  }
1321  if (component instanceof final Container container) {
1322  for (int i = 0; i < container.getComponentCount(); i++) {
1323  removeComponent(container.getComponent(i));
1324  }
1325  }
1326  }
1327 
1332  public void updateServerSettings() {
1333  if (frame == null || !frame.isVisible()) {
1334  return;
1335  }
1336 
1337  final Dimension mapSize = getMapSize();
1338  crossfireServerConnection.setPreferredMapSize(mapSize.width, mapSize.height);
1340  }
1341 
1346  @NotNull
1347  private Dimension getMapSize() {
1348  int width = DEFAULT_MAP_WIDTH;
1349  int height = DEFAULT_MAP_HEIGHT;
1350  for (GUIMap map : maps) {
1351  width = Math.max(width, map.getPreferredMapWidth());
1352  height = Math.max(height, map.getPreferredMapHeight());
1353  }
1354  return new Dimension(width, height);
1355  }
1356 
1361  private int getNumLookObjects() {
1362  int minNumLookObjects = Integer.MAX_VALUE;
1363  for (GUIFloorList floorList : floorLists) {
1364  minNumLookObjects = Math.min(minNumLookObjects, floorList.getNumLookObjects());
1365  }
1366  if (minNumLookObjects < Integer.MAX_VALUE) {
1367  return minNumLookObjects;
1368  }
1369 
1370  return DEFAULT_NUM_LOOK_OBJECTS;
1371  }
1372 
1379  @Nullable
1380  public static GUIText activateCommandInput(@NotNull final Gui gui) {
1381  final GUIText textArea = gui.getFirstElement(GUIText.class);
1382  if (textArea == null) {
1383  return null;
1384  }
1385 
1386  if (!textArea.getName().equals("command")) {
1387  return null;
1388  }
1389 
1390  textArea.setActive(true);
1391  return textArea;
1392  }
1393 
1398  private boolean isDisplayChangeSupported() {
1399  final boolean result = graphicsDevice.isDisplayChangeSupported();
1400  debugScreenWrite("isDisplayChangeSupported()="+(result ? "yes" : "no"));
1401  return result;
1402  }
1403 
1408  private void setDisplayMode(@NotNull final DisplayMode displayMode) {
1409  debugScreenWrite("setDisplayMode("+displayMode.getWidth()+"x"+displayMode.getHeight()+")");
1410  graphicsDevice.setDisplayMode(displayMode);
1411  }
1412 
1417  @NotNull
1418  private DisplayMode getDisplayMode() {
1419  final DisplayMode displayMode = graphicsDevice.getDisplayMode();
1420  debugScreenWrite("getDisplayMode: "+displayMode.getWidth()+"x"+displayMode.getHeight());
1421  return displayMode;
1422  }
1423 
1429  private boolean isFullScreenSupported() {
1430  final boolean result = graphicsDevice.isFullScreenSupported();
1431  debugScreenWrite("isFullScreenSupported()="+(result ? "yes" : "no"));
1432  return result;
1433  }
1434 
1440  private void setFullScreenWindow(@Nullable final Window window) {
1441  isFullScreen = window != null;
1442  debugScreenWrite("setFullScreenWindow("+(isFullScreen ? "enter full-screen mode" : "leave full-screen mode")+")");
1443  graphicsDevice.setFullScreenWindow(window);
1444  }
1445 
1450  @NotNull
1451  private Point getCenterPoint() {
1452  final Point result = graphicsEnvironment.getCenterPoint();
1453  debugScreenWrite("getCenterPoint: "+result.x+"/"+result.y);
1454  return result;
1455  }
1456 
1457 }
com.realtime.crossfire.jxclient.gui.textinput.GUIText
Abstract base class for text input fields.
Definition: GUIText.java:61
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.raiseDialog
void raiseDialog(@NotNull final Gui dialog)
Raises an already opened dialog.
Definition: JXCWindowRenderer.java:698
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addMouseTrackerRecursively
void addMouseTrackerRecursively(@NotNull final Component component)
Adds mouseTracker recursively to all children of a Component.
Definition: JXCWindowRenderer.java:1267
com.realtime.crossfire.jxclient.util.SwingUtilities2
Utility class for Swing related functions.
Definition: SwingUtilities2.java:34
com.realtime.crossfire.jxclient
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setResolutionPre
void setResolutionPre(@NotNull final Window frame)
Tries to switch to the given resolution.
Definition: JXCWindowRenderer.java:522
com.realtime.crossfire.jxclient.gui.gui.Gui
Combines a list of GUIElements to for a gui.
Definition: Gui.java:49
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogInt
void openDialogInt(@NotNull final Gui dialog)
Opens a dialog.
Definition: JXCWindowRenderer.java:910
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.maps
final Collection< GUIMap > maps
All GUIMap instances that currentGui and openDialogs contain.
Definition: JXCWindowRenderer.java:271
com.realtime.crossfire.jxclient.server
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addComponent
void addComponent(@NotNull final Component component)
Adds a Component.
Definition: JXCWindowRenderer.java:1294
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getMaxWindowDimension
Dimension getMaxWindowDimension(@NotNull final Insets frameInsets)
Returns the maximum dimension of a frame to fit on the screen.
Definition: JXCWindowRenderer.java:598
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.crossfireServerConnection
final CrossfireServerConnection crossfireServerConnection
The CrossfireServerConnection to monitor.
Definition: JXCWindowRenderer.java:140
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mousePressed
void mousePressed(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Handles a mouse pressed event.
Definition: MouseTracker.java:185
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.setPreferredNumLookObjects
void setPreferredNumLookObjects(int preferredNumLookObjects)
Sets the maximum number of objects in the ground view.
com.realtime.crossfire.jxclient.gui.gui.RendererGuiState.START
START
The start screen is active.
Definition: RendererGuiState.java:36
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.endRendering
void endRendering()
Ends rendering and reverts the display settings.
Definition: JXCWindowRenderer.java:612
com.realtime.crossfire.jxclient.gui.log.GUILog
Abstract base class for gui elements implementing text fields.
Definition: GUILog.java:55
com.realtime.crossfire.jxclient.gui.log.GUILog.getBuffer
Buffer getBuffer()
Returns the Buffer instance containing the text messages.
Definition: GUILog.java:310
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection
Adds encoding/decoding of crossfire protocol packets to a ServerConnection.
Definition: CrossfireServerConnection.java:37
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.graphicsDevice
final GraphicsDevice graphicsDevice
The used GraphicsDevice.
Definition: JXCWindowRenderer.java:158
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setCurrentGui
void setCurrentGui(@NotNull final Gui gui)
Sets the Gui to display.
Definition: JXCWindowRenderer.java:746
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.maximumWindowBounds
final Rectangle maximumWindowBounds
The maximal size of a window.
Definition: JXCWindowRenderer.java:170
com.realtime.crossfire.jxclient.gui.gui.Gui.handleKeyPress
boolean handleKeyPress(@NotNull final KeyEvent2 e)
Dispatches a key press KeyEvent.
Definition: Gui.java:389
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.windowHeight
int windowHeight
The height of the client area in pixels.
Definition: JXCWindowRenderer.java:245
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.offsetY
int offsetY
The y-offset of the visible window.
Definition: JXCWindowRenderer.java:294
com.realtime.crossfire.jxclient.gui.map
Definition: AbstractGUIMap.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogsRemove
boolean openDialogsRemove(@NotNull final Gui dialog)
Removes a dialog from openDialogs.
Definition: JXCWindowRenderer.java:923
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setFullScreenMode
boolean setFullScreenMode(@NotNull final JFrame frame, @Nullable final Resolution resolution)
Tries to switch to the given resolution.
Definition: JXCWindowRenderer.java:375
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isFullScreen
boolean isFullScreen
Records whether full-screen mode is active.
Definition: JXCWindowRenderer.java:299
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement
Abstract base class for GUI elements to be shown in Guis.
Definition: AbstractGUIElement.java:37
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isDialogOpen
boolean isDialogOpen(@NotNull final Gui dialog)
Returns whether a given dialog is currently visible.
Definition: JXCWindowRenderer.java:728
com.realtime.crossfire.jxclient.gui.textinput
Definition: ActivateCommandInputCommand.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator.next
Gui next()
Definition: JXCWindowRenderer.java:1093
com.realtime.crossfire.jxclient.gui.list.GUIMetaElementList.setSelectedHostname
void setSelectedHostname(@NotNull final String serverName)
Select an entry by server name.
Definition: GUIMetaElementList.java:234
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setResolutionPost
void setResolutionPost(@NotNull final Window frame, @NotNull final Dimension dimension)
Tries to switch to the given resolution.
Definition: JXCWindowRenderer.java:540
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.findElement
AbstractGUIElement findElement(@NotNull final MouseEvent e)
Finds the gui element for a given MouseEvent.
Definition: JXCWindowRenderer.java:1148
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.mouseWheelListener
final MouseWheelListener mouseWheelListener
A MouseInputListener that forwards to mouseTracker.
Definition: JXCWindowRenderer.java:219
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator.it
final ListIterator< Gui > it
The backing list iterator; it returns the elements in reversed order.
Definition: JXCWindowRenderer.java:1084
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setSelectedHostname
void setSelectedHostname(@NotNull final String serverName)
Selects a server entry.
Definition: JXCWindowRenderer.java:1024
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setTooltip
void setTooltip(@Nullable final Component tooltip)
Sets the tooltip to use, or.
Definition: JXCWindowRenderer.java:811
com.realtime.crossfire.jxclient.gui.keybindings
Definition: InvalidKeyBindingException.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getOpenDialogs
Iterable< Gui > getOpenDialogs()
Returns all open dialogs in reverse painting order; the first element is the top-most dialog.
Definition: JXCWindowRenderer.java:738
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.paintActiveComponent
void paintActiveComponent(@NotNull final Graphics g)
Marks the active component in a Graphics instance.
Definition: MouseTracker.java:290
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.DEFAULT_MAP_WIDTH
static final int DEFAULT_MAP_WIDTH
The default map width to request from the server.
Definition: JXCWindowRenderer.java:97
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseExited
void mouseExited(@NotNull final MouseEvent e)
Handles a mouse exited event.
Definition: MouseTracker.java:236
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isDisplayChangeSupported
boolean isDisplayChangeSupported()
Returns the graphicsDevice supports low-level display changes.
Definition: JXCWindowRenderer.java:1398
com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection.setPreferredMapSize
void setPreferredMapSize(int preferredMapWidth, int preferredMapHeight)
Sets the preferred map size.
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getElementFromPoint
AbstractGUIElement getElementFromPoint(@NotNull final Gui gui, final int eX, final int eY)
Determines the GUIElement for a given coordinate with a given Gui instance.
Definition: JXCWindowRenderer.java:1185
com.realtime.crossfire.jxclient.gui.keybindings.KeyEvent2
Represents a pressed or released key.
Definition: KeyEvent2.java:34
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getWindowHeight
int getWindowHeight()
Returns the height of the client area.
Definition: JXCWindowRenderer.java:1116
com.realtime.crossfire.jxclient.gui.log.GUIMessageLog
A gui element implementing the message window.
Definition: GUIMessageLog.java:40
com.realtime.crossfire.jxclient.util.EventListenerList2
A list of event listeners.
Definition: EventListenerList2.java:37
com.realtime.crossfire.jxclient.gui.log
Definition: Buffer.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.redraw
void redraw(@NotNull final Graphics g)
Paints the view into the given graphics instance.
Definition: JXCWindowRenderer.java:634
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeMouseTracker
void removeMouseTracker(@NotNull final Component component)
Removes mouseTracker from a Component.
Definition: JXCWindowRenderer.java:1252
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setDisplayMode
void setDisplayMode(@NotNull final DisplayMode displayMode)
Sets the display mode of the graphicsDevice.
Definition: JXCWindowRenderer.java:1408
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addToLayeredPane
void addToLayeredPane(@NotNull final Component component, final int layer, final int index)
Adds a component to layeredPane.
Definition: JXCWindowRenderer.java:1218
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseMoved
void mouseMoved(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Handles a mouse moved event.
Definition: MouseTracker.java:171
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.deactivateCommandInput
boolean deactivateCommandInput()
Deactivates the command input text field.
Definition: JXCWindowRenderer.java:971
com.realtime.crossfire.jxclient.gui.list
Definition: CharacterCellRenderer.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator
An Iterator that returns all open dialogs in painting order.
Definition: JXCWindowRenderer.java:1077
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)
Tries to switch to the given resolution.
Definition: JXCWindowRenderer.java:448
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.handleKeyPress
boolean handleKeyPress(@NotNull final KeyEvent2 e)
Dispatches a key press KeyEvent.
Definition: JXCWindowRenderer.java:1069
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.OpenDialogsIterator.hasNext
boolean hasNext()
Definition: JXCWindowRenderer.java:1087
com.realtime.crossfire.jxclient.gui.gui.GUIElement
Interface defining an abstract GUI element.
Definition: GUIElement.java:33
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getWindowWidth
int getWindowWidth()
Returns the width of the client area.
Definition: JXCWindowRenderer.java:1108
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.mouseInputListener
final MouseInputListener mouseInputListener
A MouseInputListener that forwards to mouseTracker.
Definition: JXCWindowRenderer.java:176
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.tooltip
Component tooltip
The tooltip to use, or.
Definition: JXCWindowRenderer.java:284
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseClicked
void mouseClicked(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Handles a mouse clicked event.
Definition: MouseTracker.java:137
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.debugScreenWrite
void debugScreenWrite(@NotNull final CharSequence message)
Writes a message to the screen debug.
Definition: JXCWindowRenderer.java:1195
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.mouseTracker
final MouseTracker mouseTracker
The MouseTracker instance.
Definition: JXCWindowRenderer.java:134
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getMapSize
Dimension getMapSize()
Returns the map size in squares.
Definition: JXCWindowRenderer.java:1347
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getNumLookObjects
int getNumLookObjects()
Returns the number of ground view objects to request from the server.
Definition: JXCWindowRenderer.java:1361
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.bufferStrategy
BufferStrategy bufferStrategy
The current BufferStrategy.
Definition: JXCWindowRenderer.java:235
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.componentListener
final ComponentListener componentListener
The ComponentListener attached to frame.
Definition: JXCWindowRenderer.java:322
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.FORMATTER
static final DateTimeFormatter FORMATTER
A formatter for timestamps.
Definition: JXCWindowRenderer.java:316
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeMouseTrackerRecursively
void removeMouseTrackerRecursively(@NotNull final Component component)
Removes mouseTracker recursively from all children of a Component.
Definition: JXCWindowRenderer.java:1281
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setGuiState
void setGuiState(@NotNull final RendererGuiState rendererGuiState)
Sets the current gui state.
Definition: JXCWindowRenderer.java:825
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogsAdd
void openDialogsAdd(@NotNull final Gui dialog)
Adds a dialog to openDialogs.
Definition: JXCWindowRenderer.java:875
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialog
boolean openDialog(@NotNull final Gui dialog, final boolean autoCloseOnDeactivate)
Opens a dialog.
Definition: JXCWindowRenderer.java:675
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getActiveMessageBuffer
static Buffer getActiveMessageBuffer(@NotNull final Gui gui)
Returns the active message buffer for a Gui instance.
Definition: JXCWindowRenderer.java:1015
com.realtime.crossfire.jxclient.gui
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.updateWindowSize
void updateWindowSize(final int windowWidth, final int windowHeight)
Updates the window size for rendering from the main window size.
Definition: JXCWindowRenderer.java:577
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.currentGui
Gui currentGui
The currently displayed Gui.
Definition: JXCWindowRenderer.java:264
com.realtime.crossfire.jxclient.gui.log.Buffer
Manages the contents of the contents of a log window.
Definition: Buffer.java:41
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer
Renders a Gui instance into a Frame.
Definition: JXCWindowRenderer.java:87
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseDragged
void mouseDragged(@Nullable final GUIElement element, @NotNull final MouseEvent e)
Handles a mouse dragged event.
Definition: MouseTracker.java:147
com.realtime.crossfire.jxclient.gui.list.GUIItemList
A GUIList instance that displays GUIItemItem instances.
Definition: GUIItemList.java:46
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.windowWidth
int windowWidth
The width of the client area in pixels.
Definition: JXCWindowRenderer.java:240
com.realtime.crossfire.jxclient.util.Resolution
Information about JXClient's screen/window resolution.
Definition: Resolution.java:36
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.DEFAULT_MAP_HEIGHT
static final int DEFAULT_MAP_HEIGHT
The default map height to request from the server.
Definition: JXCWindowRenderer.java:102
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addGuiStateListener
void addGuiStateListener(@NotNull final RendererGuiStateListener listener)
Adds a gui state listener to be notified about rendererGuiState changes.
Definition: JXCWindowRenderer.java:866
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.layeredPane
final Container layeredPane
The JLayeredPane added as the top-level component to frame.
Definition: JXCWindowRenderer.java:115
com.realtime.crossfire.jxclient.util
Definition: Codec.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.rendererGuiStateListeners
final EventListenerList2< RendererGuiStateListener > rendererGuiStateListeners
Listeners to be notified about rendererGuiState changes.
Definition: JXCWindowRenderer.java:258
com.realtime.crossfire.jxclient.server.crossfire
Definition: AbstractCrossfireServerConnection.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.updateServerSettings
void updateServerSettings()
Updates server based settings to current screen size.
Definition: JXCWindowRenderer.java:1332
com.realtime.crossfire.jxclient.gui.gui.Gui.getComponent
JComponent getComponent()
Returns the JComponent for this instance.
Definition: Gui.java:161
com.realtime.crossfire.jxclient.gui.map.GUIMap
Display the map view.
Definition: GUIMap.java:48
com.realtime.crossfire.jxclient.gui.gui.AbstractGUIElement.getName
String getName()
Returns the internal name of this gui element.
Definition: AbstractGUIElement.java:174
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseWheelMoved
void mouseWheelMoved(@Nullable final GUIElement element, @NotNull final MouseWheelEvent e)
Handles a mouse wheel event.
Definition: MouseTracker.java:276
com.realtime.crossfire.jxclient.gui.gui
Definition: AbstractGUIElement.java:23
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.frame
JFrame frame
The associated JFrame.
Definition: JXCWindowRenderer.java:108
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.clearGUI
void clearGUI(@NotNull final Gui gui)
Sets a gui to display and clears the display.
Definition: JXCWindowRenderer.java:642
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.setFullScreenWindow
void setFullScreenWindow(@Nullable final Window window)
Enter full-screen mode, or return to windowed mode.
Definition: JXCWindowRenderer.java:1440
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.floorLists
final Collection< GUIFloorList > floorLists
The GUIItemList instances that currentGui and openDialogs contain and that display floor items.
Definition: JXCWindowRenderer.java:278
com.realtime.crossfire
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.debugScreen
final Writer debugScreen
The Writer to write screen debug to or.
Definition: JXCWindowRenderer.java:146
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeComponent
void removeComponent(@NotNull final Component component)
Removes a Component.
Definition: JXCWindowRenderer.java:1313
com.realtime
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.closeDialog
boolean closeDialog(@NotNull final Gui dialog)
Closes a dialog.
Definition: JXCWindowRenderer.java:774
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getDisplayMode
DisplayMode getDisplayMode()
Returns the current display mode of the graphicsDevice.
Definition: JXCWindowRenderer.java:1418
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.activateCommandInput
GUIText activateCommandInput()
Activates the command input text field.
Definition: JXCWindowRenderer.java:1039
com
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.findElement
static AbstractGUIElement findElement(@NotNull final Component component, @NotNull final MouseEvent mouseEvent)
Finds the gui element a given Component is part of.
Definition: JXCWindowRenderer.java:1127
com.realtime.crossfire.jxclient.gui.gui.Gui.getFirstElement
public< T extends GUIElement > T getFirstElement(@NotNull final Class< T > class_)
Returns the first gui element of this gui belonging to the given class.
Definition: Gui.java:291
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.JXCWindowRenderer
JXCWindowRenderer(@NotNull final MouseTracker mouseTracker, @NotNull final CrossfireServerConnection crossfireServerConnection, @Nullable final Writer debugScreen)
Creates a new instance.
Definition: JXCWindowRenderer.java:357
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getGuiState
RendererGuiState getGuiState()
Returns the current gui state.
Definition: JXCWindowRenderer.java:857
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getActiveMessageBuffer
Buffer getActiveMessageBuffer()
Returns the active message buffer.
Definition: JXCWindowRenderer.java:992
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.removeFromLayeredPane
void removeFromLayeredPane(@NotNull final Component component)
Removes a component from layeredPane.
Definition: JXCWindowRenderer.java:1228
com.realtime.crossfire.jxclient.gui.gui.Gui.deactivateCommandInput
boolean deactivateCommandInput()
Deactivates the command text input field of this dialog.
Definition: Gui.java:428
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.getCenterPoint
Point getCenterPoint()
Returns the Point where windows should be centered.
Definition: JXCWindowRenderer.java:1451
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseEntered
void mouseEntered(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Handles a mouse entered event.
Definition: MouseTracker.java:224
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.isFullScreenSupported
boolean isFullScreenSupported()
Returns whether the graphicsDevice supports full-screen exclusive mode.
Definition: JXCWindowRenderer.java:1429
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.offsetX
int offsetX
The x-offset of the visible window.
Definition: JXCWindowRenderer.java:289
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.openDialogs
final List< Gui > openDialogs
Currently opened dialogs.
Definition: JXCWindowRenderer.java:252
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.rendererGuiState
RendererGuiState rendererGuiState
The current gui state.
Definition: JXCWindowRenderer.java:310
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.redrawBlack
void redrawBlack(@NotNull final Graphics g)
Repaints all to black.
Definition: JXCWindowRenderer.java:658
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.graphicsEnvironment
final GraphicsEnvironment graphicsEnvironment
The used GraphicsEnvironment.
Definition: JXCWindowRenderer.java:152
com.realtime.crossfire.jxclient.gui.gui.ActivatableGUIElement.setActive
void setActive(final boolean active)
Sets the active state of a GUI element.
Definition: ActivatableGUIElement.java:115
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.addMouseTracker
void addMouseTracker(@NotNull final Component component)
Adds mouseTracker to a Component.
Definition: JXCWindowRenderer.java:1238
com.realtime.crossfire.jxclient.util.SwingUtilities2.invokeAndWait
static void invokeAndWait(@NotNull final Runnable runnable)
Calls SwingUtilities#invokeAndWait(Runnable) if not on the EDT or calls the Runnable directly if on t...
Definition: SwingUtilities2.java:47
com.realtime.crossfire.jxclient.gui.misc.MouseTracker.mouseReleased
void mouseReleased(@Nullable final AbstractGUIElement element, @NotNull final MouseEvent e)
Handles a mouse released event.
Definition: MouseTracker.java:202
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.toggleDialog
boolean toggleDialog(@NotNull final Gui dialog)
Toggles a dialog: if the dialog is not shown, show it; else hide it.
Definition: JXCWindowRenderer.java:789
com.realtime.crossfire.jxclient.gui.gui.RendererGuiStateListener
Interface for listeners interested in gui state changes.
Definition: RendererGuiStateListener.java:32
com.realtime.crossfire.jxclient.gui.list.GUIFloorList
A GUIItemList for floor views.
Definition: GUIFloorList.java:45
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.DEFAULT_NUM_LOOK_OBJECTS
static final int DEFAULT_NUM_LOOK_OBJECTS
The default number of ground view objects.
Definition: JXCWindowRenderer.java:92
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.wasDisplayed
boolean wasDisplayed
Records whether the frame has been displayed before.
Definition: JXCWindowRenderer.java:304
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.defaultDisplayMode
final DisplayMode defaultDisplayMode
The default screen mode that was active when the client did start.
Definition: JXCWindowRenderer.java:164
com.realtime.crossfire.jxclient.gui.list.GUIMetaElementList
A GUIList that tracks a Metaserver instance.
Definition: GUIMetaElementList.java:45
com.realtime.crossfire.jxclient.gui.gui.RendererGuiState
All gui states of JXCWindowRenderer.
Definition: RendererGuiState.java:31
com.realtime.crossfire.jxclient.gui.misc.MouseTracker
Tracks mouse actions and delivers mouse events to affected GUIElement.
Definition: MouseTracker.java:55
com.realtime.crossfire.jxclient.gui.misc.JXCWindowRenderer.activateCommandInput
static GUIText activateCommandInput(@NotNull final Gui gui)
Returns the first command text field of a gui and make it active.
Definition: JXCWindowRenderer.java:1380