from visad.bom import RubberBandLineRendererJ3D
from visad import DataReferenceImpl, Gridded2DSet, RealTupleType, RealType, CellImpl
from visad import FunctionType, Data, FlatField, Integer1DSet, Tuple, Real, Text
import subs
from javax.swing import JFrame, JMenuBar, JMenu, JMenuItem
import jarray
from util import Helper
from java.lang import Float

import hydra_properties

false = 0
true  = 1

def captureDisplay(event):
  Helper.saveDisplay(transectDisp, JFrame().getContentPane())

def windowClose(event):
  img_disp.removeReference(transectRef)
  if tcell.lineRef != None:
    img_disp.removeReference(tcell.lineRef)
  ac_view.finishTransect()
  #ac_view.viewToolBar.select(ActionEvent(self,ActionEvent.ACTION_PERFORMED,"reset"))
  #ac_view.viewToolBar.buttonGroup.setSelected(self.viewToolBar.click.getModel(), false)
  
  
def makeTransectDisplay(filereader, image, imageDisplay, roamTextRef, acViewer):
  
  obsElementInstrument, obsLineInstrument, obsChannelIndexInstrument, observationChannelsInstrument, observationsInstrument = filereader.getRealTypes()
  obsLatitudeInstrument, obsLongitudeInstrument = filereader.getGeoRealTypes()

  global transectDisp, img_disp, transectRef, tcell, ac_view
  img_disp = imageDisplay
  ac_view = acViewer
  
  maps         = subs.makeMaps(RealType.getRealType("path"), 'x', observationsInstrument, 'y')
  transectDisp = subs.makeDisplay(maps)
  dsp_rdr = transectDisp.getDisplayRenderer()
  dsp_rdr.setBackgroundColor(hydra_properties.background_color)
  dsp_rdr.setForegroundColor(hydra_properties.foreground_color)
  subs.setAspectRatio(transectDisp,2)
  subs.setBoxSize(transectDisp, .7)
  transectDisp.showAxesScales(true)
  transectDisp.setAlwaysAutoScale(true)
  
    
  transectRef = DataReferenceImpl("transectRef")
  obsLatitudeInstrument, obsLongitudeInstrument = filereader.getGeoRealTypes()
  transectRef.setData(Gridded2DSet(RealTupleType(obsLongitudeInstrument,obsLatitudeInstrument), None, 1))
  imageDisplay.addReferences(RubberBandLineRendererJ3D(obsLongitudeInstrument,obsLatitudeInstrument,0,0), transectRef, subs.makeColorMap("magenta"))
  
  lineRef = None
  
  class TransectChangeCell(CellImpl):
    def __init__(self, transectDisp,transectRef, lineRef, image, imageDisplay, roamTextRef):
      self.transectRef  = transectRef
      self.lineRef      = lineRef
      self.image        = image
      self.imageDisplay = imageDisplay
      self.tranFieldRef = None
      self.transectDisp = transectDisp
      self.roamTextRef  = roamTextRef
                
    def doAction(self):
      samples = self.transectRef.getData().getSamples()
      if samples != None:
        if self.lineRef == None:
          self.lineRef  = self.imageDisplay.drawLine(samples, color="magenta", width=2)
        else:
          self.imageDisplay.moveLine(self.lineRef, samples) 
        del_0 = (samples[0][1] - samples[0][0])/100
        del_1 = (samples[1][1] - samples[1][0])/100
        pts_0 = jarray.zeros(100+1,'f')
        pts_1 = jarray.zeros(100+1,'f')
        for k in xrange(100+1):
          pts_0[k] = samples[0][0] + k*del_0
          pts_1[k] = samples[1][0] + k*del_1
        gset = Gridded2DSet(RealTupleType(RealType.Latitude, RealType.Longitude), [pts_1, pts_0], 100+1)
        
        tranField = self.image.resample(gset, Data.NEAREST_NEIGHBOR, Data.NO_ERRORS)
        values = tranField.getFloats()
        new_tranField = FlatField(FunctionType(RealType.getRealType("path"), tranField.getType().getRange()), Integer1DSet(100+1))
        new_tranField.setSamples(values, false)
        if self.tranFieldRef == None:
          self.tranFieldRef = self.transectDisp.addData("tranField", new_tranField, constantMaps=subs.makeColorMap(hydra_properties.foreground_color))
        else:
          self.tranFieldRef.setData(new_tranField)
        
        ttype = self.roamTextRef.getData().getType()
        comps =  ttype.getComponents()
        self.roamTextRef.setData(Tuple(ttype, [Real(comps[0], Float.NaN), Real(comps[1], Float.NaN), Text(comps[2], '   %-6.1f' % Float.NaN)]))
        
        
        
  tcell = TransectChangeCell(transectDisp, transectRef, lineRef, image, imageDisplay, roamTextRef)
  tcell.addReference(transectRef)
  
  frame     = JFrame("Transect:   shft+rght+drag", windowClosing=windowClose)
  framePane = frame.getContentPane()

  #- menuBar
  menuBar     = JMenuBar()
  toolMenu    = JMenu("Tools")
  menuBar.add(toolMenu)
  item1 = JMenuItem("Capture Display", actionPerformed=captureDisplay)
  item1.setEnabled(1)
  toolMenu.add(item1)
  frame.setJMenuBar(menuBar)
  
  framePane.add(transectDisp.getComponent())
  
  frame.pack()
  frame.show()
  frame.setSize(400,220)