import sys

#sys.path.append('/home/rink/java/visad/python')
sys.path.append('./multispectral/Lib')
sys.path.append('./multispectral/Lib/file')

from javax.swing import JPopupMenu, JFrame, JMenuBar, JMenu, JMenuItem, JTextField, JFileChooser
from javax.swing.border import LineBorder
from java.awt import GridLayout, BorderLayout, FlowLayout, Color, Dimension, Canvas, Toolkit
from java.awt.event import InputEvent
from java.awt.datatransfer import DataFlavor
from java.lang import System

from visad import *
from visad.bom import ImageRendererJ3D
import subs
import graph
from subs import *
from visad.python.JPythonMethods import *

import MultiSpectralDataSource
from acViewer import acViewer
from subsetImage import SubsetImage, Subset
from histostretch import linkHistLocation, dragHistLocation

from util import Helper
from html_hydra import HtmlBrowserWindow


#---------------------------------------
false = 0
true  = 1
lightWeightPopupEnabled = false
#---------------------------------------
version = "2004-09-09"


JPopupMenu.setDefaultLightWeightPopupEnabled(lightWeightPopupEnabled)


toolkit   = Toolkit.getDefaultToolkit()
clipboard = toolkit.getSystemClipboard()

import hydra_properties
hydra_properties.setProperties()

global adaptProj

def openURL_html(url):
  global ad, ad_clone
  filename = url.toString()
  prot = url.getProtocol()
  host = url.getHost()
  file = url.getFile()
  
  if host =="aqua.ssec.wisc.edu" or host=="terra.ssec.wisc.edu":
    filename = prot+"://"+host+"/cgi-bin/nph-dods"+file
  elif host == "g0dug03u.ecs.nasa.gov":
    filename = prot+"://"+host+"/daac-bin/dods/nph-dods"+file
  elif host == "thorpex-data.ssec.wisc.edu":
    filename = prot+"://"+host+"/cgi-bin/DODS/nph-dods"+file
  elif host == "gi.ssec.wisc.edu":
    filename = prot+"://"+host+"/cgi-bin/nph-dods"+file
    
  ad = MultiSpectralDataSource.load(filename)
  mcItem.setEnabled(1)
  colorRangeItem.setEnabled(1)
  colorMenu.setEnabled(1)
  ad_clone = ad.clone()
  bigFrame.toFront()
  bigFrame.setCursor(3)
  rebuildDisplay(ad_clone)
  bigFrame.setCursor(0)
  hbw.dispose()

def fileChooseAction(event):
  if event.getActionCommand() == "local":
    fileChoose.setDialogType(JFileChooser.OPEN_DIALOG)
    fileChoose.showOpenDialog(bigFrame)
    
  if event.getActionCommand() == "remote":
    global hbw
    textFrame.setVisible(1)
    hbw = HtmlBrowserWindow(callback=openURL_html)
    hbw.show()
    
  if event.getActionCommand() == "ApproveSelection":
    global ad, ad_clone
    filename = fileChoose.getSelectedFile().getPath()
    ad = MultiSpectralDataSource.load(filename)
    mcItem.setEnabled(1)
    colorRangeItem.setEnabled(1)
    colorMenu.setEnabled(1)
    ad_clone = ad.clone()
    rebuildDisplay(ad_clone)
    
   
def pasteURL(event):
  transfer = clipboard.getContents(None)
  filename = transfer.getTransferData(DataFlavor.stringFlavor)
  filename = filename.replace(".html","")
  textField.setText(filename)
  
  
def clearURL(event):
  textField.setText("")
 
def openURL(event):
  global ad, ad_clone
  filename = textField.getText()
  filename = filename.replace(".html","")
  ad = MultiSpectralDataSource.load(filename)
  mcItem.setEnabled(1)
  colorRangeItem.setEnabled(1)
  colorMenu.setEnabled(1)
  ad_clone = ad.clone()
  bigFrame.setCursor(3)
  rebuildDisplay(ad_clone)
  bigFrame.setCursor(0)
  
  
