from abstractobserver import *
from plotter import *

import sys, os
sys.path.insert(0,os.pardir)
from data import *

__verbose__=0

class PlotObserver(AbstractObserver):
    def __init__(self, subject, startcell, endcell):
        AbstractObserver.__init__(self, subject)
        
        self.plotter=None
        self.startxpos,self.startypos=startcell
        self.endxpos, self.endypos=endcell
        self.subject=subject

	self.data=[]
	i=self.startxpos
	j=self.startypos
        #bug find here, no yet finished it.
        #if self.endxpos-self.startxpos==1 and self.endypos-self.startypos==1:
        #    self.data.append(1,
        if self.endxpos-self.startxpos<=0 and self.endypos-self.startypos<=0:
            print "The selected data is improper for plotting"
        
	elif self.endxpos-self.startxpos==1 or self.endxpos-self.startxpos==0:
               if self.endxpos-self.startxpos==1:
                   if self.endypos-self.startypos==0: #special case
                       k=1
                       while i<=self.endxpos:
                           self.data.append((k, self.subject.getData(i, j)))
                           i=i+1
                           k=k+1
                   else:
                       while j<=self.endypos:
                           self.data.append((self.subject.getData(i,j), \
                                             self.subject.getData(i+1, j)))
                           j=j+1
               else:
			k=1
			while j<=self.endypos:
				self.data.append((k, self.subject.getData(i, j)))
				j=j+1
				k=k+1
               title=' start cell:'+`startcell`+' end cell:'+`endcell`
               self.plotter=Plotter(title)
		
               #self.subject.attach(self)
               
               if __verbose__:
                   print `self.data`
	
               if self.dataUndefined():
                   pass
               else:
                   self.plotter.plot(self.data)

	elif self.endypos-self.startypos==1 or self.endypos-self.startypos==0:
		if self.endypos-self.startypos==1:
			while i<=self.endxpos:
            			self.data.append((self.subject.getData(i,j), \
						self.subject.getData(i, j+1)))
            			i=i+1
		else:
			k=1
			while i<=self.endxpos:
				self.data.append((k, self.subject.getData(i, j)))
				i=i+1
				k=k+1
                title='start cell: '+`startcell`+' end cell: '+`endcell`                
		self.plotter=Plotter(title)
		
		#self.subject.attach(self)
		
		if self.dataUndefined():
            		pass
        	else:
           		self.plotter.plot(self.data)

                if __verbose__:
                    print `self.data`
        else:
		print "The selected data is improper for plotting."
        
    def update(self):
      anyplotdatachanged=0
      for a in self.subject.getState():
        if __verbose__:  
            print 'in the update of plot'
            print `a`
        x=a.getXPosition()
        y=a.getYPosition()
	if self.startxpos<=x and x<=self.endxpos and self.startypos<=y and y<=self.endypos:
                anyplotdatachanged=1
		if self.endxpos-self.startxpos==1 or self.endxpos-self.startxpos==0:
			datax, datay=self.data[y-self.startypos]
			if self.endxpos-self.startxpos==1:
                            if self.endypos-self.startypos==0: #special case
                                datax, datay=self.data[x-self.startxpos]
                                self.data[x-self.startxpos]=(datax, a.getValue())
                            else:
                                if x==self.startxpos:
					self.data[y-self.startypos]=(a.getValue(), datay)
				else:
					self.data[y-self.startypos]=(datax, a.getValue())
			else:
				self.data[y-self.startypos]=(datax, a.getValue())
		else:
			datax, datay=self.data[x-self.startxpos]
			if self.endypos-self.startypos==1:
				if y==self.startypos:
					self.data[x-self.startxpos]=(a.getValue(), datay)
				else:
					self.data[x-self.startxpos]=(datax, a.getValue())
			else:
				self.data[x-self.startxpos]=(datax, a.getValue())
		

## 		print `self.data`
## 		if self.dataUndefined():
## 			pass
## 		else:
## 			self.plotter.clear()
## 			self.plotter.plot(self.data)	
	else:
		pass

      if anyplotdatachanged:
          #print `self.data`
          self.plotter.clear()
          if self.dataUndefined():
              pass
          else:
              #self.plotter.clear()
              self.plotter.plot(self.data)	   
      else:
         pass

    def dataUndefined(self):
        i=len(self.data)
        j=0
        while j<i:
            x, y=self.data[j]
            if x==None or y==None:
                return 1
            j=j+1
        return 0
















