Crossfire JXClient, Trunk
RenderState.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.log;
24 
25 import java.util.Collection;
26 import org.jetbrains.annotations.NotNull;
27 
35 public class RenderState {
36 
40  @NotNull
41  private final Object sync = new Object();
42 
46  private int height = 1;
47 
52  private int topIndex;
53 
61  private int topOffset = -height;
62 
66  private int scrollPos;
67 
71  private boolean canScrollUp;
72 
76  private boolean canScrollDown;
77 
81  private boolean mustRepaint = true;
82 
88  public void setHeight(@NotNull final Buffer buffer, final int h) {
89  final int bufferHeight = buffer.getTotalHeight();
90  synchronized (sync) {
91  final int oldHeight = height;
92  height = h;
93  if (bufferHeight <= height) {
94  scrollPos = 0;
95  topIndex = 0;
96  topOffset = 0;
97  canScrollUp = false;
98  canScrollDown = false;
99  } else if (topOffset < 0 || scrollPos > bufferHeight-height || scrollPos == bufferHeight-oldHeight) {
100  scrollToBottom(buffer);
101  }
102  }
103  }
104 
110  public void update(@NotNull final Buffer buffer, final int oldBufferHeight) {
111  final int bufferHeight = buffer.getTotalHeight();
112  synchronized (sync) {
113  if (bufferHeight <= height) {
114  scrollPos = 0;
115  topIndex = 0;
116  topOffset = 0;
117  canScrollUp = false;
118  canScrollDown = false;
119  } else if (topOffset < 0 || scrollPos > bufferHeight-height || scrollPos == oldBufferHeight-height) {
120  scrollToBottom(buffer);
121  }
122  mustRepaint = true;
123  }
124  }
125 
130  public void linesAdded(@NotNull final Buffer buffer) {
131  synchronized (sync) {
132  if (topOffset < 0) {
133  scrollToBottom(buffer);
134  } else if (!canScrollDown) {
135  scrollToBottom(buffer);
136  mustRepaint = true;
137  } else {
138  mustRepaint = true;
139  }
140  }
141  }
142 
147  public void linesReplaced(@NotNull final Buffer buffer) {
148  synchronized (sync) {
149  if (topOffset < 0 || !canScrollDown) {
150  scrollToBottom(buffer);
151  }
152  mustRepaint = true;
153  }
154  }
155 
161  public void linesRemoved(@NotNull final Buffer buffer, @NotNull final Collection<Line> lines) {
162  final int bufferHeight = buffer.getTotalHeight();
163  synchronized (sync) {
164  if (bufferHeight <= height) {
165  scrollPos = 0;
166  topIndex = 0;
167  topOffset = 0;
168  canScrollUp = false;
169  canScrollDown = false;
170  mustRepaint = true;
171  } else {
172  for (Line line : lines) {
173  scrollPos -= line.getHeight();
174  }
175  topIndex -= lines.size();
176  if (scrollPos < 0) {
177  scrollPos = 0;
178  topIndex = 0;
179  topOffset = 0;
180  canScrollUp = false;
181  mustRepaint = true;
182  } else {
183  assert topIndex >= 0;
184  // canScrollUp is unaffected
185  }
186  // canScrollDown is unaffected
187  }
188  }
189  }
190 
195  public int getHeight() {
196  synchronized (sync) {
197  return height;
198  }
199  }
200 
205  public int getTopIndex() {
206  synchronized (sync) {
207  return topIndex;
208  }
209  }
210 
215  public int getTopOffset() {
216  synchronized (sync) {
217  return topOffset;
218  }
219  }
220 
225  public int getScrollPos() {
226  synchronized (sync) {
227  return scrollPos;
228  }
229  }
230 
235  public boolean canScrollUp() {
236  synchronized (sync) {
237  return canScrollUp;
238  }
239  }
240 
245  public boolean canScrollDown() {
246  synchronized (sync) {
247  return canScrollDown;
248  }
249  }
250 
258  public boolean mustRepaint() {
259  synchronized (sync) {
260  final boolean result = mustRepaint;
261  mustRepaint = false;
262  return result;
263  }
264  }
265 
271  public void scrollTo(@NotNull final Buffer buffer, final int y) {
272  final int bufferHeight = buffer.getTotalHeight();
273  synchronized (sync) {
274  if (bufferHeight > height) {
275  scrollPos = Math.max(Math.min(y, bufferHeight-height), 0);
276  topIndex = 0;
277  int yPos = scrollPos;
278  while (yPos > 0) {
279  final int lineHeight = buffer.getLine(topIndex).getHeight();
280  if (yPos < lineHeight) {
281  break;
282  }
283 
284  yPos -= lineHeight;
285  topIndex++;
286  }
287  assert yPos >= 0;
288  topOffset = yPos;
289  canScrollUp = topIndex > 0 || topOffset > 0;
290  canScrollDown = y+height < bufferHeight;
291  //} else {
292  // ignore
293  }
294  }
295  }
296 
301  public void scrollToBottom(@NotNull final Buffer buffer) {
302  final int bufferHeight = buffer.getTotalHeight();
303  synchronized (sync) {
304  if (bufferHeight <= height) {
305  scrollPos = 0;
306  topIndex = 0;
307  topOffset = 0;
308  canScrollUp = false;
309  } else {
310  scrollPos = bufferHeight-height;
311  topIndex = buffer.size();
312  int y = height;
313  while (y > 0) {
314  topIndex--;
315  assert topIndex >= 0;
316  y -= buffer.getLine(topIndex).getHeight();
317  }
318  topOffset = -y;
319  canScrollUp = topIndex > 0 || topOffset > 0;
320  }
321  canScrollDown = false;
322  }
323  }
324 
325 }
com.realtime.crossfire.jxclient.gui.log.RenderState.mustRepaint
boolean mustRepaint()
Definition: RenderState.java:258
com.realtime.crossfire.jxclient.gui.log.RenderState.topOffset
int topOffset
Definition: RenderState.java:61
com.realtime.crossfire.jxclient.gui.log.RenderState.update
void update(@NotNull final Buffer buffer, final int oldBufferHeight)
Definition: RenderState.java:110
com.realtime.crossfire.jxclient.gui.log.RenderState.canScrollDown
boolean canScrollDown
Definition: RenderState.java:76
com.realtime.crossfire.jxclient.gui.log.RenderState.canScrollDown
boolean canScrollDown()
Definition: RenderState.java:245
com.realtime.crossfire.jxclient.gui.log.Line
Definition: Line.java:39
com.realtime.crossfire.jxclient.gui.log.Buffer
Definition: Buffer.java:41
com.realtime.crossfire.jxclient.gui.log.RenderState.scrollToBottom
void scrollToBottom(@NotNull final Buffer buffer)
Definition: RenderState.java:301
com.realtime.crossfire.jxclient.gui.log.RenderState.linesRemoved
void linesRemoved(@NotNull final Buffer buffer, @NotNull final Collection< Line > lines)
Definition: RenderState.java:161
com.realtime.crossfire.jxclient.gui.log.RenderState.height
int height
Definition: RenderState.java:46
com.realtime.crossfire.jxclient.gui.log.RenderState.canScrollUp
boolean canScrollUp()
Definition: RenderState.java:235
com.realtime.crossfire.jxclient.gui.log.RenderState.canScrollUp
boolean canScrollUp
Definition: RenderState.java:71
com.realtime.crossfire.jxclient.gui.log.RenderState.sync
final Object sync
Definition: RenderState.java:41
com.realtime.crossfire.jxclient.gui.log.RenderState.topIndex
int topIndex
Definition: RenderState.java:52
com.realtime.crossfire.jxclient.gui.log.RenderState.scrollPos
int scrollPos
Definition: RenderState.java:66
com.realtime.crossfire.jxclient.gui.log.RenderState.getTopIndex
int getTopIndex()
Definition: RenderState.java:205
com.realtime.crossfire.jxclient.gui.log.RenderState.getTopOffset
int getTopOffset()
Definition: RenderState.java:215
com.realtime.crossfire.jxclient.gui.log.RenderState.getHeight
int getHeight()
Definition: RenderState.java:195
com.realtime.crossfire.jxclient.gui.log.RenderState
Definition: RenderState.java:35
com.realtime.crossfire.jxclient.gui.log.RenderState.setHeight
void setHeight(@NotNull final Buffer buffer, final int h)
Definition: RenderState.java:88
com.realtime.crossfire.jxclient.gui.log.RenderState.linesReplaced
void linesReplaced(@NotNull final Buffer buffer)
Definition: RenderState.java:147
com.realtime.crossfire.jxclient.gui.log.RenderState.linesAdded
void linesAdded(@NotNull final Buffer buffer)
Definition: RenderState.java:130
com.realtime.crossfire.jxclient.gui.log.RenderState.scrollTo
void scrollTo(@NotNull final Buffer buffer, final int y)
Definition: RenderState.java:271
com.realtime.crossfire.jxclient.gui.log.RenderState.mustRepaint
boolean mustRepaint
Definition: RenderState.java:81
com.realtime.crossfire.jxclient.gui.log.RenderState.getScrollPos
int getScrollPos()
Definition: RenderState.java:225