def rebuildDisplay(ad):
  global maps, img, subsetRef
  disp.removeAllReferences()
  disp.clearMaps()
  
  obsElementInstrument, obsLineInstrument, obsChannelIndexInstrument, observationChannelsInstrument, observationsInstrument = ad.getRealTypes()
  observationInstrument = ad.imageRangeType
  obsLatitudeInstrument, obsLongitudeInstrument  = ad.getGeoRealTypes()
  
  latminmax, lonminmax = ad.getGeoDomain()
  
  londiff = lonminmax[1] - lonminmax[0]
  latdiff = latminmax[1] - latminmax[0]
  if londiff >= latdiff:
    lon_low = lonminmax[0]
    lon_hi  = lonminmax[1]
    lat_low = latminmax[0]
    lat_hi  = lat_low + londiff
  else:
    lat_low = latminmax[0]
    lat_hi  = latminmax[1]
    lon_low = lonminmax[0]
    lon_hi  = lon_low + latdiff
  
  maps = subs.makeMaps(obsLongitudeInstrument,'x', obsLatitudeInstrument, 'y', observationsInstrument, 'rgb')
  
  
  #--- Display-side map projection test
  from visad.data.hdfeos import PolarStereographic
  
  """  
  class MapProjectionAdapter(CoordinateSystem):
    def __init__(self, mapProjection):
      self.mapProjection = mapProjection
      CoordinateSystem.__init__(self, Display.DisplaySpatialCartesianTuple, None)
    
    def toReference(self, values):
      values_2D = []
      values_3D = []
      values_2D.append(Helper.scale_array(values[0], Data.DEGREES_TO_RADIANS))
      values_2D.append(Helper.scale_array(values[1], Data.DEGREES_TO_RADIANS))
      values_2D = self.mapProjection.fromReference(values_2D)
      values_3D.append(values_2D[0])
      values_3D.append(values_2D[1])
      values_3D.append(values[2])
      return values_3D
      
    def fromReference(self, values):
      values_2D = []
      values_3D = []
      values_2D.append(values[0])
      values_2D.append(values[1])
      values_2D = self.mapProjection.toReference(values_2D)
      values_3D.append(Helper.scale_array(values_2D[0], Data.RADIANS_TO_DEGREES))
      values_3D.append(Helper.scale_array(values_2D[1], Data.RADIANS_TO_DEGREES))
      values_3D.append(values[2])
      return values_3D
  
  
  displayLatType   = DisplayRealType("ProjectionLat", true, -90.0, 90.0, 0.0, None)
  displayLonType   = DisplayRealType("ProjectionLon", true, -180.0, 180.0, 0.0, None)
  displayAltType   = DisplayRealType("ProjectionAlt", true, -1.0, 1.0, 0.0, None)
  
  
  mapProjection    = PolarStereographic(-100*Data.DEGREES_TO_RADIANS, 60*Data.DEGREES_TO_RADIANS)
  global adaptProj
  adaptProj        = MapProjectionAdapter(mapProjection)
  
  displayTupleType = DisplayTupleType([displayLonType, displayLatType, displayAltType], adaptProj) 
  
  #-maps = subs.makeMaps(obsLongitudeInstrument,'x', obsLatitudeInstrument, 'y', observationsInstrument, 'rgb')
  """
  
  disp.addMaps(maps)
  #latminmax, lonminmax = ad.getGeoDomain()
  disp.disableAction()
  
  """
  londiff = lonminmax[1] - lonminmax[0]
  latdiff = latminmax[1] - latminmax[0]
  if londiff >= latdiff:
    lon_low = lonminmax[0]
    lon_hi  = lonminmax[1]
    lat_low = latminmax[0]
    lat_hi  = lat_low + londiff
  else:
    lat_low = latminmax[0]
    lat_hi  = latminmax[1]
    lon_low = lonminmax[0]
    lon_hi  = lon_low + latdiff
  """
  
  maps[0].setRange(lon_low, lon_hi)
  maps[1].setRange(lat_low, lat_hi)  
  
  if ad.instrumentName == "MODIS":
    channel_idx = 32
  else:
    channel_idx=int(ad.numObsChannels/3)
  
  if ad.numObsElements < 512:
    img = ad.getImageSegment(channel_idx,0)
  else:
    img = ad.getImageSegment(channel_idx,0, Subset(None,None,None,None,step=10))
  
  imageRef=subs.addData('a',img,disp,renderer=ImageRendererJ3D(), zlayer = -0.1)
  subs.addData('b',map,disp,constantMaps=makeColorMap(hydra_properties.foreground_color))
  

  si = SubsetImage(img,disp,maps[0],maps[1],changeSubset,subsetRef,color="green")
   
  colorMenu.changeColorScalarMap(maps[2])
  disp.enableAction()
  

def changeSubset(a,b):
  x0 = int(min(a))
  y0 = int(min(b))
  x1 = int(max(a))
  y1 = int(max(b))
  
  #-- image to segment coordinates
  xy0 = ad_clone.subsetDomain.gridToValue([[x0],[y0]])
  xy1 = ad_clone.subsetDomain.gridToValue([[x1],[y1]])
  
  x0  = int(xy0[0][0])
  y0  = int(xy0[1][0])
  x1  = int(xy1[0][0])
  y1  = int(xy1[1][0])  
  
  if (((x1 - x0) > 10) or ((y1 - y0) > 10)):
    ss  = Subset(x0,y0,x1,y1)
    bigFrame.setCursor(3)
    if ac != None:
      ac.changeSubset(ss)
    else:
      print "start multispectral viewer first"
    bigFrame.setCursor(0)
  
