"====================================================================== | | Smalltalk GUI publish-subscribe framework | | $Revision: 1.7.5$ | $Date: 2000/05/28 16:56:52$ | $Author: pb$ | ======================================================================" "====================================================================== | | Copyright 1988-92, 1994-95, 1999, 2000 Free Software Foundation, Inc. | Written by Brad Diller and Paolo Bonzini. | | This file is part of GNU Smalltalk. | | GNU Smalltalk is free software; you can redistribute it and/or modify it | under the terms of the GNU General Public License as published by the Free | Software Foundation; either version 2, or (at your option) any later version. | | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | details. | | You should have received a copy of the GNU General Public License along with | GNU Smalltalk; see the file COPYING. If not, write to the Free Software | Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ====================================================================== " Object subclass: #GuiState instanceVariableNames: 'state counter action' classVariableNames: '' poolDictionaries: '' category: 'Graphics-Windows' ! !GuiState class methodsFor: 'accessing'! state: aSymbol counter: anInteger ^self new initState: aSymbol counter: anInteger action: ValueHolder null ! state: aSymbol counter: anInteger action: aBlock ^self new initState: aSymbol counter: anInteger action: aBlock ! ! !GuiState methodsFor: 'accessing'! state ^state ! counter ^counter ! redisplay: newCounter counter := newCounter. ^action value ! ! !GuiState methodsFor: 'private - accessing'! initState: aSymbol counter: anInteger action: aBlock state := aSymbol. counter := anInteger. action := aBlock ! ! Gui subclass: #GuiData instanceVariableNames: 'checkpoints' classVariableNames: '' poolDictionaries: '' category: 'Graphics-Windows' ! !GuiData methodsFor: 'change management'! changeState: anObject "Record the state change denoted by anObject" | updateCount | checkpoints isNil ifTrue: [checkpoints := LookupTable new]. updateCount := checkpoints at: anObject ifAbsent: [0]. checkpoints at: anObject put: (updateCount + 1). ! getCurrentState ^checkpoints copy ! getStateChanges: viewState "Compare current state with viewState and return an object which describes diffences" | stateChanges | (viewState isNil | checkpoints isNil) ifTrue: [^nil]. viewState keysAndValuesDo: [ :stateId :state || stateValue | stateValue := checkpoints at: stateId ifAbsent: [0]. state counter < stateValue ifTrue: [ stateChanges isNil ifTrue: [ stateChanges := Set new ]. stateChanges add: (GuiState state: stateId counter: stateValue) ] ]. ^stateChanges ! !