00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.gui.log;
00023
00024 import java.util.List;
00025 import org.jetbrains.annotations.NotNull;
00026
00031 public class RenderStateManager {
00032
00036 @NotNull
00037 private final RenderStateListener renderStateListener;
00038
00042 @NotNull
00043 private final Buffer buffer;
00044
00048 private int lastTopIndex = -1;
00049
00053 private int lastTopOffset = -1;
00054
00059 private int lastScrollPos = -1;
00060
00065 private boolean lastCanScrollDown = false;
00066
00071 private boolean lastCanScrollUp = false;
00072
00076 @NotNull
00077 private final RenderState renderState = new RenderState();
00078
00082 @NotNull
00083 private final BufferListener bufferListener = new BufferListener() {
00084
00085 @Override
00086 public void lineAdded() {
00087 renderState.linesAdded(buffer);
00088 fireChanges();
00089 }
00090
00091 @Override
00092 public void lineReplaced() {
00093 renderState.linesReplaced(buffer);
00094 fireChanges();
00095 }
00096
00097 @Override
00098 public void linesRemoved(@NotNull final List<Line> lines) {
00099 renderState.linesRemoved(buffer, lines);
00100 fireChanges();
00101 }
00102
00103 };
00104
00110 public RenderStateManager(@NotNull final RenderStateListener renderStateListener, @NotNull final Buffer buffer) {
00111 this.renderStateListener = renderStateListener;
00112 this.buffer = buffer;
00113 this.buffer.addBufferListener(bufferListener);
00114 fireChanges();
00115 }
00116
00121 public void setHeight(final int height) {
00122 renderState.setHeight(buffer, height);
00123 }
00124
00129 public void dispose() {
00130 buffer.removeBufferListener(bufferListener);
00131 }
00132
00137 public int getTopIndex() {
00138 return renderState.getTopIndex();
00139 }
00140
00145 public int getTopOffset() {
00146 return renderState.getTopOffset();
00147 }
00148
00153 public int getScrollPos() {
00154 return renderState.getScrollPos();
00155 }
00156
00160 public void resetScroll() {
00161 renderState.scrollToBottom(buffer);
00162 fireChanges();
00163 }
00164
00169 public void scrollUp(final int dy) {
00170 assert dy > 0;
00171 renderState.scrollTo(buffer, renderState.getScrollPos()-dy);
00172 fireChanges();
00173 }
00174
00179 public void scrollDown(final int dy) {
00180 assert dy > 0;
00181 renderState.scrollTo(buffer, renderState.getScrollPos()+dy);
00182 fireChanges();
00183 }
00184
00189 public void scrollTo(final int y) {
00190 renderState.scrollTo(buffer, y);
00191 fireChanges();
00192 }
00193
00198 public boolean canScrollUp() {
00199 return renderState.canScrollUp();
00200 }
00201
00206 public boolean canScrollDown() {
00207 return renderState.canScrollDown();
00208 }
00209
00213 private void fireChanges() {
00214 boolean fireChanges = false;
00215
00216 if (lastTopIndex != renderState.getTopIndex()) {
00217 lastTopIndex = renderState.getTopIndex();
00218 fireChanges = true;
00219 }
00220
00221 if (lastTopOffset != renderState.getTopOffset()) {
00222 lastTopOffset = renderState.getTopOffset();
00223 fireChanges = true;
00224 }
00225
00226 if (lastScrollPos != renderState.getScrollPos()) {
00227 lastScrollPos = renderState.getScrollPos();
00228 fireChanges = true;
00229 }
00230
00231 if (lastCanScrollDown != renderState.canScrollDown()) {
00232 lastCanScrollDown = renderState.canScrollDown();
00233 fireChanges = true;
00234 }
00235
00236 if (lastCanScrollUp != renderState.canScrollUp()) {
00237 lastCanScrollUp = renderState.canScrollUp();
00238 fireChanges = true;
00239 }
00240
00241 if (renderState.mustRepaint() || fireChanges) {
00242 renderStateListener.stateChanged();
00243 }
00244 }
00245
00246 }