def start_acViewer(event):
  global ac, ad_last
  if ad != None:
    if ad.numObsElements > 512:
      sub = Subset(None,None,None,None,step=10)
    else:
      sub = None
      
    if ad == ad_last:
      ac = acViewer(ad.clone(),sub)
    else:
      ac = acViewer(ad,sub)
    ad_last = ad
  else:
    print "please open a local/remote file"
    
def setColorScale(event):
  #gdisp = graph.histogram(img, 20, clip=0)
  #dragHistLocation(gdisp, maps[2])
  dragHistLocation(maps[2], img)
  
def captureDisplay(event):
  Helper.saveDisplay(disp, JFrame().getContentPane())
  
def exit(event):
  System.exit(0)
  

       
global bigFrame, textFrame, fileChoose, textField, disp, smaps, map, colorMenu, ac, subsetRef, ad_last, mcItem
ac = None
ad_last = None
subsetRef = []
subsetRef.append(None)
#-- setup initial gui
bigFrame  = JFrame("Hydra     "+"(version: "+version+")", windowClosing=exit)
menuBar   = JMenuBar()
bigFrame.setJMenuBar(menuBar)
dataMenu = JMenu("data")
menuBar.add(dataMenu)

toolMenu = JMenu("tools")
settingsMenu = JMenu("settings")
global colorRangeItem
colorRangeItem = JMenuItem("set color range", actionPerformed=setColorScale)
colorRangeItem.setEnabled(0)
settingsMenu.add(colorRangeItem)
menuBar.add(settingsMenu)

"""
item2 = JMenuItem("Capture Display", actionPerformed=captureDisplay)
item2.setEnabled(1)
toolMenu.add(item2)
menuBar.add(toolMenu)
"""

from ColorScaleSelect import ColorScaleSelect
global colorMenu
colorMenu = ColorScaleSelect("set color scale", None)
colorMenu.setEnabled(0)
settingsMenu.add(colorMenu)
menuBar.add(settingsMenu)

startMenu = JMenu("start")
menuBar.add(startMenu)
mcItem = JMenuItem("Multi-Channel Viewer", actionPerformed=start_acViewer)
mcItem.setEnabled(0)
startMenu.add(mcItem)

localItem  = JMenuItem("local", actionPerformed=fileChooseAction)
localItem.setEnabled(1)
remoteItem = JMenuItem("remote", actionPerformed=fileChooseAction)
remoteItem.setEnabled(1)
exitItem = JMenuItem("exit", actionPerformed=exit)
exitItem.setEnabled(1)
dataMenu.add(localItem)
dataMenu.add(remoteItem)
dataMenu.add(exitItem)


textFrame = JFrame()
menuBar   = JMenuBar()
editMenu  = JMenu("edit")
pasteItem = JMenuItem("paste URL", actionPerformed=pasteURL)
editMenu.add(pasteItem)
clearItem = JMenuItem("clear URL", actionPerformed=clearURL)
editMenu.add(clearItem)
menuBar.add(editMenu)
textFrame.setJMenuBar(menuBar)
textField = JTextField(actionPerformed=openURL)
framePane = textFrame.getContentPane()
framePane.add(textField)
textFrame.setVisible(0)
textFrame.setSize(500, 75)



fileChoose = JFileChooser(actionPerformed=fileChooseAction)


smaps = makeMaps(RealType.Longitude, 'x', RealType.Latitude, 'y')
disp = makeDisplay(smaps)
dsp_rdr = disp.getDisplayRenderer()
dsp_rdr.setBackgroundColor(hydra_properties.background_color)
dsp_rdr.setForegroundColor(hydra_properties.foreground_color)
framePane = bigFrame.getContentPane()
framePane.setLayout(BorderLayout())
framePane.add(disp.getComponent())

from DisplayViewSelect import DisplayViewSelectToolBar, RubberBandSubset
toolbar = DisplayViewSelectToolBar([disp])
toolbar.addHAction(RubberBandSubset(toolbar.listeners, subsetRef, icon="./ui/icons/subset16.jpg", tooltipText="subset image"))
framePane.add("South", toolbar)

map=load('./data/outlsupw')
subs.addData('supw',map,disp, constantMaps=makeColorMap(hydra_properties.foreground_color))

bigFrame.pack()
bigFrame.setSize(400, 400)
bigFrame.show()
